From d4ae6a1d91d8d112bb382099115282861180e1c1 Mon Sep 17 00:00:00 2001 From: dP Date: Tue, 18 Feb 2020 18:13:33 +0300 Subject: [PATCH] Update to 1.10.0-RC1 --- Doxyfile | 4 +- azure-pipelines-ci.yml | 2 - azure-pipelines/changelog.sh | 4 +- changelog.txt | 45 +++ docs/logging_and_performance_metrics.md | 40 +++ known-bugs.txt | 4 +- os/debian/changelog | 6 + os/rpm/openttd.spec | 4 +- os/windows/installer/install.nsi | 4 +- projects/openttd_vs140.vcxproj | 8 + projects/openttd_vs140.vcxproj.filters | 24 ++ projects/openttd_vs141.vcxproj | 8 + projects/openttd_vs141.vcxproj.filters | 24 ++ projects/openttd_vs142.vcxproj | 8 + projects/openttd_vs142.vcxproj.filters | 24 ++ source.list | 5 + src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp | 6 +- src/3rdparty/squirrel/squirrel/sqbaselib.cpp | 2 +- src/3rdparty/squirrel/squirrel/sqdebug.cpp | 2 +- src/ai/ai_gui.cpp | 16 +- src/base_station_base.h | 11 + src/bootstrap_gui.cpp | 6 +- src/build_vehicle_gui.cpp | 8 + src/command.cpp | 4 + src/command_type.h | 2 + src/console.cpp | 16 +- src/console_cmds.cpp | 180 +++++++++++- src/console_func.h | 2 +- src/core/pool_type.hpp | 54 +++- src/date.cpp | 11 +- src/date_type.h | 2 + src/depot.cpp | 2 + src/economy.cpp | 7 +- src/engine.cpp | 79 +++++- src/engine_base.h | 10 +- src/fios_gui.cpp | 32 ++- src/gfx.cpp | 138 +++++++++ src/gfx_func.h | 8 + src/group_gui.cpp | 3 +- src/hotkeys.cpp | 26 +- src/industry.h | 20 ++ src/industry_cmd.cpp | 31 ++- src/industry_gui.cpp | 263 ++++++++++++++++-- src/lang/afrikaans.txt | 7 +- src/lang/arabic_egypt.txt | 7 +- src/lang/basque.txt | 7 +- src/lang/belarusian.txt | 7 +- src/lang/brazilian_portuguese.txt | 7 +- src/lang/bulgarian.txt | 7 +- src/lang/catalan.txt | 7 +- src/lang/croatian.txt | 7 +- src/lang/czech.txt | 29 +- src/lang/danish.txt | 149 +++++++--- src/lang/dutch.txt | 25 +- src/lang/english.txt | 26 +- src/lang/english_AU.txt | 7 +- src/lang/english_US.txt | 28 +- src/lang/esperanto.txt | 7 +- src/lang/estonian.txt | 7 +- src/lang/faroese.txt | 7 +- src/lang/finnish.txt | 189 +++++++------ src/lang/french.txt | 23 +- src/lang/gaelic.txt | 7 +- src/lang/galician.txt | 7 +- src/lang/german.txt | 7 +- src/lang/greek.txt | 7 +- src/lang/hebrew.txt | 7 +- src/lang/hungarian.txt | 7 +- src/lang/icelandic.txt | 7 +- src/lang/indonesian.txt | 8 +- src/lang/irish.txt | 7 +- src/lang/italian.txt | 32 ++- src/lang/japanese.txt | 7 +- src/lang/korean.txt | 35 ++- src/lang/latin.txt | 7 +- src/lang/latvian.txt | 7 +- src/lang/lithuanian.txt | 7 +- src/lang/luxembourgish.txt | 186 +++++++++---- src/lang/malay.txt | 7 +- src/lang/norwegian_bokmal.txt | 7 +- src/lang/norwegian_nynorsk.txt | 7 +- src/lang/polish.txt | 7 +- src/lang/portuguese.txt | 7 +- src/lang/romanian.txt | 7 +- src/lang/russian.txt | 33 ++- src/lang/serbian.txt | 7 +- src/lang/simplified_chinese.txt | 7 +- src/lang/slovak.txt | 7 +- src/lang/slovenian.txt | 7 +- src/lang/spanish.txt | 7 +- src/lang/spanish_MX.txt | 83 +++--- src/lang/swedish.txt | 7 +- src/lang/tamil.txt | 20 +- src/lang/thai.txt | 7 +- src/lang/traditional_chinese.txt | 7 +- src/lang/turkish.txt | 7 +- src/lang/ukrainian.txt | 7 +- src/lang/unfinished/chuvash.txt | 5 +- src/lang/unfinished/frisian.txt | 7 +- src/lang/unfinished/ido.txt | 2 +- src/lang/unfinished/macedonian.txt | 6 +- src/lang/unfinished/maltese.txt | 2 +- src/lang/unfinished/marathi.txt | 7 +- src/lang/unfinished/persian.txt | 7 +- src/lang/unfinished/urdu.txt | 7 +- src/lang/vietnamese.txt | 7 +- src/lang/welsh.txt | 7 +- src/linkgraph/mcf.cpp | 17 +- src/misc.cpp | 3 + src/music/fluidsynth.cpp | 42 ++- src/music_gui.cpp | 46 ++- src/network/network.cpp | 1 + src/network/network_admin.h | 9 +- src/network/network_client.cpp | 11 +- src/network/network_func.h | 6 +- src/network/network_gui.cpp | 4 +- src/network/network_server.cpp | 47 +++- src/network/network_server.h | 2 +- src/network/network_type.h | 1 + src/newgrf.cpp | 10 + src/newgrf_airport.cpp | 13 + src/newgrf_airporttiles.cpp | 10 + src/newgrf_airporttiles.h | 6 +- src/newgrf_canal.cpp | 17 +- src/newgrf_cargo.cpp | 17 +- src/newgrf_engine.cpp | 16 ++ src/newgrf_engine.h | 3 + src/newgrf_generic.cpp | 16 +- src/newgrf_house.cpp | 10 + src/newgrf_house.h | 3 + src/newgrf_industries.cpp | 10 + src/newgrf_industries.h | 3 + src/newgrf_industrytiles.cpp | 13 +- src/newgrf_industrytiles.h | 4 + src/newgrf_object.cpp | 12 +- src/newgrf_object.h | 14 +- src/newgrf_profiling.cpp | 162 +++++++++++ src/newgrf_profiling.h | 63 +++++ src/newgrf_railtype.cpp | 12 +- src/newgrf_railtype.h | 8 +- src/newgrf_roadtype.cpp | 20 +- src/newgrf_roadtype.h | 10 +- src/newgrf_spritegroup.cpp | 18 +- src/newgrf_spritegroup.h | 15 +- src/newgrf_station.cpp | 20 ++ src/newgrf_station.h | 3 + src/openttd.cpp | 4 +- src/order_base.h | 2 + src/order_cmd.cpp | 16 +- src/os/macosx/crashlog_osx.cpp | 5 +- src/pathfinder/pathfinder_type.h | 3 + src/pathfinder/yapf/yapf_road.cpp | 21 ++ src/rev.cpp | 4 +- src/road_cmd.cpp | 16 +- src/saveload/afterload.cpp | 27 ++ src/saveload/engine_sl.cpp | 5 + src/saveload/labelmaps_sl.cpp | 8 +- src/saveload/order_sl.cpp | 4 - src/saveload/saveload.cpp | 14 + src/saveload/saveload.h | 4 +- src/saveload/saveload_internal.h | 3 + src/saveload/waypoint_sl.cpp | 52 ++-- src/screenshot.cpp | 161 +++++++++-- src/screenshot.h | 2 + src/screenshot_gui.cpp | 108 +++++++ src/screenshot_gui.h | 15 + src/script/api/Doxyfile_AI | 4 +- src/script/api/Doxyfile_Game | 4 +- src/script/api/game/game_engine.hpp.sq | 2 + src/script/api/game/game_town.hpp.sq | 2 + src/script/api/game/game_window.hpp.sq | 9 + src/script/api/game_changelog.hpp | 2 + src/script/api/script_engine.cpp | 22 ++ src/script/api/script_engine.hpp | 23 ++ src/script/api/script_town.cpp | 27 ++ src/script/api/script_town.hpp | 24 ++ src/script/api/script_window.hpp | 20 ++ .../api/template/template_window.hpp.sq | 2 + src/settings.cpp | 26 +- src/settings_gui.cpp | 3 + src/settings_type.h | 2 + src/ship_cmd.cpp | 5 +- src/smallmap_gui.cpp | 7 - src/spritecache.cpp | 11 + src/spritecache.h | 1 + src/station_cmd.cpp | 146 +++++++--- src/station_func.h | 1 + src/station_gui.cpp | 29 +- src/table/company_settings.ini | 1 + src/table/newgrf_debug_data.h | 1 + src/table/settings.ini | 36 ++- src/toolbar_gui.cpp | 44 ++- src/town.h | 15 +- src/town_cmd.cpp | 54 +++- src/town_gui.cpp | 58 +--- src/tunnelbridge_cmd.cpp | 10 +- src/vehicle.cpp | 2 +- src/video/sdl2_v.cpp | 2 +- src/viewport.cpp | 2 +- src/viewport_func.h | 1 + src/widgets/industry_widget.h | 10 +- src/widgets/screenshot_widget.h | 26 ++ src/window.cpp | 5 +- src/window_type.h | 6 + 204 files changed, 3172 insertions(+), 1002 deletions(-) create mode 100644 src/newgrf_profiling.cpp create mode 100644 src/newgrf_profiling.h create mode 100644 src/screenshot_gui.cpp create mode 100644 src/screenshot_gui.h create mode 100644 src/widgets/screenshot_widget.h diff --git a/Doxyfile b/Doxyfile index ef7ea3daa3..e288ffbd87 100644 --- a/Doxyfile +++ b/Doxyfile @@ -7,8 +7,8 @@ # Project related configuration options #--------------------------------------------------------------------------- DOXYFILE_ENCODING = UTF-8 -PROJECT_NAME = OpenTTD -PROJECT_NUMBER = +PROJECT_NAME = "OpenTTD Source" +PROJECT_NUMBER = $(VERSION) PROJECT_BRIEF = PROJECT_LOGO = OUTPUT_DIRECTORY = docs/source/ diff --git a/azure-pipelines-ci.yml b/azure-pipelines-ci.yml index 43448f345c..c58a856d93 100644 --- a/azure-pipelines-ci.yml +++ b/azure-pipelines-ci.yml @@ -39,8 +39,6 @@ jobs: strategy: matrix: - commit-checker: - Tag: 'commit-checker' linux-amd64-clang-3.9: Tag: 'linux-amd64-clang-3.9' linux-amd64-gcc-6: diff --git a/azure-pipelines/changelog.sh b/azure-pipelines/changelog.sh index be665a5a08..ea0da948c1 100755 --- a/azure-pipelines/changelog.sh +++ b/azure-pipelines/changelog.sh @@ -1,6 +1,6 @@ #!/bin/sh -tag=$(git describe --tags 2>/dev/null) +tag=$(git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null | sed 's@\^0$@@') # If we are a tag, show the part of the changelog till (but excluding) the last stable if [ -n "$tag" ]; then @@ -12,5 +12,5 @@ fi # In all other cases, show the git log of the last 7 days revdate=$(git log -1 --pretty=format:"%ci") -last_week=$(date -u -d "$revdate -7days" +"%Y-%m-%d %H:%M") +last_week=$(date -d "$revdate -7days" +"%Y-%m-%d %H:%M") git log --after="${last_week}" --pretty=fuller diff --git a/changelog.txt b/changelog.txt index 143513dbe3..48332016e9 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,48 @@ +1.10.0-RC1 (2020-02-09) +------------------------------------------------------------------------ +Feature: Allow server to supply a reason to kicked/banned clients (#7859) +Feature: [NewGRF] Station variable 6A, querying GRFID of nearby station tiles (#7956) +Feature: Improved logic of sharing industry production between 3 or more stations (#7922) +Feature: Highlight the item under mouse cursor in file browser (#7900) +Feature: [GS] Methods to change town rating of companies (#7898) +Feature: [NewGRF] Callback profiling command (#7868) +Feature: Add a setting to show the name of the NewGRF of a vehicle in the build window (#7852) +Feature: Ability to filter industry directory window by cargo (#7843) +Feature: Minimap screenshot type (#7817) +Feature: [GS] Methods to control engine availability of a specific company (#7791) +Feature: Configurable game ending year (#7747) +Feature: Separate window for taking screenshots (#7550) +Change: Move autorenew setting to basic category (#7984) +Change: Improved algorithm for transfer feeder payments (#7935) +Change: Show volume sliders with wedges instead of boxy slider (#7902) +Change: Auto-restart loads the original resources (e.g. save or scenario) again (#7688) +Change: Improve readability of integer lists saved to config files (#7396) +Fix #7976: Crash when attempting to kick the host via rcon (#7985) +Fix #7592: Road vehicles no longer balanced between multiple road stop stations (#7979) +Fix: Station rating effects affecting too large area (#7977) +Fix #7974: Crash when Ctrl+click to show a collapsed vehicle group (#7975) +Fix #7969: Crash when executing a recursive console alias (#7973) +Fix #6566: Very long loading of the maximum "zoom out" level at high resolutions (#7968) +Fix #7952: Crash when switching input languages (#7953) +Fix: [OSX] Don't show a crash/assertion message box for a GUI-less video driver (#7934) +Fix #7925: Corrupt savegames could lead to corruption of the titlegame (#7932) +Fix: [Fluidsynth] Music notes from previous song were not properly reset (#7930) +Fix: Invalid string usage within music window (#7928) +Fix: Non-deterministic name sorting in industry directory window (#7915) +Fix #7899: Various issues with town list window sorting (#7906, #7916) +Fix #7587: Fix possible crashes when loading old save games with invalid waypoint positions (#7894) +Fix: Avoid a crash by properly resetting timetable duration when loading old savegames (#7894) +Fix: Possible crash when post road-works cleanup removes all road pieces (#7903) +Fix #7891: Fix crash when loading save from 1.7.2 (#7892) +Fix #7887: Missing sound effects for some main toolbar buttons (#7888) +Fix #6667: Avoid confusion by also recalculating bridge costs for 'spectated' AI companies (#7884) +Fix: Allow old NewGRF industries to hide in/out cargo slots (#7882) +Fix: [Windows] Fix bootstrap GUI with Uniscribe but no Freetype (#7878) +Fix: Missing keycodes for hotkeys.cfg (#7850) +Fix #7625: Ensure road infrastructure cost is correctly updated when upgrading your own roads (#7628) +Fix #7088: Avoid crash by closing AI/GS textfile windows when changing their in-game slot (#7094) + + 1.10.0-beta2 (2019-12-25) ------------------------------------------------------------------------ - Feature: [Script] More error mappings (#7857) diff --git a/docs/logging_and_performance_metrics.md b/docs/logging_and_performance_metrics.md index 9f0679acde..1f5866aba0 100644 --- a/docs/logging_and_performance_metrics.md +++ b/docs/logging_and_performance_metrics.md @@ -99,3 +99,43 @@ The following is an explanation of the different statistics: If the frame rate window is shaded, the title bar will instead show just the current simulation rate and the game speed factor. +## 3.0) NewGRF callback profiling + +NewGRF developers can profile callback chains via the `newgrf_profile` +console command. The command controls a profiling mode where every sprite +request is measured and logged, and written to a CSV file in the end. + +The NewGRF developer tools need to be enabled for the command to function. + +View the syntax for the command in-game with the console command +`help newgrf_profile`. + +Profiling only works during game or in the editor, it's not possible to +profile across the main menu, world generation, or loading savegames. + +The CSV files contain one line per sprite request during the profiling. +They can get very large, especially on large games with many objects from +the GRF. Start profiling short periods such as 3 or 7 days, and watch the +file sizes. + +The produced CSV file contains the following fields: + +- *Tick* - Game tick counter, this may wrap to zero during recording. + Mainly useful to distinguish events from separate ticks. +- *Sprite* - Index of the root Action 2 sprite in the GRF file. This is + the sprite group being resolved. +- *Feature* - NewGRF feature number the sprite group is being resolved for. + This will be 0xFF for AI purchase selection and ambient sound callbacks. +- *Item* - The id of the item within the GRF. For cargotypes, railtypes, + roadtypes, and tramtypes, this is the integer representation of the label. +- *CallbackID* - The type of callback being resolved. ID 0 is regular graphics + lookup. See the `newgrf_callbacks.h` file in the OpenTTD source code for the + full list of callback IDs. +- *Microseconds* - Total time spent to resolve the Action 2, in microseconds. +- *Depth* - Number of recursive Action 2 lookups were made during resolution. + Value zero means the sprite group resolved directly. +- *Result* - Result of the callback resolution. For lookups that result in + a sprite, this is the index of the base action 2 in the GRF file. For + callbacks that give a numeric result, this is the callback result value. + For lookups that result in an industry production or tilelayout, this + is the sprite index of the action 2 defining the production/tilelayout. diff --git a/known-bugs.txt b/known-bugs.txt index 440a4709ff..0d3f6ef64c 100644 --- a/known-bugs.txt +++ b/known-bugs.txt @@ -1,6 +1,6 @@ OpenTTD's known bugs -Last updated: 2019-12-25 -Release version: 1.10.0-beta2 +Last updated: 2020-02-09 +Release version: 1.10.0-RC1 ------------------------------------------------------------------------ diff --git a/os/debian/changelog b/os/debian/changelog index 6b24aaa7d5..dd2ce4bd75 100644 --- a/os/debian/changelog +++ b/os/debian/changelog @@ -1,3 +1,9 @@ +openttd (1.10.0~RC1-0) unstable; urgency=low + + * New upstream release 1.10.0-RC1 + + -- OpenTTD Sun, 09 Feb 2020 12:00:00 +0000 + openttd (1.10.0~beta2-0) unstable; urgency=low * New upstream release 1.10.0-beta2 diff --git a/os/rpm/openttd.spec b/os/rpm/openttd.spec index 340a9886b9..e847cba99c 100644 --- a/os/rpm/openttd.spec +++ b/os/rpm/openttd.spec @@ -17,9 +17,9 @@ # Name: openttd -Version: 1.10.beta2 +Version: 1.10.RC1 Release: 0 -%define srcver 1.10.0-beta2 +%define srcver 1.10.0-RC1 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 2561b76d55..e60cb48ca1 100644 --- a/os/windows/installer/install.nsi +++ b/os/windows/installer/install.nsi @@ -2,8 +2,8 @@ !define APPV_MAJOR 1 !define APPV_MINOR 10 !define APPV_MAINT 0 -!define APPV_BUILD 1 -!define APPV_EXTRA "-beta2" +!define APPV_BUILD 2 +!define APPV_EXTRA "-RC1" !define APPNAME "OpenTTD" ; Define application name !define APPVERSION "${APPV_MAJOR}.${APPV_MINOR}.${APPV_MAINT}${APPV_EXTRA}" ; Define application version diff --git a/projects/openttd_vs140.vcxproj b/projects/openttd_vs140.vcxproj index 070a3a144d..6453d62b86 100644 --- a/projects/openttd_vs140.vcxproj +++ b/projects/openttd_vs140.vcxproj @@ -409,6 +409,7 @@ + @@ -582,6 +583,7 @@ + @@ -625,8 +627,10 @@ + + @@ -845,6 +849,7 @@ + @@ -1232,6 +1237,7 @@ + @@ -1326,6 +1332,7 @@ + @@ -1333,6 +1340,7 @@ + diff --git a/projects/openttd_vs140.vcxproj.filters b/projects/openttd_vs140.vcxproj.filters index 5476d40f81..0405740d4c 100644 --- a/projects/openttd_vs140.vcxproj.filters +++ b/projects/openttd_vs140.vcxproj.filters @@ -315,6 +315,9 @@ Source Files + + Source Files + Source Files @@ -834,6 +837,9 @@ Header Files + + Header Files + Header Files @@ -963,12 +969,18 @@ Header Files + + Header Files + Header Files Header Files + + Header Files + Header Files @@ -1623,6 +1635,9 @@ Widgets + + Widgets + Widgets @@ -2784,6 +2799,9 @@ NewGRF + + NewGRF + NewGRF @@ -3066,6 +3084,9 @@ Video + + Video + Video @@ -3087,6 +3108,9 @@ Sound + + Sound + Sound diff --git a/projects/openttd_vs141.vcxproj b/projects/openttd_vs141.vcxproj index 6fd1388c9b..ecfed4a038 100644 --- a/projects/openttd_vs141.vcxproj +++ b/projects/openttd_vs141.vcxproj @@ -409,6 +409,7 @@ + @@ -582,6 +583,7 @@ + @@ -625,8 +627,10 @@ + + @@ -845,6 +849,7 @@ + @@ -1232,6 +1237,7 @@ + @@ -1326,6 +1332,7 @@ + @@ -1333,6 +1340,7 @@ + diff --git a/projects/openttd_vs141.vcxproj.filters b/projects/openttd_vs141.vcxproj.filters index 5476d40f81..0405740d4c 100644 --- a/projects/openttd_vs141.vcxproj.filters +++ b/projects/openttd_vs141.vcxproj.filters @@ -315,6 +315,9 @@ Source Files + + Source Files + Source Files @@ -834,6 +837,9 @@ Header Files + + Header Files + Header Files @@ -963,12 +969,18 @@ Header Files + + Header Files + Header Files Header Files + + Header Files + Header Files @@ -1623,6 +1635,9 @@ Widgets + + Widgets + Widgets @@ -2784,6 +2799,9 @@ NewGRF + + NewGRF + NewGRF @@ -3066,6 +3084,9 @@ Video + + Video + Video @@ -3087,6 +3108,9 @@ Sound + + Sound + Sound diff --git a/projects/openttd_vs142.vcxproj b/projects/openttd_vs142.vcxproj index a591a9dc3c..49858a3e1d 100644 --- a/projects/openttd_vs142.vcxproj +++ b/projects/openttd_vs142.vcxproj @@ -409,6 +409,7 @@ + @@ -582,6 +583,7 @@ + @@ -625,8 +627,10 @@ + + @@ -845,6 +849,7 @@ + @@ -1232,6 +1237,7 @@ + @@ -1326,6 +1332,7 @@ + @@ -1333,6 +1340,7 @@ + diff --git a/projects/openttd_vs142.vcxproj.filters b/projects/openttd_vs142.vcxproj.filters index 5476d40f81..0405740d4c 100644 --- a/projects/openttd_vs142.vcxproj.filters +++ b/projects/openttd_vs142.vcxproj.filters @@ -315,6 +315,9 @@ Source Files + + Source Files + Source Files @@ -834,6 +837,9 @@ Header Files + + Header Files + Header Files @@ -963,12 +969,18 @@ Header Files + + Header Files + Header Files Header Files + + Header Files + Header Files @@ -1623,6 +1635,9 @@ Widgets + + Widgets + Widgets @@ -2784,6 +2799,9 @@ NewGRF + + NewGRF + NewGRF @@ -3066,6 +3084,9 @@ Video + + Video + Video @@ -3087,6 +3108,9 @@ Sound + + Sound + Sound diff --git a/source.list b/source.list index 510afcc73a..fd68c010e8 100644 --- a/source.list +++ b/source.list @@ -70,6 +70,7 @@ rail.cpp rev.cpp road.cpp roadstop.cpp +screenshot_gui.cpp screenshot.cpp settings.cpp signal.cpp @@ -269,6 +270,7 @@ newgrf_house.h newgrf_industries.h newgrf_industrytiles.h newgrf_object.h +newgrf_profiling.h newgrf_properties.h newgrf_railtype.h newgrf_roadtype.h @@ -312,6 +314,7 @@ roadstop_base.h roadveh.h safeguards.h screenshot.h +screenshot_gui.h sound/sdl_s.h video/sdl_v.h video/sdl2_v.h @@ -555,6 +558,7 @@ widgets/order_widget.h widgets/osk_widget.h widgets/rail_widget.h widgets/road_widget.h +widgets/screenshot_widget.h widgets/settings_widget.h widgets/sign_widget.h widgets/smallmap_widget.h @@ -983,6 +987,7 @@ newgrf_house.cpp newgrf_industries.cpp newgrf_industrytiles.cpp newgrf_object.cpp +newgrf_profiling.cpp newgrf_railtype.cpp newgrf_roadtype.cpp newgrf_sound.cpp diff --git a/src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp b/src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp index 540975fb5c..a4f4e21c33 100644 --- a/src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp +++ b/src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp @@ -38,7 +38,7 @@ void sqstd_printcallstack(HSQUIRRELVM v) src = si.source; } } - pf(v,"*FUNCTION [%s()] %s line [%d]\n",fn,src,si.line); + pf(v,"*FUNCTION [%s()] %s line [" OTTD_PRINTF64 "]\n",fn,src,si.line); level++; } level=0; @@ -56,7 +56,7 @@ void sqstd_printcallstack(HSQUIRRELVM v) break; case OT_INTEGER: sq_getinteger(v,-1,&i); - pf(v,"[%s] %d\n",name,i); + pf(v,"[%s] " OTTD_PRINTF64 "\n",name,i); break; case OT_FLOAT: sq_getfloat(v,-1,&f); @@ -134,7 +134,7 @@ void _sqstd_compiler_error(HSQUIRRELVM v,const SQChar *sErr,const SQChar *sSourc { SQPRINTFUNCTION pf = sq_getprintfunc(v); if(pf) { - pf(v,"%s line = (%d) column = (%d) : error %s\n",sSource,line,column,sErr); + pf(v,"%s line = (" OTTD_PRINTF64 ") column = (" OTTD_PRINTF64 ") : error %s\n",sSource,line,column,sErr); } } diff --git a/src/3rdparty/squirrel/squirrel/sqbaselib.cpp b/src/3rdparty/squirrel/squirrel/sqbaselib.cpp index 86a1b11858..e5de01a635 100644 --- a/src/3rdparty/squirrel/squirrel/sqbaselib.cpp +++ b/src/3rdparty/squirrel/squirrel/sqbaselib.cpp @@ -219,7 +219,7 @@ static SQInteger base_array(HSQUIRRELVM v) SQInteger nInitialSize = tointeger(stack_get(v,2)); SQInteger ret = 1; if (nInitialSize < 0) { - v->Raise_Error("can't create/resize array with/to size %d", nInitialSize); + v->Raise_Error("can't create/resize array with/to size " OTTD_PRINTF64, nInitialSize); nInitialSize = 0; ret = -1; } diff --git a/src/3rdparty/squirrel/squirrel/sqdebug.cpp b/src/3rdparty/squirrel/squirrel/sqdebug.cpp index 2f24e83b66..44f767c297 100644 --- a/src/3rdparty/squirrel/squirrel/sqdebug.cpp +++ b/src/3rdparty/squirrel/squirrel/sqdebug.cpp @@ -122,5 +122,5 @@ void SQVM::Raise_ParamTypeError(SQInteger nparam,SQInteger typemask,SQInteger ty StringCat(exptypes,SQString::Create(_ss(this), IdType2Name((SQObjectType)mask), -1), exptypes); } } - Raise_Error("parameter %d has an invalid type '%s' ; expected: '%s'", nparam, IdType2Name((SQObjectType)type), _stringval(exptypes)); + Raise_Error("parameter " OTTD_PRINTF64 " has an invalid type '%s' ; expected: '%s'", nparam, IdType2Name((SQObjectType)type), _stringval(exptypes)); } diff --git a/src/ai/ai_gui.cpp b/src/ai/ai_gui.cpp index a684e4a350..a0552628cd 100644 --- a/src/ai/ai_gui.cpp +++ b/src/ai/ai_gui.cpp @@ -179,6 +179,7 @@ struct AIListWindow : public Window { InvalidateWindowData(WC_GAME_OPTIONS, WN_GAME_OPTIONS_AI); InvalidateWindowClassesData(WC_AI_SETTINGS); DeleteWindowByClass(WC_QUERY_STRING); + InvalidateWindowClassesData(WC_TEXTFILE); } void OnClick(Point pt, int widget, int click_count) override @@ -640,15 +641,24 @@ struct ScriptTextfileWindow : public TextfileWindow { ScriptTextfileWindow(TextfileType file_type, CompanyID slot) : TextfileWindow(file_type), slot(slot) { - const char *textfile = GetConfig(slot)->GetTextfile(file_type, slot); - this->LoadTextfile(textfile, (slot == OWNER_DEITY) ? GAME_DIR : AI_DIR); + this->OnInvalidateData(); } void SetStringParameters(int widget) const override { if (widget == WID_TF_CAPTION) { SetDParam(0, (slot == OWNER_DEITY) ? STR_CONTENT_TYPE_GAME_SCRIPT : STR_CONTENT_TYPE_AI); - SetDParamStr(1, GetConfig(slot)->GetName()); + SetDParamStr(1, GetConfig(slot)->GetInfo()->GetName()); + } + } + + void OnInvalidateData(int data = 0, bool gui_scope = true) override + { + const char *textfile = GetConfig(slot)->GetTextfile(file_type, slot); + if (textfile == nullptr) { + delete this; + } else { + this->LoadTextfile(textfile, (slot == OWNER_DEITY) ? GAME_DIR : AI_DIR); } } }; diff --git a/src/base_station_base.h b/src/base_station_base.h index a1c935fce5..0467866e50 100644 --- a/src/base_station_base.h +++ b/src/base_station_base.h @@ -56,6 +56,7 @@ struct BaseStation : StationPool::PoolItem<&_station_pool> { char *name; ///< Custom name StringID string_id; ///< Default name (town area) of station + mutable std::string cached_name; ///< NOSAVE: Cache of the resolved name of the station, if not using a custom name Town *town; ///< The town this station is associated with Owner owner; ///< The owner of this station @@ -108,6 +109,13 @@ struct BaseStation : StationPool::PoolItem<&_station_pool> { */ virtual void UpdateVirtCoord() = 0; + inline const char *GetCachedName() const + { + if (this->name != nullptr) return this->name; + if (this->cached_name.empty()) this->FillCachedName(); + return this->cached_name.c_str(); + } + virtual void MoveSign(TileIndex new_xy) { this->xy = new_xy; @@ -161,6 +169,9 @@ struct BaseStation : StationPool::PoolItem<&_station_pool> { } static void PostDestructor(size_t index); + +private: + void FillCachedName() const; }; /** diff --git a/src/bootstrap_gui.cpp b/src/bootstrap_gui.cpp index 29b066cd12..d2445c23a4 100644 --- a/src/bootstrap_gui.cpp +++ b/src/bootstrap_gui.cpp @@ -11,7 +11,7 @@ #include "base_media_base.h" #include "blitter/factory.hpp" -#if defined(WITH_FREETYPE) +#if defined(WITH_FREETYPE) || defined(WITH_UNISCRIBE) #include "core/geometry_func.hpp" #include "fontcache.h" @@ -218,7 +218,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(WITH_FREETYPE) && (defined(WITH_FONTCONFIG) || defined(_WIN32) || defined(__APPLE__)) +#if (defined(_WIN32) && defined(WITH_UNISCRIBE)) || (defined(WITH_FREETYPE) && (defined(WITH_FONTCONFIG) || defined(__APPLE__))) if (!_network_available) goto failure; /* First tell the game we're bootstrapping. */ @@ -262,6 +262,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.md."); + usererror("Failed to find a graphics set. Please acquire a graphics set for OpenTTD. See section 1.4 of README.md."); return false; } diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index c457b0f195..c3252f7b9e 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -928,6 +928,14 @@ int DrawVehiclePurchaseInfo(int left, int right, int y, EngineID engine_number, /* Additional text from NewGRF */ y = ShowAdditionalText(left, right, y, engine_number); + /* The NewGRF's name which the vehicle comes from */ + const GRFConfig *config = GetGRFConfig(e->GetGRFID()); + if (_settings_client.gui.show_newgrf_name && config != nullptr) + { + DrawString(left, right, y, config->GetName(), TC_BLACK); + y += FONT_HEIGHT_NORMAL; + } + return y; } diff --git a/src/command.cpp b/src/command.cpp index dd65fa36ea..ac1ac25521 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -105,6 +105,7 @@ CommandProc CmdIncreaseLoan; CommandProc CmdDecreaseLoan; CommandProc CmdWantEnginePreview; +CommandProc CmdEngineCtrl; CommandProc CmdRenameVehicle; CommandProc CmdRenameEngine; @@ -130,6 +131,7 @@ CommandProc CmdFoundTown; CommandProc CmdRenameTown; CommandProc CmdDoTownAction; CommandProc CmdTownGrowthRate; +CommandProc CmdTownRating; CommandProc CmdTownCargoGoal; CommandProc CmdTownSetText; CommandProc CmdExpandTown; @@ -269,6 +271,7 @@ static const Command _command_proc_table[] = { DEF_CMD(CmdDecreaseLoan, 0, CMDT_MONEY_MANAGEMENT ), // CMD_DECREASE_LOAN DEF_CMD(CmdWantEnginePreview, 0, CMDT_VEHICLE_MANAGEMENT ), // CMD_WANT_ENGINE_PREVIEW + DEF_CMD(CmdEngineCtrl, CMD_DEITY, CMDT_VEHICLE_MANAGEMENT ), // CMD_ENGINE_CTRL DEF_CMD(CmdRenameVehicle, 0, CMDT_OTHER_MANAGEMENT ), // CMD_RENAME_VEHICLE DEF_CMD(CmdRenameEngine, CMD_SERVER, CMDT_OTHER_MANAGEMENT ), // CMD_RENAME_ENGINE @@ -295,6 +298,7 @@ static const Command _command_proc_table[] = { DEF_CMD(CmdDoTownAction, 0, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_DO_TOWN_ACTION DEF_CMD(CmdTownCargoGoal, CMD_DEITY, CMDT_OTHER_MANAGEMENT ), // CMD_TOWN_CARGO_GOAL DEF_CMD(CmdTownGrowthRate, CMD_DEITY, CMDT_OTHER_MANAGEMENT ), // CMD_TOWN_GROWTH_RATE + DEF_CMD(CmdTownRating, CMD_DEITY, CMDT_OTHER_MANAGEMENT ), // CMD_TOWN_RATING DEF_CMD(CmdTownSetText, CMD_STR_CTRL | CMD_DEITY, CMDT_OTHER_MANAGEMENT ), // CMD_TOWN_SET_TEXT DEF_CMD(CmdExpandTown, CMD_DEITY, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_EXPAND_TOWN DEF_CMD(CmdDeleteTown, CMD_OFFLINE, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_DELETE_TOWN diff --git a/src/command_type.h b/src/command_type.h index 41f2360d8d..2e026a63d9 100644 --- a/src/command_type.h +++ b/src/command_type.h @@ -238,6 +238,7 @@ enum Commands { CMD_DECREASE_LOAN, ///< decrease the loan from the bank CMD_WANT_ENGINE_PREVIEW, ///< confirm the preview of an engine + CMD_ENGINE_CTRL, ///< control availability of the engine for companies CMD_RENAME_VEHICLE, ///< rename a whole vehicle CMD_RENAME_ENGINE, ///< rename a engine (in the engine list) @@ -262,6 +263,7 @@ enum Commands { CMD_DO_TOWN_ACTION, ///< do a action from the town detail window (like advertises or bribe) CMD_TOWN_CARGO_GOAL, ///< set the goal of a cargo for a town CMD_TOWN_GROWTH_RATE, ///< set the town growth rate + CMD_TOWN_RATING, ///< set rating of a company in a town CMD_TOWN_SET_TEXT, ///< set the custom text of a town CMD_EXPAND_TOWN, ///< expand a town CMD_DELETE_TOWN, ///< delete a town diff --git a/src/console.cpp b/src/console.cpp index b777bf2c05..3c782357d2 100644 --- a/src/console.cpp +++ b/src/console.cpp @@ -21,6 +21,7 @@ #include "safeguards.h" static const uint ICON_TOKEN_COUNT = 20; ///< Maximum number of tokens in one command +static const uint ICON_MAX_RECURSE = 10; ///< Maximum number of recursion /* console parser */ IConsoleCmd *_iconsole_cmds; ///< list of registered commands @@ -316,13 +317,18 @@ IConsoleAlias *IConsoleAliasGet(const char *name) * @param tokencount the number of parameters passed * @param *tokens are the parameters given to the original command (0 is the first param) */ -static void IConsoleAliasExec(const IConsoleAlias *alias, byte tokencount, char *tokens[ICON_TOKEN_COUNT]) +static void IConsoleAliasExec(const IConsoleAlias *alias, byte tokencount, char *tokens[ICON_TOKEN_COUNT], const uint recurse_count) { char alias_buffer[ICON_MAX_STREAMSIZE] = { '\0' }; char *alias_stream = alias_buffer; DEBUG(console, 6, "Requested command is an alias; parsing..."); + if (recurse_count > ICON_MAX_RECURSE) { + IConsoleError("Too many alias expansions, recursion limit reached. Aborting"); + return; + } + for (const char *cmdptr = alias->cmdline; *cmdptr != '\0'; cmdptr++) { switch (*cmdptr) { case '\'': // ' will double for "" @@ -330,7 +336,7 @@ static void IConsoleAliasExec(const IConsoleAlias *alias, byte tokencount, char break; case ';': // Cmd separator; execute previous and start new command - IConsoleCmdExec(alias_buffer); + IConsoleCmdExec(alias_buffer, recurse_count); alias_stream = alias_buffer; *alias_stream = '\0'; // Make sure the new command is terminated. @@ -390,7 +396,7 @@ static void IConsoleAliasExec(const IConsoleAlias *alias, byte tokencount, char } } - IConsoleCmdExec(alias_buffer); + IConsoleCmdExec(alias_buffer, recurse_count); } /** @@ -398,7 +404,7 @@ static void IConsoleAliasExec(const IConsoleAlias *alias, byte tokencount, char * individual tokens (separated by spaces), then execute it if possible * @param cmdstr string to be parsed and executed */ -void IConsoleCmdExec(const char *cmdstr) +void IConsoleCmdExec(const char *cmdstr, const uint recurse_count) { const char *cmdptr; char *tokens[ICON_TOKEN_COUNT], tokenstream[ICON_MAX_STREAMSIZE]; @@ -504,7 +510,7 @@ void IConsoleCmdExec(const char *cmdstr) t_index--; IConsoleAlias *alias = IConsoleAliasGet(tokens[0]); if (alias != nullptr) { - IConsoleAliasExec(alias, t_index, &tokens[1]); + IConsoleAliasExec(alias, t_index, &tokens[1], recurse_count + 1); return; } diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index f4d0626a5b..30982d8214 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -33,6 +33,7 @@ #include "ai/ai.hpp" #include "ai/ai_config.hpp" #include "newgrf.h" +#include "newgrf_profiling.h" #include "console_func.h" #include "engine_base.h" #include "game/game.hpp" @@ -469,7 +470,7 @@ DEF_CONSOLE_CMD(ConClearBuffer) * Network Core Console Commands **********************************/ -static bool ConKickOrBan(const char *argv, bool ban) +static bool ConKickOrBan(const char *argv, bool ban, const char *reason) { uint n; @@ -493,14 +494,14 @@ static bool ConKickOrBan(const char *argv, bool ban) if (!ban) { /* Kick only this client, not all clients with that IP */ - NetworkServerKickClient(client_id); + NetworkServerKickClient(client_id, reason); return true; } /* When banning, kick+ban all clients with that IP */ - n = NetworkServerKickOrBanIP(client_id, ban); + n = NetworkServerKickOrBanIP(client_id, ban, reason); } else { - n = NetworkServerKickOrBanIP(argv, ban); + n = NetworkServerKickOrBanIP(argv, ban, reason); } if (n == 0) { @@ -515,28 +516,48 @@ static bool ConKickOrBan(const char *argv, bool ban) DEF_CONSOLE_CMD(ConKick) { if (argc == 0) { - IConsoleHelp("Kick a client from a network game. Usage: 'kick '"); + IConsoleHelp("Kick a client from a network game. Usage: 'kick []'"); IConsoleHelp("For client-id's, see the command 'clients'"); return true; } - if (argc != 2) return false; + if (argc != 2 && argc != 3) return false; - return ConKickOrBan(argv[1], false); + /* No reason supplied for kicking */ + if (argc == 2) return ConKickOrBan(argv[1], false, nullptr); + + /* Reason for kicking supplied */ + size_t kick_message_length = strlen(argv[2]); + if (kick_message_length >= 255) { + IConsolePrintF(CC_ERROR, "ERROR: Maximum kick message length is 254 characters. You entered %d characters.", kick_message_length); + return false; + } else { + return ConKickOrBan(argv[1], false, argv[2]); + } } DEF_CONSOLE_CMD(ConBan) { if (argc == 0) { - IConsoleHelp("Ban a client from a network game. Usage: 'ban '"); + IConsoleHelp("Ban a client from a network game. Usage: 'ban []'"); IConsoleHelp("For client-id's, see the command 'clients'"); IConsoleHelp("If the client is no longer online, you can still ban his/her IP"); return true; } - if (argc != 2) return false; + if (argc != 2 && argc != 3) return false; - return ConKickOrBan(argv[1], true); + /* No reason supplied for kicking */ + if (argc == 2) return ConKickOrBan(argv[1], true, nullptr); + + /* Reason for kicking supplied */ + size_t kick_message_length = strlen(argv[2]); + if (kick_message_length >= 255) { + IConsolePrintF(CC_ERROR, "ERROR: Maximum kick message length is 254 characters. You entered %d characters.", kick_message_length); + return false; + } else { + return ConKickOrBan(argv[1], true, argv[2]); + } } DEF_CONSOLE_CMD(ConUnBan) @@ -1349,10 +1370,11 @@ DEF_CONSOLE_CMD(ConAlias) DEF_CONSOLE_CMD(ConScreenShot) { if (argc == 0) { - IConsoleHelp("Create a screenshot of the game. Usage: 'screenshot [big | giant | no_con] [file name]'"); + IConsoleHelp("Create a screenshot of the game. Usage: 'screenshot [big | giant | no_con | minimap] [file name]'"); IConsoleHelp("'big' makes a zoomed-in screenshot of the visible area, 'giant' makes a screenshot of the " "whole map, 'no_con' hides the console to create the screenshot. 'big' or 'giant' " - "screenshots are always drawn without console"); + "screenshots are always drawn without console. " + "'minimap' makes a top-viewed minimap screenshot of whole world which represents one tile by one pixel."); return true; } @@ -1370,6 +1392,10 @@ DEF_CONSOLE_CMD(ConScreenShot) /* screenshot giant [filename] */ type = SC_WORLD; if (argc > 2) name = argv[2]; + } else if (strcmp(argv[1], "minimap") == 0) { + /* screenshot minimap [filename] */ + type = SC_MINIMAP; + if (argc > 2) name = argv[2]; } else if (strcmp(argv[1], "no_con") == 0) { /* screenshot no_con [filename] */ IConsoleClose(); @@ -1872,6 +1898,135 @@ DEF_CONSOLE_CMD(ConNewGRFReload) return true; } +DEF_CONSOLE_CMD(ConNewGRFProfile) +{ + if (argc == 0) { + IConsoleHelp("Collect performance data about NewGRF sprite requests and callbacks. Sub-commands can be abbreviated."); + IConsoleHelp("Usage: newgrf_profile [list]"); + IConsoleHelp(" List all NewGRFs that can be profiled, and their status."); + IConsoleHelp("Usage: newgrf_profile select ..."); + IConsoleHelp(" Select one or more GRFs for profiling."); + IConsoleHelp("Usage: newgrf_profile unselect ..."); + IConsoleHelp(" Unselect one or more GRFs from profiling. Use the keyword \"all\" instead of a GRF number to unselect all. Removing an active profiler aborts data collection."); + IConsoleHelp("Usage: newgrf_profile start []"); + IConsoleHelp(" Begin profiling all selected GRFs. If a number of days is provided, profiling stops after that many in-game days."); + IConsoleHelp("Usage: newgrf_profile stop"); + IConsoleHelp(" End profiling and write the collected data to CSV files."); + IConsoleHelp("Usage: newgrf_profile abort"); + IConsoleHelp(" End profiling and discard all collected data."); + return true; + } + + extern const std::vector &GetAllGRFFiles(); + const std::vector &files = GetAllGRFFiles(); + + /* "list" sub-command */ + if (argc == 1 || strncasecmp(argv[1], "lis", 3) == 0) { + IConsolePrint(CC_INFO, "Loaded GRF files:"); + int i = 1; + for (GRFFile *grf : files) { + auto profiler = std::find_if(_newgrf_profilers.begin(), _newgrf_profilers.end(), [&](NewGRFProfiler &pr) { return pr.grffile == grf; }); + bool selected = profiler != _newgrf_profilers.end(); + bool active = selected && profiler->active; + TextColour tc = active ? TC_LIGHT_BLUE : selected ? TC_GREEN : CC_INFO; + const char *statustext = active ? " (active)" : selected ? " (selected)" : ""; + IConsolePrintF(tc, "%d: [%08X] %s%s", i, BSWAP32(grf->grfid), grf->filename, statustext); + i++; + } + return true; + } + + /* "select" sub-command */ + if (strncasecmp(argv[1], "sel", 3) == 0 && argc >= 3) { + for (size_t argnum = 2; argnum < argc; ++argnum) { + int grfnum = atoi(argv[argnum]); + if (grfnum < 1 || grfnum > (int)files.size()) { // safe cast, files.size() should not be larger than a few hundred in the most extreme cases + IConsolePrintF(CC_WARNING, "GRF number %d out of range, not added.", grfnum); + continue; + } + GRFFile *grf = files[grfnum - 1]; + if (std::any_of(_newgrf_profilers.begin(), _newgrf_profilers.end(), [&](NewGRFProfiler &pr) { return pr.grffile == grf; })) { + IConsolePrintF(CC_WARNING, "GRF number %d [%08X] is already selected for profiling.", grfnum, BSWAP32(grf->grfid)); + continue; + } + _newgrf_profilers.emplace_back(grf); + } + return true; + } + + /* "unselect" sub-command */ + if (strncasecmp(argv[1], "uns", 3) == 0 && argc >= 3) { + for (size_t argnum = 2; argnum < argc; ++argnum) { + if (strcasecmp(argv[argnum], "all") == 0) { + _newgrf_profilers.clear(); + break; + } + int grfnum = atoi(argv[argnum]); + if (grfnum < 1 || grfnum > (int)files.size()) { + IConsolePrintF(CC_WARNING, "GRF number %d out of range, not removing.", grfnum); + continue; + } + GRFFile *grf = files[grfnum - 1]; + auto pos = std::find_if(_newgrf_profilers.begin(), _newgrf_profilers.end(), [&](NewGRFProfiler &pr) { return pr.grffile == grf; }); + if (pos != _newgrf_profilers.end()) _newgrf_profilers.erase(pos); + } + return true; + } + + /* "start" sub-command */ + if (strncasecmp(argv[1], "sta", 3) == 0) { + std::string grfids; + size_t started = 0; + for (NewGRFProfiler &pr : _newgrf_profilers) { + if (!pr.active) { + pr.Start(); + started++; + + if (!grfids.empty()) grfids += ", "; + char grfidstr[12]{ 0 }; + seprintf(grfidstr, lastof(grfidstr), "[%08X]", BSWAP32(pr.grffile->grfid)); + grfids += grfidstr; + } + } + if (started > 0) { + IConsolePrintF(CC_DEBUG, "Started profiling for GRFID%s %s", (started > 1) ? "s" : "", grfids.c_str()); + if (argc >= 3) { + int days = max(atoi(argv[2]), 1); + _newgrf_profile_end_date = _date + days; + + char datestrbuf[32]{ 0 }; + SetDParam(0, _newgrf_profile_end_date); + GetString(datestrbuf, STR_JUST_DATE_ISO, lastof(datestrbuf)); + IConsolePrintF(CC_DEBUG, "Profiling will automatically stop on game date %s", datestrbuf); + } else { + _newgrf_profile_end_date = MAX_DAY; + } + } else if (_newgrf_profilers.empty()) { + IConsolePrintF(CC_WARNING, "No GRFs selected for profiling, did not start."); + } else { + IConsolePrintF(CC_WARNING, "Did not start profiling for any GRFs, all selected GRFs are already profiling."); + } + return true; + } + + /* "stop" sub-command */ + if (strncasecmp(argv[1], "sto", 3) == 0) { + NewGRFProfiler::FinishAll(); + return true; + } + + /* "abort" sub-command */ + if (strncasecmp(argv[1], "abo", 3) == 0) { + for (NewGRFProfiler &pr : _newgrf_profilers) { + pr.Abort(); + } + _newgrf_profile_end_date = MAX_DAY; + return true; + } + + return false; +} + #ifdef _DEBUG /****************** * debug commands @@ -2051,4 +2206,5 @@ void IConsoleStdLibRegister() /* NewGRF development stuff */ IConsoleCmdRegister("reload_newgrfs", ConNewGRFReload, ConHookNewGRFDeveloperTool); + IConsoleCmdRegister("newgrf_profile", ConNewGRFProfile, ConHookNewGRFDeveloperTool); } diff --git a/src/console_func.h b/src/console_func.h index 1dad477b8a..6d634a4553 100644 --- a/src/console_func.h +++ b/src/console_func.h @@ -28,7 +28,7 @@ void IConsoleWarning(const char *string); void IConsoleError(const char *string); /* Parser */ -void IConsoleCmdExec(const char *cmdstr); +void IConsoleCmdExec(const char *cmdstr, const uint recurse_count = 0); bool IsValidConsoleColour(TextColour c); diff --git a/src/core/pool_type.hpp b/src/core/pool_type.hpp index 035607a8fb..9e6fc8fecd 100644 --- a/src/core/pool_type.hpp +++ b/src/core/pool_type.hpp @@ -12,7 +12,6 @@ #include "smallvec_type.hpp" #include "enum_type.hpp" -#include /** Various types of a pool. */ enum PoolType { @@ -149,9 +148,8 @@ struct Pool : PoolBase { typedef size_t difference_type; typedef std::forward_iterator_tag iterator_category; - explicit PoolIterator(size_t index, std::function filter = nullptr) : index(index), filter(filter) + explicit PoolIterator(size_t index) : index(index) { - if (this->filter == nullptr) this->filter = [](size_t) { return true; }; this->ValidateIndex(); }; @@ -162,8 +160,7 @@ struct Pool : PoolBase { private: size_t index; - std::function filter; - void ValidateIndex() { while (this->index < T::GetPoolSize() && !(T::IsValidID(this->index) && this->filter(this->index))) this->index++; } + void ValidateIndex() { while (this->index < T::GetPoolSize() && !(T::IsValidID(this->index))) this->index++; } }; /* @@ -173,13 +170,54 @@ struct Pool : PoolBase { template struct IterateWrapper { size_t from; - std::function filter; - IterateWrapper(size_t from = 0, std::function filter = nullptr) : from(from), filter(filter) {} - PoolIterator begin() { return PoolIterator(this->from, this->filter); } + IterateWrapper(size_t from = 0) : from(from) {} + PoolIterator begin() { return PoolIterator(this->from); } PoolIterator end() { return PoolIterator(T::GetPoolSize()); } bool empty() { return this->begin() == this->end(); } }; + /** + * Iterator to iterate all valid T of a pool + * @tparam T Type of the class/struct that is going to be iterated + */ + template + struct PoolIteratorFiltered { + typedef T value_type; + typedef T* pointer; + typedef T& reference; + typedef size_t difference_type; + typedef std::forward_iterator_tag iterator_category; + + explicit PoolIteratorFiltered(size_t index, F filter) : index(index), filter(filter) + { + this->ValidateIndex(); + }; + + bool operator==(const PoolIteratorFiltered &other) const { return this->index == other.index; } + bool operator!=(const PoolIteratorFiltered &other) const { return !(*this == other); } + T * operator*() const { return T::Get(this->index); } + PoolIteratorFiltered & operator++() { this->index++; this->ValidateIndex(); return *this; } + + private: + size_t index; + F filter; + void ValidateIndex() { while (this->index < T::GetPoolSize() && !(T::IsValidID(this->index) && this->filter(this->index))) this->index++; } + }; + + /* + * Iterable ensemble of all valid T + * @tparam T Type of the class/struct that is going to be iterated + */ + template + struct IterateWrapperFiltered { + size_t from; + F filter; + IterateWrapperFiltered(size_t from, F filter) : from(from), filter(filter) {} + PoolIteratorFiltered begin() { return PoolIteratorFiltered(this->from, this->filter); } + PoolIteratorFiltered end() { return PoolIteratorFiltered(T::GetPoolSize(), this->filter); } + bool empty() { return this->begin() == this->end(); } + }; + /** * Base class for all PoolItems * @tparam Tpool The pool this item is going to be part of diff --git a/src/date.cpp b/src/date.cpp index c45396efea..97758a3ebf 100644 --- a/src/date.cpp +++ b/src/date.cpp @@ -18,6 +18,7 @@ #include "rail_gui.h" #include "linkgraph/linkgraph.h" #include "saveload/saveload.h" +#include "newgrf_profiling.h" #include "safeguards.h" @@ -27,6 +28,8 @@ Date _date; ///< Current date in days (day counter) DateFract _date_fract; ///< Fractional part of the day. uint16 _tick_counter; ///< Ever incrementing (and sometimes wrapping) tick counter for setting off various events +int32 _old_ending_year_slv_105; ///< Old ending year for savegames before SLV_105 + /** * Set the date. * @param date New date @@ -197,8 +200,8 @@ static void OnNewYear() if (_cur_year == _settings_client.gui.semaphore_build_before) ResetSignalVariant(); - /* check if we reached end of the game */ - if (_cur_year == ORIGINAL_END_YEAR) { + /* check if we reached end of the game (end of ending year) */ + if (_cur_year == _settings_game.game_creation.ending_year + 1) { ShowEndGameChart(); /* check if we reached the maximum year, decrement dates by a year */ } else if (_cur_year == MAX_YEAR + 1) { @@ -243,6 +246,10 @@ static void OnNewMonth() */ static void OnNewDay() { + if (!_newgrf_profilers.empty() && _newgrf_profile_end_date <= _date) { + NewGRFProfiler::FinishAll(); + } + if (_network_server) NetworkServerDailyLoop(); DisasterDailyLoop(); diff --git a/src/date_type.h b/src/date_type.h index d05b44008e..4cbcfac4ed 100644 --- a/src/date_type.h +++ b/src/date_type.h @@ -84,6 +84,8 @@ static const Year MIN_YEAR = 0; /** The default starting year */ static const Year DEF_START_YEAR = 1950; +/** The default scoring end year */ +static const Year DEF_END_YEAR = ORIGINAL_END_YEAR - 1; /** * MAX_YEAR, nicely rounded value of the number of years that can diff --git a/src/depot.cpp b/src/depot.cpp index 05e2af3d4a..9207c63629 100644 --- a/src/depot.cpp +++ b/src/depot.cpp @@ -27,6 +27,8 @@ INSTANTIATE_POOL_METHODS(Depot) */ Depot::~Depot() { + free(this->name); + if (CleaningPool()) return; if (!IsDepotTile(this->xy) || GetDepotIndex(this->xy) != this->index) { diff --git a/src/economy.cpp b/src/economy.cpp index a0907efbe9..00bdd6f534 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -1216,10 +1216,11 @@ void CargoPayment::PayFinalDelivery(const CargoPacket *cp, uint count) */ Money CargoPayment::PayTransfer(const CargoPacket *cp, uint count) { - Money profit = GetTransportedGoodsIncome( + Money profit = -cp->FeederShare(count) + GetTransportedGoodsIncome( count, - /* pay transfer vehicle for only the part of transfer it has done: ie. cargo_loaded_at_xy to here */ - DistanceManhattan(cp->LoadedAtXY(), Station::Get(this->current_station)->xy), + /* pay transfer vehicle the difference between the payment for the journey from + * the source to the current point, and the sum of the previous transfer payments */ + DistanceManhattan(cp->SourceStationXY(), Station::Get(this->current_station)->xy), cp->DaysInTransit(), this->ct); diff --git a/src/engine.cpp b/src/engine.cpp index 66e68fd3c6..c3e9329fb7 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -710,11 +710,11 @@ void StartupEngines() } /** - * Company \a company accepts engine \a eid for preview. - * @param eid Engine being accepted (is under preview). - * @param company Current company previewing the engine. + * Allows engine \a eid to be used by a company \a company. + * @param eid The engine to enable. + * @param company The company to allow using the engine. */ -static void AcceptEnginePreview(EngineID eid, CompanyID company) +static void EnableEngineForCompany(EngineID eid, CompanyID company) { Engine *e = Engine::Get(eid); Company *c = Company::Get(company); @@ -728,15 +728,45 @@ static void AcceptEnginePreview(EngineID eid, CompanyID company) c->avail_roadtypes = AddDateIntroducedRoadTypes(c->avail_roadtypes | GetRoadTypeInfo(e->u.road.roadtype)->introduces_roadtypes, _date); } - e->preview_company = INVALID_COMPANY; - e->preview_asked = (CompanyMask)-1; + if (company == _local_company) { + AddRemoveEngineFromAutoreplaceAndBuildWindows(e->type); + + /* Update the toolbar. */ + InvalidateWindowData(WC_MAIN_TOOLBAR, 0); + if (e->type == VEH_ROAD) InvalidateWindowData(WC_BUILD_TOOLBAR, TRANSPORT_ROAD); + if (e->type == VEH_SHIP) InvalidateWindowData(WC_BUILD_TOOLBAR, TRANSPORT_WATER); + } +} + +/** + * Forbids engine \a eid to be used by a company \a company. + * @param eid The engine to disable. + * @param company The company to forbid using the engine. + */ +static void DisableEngineForCompany(EngineID eid, CompanyID company) +{ + Engine *e = Engine::Get(eid); + + ClrBit(e->company_avail, company); + if (company == _local_company) { AddRemoveEngineFromAutoreplaceAndBuildWindows(e->type); } +} - /* Update the toolbar. */ - if (e->type == VEH_ROAD) InvalidateWindowData(WC_BUILD_TOOLBAR, TRANSPORT_ROAD); - if (e->type == VEH_SHIP) InvalidateWindowData(WC_BUILD_TOOLBAR, TRANSPORT_WATER); +/** + * Company \a company accepts engine \a eid for preview. + * @param eid Engine being accepted (is under preview). + * @param company Current company previewing the engine. + */ +static void AcceptEnginePreview(EngineID eid, CompanyID company) +{ + Engine *e = Engine::Get(eid); + + e->preview_company = INVALID_COMPANY; + e->preview_asked = (CompanyMask)-1; + + EnableEngineForCompany(eid, company); /* Notify preview window, that it might want to close. * Note: We cannot directly close the window. @@ -891,6 +921,37 @@ CommandCost CmdWantEnginePreview(TileIndex tile, DoCommandFlag flags, uint32 p1, return CommandCost(); } +/** + * Allow or forbid a specific company to use an engine + * @param tile unused + * @param flags operation to perform + * @param p1 engine id + * @param p2 various bitstuffed elements + * - p2 = (bit 0 - 7) - Company to allow/forbid the use of an engine. + * - p2 = (bit 31) - 0 to forbid, 1 to allow. + * @param text unused + * @return the cost of this operation or an error + */ +CommandCost CmdEngineCtrl(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) +{ + if (_current_company != OWNER_DEITY) return CMD_ERROR; + EngineID engine_id = (EngineID)p1; + CompanyID company_id = (CompanyID)GB(p2, 0, 8); + bool allow = HasBit(p2, 31); + + if (!Engine::IsValidID(engine_id) || !Company::IsValidID(company_id)) return CMD_ERROR; + + if (flags & DC_EXEC) { + if (allow) { + EnableEngineForCompany(engine_id, company_id); + } else { + DisableEngineForCompany(engine_id, company_id); + } + } + + return CommandCost(); +} + /** * An engine has become available for general use. * Also handle the exclusive engine preview contract. diff --git a/src/engine_base.h b/src/engine_base.h index 1328f66a18..203d35f201 100644 --- a/src/engine_base.h +++ b/src/engine_base.h @@ -142,15 +142,21 @@ struct Engine : EnginePool::PoolItem<&_engine_pool> { uint32 GetGRFID() const; + struct EngineTypeFilter { + VehicleType vt; + + bool operator() (size_t index) { return Engine::Get(index)->type == this->vt; } + }; + /** * Returns an iterable ensemble of all valid engines of the given type * @param vt the VehicleType for engines to be valid * @param from index of the first engine to consider * @return an iterable ensemble of all valid engines of the given type */ - static Pool::IterateWrapper IterateType(VehicleType vt, size_t from = 0) + static Pool::IterateWrapperFiltered IterateType(VehicleType vt, size_t from = 0) { - return Pool::IterateWrapper(from, [vt](size_t index) { return Engine::Get(index)->type == vt; }); + return Pool::IterateWrapperFiltered(from, EngineTypeFilter{ vt }); } }; diff --git a/src/fios_gui.cpp b/src/fios_gui.cpp index 7b13aa1db1..9f8b45413f 100644 --- a/src/fios_gui.cpp +++ b/src/fios_gui.cpp @@ -269,8 +269,9 @@ private: AbstractFileType abstract_filetype; /// Type of file to select. SaveLoadOperation fop; ///< File operation to perform. FileList fios_items; ///< Save game list. - FiosItem o_dir; + FiosItem o_dir; ///< Original dir (home dir for this browser) const FiosItem *selected; ///< Selected game in #fios_items, or \c nullptr. + const FiosItem *highlighted; ///< Item in fios_items highlighted by mouse pointer, or \c nullptr. Scrollbar *vscroll; StringFilter string_filter; ///< Filter for available games. @@ -445,6 +446,8 @@ public: if (item == this->selected) { GfxFillRect(r.left + 1, y, r.right, y + this->resize.step_height, PC_DARK_BLUE); + } else if (item == this->highlighted) { + GfxFillRect(r.left + 1, y, r.right, y + this->resize.step_height, PC_VERY_DARK_BLUE); } DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, item->title, _fios_colours[GetDetailedFileType(item->type)]); y += this->resize.step_height; @@ -714,6 +717,33 @@ public: } } + void OnMouseLoop() override + { + const Point pt{ _cursor.pos.x - this->left, _cursor.pos.y - this->top }; + const int widget = GetWidgetFromPos(this, pt.x, pt.y); + + if (widget == WID_SL_DRIVES_DIRECTORIES_LIST) { + int y = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_SL_DRIVES_DIRECTORIES_LIST, WD_FRAMERECT_TOP); + if (y == INT_MAX) return; + + /* Get the corresponding non-filtered out item from the list */ + int i = 0; + while (i <= y) { + if (!this->fios_items_shown[i]) y++; + i++; + } + const FiosItem *file = this->fios_items.Get(y); + + if (file != this->highlighted) { + this->highlighted = file; + this->SetWidgetDirty(WID_SL_DRIVES_DIRECTORIES_LIST); + } + } else if (this->highlighted != nullptr) { + this->highlighted = nullptr; + this->SetWidgetDirty(WID_SL_DRIVES_DIRECTORIES_LIST); + } + } + EventState OnKeyPress(WChar key, uint16 keycode) override { if (keycode == WKC_ESC) { diff --git a/src/gfx.cpp b/src/gfx.cpp index db024c9c75..0768373416 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -154,6 +154,144 @@ void GfxFillRect(int left, int top, int right, int bottom, int colour, FillRectM } } +typedef std::pair LineSegment; + +/** + * Make line segments from a polygon defined by points, translated by an offset. + * Entirely horizontal lines (start and end at same Y coordinate) are skipped, as they are irrelevant to scanline conversion algorithms. + * Generated line segments always have the lowest Y coordinate point first, i.e. original direction is lost. + * @param shape The polygon to convert. + * @param offset Offset vector subtracted from all coordinates in the shape. + * @return Vector of undirected line segments. + */ +static std::vector MakePolygonSegments(const std::vector &shape, Point offset) +{ + std::vector segments; + if (shape.size() < 3) return segments; // fewer than 3 will always result in an empty polygon + segments.reserve(shape.size()); + + /* Connect first and last point by having initial previous point be the last */ + Point prev = shape.back(); + prev.x -= offset.x; + prev.y -= offset.y; + for (Point pt : shape) { + pt.x -= offset.x; + pt.y -= offset.y; + /* Create segments for all non-horizontal lines in the polygon. + * The segments always have lowest Y coordinate first. */ + if (prev.y > pt.y) { + segments.emplace_back(pt, prev); + } else if (prev.y < pt.y) { + segments.emplace_back(prev, pt); + } + prev = pt; + } + + return segments; +} + +/** + * Fill a polygon with colour. + * The odd-even winding rule is used, i.e. self-intersecting polygons will have holes in them. + * Left and top edges are inclusive, right and bottom edges are exclusive. + * @note For rectangles the GfxFillRect function will be faster. + * @pre dpi->zoom == ZOOM_LVL_NORMAL + * @param shape List of points on the polygon. + * @param colour An 8 bit palette index (FILLRECT_OPAQUE and FILLRECT_CHECKER) or a recolour spritenumber (FILLRECT_RECOLOUR). + * @param mode + * FILLRECT_OPAQUE: Fill the polygon with the specified colour. + * FILLRECT_CHECKER: Fill every other pixel with the specified colour, in a checkerboard pattern. + * FILLRECT_RECOLOUR: Apply a recolour sprite to every pixel in the polygon. + */ +void GfxFillPolygon(const std::vector &shape, int colour, FillRectMode mode) +{ + Blitter *blitter = BlitterFactory::GetCurrentBlitter(); + const DrawPixelInfo *dpi = _cur_dpi; + if (dpi->zoom != ZOOM_LVL_NORMAL) return; + + std::vector segments = MakePolygonSegments(shape, Point{ dpi->left, dpi->top }); + + /* Remove segments appearing entirely above or below the clipping area. */ + segments.erase(std::remove_if(segments.begin(), segments.end(), [dpi](const LineSegment &s) { return s.second.y <= 0 || s.first.y >= dpi->height; }), segments.end()); + + /* Check that this wasn't an empty shape (all points on a horizontal line or outside clipping.) */ + if (segments.empty()) return; + + /* Sort the segments by first point Y coordinate. */ + std::sort(segments.begin(), segments.end(), [](const LineSegment &a, const LineSegment &b) { return a.first.y < b.first.y; }); + + /* Segments intersecting current scanline. */ + std::vector active; + /* Intersection points with a scanline. + * Kept outside loop to avoid repeated re-allocations. */ + std::vector intersections; + /* Normal, reasonable polygons don't have many intersections per scanline. */ + active.reserve(4); + intersections.reserve(4); + + /* Scan through the segments and paint each scanline. */ + int y = segments.front().first.y; + std::vector::iterator nextseg = segments.begin(); + while (!active.empty() || nextseg != segments.end()) { + /* Clean up segments that have ended. */ + active.erase(std::remove_if(active.begin(), active.end(), [y](const LineSegment &s) { return s.second.y == y; }), active.end()); + + /* Activate all segments starting on this scanline. */ + while (nextseg != segments.end() && nextseg->first.y == y) { + active.push_back(*nextseg); + ++nextseg; + } + + /* Check clipping. */ + if (y < 0) { + ++y; + continue; + } + if (y >= dpi->height) return; + + /* Intersect scanline with all active segments. */ + intersections.clear(); + for (const LineSegment &s : active) { + const int sdx = s.second.x - s.first.x; + const int sdy = s.second.y - s.first.y; + const int ldy = y - s.first.y; + const int x = s.first.x + sdx * ldy / sdy; + intersections.push_back(x); + } + + /* Fill between pairs of intersections. */ + std::sort(intersections.begin(), intersections.end()); + for (size_t i = 1; i < intersections.size(); i += 2) { + /* Check clipping. */ + const int x1 = max(0, intersections[i - 1]); + const int x2 = min(intersections[i], dpi->width); + if (x2 < 0) continue; + if (x1 >= dpi->width) continue; + + /* Fill line y from x1 to x2. */ + void *dst = blitter->MoveTo(dpi->dst_ptr, x1, y); + switch (mode) { + default: // FILLRECT_OPAQUE + blitter->DrawRect(dst, x2 - x1, 1, (uint8)colour); + break; + case FILLRECT_RECOLOUR: + blitter->DrawColourMappingRect(dst, x2 - x1, 1, GB(colour, 0, PALETTE_WIDTH)); + break; + case FILLRECT_CHECKER: + /* Fill every other pixel, offset such that the sum of filled pixels' X and Y coordinates is odd. + * This creates a checkerboard effect. */ + for (int x = (x1 + y) & 1; x < x2 - x1; x += 2) { + blitter->SetPixel(dst, x, 0, (uint8)colour); + } + break; + } + } + + /* Next line */ + ++y; + } +} + /** * Check line clipping by using a linear equation and draw the visible part of * the line given by x/y and x2/y2. diff --git a/src/gfx_func.h b/src/gfx_func.h index 5da0ff0cab..3def1c85a4 100644 --- a/src/gfx_func.h +++ b/src/gfx_func.h @@ -115,6 +115,7 @@ int DrawStringMultiLine(int left, int right, int top, int bottom, StringID str, void DrawCharCentered(uint32 c, int x, int y, TextColour colour); void GfxFillRect(int left, int top, int right, int bottom, int colour, FillRectMode mode = FILLRECT_OPAQUE); +void GfxFillPolygon(const std::vector &shape, int colour, FillRectMode mode = FILLRECT_OPAQUE); void GfxDrawLine(int left, int top, int right, int bottom, int colour, int width = 1, int dash = 0); void DrawBox(int x, int y, int dx1, int dy1, int dx2, int dy2, int dx3, int dy3); @@ -219,7 +220,14 @@ static const uint8 PC_VERY_LIGHT_YELLOW = 0x45; ///< Almost-white yel static const uint8 PC_GREEN = 0xD0; ///< Green palette colour. +static const uint8 PC_VERY_DARK_BLUE = 0x9A; ///< Almost-black blue palette colour. static const uint8 PC_DARK_BLUE = 0x9D; ///< Dark blue palette colour. static const uint8 PC_LIGHT_BLUE = 0x98; ///< Light blue palette colour. +static const uint8 PC_ROUGH_LAND = 0x52; ///< Dark green palette colour for rough land. +static const uint8 PC_GRASS_LAND = 0x54; ///< Dark green palette colour for grass land. +static const uint8 PC_BARE_LAND = 0x37; ///< Brown palette colour for bare land. +static const uint8 PC_FIELDS = 0x25; ///< Light brown palette colour for fields. +static const uint8 PC_TREES = 0x57; ///< Green palette colour for trees. +static const uint8 PC_WATER = 0xC9; ///< Dark blue palette colour for water. #endif /* GFX_FUNC_H */ diff --git a/src/group_gui.cpp b/src/group_gui.cpp index 842e3fbb0e..0bf8589ac5 100644 --- a/src/group_gui.cpp +++ b/src/group_gui.cpp @@ -299,7 +299,7 @@ private: spr = SPR_PROFIT_NA; } else if (profit_last_year < 0) { spr = SPR_PROFIT_NEGATIVE; - } else if (profit_last_year < (Money)10000 * num_profit_vehicle) { // TODO magic number + } else if (profit_last_year < VEHICLE_PROFIT_THRESHOLD * num_profit_vehicle) { spr = SPR_PROFIT_SOME; } else { spr = SPR_PROFIT_LOT; @@ -1017,6 +1017,7 @@ public: } this->groups.ForceRebuild(); this->BuildGroupList(this->owner); + this->group_sb->SetCount((uint)this->groups.size()); id_g = find_index(this->groups, g); } this->group_sb->ScrollTowards(id_g); diff --git a/src/hotkeys.cpp b/src/hotkeys.cpp index 11be10b302..d5cd90b3c5 100644 --- a/src/hotkeys.cpp +++ b/src/hotkeys.cpp @@ -38,10 +38,15 @@ static const KeycodeNames _keycode_to_name[] = { {"META", WKC_META}, {"GLOBAL", WKC_GLOBAL_HOTKEY}, {"ESC", WKC_ESC}, - {"DEL", WKC_DELETE}, {"BACKSPACE", WKC_BACKSPACE}, + {"INS", WKC_INSERT}, + {"DEL", WKC_DELETE}, + {"PAGEUP", WKC_PAGEUP}, + {"PAGEDOWN", WKC_PAGEDOWN}, + {"END", WKC_END}, + {"HOME", WKC_HOME}, {"RETURN", WKC_RETURN}, - {"BACKQUOTE", WKC_BACKQUOTE}, + {"SPACE", WKC_SPACE}, {"F1", WKC_F1}, {"F2", WKC_F2}, {"F3", WKC_F3}, @@ -54,11 +59,24 @@ static const KeycodeNames _keycode_to_name[] = { {"F10", WKC_F10}, {"F11", WKC_F11}, {"F12", WKC_F12}, + {"BACKQUOTE", WKC_BACKQUOTE}, {"PAUSE", WKC_PAUSE}, - {"COMMA", WKC_COMMA}, - {"NUM_PLUS", WKC_NUM_PLUS}, + {"NUM_DIV", WKC_NUM_DIV}, + {"NUM_MUL", WKC_NUM_MUL}, {"NUM_MINUS", WKC_NUM_MINUS}, + {"NUM_PLUS", WKC_NUM_PLUS}, + {"NUM_ENTER", WKC_NUM_ENTER}, + {"NUM_DOT", WKC_NUM_DECIMAL}, + {"/", WKC_SLASH}, + {";", WKC_SEMICOLON}, {"=", WKC_EQUALS}, + {"[", WKC_L_BRACKET}, + {"\\", WKC_BACKSLASH}, + {"]", WKC_R_BRACKET}, + {"'", WKC_SINGLEQUOTE}, + {",", WKC_COMMA}, + {"COMMA", WKC_COMMA}, // legacy variant, should be below "," + {".", WKC_PERIOD}, {"-", WKC_MINUS}, }; diff --git a/src/industry.h b/src/industry.h index 932104ff45..e82033dd13 100644 --- a/src/industry.h +++ b/src/industry.h @@ -62,6 +62,7 @@ struct Industry : IndustryPool::PoolItem<&_industry_pool> { PartOfSubsidy part_of_subsidy; ///< NOSAVE: is this industry a source/destination of a subsidy? StationList stations_near; ///< NOSAVE: List of nearby stations. + mutable std::string cached_name; ///< NOSAVE: Cache of the resolved name of the industry Owner founder; ///< Founder of the industry Date construction_date; ///< Date of the construction of the industry @@ -157,10 +158,21 @@ struct Industry : IndustryPool::PoolItem<&_industry_pool> { memset(&counts, 0, sizeof(counts)); } + inline const char *GetCachedName() const + { + if (this->cached_name.empty()) this->FillCachedName(); + return this->cached_name.c_str(); + } + +private: + void FillCachedName() const; + protected: static uint16 counts[NUM_INDUSTRYTYPES]; ///< Number of industries per type ingame }; +void ClearAllIndustryCachedNames(); + void PlantRandomFarmField(const Industry *i); void ReleaseDisastersTargetingIndustry(IndustryID); @@ -197,4 +209,12 @@ struct IndustryBuildData { extern IndustryBuildData _industry_builder; + +/** Special values for the industry list window for the data parameter of #InvalidateWindowData. */ +enum IndustryDirectoryInvalidateWindowData { + IDIWD_FORCE_REBUILD, + IDIWD_PRODUCTION_CHANGE, + IDIWD_FORCE_RESORT, +}; + #endif /* INDUSTRY_H */ diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index c6602b0877..dfc43500f9 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -204,7 +204,7 @@ Industry::~Industry() */ void Industry::PostDestructor(size_t index) { - InvalidateWindowData(WC_INDUSTRY_DIRECTORY, 0, 0); + InvalidateWindowData(WC_INDUSTRY_DIRECTORY, 0, IDIWD_FORCE_REBUILD); } @@ -1822,6 +1822,11 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type, break; } CargoID cargo = GetCargoTranslation(GB(res, 0, 8), indspec->grf_prop.grffile); + /* Industries without "unlimited" cargo types support depend on the specific order/slots of cargo types. + * They need to be able to blank out specific slots without aborting the callback sequence, + * and solve this by returning undefined cargo indexes. Skip these. */ + if (cargo == CT_INVALID && !(indspec->behaviour & INDUSTRYBEH_CARGOTYPES_UNLIMITED)) continue; + /* Verify valid cargo */ 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); @@ -1849,6 +1854,9 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type, break; } CargoID cargo = GetCargoTranslation(GB(res, 0, 8), indspec->grf_prop.grffile); + /* Allow older GRFs to skip slots. */ + if (cargo == CT_INVALID && !(indspec->behaviour & INDUSTRYBEH_CARGOTYPES_UNLIMITED)) continue; + /* Verify valid cargo */ 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); @@ -1892,7 +1900,7 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type, if (GetIndustrySpec(i->type)->behaviour & INDUSTRYBEH_PLANT_ON_BUILT) { for (uint j = 0; j != 50; j++) PlantRandomFarmField(i); } - InvalidateWindowData(WC_INDUSTRY_DIRECTORY, 0, 0); + InvalidateWindowData(WC_INDUSTRY_DIRECTORY, 0, IDIWD_FORCE_REBUILD); if (!_generating_world) PopulateStationsNearby(i); } @@ -2311,6 +2319,21 @@ void Industry::RecomputeProductionMultipliers() } } +void Industry::FillCachedName() const +{ + char buf[256]; + int64 args_array[] = { this->index }; + StringParameters tmp_params(args_array); + char *end = GetStringWithArgs(buf, STR_INDUSTRY_NAME, &tmp_params, lastof(buf)); + this->cached_name.assign(buf, end); +} + +void ClearAllIndustryCachedNames() +{ + for (Industry *ind : Industry::Iterate()) { + ind->cached_name.clear(); + } +} /** * Set the #probability and #min_number fields for the industry type \a it for a running game. @@ -2821,7 +2844,7 @@ void IndustryDailyLoop() cur_company.Restore(); /* production-change */ - InvalidateWindowData(WC_INDUSTRY_DIRECTORY, 0, 1); + InvalidateWindowData(WC_INDUSTRY_DIRECTORY, 0, IDIWD_PRODUCTION_CHANGE); } void IndustryMonthlyLoop() @@ -2843,7 +2866,7 @@ void IndustryMonthlyLoop() cur_company.Restore(); /* production-change */ - InvalidateWindowData(WC_INDUSTRY_DIRECTORY, 0, 1); + InvalidateWindowData(WC_INDUSTRY_DIRECTORY, 0, IDIWD_PRODUCTION_CHANGE); } diff --git a/src/industry_gui.cpp b/src/industry_gui.cpp index 2461061ccd..a5f03a2b94 100644 --- a/src/industry_gui.cpp +++ b/src/industry_gui.cpp @@ -1167,6 +1167,8 @@ static const NWidgetPart _nested_industry_directory_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_TEXTBTN, COLOUR_BROWN, WID_ID_DROPDOWN_ORDER), SetDataTip(STR_BUTTON_SORT_BY, STR_TOOLTIP_SORT_ORDER), NWidget(WWT_DROPDOWN, COLOUR_BROWN, WID_ID_DROPDOWN_CRITERIA), SetDataTip(STR_JUST_STRING, STR_TOOLTIP_SORT_CRITERIA), + NWidget(WWT_DROPDOWN, COLOUR_BROWN, WID_ID_FILTER_BY_ACC_CARGO), SetMinimalSize(225, 12), SetFill(0, 1), SetDataTip(STR_INDUSTRY_DIRECTORY_ACCEPTED_CARGO_FILTER, STR_TOOLTIP_FILTER_CRITERIA), + NWidget(WWT_DROPDOWN, COLOUR_BROWN, WID_ID_FILTER_BY_PROD_CARGO), SetMinimalSize(225, 12), SetFill(0, 1), SetDataTip(STR_INDUSTRY_DIRECTORY_PRODUCED_CARGO_FILTER, STR_TOOLTIP_FILTER_CRITERIA), NWidget(WWT_PANEL, COLOUR_BROWN), SetResize(1, 0), EndContainer(), EndContainer(), NWidget(WWT_PANEL, COLOUR_BROWN, WID_ID_INDUSTRY_LIST), SetDataTip(0x0, STR_INDUSTRY_DIRECTORY_LIST_CAPTION), SetResize(1, 1), SetScrollbar(WID_ID_SCROLLBAR), EndContainer(), @@ -1178,7 +1180,68 @@ static const NWidgetPart _nested_industry_directory_widgets[] = { EndContainer(), }; -typedef GUIList GUIIndustryList; +typedef GUIList &> GUIIndustryList; + +/** Special cargo filter criteria */ +enum CargoFilterSpecialType { + CF_ANY = CT_NO_REFIT, ///< Show all industries (i.e. no filtering) + CF_NONE = CT_INVALID, ///< Show only industries which do not produce/accept cargo +}; + +/** Cargo filter functions */ +/** + * Check whether an industry accepts and produces a certain cargo pair. + * @param industry The industry whose cargoes will being checked. + * @param cargoes The accepted and produced cargo pair to look for. + * @return bool Whether the given cargoes accepted and produced by the industry. + */ +static bool CDECL CargoFilter(const Industry * const *industry, const std::pair &cargoes) +{ + auto accepted_cargo = cargoes.first; + auto produced_cargo = cargoes.second; + + bool accepted_cargo_matches; + + switch (accepted_cargo) { + case CF_ANY: + accepted_cargo_matches = true; + break; + + case CF_NONE: + accepted_cargo_matches = std::all_of(std::begin((*industry)->accepts_cargo), std::end((*industry)->accepts_cargo), [](CargoID cargo) { + return cargo == CT_INVALID; + }); + break; + + default: + const auto &ac = (*industry)->accepts_cargo; + accepted_cargo_matches = std::find(std::begin(ac), std::end(ac), accepted_cargo) != std::end(ac); + break; + } + + bool produced_cargo_matches; + + switch (produced_cargo) { + case CF_ANY: + produced_cargo_matches = true; + break; + + case CF_NONE: + produced_cargo_matches = std::all_of(std::begin((*industry)->produced_cargo), std::end((*industry)->produced_cargo), [](CargoID cargo) { + return cargo == CT_INVALID; + }); + break; + + default: + const auto &pc = (*industry)->produced_cargo; + produced_cargo_matches = std::find(std::begin(pc), std::end(pc), produced_cargo) != std::end(pc); + break; + } + + return accepted_cargo_matches && produced_cargo_matches; +} + +static GUIIndustryList::FilterFunction * const _filter_funcs[] = { &CargoFilter }; /** @@ -1188,7 +1251,6 @@ class IndustryDirectoryWindow : public Window { protected: /* Runtime saved values */ static Listing last_sorting; - static const Industry *last_industry; /* Constants for sorting stations */ static const StringID sorter_names[]; @@ -1197,6 +1259,82 @@ protected: GUIIndustryList industries; Scrollbar *vscroll; + CargoID cargo_filter[NUM_CARGO + 2]; ///< Available cargo filters; CargoID or CF_ANY or CF_NONE + StringID cargo_filter_texts[NUM_CARGO + 3]; ///< Texts for filter_cargo, terminated by INVALID_STRING_ID + CargoID produced_cargo_filter_criteria; ///< Selected produced cargo filter + CargoID accepted_cargo_filter_criteria; ///< Selected accepted cargo filter + + /** + * Set cargo filter list item index. + * @param index The index of the cargo to be set + */ + void SetProducedCargoFilterIndex(int index) + { + if (this->produced_cargo_filter_criteria != index) { + this->produced_cargo_filter_criteria = index; + /* deactivate filter if criteria is 'Show All', activate it otherwise */ + bool is_filtering_necessary = this->cargo_filter[this->produced_cargo_filter_criteria] != CF_ANY || this->cargo_filter[this->accepted_cargo_filter_criteria] != CF_ANY; + + this->industries.SetFilterState(is_filtering_necessary); + this->industries.SetFilterType(0); + this->industries.ForceRebuild(); + } + } + + /** + * Set cargo filter list item index. + * @param index The index of the cargo to be set + */ + void SetAcceptedCargoFilterIndex(int index) + { + if (this->accepted_cargo_filter_criteria != index) { + this->accepted_cargo_filter_criteria = index; + /* deactivate filter if criteria is 'Show All', activate it otherwise */ + bool is_filtering_necessary = this->cargo_filter[this->produced_cargo_filter_criteria] != CF_ANY || this->cargo_filter[this->accepted_cargo_filter_criteria] != CF_ANY; + + this->industries.SetFilterState(is_filtering_necessary); + this->industries.SetFilterType(0); + this->industries.ForceRebuild(); + } + } + + /** + * Populate the filter list and set the cargo filter criteria. + */ + void SetCargoFilterArray() + { + uint filter_items = 0; + + /* Add item for disabling filtering. */ + this->cargo_filter[filter_items] = CF_ANY; + this->cargo_filter_texts[filter_items] = STR_INDUSTRY_DIRECTORY_FILTER_ALL_TYPES; + this->produced_cargo_filter_criteria = filter_items; + this->accepted_cargo_filter_criteria = filter_items; + filter_items++; + + /* Add item for industries not producing anything, e.g. power plants */ + this->cargo_filter[filter_items] = CF_NONE; + this->cargo_filter_texts[filter_items] = STR_INDUSTRY_DIRECTORY_FILTER_NONE; + filter_items++; + + /* Collect available cargo types for filtering. */ + const CargoSpec *cs; + FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) { + this->cargo_filter[filter_items] = cs->Index(); + this->cargo_filter_texts[filter_items] = cs->name; + filter_items++; + } + + /* Terminate the filter list. */ + this->cargo_filter_texts[filter_items] = INVALID_STRING_ID; + + this->industries.SetFilterFuncs(_filter_funcs); + + bool is_filtering_necessary = this->cargo_filter[this->produced_cargo_filter_criteria] != CF_ANY || this->cargo_filter[this->accepted_cargo_filter_criteria] != CF_ANY; + + this->industries.SetFilterState(is_filtering_necessary); + } + /** (Re)Build industries list */ void BuildSortIndustriesList() { @@ -1209,12 +1347,17 @@ protected: this->industries.shrink_to_fit(); this->industries.RebuildDone(); - this->vscroll->SetCount((uint)this->industries.size()); // Update scrollbar as well. } - if (!this->industries.Sort()) return; - IndustryDirectoryWindow::last_industry = nullptr; // Reset name sorter sort cache - this->SetWidgetDirty(WID_ID_INDUSTRY_LIST); // Set the modified widget dirty + auto filter = std::make_pair(this->cargo_filter[this->accepted_cargo_filter_criteria], + this->cargo_filter[this->produced_cargo_filter_criteria]); + + this->industries.Filter(filter); + this->industries.Sort(); + + this->vscroll->SetCount((uint)this->industries.size()); // Update scrollbar as well. + + this->SetDirty(); } /** @@ -1252,19 +1395,9 @@ protected: /** Sort industries by name */ static bool IndustryNameSorter(const Industry * const &a, const Industry * const &b) { - static char buf_cache[96]; - static char buf[96]; - - SetDParam(0, a->index); - GetString(buf, STR_INDUSTRY_NAME, lastof(buf)); - - if (b != last_industry) { - last_industry = b; - SetDParam(0, b->index); - GetString(buf_cache, STR_INDUSTRY_NAME, lastof(buf_cache)); - } - - return strnatcmp(buf, buf_cache) < 0; // Sort by name (natural sorting). + int r = strnatcmp(a->GetCachedName(), b->GetCachedName()); // Sort by name (natural sorting). + if (r == 0) return a->index < b->index; + return r < 0; } /** Sort industries by type and name */ @@ -1329,6 +1462,18 @@ protected: return std::get<3>(a) > std::get<3>(b); }); + /* If the produced cargo filter is active then move the filtered cargo to the beginning of the list, + * because this is the one the player interested in, and that way it is not hidden in the 'n' more cargos */ + const CargoID cid = this->cargo_filter[this->produced_cargo_filter_criteria]; + if (cid != CF_ANY && cid != CF_NONE) { + auto filtered_ci = std::find_if(cargos.begin(), cargos.end(), [cid](const CargoInfo& ci) -> bool { + return std::get<0>(ci) == cid; + }); + if (filtered_ci != cargos.end()) { + std::rotate(cargos.begin(), filtered_ci, filtered_ci + 1); + } + } + /* Display first 3 cargos */ for (size_t j = 0; j < min(3, cargos.size()); j++) { CargoInfo ci = cargos[j]; @@ -1371,9 +1516,26 @@ public: this->last_sorting = this->industries.GetListing(); } + void OnInit() override + { + this->SetCargoFilterArray(); + } + void SetStringParameters(int widget) const override { - if (widget == WID_ID_DROPDOWN_CRITERIA) SetDParam(0, IndustryDirectoryWindow::sorter_names[this->industries.SortType()]); + switch (widget) { + case WID_ID_DROPDOWN_CRITERIA: + SetDParam(0, IndustryDirectoryWindow::sorter_names[this->industries.SortType()]); + break; + + case WID_ID_FILTER_BY_ACC_CARGO: + SetDParam(0, this->cargo_filter_texts[this->accepted_cargo_filter_criteria]); + break; + + case WID_ID_FILTER_BY_PROD_CARGO: + SetDParam(0, this->cargo_filter_texts[this->produced_cargo_filter_criteria]); + break; + } } void DrawWidget(const Rect &r, int widget) const override @@ -1390,8 +1552,17 @@ public: DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_INDUSTRY_DIRECTORY_NONE); break; } + TextColour tc; + const CargoID acf_cid = this->cargo_filter[this->accepted_cargo_filter_criteria]; for (uint i = this->vscroll->GetPosition(); i < this->industries.size(); i++) { - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, this->GetIndustryString(this->industries[i])); + tc = TC_FROMSTRING; + if (acf_cid != CF_ANY && acf_cid != CF_NONE) { + Industry *ind = const_cast(this->industries[i]); + if (IndustryTemporarilyRefusesCargo(ind, acf_cid)) { + tc = TC_GREY | TC_FORCED; + } + } + DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, this->GetIndustryString(this->industries[i]), tc); y += this->resize.step_height; if (++n == this->vscroll->GetCapacity()) break; // max number of industries in 1 window @@ -1451,6 +1622,14 @@ public: ShowDropDownMenu(this, IndustryDirectoryWindow::sorter_names, this->industries.SortType(), WID_ID_DROPDOWN_CRITERIA, 0, 0); break; + case WID_ID_FILTER_BY_ACC_CARGO: // Cargo filter dropdown + ShowDropDownMenu(this, this->cargo_filter_texts, this->accepted_cargo_filter_criteria, WID_ID_FILTER_BY_ACC_CARGO, 0, 0); + break; + + case WID_ID_FILTER_BY_PROD_CARGO: // Cargo filter dropdown + ShowDropDownMenu(this, this->cargo_filter_texts, this->produced_cargo_filter_criteria, WID_ID_FILTER_BY_PROD_CARGO, 0, 0); + break; + case WID_ID_INDUSTRY_LIST: { uint p = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_ID_INDUSTRY_LIST, WD_FRAMERECT_TOP); if (p < this->industries.size()) { @@ -1467,9 +1646,26 @@ public: void OnDropdownSelect(int widget, int index) override { - if (this->industries.SortType() != index) { - this->industries.SetSortType(index); - this->BuildSortIndustriesList(); + switch (widget) { + case WID_ID_DROPDOWN_CRITERIA: { + if (this->industries.SortType() != index) { + this->industries.SetSortType(index); + this->BuildSortIndustriesList(); + } + break; + } + + case WID_ID_FILTER_BY_ACC_CARGO: { + this->SetAcceptedCargoFilterIndex(index); + this->BuildSortIndustriesList(); + break; + } + + case WID_ID_FILTER_BY_PROD_CARGO: { + this->SetProducedCargoFilterIndex(index); + this->BuildSortIndustriesList(); + break; + } } } @@ -1497,17 +1693,24 @@ public: */ void OnInvalidateData(int data = 0, bool gui_scope = true) override { - if (data == 0) { - /* This needs to be done in command-scope to enforce rebuilding before resorting invalid data */ - this->industries.ForceRebuild(); - } else { - this->industries.ForceResort(); + switch (data) { + case IDIWD_FORCE_REBUILD: + /* This needs to be done in command-scope to enforce rebuilding before resorting invalid data */ + this->industries.ForceRebuild(); + break; + + case IDIWD_PRODUCTION_CHANGE: + if (this->industries.SortType() == 2) this->industries.ForceResort(); + break; + + default: + this->industries.ForceResort(); + break; } } }; Listing IndustryDirectoryWindow::last_sorting = {false, 0}; -const Industry *IndustryDirectoryWindow::last_industry = nullptr; /* Available station sorting functions. */ GUIIndustryList::SortFunction * const IndustryDirectoryWindow::sorter_funcs[] = { diff --git a/src/lang/afrikaans.txt b/src/lang/afrikaans.txt index bf30bdc8ad..2d7202a86e 100644 --- a/src/lang/afrikaans.txt +++ b/src/lang/afrikaans.txt @@ -471,9 +471,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Skakel terminaal STR_ABOUT_MENU_AI_DEBUG :AI/Spel skript ontfout STR_ABOUT_MENU_SCREENSHOT :Skermskoot -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Ten volle vergrote skermskoot -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Basiese groote skermskoot -STR_ABOUT_MENU_GIANT_SCREENSHOT :Hele kaart Skermkiekie (Ctrl+G) STR_ABOUT_MENU_ABOUT_OPENTTD :Oor 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :"Sprite" rigter STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :skakel beperkte bokse @@ -643,9 +640,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Op Bestelling 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Musiek Volume STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Effek Volume -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAKS -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}------ @@ -4001,6 +3995,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Kies bel STR_AI_LIST_CANCEL :{BLACK}Kanseleer STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Moenie skrif verander nie + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameters STR_AI_SETTINGS_CAPTION_AI :AI diff --git a/src/lang/arabic_egypt.txt b/src/lang/arabic_egypt.txt index b49778ae1b..6fa5fcbd16 100644 --- a/src/lang/arabic_egypt.txt +++ b/src/lang/arabic_egypt.txt @@ -446,9 +446,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :توقل كونسول STR_ABOUT_MENU_AI_DEBUG :مكتشف اخطاء الذكاء الصناعي STR_ABOUT_MENU_SCREENSHOT :صورة من الشاشة - Ctrl-S - -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :صورة للشاشة مصغرة -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :تقريب الشاشة القياسي -STR_ABOUT_MENU_GIANT_SCREENSHOT :صورة كبيرة لكامل الخريطة -Ctrl-G - STR_ABOUT_MENU_ABOUT_OPENTTD :حول 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :موائم العفريتات STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :اضهار /اخفاء مربح الحوارات/الخيارات @@ -617,9 +614,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}معدل2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}مستوى الصوت STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}مؤثرات الصوت -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}منخفض -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}مرتفع -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}----- @@ -3487,6 +3481,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK} اخت STR_AI_LIST_CANCEL :{BLACK} الغاء STR_AI_LIST_CANCEL_TOOLTIP :{BLACK} لا تغير الذكاء الصناعي + # AI Parameters STR_AI_SETTINGS_CLOSE :{BLACK} اغلاق STR_AI_SETTINGS_RESET :{BLACK} اعادة ضبط diff --git a/src/lang/basque.txt b/src/lang/basque.txt index 4f817e8052..401b7b9b42 100644 --- a/src/lang/basque.txt +++ b/src/lang/basque.txt @@ -464,9 +464,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Konsola aktibatu STR_ABOUT_MENU_AI_DEBUG :IA/Joko script-aren garbitzailea STR_ABOUT_MENU_SCREENSHOT :Pantailan dagoenaren argazkia hartu (Ctrl+S) -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Pantailan dagoenaren argazkia hartu zoom-a guztiz erabiliz -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :zoom lehenetsikoarekin pantaila-argazkia -STR_ABOUT_MENU_GIANT_SCREENSHOT :Mapa osoaren argazkia hartu (Ctrl+G) STR_ABOUT_MENU_ABOUT_OPENTTD :'OpenTTD'-ri buruz STR_ABOUT_MENU_SPRITE_ALIGNER :"Sprit" lerrokatzailea STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Kaxen neurriak aldatu @@ -636,9 +633,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Pertsonalizatua 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Musikaren Bolumena STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Efektuen Bolumena -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAX -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}------ @@ -3876,6 +3870,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Piztutak STR_AI_LIST_CANCEL :{BLACK}Ezeztatu STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Ez aldatu script-a + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametroak STR_AI_SETTINGS_CAPTION_AI :IA diff --git a/src/lang/belarusian.txt b/src/lang/belarusian.txt index 8293e9f999..3fc0d42ab6 100644 --- a/src/lang/belarusian.txt +++ b/src/lang/belarusian.txt @@ -783,9 +783,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Кансоль STR_ABOUT_MENU_AI_DEBUG :Наладка штучнага інтэлекту (ШІ/AI) / скрыптоў STR_ABOUT_MENU_SCREENSHOT :Здымак экрана (Ctrl+S) -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Здымак экрана ў макс. набліжэньні -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Павялiчаны здымак экрана па змоўчаньнi -STR_ABOUT_MENU_GIANT_SCREENSHOT :Здымак усёй мапы (Ctrl+G) STR_ABOUT_MENU_ABOUT_OPENTTD :Аб гульні OpenTTD STR_ABOUT_MENU_SPRITE_ALIGNER :Выраўноўваньне спрайтаў STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Пераключыць абмежавальныя рамкі @@ -955,9 +952,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Уласны 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Гучнасьць музыкі STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Гучнасьць эфэктаў -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}МІН -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}МАКС -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}------ @@ -4385,6 +4379,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Выбр STR_AI_LIST_CANCEL :{BLACK}Скасаваць STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Не змяняць скрыпт + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}Параметры {STRING} STR_AI_SETTINGS_CAPTION_AI :ШI diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index 9ab5e03feb..bdd3e7b75e 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -471,9 +471,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Alternar console STR_ABOUT_MENU_AI_DEBUG :Depurar IA/Script do jogo 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" @@ -644,9 +641,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Personalizado 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Volume da Música STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Volume dos Efeitos -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAX -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}------ @@ -4075,6 +4069,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Selecion STR_AI_LIST_CANCEL :{BLACK}Cancelar STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Não mudar o script + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parâmetros STR_AI_SETTINGS_CAPTION_AI :{G=f}IA diff --git a/src/lang/bulgarian.txt b/src/lang/bulgarian.txt index ed3ef49fee..32c8b13402 100644 --- a/src/lang/bulgarian.txt +++ b/src/lang/bulgarian.txt @@ -471,9 +471,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Показване/скриване на конзола STR_ABOUT_MENU_AI_DEBUG :ИИ дебъг STR_ABOUT_MENU_SCREENSHOT :Screenshot -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Напълно увеличен в кадъра. -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Увеличение по подразбиране -STR_ABOUT_MENU_GIANT_SCREENSHOT :Огромен Screenshot STR_ABOUT_MENU_SHOW_FRAMERATE :Показване на честотата на кадрите STR_ABOUT_MENU_ABOUT_OPENTTD :Относно 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Подравнител на спрайтове @@ -644,9 +641,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Персонален 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Сила на музиката STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Сила на ефектите -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAX -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}------ @@ -3978,6 +3972,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Избе STR_AI_LIST_CANCEL :{BLACK}Отмени STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Не променяй AI + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Параметри STR_AI_SETTINGS_CAPTION_AI :AI diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index fb3346e0ea..dac7abf0f0 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -474,9 +474,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Commuta la consola STR_ABOUT_MENU_AI_DEBUG :Depuració de les IA i l'script de partida STR_ABOUT_MENU_SCREENSHOT :Captura de pantalla -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Captura de pantalla amb el zoom màxim -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Captura de pantalla amb el zoom predeterminat -STR_ABOUT_MENU_GIANT_SCREENSHOT :Captura de pantalla de tot el mapa STR_ABOUT_MENU_SHOW_FRAMERATE :Mostra els fotogrames per segon STR_ABOUT_MENU_ABOUT_OPENTTD :Quant a l'OpenTTD STR_ABOUT_MENU_SPRITE_ALIGNER :Alineador de sprites @@ -647,9 +644,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Personalitzat 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Volum de la música STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Volum dels efectes -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}------ @@ -4120,6 +4114,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Seleccio STR_AI_LIST_CANCEL :{BLACK}Cancel·la STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}No canviïs l'script. + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}Paràmetres {STRING} STR_AI_SETTINGS_CAPTION_AI :de la IA diff --git a/src/lang/croatian.txt b/src/lang/croatian.txt index 3e099abba1..a39f33ce9b 100644 --- a/src/lang/croatian.txt +++ b/src/lang/croatian.txt @@ -574,9 +574,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Otvori konzolu STR_ABOUT_MENU_AI_DEBUG :Debugiranje UI-ja/Skripte igre STR_ABOUT_MENU_SCREENSHOT :Slika zaslona -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Zumirano do kraja na slici zaslona -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Standardno zumiranje slike zaslona -STR_ABOUT_MENU_GIANT_SCREENSHOT :Slika zaslona cijele karte STR_ABOUT_MENU_SHOW_FRAMERATE :Prikaži broj sličica u sekundi STR_ABOUT_MENU_ABOUT_OPENTTD :O 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Poravnanje spritea @@ -747,9 +744,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Proizvoljno 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Glasnoća glazbe STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Glasnoća zvukova -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAX -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}------ @@ -4270,6 +4264,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Odaberi STR_AI_LIST_CANCEL :{BLACK}Odustani STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Nemoj mijenjati skriptu + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametri STR_AI_SETTINGS_CAPTION_AI :UI diff --git a/src/lang/czech.txt b/src/lang/czech.txt index b42c0a84aa..4386ae1016 100644 --- a/src/lang/czech.txt +++ b/src/lang/czech.txt @@ -553,9 +553,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Zobrazit nebo skrýt konzoli STR_ABOUT_MENU_AI_DEBUG :Ladění AI / herních skriptů 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ů @@ -738,9 +735,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Volba 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Hlasitost hudby STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Hlasitost efektů -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAX -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}------ @@ -1401,6 +1395,8 @@ STR_CONFIG_SETTING_POPULATION_IN_LABEL :Zobrazovat popu STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Zobrazovat městskou populaci u názvu města na mapě STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Tloušťky čar v grafech: {STRING} STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Tloušťka čáry v grafech. Tenká čára se čte přesněji, silnější je lépe viditelná a barva je snadněji rozpoznatelná. +STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :Zobrazovat název NewGRF v okně nákupu vozidel: {STRING} +STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Přidá řádek do okna nákupu vozidel informující, ze které NewGRF vybrané vozidlo pochází. STR_CONFIG_SETTING_LANDSCAPE :Klima: {STRING} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Klima určuje základy herního scénáře s rozdílnými druhy nákladu a požadavky na růst měst. Nové GRaFiky a Herní Skripty umožní ještě jemnější kontrolu @@ -1638,6 +1634,10 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Plná STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Barevné noviny se objeví v roce: {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Rok od kterého budou novinová oznámeni zobrazena v barvách. Před tímto rokem jsou černobílá. STR_CONFIG_SETTING_STARTING_YEAR :Počáteční datum: {STRING} +STR_CONFIG_SETTING_ENDING_YEAR :Rok vyhodnocení: {STRING} +STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Rok, kdy je ve hře uzavřeno hodnocení společností. Na konci tohoto roku je zaznamenáno skóre společností a je zobrazena tabulka nejlepších společností, ale ve hře je možné pokračovat i dál.{}Pokud je nastaven rok před rokem počátku hry, tabulka s hodnocením nebude zobrazena nikdy. +STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} +STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Nikdy STR_CONFIG_SETTING_SMOOTH_ECONOMY :Plynulé změny ekonomiky (více menších změn): {STRING} STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Pokud je zapnuto, produkce průmyslu se mění častěji ale změny jsou menší. Toto nastavení většinou nemá vliv na průmysl, který je přidaný novou grafikou STR_CONFIG_SETTING_ALLOW_SHARES :Povolit kupování podílu z ostatních společností: {STRING} @@ -3484,8 +3484,17 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL :{WHITE}{CURRENC # Industry directory STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Průmysl STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- Nic - +STR_INDUSTRY_DIRECTORY_ITEM_INFO :{BLACK}{CARGO_LONG}{STRING}{YELLOW} ({COMMA}% přepraveno){BLACK} STR_INDUSTRY_DIRECTORY_ITEM_NOPROD :{ORANGE}{INDUSTRY} +STR_INDUSTRY_DIRECTORY_ITEM_PROD1 :{ORANGE}{INDUSTRY} {STRING} +STR_INDUSTRY_DIRECTORY_ITEM_PROD2 :{ORANGE}{INDUSTRY} {STRING}, {STRING} +STR_INDUSTRY_DIRECTORY_ITEM_PROD3 :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} +STR_INDUSTRY_DIRECTORY_ITEM_PRODMORE :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} a {NUM} další... STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Název průmyslu - pohled na něj zaměříš kliknutím na jeho jméno. Při stisknutém Ctrl otevřeš nový pohled +STR_INDUSTRY_DIRECTORY_ACCEPTED_CARGO_FILTER :{BLACK}Přijímá náklad: {SILVER}{STRING} +STR_INDUSTRY_DIRECTORY_PRODUCED_CARGO_FILTER :{BLACK}Produkuje náklad: {SILVER}{STRING} +STR_INDUSTRY_DIRECTORY_FILTER_ALL_TYPES :Všechny druhy nákladu +STR_INDUSTRY_DIRECTORY_FILTER_NONE :Žádný # Industry view STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTRY} @@ -4263,6 +4272,14 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Vybrat o STR_AI_LIST_CANCEL :{BLACK}Zrušit STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Neměňte skript +STR_SCREENSHOT_CAPTION :{WHITE}Pořídit snímek obrazovky +STR_SCREENSHOT_SCREENSHOT :{BLACK}Běžný snímek obrazovky +STR_SCREENSHOT_ZOOMIN_SCREENSHOT :{BLACK}Snímek obrazovky v úplném přiblížení +STR_SCREENSHOT_DEFAULTZOOM_SCREENSHOT :{BLACK}Snímek obrazovky ve výchozím přiblížení +STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Snímek celé mapy +STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Snímek výškové mapy +STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Snímek (náhledové) mapy světa + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametry STR_AI_SETTINGS_CAPTION_AI :AI diff --git a/src/lang/danish.txt b/src/lang/danish.txt index 4256899e4f..2fc165c2c8 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -235,6 +235,8 @@ STR_TOOLTIP_FILTER_CRITERIA :{BLACK}Vælg fi STR_BUTTON_SORT_BY :{BLACK}Sortér på STR_BUTTON_LOCATION :{BLACK}Lokalitet STR_BUTTON_RENAME :{BLACK}Omdøb +STR_BUTTON_CATCHMENT :{BLACK}Dækning +STR_TOOLTIP_CATCHMENT :{BLACK}Aktiver visning af dækningsområde STR_TOOLTIP_CLOSE_WINDOW :{BLACK}Luk vindue STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS :{BLACK}Vinduestitel - træk her for at flytte vinduet @@ -263,6 +265,7 @@ STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}Ved at a STR_BUTTON_DEFAULT :{BLACK}Standard STR_BUTTON_CANCEL :{BLACK}Annuller STR_BUTTON_OK :{BLACK}OK +STR_WARNING_PASSWORD_SECURITY :{YELLOW}Advarsel: Server administratoren kan være i stand til at læse al tekst skrevet her. # On screen keyboard window STR_OSK_KEYBOARD_LAYOUT :`1234567890-=\qwertyuiop[]asdfghjkl;' zxcvbnm,./ . @@ -336,6 +339,7 @@ STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}Zoom ind STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}Zoom ud STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Byg jernbanespor STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}Byg veje +STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}Byg sporveje STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}Byg havne STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}Byg lufthavne STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}Åbn landskabsværktøjslinjen for at hæve/sænke terræn, plante træer, osv. @@ -474,9 +478,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Tænd/Sluk konsol STR_ABOUT_MENU_AI_DEBUG :Computerspiller/spilscript debug STR_ABOUT_MENU_SCREENSHOT :Skærmbillede (Ctrl-S) -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Fuldt zoomet skærmbillede -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Standard zoom skærmbillede -STR_ABOUT_MENU_GIANT_SCREENSHOT :Kæmpe skærmbillede (Ctrl-G) STR_ABOUT_MENU_SHOW_FRAMERATE :Vis spilhastighed STR_ABOUT_MENU_ABOUT_OPENTTD :Om 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Spritejustering @@ -647,9 +648,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Custom 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Musik lydstyrke STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Effekt lydstyrke -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAKS -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}------ @@ -859,13 +857,14 @@ STR_NEWS_VEHICLE_IS_LOST :{WHITE}{VEHICLE STR_NEWS_VEHICLE_IS_UNPROFITABLE :{WHITE}{VEHICLE}s indtjening sidste år var {CURRENCY_LONG} STR_NEWS_AIRCRAFT_DEST_TOO_FAR :{WHITE}{VEHICLE} kan ikke nå til næste destination, da den er uden for rækkevidde -STR_NEWS_ORDER_REFIT_FAILED :{WHITE}{VEHICLE} stoppet fordi en ombygnings ordre fejlede +STR_NEWS_ORDER_REFIT_FAILED :{WHITE}{VEHICLE} stoppet fordi en tilpasningsordre fejlede STR_NEWS_VEHICLE_AUTORENEW_FAILED :{WHITE}Automatisk fornyelse mislykkedes for {VEHICLE}{}{STRING} STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE :{BIG_FONT}{BLACK}Ny {STRING} er nu tilgængelig! STR_NEWS_NEW_VEHICLE_TYPE :{BIG_FONT}{BLACK}{ENGINE} STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE :{BLACK}Ny {STRING} er nu tilgængelig! - {ENGINE} +STR_NEWS_SHOW_VEHICLE_GROUP_TOOLTIP :{BLACK}Åbn gruppevinduet med fokus på dette fartøjs gruppe STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO :{WHITE}{STATION} accepterer ikke længere {STRING} STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO_OR_CARGO :{WHITE}{STATION} accepterer ikke længere {STRING} eller {STRING} @@ -933,6 +932,9 @@ STR_GAME_OPTIONS_CURRENCY_GEL :Georgiske Lari STR_GAME_OPTIONS_CURRENCY_IRR :Iranske Rialer (IRR) STR_GAME_OPTIONS_CURRENCY_RUB :Ny Russisk Rubel (RUB) STR_GAME_OPTIONS_CURRENCY_MXN :Meksikansk Peso (MXN) +STR_GAME_OPTIONS_CURRENCY_NTD :Ny Taiwan dollar (NTD) +STR_GAME_OPTIONS_CURRENCY_CNY :Kinesisk Renminbi (CNY) +STR_GAME_OPTIONS_CURRENCY_HKD :Hong Kong Dollar (HKD) ############ end of currency region STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Vejkøretøjer @@ -1307,6 +1309,8 @@ STR_CONFIG_SETTING_POPULATION_IN_LABEL :Vis byens indby STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Vis befolkningen i byerne i deres etiket på kortet STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Linjetykkelse i grafer: {STRING} STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Bredde af linjerne i graferne. En tynd linie er mere læsbar, en tykkere linje er nemmere at se og det er lettere at skelne mellem farverne +STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :Vis navn på NewGRF i byg fartøj vinduet: {STRING} +STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Tilføjer en linje til byg fartøj vinduet som viser, hvilken NewGRF det valgte fartøj stammer fra. STR_CONFIG_SETTING_LANDSCAPE :Landskab: {STRING} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Landskaber definerer grundlæggende gameplay-scenarier med forskellige laster og krav by vækst. NewGRF og spil Scripts tillader finere kontrol selv @@ -1318,8 +1322,8 @@ STR_CONFIG_SETTING_TERRAIN_TYPE :Terræn type: { STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(TerraGenesis only) Hilliness af landskabet STR_CONFIG_SETTING_INDUSTRY_DENSITY :Industri tæthed: {STRING} STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Angiv hvor mange industrier skal genereres og hvilket niveau der bevares i løbet af spillet -STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Max afstand fra kant til olieraffinaderier: {STRING} -STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Olieraffinaderier er kun opføres nær kortets grænse, det er ved kysten for kort med øer +STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Maksimal afstand fra kant til olieindustrier: {STRING} +STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Grænse for hvor langt fra kortets kant olieraffinaderier kan blive bygget. På ø-kort sikrer dette at de er nær kysten. På kort større end 256 felter bliver denne værdi automatisk skaleret op. STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Snelinjehøjden: {STRING} STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Kontrol med på hvilket højde sneen begynder i sub-arktiske landskab. Sne påvirker også industrien generation og betingelser by vækst STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Tærrenets hårdhed (kun TerraGenesis) : {STRING} @@ -1483,6 +1487,9 @@ STR_CONFIG_SETTING_AI_IN_MULTIPLAYER :Tillad computer STR_CONFIG_SETTING_AI_IN_MULTIPLAYER_HELPTEXT :Tillad computerstyrede spillere at deltage i multiplayer spil STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES :#opcodes før scriptet bliver stoppet: {STRING} STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES_HELPTEXT :Maximale nummer af udregninger et script kan eksekvere i en tur +STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY :Maks hukommelsesforbrug per script: {STRING} +STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_HELPTEXT :Hvor meget hukommelse et enkelt script må anvende før det bliver tvungent afbrudt. Det kan være nødvendigt at forøge dette for spil på store kort. +STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_VALUE :{COMMA} MiB STR_CONFIG_SETTING_SERVINT_ISPERCENT :Service intervaller er i procent: {STRING} STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :Vælg om vedligeholdelse bliver udløst af forløbet tid, eller pålideligheden som falder en givet procenttal i forhold til maximum pålideligheden @@ -1541,10 +1548,16 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Fuld STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Farvede nyheder dukker op i: {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Året hvor nyheds-annonceringer bliver udskrevet i farver. Før dette år, bruger det sort / hvid STR_CONFIG_SETTING_STARTING_YEAR :Start dato: {STRING} +STR_CONFIG_SETTING_ENDING_YEAR :Slutår for pointoptælling: {STRING} +STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Årstal hvor spillet slutter pointoptælling. Ved slutningen af dette år bliver selskabets point optaget, og topresultater-skærmen bliver vist. Spillerne kan fortsætte med at spille efter dette.{}Hvis dette er før spillets start år, bliver topresultater-skærmen aldrig vist. +STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} +STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Aldrig STR_CONFIG_SETTING_SMOOTH_ECONOMY :Aktiver rolig økonomi (flere små ændringer): {STRING} STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Når slået til, ændre industriproduktion oftere, og i små trin. Denne indstilling har normalt ingen effekt, hvis industrityper er fastsat af NewGRF STR_CONFIG_SETTING_ALLOW_SHARES :Tillad at købe aktier i andre selskaber: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Hvis aktiveret, tillades køb og salg af selskabsaktier. Aktier vil kun være tilgængelige for selskaber der er nået en hvis alder +STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Mindste selskabsalder for aktiehandel: {STRING} +STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES_HELPTEXT :Indstil mindste alder på selskaber, før andre kan købe og sælge aktier i dem. STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Procentdel af deloverskud som skal betales i hovedsystemer: {STRING} STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :Procentdel af indkomst givet til de mellemliggende dele i hovedsystemer, giver mere kontrol over indkomst STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :Når der trækkes, placer signaler hvert: {STRING} @@ -2431,7 +2444,10 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Byg en t STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Byg en sporvejstunnel. Shift skifter mellem at bygge og vise prisoverslag. STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}Skift mellem bygning/fjernelse af veje STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Skift mellem bygning/fjernelse af sporveje +STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD :{BLACK}Konverter/opgrader typen af vej. Shift skifter mellem at bygge og vise prisoverslag +STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM :{BLACK}Konverter/opgrader typen af sporvej. Shift skifter mellem at bygge og vise prisoverslag +STR_ROAD_NAME_ROAD :Vej STR_ROAD_NAME_TRAM :Sporvej # Road depot construction window @@ -2617,8 +2633,11 @@ STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: 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_ROAD_TYPE :{BLACK}Vejtype: {LTBLUE}{STRING} +STR_LANG_AREA_INFORMATION_TRAM_TYPE :{BLACK}Sporvejstype: {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} +STR_LANG_AREA_INFORMATION_TRAM_SPEED_LIMIT :{BLACK}Sporvogn hastighedsgrænse: {LTBLUE}{VELOCITY} # Description of land area of different tiles STR_LAI_CLEAR_DESCRIPTION_ROCKS :Klipper @@ -2728,6 +2747,7 @@ STR_FRAMERATE_SPEED_FACTOR :{BLACK}Aktuel s STR_FRAMERATE_SPEED_FACTOR_TOOLTIP :{BLACK}Hvor hurtigt spillet aktuelt kører, i forhold til det forventede ved normal simulationshastighed. STR_FRAMERATE_CURRENT :{WHITE}Aktuel STR_FRAMERATE_AVERAGE :{WHITE}Gennemsnit +STR_FRAMERATE_MEMORYUSE :{WHITE}Hukommelse STR_FRAMERATE_DATA_POINTS :{BLACK}Data baseret på {COMMA} målinger STR_FRAMERATE_MS_GOOD :{LTBLUE}{DECIMAL} ms STR_FRAMERATE_MS_WARN :{YELLOW}{DECIMAL} ms @@ -2735,6 +2755,9 @@ STR_FRAMERATE_MS_BAD :{RED}{DECIMAL} STR_FRAMERATE_FPS_GOOD :{LTBLUE}{DECIMAL} billeder/s STR_FRAMERATE_FPS_WARN :{YELLOW}{DECIMAL} billeder/s STR_FRAMERATE_FPS_BAD :{RED}{DECIMAL} billeder/s +STR_FRAMERATE_BYTES_GOOD :{LTBLUE}{BYTES} +STR_FRAMERATE_BYTES_WARN :{YELLOW}{BYTES} +STR_FRAMERATE_BYTES_BAD :{RED}{BYTES} STR_FRAMERATE_GRAPH_MILLISECONDS :{TINY_FONT}{COMMA} ms STR_FRAMERATE_GRAPH_SECONDS :{TINY_FONT}{COMMA} s ############ Leave those lines in this order!! @@ -3031,7 +3054,7 @@ STR_NEWGRF_BROKEN_CAPACITY :{WHITE}Det ænd STR_BROKEN_VEHICLE_LENGTH :{WHITE}Toget '{VEHICLE}' fra selskabet '{COMPANY}' har ugyldig længde. Det skyldes sandsynligvis at problem med en NewGRF. Risiko for at spillet mister synkronisering eller går ned. STR_NEWGRF_BUGGY :{WHITE}NewGRF '{0:STRING}' indeholder forkert information -STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Fragt-/ombygningsinformation for '{1:ENGINE}' afviger fra indkøbslisten efter konstruktion. Dette kan medføre, at autofornyelse ikke fungerer korrekt. +STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Fragt-/tilpasningsinformation for '{1:ENGINE}' afviger fra indkøbslisten efter konstruktion. Dette kan medføre, at autofornyelse ikke fungerer korrekt. STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' forårsagede en uendelig løkke i produktions-callback'en. STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT :{WHITE}Callback {1:HEX} returnerede ukendt/ugyldigt resultat {2:HEX} STR_NEWGRF_BUGGY_INVALID_CARGO_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' returnerede ugyldig godstype i produktion-callback ved {2:HEX} @@ -3101,6 +3124,8 @@ STR_TOWN_VIEW_RENAME_TOWN_BUTTON :Omdøb byen # Town local authority window STR_LOCAL_AUTHORITY_CAPTION :{WHITE}{TOWN} lokal myndighed +STR_LOCAL_AUTHORITY_ZONE :{BLACK}Zone +STR_LOCAL_AUTHORITY_ZONE_TOOLTIP :{BLACK}Vis zone og grænse for den lokale myndighed STR_LOCAL_AUTHORITY_COMPANY_RATINGS :{BLACK}Transportselskabsbedømmelse: STR_LOCAL_AUTHORITY_COMPANY_RATING :{YELLOW}{COMPANY} {COMPANY_NUM}: {ORANGE}{STRING} STR_LOCAL_AUTHORITY_ACTIONS_TITLE :{BLACK}Handlinger til rådighed: @@ -3358,6 +3383,7 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infrastr STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Spor-stykker: STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Signaler STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Vej-stykker: +STR_COMPANY_INFRASTRUCTURE_VIEW_TRAM_SECT :{GOLD}Sporvejsdele: STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Vand-felter: STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanaler STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stationer: @@ -3368,8 +3394,17 @@ 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_INFO :{BLACK}{CARGO_LONG}{STRING}{YELLOW} ({COMMA}% transporteret){BLACK} STR_INDUSTRY_DIRECTORY_ITEM_NOPROD :{ORANGE}{INDUSTRY} +STR_INDUSTRY_DIRECTORY_ITEM_PROD1 :{ORANGE}{INDUSTRY} {STRING} +STR_INDUSTRY_DIRECTORY_ITEM_PROD2 :{ORANGE}{INDUSTRY} {STRING}, {STRING} +STR_INDUSTRY_DIRECTORY_ITEM_PROD3 :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} +STR_INDUSTRY_DIRECTORY_ITEM_PRODMORE :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} og {NUM} flere... STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Industrinavne - klik på navn for at centrere visningen over en industri. Ctrl+Klik åbner et nyt vindue ved industriens lokalitet. +STR_INDUSTRY_DIRECTORY_ACCEPTED_CARGO_FILTER :{BLACK}Accepteret last: {SILVER}{STRING} +STR_INDUSTRY_DIRECTORY_PRODUCED_CARGO_FILTER :{BLACK}Produceret last: {SILVER}{STRING} +STR_INDUSTRY_DIRECTORY_FILTER_ALL_TYPES :Alle lasttyper +STR_INDUSTRY_DIRECTORY_FILTER_NONE :Ingen # Industry view STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTRY} @@ -3435,6 +3470,7 @@ STR_GROUP_DEFAULT_ROAD_VEHICLES :Ikke-grupperede STR_GROUP_DEFAULT_SHIPS :Ikke-grupperede skibe STR_GROUP_DEFAULT_AIRCRAFTS :Ikke-grupperede fly +STR_GROUP_COUNT_WITH_SUBGROUP :{TINY_FONT}{COMMA} (+{COMMA}) STR_GROUPS_CLICK_ON_GROUP_FOR_TOOLTIP :{BLACK}Grupper - klik på en gruppe for at vise alle køretøjer i gruppen STR_GROUP_CREATE_TOOLTIP :{BLACK}Klik for at oprette en gruppe @@ -3463,29 +3499,34 @@ STR_BUY_VEHICLE_TRAIN_MONORAIL_CAPTION :Nye monorailkø STR_BUY_VEHICLE_TRAIN_MAGLEV_CAPTION :Nye magnetskinnekøretøjer STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :Nye køretøjer +STR_BUY_VEHICLE_TRAM_VEHICLE_CAPTION :Nye sporvogne ############ range for vehicle availability starts STR_BUY_VEHICLE_TRAIN_ALL_CAPTION :Jernbanekøretøjer +STR_BUY_VEHICLE_ROAD_VEHICLE_ALL_CAPTION :Nye vejkøretøjer STR_BUY_VEHICLE_SHIP_CAPTION :Nye skibe STR_BUY_VEHICLE_AIRCRAFT_CAPTION :Nyt fly ############ range for vehicle availability ends STR_PURCHASE_INFO_COST_WEIGHT :{BLACK}Pris: {GOLD}{CURRENCY_LONG}{BLACK} Vægt: {GOLD}{WEIGHT_SHORT} +STR_PURCHASE_INFO_COST_REFIT_WEIGHT :{BLACK}Pris: {GOLD}{CURRENCY_LONG}{BLACK} (Pris for tilpasning: {GOLD}{CURRENCY_LONG}{BLACK}) Vægt: {GOLD}{WEIGHT_SHORT} STR_PURCHASE_INFO_SPEED_POWER :{BLACK}Hastighed: {GOLD}{VELOCITY}{BLACK} Styrke: {GOLD}{POWER} STR_PURCHASE_INFO_SPEED :{BLACK}Hastighed: {GOLD}{VELOCITY} STR_PURCHASE_INFO_SPEED_OCEAN :{BLACK}Hastighed på havet: {GOLD}{VELOCITY} STR_PURCHASE_INFO_SPEED_CANAL :{BLACK}Hastighed på kanal/flod: {GOLD}{VELOCITY} STR_PURCHASE_INFO_RUNNINGCOST :{BLACK}Driftsomkostninger: {GOLD}{CURRENCY_LONG}/år STR_PURCHASE_INFO_CAPACITY :{BLACK}Lasteevne: {GOLD}{CARGO_LONG} {STRING} -STR_PURCHASE_INFO_REFITTABLE :(kan ombygges) +STR_PURCHASE_INFO_REFITTABLE :(kan tilpasses) STR_PURCHASE_INFO_DESIGNED_LIFE :{BLACK}Designet: {GOLD}{NUM}{BLACK} Levetid: {GOLD}{COMMA} år STR_PURCHASE_INFO_RELIABILITY :{BLACK}Maks. pålidelighed: {GOLD}{COMMA}% STR_PURCHASE_INFO_COST :{BLACK}Pris: {GOLD}{CURRENCY_LONG} +STR_PURCHASE_INFO_COST_REFIT :{BLACK}Pris: {GOLD}{CURRENCY_LONG}{BLACK} (Pris for tilpasning: {GOLD}{CURRENCY_LONG}{BLACK}) STR_PURCHASE_INFO_WEIGHT_CWEIGHT :{BLACK}Vægt: {GOLD}{WEIGHT_SHORT} ({WEIGHT_SHORT}) STR_PURCHASE_INFO_COST_SPEED :{BLACK}Pris: {GOLD}{CURRENCY_LONG}{BLACK} Hastighed: {GOLD}{VELOCITY} +STR_PURCHASE_INFO_COST_REFIT_SPEED :{BLACK}Pris: {GOLD}{CURRENCY_LONG}{BLACK} (Pris for tilpasning: {GOLD}{CURRENCY_LONG}{BLACK}) Hastighed: {GOLD}{VELOCITY} STR_PURCHASE_INFO_AIRCRAFT_CAPACITY :{BLACK}Kapacitet: {GOLD}{CARGO_LONG}, {CARGO_LONG} STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT :{BLACK}Motoriserede Vogne: {GOLD}+{POWER}{BLACK} Vægt: {GOLD}+{WEIGHT_SHORT} -STR_PURCHASE_INFO_REFITTABLE_TO :{BLACK}Kan ombygges til: {GOLD}{STRING} +STR_PURCHASE_INFO_REFITTABLE_TO :{BLACK}Kan tilpasses til: {GOLD}{STRING} STR_PURCHASE_INFO_ALL_TYPES :Alle lasttyper STR_PURCHASE_INFO_NONE :Ingen STR_PURCHASE_INFO_ALL_BUT :Alle undtagen {CARGO_LIST} @@ -3503,12 +3544,20 @@ STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_BUTTON :{BLACK}Køb kø STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_BUTTON :{BLACK}Køb skib STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_BUTTON :{BLACK}Køb et fly +STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Køb og tilpas køretøj +STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Køb og tilpas køretøj +STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Køb og tilpas skib +STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Køb og tilpas fly STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Køb det markerede lokomotiv/togvogn. Shift skifter mellem at købe og vise prisoverslag. STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Køb det markerede køretøj. Shift skifter mellem at købe og vise prisoverslag. STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Køb det markerede skib. Shift skifter mellem at købe og vise prisoverslag. STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Køb det markerede fly. Shift skifter mellem at købe og vise prisoverslag. +STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Køb og tilpas det markerede lokomotiv/togvogn. Shift+klik viser prisoverslag uden at købe +STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Køb og tilpas det markerede vejkøretøj. Shift+klik viser prisoverslag uden at købe +STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Køb og tilpas det markerede skib. Shift+klik viser prisoverslag uden at købe. +STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Køb og tilpas det markerede fly. Shift+klik viser prisoverslag uden at købe. STR_BUY_VEHICLE_TRAIN_RENAME_BUTTON :{BLACK}Omdøb STR_BUY_VEHICLE_ROAD_VEHICLE_RENAME_BUTTON :{BLACK}Omdøb @@ -3620,10 +3669,12 @@ STR_ENGINE_PREVIEW_CAPTION :{WHITE}Besked f STR_ENGINE_PREVIEW_MESSAGE :{GOLD}Vi har lige designet et nyt {STRING} - er du interesseret i et års ekslusiv testkørsel, så vi kan se hvordan det klarer sig inden vi gør det frit tilgængeligt? STR_ENGINE_PREVIEW_RAILROAD_LOCOMOTIVE :jernbanelokomotiv +STR_ENGINE_PREVIEW_ELRAIL_LOCOMOTIVE :elektrisk jernbanelokomotiv STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :monoraillokomotiv STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :magnettog STR_ENGINE_PREVIEW_ROAD_VEHICLE :vejkøretøj +STR_ENGINE_PREVIEW_TRAM_VEHICLE :sporvogn STR_ENGINE_PREVIEW_AIRCRAFT :fly STR_ENGINE_PREVIEW_SHIP :skib @@ -3665,14 +3716,18 @@ STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Skift im STR_REPLACE_ENGINES :Lokomotiver STR_REPLACE_WAGONS :Vogne STR_REPLACE_ALL_RAILTYPE :Alle jernbanevogne +STR_REPLACE_ALL_ROADTYPE :Alle vejkøretøjer STR_REPLACE_HELP_RAILTYPE :{BLACK}Vælg den skinne type, du ønsker at udskifte lokomotiver til +STR_REPLACE_HELP_ROADTYPE :{BLACK}Vælg vejtypen du ønsker at udskifte køretøjer for 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 STR_REPLACE_RAIL_VEHICLES :Jernbane STR_REPLACE_ELRAIL_VEHICLES :Eltog STR_REPLACE_MONORAIL_VEHICLES :Monorail STR_REPLACE_MAGLEV_VEHICLES :Magnetskinnetog +STR_REPLACE_ROAD_VEHICLES :Vejkøretøjer +STR_REPLACE_TRAM_VEHICLES :Sporvogne STR_REPLACE_REMOVE_WAGON :{BLACK}Fjern vogn: {ORANGE}{STRING} STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Få autoudskift til at bevare længden af tog ved at fjerne vogne (startende fra fronten), hvis autoudskiftningen gør toget længere. @@ -3697,10 +3752,10 @@ STR_VEHICLE_VIEW_CLONE_AIRCRAFT_INFO :{BLACK}Dette vi STR_VEHICLE_VIEW_TRAIN_IGNORE_SIGNAL_TOOLTIP :{BLACK}Tving toget til at fortsætte uden at vente på at signalet skifter til grønt -STR_VEHICLE_VIEW_TRAIN_REFIT_TOOLTIP :{BLACK}Ombyg toget til at køre med en anden lasttype -STR_VEHICLE_VIEW_ROAD_VEHICLE_REFIT_TOOLTIP :{BLACK}Ombyg vejkøretøj til at laste en anden type last -STR_VEHICLE_VIEW_SHIP_REFIT_TOOLTIP :{BLACK}Ombyg skibet til at sejle med en anden slags last -STR_VEHICLE_VIEW_AIRCRAFT_REFIT_TOOLTIP :{BLACK}Ombyg flyet til at flyve med en anden slags last +STR_VEHICLE_VIEW_TRAIN_REFIT_TOOLTIP :{BLACK}Tilpas toget til at køre med en anden lasttype +STR_VEHICLE_VIEW_ROAD_VEHICLE_REFIT_TOOLTIP :{BLACK}Tilpas vejkøretøj til at køre med en anden lasttype +STR_VEHICLE_VIEW_SHIP_REFIT_TOOLTIP :{BLACK}Tilpas skibet til at sejle med en anden lasttype +STR_VEHICLE_VIEW_AIRCRAFT_REFIT_TOOLTIP :{BLACK}Tilpas flyet til at flyve med en anden lasttype STR_VEHICLE_VIEW_TRAIN_REVERSE_TOOLTIP :{BLACK}Vend retningen af toget STR_VEHICLE_VIEW_ROAD_VEHICLE_REVERSE_TOOLTIP :{BLACK}Tving køretøjet til at vende @@ -3813,28 +3868,28 @@ STR_VEHICLE_DETAILS_TRAIN_TOTAL_CARGO_TOOLTIP :{BLACK}Vis tota STR_VEHICLE_DETAILS_TRAIN_ARTICULATED_RV_CAPACITY :{BLACK}Kapacitet: {LTBLUE} # Vehicle refit -STR_REFIT_CAPTION :{WHITE}{VEHICLE} (Ombyg) +STR_REFIT_CAPTION :{WHITE}{VEHICLE} (tilpas) STR_REFIT_TITLE :{GOLD}Vælg den lasttype der skal transporteres: -STR_REFIT_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Ny kapacitet: {GOLD}{CARGO_LONG}{}{BLACK}Pris for ombyggelse: {RED}{CURRENCY_LONG} -STR_REFIT_NEW_CAPACITY_INCOME_FROM_REFIT :{BLACK}Ny kapacitet: {GOLD}{CARGO_LONG}{}{BLACK}Indtægt fra ombygning: {GREEN}{CURRENCY_LONG} -STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}Nye kapacitet: {GOLD}{CARGO_LONG},{GOLD}{CARGO_LONG}{}{BLACK}Pris for at ombygge: {RED}{CURRENCY_LONG} -STR_REFIT_NEW_CAPACITY_INCOME_FROM_AIRCRAFT_REFIT :{BLACK}Ny kapacitet: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Indtægt fra ombygning: {GREEN}{CURRENCY_LONG} -STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Vælg køretøjer der skal ombygges. klik og træk med musen for at vælge flere køretøjer. Klik på et tomt felt for at vælge hele køretøjet. Ctrl + klik vælger et køretøj og den efterfølgende kæde +STR_REFIT_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Ny kapacitet: {GOLD}{CARGO_LONG}{}{BLACK}Pris for tilpasning: {RED}{CURRENCY_LONG} +STR_REFIT_NEW_CAPACITY_INCOME_FROM_REFIT :{BLACK}Ny kapacitet: {GOLD}{CARGO_LONG}{}{BLACK}Indtægt fra tilpasning: {GREEN}{CURRENCY_LONG} +STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}Ny kapacitet: {GOLD}{CARGO_LONG},{GOLD}{CARGO_LONG}{}{BLACK}Pris for tilpasning: {RED}{CURRENCY_LONG} +STR_REFIT_NEW_CAPACITY_INCOME_FROM_AIRCRAFT_REFIT :{BLACK}Ny kapacitet: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Indtægt fra tilpasning: {GREEN}{CURRENCY_LONG} +STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Vælg køretøjer der skal tilpasses. Klik og træk med musen for at vælge flere køretøjer. Klik på et tomt felt for at vælge hele køretøjet. Ctrl+klik vælger et køretøj og den efterfølgende kæde STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Vælg den lasttype toget skal kører med STR_REFIT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Vælg lasttype som lastbilen skal transportere STR_REFIT_SHIP_LIST_TOOLTIP :{BLACK}Vælg den slags last skibet skal sejle med STR_REFIT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Vælg den type last flyet skal flyve med -STR_REFIT_TRAIN_REFIT_BUTTON :{BLACK}Ombyg toget -STR_REFIT_ROAD_VEHICLE_REFIT_BUTTON :{BLACK}Ombyg lastbil -STR_REFIT_SHIP_REFIT_BUTTON :{BLACK}Ombyg skibet -STR_REFIT_AIRCRAFT_REFIT_BUTTON :{BLACK}Ombyg fly +STR_REFIT_TRAIN_REFIT_BUTTON :{BLACK}Tilpas tog +STR_REFIT_ROAD_VEHICLE_REFIT_BUTTON :{BLACK}Tilpas vejkøretøj +STR_REFIT_SHIP_REFIT_BUTTON :{BLACK}Tilpas skibet +STR_REFIT_AIRCRAFT_REFIT_BUTTON :{BLACK}Tilpas fly -STR_REFIT_TRAIN_REFIT_TOOLTIP :{BLACK}Ombyg toget til at køre med den markerede lasttype -STR_REFIT_ROAD_VEHICLE_REFIT_TOOLTIP :{BLACK}Ombyg vejkøretøjet til at laste den markerede type last -STR_REFIT_SHIP_REFIT_TOOLTIP :{BLACK}Ombyg skibet til den markerede slags last -STR_REFIT_AIRCRAFT_REFIT_TOOLTIP :{BLACK}Ombyg flyet til at flyve med den markerede slags last +STR_REFIT_TRAIN_REFIT_TOOLTIP :{BLACK}Tilpas tog til at køre med den markerede lasttype +STR_REFIT_ROAD_VEHICLE_REFIT_TOOLTIP :{BLACK}Tilpas vejkøretøjet til at køre med den markerede lasttype +STR_REFIT_SHIP_REFIT_TOOLTIP :{BLACK}Tilpas skibet til den markerede lasttype +STR_REFIT_AIRCRAFT_REFIT_TOOLTIP :{BLACK}Tilpas flyet til at flyve med den markerede lasttype # Order view STR_ORDERS_CAPTION :{WHITE}{VEHICLE} (Ordrer) @@ -3870,8 +3925,8 @@ STR_ORDER_DROP_TRANSFER :Overfør STR_ORDER_DROP_NO_UNLOADING :Ingen losning STR_ORDER_TOOLTIP_UNLOAD :{BLACK}Ændr losseregel for den valgte ordre -STR_ORDER_REFIT :{BLACK}Ombyg -STR_ORDER_REFIT_TOOLTIP :{BLACK}Vælg hvilken lasttype, der skal ombygges til i denne ordre. CTRL-klik for at fjerne ombygningsinstruktion +STR_ORDER_REFIT :{BLACK}Tilpas +STR_ORDER_REFIT_TOOLTIP :{BLACK}Vælg hvilken lasttype, der skal tilpasses til i denne ordre. Ctrl+klik for at fjerne tilpasningsinstruktion STR_ORDER_REFIT_AUTO :{BLACK}Auto-tilpas STR_ORDER_REFIT_AUTO_TOOLTIP :{BLACK}Vælg typen af last der skal auto-tilpasses denne ordre. Ctrl+Click for at fjerne auto-tilpas-funktionen. Auto-tilpasning vil kun kunne gøres, hvis køretøjet tillader det STR_ORDER_DROP_REFIT_AUTO :Bestemt last @@ -3941,8 +3996,8 @@ STR_ORDER_SHIP_DEPOT :Skibsdok STR_ORDER_GO_TO_NEAREST_DEPOT_FORMAT :{STRING} {STRING} {STRING} STR_ORDER_GO_TO_DEPOT_FORMAT :{STRING} {DEPOT} -STR_ORDER_REFIT_ORDER :(Ombyg til {STRING}) -STR_ORDER_REFIT_STOP_ORDER :(Ombyg til {STRING} og stop) +STR_ORDER_REFIT_ORDER :(Tilpas til {STRING}) +STR_ORDER_REFIT_STOP_ORDER :(Tilpas til {STRING} og stop) STR_ORDER_STOP_ORDER :(Stop) STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING} @@ -4124,6 +4179,14 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Vælg ma STR_AI_LIST_CANCEL :{BLACK}Afbryd STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Skift ikke script'et +STR_SCREENSHOT_CAPTION :{WHITE}Tag skærmbillede +STR_SCREENSHOT_SCREENSHOT :{BLACK}Normalt skærmbillede +STR_SCREENSHOT_ZOOMIN_SCREENSHOT :{BLACK}Fuldt zoomet-ind skærmbillede +STR_SCREENSHOT_DEFAULTZOOM_SCREENSHOT :{BLACK}Standard zoom skærmbillede +STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Fuldt kort skærmbillede +STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Højdekort skærmbillede +STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Minikort skærmbillede + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametre STR_AI_SETTINGS_CAPTION_AI :AI @@ -4392,10 +4455,11 @@ STR_ERROR_AUTOREPLACE_MONEY_LIMIT :(ikke penge nok # Rail construction errors STR_ERROR_IMPOSSIBLE_TRACK_COMBINATION :{WHITE}Umulig sporkombination STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Det er nødvendigt at fjerne signalet først -STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Ingen brugbar jernbane +STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Ingen egnet jernbane STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Det er nødvendigt at fjerne jernbaneskinnerne først STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Vejen er ensrettet eller blokeret STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Niveaukrydsning ikke tilladt for denne type skinner +STR_ERROR_CROSSING_DISALLOWED_ROAD :{WHITE}Niveaukrydsning ikke tilladt for denne type vej STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Kan ikke bygge signaler her... STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Kan ikke bygge jernbane her... STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Kan ikke fjerne jernbane herfra... @@ -4415,6 +4479,12 @@ STR_ERROR_CAN_T_REMOVE_ROAD_FROM :{WHITE}Kan ikke STR_ERROR_CAN_T_REMOVE_TRAMWAY_FROM :{WHITE}Kan ikke fjerne sporvej her... STR_ERROR_THERE_IS_NO_ROAD :{WHITE}... der er ingen vej STR_ERROR_THERE_IS_NO_TRAMWAY :{WHITE}... der er ikke noget spor +STR_ERROR_CAN_T_CONVERT_ROAD :{WHITE}Kan ikke konvertere vejtype her... +STR_ERROR_CAN_T_CONVERT_TRAMWAY :{WHITE}Kan ikke konvertere sporvejstype her... +STR_ERROR_NO_SUITABLE_ROAD :{WHITE}Ingen passende vej +STR_ERROR_NO_SUITABLE_TRAMWAY :{WHITE}Ingen egnet sporvej +STR_ERROR_INCOMPATIBLE_ROAD :{WHITE}... inkompatibel vej +STR_ERROR_INCOMPATIBLE_TRAMWAY :{WHITE}... inkompatibel sporvej # Waterway construction errors STR_ERROR_CAN_T_BUILD_CANALS :{WHITE}Kan ikke bygge en kanal her... @@ -4467,6 +4537,7 @@ STR_ERROR_GROUP_CAN_T_CREATE :{WHITE}Kan ikke STR_ERROR_GROUP_CAN_T_DELETE :{WHITE}Kan ikke slette denne gruppe... STR_ERROR_GROUP_CAN_T_RENAME :{WHITE}Kan ikke omdøbe gruppe... STR_ERROR_GROUP_CAN_T_SET_PARENT :{WHITE}Kan ikke sætte overordnede gruppe ... +STR_ERROR_GROUP_CAN_T_SET_PARENT_RECURSION :{WHITE}... løkker i gruppe-hierarkiet er ikke tilladt STR_ERROR_GROUP_CAN_T_REMOVE_ALL_VEHICLES :{WHITE}Kan ikke fjerne alle køretøjer fra denne gruppe... STR_ERROR_GROUP_CAN_T_ADD_VEHICLE :{WHITE}Kan ikke tilføje køretøjet til denne gruppe... STR_ERROR_GROUP_CAN_T_ADD_SHARED_VEHICLE :{WHITE}Kan ikke tilføje delte køretøjer til gruppe... @@ -4477,10 +4548,10 @@ STR_ERROR_ROAD_VEHICLE_IN_THE_WAY :{WHITE}Køretø STR_ERROR_SHIP_IN_THE_WAY :{WHITE}Der er et skib i vejen STR_ERROR_AIRCRAFT_IN_THE_WAY :{WHITE}Fly i vejen -STR_ERROR_CAN_T_REFIT_TRAIN :{WHITE}Kan ikke ombygge toget... -STR_ERROR_CAN_T_REFIT_ROAD_VEHICLE :{WHITE}Kan ikke ombygge vejkøretøj -STR_ERROR_CAN_T_REFIT_SHIP :{WHITE}Kan ikke ombygge skib... -STR_ERROR_CAN_T_REFIT_AIRCRAFT :{WHITE}Kan ikke ombygge fly... +STR_ERROR_CAN_T_REFIT_TRAIN :{WHITE}Kan ikke tilpasse tog... +STR_ERROR_CAN_T_REFIT_ROAD_VEHICLE :{WHITE}Kan ikke tilpasse vejkøretøj +STR_ERROR_CAN_T_REFIT_SHIP :{WHITE}Kan ikke tilpasse skib... +STR_ERROR_CAN_T_REFIT_AIRCRAFT :{WHITE}Kan ikke tilpasse fly... STR_ERROR_CAN_T_RENAME_TRAIN :{WHITE}Kan ikke give toget navn... STR_ERROR_CAN_T_RENAME_ROAD_VEHICLE :{WHITE}Kan ikke give køretøjet et navn... diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index d42501a8ce..67273ad3ce 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -478,9 +478,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Console in-uitschakelen STR_ABOUT_MENU_AI_DEBUG :Probleemoplossing AI/spelscript STR_ABOUT_MENU_SCREENSHOT :Schermfoto -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Ingezoomde schermfoto -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Schermfoto met standaardzoom -STR_ABOUT_MENU_GIANT_SCREENSHOT :Schermfoto van de hele kaart STR_ABOUT_MENU_SHOW_FRAMERATE :Framesnelheid weergeven STR_ABOUT_MENU_ABOUT_OPENTTD :Over 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Sprite-uitlijner @@ -651,9 +648,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Aangepast 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Muziekvolume STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Effectenvolume -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAX -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}------ @@ -870,6 +864,7 @@ STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE :{BIG_FONT}{BLAC STR_NEWS_NEW_VEHICLE_TYPE :{BIG_FONT}{BLACK}{ENGINE} STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE :{BLACK}Nieuw {STRING} nu beschikbaar! - {ENGINE} +STR_NEWS_SHOW_VEHICLE_GROUP_TOOLTIP :{BLACK}Groepsvenster openen met focus op groep van voertuig STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO :{WHITE}{STATION} accepteert geen {STRING} meer STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO_OR_CARGO :{WHITE}{STATION} accepteert geen {STRING} of {STRING} meer @@ -1314,6 +1309,8 @@ STR_CONFIG_SETTING_POPULATION_IN_LABEL :Inwoneraantal b STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Aantal inwoners van een stad weergeven bij naam 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 makkelijker om te onderscheiden +STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :Naam van NewGRF weergeven in venster voor voertuigen bouwen: {STRING} +STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Voeg een regel toe aan het venster voor voertuigen bouwen die aangeeft uit welke NewGRF het geselecteerde voertuig komt. STR_CONFIG_SETTING_LANDSCAPE :Landschap: {STRING} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Landschappen definiëren standaard spelscenario's met verschillende vracht- en stadsgroei-eisen. NewGRF en spelscripts kunnen daarentegen fijnere controle bieden. @@ -1551,6 +1548,10 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Volledig STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Kleurenfoto's verschijnen in: {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Jaar dat de krant aankondigt in kleur te gaan afdrukken. Voor dit jaar wordt zwart-wit gebruikt STR_CONFIG_SETTING_STARTING_YEAR :Startjaar: {STRING} +STR_CONFIG_SETTING_ENDING_YEAR :Eindjaar voor score: {STRING} +STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Jaar dat het spel eindigt ten behoeve van de score. Aan het einde van dit jaar wordt de score van het bedrijf vastgelegd en verschijnt het venster met topscores. De spelers kunnen echter doorgaan met spelen.{}Als dit voor het startjaar ligt, verschijnt het venster met topscores niet. +STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} +STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Nooit STR_CONFIG_SETTING_SMOOTH_ECONOMY :Vloeiende economie inschakelen (meer, kleinere veranderingen): {STRING} STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Wanneer dit is ingeschakeld, verandert de productie van industrieën vaker en in kleinere stappen. Deze instelling heeft meestal geen effect als de industriesoorten worden geleverd door een NewGRF. STR_CONFIG_SETTING_ALLOW_SHARES :Kopen van aandelen in andere bedrijven toestaan: {STRING} @@ -3400,6 +3401,10 @@ STR_INDUSTRY_DIRECTORY_ITEM_PROD2 :{ORANGE}{INDUST STR_INDUSTRY_DIRECTORY_ITEM_PROD3 :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} STR_INDUSTRY_DIRECTORY_ITEM_PRODMORE :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} en {NUM} meer... STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Industrienamen - klik op een naam om het scherm te centreren op de industrie. Ctrl+klik opent een nieuw venster op de locatie van de industrie. +STR_INDUSTRY_DIRECTORY_ACCEPTED_CARGO_FILTER :{BLACK}Geaccepteerde vracht: {SILVER}{STRING} +STR_INDUSTRY_DIRECTORY_PRODUCED_CARGO_FILTER :{BLACK}Geproduceerde vracht: {SILVER}{STRING} +STR_INDUSTRY_DIRECTORY_FILTER_ALL_TYPES :Alle soorten vracht +STR_INDUSTRY_DIRECTORY_FILTER_NONE :Geen # Industry view STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTRY} @@ -4174,6 +4179,14 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Gemarkee STR_AI_LIST_CANCEL :{BLACK}Annuleren STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Script niet wijzigen +STR_SCREENSHOT_CAPTION :{WHITE}Een schermafbeelding maken +STR_SCREENSHOT_SCREENSHOT :{BLACK}Normale schermafbeelding +STR_SCREENSHOT_ZOOMIN_SCREENSHOT :{BLACK}Volledig ingezoomde schermafbeelding +STR_SCREENSHOT_DEFAULTZOOM_SCREENSHOT :{BLACK}Standaard gezoomde schermafbeelding +STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Schermafbeelding van de hele kaart +STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Schermafbeelding van de hoogtekaart +STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Schermafbeelding van de minikaart + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameters STR_AI_SETTINGS_CAPTION_AI :AI diff --git a/src/lang/english.txt b/src/lang/english.txt index bc89cfee3d..2a4ab1c280 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -478,9 +478,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Toggle console STR_ABOUT_MENU_AI_DEBUG :AI/Game script debug 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 @@ -651,9 +648,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Custom 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Music Volume STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Effects Volume -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAX -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}------ @@ -1315,6 +1309,8 @@ STR_CONFIG_SETTING_POPULATION_IN_LABEL :Show town popul STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Display the population of towns in their label on the map STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Thickness of lines in graphs: {STRING2} STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Width of the line in the graphs. A thin line is more precisely readable, a thicker line is easier to see and colours are easier to distinguish +STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :Show the NewGRF's name in the build vehicle window: {STRING2} +STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Add a line to the build vehicle window, showing which NewGRF the selected vehicle comes from. STR_CONFIG_SETTING_LANDSCAPE :Landscape: {STRING2} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Landscapes define basic gameplay scenarios with different cargos and town growth requirements. NewGRF and Game Scripts allow finer control though @@ -1552,6 +1548,10 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Full STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Coloured news appears in: {STRING2} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Year that the newspaper announcements get printed in colour. Before this year, it uses monochrome black/white STR_CONFIG_SETTING_STARTING_YEAR :Starting year: {STRING2} +STR_CONFIG_SETTING_ENDING_YEAR :Scoring end year: {STRING2} +STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Year the game ends for scoring purposes. At the end of this year, the company's score is recorded and the high-score screen is displayed, but the players can continue playing after that.{}If this is before the starting year, the high-score screen is never displayed. +STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} +STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Never STR_CONFIG_SETTING_SMOOTH_ECONOMY :Enable smooth economy (more, smaller changes): {STRING2} STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :When enabled, industry production changes more often, and in smaller steps. This setting has usually no effect, if industry types are provided by a NewGRF STR_CONFIG_SETTING_ALLOW_SHARES :Allow buying shares from other companies: {STRING2} @@ -2168,6 +2168,7 @@ STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}Wrong pa STR_NETWORK_ERROR_SERVER_FULL :{WHITE}The server is full STR_NETWORK_ERROR_SERVER_BANNED :{WHITE}You are banned from this server STR_NETWORK_ERROR_KICKED :{WHITE}You were kicked out of the game +STR_NETWORK_ERROR_KICK_MESSAGE :{WHITE}Reason: {RAW_STRING} STR_NETWORK_ERROR_CHEATER :{WHITE}Cheating is not allowed on this server STR_NETWORK_ERROR_TOO_MANY_COMMANDS :{WHITE}You were sending too many commands to the server STR_NETWORK_ERROR_TIMEOUT_PASSWORD :{WHITE}You took too long to enter the password @@ -2227,6 +2228,7 @@ STR_NETWORK_MESSAGE_GIVE_MONEY :*** {RAW_STRING STR_NETWORK_MESSAGE_GAVE_MONEY_AWAY :*** You gave {1:RAW_STRING} {2:CURRENCY_LONG} STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}The server closed the session STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}The server is restarting...{}Please wait... +STR_NETWORK_MESSAGE_KICKED :*** {RAW_STRING} was kicked. Reason: ({RAW_STRING}) # Content downloading window STR_CONTENT_TITLE :{WHITE}Content downloading @@ -3401,6 +3403,10 @@ STR_INDUSTRY_DIRECTORY_ITEM_PROD2 :{ORANGE}{INDUST STR_INDUSTRY_DIRECTORY_ITEM_PROD3 :{ORANGE}{INDUSTRY} {STRING4}, {STRING4}, {STRING4} STR_INDUSTRY_DIRECTORY_ITEM_PRODMORE :{ORANGE}{INDUSTRY} {STRING4}, {STRING4}, {STRING4} and {NUM} more... STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Industry names - click on name to centre main view on industry. Ctrl+Click opens a new viewport on industry location +STR_INDUSTRY_DIRECTORY_ACCEPTED_CARGO_FILTER :{BLACK}Accepted cargo: {SILVER}{STRING} +STR_INDUSTRY_DIRECTORY_PRODUCED_CARGO_FILTER :{BLACK}Produced cargo: {SILVER}{STRING} +STR_INDUSTRY_DIRECTORY_FILTER_ALL_TYPES :All cargo types +STR_INDUSTRY_DIRECTORY_FILTER_NONE :None # Industry view STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTRY} @@ -4175,6 +4181,14 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Select h STR_AI_LIST_CANCEL :{BLACK}Cancel STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Don't change the script +STR_SCREENSHOT_CAPTION :{WHITE}Take a screenshot +STR_SCREENSHOT_SCREENSHOT :{BLACK}Normal screenshot +STR_SCREENSHOT_ZOOMIN_SCREENSHOT :{BLACK}Fully zoomed in screenshot +STR_SCREENSHOT_DEFAULTZOOM_SCREENSHOT :{BLACK}Default zoom screenshot +STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Whole map screenshot +STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Heightmap screenshot +STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Minimap screenshot + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameters STR_AI_SETTINGS_CAPTION_AI :AI diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index 9f7eea532d..55f2259289 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -461,9 +461,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Toggle console STR_ABOUT_MENU_AI_DEBUG :AI/Game script debug STR_ABOUT_MENU_SCREENSHOT :Screenshot -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Zoomed in screenshot -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Default zoom screenshot -STR_ABOUT_MENU_GIANT_SCREENSHOT :Whole map screenshot STR_ABOUT_MENU_ABOUT_OPENTTD :About 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Sprite aligner STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Toggle bounding boxes @@ -633,9 +630,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Custom 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Music Volume STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Effects Volume -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAX -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}------ @@ -3951,6 +3945,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Select h STR_AI_LIST_CANCEL :{BLACK}Cancel STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Don't change the script + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameters STR_AI_SETTINGS_CAPTION_AI :AI diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index 19e94d21c0..f61b66b11c 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -478,9 +478,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Toggle console STR_ABOUT_MENU_AI_DEBUG :AI/Game script debug 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 @@ -651,9 +648,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Custom 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Music Volume STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Effects Volume -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAX -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}------ @@ -870,6 +864,7 @@ STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE :{BIG_FONT}{BLAC STR_NEWS_NEW_VEHICLE_TYPE :{BIG_FONT}{BLACK}{ENGINE} STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE :{BLACK}New {STRING} now available! - {ENGINE} +STR_NEWS_SHOW_VEHICLE_GROUP_TOOLTIP :{BLACK}Open the group window focused on the vehicle's group STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO :{WHITE}{STATION} no longer accepts {STRING} STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO_OR_CARGO :{WHITE}{STATION} no longer accepts {STRING} or {STRING} @@ -1314,6 +1309,7 @@ STR_CONFIG_SETTING_POPULATION_IN_LABEL :Show town popul STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Display the population of towns in their label on the map STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Thickness of lines in graphs: {STRING} STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Width of the line in the graphs. A thin line is more precisely readable, a thicker line is easier to see and colors are easier to distinguish +STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Add a line to the build vehicle window, showing which NewGRF the selected vehicle comes from. STR_CONFIG_SETTING_LANDSCAPE :Landscape: {STRING} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Landscapes define basic gameplay scenarios with different cargos and town growth requirements. NewGRF and Game Scripts allow finer control though @@ -1325,8 +1321,8 @@ STR_CONFIG_SETTING_TERRAIN_TYPE :Terrain type: { STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(TerraGenesis only) Hilliness of the landscape STR_CONFIG_SETTING_INDUSTRY_DENSITY :Industry density: {STRING} STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Set how many industries should be generated and what level should be maintained during the game -STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Maximum distance from edge for Oil refineries: {STRING} -STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Oil refineries are only constructed near the map border, that is at the coast for island maps +STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Maximum distance from edge for Oil industries: {STRING} +STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Limit for how far from the map border oil refineries and oil rigs can be constructed. On island maps this ensures they are near the coast. On maps larger than 256 tiles, this value is scaled up. STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Snow line height: {STRING} STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Control at what height snow starts in sub-arctic landscape. Snow also affects industry generation and town growth requirements STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Roughness of terrain: {STRING} @@ -1551,10 +1547,16 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Full STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Colored news appears in: {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Year that the newspaper announcements get printed in color. Before this year, it uses monochrome black/white STR_CONFIG_SETTING_STARTING_YEAR :Starting year: {STRING} +STR_CONFIG_SETTING_ENDING_YEAR :Scoring end year: {STRING} +STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Year the game ends for scoring purposes. At the end of this year, the company's score is recorded and the high-score screen is displayed, but the players can continue playing after that.{}If this is before the starting year, the high-score screen is never displayed. +STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} +STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Never STR_CONFIG_SETTING_SMOOTH_ECONOMY :Enable smooth economy (more, smaller changes): {STRING} STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :When enabled, industry production changes more often, and in smaller steps. This setting has usually no effect, if industry types are provided by a NewGRF STR_CONFIG_SETTING_ALLOW_SHARES :Allow buying shares from other companies: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :When enabled, allow buying and selling of company shares. Shares will only be available for companies reaching a certain age +STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Minimum company age to trade shares: {STRING} +STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES_HELPTEXT :Set the minimum age of a company for others to be able to buy and sell shares from them. STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Percentage of leg profit to pay in feeder systems: {STRING} STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :Percentage of income given to the intermediate legs in feeder systems, giving more control over the income STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :When dragging, place signals every: {STRING} @@ -3121,6 +3123,8 @@ STR_TOWN_VIEW_RENAME_TOWN_BUTTON :Rename Town # Town local authority window STR_LOCAL_AUTHORITY_CAPTION :{WHITE}{TOWN} local authority +STR_LOCAL_AUTHORITY_ZONE :{BLACK}Zone +STR_LOCAL_AUTHORITY_ZONE_TOOLTIP :{BLACK}Show zone within local authority boundaries STR_LOCAL_AUTHORITY_COMPANY_RATINGS :{BLACK}Transport company ratings: STR_LOCAL_AUTHORITY_COMPANY_RATING :{YELLOW}{COMPANY} {COMPANY_NUM}: {ORANGE}{STRING} STR_LOCAL_AUTHORITY_ACTIONS_TITLE :{BLACK}Actions available: @@ -4165,6 +4169,14 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Select h STR_AI_LIST_CANCEL :{BLACK}Cancel STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Don't change the script +STR_SCREENSHOT_CAPTION :{WHITE}Take a screenshot +STR_SCREENSHOT_SCREENSHOT :{BLACK}Normal screenshot +STR_SCREENSHOT_ZOOMIN_SCREENSHOT :{BLACK}Fully zoomed in screenshot +STR_SCREENSHOT_DEFAULTZOOM_SCREENSHOT :{BLACK}Default zoom screenshot +STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Whole map screenshot +STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Heightmap screenshot +STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Minimap screenshot + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameters STR_AI_SETTINGS_CAPTION_AI :AI diff --git a/src/lang/esperanto.txt b/src/lang/esperanto.txt index 9a415bb124..323af7f6cb 100644 --- a/src/lang/esperanto.txt +++ b/src/lang/esperanto.txt @@ -464,9 +464,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Baskuligi Konzolon STR_ABOUT_MENU_AI_DEBUG :AI/Ludo skripto sencimigo STR_ABOUT_MENU_SCREENSHOT :Ekranfoto -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Pligrandiga ekranfoto -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Ekranfoto defaŭlte zoma -STR_ABOUT_MENU_GIANT_SCREENSHOT :Tuta karto ekranfoto STR_ABOUT_MENU_ABOUT_OPENTTD :Pri 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Bildeto-liniigilo STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Montri/ne montri limigujo @@ -636,9 +633,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Propra 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Muzika Volumeno STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Efekta Volumeno -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAKS -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}------ @@ -3387,6 +3381,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Elekti e STR_AI_LIST_CANCEL :{BLACK}Nuligi STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Ne ŝanĝu AI-on + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametroj STR_AI_SETTINGS_CAPTION_AI :AI diff --git a/src/lang/estonian.txt b/src/lang/estonian.txt index 4580752096..ef21a51e46 100644 --- a/src/lang/estonian.txt +++ b/src/lang/estonian.txt @@ -527,9 +527,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Lülita konsool sisse/välja STR_ABOUT_MENU_AI_DEBUG :Arvutivea otsing STR_ABOUT_MENU_SCREENSHOT :Ekraanitõmmis -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Suurendatud ekraanitõmmis -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Tavasuurendusega ekraanitõmmis -STR_ABOUT_MENU_GIANT_SCREENSHOT :Terve kaardi ekraanitõmmis STR_ABOUT_MENU_SHOW_FRAMERATE :Näita kaadrisagedust STR_ABOUT_MENU_ABOUT_OPENTTD :'OpenTTD' kohta STR_ABOUT_MENU_SPRITE_ALIGNER :Sprite aligner @@ -700,9 +697,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Omatehtud 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Muusika helitugevus STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Efektide helitugevus -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}VÄHIM -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}SUURIM -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}------ @@ -4093,6 +4087,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Vali esi STR_AI_LIST_CANCEL :{BLACK}Loobu STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Ära skripti muuda + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameetrid STR_AI_SETTINGS_CAPTION_AI :Tehismõistus diff --git a/src/lang/faroese.txt b/src/lang/faroese.txt index 813b27eecf..1eead24e4f 100644 --- a/src/lang/faroese.txt +++ b/src/lang/faroese.txt @@ -448,9 +448,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Console opið ella lukka STR_ABOUT_MENU_AI_DEBUG :AI/Spæl script debug STR_ABOUT_MENU_SCREENSHOT :Skermmynd -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Suma in skermmynd -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Vanliga suma skermmynd -STR_ABOUT_MENU_GIANT_SCREENSHOT :Skermmynd av øllum kortinum STR_ABOUT_MENU_SHOW_FRAMERATE :Vís mynda títtleika STR_ABOUT_MENU_ABOUT_OPENTTD :Um 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Sprite aligner @@ -621,9 +618,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Sjálvgjørdur 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Tónleika ljóðstyrki STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Effekt ljóðstyrki -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAX -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}------ @@ -3527,6 +3521,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Vel undi STR_AI_LIST_CANCEL :{BLACK}Angra STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Ikki broyta scripti + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametur STR_AI_SETTINGS_CAPTION_AI :AI diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index aa3d8f9650..f4ae3ba4a9 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -259,7 +259,7 @@ STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT :{BLACK}Näytä STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN_TOOLTIP :{BLACK}Kun otat tämän käyttöön, myös piilotetut junat näytetään STR_SHOW_HIDDEN_ENGINES_VEHICLE_ROAD_VEHICLE_TOOLTIP :{BLACK}Kun otat tämän käyttöön, myös piilotetut ajoneuvot näytetään STR_SHOW_HIDDEN_ENGINES_VEHICLE_SHIP_TOOLTIP :{BLACK}Kun otat tämän käyttöön, myös piilotetut laivat näytetään -STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}Kun otat tämän käyttöön, myös piilotetut lentokoneet näytetään +STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}Kun otat tämän käyttöön, myös piilotetut ilma-alukset näytetään # Query window STR_BUTTON_DEFAULT :{BLACK}Oletus @@ -334,7 +334,7 @@ STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Rahoita STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}Näytä luettelo yhtiön junista. Ctrl+Klik avaa ryhmä/kulkuneuvolistan STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}Näytä luettelo yhtiön ajoneuvoista. Ctrl+Klik avaa ryhmä/kulkuneuvoikkunan STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}Näytä luettelo yhtiön laivoista. Ctrl+Klik avaa ryhmä/kulkuneuvoikkunan -STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}Näytä luettelo yhtiön lentokoneista. Ctrl+Klik avaa ryhmä/kulkuneuvoikkunan +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}Näytä luettelo yhtiön ilma-aluksista. Ctrl+Klik avaa ryhmä/kulkuneuvoikkunan STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}Lähennä näkymää STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}Loitonna näkymää STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Rakenna rautateitä @@ -478,9 +478,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Konsoli STR_ABOUT_MENU_AI_DEBUG :Tekoälyn/peliskriptin virheenjäljitys 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_SHOW_FRAMERATE :Näytä kuvataajuus STR_ABOUT_MENU_ABOUT_OPENTTD :Tietoja OpenTTD:stä STR_ABOUT_MENU_SPRITE_ALIGNER :Sprite-kohdistaja @@ -619,7 +616,7 @@ STR_PERFORMANCE_DETAIL_AMOUNT_INT :{BLACK}({COMMA} STR_PERFORMANCE_DETAIL_PERCENT :{WHITE}{NUM}% STR_PERFORMANCE_DETAIL_SELECT_COMPANY_TOOLTIP :{BLACK}Näytä tietoja tästä yhtiöstä ############ Those following lines need to be in this order!! -STR_PERFORMANCE_DETAIL_VEHICLES :{BLACK}Liikennevälineitä: +STR_PERFORMANCE_DETAIL_VEHICLES :{BLACK}Kulkuneuvot: STR_PERFORMANCE_DETAIL_STATIONS :{BLACK}Asemia: STR_PERFORMANCE_DETAIL_MIN_PROFIT :{BLACK}Vähimmäistuotto: STR_PERFORMANCE_DETAIL_MIN_INCOME :{BLACK}Vähimmäistulo: @@ -630,7 +627,7 @@ STR_PERFORMANCE_DETAIL_MONEY :{BLACK}Raha: STR_PERFORMANCE_DETAIL_LOAN :{BLACK}Laina: STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}Yhteensä: ############ End of order list -STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP :{BLACK}Liikennevälineiden määrä. Tähän kuuluvat ajoneuvot, junat, laivat ja lentokoneet +STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP :{BLACK}Kulkuveuvojen määrä. Tähän kuuluvat ajoneuvot, junat, laivat ja ilma-alukset STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}Asemien osien määrä. Kaikki osat asemista (esim. rautatieasema, bussipysäkki, lentokenttä) lasketaan, vaikka ne olisivat yhdistettynä yhdeksi asemaksi STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP :{BLACK}Vähätuottoisimman kulkuneuvon tulo (kaikkien yli 2 vuotta vanhojen kulkuneuvojen) STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}Viimeisen 12 neljänneksen vähätuottoisimman kuun käteistuoton määrä @@ -651,9 +648,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Oma 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Musiikin voimakkuus STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Äänitehosteiden voimakkuus -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAX -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}------ @@ -709,7 +703,7 @@ STR_HIGHSCORE_PRESIDENT_OF_COMPANY_ACHIEVES_STATUS :{BIG_FONT}{WHIT STR_SMALLMAP_CAPTION :{WHITE}Kartta – {STRING} STR_SMALLMAP_TYPE_CONTOURS :Korkeuserot -STR_SMALLMAP_TYPE_VEHICLES :Liikennevälineet +STR_SMALLMAP_TYPE_VEHICLES :Kulkuneuvot STR_SMALLMAP_TYPE_INDUSTRIES :Teollisuus STR_SMALLMAP_TYPE_ROUTEMAP :Rahtivirta STR_SMALLMAP_TYPE_ROUTES :Reitit @@ -730,11 +724,11 @@ STR_SMALLMAP_LEGENDA_ROADS :{TINY_FONT}{BLA STR_SMALLMAP_LEGENDA_RAILROADS :{TINY_FONT}{BLACK}Rautatiet STR_SMALLMAP_LEGENDA_STATIONS_AIRPORTS_DOCKS :{TINY_FONT}{BLACK}Asemat/lentokentät/satamat STR_SMALLMAP_LEGENDA_BUILDINGS_INDUSTRIES :{TINY_FONT}{BLACK}Rakennukset/Teollisuus -STR_SMALLMAP_LEGENDA_VEHICLES :{TINY_FONT}{BLACK}Liikennevälineet +STR_SMALLMAP_LEGENDA_VEHICLES :{TINY_FONT}{BLACK}Kulkuneuvot STR_SMALLMAP_LEGENDA_TRAINS :{TINY_FONT}{BLACK}Junat STR_SMALLMAP_LEGENDA_ROAD_VEHICLES :{TINY_FONT}{BLACK}Ajoneuvot STR_SMALLMAP_LEGENDA_SHIPS :{TINY_FONT}{BLACK}Laivat -STR_SMALLMAP_LEGENDA_AIRCRAFT :{TINY_FONT}{BLACK}Lentokoneet +STR_SMALLMAP_LEGENDA_AIRCRAFT :{TINY_FONT}{BLACK}Ilma-alukset STR_SMALLMAP_LEGENDA_TRANSPORT_ROUTES :{TINY_FONT}{BLACK}Kuljetusreitit STR_SMALLMAP_LEGENDA_FOREST :{TINY_FONT}{BLACK}Metsä STR_SMALLMAP_LEGENDA_RAILROAD_STATION :{TINY_FONT}{BLACK}Rautatieasema @@ -795,11 +789,11 @@ STR_NEWS_FIRST_CARGO_TRAM_ARRIVAL :{BIG_FONT}{BLAC STR_NEWS_FIRST_SHIP_ARRIVAL :{BIG_FONT}{BLACK}Asukkaat juhlivat . . .{}{STATION} vastaanottaa ensimmäisen laivan! STR_NEWS_FIRST_AIRCRAFT_ARRIVAL :{BIG_FONT}{BLACK}Asukkaat 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 -STR_NEWS_ROAD_VEHICLE_CRASH :{BIG_FONT}{BLACK}Tasoristeysturma!{}{COMMA} kuolee junan ja auton törmäyksen jälkeisessä tulipallossa -STR_NEWS_AIRCRAFT_CRASH :{BIG_FONT}{BLACK}Lento-onnettomuus!{}{COMMA} kuolee tulipallossa asemalla {STATION}. -STR_NEWS_PLANE_CRASH_OUT_OF_FUEL :{BIG_FONT}{BLACK}Lento-onnettomuus!{}Lentokoneelta loppui polttoaine, {COMMA} kuolee tulipallossa +STR_NEWS_TRAIN_CRASH :{BIG_FONT}{BLACK}Junaonnettomuus!{}{COMMA} kuollut törmäyksen jälkeisessä tulipallossa +STR_NEWS_ROAD_VEHICLE_CRASH_DRIVER :{BIG_FONT}{BLACK}Tasoristeysturma!{}Kuljettaja kuollut junan ja auton törmäyksen jälkeisessä tulipallossa +STR_NEWS_ROAD_VEHICLE_CRASH :{BIG_FONT}{BLACK}Tasoristeysturma!{}{COMMA} kuoli junan ja auton törmäyksen jälkeisessä tulipallossa +STR_NEWS_AIRCRAFT_CRASH :{BIG_FONT}{BLACK}Lento-onnettomuus!{}{1:STATION}: {0:COMMA} kuollut tulipallossa +STR_NEWS_PLANE_CRASH_OUT_OF_FUEL :{BIG_FONT}{BLACK}Lento-onnettomuus!{}Polttoaineen loppuminen johti {COMMA} ihmisen kuolemaan tulipallossa STR_NEWS_DISASTER_ZEPPELIN :{BIG_FONT}{BLACK}{STATION}: Ilmalaivaonnettomuus! STR_NEWS_DISASTER_SMALL_UFO :{BIG_FONT}{BLACK}Ajoneuvo tuhoutui törmäyksessä UFO:n kanssa! @@ -870,6 +864,7 @@ STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE :{BIG_FONT}{BLAC STR_NEWS_NEW_VEHICLE_TYPE :{BIG_FONT}{BLACK}{ENGINE} STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE :{BLACK}Uusi {STRING} on nyt saatavilla! – {ENGINE} +STR_NEWS_SHOW_VEHICLE_GROUP_TOOLTIP :{BLACK}Avaa ryhmäikkuna kulkuneuvon ryhmään kohdistettuna STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO :{WHITE}{STATION} ei ota enää vastaan {STRING}. STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO_OR_CARGO :{WHITE}{STATION} ei ota enää vastaan {STRING} tai {STRING}. @@ -1263,7 +1258,7 @@ STR_CONFIG_SETTING_ALLOW_GIVE_MONEY_HELPTEXT :Sallii rahan si STR_CONFIG_SETTING_FREIGHT_TRAINS :Rahdin painokerroin raskaiden junien simulointia varten: {STRING} STR_CONFIG_SETTING_FREIGHT_TRAINS_HELPTEXT :Määritä rahdin kuljettamisen vaikutus junissa. Korkeammat arvot tekevät rahdin kuljettamisesta raskaampaa junille, erityisesti mäissä STR_CONFIG_SETTING_PLANE_SPEED :Lentokoneiden nopeuskerroin: {STRING} -STR_CONFIG_SETTING_PLANE_SPEED_HELPTEXT :Määritä lentokoneiden suhteellinen nopeus verrattuna toisiin kulkuneuvotyyppeihin +STR_CONFIG_SETTING_PLANE_SPEED_HELPTEXT :Määritä lentokoneiden suhteellinen nopeus verrattuna toisiin kulkuneuvotyyppeihin, jotta vähennetään ilma-alusksilla tehtyjen kuljetusten tuottoa STR_CONFIG_SETTING_PLANE_SPEED_VALUE :1 / {COMMA} STR_CONFIG_SETTING_PLANE_CRASHES :Lento-onnettomuuksien määrä: {STRING} STR_CONFIG_SETTING_PLANE_CRASHES_HELPTEXT :Määrittää lento-onnettomuuksien todennäköisyyden.{}¹ Isot lentokoneet voivat kuitenkin aina tuhoutua pienille lentokentille laskeutuessaan. @@ -1314,6 +1309,8 @@ STR_CONFIG_SETTING_POPULATION_IN_LABEL :Näytä kunnan STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Näytä kuntien asukasluvut kartalla STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Viivojen paksuus kuvaajissa: {STRING} STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Viivan leveys kuvaajissa. Ohut viiva on tarkasti luettavissa kun taas paksumpi viiva on helpompi nähdä ja sen värit ovat helpommin havaittavissa +STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :Näytä NewGRF:n nimi kulkuneuvoikkunassa: {STRING} +STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Lisää kulkuneuvovalikoimaikkunaan rivin, joka kertoo mistä NewGRF:stä valittu kulkuneuvo on peräisin. STR_CONFIG_SETTING_LANDSCAPE :Maasto: {STRING} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Maasto vaikuttaa useisiin pelin peruselementteihin, kuten rahtiin ja kuntien kasvuedellytyksiin. NewGRF:t ja peliskriptit voivat kuitenkin vaikuttaa tarkemmin pelin kulkuun @@ -1466,8 +1463,8 @@ STR_CONFIG_SETTING_MAX_TRAINS :Suurin sallittu STR_CONFIG_SETTING_MAX_TRAINS_HELPTEXT :Yhtiön suurin sallittu junien määrä STR_CONFIG_SETTING_MAX_ROAD_VEHICLES :Suurin sallittu ajoneuvojen määrä yhtiötä kohden: {STRING} STR_CONFIG_SETTING_MAX_ROAD_VEHICLES_HELPTEXT :Yhtiön suurin sallittu ajoneuvojen määrä -STR_CONFIG_SETTING_MAX_AIRCRAFT :Suurin sallittu lentokoneiden määrä yhtiötä kohden: {STRING} -STR_CONFIG_SETTING_MAX_AIRCRAFT_HELPTEXT :Yhtiön suurin sallittu lentokoneiden määrä +STR_CONFIG_SETTING_MAX_AIRCRAFT :Suurin sallittu ilma-alusten määrä yhtiötä kohden: {STRING} +STR_CONFIG_SETTING_MAX_AIRCRAFT_HELPTEXT :Yhtiön suurin sallittu ilma-alusten määrä STR_CONFIG_SETTING_MAX_SHIPS :Suurin sallittu laivojen määrä yhtiötä kohden: {STRING} STR_CONFIG_SETTING_MAX_SHIPS_HELPTEXT :Yhtiön suurin sallittu laivojen määrä @@ -1475,8 +1472,8 @@ STR_CONFIG_SETTING_AI_BUILDS_TRAINS :Tietokoneella e STR_CONFIG_SETTING_AI_BUILDS_TRAINS_HELPTEXT :Mikäli käytössä, junien rakentaminen ei ole mahdollista tietokonepelaajille STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES :Tietokoneella ei ole ajoneuvoja: {STRING} STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES_HELPTEXT :Mikäli käytössä, ajoneuvojen rakentaminen ei ole mahdollista tietokonepelaajille -STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT :Tietokoneella ei ole lentokoneita: {STRING} -STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT_HELPTEXT :Mikäli käytössä, lentokoneiden rakentaminen ei ole mahdollista tietokonepelaajille +STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT :Tietokoneella ei ole ilma-aluksia: {STRING} +STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT_HELPTEXT :Mikäli käytössä, ilma-alusten rakentaminen ei ole mahdollista tietokonepelaajille STR_CONFIG_SETTING_AI_BUILDS_SHIPS :Tietokoneella ei ole laivoja: {STRING} STR_CONFIG_SETTING_AI_BUILDS_SHIPS_HELPTEXT :Mikäli käytössä, laivojen rakentaminen ei ole mahdollista tietokonepelaajille @@ -1551,6 +1548,10 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Täysi STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Värilliset uutiset ilmestyvät: {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Vuosi, jonka jälkeen sanomalehdet ovat värillisiä. Ennen tätä vuotta sanomalehdet käyttävät mustavalkoisia kuvia STR_CONFIG_SETTING_STARTING_YEAR :Aloitusvuosi: {STRING} +STR_CONFIG_SETTING_ENDING_YEAR :Pistelaskun päättymisvuosi: {STRING} +STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Pelin päättymisvuosi pisteiden laskemista varten. Tämän vuoden lopussa talletetaan yhtiön pistemäärä ja näytetään ennätysluettelo; pelaajat voivat jatkaa pelaamista tämän jälkeenkin.{}Jos päättymisvuosi on ennen alkamisvuotta, ennätyksiä ei näytetä koskaan. +STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} +STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Ei koskaan STR_CONFIG_SETTING_SMOOTH_ECONOMY :Tasainen talous (enemmän pieniä muutoksia): {STRING} STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Mikäli käytössä, teollisuuden tuotanto muuttuu useammin ja vähemmän kerrallaan. Tällä asetuksella ei ole yleensä vaikutusta mikäli teollisuustyypit ovat NewGRF:n tarjoamia STR_CONFIG_SETTING_ALLOW_SHARES :Salli toisten yhtiöiden osakkeiden ostaminen: {STRING} @@ -1848,7 +1849,7 @@ STR_LIVERY_GENERAL_TOOLTIP :{BLACK}Näytä STR_LIVERY_TRAIN_TOOLTIP :{BLACK}Näytä junien väriteemat STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}Näytä tieajoneuvojen väriteemat STR_LIVERY_SHIP_TOOLTIP :{BLACK}Näytä laivojen väriteemat -STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}Näytä lentokoneiden väriteemat +STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}Näytä ilma-alusten väriteemat STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Valitse valitulle teemalle ensisijainen väri. Ctrl+Klik asettaa tämän värin jokaiselle teemalle STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Valitse valitulle teemalle toissijainen väri. Ctrl+Klik asettaa tämän värin jokaiselle teemalle STR_LIVERY_PANEL_TOOLTIP :{BLACK}Valitse muutettava väriteema, tai valitse useita Ctrl pohjassa. Paina valintalaatikkoa valitaksesi teeman @@ -3286,7 +3287,7 @@ STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Näytä STR_STATION_VIEW_RENAME_STATION_CAPTION :Nimeä asema/lastausalue STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Sulje lentokenttä -STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Estä lentokoneiden laskeutuminen tälle lentokentälle +STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Estä ilma-aluksia laskeutumasta tälle lentokentälle # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} @@ -3305,12 +3306,12 @@ STR_FINANCES_SECTION_CONSTRUCTION :{GOLD}Rakentami STR_FINANCES_SECTION_NEW_VEHICLES :{GOLD}Uudet kulkuneuvot STR_FINANCES_SECTION_TRAIN_RUNNING_COSTS :{GOLD}Junien käyttökustannukset STR_FINANCES_SECTION_ROAD_VEHICLE_RUNNING_COSTS :{GOLD}Ajoneuvojen käyttökustannukset -STR_FINANCES_SECTION_AIRCRAFT_RUNNING_COSTS :{GOLD}Lentokoneiden käyttökustannukset +STR_FINANCES_SECTION_AIRCRAFT_RUNNING_COSTS :{GOLD}Ilma-alusten käyttökustannukset STR_FINANCES_SECTION_SHIP_RUNNING_COSTS :{GOLD}Laivojen käyttökustannukset STR_FINANCES_SECTION_PROPERTY_MAINTENANCE :{GOLD}Omaisuudenhallinta STR_FINANCES_SECTION_TRAIN_INCOME :{GOLD}Junien tulot STR_FINANCES_SECTION_ROAD_VEHICLE_INCOME :{GOLD}Ajoneuvojen tulot -STR_FINANCES_SECTION_AIRCRAFT_INCOME :{GOLD}Lentokoneiden tulot +STR_FINANCES_SECTION_AIRCRAFT_INCOME :{GOLD}Ilma-alusten tulot STR_FINANCES_SECTION_SHIP_INCOME :{GOLD}Laivojen tulot STR_FINANCES_SECTION_LOAN_INTEREST :{GOLD}Lainan korko STR_FINANCES_SECTION_OTHER :{GOLD}Muuta @@ -3336,7 +3337,7 @@ STR_COMPANY_VIEW_COLOUR_SCHEME_TITLE :{GOLD}Väriteem STR_COMPANY_VIEW_VEHICLES_TITLE :{GOLD}Kulkuneuvot: STR_COMPANY_VIEW_TRAINS :{WHITE}{COMMA} juna{P "" a} STR_COMPANY_VIEW_ROAD_VEHICLES :{WHITE}{COMMA} ajoneuvo{P "" a} -STR_COMPANY_VIEW_AIRCRAFT :{WHITE}{COMMA} lentokone{P "" tta} +STR_COMPANY_VIEW_AIRCRAFT :{WHITE}{COMMA} ilma-alus{P "" ta} STR_COMPANY_VIEW_SHIPS :{WHITE}{COMMA} laiva{P "" a} STR_COMPANY_VIEW_VEHICLES_NONE :{WHITE}Ei mitään STR_COMPANY_VIEW_COMPANY_VALUE :{GOLD}Yhtiön arvo: {WHITE}{CURRENCY_LONG} @@ -3400,6 +3401,10 @@ STR_INDUSTRY_DIRECTORY_ITEM_PROD2 :{ORANGE}{INDUST STR_INDUSTRY_DIRECTORY_ITEM_PROD3 :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} STR_INDUSTRY_DIRECTORY_ITEM_PRODMORE :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} ja {NUM} muuta STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Teollisuusmuotojen nimet - kohdista päänäkymä teollisuuslaitokseen napsauttamalla nimeä. Ctrl+Klik avaa uuden näkymäikkunan teollisuuslaitoksen sijaintiin +STR_INDUSTRY_DIRECTORY_ACCEPTED_CARGO_FILTER :{BLACK}Vastaanotettava rahti: {SILVER}{STRING} +STR_INDUSTRY_DIRECTORY_PRODUCED_CARGO_FILTER :{BLACK}Tuotettu rahti: {SILVER}{STRING} +STR_INDUSTRY_DIRECTORY_FILTER_ALL_TYPES :Kaikki rahtityypit +STR_INDUSTRY_DIRECTORY_FILTER_NONE :Ei mitään # Industry view STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTRY} @@ -3424,7 +3429,7 @@ STR_CONFIG_GAME_PRODUCTION_LEVEL :{WHITE}Muuta tu 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_AIRCRAFT_CAPTION :{WHITE}{STRING} - {COMMA} ilma-alus{P "" ta} STR_VEHICLE_LIST_TRAIN_LIST_TOOLTIP :{BLACK}Junat – napsauta junaa saadaksesi tietoja STR_VEHICLE_LIST_ROAD_VEHICLE_TOOLTIP :{BLACK}Ajoneuvot – napsauta ajoneuvoa saadaksesi tietoja @@ -3441,7 +3446,7 @@ STR_VEHICLE_LIST_AVAILABLE_ENGINES_TOOLTIP :{BLACK}Näytä STR_VEHICLE_LIST_MANAGE_LIST :{BLACK}Muokkaa listaa STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Ohjaa kaikkia listan kulkuneuvoja -STR_VEHICLE_LIST_REPLACE_VEHICLES :Korvaa liikennevälineitä +STR_VEHICLE_LIST_REPLACE_VEHICLES :Korvaa kulkuneuvoja STR_VEHICLE_LIST_SEND_FOR_SERVICING :Lähetä huoltoon STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Lähetä varikolle @@ -3458,12 +3463,12 @@ STR_VEHICLE_LIST_SHARED_ORDERS_LIST_CAPTION :{WHITE}{COMMA} STR_GROUP_ALL_TRAINS :Kaikki junat STR_GROUP_ALL_ROAD_VEHICLES :Kaikki ajoneuvot STR_GROUP_ALL_SHIPS :Kaikki laivat -STR_GROUP_ALL_AIRCRAFTS :Kaikki lentoalukset +STR_GROUP_ALL_AIRCRAFTS :Kaikki ilma-alukset STR_GROUP_DEFAULT_TRAINS :Muut junat STR_GROUP_DEFAULT_ROAD_VEHICLES :Muut ajoneuvot STR_GROUP_DEFAULT_SHIPS :Muut laivat -STR_GROUP_DEFAULT_AIRCRAFTS :Muut lentokoneet +STR_GROUP_DEFAULT_AIRCRAFTS :Muut ilma-alukset STR_GROUP_COUNT_WITH_SUBGROUP :{TINY_FONT}{COMMA} (+{COMMA}) @@ -3488,19 +3493,19 @@ 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_RAIL_CAPTION :Uudet junat STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Uusi sähköjuna STR_BUY_VEHICLE_TRAIN_MONORAIL_CAPTION :Uusi yksiraidejuna STR_BUY_VEHICLE_TRAIN_MAGLEV_CAPTION :Uusi Maglev-juna -STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :Uusia ajoneuvoja -STR_BUY_VEHICLE_TRAM_VEHICLE_CAPTION :Uusia raitiovaunuja +STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :Uudet ajoneuvot +STR_BUY_VEHICLE_TRAM_VEHICLE_CAPTION :Uudet raitiovaunut ############ range for vehicle availability starts STR_BUY_VEHICLE_TRAIN_ALL_CAPTION :Uudet junat -STR_BUY_VEHICLE_ROAD_VEHICLE_ALL_CAPTION :Uusia ajoneuvoja -STR_BUY_VEHICLE_SHIP_CAPTION :Uusia laivoja -STR_BUY_VEHICLE_AIRCRAFT_CAPTION :Uusi lentokone +STR_BUY_VEHICLE_ROAD_VEHICLE_ALL_CAPTION :Uudet ajoneuvot +STR_BUY_VEHICLE_SHIP_CAPTION :Uudet laivat +STR_BUY_VEHICLE_AIRCRAFT_CAPTION :Uusi ilma-alus ############ range for vehicle availability ends STR_PURCHASE_INFO_COST_WEIGHT :{BLACK}Hinta: {GOLD}{CURRENCY_LONG}{BLACK} Paino: {GOLD}{WEIGHT_SHORT} @@ -3527,32 +3532,32 @@ STR_PURCHASE_INFO_NONE :Ei mitään 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_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Ilma-alustyyppi: {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 STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Laivojen valintaluettelo. Napsauta laivaa saadaksesi lisää tietoja. Ctrl+Klik näyttää tai piilottaa laivan tyypin -STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Lentokoneiden valintaluettelo. Napsauta lentokonetta saadaksesi lisää tietoja. Ctrl+Klik näyttää tai piilottaa lentokoneen tyypin +STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Ilma-alusten valintaluettelo. Napsauta ilma-alusta saadaksesi lisää tietoja. Ctrl+Klik näyttää tai piilottaa ilma-aluksen tyypin STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_BUTTON :{BLACK}Osta yksikkö STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_BUTTON :{BLACK}Osta ajoneuvo STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_BUTTON :{BLACK}Osta laiva -STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_BUTTON :{BLACK}Osta lentokone +STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_BUTTON :{BLACK}Osta ilma-alus STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Osta ja sovita yksikkö STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Osta ja sovita ajoneuvo STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Osta ja sovita laiva -STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Osta ja sovita lentokone +STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Osta ja sovita ilma-alus 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_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Osta korostettu ilma-alus. Shift+Klik näyttää kustannusarvion ostamatta STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu yksikkö. Shift+Klik näyttää kustannusarvion ostamatta STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu ajoneuvo. Shift+Klik näyttää kustannusarvion ostamatta STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu laiva. Shift+Klik näyttää kustannusarvion ostamatta -STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu lentokone. Shift+Klik näyttää kustannusarvion ostamatta +STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu ilma-alus. Shift+Klik näyttää kustannusarvion ostamatta STR_BUY_VEHICLE_TRAIN_RENAME_BUTTON :{BLACK}Nimeä STR_BUY_VEHICLE_ROAD_VEHICLE_RENAME_BUTTON :{BLACK}Nimeä @@ -3577,12 +3582,12 @@ STR_BUY_VEHICLE_AIRCRAFT_SHOW_TOGGLE_BUTTON :{BLACK}Näytä STR_BUY_VEHICLE_TRAIN_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Näytä tai piilota junan tyyppi STR_BUY_VEHICLE_ROAD_VEHICLE_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Näytä tai piilota ajoneuvon tyyppi STR_BUY_VEHICLE_SHIP_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Näytä tai piilota laivan tyyppi -STR_BUY_VEHICLE_AIRCRAFT_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Näytä tai piilota lentokoneen tyyppi +STR_BUY_VEHICLE_AIRCRAFT_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Näytä tai piilota ilma-aluksen tyyppi -STR_QUERY_RENAME_TRAIN_TYPE_CAPTION :{WHITE}Nimeä juna(vaunu)n tyyppi uudelleen. +STR_QUERY_RENAME_TRAIN_TYPE_CAPTION :{WHITE}Nimeä juna(vaunu)n tyyppi uudelleen STR_QUERY_RENAME_ROAD_VEHICLE_TYPE_CAPTION :{WHITE}Nimeä ajoneuvon tyyppi uudelleen -STR_QUERY_RENAME_SHIP_TYPE_CAPTION :{WHITE}Nimeä laivatyyppi uudelleen. -STR_QUERY_RENAME_AIRCRAFT_TYPE_CAPTION :{WHITE}Nimeä lentokonetyyppi uudelleen. +STR_QUERY_RENAME_SHIP_TYPE_CAPTION :{WHITE}Nimeä laivatyyppi uudelleen +STR_QUERY_RENAME_AIRCRAFT_TYPE_CAPTION :{WHITE}Nimeä ilma-alustyyppi uudelleen # Depot window STR_DEPOT_CAPTION :{WHITE}{DEPOT} @@ -3615,22 +3620,22 @@ STR_DEPOT_SELL_ALL_BUTTON_AIRCRAFT_TOOLTIP :{BLACK}Myy kaik 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 +STR_DEPOT_AUTOREPLACE_AIRCRAFT_TOOLTIP :{BLACK}Korvaa kaikki hallissa olevat lentokoneet automaattisesti -STR_DEPOT_TRAIN_NEW_VEHICLES_BUTTON :{BLACK}Uusia liikennevälineitä -STR_DEPOT_ROAD_VEHICLE_NEW_VEHICLES_BUTTON :{BLACK}Uusia ajoneuvoja -STR_DEPOT_SHIP_NEW_VEHICLES_BUTTON :{BLACK}Uusia laivoja -STR_DEPOT_AIRCRAFT_NEW_VEHICLES_BUTTON :{BLACK}Uusia lentokoneita +STR_DEPOT_TRAIN_NEW_VEHICLES_BUTTON :{BLACK}Uudet kulkuneuvot +STR_DEPOT_ROAD_VEHICLE_NEW_VEHICLES_BUTTON :{BLACK}Uudet ajoneuvot +STR_DEPOT_SHIP_NEW_VEHICLES_BUTTON :{BLACK}Uudet laivat +STR_DEPOT_AIRCRAFT_NEW_VEHICLES_BUTTON :{BLACK}Uudet lentokoneet STR_DEPOT_TRAIN_NEW_VEHICLES_TOOLTIP :{BLACK}Osta uusi yksikkö STR_DEPOT_ROAD_VEHICLE_NEW_VEHICLES_TOOLTIP :{BLACK}Osta uusi ajoneuvo STR_DEPOT_SHIP_NEW_VEHICLES_TOOLTIP :{BLACK}Osta uusi laiva -STR_DEPOT_AIRCRAFT_NEW_VEHICLES_TOOLTIP :{BLACK}Osta uusi lentokone +STR_DEPOT_AIRCRAFT_NEW_VEHICLES_TOOLTIP :{BLACK}Osta uusi ilma-alus STR_DEPOT_CLONE_TRAIN :{BLACK}Kloonaa juna STR_DEPOT_CLONE_ROAD_VEHICLE :{BLACK}Kloonaa ajoneuvo STR_DEPOT_CLONE_SHIP :{BLACK}Kloonaa laiva -STR_DEPOT_CLONE_AIRCRAFT :{BLACK}Kloonaa lentokone +STR_DEPOT_CLONE_AIRCRAFT :{BLACK}Kloonaa ilma-alus 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 @@ -3669,18 +3674,18 @@ STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :yksiraiteisen v STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :maglev-veturin STR_ENGINE_PREVIEW_ROAD_VEHICLE :ajoneuvon -STR_ENGINE_PREVIEW_TRAM_VEHICLE :raitiovaunu +STR_ENGINE_PREVIEW_TRAM_VEHICLE :raitiovaunun -STR_ENGINE_PREVIEW_AIRCRAFT :lentokoneen +STR_ENGINE_PREVIEW_AIRCRAFT :ilma-aluksen STR_ENGINE_PREVIEW_SHIP :laivan 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_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 +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Hinta: {CURRENCY_LONG} Maks. nopeus: {VELOCITY}{}Ilma-alustyyppi: {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}{}Ilma-alustyyppi: {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}{}Ilma-alustyyppi: {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}{}Ilma-alustyyppi: {STRING} Toimintamatka: {COMMA} ruutua{}Kapasiteetti: {CARGO_LONG}{}Käyttökustannukset: {CURRENCY_LONG}/v # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Korvaa {STRING} – {STRING} @@ -3692,17 +3697,17 @@ STR_REPLACE_VEHICLE_AIRCRAFT :lentokoneita STR_REPLACE_VEHICLE_VEHICLES_IN_USE :{YELLOW}Käytössä olevat kulkuneuvot STR_REPLACE_VEHICLE_VEHICLES_IN_USE_TOOLTIP :{BLACK}Sarake kulkuneuvoille, jotka omistat STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES :{YELLOW}Saatavilla olevat kulkuneuvot -STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES_TOOLTIP :{BLACK}Sarake kulkuneuvoille, jotka voidaan uusia +STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES_TOOLTIP :{BLACK}Sarake kulkuneuvoille, jotka voidaan uudistaa STR_REPLACE_HELP_LEFT_ARRAY :{BLACK}Valitse korvattava veturityyppi. STR_REPLACE_HELP_RIGHT_ARRAY :{BLACK}Valitse vasemmalla näkyvän veturityypinn korvaava uusi veturityyppi. STR_REPLACE_VEHICLES_START :{BLACK}Aloita kulkuneuvojen korvaaminen -STR_REPLACE_VEHICLES_NOW :Korvaa kaikki liikennevälineet nyt -STR_REPLACE_VEHICLES_WHEN_OLD :Korvaa vain vanhat liikennevälineet +STR_REPLACE_VEHICLES_NOW :Korvaa kaikki kulkuneuvot heti +STR_REPLACE_VEHICLES_WHEN_OLD :Korvaa vain vanhat kulkuneuvot STR_REPLACE_HELP_START_BUTTON :{BLACK}Napsauta aloittaaksesi vasemmalta valitun veturityypin korvauksen oikealta valitulla veturityypillä. STR_REPLACE_NOT_REPLACING :{BLACK}Ei korvata -STR_REPLACE_NOT_REPLACING_VEHICLE_SELECTED :{BLACK}Ei liikennevälinettä valittuna +STR_REPLACE_NOT_REPLACING_VEHICLE_SELECTED :{BLACK}Ei kulkuneuvoa valittuna STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} kun vanha STR_REPLACE_VEHICLES_STOP :{BLACK}Lopeta kulkuneuvojen korvaaminen STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Napsauta pysäyttääksesi vasemmalta valitun veturityypin korvauksen. @@ -3733,12 +3738,12 @@ STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE STR_VEHICLE_VIEW_TRAIN_LOCATION_TOOLTIP :{BLACK}Keskitä näkymä junan sijaintiin. Ctrl+Klik seuraa junaa näkymässä STR_VEHICLE_VIEW_ROAD_VEHICLE_LOCATION_TOOLTIP :{BLACK}Keskitä näkymä ajoneuvon sijaintiin. Ctrl+Klik seuraa ajoneuvoa päänäkymässä STR_VEHICLE_VIEW_SHIP_LOCATION_TOOLTIP :{BLACK}Keskitä näkymä laivan sijaintiin. Ctrl+Click seuraa laivaa näkymässä -STR_VEHICLE_VIEW_AIRCRAFT_LOCATION_TOOLTIP :{BLACK}Keskitä näkymä lentokoneen sijaintiin. Ctrl+Klik seuraa lentokonetta päänäkymässä +STR_VEHICLE_VIEW_AIRCRAFT_LOCATION_TOOLTIP :{BLACK}Keskitä näkymä ilma-aluksen sijaintiin. Ctrl+Klik seuraa ilma-alusta päänäkymässä STR_VEHICLE_VIEW_TRAIN_SEND_TO_DEPOT_TOOLTIP :{BLACK}Lähetä juna veturitalliin. Ctrl+Klik suorittaa vain huollon STR_VEHICLE_VIEW_ROAD_VEHICLE_SEND_TO_DEPOT_TOOLTIP :{BLACK}Lähetä ajoneuvo varikolle. Ctrl+Klik suorittaa vain huollon 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_AIRCRAFT_SEND_TO_DEPOT_TOOLTIP :{BLACK}Lähetä ilma-alus lentokonehalliin. Ctrl+Klik suorittaa vain huollon 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 @@ -3750,7 +3755,7 @@ STR_VEHICLE_VIEW_TRAIN_IGNORE_SIGNAL_TOOLTIP :{BLACK}Anna jun STR_VEHICLE_VIEW_TRAIN_REFIT_TOOLTIP :{BLACK}Sovita juna kuljettamaan muuta rahtityyppiä STR_VEHICLE_VIEW_ROAD_VEHICLE_REFIT_TOOLTIP :{BLACK}Muuta ajoneuvo kuljettamaan muuta rahtityyppiä STR_VEHICLE_VIEW_SHIP_REFIT_TOOLTIP :{BLACK}Sovita laiva eri rahtityypille -STR_VEHICLE_VIEW_AIRCRAFT_REFIT_TOOLTIP :{BLACK}Sovita lentokone eri rahtityypille. +STR_VEHICLE_VIEW_AIRCRAFT_REFIT_TOOLTIP :{BLACK}Sovita ilma-alus kuljettamaan eri rahtityyppiä STR_VEHICLE_VIEW_TRAIN_REVERSE_TOOLTIP :{BLACK}Käännä junan suunta STR_VEHICLE_VIEW_ROAD_VEHICLE_REVERSE_TOOLTIP :{BLACK}Pakota ajoneuvo kääntymään ympäri @@ -3758,12 +3763,12 @@ STR_VEHICLE_VIEW_ROAD_VEHICLE_REVERSE_TOOLTIP :{BLACK}Pakota a STR_VEHICLE_VIEW_TRAIN_ORDERS_TOOLTIP :{BLACK}Näytä junan käskyt. Ctrl+Klik näyttää junan aikataulun STR_VEHICLE_VIEW_ROAD_VEHICLE_ORDERS_TOOLTIP :{BLACK}Näytä ajoneuvon käskyt. Ctrl+Klik näyttää ajoneuvon aikataulun STR_VEHICLE_VIEW_SHIP_ORDERS_TOOLTIP :{BLACK}Näytä laivan käskyt. Ctrl+Click näyttää laivan aikataulun -STR_VEHICLE_VIEW_AIRCRAFT_ORDERS_TOOLTIP :{BLACK}Näytä lentokoneen käskyt. Ctrl+Klik näyttää lentokoneen aikataulun +STR_VEHICLE_VIEW_AIRCRAFT_ORDERS_TOOLTIP :{BLACK}Näytä ilma-aluksen käskyt. Ctrl+Klik näyttää ilma-aluksen aikataulun STR_VEHICLE_VIEW_TRAIN_SHOW_DETAILS_TOOLTIP :{BLACK}Näytä junan tiedot STR_VEHICLE_VIEW_ROAD_VEHICLE_SHOW_DETAILS_TOOLTIP :{BLACK}Näytä ajoneuvon tiedot STR_VEHICLE_VIEW_SHIP_SHOW_DETAILS_TOOLTIP :{BLACK}Näytä laivan tiedot -STR_VEHICLE_VIEW_AIRCRAFT_SHOW_DETAILS_TOOLTIP :{BLACK}Näytä lentokoneen tiedot. +STR_VEHICLE_VIEW_AIRCRAFT_SHOW_DETAILS_TOOLTIP :{BLACK}Näytä ilma-aluksen tiedot STR_VEHICLE_VIEW_TRAIN_STATE_START_STOP_TOOLTIP :{BLACK}Valitun junan toiminnot – napsauta pysäyttääksesi/käynnistääksesi junan. Ctrl+Klik vierittääksesi kohteeseen STR_VEHICLE_VIEW_ROAD_VEHICLE_STATE_START_STOP_TOOLTIP :{BLACK}Nykyisen ajoneuvon toiminnot – napsauta pysäyttääksesi/käynnistääksesi ajoneuvon. Ctrl+Klik vierittääksesi kohteeseen @@ -3800,7 +3805,7 @@ STR_VEHICLE_NAME_BUTTON :{BLACK}Nimi STR_VEHICLE_DETAILS_TRAIN_RENAME :{BLACK}Nimeä juna STR_VEHICLE_DETAILS_ROAD_VEHICLE_RENAME :{BLACK}Nimeä ajoneuvo STR_VEHICLE_DETAILS_SHIP_RENAME :{BLACK}Nimeä laiva -STR_VEHICLE_DETAILS_AIRCRAFT_RENAME :{BLACK}Nimeä lentokone +STR_VEHICLE_DETAILS_AIRCRAFT_RENAME :{BLACK}Nimeä ilma-alus STR_VEHICLE_INFO_AGE_RUNNING_COST_YR :{BLACK}Ikä: {LTBLUE}{STRING}{BLACK} Käyttökustannukset: {LTBLUE}{CURRENCY_LONG}/yr # The next two need to stay in this order @@ -3808,8 +3813,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_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_MAX_SPEED_TYPE :{BLACK}Huippunopeus: {LTBLUE}{VELOCITY} {BLACK}Ilma-alustyyppi: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Huippunopeus: {LTBLUE}{VELOCITY} {BLACK}Ilma-alustyyppi: {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. vetovoima: {LTBLUE}{FORCE} @@ -3837,7 +3842,7 @@ STR_VEHICLE_DETAILS_PERCENT :Prosentteja STR_QUERY_RENAME_TRAIN_CAPTION :{WHITE}Nimeä juna STR_QUERY_RENAME_ROAD_VEHICLE_CAPTION :{WHITE}Nimeä ajoneuvo STR_QUERY_RENAME_SHIP_CAPTION :{WHITE}Nimeä laiva -STR_QUERY_RENAME_AIRCRAFT_CAPTION :{WHITE}Nimeä lentokone +STR_QUERY_RENAME_AIRCRAFT_CAPTION :{WHITE}Nimeä ilma-alus # Extra buttons for train details windows STR_VEHICLE_DETAILS_TRAIN_ENGINE_BUILT_AND_VALUE :{LTBLUE}{ENGINE}{BLACK} Rakennettu: {LTBLUE}{NUM}{BLACK} Arvo: {LTBLUE}{CURRENCY_LONG} @@ -3879,7 +3884,7 @@ STR_REFIT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Valitse STR_REFIT_TRAIN_REFIT_BUTTON :{BLACK}Sovita juna STR_REFIT_ROAD_VEHICLE_REFIT_BUTTON :{BLACK}Korjaa ajoneuvo. STR_REFIT_SHIP_REFIT_BUTTON :{BLACK}Sovita laiva -STR_REFIT_AIRCRAFT_REFIT_BUTTON :{BLACK}Sovita lentokone +STR_REFIT_AIRCRAFT_REFIT_BUTTON :{BLACK}Sovita ilma-alus STR_REFIT_TRAIN_REFIT_TOOLTIP :{BLACK}Sovita juna kuljettamaan valittua rahtityyppiä STR_REFIT_ROAD_VEHICLE_REFIT_TOOLTIP :{BLACK}Muuta ajoneuvo rahtaamaan korostettua rahtityyppiä. @@ -4174,6 +4179,14 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Valitse STR_AI_LIST_CANCEL :{BLACK}Peruuta STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Älä vaihda skriptiä +STR_SCREENSHOT_CAPTION :{WHITE}Ota kuvakaappaus +STR_SCREENSHOT_SCREENSHOT :{BLACK}Tavallinen kuvakaappaus +STR_SCREENSHOT_ZOOMIN_SCREENSHOT :{BLACK}Täysin lähennetty kuvakaappaus +STR_SCREENSHOT_DEFAULTZOOM_SCREENSHOT :{BLACK}Kuvakaappaus oletuslähennyksellä +STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Koko kartan kuvakaappaus +STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Korkeuskartan kuvakaappaus +STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Pienoiskartan kuvakaappaus + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametrit STR_AI_SETTINGS_CAPTION_AI :Tekoäly @@ -4427,7 +4440,7 @@ STR_ERROR_CAN_T_REVERSE_DIRECTION_RAIL_VEHICLE :{WHITE}Kulkuneu STR_ERROR_CAN_T_REVERSE_DIRECTION_RAIL_VEHICLE_MULTIPLE_UNITS :{WHITE}... koostuu useammista yksiköistä STR_ERROR_INCOMPATIBLE_RAIL_TYPES :Raiteet eivät ole yhteensopivia -STR_ERROR_CAN_T_MOVE_VEHICLE :{WHITE}Liikennevälinettä ei voi poistaa... +STR_ERROR_CAN_T_MOVE_VEHICLE :{WHITE}Kulkuneuvoa ei voi siirtää... STR_ERROR_REAR_ENGINE_FOLLOW_FRONT :{WHITE}Moottorivaunun takaosa seuraa aina etuosaansa STR_ERROR_UNABLE_TO_FIND_ROUTE_TO :{WHITE}Reittiä paikalliselle veturitallille ei löydy. STR_ERROR_UNABLE_TO_FIND_LOCAL_DEPOT :{WHITE}Paikallista varikkoa ei löydy. @@ -4533,47 +4546,47 @@ STR_ERROR_GROUP_CAN_T_ADD_SHARED_VEHICLE :{WHITE}Ei voi l STR_ERROR_TRAIN_IN_THE_WAY :{WHITE}Juna on tiellä. STR_ERROR_ROAD_VEHICLE_IN_THE_WAY :{WHITE}Ajoneuvo tiellä. STR_ERROR_SHIP_IN_THE_WAY :{WHITE}Laiva on tiellä. -STR_ERROR_AIRCRAFT_IN_THE_WAY :{WHITE}Lentokone on tiellä. +STR_ERROR_AIRCRAFT_IN_THE_WAY :{WHITE}Ilma-alus on tiellä STR_ERROR_CAN_T_REFIT_TRAIN :{WHITE}Junaa ei voi sovittaa... STR_ERROR_CAN_T_REFIT_ROAD_VEHICLE :{WHITE}Ajoneuvoa ei voida korjata. STR_ERROR_CAN_T_REFIT_SHIP :{WHITE}Laivaa ei voi sovittaa... -STR_ERROR_CAN_T_REFIT_AIRCRAFT :{WHITE}Lentokonetta ei voi sovittaa... +STR_ERROR_CAN_T_REFIT_AIRCRAFT :{WHITE}Ilma-alusta ei voi sovittaa... STR_ERROR_CAN_T_RENAME_TRAIN :{WHITE}Junaa ei voi nimetä... STR_ERROR_CAN_T_RENAME_ROAD_VEHICLE :{WHITE}Ajoneuvoa ei voi nimetä... STR_ERROR_CAN_T_RENAME_SHIP :{WHITE}Laivaa ei voi nimetä... -STR_ERROR_CAN_T_RENAME_AIRCRAFT :{WHITE}Lentokonetta ei voi nimetä... +STR_ERROR_CAN_T_RENAME_AIRCRAFT :{WHITE}Ilma-aluta ei voi nimetä... STR_ERROR_CAN_T_STOP_START_TRAIN :{WHITE}Junaa ei voi pysäyttää/lähettää... STR_ERROR_CAN_T_STOP_START_ROAD_VEHICLE :{WHITE}Ajoneuvoa ei voi pysäyttää/laitta liikkeelle... STR_ERROR_CAN_T_STOP_START_SHIP :{WHITE}Laivaa ei voi pysäyttää/laittaa liikkeelle... -STR_ERROR_CAN_T_STOP_START_AIRCRAFT :{WHITE}Lentokonetta ei voi pysäyttää/laittaa liikkeelle... +STR_ERROR_CAN_T_STOP_START_AIRCRAFT :{WHITE}Ilma-alusta ei voi pysäyttää/laittaa liikkeelle... STR_ERROR_CAN_T_SEND_TRAIN_TO_DEPOT :{WHITE}Junan lähettäminen veturitalliin ei onnistu... STR_ERROR_CAN_T_SEND_ROAD_VEHICLE_TO_DEPOT :{WHITE}Ajoneuvon lähettäminen varikolle ei onnistu... STR_ERROR_CAN_T_SEND_SHIP_TO_DEPOT :{WHITE}Laivaa ei voi lähettää telakalle... -STR_ERROR_CAN_T_SEND_AIRCRAFT_TO_HANGAR :{WHITE}Lentokonetta ei voi lähettää lentokonehalliin... +STR_ERROR_CAN_T_SEND_AIRCRAFT_TO_HANGAR :{WHITE}Ilma-alusta ei voi lähettää lentokonehalliin... STR_ERROR_CAN_T_BUY_TRAIN :{WHITE}Yksikköä ei voi ostaa... STR_ERROR_CAN_T_BUY_ROAD_VEHICLE :{WHITE}Ajoneuvoa ei voi ostaa... STR_ERROR_CAN_T_BUY_SHIP :{WHITE}Laivaa ei voi ostaa... -STR_ERROR_CAN_T_BUY_AIRCRAFT :{WHITE}Lentokonetta ei voi ostaa... +STR_ERROR_CAN_T_BUY_AIRCRAFT :{WHITE}Ilma-alusta ei voi ostaa... STR_ERROR_CAN_T_RENAME_TRAIN_TYPE :{WHITE}Juna(vaunu)n tyyppiä ei voi uudelleennimetä... STR_ERROR_CAN_T_RENAME_ROAD_VEHICLE_TYPE :{WHITE}Ajoneuvotyyppiä ei voi uudelleennimetä... STR_ERROR_CAN_T_RENAME_SHIP_TYPE :{WHITE}Laivatyyppin uudelleennimeäminen ei onnistu... -STR_ERROR_CAN_T_RENAME_AIRCRAFT_TYPE :{WHITE}Lentokonetyyppiä ei voi uudelleennimetä... +STR_ERROR_CAN_T_RENAME_AIRCRAFT_TYPE :{WHITE}Ilma-alustyyppiä ei voi uudelleennimetä... STR_ERROR_CAN_T_SELL_TRAIN :{WHITE}Yksikköä ei voi myydä... STR_ERROR_CAN_T_SELL_ROAD_VEHICLE :{WHITE}Ajoneuvoa ei voi myydä... STR_ERROR_CAN_T_SELL_SHIP :{WHITE}Laivaa ei voi myydä... -STR_ERROR_CAN_T_SELL_AIRCRAFT :{WHITE}Lentokonetta ei voi myydä... +STR_ERROR_CAN_T_SELL_AIRCRAFT :{WHITE}Ilma-alusta ei voi myydä... STR_ERROR_RAIL_VEHICLE_NOT_AVAILABLE :{WHITE}Juna tai vaunu ei ole saatavilla STR_ERROR_ROAD_VEHICLE_NOT_AVAILABLE :{WHITE}Ajoneuvo ei ole saatavilla STR_ERROR_SHIP_NOT_AVAILABLE :{WHITE}Laiva ei ole saatavilla -STR_ERROR_AIRCRAFT_NOT_AVAILABLE :{WHITE}Lentokone ei ole saatavilla +STR_ERROR_AIRCRAFT_NOT_AVAILABLE :{WHITE}Ilma-alus ei ole saatavilla STR_ERROR_TOO_MANY_VEHICLES_IN_GAME :{WHITE}Liian monta kulkuneuvoa pelissä. STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Huoltoväliä ei voi muuttaa. @@ -4592,7 +4605,7 @@ STR_ERROR_TRAIN_START_NO_POWER :Junalla ei ole STR_ERROR_CAN_T_MAKE_ROAD_VEHICLE_TURN :{WHITE}Ajoneuvoa ei voida kääntää... -STR_ERROR_AIRCRAFT_IS_IN_FLIGHT :{WHITE}Lentokone on lennossa. +STR_ERROR_AIRCRAFT_IS_IN_FLIGHT :{WHITE}Ilma-alus on lennossa # Order related errors STR_ERROR_NO_MORE_SPACE_FOR_ORDERS :{WHITE}Ei enää tilaa pysähdyksille. @@ -4611,7 +4624,7 @@ STR_ERROR_CAN_T_SHARE_ORDER_LIST :{WHITE}Käskyj STR_ERROR_CAN_T_STOP_SHARING_ORDER_LIST :{WHITE}Käskyjen jakamista ei voida lopettaa... STR_ERROR_CAN_T_COPY_ORDER_LIST :{WHITE}Käskyjä ei voida kopioida... STR_ERROR_TOO_FAR_FROM_PREVIOUS_DESTINATION :{WHITE}... liian kaukana edellisestä määränpäästä -STR_ERROR_AIRCRAFT_NOT_ENOUGH_RANGE :{WHITE}... lentokoneen toimintasäde ei ole tarpeeksi suuri +STR_ERROR_AIRCRAFT_NOT_ENOUGH_RANGE :{WHITE}... ilma-aluksen toimintasäde ei riitä # Timetable related errors STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Ei voi asettaa aikataulua. @@ -4723,7 +4736,7 @@ STR_SV_UNNAMED :Nimetön STR_SV_TRAIN_NAME :Juna {COMMA} STR_SV_ROAD_VEHICLE_NAME :Ajoneuvo {COMMA} STR_SV_SHIP_NAME :Laiva {COMMA} -STR_SV_AIRCRAFT_NAME :Lentokone {COMMA} +STR_SV_AIRCRAFT_NAME :Ilma-alus {COMMA} STR_SV_STNAME :{STRING} STR_SV_STNAME_NORTH :Pohjois-{STRING} diff --git a/src/lang/french.txt b/src/lang/french.txt index f7320f15f3..29655d4fc6 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -479,9 +479,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Afficher/Cacher la console STR_ABOUT_MENU_AI_DEBUG :Débogage de scripts 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 @@ -652,9 +649,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Personnalisé 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Volume sonore STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Volume des effets sonores -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAX -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}------ @@ -1316,6 +1310,7 @@ STR_CONFIG_SETTING_POPULATION_IN_LABEL :Afficher la pop STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Afficher la population des villes dans leur label sur la carte STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Épaisseur des lignes dans les graphiques{NBSP}: {STRING} STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Épaisseur de la ligne dans les graphiques. Une ligne fine est lisible plus précisément, une ligne épaisse est plus facile à voir et les couleurs sont plus facile à distinguer +STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Ajoute une ligne à la fenêtre d'achat des véhicules, montrant de quel NewGRF provient le véhicule sélectionné. STR_CONFIG_SETTING_LANDSCAPE :Paysage{NBSP}: {STRING} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Les paysages définissent les scénarios de jouabilité classique avec différentes marchandises et exigences pour la croissance des villes. Les NewGRFs et les scripts de jeux autorisent cependant un contrôle plus fin @@ -1553,6 +1548,10 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Complet STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Les journaux en couleur apparaissent en{NBSP}: {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Année à partir de laquelle les annonces des journaux sont imprimées en couleur. Avant cette année ils sont en noir et blanc STR_CONFIG_SETTING_STARTING_YEAR :Année de départ{NBSP}: {STRING} +STR_CONFIG_SETTING_ENDING_YEAR :Année de fin du jeu{NBSP}: {STRING} +STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :À la fin de cette année, le score de la compagnie est enregistré et la fenêtre des meilleurs scores est affichée. Il est quand même possible de continuer de jouer après, mais le score ne sera pas enregistré.{}Si le jeu commence après cette année, les meilleurs scores ne sont jamais affichés. +STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} +STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Jamais STR_CONFIG_SETTING_SMOOTH_ECONOMY :Permettre une économie stable (petits changements plus nombreux){NBSP}: {STRING} STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Lorsqu'il est activé, la production des industries change plus souvent, et plus faiblement. Ce paramètre est généralement sans effets si les types d'industries sont fournis par un NewGRF STR_CONFIG_SETTING_ALLOW_SHARES :Permettre d'acheter des actions d'autres compagnies{NBSP}: {STRING} @@ -3402,6 +3401,10 @@ STR_INDUSTRY_DIRECTORY_ITEM_PROD2 :{ORANGE}{INDUST STR_INDUSTRY_DIRECTORY_ITEM_PROD3 :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} STR_INDUSTRY_DIRECTORY_ITEM_PRODMORE :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} et {NUM} autre{P "" s}... STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Noms des industries - Cliquer sur un nom pour centrer la vue principale sur l'industrie. Ctrl-clic pour ouvrir une nouvelle vue sur l'industrie. +STR_INDUSTRY_DIRECTORY_ACCEPTED_CARGO_FILTER :{BLACK}Cargaison acceptée{NBSP}: {SILVER}{STRING} +STR_INDUSTRY_DIRECTORY_PRODUCED_CARGO_FILTER :{BLACK}Cargaison produite{NBSP}: {SILVER}{STRING} +STR_INDUSTRY_DIRECTORY_FILTER_ALL_TYPES :Tous les types de cargaison +STR_INDUSTRY_DIRECTORY_FILTER_NONE :Aucune # Industry view STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTRY} @@ -4176,6 +4179,14 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Sélecti STR_AI_LIST_CANCEL :{BLACK}Annuler STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Ne pas modifier le script +STR_SCREENSHOT_CAPTION :{WHITE}Faire une capture d'écran +STR_SCREENSHOT_SCREENSHOT :{BLACK}Capture d'écran normale +STR_SCREENSHOT_ZOOMIN_SCREENSHOT :{BLACK}Capture d'écran au zoom maximum +STR_SCREENSHOT_DEFAULTZOOM_SCREENSHOT :{BLACK}Capture d'écran sans zoom +STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Capture d'écran de toute la carte +STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Capture d'écran de la carte d'altitude +STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Capture d'écran de la mini-carte + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Paramètres STR_AI_SETTINGS_CAPTION_AI :IA diff --git a/src/lang/gaelic.txt b/src/lang/gaelic.txt index 565b08748a..c5b84d9a7e 100644 --- a/src/lang/gaelic.txt +++ b/src/lang/gaelic.txt @@ -658,9 +658,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Toglaich a' chonsoil STR_ABOUT_MENU_AI_DEBUG :Dì-bhugaich IF/sgriobt geama STR_ABOUT_MENU_SCREENSHOT :Glacadh-sgrìn -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Glacadh-sgrìn le sùmadh a-steach as motha -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Glacadh-sgrìn le sùmadh a-steach bunaiteach -STR_ABOUT_MENU_GIANT_SCREENSHOT :Glacadh-sgrìn leis a' mhapa shlàn STR_ABOUT_MENU_ABOUT_OPENTTD :Mu dheidhinn “OpenTTD" STR_ABOUT_MENU_SPRITE_ALIGNER :Co-thaobhaichear nan sprite STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Toglaich bogsaichean-iadhaidh @@ -841,9 +838,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Gnàthaichte 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Àirde a' chiùil STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Àirde nan èifeachdan fuaime -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}As lugha -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}As motha -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}------ @@ -4295,6 +4289,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Cleachd STR_AI_LIST_CANCEL :{BLACK}Sguir dheth STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Na atharraich an sgriobt + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}Paramadairean aig {STRING} STR_AI_SETTINGS_CAPTION_AI :IF diff --git a/src/lang/galician.txt b/src/lang/galician.txt index 0423a415ae..17939c8513 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -479,9 +479,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :(Des)Activar consola STR_ABOUT_MENU_AI_DEBUG :Depuración IA/script do xogo STR_ABOUT_MENU_SCREENSHOT :Captura de pantalla -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Achegar área capturada -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Zoom de captura de pantalla por defecto -STR_ABOUT_MENU_GIANT_SCREENSHOT :Captura de pantalla do mapa completo STR_ABOUT_MENU_SHOW_FRAMERATE :Mostrar frame rate STR_ABOUT_MENU_ABOUT_OPENTTD :Acerca de 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Aliñador de sprites @@ -652,9 +649,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Persoal 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Volume da música STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Volume dos efectos de son -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}------ @@ -4175,6 +4169,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Seleccio STR_AI_LIST_CANCEL :{BLACK}Cancelar STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Non cambia-lo script + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parámetros STR_AI_SETTINGS_CAPTION_AI :IA diff --git a/src/lang/german.txt b/src/lang/german.txt index e194fc2e59..0b1f8a2897 100644 --- a/src/lang/german.txt +++ b/src/lang/german.txt @@ -473,9 +473,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Konsole öffnen/schließen STR_ABOUT_MENU_AI_DEBUG :KI / Skript-Debug STR_ABOUT_MENU_SCREENSHOT :Screenshot (Standard: Strg+S) -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Screenshot in Nahaufnahme -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Screenshot mit normalem Zoom -STR_ABOUT_MENU_GIANT_SCREENSHOT :Riesiger Screenshot (Standard: Strg+G) STR_ABOUT_MENU_SHOW_FRAMERATE :Bildwiederholrate anzeigen STR_ABOUT_MENU_ABOUT_OPENTTD :Über OpenTTD STR_ABOUT_MENU_SPRITE_ALIGNER :Sprite-Ausrichtung @@ -646,9 +643,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Benutzerdef. 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Musiklautstärke STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Soundlautstärke -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAX -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}------ @@ -4120,6 +4114,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Ausgewä STR_AI_LIST_CANCEL :{BLACK}Abbrechen STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Skript nicht wechseln + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameter STR_AI_SETTINGS_CAPTION_AI :KI diff --git a/src/lang/greek.txt b/src/lang/greek.txt index efcc33e14b..a32ee99001 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -534,9 +534,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Εναλλαγή κονσόλας STR_ABOUT_MENU_AI_DEBUG :Αποσφαλμάτωση AI και δέσμης ενεργειών παιχνιδιού 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 :Ευθυγραμμιστής στοιχεών @@ -753,9 +750,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Προσαρμοσμένο 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Ένταση Μουσικής STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Ένταση Εφέ -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}ΕΛΑΧ -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}ΜΕΓ -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}------ @@ -4246,6 +4240,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Αποδ STR_AI_LIST_CANCEL :{BLACK}Άκυρωση STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Να μην γίνει αλλαγή δέσμης ενεργειών + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Παράμετροι STR_AI_SETTINGS_CAPTION_AI :AI diff --git a/src/lang/hebrew.txt b/src/lang/hebrew.txt index 00f29a7a19..2092f91bef 100644 --- a/src/lang/hebrew.txt +++ b/src/lang/hebrew.txt @@ -484,9 +484,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :פתח/סגור קונסולה STR_ABOUT_MENU_AI_DEBUG :דיבאג של סקריפטים של בינה מלאכותית או של המשחק 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 :מיישר ספרייטים @@ -657,9 +654,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}מותאם אישית 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}עוצמת מנגינת רקע STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}עוצמת הצלילים -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}מינ' -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}מקס' -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}------ @@ -4074,6 +4068,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK} בחר STR_AI_LIST_CANCEL :{BLACK}בטל STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}אל תשנה את התסריט + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} פרמטרים STR_AI_SETTINGS_CAPTION_AI :שחקן מחשב diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index d4e8d0f2ec..2de61c1ea6 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -541,9 +541,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Átváltás konzolra STR_ABOUT_MENU_AI_DEBUG :MI / Játékszkript nyomkövetés STR_ABOUT_MENU_SCREENSHOT :Képmentés -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Teljes nagyítású képmentés -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Alapértelmezett nagyítású képmentés -STR_ABOUT_MENU_GIANT_SCREENSHOT :Képmentés teljes térképről STR_ABOUT_MENU_SHOW_FRAMERATE :FPS ablak STR_ABOUT_MENU_ABOUT_OPENTTD :Az 'OpenTTD'-ről STR_ABOUT_MENU_SPRITE_ALIGNER :Sprite elhelyező @@ -714,9 +711,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Saját 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Zene Hangereje STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Hangok Hangereje -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAX -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}------ @@ -4232,6 +4226,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}A kijel STR_AI_LIST_CANCEL :{BLACK}Mégsem STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Ne változtassa a szkriptet + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Paraméterek STR_AI_SETTINGS_CAPTION_AI :MI diff --git a/src/lang/icelandic.txt b/src/lang/icelandic.txt index 48de9cd774..e3683ac89e 100644 --- a/src/lang/icelandic.txt +++ b/src/lang/icelandic.txt @@ -448,9 +448,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Kveikja á stýriskjá STR_ABOUT_MENU_AI_DEBUG :Aflúsun gervigreindar/forskrifta STR_ABOUT_MENU_SCREENSHOT :Skjámynd -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Súmuð inn skjáskot -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Taka skjáskot af súmi -STR_ABOUT_MENU_GIANT_SCREENSHOT :Risa skjámynd STR_ABOUT_MENU_ABOUT_OPENTTD :Um 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Samstilla hreyfimynd STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Sýna/fela afmörkunar kassa @@ -620,9 +617,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Sérval 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Tónlistarstyrkur STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Hljóðstyrkur -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}LÆGST -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}HÆST -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}------ @@ -3768,6 +3762,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Velja me STR_AI_LIST_CANCEL :{BLACK}Hætta við STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Hætta við breytingar forskriftar + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} breytur STR_AI_SETTINGS_CAPTION_AI :Gervigreindar diff --git a/src/lang/indonesian.txt b/src/lang/indonesian.txt index 4642ce4feb..45d98ef355 100644 --- a/src/lang/indonesian.txt +++ b/src/lang/indonesian.txt @@ -472,9 +472,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Hidup/matikan Layar Konsol STR_ABOUT_MENU_AI_DEBUG :Debug skrip AI STR_ABOUT_MENU_SCREENSHOT :Ambil gambar -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Ambil gambar dengan diperbesar -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Ambil gambar dengan perbesaran normal -STR_ABOUT_MENU_GIANT_SCREENSHOT :Ambil gambar keseluruhan peta STR_ABOUT_MENU_SHOW_FRAMERATE :Tampilkan laju bingkai STR_ABOUT_MENU_ABOUT_OPENTTD :Tentang 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Penjajar Sprite @@ -645,9 +642,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Bebas 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Volume Musik STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Volume Efek -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAKS -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}------ @@ -3304,6 +3298,7 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infrastr STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Bagian rel: STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Sinyal STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Bagian jalan: +STR_COMPANY_INFRASTRUCTURE_VIEW_TRAM_SECT :{GOLD}Bagian Trem: STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Perairan: STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanal STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stasiun: @@ -4067,6 +4062,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Pilih sk STR_AI_LIST_CANCEL :{BLACK}Batal STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Jangan mengubah skrip AI + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameter STR_AI_SETTINGS_CAPTION_AI :AI diff --git a/src/lang/irish.txt b/src/lang/irish.txt index 35830743f1..b1a58ed5b4 100644 --- a/src/lang/irish.txt +++ b/src/lang/irish.txt @@ -470,9 +470,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Scoránaigh consól STR_ABOUT_MENU_AI_DEBUG :Dífhabhtú AI/Scripteanna Cluiche STR_ABOUT_MENU_SCREENSHOT :Seat scáileáin -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Seat scáileáin zúmáilte isteach go hiomlán -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Seat scáileáin le zúm réamhshocraithe -STR_ABOUT_MENU_GIANT_SCREENSHOT :Seat scáileáin den léarscáil ar fad STR_ABOUT_MENU_ABOUT_OPENTTD :Maidir le 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Ailínóir spriteanna STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Scoránaigh boscaí imill @@ -642,9 +639,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Saincheaptha 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Airde Ceoil STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Airde na maisíochtaí -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}ÍOSTA -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}UASTA -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}------ @@ -4000,6 +3994,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Roghnaig STR_AI_LIST_CANCEL :{BLACK}Cuir ar ceal STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Ná hathraigh an AI + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}Paraiméadair {STRING} STR_AI_SETTINGS_CAPTION_AI :AI diff --git a/src/lang/italian.txt b/src/lang/italian.txt index 47d4414614..13aa90c0dd 100644 --- a/src/lang/italian.txt +++ b/src/lang/italian.txt @@ -480,9 +480,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Apri/chiudi console STR_ABOUT_MENU_AI_DEBUG :Debug IA/Script 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 @@ -653,9 +650,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Personale 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Volume musica STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Volume effetti -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAX -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}------ @@ -872,6 +866,7 @@ STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE :{BIG_FONT}{BLAC STR_NEWS_NEW_VEHICLE_TYPE :{BIG_FONT}{BLACK}{ENGINE} STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE :{BLACK}Nuov{G o o a} {STRING} disponibile! - {ENGINE} +STR_NEWS_SHOW_VEHICLE_GROUP_TOOLTIP :{BLACK}Apri la finestra del gruppo focalizzata sul gruppo del veicolo STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO :{WHITE}{STATION} non accetta più {STRING} STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO_OR_CARGO :{WHITE}{STATION} non accetta più {STRING} né {STRING} @@ -1338,6 +1333,8 @@ STR_CONFIG_SETTING_POPULATION_IN_LABEL :Mostra la popol STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Mosta la popolazione delle città nella loro etichetta sulla mappa STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Spessore delle linee nei grafici: {STRING} STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Larghezza delle linee nei grafici. Le linee sottili sono più leggibili, quelle più spesse sono più facili da vedere e i colori più facili da distinguere +STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :Mostra il nome dei NewGRF nella finestra di costruzione dei veicoli: {STRING} +STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Aggiungi una linea alla finestra di costruzione dei veicoli, in modo da mostrare da quale NewGRF proviene il veicolo selezionato. STR_CONFIG_SETTING_LANDSCAPE :Paesaggio: {STRING} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :I paesaggi definiscono scenari di gioco di base che differiscono per i carichi disponibili e per i requisiti di crescita delle città. NewGRF e Script offrono tuttavia un controllo più fine su questi aspetti @@ -1575,10 +1572,16 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Completo STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Giornali a colori dal: {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Anno a partire dal quale le notizie di giornale vengono stampate a colori. Prima di quest'anno, viene utilizzata la monocromia in bianco e nero STR_CONFIG_SETTING_STARTING_YEAR :Anno di inizio: {STRING} +STR_CONFIG_SETTING_ENDING_YEAR :Punteggi a fine anno: {STRING} +STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Anno in cui il gioco finisce per poter calcolare i punteggi. Alla fine di ques'tanno il punteggio della compagnia viene registrato e viene mostrata la schermata con i punteggi più alti, ma il giocatore può continuare a giocare anche dopo.{}Se quest'anno precede quello di inizio, la schermata dei punteggi non verrà mai mostrata. +STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} +STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Mai STR_CONFIG_SETTING_SMOOTH_ECONOMY :Abilita economia fluida (cambiamenti piccoli e frequenti): {STRING} STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Se abilitata, la produzione industriale cambia più spesso e a passi più piccoli. Questa impostazione non ha in genere effetto per i tipi di industria aggiunti da un NewGRF STR_CONFIG_SETTING_ALLOW_SHARES :Permetti l'acquisto di azioni di altre compagnie: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Se abilitata, consente l'acquisto e la vendita di azioni delle compagnie. Le azioni sono disponibili solo per le compagnie che hanno raggiunto una certa età minima +STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Età minima della compagnia per lo scambio delle sue azioni: {STRING} +STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES_HELPTEXT :Imposta l'età minima di una compagnia affinchè sia possibile acquistarne o venderne le azioni. STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Percentuale profitto da pagare per una tappa di trasferimento: {STRING} STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :Percentuale di ricavi assegnata ai tratti secondari di una catena di trasferimenti. In questo viene dato un maggiore controllo sulla situazione dei ricavi STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :Trascinando il cursore, piazza i segnali ogni: {STRING} @@ -3421,8 +3424,17 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL :{WHITE}{CURRENC # Industry directory STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Industrie STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- Nessuna - +STR_INDUSTRY_DIRECTORY_ITEM_INFO :{BLACK}{CARGO_LONG}{STRING}{YELLOW} ({COMMA}% trasportato){BLACK} STR_INDUSTRY_DIRECTORY_ITEM_NOPROD :{ORANGE}{INDUSTRY} +STR_INDUSTRY_DIRECTORY_ITEM_PROD1 :{ORANGE}{INDUSTRY} {STRING} +STR_INDUSTRY_DIRECTORY_ITEM_PROD2 :{ORANGE}{INDUSTRY} {STRING}, {STRING} +STR_INDUSTRY_DIRECTORY_ITEM_PROD3 :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} +STR_INDUSTRY_DIRECTORY_ITEM_PRODMORE :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} e {NUM} ancora... STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Nomi delle industrie - fare clic su un nome per centrare la visuale sull'industria. CTRL+clic la mostra in una mini visuale. +STR_INDUSTRY_DIRECTORY_ACCEPTED_CARGO_FILTER :{BLACK}Carichi accettati: {SILVER}{STRING} +STR_INDUSTRY_DIRECTORY_PRODUCED_CARGO_FILTER :{BLACK}Carico prodotto: {SILVER}{STRING} +STR_INDUSTRY_DIRECTORY_FILTER_ALL_TYPES :Tutti i tipi di carico +STR_INDUSTRY_DIRECTORY_FILTER_NONE :Nessuno # Industry view STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTRY} @@ -4197,6 +4209,14 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Sceglie STR_AI_LIST_CANCEL :{BLACK}Annulla STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Non modifica lo script utilizzato +STR_SCREENSHOT_CAPTION :{WHITE}Cattura uno screenshot +STR_SCREENSHOT_SCREENSHOT :{BLACK}Screenshot normale +STR_SCREENSHOT_ZOOMIN_SCREENSHOT :{BLACK}Livello di zoom massimo nello screenshot +STR_SCREENSHOT_DEFAULTZOOM_SCREENSHOT :{BLACK}Livello di zoom normale nello screenshot +STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Screenshot di tutta la mappa +STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Screenshot della heightmap +STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Screenshot della minimappa + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}Parametri {STRING} STR_AI_SETTINGS_CAPTION_AI :AI diff --git a/src/lang/japanese.txt b/src/lang/japanese.txt index 8c32715c71..9f9fb99ff7 100644 --- a/src/lang/japanese.txt +++ b/src/lang/japanese.txt @@ -470,9 +470,6 @@ STR_ABOUT_MENU_SEPARATOR :――――― STR_ABOUT_MENU_TOGGLE_CONSOLE :コンソールの表示切替 STR_ABOUT_MENU_AI_DEBUG :AI/ゲームスクリプトのデバッグ STR_ABOUT_MENU_SCREENSHOT :スクリーンショット撮影(現在のズーム) -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :スクリーンショット撮影(最大ズーム) -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :スクリーンショット撮影(標準ズーム) -STR_ABOUT_MENU_GIANT_SCREENSHOT :スクリーンショット撮影(マップ全体) STR_ABOUT_MENU_ABOUT_OPENTTD :OpenTTDについて STR_ABOUT_MENU_SPRITE_ALIGNER :スプライトを整列 STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :バウンディングボックスの表示切替 @@ -642,9 +639,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}カスタム2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}音楽音量 STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}効果音音量 -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}最小 -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}最大 -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}------ @@ -4003,6 +3997,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}選択 STR_AI_LIST_CANCEL :{BLACK}キャンセル STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}スクリプトを変更しません + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} パラメータ STR_AI_SETTINGS_CAPTION_AI :AI diff --git a/src/lang/korean.txt b/src/lang/korean.txt index cacac9e7a5..eae3d2cb1b 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -479,9 +479,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :콘솔 켜기/끄기 STR_ABOUT_MENU_AI_DEBUG :인공지능/게임 스크립트 디버그 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 :스프라이트 정렬도구 @@ -652,9 +649,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}사용자 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}음량 STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}효과 음량 -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}최소 -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}최대 -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}------ @@ -797,8 +791,8 @@ STR_NEWS_FIRST_SHIP_ARRIVAL :{BIG_FONT}{BLAC STR_NEWS_FIRST_AIRCRAFT_ARRIVAL :{BIG_FONT}{BLACK}시민들이 축하하고 있습니다 . . .{}{STATION}에 처음으로 항공기가 도착했습니다! STR_NEWS_TRAIN_CRASH :{BIG_FONT}{BLACK}열차 충돌 사고!{}충돌로 인한 폭발로 {COMMA}명의 사망자가 발생하였습니다! -STR_NEWS_ROAD_VEHICLE_CRASH_DRIVER :{BIG_FONT}{BLACK}차량 충돌!{}열차와의 충돌로 인해 운전자가 사망했습니다! -STR_NEWS_ROAD_VEHICLE_CRASH :{BIG_FONT}{BLACK}차량 충돌!{}열차와의 충돌로 {COMMA}명이 사망했습니다! +STR_NEWS_ROAD_VEHICLE_CRASH_DRIVER :{BIG_FONT}{BLACK}차량 충돌!{}열차 충돌로 운전자가 사망했습니다! +STR_NEWS_ROAD_VEHICLE_CRASH :{BIG_FONT}{BLACK}차량 충돌!{}열차 충돌로 {COMMA}명이 사망했습니다! STR_NEWS_AIRCRAFT_CRASH :{BIG_FONT}{BLACK}항공기 충돌사고 발생!{}{COMMA}명이 {STATION}공항에서 사망하였습니다! STR_NEWS_PLANE_CRASH_OUT_OF_FUEL :{BIG_FONT}{BLACK}항공기 추락사고 발생!{}연료 부족으로 인하여 {COMMA}명이 사망하였습니다! @@ -871,6 +865,7 @@ STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE :{BIG_FONT}{BLAC STR_NEWS_NEW_VEHICLE_TYPE :{BIG_FONT}{BLACK}{ENGINE} STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE :{BLACK}신형 {STRING}{G 0 "을" "를"} 사용할 수 있습니다! - {ENGINE} +STR_NEWS_SHOW_VEHICLE_GROUP_TOOLTIP :{BLACK}이 차량이 속한 차량 그룹 목록 열기 STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO :{WHITE}{STATION}에서 더 이상 {STRING}{G 1 "을" "를"} 받지 않습니다. STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO_OR_CARGO :{WHITE}{STATION}에서 더 이상 {STRING}/{STRING}{G 2 "을" "를"} 받지 않습니다. @@ -1315,6 +1310,8 @@ STR_CONFIG_SETTING_POPULATION_IN_LABEL :도시 이름 STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :도시 이름 옆에 도시의 인구 수를 표시합니다. STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :그래프 선의 두께: {STRING} STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :그래프의 선 두께를 설정합니다. 얇으면 자세히 볼 수 있고, 두꺼우면 눈에 확 들어오며 색상을 분간하기가 편해집니다. +STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :차량 구입 창에 NewGRF 이름 표시: {STRING} +STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :차량 구입 창 맨 아래 줄에, 이 차량이 어떤 NewGRF에서 추가되는 지 해당 NewGRF의 이름을 표시해줍니다. STR_CONFIG_SETTING_LANDSCAPE :지형: {STRING} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :지형에 따라 화물과 도시 성장 요구 조건이 다른 게임 플레이 시나리오가 만들어집니다. NewGRF과 게임 스크립트를 통해 세밀한 조절이 가능합니다. @@ -1552,6 +1549,10 @@ 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_ENDING_YEAR :게임 종료 연도: {STRING} +STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :점수를 기록할 게임 종료 연도를 설정합니다. 이 연도가 지나면, 회사의 점수가 고득점 순위표에 기록되어 표시됩니다. 하지만 플레이어는 계속해서 게임을 진행할 수 있습니다.{}이 값이 시작 연도보다 이전으로 설정되어 있다면, 고득점 순위표는 나타나지 않습니다. +STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} +STR_CONFIG_SETTING_ENDING_YEAR_ZERO :안 함 STR_CONFIG_SETTING_SMOOTH_ECONOMY :부드러운 경제 변화 사용 (자주, 조금씩 변화): {STRING} STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :이 설정을 켜면, 1차 산업시설의 생산량이 소량으로 자주 변하게 됩니다. NewGRF로 추가한 산업시설에는 적용되지 않습니다. STR_CONFIG_SETTING_ALLOW_SHARES :다른 회사의 지분을 사는 것을 허용: {STRING} @@ -1587,7 +1588,7 @@ STR_CONFIG_SETTING_TOWN_LAYOUT_BETTER_ROADS :개선된 도 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 :도시 스스로 도로를 건설하는 것을 허용: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :도시가 성장하기 위해 도로를 건설할 수 있도록 허용합니다. 도시 당국이 스스로 도로를 만들지 못하도록 하려면 이 설정을 끄십시오. STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :도시가 회사 소유의 선로에 건널목을 만드는 것을 허용: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :도시가 회사 소유의 선로에 건널목을 건설할 수 있도록 허용합니다. @@ -2135,7 +2136,7 @@ STR_COMPANY_PASSWORD_MAKE_DEFAULT_TOOLTIP :{BLACK}이 회 STR_COMPANY_VIEW_JOIN :{BLACK}참여 STR_COMPANY_VIEW_JOIN_TOOLTIP :{BLACK}이 회사로 참가해서 플레이합니다 STR_COMPANY_VIEW_PASSWORD :{BLACK}암호 -STR_COMPANY_VIEW_PASSWORD_TOOLTIP :{BLACK}다른 참가자가 이 회사로의 플레이를 하지 못하도록 암호로 보호합니다 +STR_COMPANY_VIEW_PASSWORD_TOOLTIP :{BLACK}다른 참가자가 이 회사에 참여하여 플레이하지 못 하도록 암호로 보호합니다 STR_COMPANY_VIEW_SET_PASSWORD :{BLACK}회사 암호 설정 # Network chat @@ -2168,6 +2169,7 @@ STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}잘못 STR_NETWORK_ERROR_SERVER_FULL :{WHITE}서버에 인원이 가득 찼습니다 STR_NETWORK_ERROR_SERVER_BANNED :{WHITE}서버 관리자에 의해 접속이 차단되었습니다 STR_NETWORK_ERROR_KICKED :{WHITE}서버에서 강제로 추방되었습니다 +STR_NETWORK_ERROR_KICK_MESSAGE :{WHITE}사유: {STRING} STR_NETWORK_ERROR_CHEATER :{WHITE}이 서버에서 치트를 사용할 수 없습니다 STR_NETWORK_ERROR_TOO_MANY_COMMANDS :{WHITE}서버에 너무 많은 명령을 보냈습니다 STR_NETWORK_ERROR_TIMEOUT_PASSWORD :{WHITE}비밀번호 입력 시간을 초과하였습니다 @@ -2227,6 +2229,7 @@ STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} STR_NETWORK_MESSAGE_GAVE_MONEY_AWAY :*** {1:STRING} 님에게 {2:CURRENCY_LONG}만큼의 돈을 보냈습니다 STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}서버가 게임을 종료하였습니다 STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}서버가 재시작되고 있습니다...{}기다려주세요... +STR_NETWORK_MESSAGE_KICKED :*** {STRING} - 서버에서 강제로 추방되었습니다. 사유: ({STRING}) # Content downloading window STR_CONTENT_TITLE :{WHITE}콘텐츠 다운로드 @@ -3401,6 +3404,10 @@ STR_INDUSTRY_DIRECTORY_ITEM_PROD2 :{ORANGE}{INDUST STR_INDUSTRY_DIRECTORY_ITEM_PROD3 :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} STR_INDUSTRY_DIRECTORY_ITEM_PRODMORE :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} 및 {NUM}종의 화물 STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}산업시설 이름 - 산업시설로 이동하려면 이름을 클릭하세요. CTRL+클릭하면 이 산업시설의 위치를 기준으로 새로운 외부 화면을 엽니다 +STR_INDUSTRY_DIRECTORY_ACCEPTED_CARGO_FILTER :{BLACK}받는 화물: {SILVER}{STRING} +STR_INDUSTRY_DIRECTORY_PRODUCED_CARGO_FILTER :{BLACK}생산 화물: {SILVER}{STRING} +STR_INDUSTRY_DIRECTORY_FILTER_ALL_TYPES :모든 화물 +STR_INDUSTRY_DIRECTORY_FILTER_NONE :없음 # Industry view STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTRY} @@ -4175,6 +4182,14 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}선택 STR_AI_LIST_CANCEL :{BLACK}취소 STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}인공지능 스크립트를 바꾸지 않습니다 +STR_SCREENSHOT_CAPTION :{WHITE}스크린 샷 찍기 +STR_SCREENSHOT_SCREENSHOT :{BLACK}일반 스크린 샷 +STR_SCREENSHOT_ZOOMIN_SCREENSHOT :{BLACK}최대 확대 스크린 샷 (UI 없음) +STR_SCREENSHOT_DEFAULTZOOM_SCREENSHOT :{BLACK}기본 확대 스크린 샷 (UI 없음) +STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}지도 전체 스크린 샷 +STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}높이맵 스크린 샷 +STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}미니맵 스크린 샷 + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} 매개 변수 STR_AI_SETTINGS_CAPTION_AI :인공지능 diff --git a/src/lang/latin.txt b/src/lang/latin.txt index 23fe40a358..687cf345ae 100644 --- a/src/lang/latin.txt +++ b/src/lang/latin.txt @@ -661,9 +661,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Monstrare celareve consolam STR_ABOUT_MENU_AI_DEBUG :Emendatio IA/Ludi scriptorum STR_ABOUT_MENU_SCREENSHOT :Imago conspectus -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Imago conspectus maxime amplificata -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Imago conspectus solite amplificata -STR_ABOUT_MENU_GIANT_SCREENSHOT :Imago cunctae tabulae geographicae STR_ABOUT_MENU_ABOUT_OPENTTD :De 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Norma spiritus STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Monstrare celareve arcas finitionum @@ -833,9 +830,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Propria II STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Amplitudo Musicae STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Amplitido Sonorum -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAX -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}------ @@ -4295,6 +4289,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Eligere STR_AI_LIST_CANCEL :{BLACK}Cancellare STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Non scriptum mutare + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametra STR_AI_SETTINGS_CAPTION_AI :IA diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt index 1fb3bff1be..4750b893dc 100644 --- a/src/lang/latvian.txt +++ b/src/lang/latvian.txt @@ -470,9 +470,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Atvērt/aizvērt konsoli STR_ABOUT_MENU_AI_DEBUG :MI/spēles skriptu atkļūdošana STR_ABOUT_MENU_SCREENSHOT :Ekrānuzņēmums -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 @@ -643,9 +640,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Pielāgotā 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Mūzikas skaļums STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Efektu skaļums -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAKS -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}------ @@ -3937,6 +3931,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Izvēlē STR_AI_LIST_CANCEL :{BLACK}Atcelt STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Nemainīt skriptu + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} parametri STR_AI_SETTINGS_CAPTION_AI :MI diff --git a/src/lang/lithuanian.txt b/src/lang/lithuanian.txt index 9deca5c1e0..6c8ebaa3fd 100644 --- a/src/lang/lithuanian.txt +++ b/src/lang/lithuanian.txt @@ -665,9 +665,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Perjungti konsolę STR_ABOUT_MENU_AI_DEBUG :AI / GameScript derinimas STR_ABOUT_MENU_SCREENSHOT :Ekrano nuotrauka -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Ekrano nuotrauka iš arti -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Nepriartintas ekrano vaizdas -STR_ABOUT_MENU_GIANT_SCREENSHOT :Fotografuoti viso ekrano vaizdą STR_ABOUT_MENU_ABOUT_OPENTTD :Apie „OpenTTD“ STR_ABOUT_MENU_SPRITE_ALIGNER :Spruklių lygiuoklė STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Rodyti/slėpti apvadus @@ -837,9 +834,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Speciali 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Muzikos garsas STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Efektų garsas -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAX -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}------ @@ -4275,6 +4269,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Pasirink STR_AI_LIST_CANCEL :{BLACK}Atšaukti STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Nekeisti skripto + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametrai STR_AI_SETTINGS_CAPTION_AI :DI diff --git a/src/lang/luxembourgish.txt b/src/lang/luxembourgish.txt index 8f6457be57..af1f380672 100644 --- a/src/lang/luxembourgish.txt +++ b/src/lang/luxembourgish.txt @@ -235,6 +235,8 @@ STR_TOOLTIP_FILTER_CRITERIA :{BLACK}Filterkr STR_BUTTON_SORT_BY :{BLACK}Sortéier no STR_BUTTON_LOCATION :{BLACK}Plaz STR_BUTTON_RENAME :{BLACK}Ëmbenennen +STR_BUTTON_CATCHMENT :{BLACK}Reechwäit +STR_TOOLTIP_CATCHMENT :{BLACK}Reechwäit uweisen un/ausschalten STR_TOOLTIP_CLOSE_WINDOW :{BLACK}Fënster zoumaachen STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS :{BLACK}Fënstertitel - hei zéien fir d'Fënster ze bewegen @@ -263,6 +265,7 @@ STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}Mat dës STR_BUTTON_DEFAULT :{BLACK}Standard STR_BUTTON_CANCEL :{BLACK}Ofbriechen STR_BUTTON_OK :{BLACK}OK +STR_WARNING_PASSWORD_SECURITY :{YELLOW}Warnung: Server-Administratoren kënnen all Text aus desem Feld liesen. # On screen keyboard window STR_OSK_KEYBOARD_LAYOUT :§1234567890'^\qwertzuiopè¨asdfghjkléà yxcvbnm,.- . @@ -336,6 +339,7 @@ STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}Vergréi STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}Verklenger d'Sicht STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Schinne bauen STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}Stroosse bauen +STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}Tramway bauen STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}Schëffhafe bauen STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}Fluchhafe bauen STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}Landschafts-Toolbar opman fir Land ze erhéijen/senken, Beem planzen, etc. @@ -356,6 +360,7 @@ STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}Landscha STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Stiederstellung STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Industrieerstellung STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Stroossebau +STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Tramkonstruktioun STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Beem planzen. Shift wiesselt tëscht bauen/ongeféier Käschten uweisen STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Schëld opstellen STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Objet plazéiren. Shift wiesselt tëscht bauen/ongeféier Käschten uweisen @@ -473,9 +478,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Konsole un/aus STR_ABOUT_MENU_AI_DEBUG :KI / Spill-Script Debug STR_ABOUT_MENU_SCREENSHOT :Screenshot (Ctrl+S) -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Voll eragezoomte Screenshot -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Standard Zoom Screenshot -STR_ABOUT_MENU_GIANT_SCREENSHOT :Screenshot vun der ganzer Kaart STR_ABOUT_MENU_SHOW_FRAMERATE :Biller pro Sekonn uweisen STR_ABOUT_MENU_ABOUT_OPENTTD :Iwwert 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Sprite Alignéirer @@ -646,9 +648,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Benotzerdéf. 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Musikvolume STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Volume vun den Effekter -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAX -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}------ @@ -790,11 +789,11 @@ STR_NEWS_FIRST_CARGO_TRAM_ARRIVAL :{BIG_FONT}{BLAC STR_NEWS_FIRST_SHIP_ARRIVAL :{BIG_FONT}{BLACK}Bierger feieren . . .{}Éischt Schëff kënnt zu {STATION} un! STR_NEWS_FIRST_AIRCRAFT_ARRIVAL :{BIG_FONT}{BLACK}Bierger feieren . . .{}Éischte Fliger kënnt zu {STATION} un! -STR_NEWS_TRAIN_CRASH :{BIG_FONT}{BLACK}Zuchakzident!{}{COMMA} Leit stiewen an der Explosioun nom Akzident -STR_NEWS_ROAD_VEHICLE_CRASH_DRIVER :{BIG_FONT}{BLACK}Stroossenakzident!{}Fuerer stierft an der Explosioun no Akzident mat Zuch -STR_NEWS_ROAD_VEHICLE_CRASH :{BIG_FONT}{BLACK}Stroossegefierakzident!{}{COMMA} Leit stiewen an der Explosioun no Akzident mam Zuch -STR_NEWS_AIRCRAFT_CRASH :{BIG_FONT}{BLACK}Fligerakzident!{}{COMMA} Leit stiewen an der Explosioun bei {STATION} -STR_NEWS_PLANE_CRASH_OUT_OF_FUEL :{BIG_FONT}{BLACK}Fligerakzident!{}Fliger hat kee Bensin méi, {COMMA} Leit stiewen an Explosioun! +STR_NEWS_TRAIN_CRASH :{BIG_FONT}{BLACK}Zuchaccident!{}{COMMA} Leit stiewen an der Explosioun nom Accident +STR_NEWS_ROAD_VEHICLE_CRASH_DRIVER :{BIG_FONT}{BLACK}Stroossenaccident!{}Fuerer stierft an der Explosioun no Accident mat Zuch +STR_NEWS_ROAD_VEHICLE_CRASH :{BIG_FONT}{BLACK}Stroossegefieraccident!{}{COMMA} Leit stiewen an der Explosioun no Accident mam Zuch +STR_NEWS_AIRCRAFT_CRASH :{BIG_FONT}{BLACK}Fligeraccident!{}{COMMA} Leit stiewen an der Explosioun bei {STATION} +STR_NEWS_PLANE_CRASH_OUT_OF_FUEL :{BIG_FONT}{BLACK}Fligeraccident!{}Fliger hat kee Bensin méi, {COMMA} Leit stiewen an Explosioun! STR_NEWS_DISASTER_ZEPPELIN :{BIG_FONT}{BLACK}Zeppelinkatastroph zu {STATION}! STR_NEWS_DISASTER_SMALL_UFO :{BIG_FONT}{BLACK}Stroossegefier bei 'UFO'-Zesummestouss zerstéiert! @@ -865,6 +864,7 @@ STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE :{BIG_FONT}{BLAC STR_NEWS_NEW_VEHICLE_TYPE :{BIG_FONT}{BLACK}{ENGINE} STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE :{BLACK}Neie/Neit {STRING} verfügbar! - {ENGINE} +STR_NEWS_SHOW_VEHICLE_GROUP_TOOLTIP :{BLACK}Maach d'Gruppefenster op, fokusséiert op der Gefiergrupp STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO :{WHITE}{STATION} akzeptéiert {STRING} net méi STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO_OR_CARGO :{WHITE}{STATION} akzeptéiert {STRING} oder {STRING} net méi @@ -885,9 +885,9 @@ STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION :{BIG_FONT}{BLAC # Extra view window STR_EXTRA_VIEW_PORT_TITLE :{WHITE}Usiicht {COMMA} -STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Kopéiert op d'Usiicht +STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Ännert d'Usiicht STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT :{BLACK}Kopéiert d'Plaz vun der globaler Usiicht op des Usiicht -STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Vun der Usiicht drasetzen +STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Haptusiicht änneren STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Setzt d'Plaz vun dëser Usiicht op déi global Usiicht # Game options window @@ -932,6 +932,9 @@ STR_GAME_OPTIONS_CURRENCY_GEL :Georgesche Lari STR_GAME_OPTIONS_CURRENCY_IRR :Iranësche Rial (IRR) STR_GAME_OPTIONS_CURRENCY_RUB :Neie Russesche Rubel (RUB) STR_GAME_OPTIONS_CURRENCY_MXN :Mexikanesche Peso (MXN) +STR_GAME_OPTIONS_CURRENCY_NTD :New Taiwan Dollar (NTD) +STR_GAME_OPTIONS_CURRENCY_CNY :Chinesesch Renminbi (CNY) +STR_GAME_OPTIONS_CURRENCY_HKD :Hong Kong Dollar (HKD) ############ end of currency region STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Stroossegefierer @@ -1178,12 +1181,13 @@ STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT :Wielt aus, wéi STR_CONFIG_SETTING_MAX_HEIGHTLEVEL :Maximal Kaartenhéicht: {STRING} STR_CONFIG_SETTING_MAX_HEIGHTLEVEL_HELPTEXT :Setzt déi maximal erlabten Héicht fir Bierger op dëser Kaart -STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN :{WHITE}Du kanns d'maximal Kaartenhéischt net op dësen Wäert setzen. Op manst ee Bierg op der Kaart ass méi héich +STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN :{WHITE}Du kanns d'maximal Kaartenhéicht net op dëse Wäert setzen. Op manst ee Bierg op der Kaart ass méi héich STR_CONFIG_SETTING_AUTOSLOPE :Erlaabt Landformung ënnert Gebaier, Stroossen, etc.: {STRING} STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :Erlaabt Terraintransformatioun ënnert Gebaier an Schinnen ouni dës ewechzehuelen STR_CONFIG_SETTING_CATCHMENT :Erlaabt méi realistësch Einzugsberäicher: {STRING} STR_CONFIG_SETTING_CATCHMENT_HELPTEXT :Statiounen a Fluchhäfen hunn verschidde grouss Einzugsberäicher STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES :Gare vun der Firma kënnen Industrie beliwwere mat neutrale Statiounen: {STRING} +STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES_HELPTEXT :Wann ugeschalt dierefen Industrien mat agebaute Statiounen (z.b Buerinselen) och vu Firmestatiounen déi an der Géigend gebaut goufen beliwwert ginn. Wann ausgeschalt, dierfen se just vun den agebaute Statioune benotzt ginn. An der Géigend gebaute Firmestatiounen wärten se net benotzen an déi agebaute Statiounen beliwweren och keen ausser d'Industrie selwer. STR_CONFIG_SETTING_EXTRADYNAMITE :Erlaabt d'Ewechhuelen vu méi Stroossen, Brécken, etc. vun der Stad: {STRING} STR_CONFIG_SETTING_EXTRADYNAMITE_HELPTEXT :Mach et méi einfach fir Infrastruktur oder Gebaier ewechzehuelen déi enger Stad gehéiren STR_CONFIG_SETTING_TRAIN_LENGTH :Maximal Längt vun Zich: {STRING} @@ -1200,8 +1204,8 @@ STR_CONFIG_SETTING_TRAIN_SLOPE_STEEPNESS_HELPTEXT :Steigung vun en STR_CONFIG_SETTING_PERCENTAGE :{COMMA}% STR_CONFIG_SETTING_ROAD_VEHICLE_SLOPE_STEEPNESS :Hangsteigung fir Stroossegefierer: {STRING} STR_CONFIG_SETTING_ROAD_VEHICLE_SLOPE_STEEPNESS_HELPTEXT :Steigung vun engem Hang fir Stroossegefierer. Méi grouss Wäerter mécht et méi schwéier den Hang ropzefueren -STR_CONFIG_SETTING_FORBID_90_DEG :Verbidd Zich an Schëffer fir 90°-Kéieren ze maachen: {STRING} -STR_CONFIG_SETTING_FORBID_90_DEG_HELPTEXT :90°-Kéieren entsti wann eng horizontal Spur direkt op eng vertikal trëfft, sou dass den Zuch misst ëm 90 Grad dréinen fir op dat nächst Stéck ze kommen, amplaz vun den üblechen 45 Grad. Dëst zielt och fir d'Weeër vu Schëffer +STR_CONFIG_SETTING_FORBID_90_DEG :Verbidd Zich fir 90°-Kéieren ze maachen: {STRING} +STR_CONFIG_SETTING_FORBID_90_DEG_HELPTEXT :90°-Kéieren entsti wann eng horizontal Spur direkt op eng vertikal trëfft, sou dass den Zuch misst ëm 90 Grad dréinen fir op dat nächst Stéck ze kommen, amplaz vun den üblechen 45 Grad. STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS :Erlaabt Statiounen zesummen ze setzen och wann se net direkt uneneen leien: {STRING} STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT :Erlaabt Statiounsdeeler un eng Statioun unzehenken ouni déi existéiernd Statioun ze beréiren. Ctr+Klick fir déi nei Deeler unzehenken STR_CONFIG_SETTING_INFLATION :Inflatioun: {STRING} @@ -1256,9 +1260,9 @@ STR_CONFIG_SETTING_FREIGHT_TRAINS_HELPTEXT :Leet den Impakt STR_CONFIG_SETTING_PLANE_SPEED :Fligergeschwindegkeetsfaktor: {STRING} STR_CONFIG_SETTING_PLANE_SPEED_HELPTEXT :Leet d'relativ Geschwindegkeet vu Fligeren am Verglach mat anere Gefierer fest, fir d'Akomme vum Transport vu Fligeren ze reduzéiren STR_CONFIG_SETTING_PLANE_SPEED_VALUE :1 / {COMMA} -STR_CONFIG_SETTING_PLANE_CRASHES :Unzuel Fligerakzidenter: {STRING} -STR_CONFIG_SETTING_PLANE_CRASHES_HELPTEXT :Leet d'Chance fir en Fligerakzident fest -STR_CONFIG_SETTING_PLANE_CRASHES_NONE :Keng +STR_CONFIG_SETTING_PLANE_CRASHES :Unzuel Fligeraccidenter: {STRING} +STR_CONFIG_SETTING_PLANE_CRASHES_HELPTEXT :Leet d'Chance fir enzoufällegen Fligeraccident fest.{}* Grouss Fligeren hunn emmer en Accidents-Risiko wann se op engem klenge Fluchhafen landen +STR_CONFIG_SETTING_PLANE_CRASHES_NONE :Keng* STR_CONFIG_SETTING_PLANE_CRASHES_REDUCED :Reduzéiert STR_CONFIG_SETTING_PLANE_CRASHES_NORMAL :Normal STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Erlaabt d'Iwwerfueren vu Stopschëlder op Stroossen vun der Stad: {STRING} @@ -1270,6 +1274,7 @@ STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE :Infrastrukturë STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :Wann ugeschalt, kaschten Infrastrukturen Ennerhaltskäschten. D'Käschten wuessen iwwerproportional zu der Netzwierkgréisst, an treffen sou grouss Firmen méi wéi klenger STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR :Firmefaarw um Start: {STRING} +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_HELPTEXT :Wiel d'Startfaarw vun der Firma STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :Fluchhäfen lafen nie of: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :Wann ugeschalt, bleift all Fluchhafentyp säit senger Aféierung bestoen @@ -1315,8 +1320,8 @@ STR_CONFIG_SETTING_TERRAIN_TYPE :Terraintyp: {ST STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(Nëmmen TerraGenesis) Hiwwelegkeet vun der Landschaft STR_CONFIG_SETTING_INDUSTRY_DENSITY :Industriedicht: {STRING} STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Definéiert wéivill Industrien generéiert sollen ginn an wéivill der während dem Spill sollen behalen ginn. -STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Maximal Distanz vum Kaartenenn bis zu enger Uelegraffinerie: {STRING} -STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Uelëgraffinerien ginn nëmmen um Rand gebaut, dat ass un der Küst fir Inselkaarten +STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Maximal Distanz vum Kaarterand bis zu enger Uelegindustrie: {STRING} +STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Limitéiert wéi wäit vum Bord Uelegraffinerien an Buerinsele dierfe gebaut ginn. Op Inselkaarten garantéiert dest dass se um Rand gebaut ginn. Op Kaarten mat méi wéi 256 Felder, gett dese Wert skaléiert STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Schnéigrenz Héicht: {STRING} STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Kontrolléiert ab welcher Héicht de Schnéi ufenkt an der subarktëscher Landschaft. Schnéi affektéiert och Industriegeneratioun an de Wuesstum vu Stied. STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Knubbelegkeet vum Terrain (nëmmen TerraGenesis) : {STRING} @@ -1357,6 +1362,7 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Mof STR_CONFIG_SETTING_SCROLLMODE :Usiicht-Scrollverhalen: {STRING} STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Verhalen beim Scrolle vun der Kaart STR_CONFIG_SETTING_SCROLLMODE_DEFAULT :D'Usiicht mat der rietser Maustast bewegen, Maus-Positioun gespaart +STR_CONFIG_SETTING_SCROLLMODE_RMB_LOCKED :Beweg d'Kaart mat der rietser Maustast, Maus-Positioun gespaart STR_CONFIG_SETTING_SCROLLMODE_RMB :D'Kaart mat der rietser Maustast bewegen STR_CONFIG_SETTING_SCROLLMODE_LMB :Kaart mat der lénker Maustast bewegen STR_CONFIG_SETTING_SMOOTH_SCROLLING :Feine Scrolling: {STRING} @@ -1442,8 +1448,8 @@ STR_CONFIG_SETTING_SOUND_CONFIRM :Konstruktioun: STR_CONFIG_SETTING_SOUND_CONFIRM_HELPTEXT :Spill Soundeffekter of wa Konstruktiounen an aner Aktiounen ausgefouert goufen STR_CONFIG_SETTING_SOUND_CLICK :Kneppercherklicks: {STRING} STR_CONFIG_SETTING_SOUND_CLICK_HELPTEXT :Beep beim Klicken vu Kneppercher -STR_CONFIG_SETTING_SOUND_DISASTER :Katastrophen/Akzidenter: {STRING} -STR_CONFIG_SETTING_SOUND_DISASTER_HELPTEXT :Spill Soundeffekter vun Akzidenter a Katastrophen of +STR_CONFIG_SETTING_SOUND_DISASTER :Katastrophen/Accidenter: {STRING} +STR_CONFIG_SETTING_SOUND_DISASTER_HELPTEXT :Spill Soundeffekter vun Accidenter a Katastrophen of STR_CONFIG_SETTING_SOUND_VEHICLE :Gefierer: {STRING} STR_CONFIG_SETTING_SOUND_VEHICLE_HELPTEXT :Spill Soundeffekter vu Gefierer of STR_CONFIG_SETTING_SOUND_AMBIENT :Ambiance: {STRING} @@ -1479,6 +1485,9 @@ STR_CONFIG_SETTING_AI_IN_MULTIPLAYER :Erlaabt KI am M STR_CONFIG_SETTING_AI_IN_MULTIPLAYER_HELPTEXT :Erlaabt Computergéigner a Multiplayer Spiller matzeman STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES :#opcodes befier de Script suspendéiert gëtt: {STRING} STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES_HELPTEXT :Maximal Unzuel u Rechenschrëtt déi e Script kann an engem Tuer man +STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY :Max Späicherverbrauch pro Script: {STRING} +STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_HELPTEXT :Wéivill Späicher en eenzelne Script dierf benotzen befier en gezwongenerweis gestopt gëtt. Dese Wert muss eventuell erhéigt ginn fir grouss Kaarten. +STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_VALUE :{COMMA} MiB STR_CONFIG_SETTING_SERVINT_ISPERCENT :Revisiounsintervallen a Prozenter: {STRING} STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :Wiel op eng Revisioun ausgeléist gëtt durch Zäit déi säit der leschter Revisioun vergangen ass oder well Zouverlessëgkeet en gewëssen Prozentsaz vun der maximaler Zouverlässëgkeet erofgaang ass @@ -1503,8 +1512,8 @@ STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OWN :Ukonft vum éis STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OWN_HELPTEXT :Weis d'Zeitung wann dat éischt Gefier op enger eegener Statioun ukënnt STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER :Ukonft vum éischten Gefier op enger Géigenspillerstatioun: {STRING} STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER_HELPTEXT :Weis d'Zeitung wann dat éischt Gefier op enger géignerescher Statioun ukënnt -STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS :Akzidenter / Katastrophen: {STRING} -STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS_HELPTEXT :Weis d'Zeitung wann Akzidenter oder Katastrophen passéiren +STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS :Accidenter / Katastrophen: {STRING} +STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS_HELPTEXT :Weis d'Zeitung wann Accidenter oder Katastrophe geschéien STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION :Firmeninformatiounen: {STRING} STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION_HELPTEXT :Weis d'Zeitung wann eng nei Firma opgeet, oder wann ee riskéiert Bankrott ze goen STR_CONFIG_SETTING_NEWS_INDUSTRY_OPEN :Grënnung vun enger Industrie: {STRING} @@ -1537,10 +1546,16 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Ganz STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Faarweg News ab: {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Joer vun dem uns d'Zeitung farweg erauskënnt. Firun dësem Joer ass se schwarz/wäiss STR_CONFIG_SETTING_STARTING_YEAR :Startjoer: {STRING} +STR_CONFIG_SETTING_ENDING_YEAR :End-Joer vum Scoring: {STRING} +STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Joer wou d'Spill opgrond vum Scoring ophält. Um Enn vun desem Joer gëtt der Firma hiere Score gespäichert an an der Highscore-Lëscht ugewisen, mee de Spiller kann dono weider spillen.{}Wann dese Wert virum Startjoer ass, gëtt d'Highscorelëscht nie ugewisen. +STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} +STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Nie STR_CONFIG_SETTING_SMOOTH_ECONOMY :Gläichméisseg Wiertschaft aschalten (méi oft an kleng Wiessel): {STRING} STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Wann ugeschalt, ännert d'Industrieproduktioun méi oft, an méi kléngen Schrëtter. Dës Astellung huet keng Auswierkung op NewGRF-Industrien STR_CONFIG_SETTING_ALLOW_SHARES :Undeeler vun aaneren Firmen kafen: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Wann ugeschalt, dierfen Aktien vu Firmen kaf an verkaf ginn. Aktien si just fir Firme verfügbar, déi en gewëssen Alter erreecht hunn +STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Minimalt Firmenalter fir Aktien ze handelen: {STRING} +STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES_HELPTEXT :Definéiert d'minimalt Alter vun enger Firma, befier anerer kënnen Undeeler un Aktien vun hier kafen. STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Prozentsaz vum Etappenprofit den am Feeder-System bezuelt gëtt: {STRING} STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :Prozentsaz vum Akommes déi un d'Zwëschenetappen an engem Feeder-System gi ginn, wat méi Kontroll iwwert d'Akommes erméiglegt STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :Wa gezunn gëtt, setz en Signal all: {STRING} @@ -1572,7 +1587,7 @@ STR_CONFIG_SETTING_TOWN_LAYOUT_3X3_GRID :3x3 Gitter STR_CONFIG_SETTING_TOWN_LAYOUT_RANDOM :Zoufälleg STR_CONFIG_SETTING_ALLOW_TOWN_ROADS :Stied däerfen Stroossen bauen: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Erlaabt Stied Stroossen ze bauen fir ze wuessen. Ausschalten fir d'Stiedréid dorun ze hënneren fir Stroossen selwer ze bauen -STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Stied dierfen Barrièren bauen: {STRING} +STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Stied dierfe Barrière bauen: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Wann dës Astellung ugeschalt ass, kënnen Stied Stroossen iwwert Schinne bauen STR_CONFIG_SETTING_NOISE_LEVEL :Erlab e stadkontrolléierte Kaméidisniveau fir Fluchhäfen: {STRING} STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Wann dës Astellung ausgeschalt ass, kënnen zwee Fluchhäfen an all Stad gebaut ginn. Wann dës Astellung ugeschalt ass, henkt et vun der Fluchhafengréisst, Distanz, Kaméidisniveau of wéivill Fluchhäfen kënne gebaut ginn @@ -1583,6 +1598,7 @@ STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED :Erlaabt STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED_CUSTOM_LAYOUT :Erlaabt, custom Stad-Layout STR_CONFIG_SETTING_TOWN_CARGOGENMODE :Duerfwuerengeneratioun: {STRING} STR_CONFIG_SETTING_TOWN_CARGOGENMODE_HELPTEXT :Wéivill Wuere produzéiert ginn, relativ zur Bevölkerung vum Duerf.{}Quadratesche Wuesstum: En duebel sou grousst Duerf, generéiert véier mol souvill Passagéier.{}Lineare Wuesstum: En duebel sou grousst Duerf, generéiert duebel souvill Passagéier. +STR_CONFIG_SETTING_TOWN_CARGOGENMODE_ORIGINAL :Quadratesch (original) STR_CONFIG_SETTING_TOWN_CARGOGENMODE_BITCOUNT :Linear STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :Bamplazéirung: {STRING} @@ -1701,7 +1717,7 @@ STR_CONFIG_SETTING_VEHICLES :{ORANGE}Gefiere STR_CONFIG_SETTING_VEHICLES_PHYSICS :{ORANGE}Physik STR_CONFIG_SETTING_VEHICLES_ROUTING :{ORANGE}Routeplangung STR_CONFIG_SETTING_LIMITATIONS :{ORANGE}Limitatiounen -STR_CONFIG_SETTING_ACCIDENTS :{ORANGE}Katastrophen / Akzidenter +STR_CONFIG_SETTING_ACCIDENTS :{ORANGE}Katastrophen / Accidenter STR_CONFIG_SETTING_GENWORLD :{ORANGE}Welt Generatioun STR_CONFIG_SETTING_ENVIRONMENT :{ORANGE}Emwelt STR_CONFIG_SETTING_ENVIRONMENT_AUTHORITIES :{ORANGE}Autoritéiten @@ -1742,7 +1758,7 @@ STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_ALGORITHM :{WHITE}... Spil STR_CONFIG_ERROR_INVALID_BASE_GRAPHICS_NOT_FOUND :{WHITE}... ignoréiren Basis Grafik Set '{STRING}': net fonnt STR_CONFIG_ERROR_INVALID_BASE_SOUNDS_NOT_FOUND :{WHITE}... ignoréiren Basis Sound Set '{STRING}': net fonnt STR_CONFIG_ERROR_INVALID_BASE_MUSIC_NOT_FOUND :{WHITE}... ignoréiren Basis Musik Set '{STRING}': net fonnt -STR_CONFIG_ERROR_OUT_OF_MEMORY :{WHITE}Net genuch Mémoire +STR_CONFIG_ERROR_OUT_OF_MEMORY :{WHITE}Net genuch Späicher STR_CONFIG_ERROR_SPRITECACHE_TOO_BIG :{WHITE}Reservéirung vun {BYTES} Spritecache versot. De Spritecache gouf reduzéiert op {BYTES}. Dëst reduzéiert d'Performance vun OpenTTD. Fir Späicher ze spueren kann een probéiren 32bpp Grafiken auszeschalten an/oder Zoom-Eran Stufen # Intro window @@ -1802,7 +1818,7 @@ STR_OSNAME_SUNOS :SunOS # Abandon game STR_ABANDON_GAME_CAPTION :{WHITE}Spill ofbriechen -STR_ABANDON_GAME_QUERY :{YELLOW}Bass du sécher dass du des Partie ofbrieche wëlls? +STR_ABANDON_GAME_QUERY :{YELLOW}Bass du sécher, dass du des Partie ofbrieche wëlls? STR_ABANDON_SCENARIO_QUERY :{YELLOW}Sécher dass du aus dësem Szenario eraus wëlls ? # Cheat window @@ -1813,7 +1829,7 @@ STR_CHEAT_MONEY :{LTBLUE}Suen ë STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Als Firma {ORANGE}{COMMA} spillen STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Magësche Bulldozer (Industrien ofrappen, onzerstéierbar Objeten): {ORANGE}{STRING} STR_CHEAT_CROSSINGTUNNELS :{LTBLUE}Tunnelle kënne sech kräizen: {ORANGE}{STRING} -STR_CHEAT_NO_JETCRASH :{LTBLUE}Jet'en maachen net regelméisseg en Akzident op klenge Fluchhäfen: {ORANGE} {STRING} +STR_CHEAT_NO_JETCRASH :{LTBLUE}Jete maache net regelméisseg en Accident op klenge Fluchhäfen: {ORANGE} {STRING} STR_CHEAT_EDIT_MAX_HL :{LTBLUE}Änner d'Maximalhéicht vu Bierger op der Kaart: {ORANGE}{NUM} STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT :{WHITE}Änner d'Maximalhéicht vu Bierger op der Kaart STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Gemässegt Klima Landschaft @@ -2085,6 +2101,7 @@ STR_NETWORK_CONNECTION_DISCONNECT :{BLACK}Verbindu STR_NETWORK_NEED_GAME_PASSWORD_CAPTION :{WHITE}Server ass geschützt. Passwuert aginn STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION :{WHITE}Firma ass geschützt. Passwuert aginn +STR_NETWORK_COMPANY_LIST_CLIENT_LIST_CAPTION :{WHITE}Spillerlëscht # Network company list added strings STR_NETWORK_COMPANY_LIST_CLIENT_LIST :Spillerlëscht @@ -2133,7 +2150,7 @@ STR_NETWORK_CHAT_ALL :[All] {STRING}: STR_NETWORK_CHAT_OSKTITLE :{BLACK}Text fir Chat aginn # Network messages -STR_NETWORK_ERROR_NOTAVAILABLE :{WHITE}Keng Netzwierkgeräter fonnt oder compiléiert ouni ENABLE_NETWORK +STR_NETWORK_ERROR_NOTAVAILABLE :{WHITE}Keng Netzwierkgeräter fonnt STR_NETWORK_ERROR_NOSERVER :{WHITE}Konnt keng Netzwierkspiller fannen STR_NETWORK_ERROR_NOCONNECTION :{WHITE}De Server huet net op d'Ufro geäntwert STR_NETWORK_ERROR_NEWGRF_MISMATCH :{WHITE}Konnt sech wéinst ënnerscheedlechen NewGRF net connectéieren @@ -2257,7 +2274,7 @@ STR_CONTENT_TYPE_NEWGRF :NewGRF STR_CONTENT_TYPE_AI :KI STR_CONTENT_TYPE_AI_LIBRARY :KI Librairie STR_CONTENT_TYPE_SCENARIO :Szenario -STR_CONTENT_TYPE_HEIGHTMAP :Héischtekaart +STR_CONTENT_TYPE_HEIGHTMAP :Héichtekaart STR_CONTENT_TYPE_BASE_SOUNDS :Basis Sounds STR_CONTENT_TYPE_BASE_MUSIC :Basis Musik STR_CONTENT_TYPE_GAME_SCRIPT :Spill-Script @@ -2300,6 +2317,7 @@ STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Cargo Fl STR_LINKGRAPH_LEGEND_ALL :{BLACK}All STR_LINKGRAPH_LEGEND_NONE :{BLACK}Keng STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Wiel d'Firmen aus déi ugewise ginn +STR_LINKGRAPH_LEGEND_COMPANY_TOOLTIP :{BLACK}{STRING}{}{COMPANY} # Linkgraph legend window and linkgraph legend in smallmap STR_LINKGRAPH_LEGEND_UNUSED :{TINY_FONT}{BLACK}onbenotzt @@ -2384,9 +2402,9 @@ STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}Combo-Si STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP :{BLACK}Wee-Signal (Elektresch){}E Wee-Signal erlaabt méi wéi engem Zuch an e Block eranzefueren, wann den Zuch e Wee op en Stop-Punkt reservéiren kann. Standard Wee-Signaler kënne vu béide Säiten duerchfuer ginn STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP :{BLACK}Einbahn-Wee-Signal (Elektresch){}En Einbahn-Signal erlaabt méi wéi een Zuch zur selwechter Zäit an engem Block ze sin, wann den Zuch en Wee op en sécheren Stop-Punkt reservéiren kann. Einbahn-Signaler kënnen net vun der falscher Säit duerchfuer ginn STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Signal konvertéiren{}Wann gewielt, gëtt en geklickten Signal an dat gewielten Signal konvertéiert, Ctrl+Klick wiesselt tëscht de Varianten. Shift weist ongeféier Konvertéirungskäschten -STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP :{BLACK}Dicht vu Signaler beim Zéien +STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP :{BLACK}Distanz vu Signaler beim Zéien STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_DECREASE_TOOLTIP :{BLACK}Setzt Signaldistanz erof -STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}Setzt Signaldicht erop +STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}Setzt Signaldistanz erop # Bridge selection window STR_SELECT_RAIL_BRIDGE_CAPTION :{WHITE}Zuchbréck auswielen @@ -2408,7 +2426,7 @@ STR_BRIDGE_TUBULAR_SILICON :Rouer, Silikon STR_ROAD_TOOLBAR_ROAD_CONSTRUCTION_CAPTION :{WHITE}Stroossebau STR_ROAD_TOOLBAR_TRAM_CONSTRUCTION_CAPTION :{WHITE}Tramkonstruktioun STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION :{BLACK}Baut Stroossen.Ctrl+Klick wiësselt tëscht Stroosse bauen/ofrappen. Shift wiesselt tëscht bauen/ongeféier Käschten uweisen -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}Tramschinne bauen. Ctrl+Klick wiësselt tëscht Tramschinne bauen/ofrappen. Shift wiesselt tëscht bauen/ongeféier Käschten uweisen +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}Tramwayschinne bauen. Ctrl+Klick wiësselt tëscht Tramwayschinne bauen/ofrappen. Shift wiesselt tëscht bauen/ongeféier Käschten uweisen STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}D'Strooss mat der Bau-Automatik bauen. Ctrl wiësselt tëscht Stroossen bauen/ofrappen. Shift wiesselt tëscht bauen/ongeféier Käschten uweisen STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Tramschinne mam "Autotram" Modus bauen. Ctrl wiesselt tëscht Tramschinne bauen/ofrappen. Shift wiesselt tëschtbauen/ongeféier Käschten uweisen STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Baut Stroossendepot (fir Gefierer ze kafen an ze flécken). Shift wiesselt tëscht bauen/ongeféier Käschten uweisen @@ -2424,7 +2442,11 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Baut Str STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Tramtunnel bauen. Shift wiesselt tëscht bauen/ongeféier Käschten uweisen STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}Wiesselt bauen/ofrappen vu Stroossekonstruktiounen STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Wiesselt tëscht bauen/ofrappen beim Trambau +STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD :{BLACK}Konvertéier/upgrade den Typ vu Strooss. Shift wiesselt tëscht bauen/ongeféier Käschten uweisen +STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM :{BLACK}Konvertéiert/upgrade den Typ vun Tram. Shift wiesselt tëscht bauen/ongeféier Käschten uweisen +STR_ROAD_NAME_ROAD :Strooss +STR_ROAD_NAME_TRAM :Tramway # Road depot construction window STR_BUILD_DEPOT_ROAD_ORIENTATION_CAPTION :{WHITE}Ausriichtung vum Stroossendepot @@ -2525,7 +2547,7 @@ STR_TERRAFORM_RESET_LANDSCAPE :{BLACK}Setz d'L STR_TERRAFORM_RESET_LANDSCAPE_TOOLTIP :{BLACK}Huel all Grondstécker vun der Firma ewech STR_QUERY_RESET_LANDSCAPE_CAPTION :{WHITE}Setz d'Landschaft zeréck -STR_RESET_LANDSCAPE_CONFIRMATION_TEXT :{WHITE}Bass du sécher dass du all Grondstécker vun der Firma ewechhuelen wëlls? +STR_RESET_LANDSCAPE_CONFIRMATION_TEXT :{WHITE}Bass du sécher, dass du all Grondstécker vun der Firma ewechhuele wëlls? # Town generation window (SE) STR_FOUND_TOWN_CAPTION :{WHITE}Staderstellung @@ -2609,8 +2631,11 @@ STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: 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_ROAD_TYPE :{BLACK}Stroossentyp: {LTBLUE}{STRING} +STR_LANG_AREA_INFORMATION_TRAM_TYPE :{BLACK}Tramtyp: {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} +STR_LANG_AREA_INFORMATION_TRAM_SPEED_LIMIT :{BLACK}Tram-Geschw.-Limit: {LTBLUE}{VELOCITY} # Description of land area of different tiles STR_LAI_CLEAR_DESCRIPTION_ROCKS :Fielsen @@ -2650,7 +2675,7 @@ STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Strooss mat Luu STR_LAI_ROAD_DESCRIPTION_TREE_LINED_ROAD :Strooss mat Beem STR_LAI_ROAD_DESCRIPTION_ROAD_VEHICLE_DEPOT :Stroossendepot STR_LAI_ROAD_DESCRIPTION_ROAD_RAIL_LEVEL_CROSSING :Zuche/Stroosse-Barrière -STR_LAI_ROAD_DESCRIPTION_TRAMWAY :Tram +STR_LAI_ROAD_DESCRIPTION_TRAMWAY :Tramway # Houses come directly from their building names STR_LAI_TOWN_INDUSTRY_DESCRIPTION_UNDER_CONSTRUCTION :{STRING} (gëtt gebaut) @@ -2712,6 +2737,7 @@ STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD # Framerate display window STR_FRAMERATE_CAPTION :{WHITE}Biller pro Sekonn STR_FRAMERATE_CAPTION_SMALL :{STRING}{WHITE} ({DECIMAL}x) +STR_FRAMERATE_RATE_GAMELOOP :{BLACK}Simulationsrat: {STRING} STR_FRAMERATE_RATE_GAMELOOP_TOOLTIP :{BLACK}Unzuel Gameticks déi pro Sekonn simuléiert ginn. STR_FRAMERATE_RATE_BLITTER :{BLACK}Grafikframerate: {STRING} STR_FRAMERATE_RATE_BLITTER_TOOLTIP :{BLACK}Unzuel u Videobiller déi pro Sekonn gerendert ginn. @@ -2719,21 +2745,32 @@ STR_FRAMERATE_SPEED_FACTOR :{BLACK}Aktuelle STR_FRAMERATE_SPEED_FACTOR_TOOLTIP :{BLACK}Wéi séier d'Spill aktuell leeft, am Verglach mat der Geschw. vun der normaler Simulatioun. STR_FRAMERATE_CURRENT :{WHITE}Aktuell STR_FRAMERATE_AVERAGE :{WHITE}Mëttel +STR_FRAMERATE_MEMORYUSE :{WHITE}Späicher +STR_FRAMERATE_DATA_POINTS :{BLACK}Date baséiert op {COMMA} Miessungen 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} Biller/s STR_FRAMERATE_FPS_WARN :{YELLOW}{DECIMAL} Biller/s STR_FRAMERATE_FPS_BAD :{RED}{DECIMAL} Biller/s +STR_FRAMERATE_BYTES_GOOD :{LTBLUE}{BYTES} +STR_FRAMERATE_BYTES_WARN :{YELLOW}{BYTES} +STR_FRAMERATE_BYTES_BAD :{RED}{BYTES} +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}Spill total: -STR_FRAMERATE_GL_TRAINS :{BLACK} Zuchticks: -STR_FRAMERATE_GL_ROADVEHS :{BLACK} Stroossegefierer Ticken: +STR_FRAMERATE_GL_ECONOMY :{BLACK} Wuerenhandling: +STR_FRAMERATE_GL_TRAINS :{BLACK} Zuchticker: +STR_FRAMERATE_GL_ROADVEHS :{BLACK} Stroossegefier-Ticker: +STR_FRAMERATE_GL_SHIPS :{BLACK} Schëffticker: +STR_FRAMERATE_GL_AIRCRAFT :{BLACK} Fligerticker: +STR_FRAMERATE_GL_LANDSCAPE :{BLACK} Weltticker: STR_FRAMERATE_GL_LINKGRAPH :{BLACK} Linkgrafik-Verzögerung: STR_FRAMERATE_DRAWING :{BLACK}Grafikrendering: STR_FRAMERATE_DRAWING_VIEWPORTS :{BLACK} Welt-Usiichten: STR_FRAMERATE_VIDEO :{BLACK}Video-output: +STR_FRAMERATE_SOUND :{BLACK}Soundmixing: STR_FRAMERATE_ALLSCRIPTS :{BLACK} GS/KI Total: STR_FRAMERATE_GAMESCRIPT :{BLACK} Gamescript: STR_FRAMERATE_AI :{BLACK} KI {NUM} {STRING} @@ -2741,10 +2778,12 @@ STR_FRAMERATE_AI :{BLACK} KI {N ############ Leave those lines in this order!! STR_FRAMETIME_CAPTION_GAMELOOP :Spill-Loop STR_FRAMETIME_CAPTION_GL_ECONOMY :Wuerenhandling -STR_FRAMETIME_CAPTION_GL_TRAINS :Zuchticks +STR_FRAMETIME_CAPTION_GL_TRAINS :Zuchticker STR_FRAMETIME_CAPTION_GL_ROADVEHS :Stroossegefierer Ticken STR_FRAMETIME_CAPTION_GL_SHIPS :Schëffticker -STR_FRAMETIME_CAPTION_GL_LANDSCAPE :Weltticks +STR_FRAMETIME_CAPTION_GL_AIRCRAFT :Fligerticker +STR_FRAMETIME_CAPTION_GL_LANDSCAPE :Weltticker +STR_FRAMETIME_CAPTION_GL_LINKGRAPH :Linkgrafik Verzögerung STR_FRAMETIME_CAPTION_DRAWING :Grafikrendering STR_FRAMETIME_CAPTION_DRAWING_VIEWPORTS :Weltusiicht-Rendering STR_FRAMETIME_CAPTION_VIDEO :Video-output @@ -2779,6 +2818,7 @@ STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA} STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: {WHITE}{STRING} STR_SAVELOAD_FILTER_TITLE :{BLACK}Filter-String: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Datei iwwerschreiwen +STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Bass du sécher, dass du d'existéirend Datei iwwerschreiwe wëlls? STR_SAVELOAD_OSKTITLE :{BLACK}Gëff dem Spillstand en Numm @@ -2806,7 +2846,7 @@ STR_MAPGEN_VARIETY :{BLACK}Vielfalt STR_MAPGEN_GENERATE :{WHITE}Generéiren # Strings for map borders at game generation -STR_MAPGEN_BORDER_TYPE :{BLACK}Kaartenenner: +STR_MAPGEN_BORDER_TYPE :{BLACK}Kaarteränner: STR_MAPGEN_NORTHWEST :{BLACK}Nordwest STR_MAPGEN_NORTHEAST :{BLACK}Nordost STR_MAPGEN_SOUTHEAST :{BLACK}Südost @@ -2899,6 +2939,7 @@ STR_NEWGRF_SETTINGS_PALETTE :{BLACK}Palette: STR_NEWGRF_SETTINGS_PALETTE_DEFAULT :Standard (S) STR_NEWGRF_SETTINGS_PALETTE_DEFAULT_32BPP :Standard (S) / 32 bpp STR_NEWGRF_SETTINGS_PALETTE_LEGACY :Legacy (W) +STR_NEWGRF_SETTINGS_PALETTE_LEGACY_32BPP :Legacy (W) / 32 bpp STR_NEWGRF_SETTINGS_PARAMETER :{BLACK}Parameter: {SILVER}{STRING} STR_NEWGRF_SETTINGS_PARAMETER_NONE :Keng @@ -2982,6 +3023,7 @@ STR_NEWGRF_ERROR_GRM_FAILED :Ugefroten GRF R 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}) STR_NEWGRF_ERROR_LIST_PROPERTY_TOO_LONG :Zevill Elementer an der Eegeschaftewert-Lëscht (Sprite {3:NUM}, Eegeschaft {4:HEX}) +STR_NEWGRF_ERROR_INDPROD_CALLBACK :Ongültegen Industrie-production callback (sprite {3:NUM}, "{2:STRING}") # NewGRF related 'general' warnings STR_NEWGRF_POPUP_CAUTION_CAPTION :{WHITE}Opgepasst! @@ -3013,6 +3055,7 @@ STR_NEWGRF_BUGGY :{WHITE}NewGRF ' STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Cargo/refit Informatioun fir '{1:ENGINE}' ass anescht wéi an der Kaflëscht no der Constructioun. Dëst kann en Autoerneirung/-ersetzen Fehler oprufen STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' huet eng Endlosschläif am Production callback verursaacht STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT :{WHITE}Callback {1:HEX} huet en onbekannten/invalid Resultat {2:HEX} +STR_NEWGRF_BUGGY_INVALID_CARGO_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' huet en ongültegen Wuerentyp am Production-callback bei {2:HEX} # 'User removed essential NewGRFs'-placeholders for stuff without specs STR_NEWGRF_INVALID_CARGO : @@ -3079,6 +3122,8 @@ STR_TOWN_VIEW_RENAME_TOWN_BUTTON :Stad ëmbenenne # Town local authority window STR_LOCAL_AUTHORITY_CAPTION :{WHITE}Gemeng {TOWN} +STR_LOCAL_AUTHORITY_ZONE :{BLACK}Zone +STR_LOCAL_AUTHORITY_ZONE_TOOLTIP :{BLACK}Weis d'Zone vun de Gemengegrenzen STR_LOCAL_AUTHORITY_COMPANY_RATINGS :{BLACK}Transportfirme-Bewäertung: STR_LOCAL_AUTHORITY_COMPANY_RATING :{YELLOW}{COMPANY} {COMPANY_NUM}: {ORANGE}{STRING} STR_LOCAL_AUTHORITY_ACTIONS_TITLE :{BLACK}Verfügbar Aktiounen: @@ -3107,6 +3152,7 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}D'Gemen # Goal window STR_GOALS_CAPTION :{WHITE}{COMPANY} Ziler STR_GOALS_SPECTATOR_CAPTION :{WHITE}Global Ziler +STR_GOALS_SPECTATOR :Global Ziler STR_GOALS_GLOBAL_TITLE :{BLACK}Global Ziler: STR_GOALS_TEXT :{ORANGE}{STRING} STR_GOALS_NONE :{ORANGE}- Keng - @@ -3335,6 +3381,7 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infrastr STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Schinnestécker: STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Signaler STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Stroossestécker: +STR_COMPANY_INFRASTRUCTURE_VIEW_TRAM_SECT :{GOLD}Tramdeeler: STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Waasserfelder: STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanäl STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Statiounen: @@ -3345,7 +3392,12 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL :{WHITE}{CURRENC # Industry directory STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Industrien STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- Keng - +STR_INDUSTRY_DIRECTORY_ITEM_INFO :{BLACK}{CARGO_LONG}{STRING}{YELLOW} ({COMMA}% transportéiert){BLACK} STR_INDUSTRY_DIRECTORY_ITEM_NOPROD :{ORANGE}{INDUSTRY} +STR_INDUSTRY_DIRECTORY_ITEM_PROD1 :{ORANGE}{INDUSTRY} {STRING} +STR_INDUSTRY_DIRECTORY_ITEM_PROD2 :{ORANGE}{INDUSTRY} {STRING}, {STRING} +STR_INDUSTRY_DIRECTORY_ITEM_PROD3 :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} +STR_INDUSTRY_DIRECTORY_ITEM_PRODMORE :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} an nach {NUM} méi... STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Industrienimm - klick op en Numm fir d'Usiicht do drop ze zentréieren. Ctrl+Klick erstellt eng nei Usiicht op d'Industrie # Industry view @@ -3356,6 +3408,7 @@ STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}Zentréi STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}Produktiounslevel: {YELLOW}{COMMA}% STR_INDUSTRY_VIEW_INDUSTRY_ANNOUNCED_CLOSURE :{YELLOW}D'Industrie annoncéiert dass se zougemaach gëtt +STR_INDUSTRY_VIEW_REQUIRES_N_CARGO :{BLACK}Brauch: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_N_CARGO :{BLACK}Produzéiert: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :, {STRING}{STRING} @@ -3440,9 +3493,11 @@ STR_BUY_VEHICLE_TRAIN_MONORAIL_CAPTION :Nei Monorailgef STR_BUY_VEHICLE_TRAIN_MAGLEV_CAPTION :Nei Magnéitbunngefierer STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :Nei Stroossegefierer +STR_BUY_VEHICLE_TRAM_VEHICLE_CAPTION :Nei Tramgefierer ############ range for vehicle availability starts STR_BUY_VEHICLE_TRAIN_ALL_CAPTION :Nei Zich +STR_BUY_VEHICLE_ROAD_VEHICLE_ALL_CAPTION :Nei Stroossegefierer STR_BUY_VEHICLE_SHIP_CAPTION :Nei Schëffer STR_BUY_VEHICLE_AIRCRAFT_CAPTION :Neie Fliger ############ range for vehicle availability ends @@ -3467,6 +3522,7 @@ STR_PURCHASE_INFO_AIRCRAFT_CAPACITY :{BLACK}Kapazit STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT :{BLACK}Ugedriwwen Waggonen: {GOLD}+{POWER}{BLACK} Gewiicht: {GOLD}+{WEIGHT_SHORT} STR_PURCHASE_INFO_REFITTABLE_TO :{BLACK}Embaubar zu: {GOLD}{STRING} STR_PURCHASE_INFO_ALL_TYPES :All Wuerentyp +STR_PURCHASE_INFO_NONE :Keng 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 @@ -3493,6 +3549,8 @@ STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Keeft da STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Keeft den ungewielte Fliger. Shift+Klick weist ongeféier Käschten ouni Kaf STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Gewielten Zuch/Waggon kafen an ëmbauen. Shift+Klick weist ongeféier Käschten ouni Kaf +STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Gewielte Gefier kafen an ëmbauen. Shift+Klick weist ongeféier Käschten ouni Kaf +STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Gewielte Schëff kafen an ëmbauen. Shift+Klick weist ongeféier Käschten ouni Kaf STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Gewielte Fliger kafen an ëmbauen. Shift+Klick weist ongeféier Käschten ouni Kaf STR_BUY_VEHICLE_TRAIN_RENAME_BUTTON :{BLACK}Ëmbenennen @@ -3605,10 +3663,12 @@ STR_ENGINE_PREVIEW_CAPTION :{WHITE}Meldung STR_ENGINE_PREVIEW_MESSAGE :{GOLD}Mir hunn elo en neien {STRING} gebaut - bass du dorun interesséiert dëst Gefier 1 Joer exklusiv ze notzen, fir ze testen op et komplett maarträif ass? STR_ENGINE_PREVIEW_RAILROAD_LOCOMOTIVE :Lokomotiv +STR_ENGINE_PREVIEW_ELRAIL_LOCOMOTIVE :Elektresch Lokomotiv STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :Monorail Lokomotiv STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :Magnéitbunnlokomotiv STR_ENGINE_PREVIEW_ROAD_VEHICLE :Stroossegefier +STR_ENGINE_PREVIEW_TRAM_VEHICLE :Tram-Gefier STR_ENGINE_PREVIEW_AIRCRAFT :Fliger STR_ENGINE_PREVIEW_SHIP :Schëff @@ -3650,14 +3710,18 @@ STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Wiessel STR_REPLACE_ENGINES :Lokomotiven STR_REPLACE_WAGONS :Waggonen STR_REPLACE_ALL_RAILTYPE :All Zich +STR_REPLACE_ALL_ROADTYPE :All Stroossegefierer STR_REPLACE_HELP_RAILTYPE :{BLACK}Wielt de Schinnentyp fir déi Lokomotiven ausgetosch ginn +STR_REPLACE_HELP_ROADTYPE :{BLACK}Wielt de Stroossentyp fir déi d'Maschinnen 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 STR_REPLACE_RAIL_VEHICLES :Zich STR_REPLACE_ELRAIL_VEHICLES :Elektresch Zich STR_REPLACE_MONORAIL_VEHICLES :Monorail Gefierer STR_REPLACE_MAGLEV_VEHICLES :Magnéitbunn Gefierer +STR_REPLACE_ROAD_VEHICLES :Stroossegefierer +STR_REPLACE_TRAM_VEHICLES :Tram-Gefierer STR_REPLACE_REMOVE_WAGON :{BLACK}Waggon raushuelen: {ORANGE}{STRING} STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Mécht dass d'automatescht Austauschen d'Längt vum Zuch behält, an dem e Waggonen (vu lénks un) wechhëllt, wann d'Lok den Zuch ze laang mécht @@ -3708,7 +3772,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_STATE_START_STOP_TOOLTIP :{BLACK}Momentan # Messages in the start stop button in the vehicle view STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}Lueden / Entlueden STR_VEHICLE_STATUS_LEAVING :{LTBLUE}Verloossen -STR_VEHICLE_STATUS_CRASHED :{RED}Akzident! +STR_VEHICLE_STATUS_CRASHED :{RED}Accident! STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}Pann STR_VEHICLE_STATUS_STOPPED :{RED}Gestoppt STR_VEHICLE_STATUS_TRAIN_STOPPING_VEL :{RED}Stoppt, {VELOCITY} @@ -3997,7 +4061,7 @@ STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(fuer während STR_TIMETABLE_STAY_FOR :an bleif fir {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :an ënnerwee während {STRING} STR_TIMETABLE_DAYS :{COMMA}{NBSP}D{P ag eeg} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}Tick{P "" en} +STR_TIMETABLE_TICKS :{COMMA}{NBSP}Tick{P "" er} STR_TIMETABLE_TOTAL_TIME :{BLACK}Dësen Zäitplang brauch {STRING} fir faërdeg ze ginn STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Dësen Zäitplang brauch op manst {STRING} (net all geplangt) @@ -4109,6 +4173,13 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Wiel de STR_AI_LIST_CANCEL :{BLACK}Ofbriechen STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Script net änneren +STR_SCREENSHOT_CAPTION :{WHITE}E Screenshot maachen +STR_SCREENSHOT_SCREENSHOT :{BLACK}Normale Screenshot +STR_SCREENSHOT_ZOOMIN_SCREENSHOT :{BLACK}Voll gezoomte Screenshot +STR_SCREENSHOT_DEFAULTZOOM_SCREENSHOT :{BLACK}Standard Zoom-Screenshot +STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Screenshot vun der ganzer Kaart +STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Héichtekaartscreenshot + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameter STR_AI_SETTINGS_CAPTION_AI :KI @@ -4203,7 +4274,7 @@ STR_ERROR_MESSAGE_CAPTION_OTHER_COMPANY :{YELLOW}Matdeel # Generic construction errors STR_ERROR_OFF_EDGE_OF_MAP :{WHITE}Ausserhalb vun der Kaart -STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP :{WHITE}Ze noo um Rand vun der Kaart +STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP :{WHITE}Ze no um Rand vun der Kaart STR_ERROR_NOT_ENOUGH_CASH_REQUIRES_CURRENCY :{WHITE}Net genuch Geld - des Aktioun kascht {CURRENCY_LONG} STR_ERROR_FLAT_LAND_REQUIRED :{WHITE}D'Land muss flaach sinn STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION :{WHITE}Land ass an déi falsch Richtung geneigt @@ -4258,8 +4329,8 @@ STR_ERROR_CAN_T_GENERATE_TOWN :{WHITE}Ka keng STR_ERROR_CAN_T_RENAME_TOWN :{WHITE}Kann d'Stad net ëmbenennen... STR_ERROR_CAN_T_FOUND_TOWN_HERE :{WHITE}Kann d'Stad hei net bauen... STR_ERROR_CAN_T_EXPAND_TOWN :{WHITE}Kann d'Stad net vergréisseren... -STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... ze noo um Enn vun der Kaart -STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... ze noo un enger anerer Stad +STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... ze no um Rand vun der Kaart +STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... ze no un enger anerer Stad STR_ERROR_TOO_MANY_TOWNS :{WHITE}... ze vill Stied STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... et ass keng Plaz méi op der Kaart STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Stied bauen keng Stroossen. Du kanns de Bau iwwert Astellungen->Economie->Stied aschalten @@ -4272,7 +4343,7 @@ STR_ERROR_TOO_MANY_INDUSTRIES :{WHITE}... zevi STR_ERROR_CAN_T_GENERATE_INDUSTRIES :{WHITE}Kann keng Industrien bauen... STR_ERROR_CAN_T_BUILD_HERE :{WHITE}Kann {STRING} net hei bauen... STR_ERROR_CAN_T_CONSTRUCT_THIS_INDUSTRY :{WHITE}Kann deen Industrietyp hei net bauen... -STR_ERROR_INDUSTRY_TOO_CLOSE :{WHITE}... ze noo bei enger anerer Fabrik +STR_ERROR_INDUSTRY_TOO_CLOSE :{WHITE}... ze no bei enger anerer Fabrik STR_ERROR_MUST_FOUND_TOWN_FIRST :{WHITE}... muss fir d'éischt eng Stad bauen STR_ERROR_ONLY_ONE_ALLOWED_PER_TOWN :{WHITE}... nëmmen 1 pro Stad erlaabt STR_ERROR_CAN_ONLY_BE_BUILT_IN_TOWNS_WITH_POPULATION_OF_1200 :{WHITE}... kann nëmmen an Stied mat op mannst 1200 Anwunner gebaut ginn @@ -4304,8 +4375,8 @@ 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_DOCK :{WHITE}Ze noo un engem aanerem Hafen -STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Ze noo un engem aaneren Fluchhafen +STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Ze no un engem aaneren Hafen +STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Ze no un engem aanere Fluchhafen STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Kann d'Statioun net ëmbenennen... STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... d'Strooss ass am Besëtz vun der Stad STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... Strooss geet an dei falsch Richtung @@ -4380,7 +4451,8 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Signaler STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Keng gëeegent Schinnen STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}D'Schinne musse fir d'éischt ewech STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}D'Strooss ass eng Einbahn oder blockéiert -STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Barrièren si fir dësen Schinnentyp net erlaabt +STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Barrière si fir dëse Schinnentyp net erlaabt +STR_ERROR_CROSSING_DISALLOWED_ROAD :{WHITE}Barrière si fir dëse Stroossentyp net erlaabt STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Kann d'Signaler hei net bauen... STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Kann d'Schinnen hei net bauen... STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Kann d'Schinnen hei net ewech huelen... @@ -4395,11 +4467,17 @@ STR_ERROR_CAN_T_CONVERT_RAIL :{WHITE}Kann de STR_ERROR_MUST_REMOVE_ROAD_FIRST :{WHITE}Muss d'Strooss ewech huelen STR_ERROR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION :{WHITE}... Einbahnstroossen kënnen keng Kräizung hunn STR_ERROR_CAN_T_BUILD_ROAD_HERE :{WHITE}Kann d'Strooss hei net bauen... -STR_ERROR_CAN_T_BUILD_TRAMWAY_HERE :{WHITE}Kann den Tram hei net bauen... +STR_ERROR_CAN_T_BUILD_TRAMWAY_HERE :{WHITE}Kann Tramway hei net bauen... STR_ERROR_CAN_T_REMOVE_ROAD_FROM :{WHITE}Kann d'Strooss hei net ewech huelen... -STR_ERROR_CAN_T_REMOVE_TRAMWAY_FROM :{WHITE}Kann den Tram net ewech huelen... +STR_ERROR_CAN_T_REMOVE_TRAMWAY_FROM :{WHITE}Kann den Tramway net ewech huelen... STR_ERROR_THERE_IS_NO_ROAD :{WHITE}... et ass keng Strooss do -STR_ERROR_THERE_IS_NO_TRAMWAY :{WHITE}... et ass keen Tram do +STR_ERROR_THERE_IS_NO_TRAMWAY :{WHITE}... et ass keen Tramway do +STR_ERROR_CAN_T_CONVERT_ROAD :{WHITE}Kann den Gefiertyp hei net konvertéiren... +STR_ERROR_CAN_T_CONVERT_TRAMWAY :{WHITE}Kann den Tramwaytyp hei net konvertéiren... +STR_ERROR_NO_SUITABLE_ROAD :{WHITE}Keng geeegent Strooss +STR_ERROR_NO_SUITABLE_TRAMWAY :{WHITE}Kee passenden Tramway +STR_ERROR_INCOMPATIBLE_ROAD :{WHITE}... inkompatibel Strooss +STR_ERROR_INCOMPATIBLE_TRAMWAY :{WHITE}... inkompatiblen Tramway # Waterway construction errors STR_ERROR_CAN_T_BUILD_CANALS :{WHITE}Kann hei keen Kanal bauen... diff --git a/src/lang/malay.txt b/src/lang/malay.txt index 3a00bac589..efb02ab21c 100644 --- a/src/lang/malay.txt +++ b/src/lang/malay.txt @@ -452,9 +452,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Papar atau padamkan konsol 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 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 STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Papar atau padamkan kotak @@ -624,9 +621,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Pilihan Diri 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Volum Muzik STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Volum Kesan Bunyi -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAKS -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}------ @@ -3685,6 +3679,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Pilih sk STR_AI_LIST_CANCEL :{BLACK}Batal STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Jangan ubah skrip + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameter STR_AI_SETTINGS_CAPTION_AI :AI diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index cd2b797863..8ac253e114 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -480,9 +480,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Vis/skjul konsoll STR_ABOUT_MENU_AI_DEBUG :AI/Spillskript-feilsøking STR_ABOUT_MENU_SCREENSHOT :Skjermbilde -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Fullt forstørret skjermbilde -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Normalt forstørret skjermbilde -STR_ABOUT_MENU_GIANT_SCREENSHOT :Skjermbilde av hele kartet STR_ABOUT_MENU_SHOW_FRAMERATE :Vis bildehastighet STR_ABOUT_MENU_ABOUT_OPENTTD :Om 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Spriteforskyver @@ -653,9 +650,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Egendefinert 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Musikkvolum STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Lydeffektvolum -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAKS -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}------ @@ -4170,6 +4164,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Velg det STR_AI_LIST_CANCEL :{BLACK}Avbryt STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Ikke endre skriptet + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametre STR_AI_SETTINGS_CAPTION_AI :AI diff --git a/src/lang/norwegian_nynorsk.txt b/src/lang/norwegian_nynorsk.txt index 1ed23d682a..6eba894d4e 100644 --- a/src/lang/norwegian_nynorsk.txt +++ b/src/lang/norwegian_nynorsk.txt @@ -472,9 +472,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Syne/gøym konsoll STR_ABOUT_MENU_AI_DEBUG :AI- / Spelscriptfeilsøking STR_ABOUT_MENU_SCREENSHOT :Skjermdump -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Fullt forstørra skjermbilete -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Normalt skjermbilete -STR_ABOUT_MENU_GIANT_SCREENSHOT :Stort skjermfoto STR_ABOUT_MENU_ABOUT_OPENTTD :Om 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Spriteforskyver STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Syne/gøym markeringsramme @@ -644,9 +641,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Eigendefinert 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Musikkvolum STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Lydeffektvolum -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAKS. -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}------ @@ -3916,6 +3910,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Merk uth STR_AI_LIST_CANCEL :{BLACK}Avbryt STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Ikkje endre AI + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameter STR_AI_SETTINGS_CAPTION_AI :AI diff --git a/src/lang/polish.txt b/src/lang/polish.txt index e7c1356969..01b0e92c7a 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -857,9 +857,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Przełącz konsolę STR_ABOUT_MENU_AI_DEBUG :Debugowanie SI / Game Script STR_ABOUT_MENU_SCREENSHOT :Zrzut ekranu -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Zrzut ekranu z pełnym przybliżeniem -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Zrzut ekranu z przybliżeniem domyślnym -STR_ABOUT_MENU_GIANT_SCREENSHOT :Zrzut ekranu całej mapy STR_ABOUT_MENU_SHOW_FRAMERATE :Pokaż ilość klatek na sekundę STR_ABOUT_MENU_ABOUT_OPENTTD :Info o 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Wyrównywanie sprite'ów @@ -1030,9 +1027,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Własny 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Głośność muzyki STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Głośność efektów -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAX -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}------ @@ -4560,6 +4554,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Wybierz STR_AI_LIST_CANCEL :{BLACK}Anuluj STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Nie zmieniaj skryptu + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametry STR_AI_SETTINGS_CAPTION_AI :SI diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index cfb33fc8eb..ef6912f21a 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -477,9 +477,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Mostrar/Ocultar consola STR_ABOUT_MENU_AI_DEBUG :Depuração da IA/Scripts de jogo STR_ABOUT_MENU_SCREENSHOT :Captura de ecrã -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Captura com resolução máxima -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Captura com resolução normal -STR_ABOUT_MENU_GIANT_SCREENSHOT :Captura de mapa STR_ABOUT_MENU_SHOW_FRAMERATE :Mostrar taxa de fotogramas STR_ABOUT_MENU_ABOUT_OPENTTD :Sobre o 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Alinhador de gráficos @@ -650,9 +647,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Personaliz. 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Volume da Música STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Volume dos efeitos -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAX -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}------ @@ -4160,6 +4154,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Seleccio STR_AI_LIST_CANCEL :{BLACK}Cancelar STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Não mudar o script + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parâmetros STR_AI_SETTINGS_CAPTION_AI :IA diff --git a/src/lang/romanian.txt b/src/lang/romanian.txt index 46e128164c..ba2372b032 100644 --- a/src/lang/romanian.txt +++ b/src/lang/romanian.txt @@ -470,9 +470,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Consolă pornit/oprit STR_ABOUT_MENU_AI_DEBUG :Depanare Inteligenţă Artificială / Script Joc STR_ABOUT_MENU_SCREENSHOT :Capturează ecranul -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Captură mărită -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Mărimea implicită a capturii -STR_ABOUT_MENU_GIANT_SCREENSHOT :Capturează toată harta STR_ABOUT_MENU_SHOW_FRAMERATE :Arată FPS STR_ABOUT_MENU_ABOUT_OPENTTD :Despre 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Aliniere imagini @@ -643,9 +640,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Personale 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Volumul muzicii STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Volumul efectelor sonore -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAX -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}------ @@ -3986,6 +3980,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Alege sc STR_AI_LIST_CANCEL :{BLACK}Anulează STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Nu schimba scriptul + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametrii STR_AI_SETTINGS_CAPTION_AI :IA diff --git a/src/lang/russian.txt b/src/lang/russian.txt index 8c3776a776..e0815a435f 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -411,7 +411,7 @@ STR_SORT_BY_CAPTION_DATE :{BLACK}Дата STR_SORT_BY_NAME :Название STR_SORT_BY_PRODUCTION :Производительность STR_SORT_BY_TYPE :Тип -STR_SORT_BY_TRANSPORTED :Вывоз +STR_SORT_BY_TRANSPORTED :% перевезённого STR_SORT_BY_NUMBER :Номер STR_SORT_BY_PROFIT_LAST_YEAR :Прибыль в прошлом году STR_SORT_BY_PROFIT_THIS_YEAR :Прибыль в текущем году @@ -604,9 +604,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Консоль STR_ABOUT_MENU_AI_DEBUG :Отладка ИИ / скриптов 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 :Выравнивание спрайтов @@ -789,9 +786,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Пользоват. 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Громкость музыки STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Громкость звука -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}МИН -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}МАКС -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}------ @@ -1015,6 +1009,7 @@ STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE :{BIG_FONT}{BLAC STR_NEWS_NEW_VEHICLE_TYPE :{BIG_FONT}{BLACK}{ENGINE} STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE :{BLACK}Начато серийное производство новой модели {STRING.gen}! - {ENGINE} +STR_NEWS_SHOW_VEHICLE_GROUP_TOOLTIP :{BLACK}Открыть окно групп транспорта и выбрать группу, к которой принадлежит это транспортное средство STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO :{WHITE}{STATION} больше не принимает {STRING.acc} STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO_OR_CARGO :{WHITE}{STATION} больше не принимает {STRING.acc} и {STRING.acc} @@ -1466,6 +1461,8 @@ STR_CONFIG_SETTING_POPULATION_IN_LABEL :Показыв STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Показывать количество жителей городов в названиях STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Толщина линий графиков: {STRING} STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Толщина линий графиков. Тонкие линии более точны; толстые линии лучше видны и их цвета лучше различимы. +STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :Показывать имя NewGRF в окне покупки транспорта: {STRING} +STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Показывать название модуля NewGRF, содержащего выбранную модель транспортного средства, в окне покупки транспорта. STR_CONFIG_SETTING_LANDSCAPE :Тип карты: {STRING} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Выбор типа карты определяет основу игрового процесса, например, доступные типы транспорта и грузов, различные условия роста городов. Всё это также может быть изменено с помощью модулей NewGRF и игровых скриптов. @@ -1703,6 +1700,10 @@ 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_ENDING_YEAR :Последний год игры: {STRING} +STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :По прошествии указанного года рассчитывается рейтинг компании и выводится таблица рекордов. После этого игру можно продолжить.{}Если указанный год предшествует году начала игры, то таблица рекордов не отображается. +STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} +STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Никогда STR_CONFIG_SETTING_SMOOTH_ECONOMY :Включить плавную экономику (частые, небольшие изменения): {STRING} STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :При включении производительность предприятий меняется чаще и более плавно. Эта настройка обычно не влияет на предприятия, внесённые в игру модулями NewGRF. STR_CONFIG_SETTING_ALLOW_SHARES :Разрешить торговлю акциями других компаний: {STRING} @@ -2319,6 +2320,7 @@ STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}Неве STR_NETWORK_ERROR_SERVER_FULL :{WHITE}Сервер переполнен STR_NETWORK_ERROR_SERVER_BANNED :{WHITE}Вас забанили на этом сервере STR_NETWORK_ERROR_KICKED :{WHITE}Вас выкинули из игры +STR_NETWORK_ERROR_KICK_MESSAGE :{WHITE}Причина: {STRING} STR_NETWORK_ERROR_CHEATER :{WHITE}Чит-коды не разрешены на этом сервере STR_NETWORK_ERROR_TOO_MANY_COMMANDS :{WHITE}Вы посылали на сервер слишком много команд STR_NETWORK_ERROR_TIMEOUT_PASSWORD :{WHITE}Вы не успели ввести пароль @@ -2378,6 +2380,7 @@ STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} п STR_NETWORK_MESSAGE_GAVE_MONEY_AWAY :*** Вы передали {1:STRING} {2:CURRENCY_LONG} STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}Сервер закрыл сессию STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Сервер перезапускается...{}Пожалуйста, подождите... +STR_NETWORK_MESSAGE_KICKED :*** {STRING} был исключён из игры. Причина: ({STRING}) # Content downloading window STR_CONTENT_TITLE :{WHITE}Загрузка контента @@ -3580,6 +3583,10 @@ STR_INDUSTRY_DIRECTORY_ITEM_PROD2 :{ORANGE}{INDUST STR_INDUSTRY_DIRECTORY_ITEM_PROD3 :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} STR_INDUSTRY_DIRECTORY_ITEM_PRODMORE :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} и ещё {NUM}... STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Список предприятий - щелчок по названию показывает предприятие в основном окне. Ctrl+щелчок показывает в дополнительном окне. +STR_INDUSTRY_DIRECTORY_ACCEPTED_CARGO_FILTER :{BLACK}Принимаемый груз: {SILVER}{STRING} +STR_INDUSTRY_DIRECTORY_PRODUCED_CARGO_FILTER :{BLACK}Производимый груз: {SILVER}{STRING} +STR_INDUSTRY_DIRECTORY_FILTER_ALL_TYPES :Любой +STR_INDUSTRY_DIRECTORY_FILTER_NONE :Отсутствует # Industry view STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTRY} @@ -4366,6 +4373,14 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Выбр STR_AI_LIST_CANCEL :{BLACK}Отмена STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Не менять скрипт +STR_SCREENSHOT_CAPTION :{WHITE}Снимок экрана +STR_SCREENSHOT_SCREENSHOT :{BLACK}Обычный снимок +STR_SCREENSHOT_ZOOMIN_SCREENSHOT :{BLACK}Видимая область в максимальном приближении +STR_SCREENSHOT_DEFAULTZOOM_SCREENSHOT :{BLACK}Видимая область в обычном масштабе +STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Снимок всей карты +STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Снимок карты высот +STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Снимок миникарты + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}Параметры {STRING} STR_AI_SETTINGS_CAPTION_AI :ИИ @@ -4449,10 +4464,10 @@ STR_WARNING_FALLBACK_SOUNDSET :{WHITE}Теку # Screenshot related messages STR_WARNING_SCREENSHOT_SIZE_CAPTION :{WHITE}Огромный снимок экрана -STR_WARNING_SCREENSHOT_SIZE_MESSAGE :{YELLOW}Снимок экрана будет иметь размер {COMMA} х {COMMA} пикселей. Его создание займёт некоторое время. Продолжить? +STR_WARNING_SCREENSHOT_SIZE_MESSAGE :{YELLOW}Снимок экрана будет иметь размер {COMMA}{NBSP}х{NBSP}{COMMA}{NBSP}пиксел{P ь я ей}. Его создание займёт некоторое время. Продолжить? STR_MESSAGE_SCREENSHOT_SUCCESSFULLY :{WHITE}Снимок экрана сохранён под именем «{STRING}» -STR_ERROR_SCREENSHOT_FAILED :{WHITE}Не удалось сохранить снимок экрана +STR_ERROR_SCREENSHOT_FAILED :{WHITE}Не удалось сделать снимок экрана # Error message titles STR_ERROR_MESSAGE_CAPTION :{YELLOW}Сообщение diff --git a/src/lang/serbian.txt b/src/lang/serbian.txt index bd12d84c99..ef96f78dd2 100644 --- a/src/lang/serbian.txt +++ b/src/lang/serbian.txt @@ -658,9 +658,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Uključi/isključi konzolu STR_ABOUT_MENU_AI_DEBUG :Korekcija veštačke inteligencije / skripte partije STR_ABOUT_MENU_SCREENSHOT :Sačuvaj sliku -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Čuva sliku skroz približenog terena -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Podrazumevani nivo zuma za sliku ekrana -STR_ABOUT_MENU_GIANT_SCREENSHOT :Sačuvaj sliku celog terena STR_ABOUT_MENU_ABOUT_OPENTTD :O OpenTTD-u STR_ABOUT_MENU_SPRITE_ALIGNER :Poravnjavanje sprajta STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Uključi/isključi granične linije @@ -830,9 +827,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Lični raspored 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Jačina muzike STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Jačina ambijenta -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}Tiho -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}Glasno -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}------ @@ -4242,6 +4236,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Izabira STR_AI_LIST_CANCEL :{BLACK}Otkaži STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Ne menja skriptu + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametri STR_AI_SETTINGS_CAPTION_AI :VI diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index 2a2f69738a..61a251897b 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -478,9 +478,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :切换到控制台模式 STR_ABOUT_MENU_AI_DEBUG :AI /游戏脚本调试 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 对齐 @@ -651,9 +648,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}自定义2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}音乐音量 STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}音效音量 -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAX -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}------ @@ -4115,6 +4109,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}选择 STR_AI_LIST_CANCEL :{BLACK}取消 STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}不修改本 AI + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} 参数 STR_AI_SETTINGS_CAPTION_AI :AI diff --git a/src/lang/slovak.txt b/src/lang/slovak.txt index 66bbf080b6..af28e0b597 100644 --- a/src/lang/slovak.txt +++ b/src/lang/slovak.txt @@ -534,9 +534,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Zobraziť / skryť konzolu STR_ABOUT_MENU_AI_DEBUG :Umelá inteligencia / Ladenie skriptov STR_ABOUT_MENU_SCREENSHOT :Snímka -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Plne priblížená snímka -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Snímka s predvoleným priblížením -STR_ABOUT_MENU_GIANT_SCREENSHOT :Veľká snímka celej mapy STR_ABOUT_MENU_ABOUT_OPENTTD :O hre 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Sprite zarovnávač STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Prepnúť okrajové boxy @@ -706,9 +703,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Vlastné 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Hlasitosť hudby STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Hlasitosť zvuk. efektov -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAX -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}------ @@ -4068,6 +4062,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Vybrať STR_AI_LIST_CANCEL :{BLACK}Zrušiť STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Nemeniť skript + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametre STR_AI_SETTINGS_CAPTION_AI :Imelá inteligencia diff --git a/src/lang/slovenian.txt b/src/lang/slovenian.txt index fb6ad03cd8..adf01885c7 100644 --- a/src/lang/slovenian.txt +++ b/src/lang/slovenian.txt @@ -623,9 +623,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Vklopi/Izklopi konzolo STR_ABOUT_MENU_AI_DEBUG :Razhročevanje UI / skript STR_ABOUT_MENU_SCREENSHOT :Zajemi sliko -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Zajemi približano sliko -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Zajem slike pri privzeti povečavi -STR_ABOUT_MENU_GIANT_SCREENSHOT :Zajemi celostno sliko STR_ABOUT_MENU_ABOUT_OPENTTD :O 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Uravnavanje sličice STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Vklop/izklop okvirjev @@ -795,9 +792,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Po meri 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Glasnost glasbe STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Glasnost zvokov -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAX -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}------ @@ -4158,6 +4152,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Izberi o STR_AI_LIST_CANCEL :{BLACK}Prekliči STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Ne spremeni skripte + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametri STR_AI_SETTINGS_CAPTION_AI :UI diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt index b04d8dbf8e..fb931e04fa 100644 --- a/src/lang/spanish.txt +++ b/src/lang/spanish.txt @@ -479,9 +479,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Activar consola 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 @@ -652,9 +649,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA 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}------ @@ -4167,6 +4161,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Seleccio 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 diff --git a/src/lang/spanish_MX.txt b/src/lang/spanish_MX.txt index e01f831315..0d46dd2d5f 100644 --- a/src/lang/spanish_MX.txt +++ b/src/lang/spanish_MX.txt @@ -243,8 +243,8 @@ STR_TOOLTIP_CLOSE_WINDOW :{BLACK}Cerrar v 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_DEFSIZE :{BLACK}Cambiar al tamaño por defecto de la ventana. Ctrl+Clic guarda el tamaño actual como nuevo tamaño por defecto +STR_TOOLTIP_STICKY :{BLACK}Excluir esta ventana de la función de la tecla "Cerrar todas las ventanas". Ctrl+Clic guarda esta preferencia como opción por defecto 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) @@ -263,7 +263,7 @@ STR_SHOW_HIDDEN_ENGINES_VEHICLE_SHIP_TOOLTIP :{BLACK}Activar 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_DEFAULT :{BLACK}Por defecto STR_BUTTON_CANCEL :{BLACK}Cancelar STR_BUTTON_OK :{BLACK}Aceptar STR_WARNING_PASSWORD_SECURITY :{YELLOW}Advertencia: los administradores del servidor tienen acceso al texto escrito aquí @@ -479,9 +479,6 @@ 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 @@ -652,9 +649,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA 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}------ @@ -871,6 +865,7 @@ STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE :{BIG_FONT}{BLAC 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_SHOW_VEHICLE_GROUP_TOOLTIP :{BLACK}Abrir la ventana de este vehículo 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} @@ -1117,7 +1112,7 @@ STR_CONFIG_SETTING_FILTER_TITLE :{BLACK}Filtrar 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_DEFAULT_VALUE :{LTBLUE}Valor por defecto: {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) @@ -1127,11 +1122,11 @@ STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :Opción de empr 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_DROPDOWN_HELPTEXT :{BLACK}Restringir lista de opciones a los filtros predefinidos 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_DEFAULT :Opciones con un valor diferente al valor por defecto 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 @@ -1239,9 +1234,9 @@ 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_NONSTOP_BY_DEFAULT_HELPTEXT :Un vehículo hace parada en cada estación por la que pasa, pero al activar esta opción el vehículo seguirá de largo hasta llegar a su destino. Esta opción solamente define el valor por defecto para nuevas órdenes, pero cada orden individual puede ajustarse según la acción deseada 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_HELPTEXT :Altura por defecto del andén a la que para un tren: en el "principio" el tren para cerca de la entrada; en el "centro", el tren para en medio del andén; en el "fondo", el tren para cerca de la salida. Esta opción solamente define el valor por defecto para nuevas órdenes, pero cada orden individual puede ajustarse según la acción deseada STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :principio STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :centro STR_CONFIG_SETTING_STOP_LOCATION_FAR_END :fondo @@ -1262,7 +1257,7 @@ STR_CONFIG_SETTING_ALLOW_FUND_ROAD_HELPTEXT :Las empresas ap 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_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, sobre todo 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} @@ -1315,6 +1310,8 @@ STR_CONFIG_SETTING_POPULATION_IN_LABEL :Mostrar poblaci 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_SHOW_NEWGRF_NAME :Mostrar el nombre del GRF en la ventana de construcción de vehículo: {STRING} +STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Indicar por medio de una línea adicional en la ventana de construcción de vehículo su NewGRF. 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 @@ -1432,8 +1429,8 @@ STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Mostrar salidas 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 :Tipo de vías por defecto al iniciar o cargar un juego: {STRING} +STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_HELPTEXT :Tipo de vías de tren por defecto 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 @@ -1481,7 +1478,7 @@ STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT_HELPTEXT :Activar esta op 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 :Perfil por defecto: {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 @@ -1497,16 +1494,16 @@ STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_VALUE :{COMMA} MiB 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_TRAINS :Intervalo de mantenimiento por defecto para trenes: {STRING} +STR_CONFIG_SETTING_SERVINT_TRAINS_HELPTEXT :Intervalo de mantenimiento por defecto 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_SERVINT_ROAD_VEHICLES :Intervalo de mantenimiento por defecto para vehículos de carretera: {STRING} +STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES_HELPTEXT :Intervalo de mantenimiento por defecto para nuevos vehículos de carretera, en caso de no definirse otro explícitamente +STR_CONFIG_SETTING_SERVINT_AIRCRAFT :Intervalo de mantenimiento por defecto para aeronaves: {STRING} +STR_CONFIG_SETTING_SERVINT_AIRCRAFT_HELPTEXT :Intervalo de mantenimiento por defecto para nuevas aeronaves, en caso de no definirse otro explícitamente +STR_CONFIG_SETTING_SERVINT_SHIPS :Intervalo de mantenimiento por defecto para barcos: {STRING} +STR_CONFIG_SETTING_SERVINT_SHIPS_HELPTEXT :Intervalo de mantenimiento por defecto 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} @@ -1552,6 +1549,10 @@ 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_ENDING_YEAR :Año de fin de juego: {STRING} +STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Año en el que se termina el juego para registrar la puntuación de la empresa y mostrar la tabla de puntuaciones, aunque el jugador puede continuar el juego.{}Cualquier fecha anterior al año de incio hará que la tabla de puntuaciones nunca se muestre. +STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} +STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Nunca 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} @@ -1569,8 +1570,8 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Señales mecán 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_TYPE :Tipo de señal a instalar por defecto: {STRING} +STR_CONFIG_SETTING_DEFAULT_SIGNAL_TYPE_HELPTEXT :Tipo de señal por defecto STR_CONFIG_SETTING_DEFAULT_SIGNAL_NORMAL :Señales de tramo STR_CONFIG_SETTING_DEFAULT_SIGNAL_PBS :Señales de ruta STR_CONFIG_SETTING_DEFAULT_SIGNAL_PBSOWAY :Señales de ruta de un sentido @@ -1667,7 +1668,7 @@ STR_CONFIG_SETTING_DEMAND_DISTANCE_HELPTEXT :Con un valor di 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_SHORT_PATH_SATURATION_HELPTEXT :Entre dos estaciones usualmente hay más de una ruta posible. Se intentarán saturar las rutas más cortas primero, luego las que les 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 @@ -2128,7 +2129,7 @@ STR_NETWORK_GIVE_MONEY_CAPTION :{WHITE}Introduc 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 :{BLACK}Contraseña por defecto 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 @@ -2386,7 +2387,7 @@ STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}Construi 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_DFLT :Estación por defecto STR_STATION_CLASS_WAYP :Puntos guías # Signal window @@ -2803,7 +2804,7 @@ STR_SAVELOAD_SAVE_SCENARIO :{WHITE}Guardar 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_HOME_BUTTON :{BLACK}Clic para ir a la carpeta de guardado por defecto 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 @@ -3401,6 +3402,10 @@ STR_INDUSTRY_DIRECTORY_ITEM_PROD2 :{ORANGE}{INDUST STR_INDUSTRY_DIRECTORY_ITEM_PROD3 :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} STR_INDUSTRY_DIRECTORY_ITEM_PRODMORE :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} y {NUM} más... 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 +STR_INDUSTRY_DIRECTORY_ACCEPTED_CARGO_FILTER :{BLACK}Cargamento aceptado: {SILVER}{STRING} +STR_INDUSTRY_DIRECTORY_PRODUCED_CARGO_FILTER :{BLACK}Cargemento producido: {SILVER}{STRING} +STR_INDUSTRY_DIRECTORY_FILTER_ALL_TYPES :Todos los tipos +STR_INDUSTRY_DIRECTORY_FILTER_NONE :Ninguno # Industry view STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTRY} @@ -3831,7 +3836,7 @@ STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP :{BLACK}Incremen 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_DEFAULT :Por defecto STR_VEHICLE_DETAILS_DAYS :Días STR_VEHICLE_DETAILS_PERCENT :Porcentaje @@ -4132,7 +4137,7 @@ STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}Mostrar 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_NO_AI_FOUND :No se encontró ninguna IA apropiada para cargar.{}Esta es una IA estándar que no hace nada.{}Se pueden descargar nuevas IA desde el "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 @@ -4175,6 +4180,14 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Elegir e STR_AI_LIST_CANCEL :{BLACK}Cancelar STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}No cambiar de script +STR_SCREENSHOT_CAPTION :{WHITE}Tomar captura de pantalla +STR_SCREENSHOT_SCREENSHOT :{BLACK}Captura normal +STR_SCREENSHOT_ZOOMIN_SCREENSHOT :{BLACK}Acercamiento máximo +STR_SCREENSHOT_DEFAULTZOOM_SCREENSHOT :{BLACK}Acercamiento por defecto +STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Mapa completo +STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Mapa de alturas +STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Captura de minimapa + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}Parámetros {STRING} STR_AI_SETTINGS_CAPTION_AI :IA @@ -4258,7 +4271,7 @@ STR_WARNING_FALLBACK_SOUNDSET :{WHITE}Solament # 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_WARNING_SCREENSHOT_SIZE_MESSAGE :{YELLOW}La captura de pantalla tendrá una resolución {COMMA}×{COMMA} pixeles, y puede tardar un poco en realizarse. ¿Continuar? STR_MESSAGE_SCREENSHOT_SUCCESSFULLY :{WHITE}Captura de pantalla guardada exitosamente en '{STRING}' STR_ERROR_SCREENSHOT_FAILED :{WHITE}¡La captura de pantalla falló! diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index 7881727d71..e06709f1bf 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -478,9 +478,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Visa/dölj konsolen STR_ABOUT_MENU_AI_DEBUG :Felsökning av AI / spelskript STR_ABOUT_MENU_SCREENSHOT :Skärmdump -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Fullt inzoomad skärmdump -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Normalt inzoomad skärmdump -STR_ABOUT_MENU_GIANT_SCREENSHOT :Skärmdump av hela kartan STR_ABOUT_MENU_SHOW_FRAMERATE :Visa bildfrekvens STR_ABOUT_MENU_ABOUT_OPENTTD :Om 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Justering av spriteobjekt @@ -651,9 +648,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Personlig 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Musikvolym STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Effektvolym -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAX -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}------ @@ -4165,6 +4159,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Välj ma STR_AI_LIST_CANCEL :{BLACK}Avbryt STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Ändra inte datorspelare + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} parametrar STR_AI_SETTINGS_CAPTION_AI :Datorspelarens diff --git a/src/lang/tamil.txt b/src/lang/tamil.txt index 3634865098..bbc5ebeb14 100644 --- a/src/lang/tamil.txt +++ b/src/lang/tamil.txt @@ -468,9 +468,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :முனையத்தை மாற்று STR_ABOUT_MENU_AI_DEBUG :AI/வரிவடிவம் சரிபார் 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 :ஸ்ரைட்டு அலைனர் @@ -637,9 +634,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}பாடல்பட்டியல் 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}ஒலி அளவு STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}ஒலியமைப்புகளின் அளவு -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}குறைந்தபட்ச -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}அதிகபட்ச -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}------ @@ -944,6 +938,7 @@ STR_GAME_OPTIONS_LANGUAGE :{BLACK}மொ STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :{BLACK}பயன்படுத்தப்போகும் மொழியினை தேர்ந்தெடு STR_GAME_OPTIONS_FULLSCREEN :{BLACK}முழு படம் +STR_GAME_OPTIONS_FULLSCREEN_TOOLTIP :{BLACK}OpenTTD-ஐ முழுத்திரையில் விளையாட இந்த கட்டத்தினை சொடுக்கவும் STR_GAME_OPTIONS_RESOLUTION :{BLACK}திரையின் அளவு STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}திரை அளவினைத் தேர்ந்தெடுக்கவும் @@ -983,6 +978,7 @@ STR_CURRENCY_INCREASE_EXCHANGE_RATE_TOOLTIP :{BLACK}உங STR_CURRENCY_SET_EXCHANGE_RATE_TOOLTIP :{BLACK}உங்களது நாணயத்தின் நாணயமாற்று விகிதத்தை ஒரு பவுண்டாக (£) அமைக்கவும் STR_CURRENCY_SEPARATOR :{LTBLUE}பிரிப்பான்: {ORANGE}{STRING} +STR_CURRENCY_SET_CUSTOM_CURRENCY_SEPARATOR_TOOLTIP :{BLACK}உங்களது நாணயத்தின் பிரியியினை அமை STR_CURRENCY_PREFIX :{LTBLUE}முன் ஒட்டு: {ORANGE}{STRING} STR_CURRENCY_SET_CUSTOM_CURRENCY_PREFIX_TOOLTIP :{BLACK}உங்கள் நாணயத்தின் முன் ஒட்டத்தினை அமையுங்கள் @@ -1281,6 +1277,7 @@ STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_NON_LANDSCAPING :அனைத் STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_ACTIONS :அனைத்து செயல்கள் STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS :வாகனப் பட்டியலினைப் பயன்படுத்தவும்: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :வாகனங்களை ஏற்றுவதற்கு அல்லது இறக்குவதற்கு மேலே ஏற்றுதல் குறிகாட்டிகள் காட்டப்படுகிறதா என்பதைத் தேர்ந்தெடுக்கவும் +STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :கால அட்டவணையை நாட்களில் அல்லாமல் சொடுக்குகளில் காட்டு: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :கால அட்டவணைகளில் காலங்களைக் காட்டவும்: {STRING} STR_CONFIG_SETTING_QUICKGOTO :வாகன கட்டளைகளை விரிவாக உருவாக்கவும்: {STRING} STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_FIRST :முதலில் கிடைக்கும் @@ -1371,6 +1368,7 @@ STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :நிற ச STR_CONFIG_SETTING_STARTING_YEAR :தொடங்கும் வருடம்: {STRING} STR_CONFIG_SETTING_SMOOTH_ECONOMY :இயல்பான பொருளாதாரத்தினைச் செயல்படுத்தவும் (அதிகமான, சிறிய மாற்றங்கள்): {STRING} STR_CONFIG_SETTING_ALLOW_SHARES :மற்ற நிறுவனங்களின் பங்குகளை வாங்குவதை அனுமதிக்கவும்: {STRING} +STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :பங்குகள் பரிமாற்றத்திற்கு தேவையான குறைந்தபட்ச நிறுவன வயது: {STRING} STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :இழுத்தால், சிக்னல்களை இடவும், ஒவ்வொறு: {STRING} STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} கட்ட{P 0 "ம்" ங்கள்} STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :இழுக்கும்போது, சிக்னல்களுக்கு இடையே சீரான இடைவேளியினை விடவும்: {STRING} @@ -1438,6 +1436,7 @@ STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :தொடக் STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :ஆட்டத்தின் தொடக்கத்தில் மாநகரங்களின் அளவு நகரங்களை ஒப்பிடுகையில் STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :கைமுறை +STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC :சமச்சீர்மையிலா STR_CONFIG_SETTING_DISTRIBUTION_SYMMETRIC :சமச்சீரான STR_CONFIG_SETTING_DISTRIBUTION_PAX :பயணிகள் பரிமாற்றம் வகை: {STRING} STR_CONFIG_SETTING_DISTRIBUTION_MAIL :அஞ்சல் பரிமாற்றம் வகை: {STRING} @@ -1476,6 +1475,7 @@ STR_CONFIG_SETTING_SOUND :{ORANGE}ஒல STR_CONFIG_SETTING_INTERFACE :{ORANGE}Interface STR_CONFIG_SETTING_INTERFACE_GENERAL :{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}வாகனங்கள் @@ -1509,6 +1509,7 @@ STR_CONFIG_ERROR_ARRAY :{WHITE}... '{ST STR_CONFIG_ERROR_INVALID_VALUE :{WHITE}... செல்லாத மதிப்பு '{STRING}' '{STRING}' இற்கு STR_CONFIG_ERROR_INVALID_GRF :{WHITE}... பயன்படுத்த இயலாத NewGRF இனை பயன்படுத்தவில்லை '{STRING}': {STRING} STR_CONFIG_ERROR_INVALID_GRF_NOT_FOUND :கிடைக்கவில்லை +STR_CONFIG_ERROR_INVALID_GRF_UNSAFE :நிலையான பயன்பாட்டிற்கு உகந்தது அல்ல STR_CONFIG_ERROR_INVALID_GRF_SYSTEM :கணினி NewGRF STR_CONFIG_ERROR_INVALID_GRF_INCOMPATIBLE :இந்த OpenTTD பதிப்புடன் பயன்படுத்த இயலாது STR_CONFIG_ERROR_INVALID_GRF_UNKNOWN :தெரியவில்லை @@ -2414,7 +2415,9 @@ STR_FRAMERATE_BYTES_GOOD :{LTBLUE}{BYTES} STR_FRAMERATE_BYTES_WARN :{YELLOW}{BYTES} STR_FRAMERATE_BYTES_BAD :{RED}{BYTES} ############ Leave those lines in this order!! +STR_FRAMERATE_GL_LANDSCAPE :{BLACK} உலக சொடுக்குகள்: STR_FRAMERATE_GL_LINKGRAPH :{BLACK} இணைப்பு வரைபட தாமதம்: +STR_FRAMERATE_SOUND :{BLACK}இசை இயக்கம்: STR_FRAMERATE_ALLSCRIPTS :{BLACK} GS/AI மொத்தம்: ############ End of leave-in-this-order ############ Leave those lines in this order!! @@ -2557,6 +2560,7 @@ STR_NEWGRF_SETTINGS_VERSION :{BLACK}பத STR_NEWGRF_SETTINGS_MIN_VERSION :{BLACK}குறைந்த். பயன்படுத்தக்கூடிய பதிப்பு: {SILVER}{NUM} STR_NEWGRF_SETTINGS_MD5SUM :{BLACK}MD5sum: {SILVER}{STRING} STR_NEWGRF_SETTINGS_PALETTE :{BLACK}தட்டு: {SILVER}{STRING} +STR_NEWGRF_SETTINGS_PALETTE_DEFAULT_32BPP :முதன்மை / 32 bpp STR_NEWGRF_SETTINGS_PALETTE_LEGACY :மரபுரிமை (W) STR_NEWGRF_SETTINGS_PARAMETER :{BLACK}குணாதிசயங்கள்: {SILVER}{STRING} STR_NEWGRF_SETTINGS_PARAMETER_NONE :ஒன்றுமில்லை @@ -2958,6 +2962,7 @@ STR_INDUSTRY_VIEW_INDUSTRY_ANNOUNCED_CLOSURE :{YELLOW}தொ STR_INDUSTRY_VIEW_REQUIRES :{BLACK}வேண்டியவன: +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} காத்துக்கொண்டிருக்கிறது{STRING} STR_CONFIG_GAME_PRODUCTION :{WHITE}தயாரிப்பினை மாற்றவும் (8 இன் பெருக்கங்கள், 2040 வரை) STR_CONFIG_GAME_PRODUCTION_LEVEL :{WHITE}தயாரிப்பு அளவினை மாற்றவும் (சதவிகிதம், 800% வரை) @@ -3085,6 +3090,7 @@ 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_ROAD_VEHICLE_SHOW_TOGGLE_BUTTON :{BLACK}காட்சி @@ -3207,6 +3213,7 @@ STR_REPLACE_ELRAIL_VEHICLES :மின்ச STR_REPLACE_MONORAIL_VEHICLES :மோனோ இரயில் வாகனங்கள் STR_REPLACE_MAGLEV_VEHICLES :மேக்லெவ் வாகனங்கள் +STR_REPLACE_ROAD_VEHICLES :சாலை வாகனங்கள் STR_REPLACE_TRAM_VEHICLES :அமிழ் தண்டூர்தி வாகனங்கள் STR_REPLACE_REMOVE_WAGON :{BLACK}பெட்டி நீக்கம்: {ORANGE}{STRING} @@ -3630,6 +3637,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}கு STR_AI_LIST_CANCEL :{BLACK}இரத்து செய் STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}வரிவடிவத்தினை மாற்றாதே + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} குணாதிசயங்கள் STR_AI_SETTINGS_CAPTION_AI :AI diff --git a/src/lang/thai.txt b/src/lang/thai.txt index a17f625bb6..f4889f0779 100644 --- a/src/lang/thai.txt +++ b/src/lang/thai.txt @@ -462,9 +462,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :เปิด/ปิด คอนโซล STR_ABOUT_MENU_AI_DEBUG :ดีบัก สคริปต์ AI/Game STR_ABOUT_MENU_SCREENSHOT :จับภาพหน้าจอ (Ctrl+S) -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :จับภาพหน้าจอในแบบขยายใหญ่สุด -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :ค่าเริ่มต้นของการขยายภาพในการจับหน้าจอ -STR_ABOUT_MENU_GIANT_SCREENSHOT :จับภาพหน้าจอทั้งแผนที่ (Ctrl+G) STR_ABOUT_MENU_ABOUT_OPENTTD :เกี่ยวกับ 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :ตัวจัดแนว Sprite STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :เปิด/ปิด bounding boxes @@ -634,9 +631,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}กำหนดเอง 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}ระดับเสียงดนตรี STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}ระดับเสียงเอฟเฟกต์ -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}ต่ำสุด -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}สูงสุด -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}------ @@ -3915,6 +3909,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}เล STR_AI_LIST_CANCEL :{BLACK}ยกเลิก STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}ไม่สามารถเปลี่ยน script + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameters STR_AI_SETTINGS_CAPTION_AI :AI diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index a1348c3030..4c3570ce23 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -470,9 +470,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :切換主控台 STR_ABOUT_MENU_AI_DEBUG :AI/遊戲腳本除錯 STR_ABOUT_MENU_SCREENSHOT :擷取畫面 -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :最近鏡截圖 -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :在預設的縮放範圍截圖 -STR_ABOUT_MENU_GIANT_SCREENSHOT :擷取全場景畫面 STR_ABOUT_MENU_ABOUT_OPENTTD :關於「OpenTTD」 STR_ABOUT_MENU_SPRITE_ALIGNER :子畫面定位工具 STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :切換邊界框 @@ -642,9 +639,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}自訂二 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}背景音樂音量 STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}音效音量 -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}最小 -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}最大 -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}------ @@ -4001,6 +3995,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}選擇 STR_AI_LIST_CANCEL :{BLACK}取消 STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}不改變腳本 + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} 參數 STR_AI_SETTINGS_CAPTION_AI :AI diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt index b8e34b3ce7..17ccff6c32 100644 --- a/src/lang/turkish.txt +++ b/src/lang/turkish.txt @@ -474,9 +474,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Konsolu aç/kapa STR_ABOUT_MENU_AI_DEBUG :YZ/Oyun betik hata ayıklama STR_ABOUT_MENU_SCREENSHOT :Ekran görüntüsü -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Tamamen yakınlaştırılmış ekran görüntüsü -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Varsayılan yakınlıkta ekran görüntüsü -STR_ABOUT_MENU_GIANT_SCREENSHOT :Tüm harita ekran görüntüsü STR_ABOUT_MENU_SHOW_FRAMERATE :Kare oranını göster STR_ABOUT_MENU_ABOUT_OPENTTD :'OpenTTD' Hakkında STR_ABOUT_MENU_SPRITE_ALIGNER :Nesne hizalayıcı @@ -647,9 +644,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Özel 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Müzik Sesi STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Efekt Sesi -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}ASGARİ -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}AZAMİ -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}------ @@ -4109,6 +4103,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Vurgulan STR_AI_LIST_CANCEL :{BLACK}İptal STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Betiği değiştirme + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametreler STR_AI_SETTINGS_CAPTION_AI :YZ diff --git a/src/lang/ukrainian.txt b/src/lang/ukrainian.txt index 54cbe37685..6ef8e7f71f 100644 --- a/src/lang/ukrainian.txt +++ b/src/lang/ukrainian.txt @@ -603,9 +603,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Вкл./відкл. консоль STR_ABOUT_MENU_AI_DEBUG :Налагодження АІ / Ігрового Скрипта 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 :Вирівнювання спрайтів @@ -779,9 +776,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Набір 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Гучність музики STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Гучність ефектів -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}Мін. -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}Макс. -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}------ @@ -4305,6 +4299,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Вибр STR_AI_LIST_CANCEL :{BLACK}Відміна STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Не міняти скрипт + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Параметри STR_AI_SETTINGS_CAPTION_AI :АІ diff --git a/src/lang/unfinished/chuvash.txt b/src/lang/unfinished/chuvash.txt index cdca14b152..44deeae30f 100644 --- a/src/lang/unfinished/chuvash.txt +++ b/src/lang/unfinished/chuvash.txt @@ -272,7 +272,6 @@ STR_TOOLBAR_SOUND_MUSIC :Сасӑ/Юрӑ ############ range for about menu starts STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_SCREENSHOT :Экран сӑнӗ -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Яланхилле экран сӑнӗ STR_ABOUT_MENU_ABOUT_OPENTTD :'OpenTTD' çинчен ############ range ends here @@ -391,9 +390,6 @@ STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}Пурӗ ############ End of order list # Music window -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}ЧИ САХ(MIN) -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}ЧИ НУМ(MAX) -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}------ @@ -1302,6 +1298,7 @@ STR_AI_CONFIG_CHANGE_NONE : STR_AI_LIST_VERSION :{LTBLUE}Верси: {ORANGE}{NUM} + # AI Parameters STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} diff --git a/src/lang/unfinished/frisian.txt b/src/lang/unfinished/frisian.txt index 355da5ceb8..3af7f6a751 100644 --- a/src/lang/unfinished/frisian.txt +++ b/src/lang/unfinished/frisian.txt @@ -470,9 +470,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Skeakel console oan/ût STR_ABOUT_MENU_AI_DEBUG :AI/Gamescript debug STR_ABOUT_MENU_SCREENSHOT :Skermôfbylding -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Tichtby helle skermôfbylding -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Standerdzoom skermôfbylding -STR_ABOUT_MENU_GIANT_SCREENSHOT :Skermôfbylding fan 'e hiele wrâld STR_ABOUT_MENU_ABOUT_OPENTTD :Oer 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Flakken rjochtsje STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Skeakel seleksjekaders oan/út @@ -642,9 +639,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Oanpast 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Musykfolume STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Effektenfolume -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MIN -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAKS -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}------ @@ -3578,6 +3572,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Selektea STR_AI_LIST_CANCEL :{BLACK}Annulearje STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Skript net feroare + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameters STR_AI_SETTINGS_CAPTION_AI :AI diff --git a/src/lang/unfinished/ido.txt b/src/lang/unfinished/ido.txt index 90e7cc2af4..e709ba47c9 100644 --- a/src/lang/unfinished/ido.txt +++ b/src/lang/unfinished/ido.txt @@ -369,7 +369,6 @@ STR_PERFORMANCE_DETAIL_PERCENT :{WHITE}{NUM}% ############ End of order list # Music window -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}------ @@ -1153,6 +1152,7 @@ STR_AI_CONFIG_CHANGE_NONE : + # AI Parameters STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} diff --git a/src/lang/unfinished/macedonian.txt b/src/lang/unfinished/macedonian.txt index c77747a4d5..4a623223f4 100644 --- a/src/lang/unfinished/macedonian.txt +++ b/src/lang/unfinished/macedonian.txt @@ -444,8 +444,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Вклучи конзола STR_ABOUT_MENU_AI_DEBUG :АИ / игри сценарио де-бубачки STR_ABOUT_MENU_SCREENSHOT :Слика од екранот -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Зумира екранот -STR_ABOUT_MENU_GIANT_SCREENSHOT :Целата сајтот екранот STR_ABOUT_MENU_ABOUT_OPENTTD :За 'ОтвориTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :самовила усогласат STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Вклучи одблеснува кутии @@ -614,9 +612,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Свое 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Гласност на музка STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Гласност на ефекти -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}МИН -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MAX -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}------ @@ -1677,6 +1672,7 @@ STR_AI_LIST_CAPTION_GAMESCRIPT :GameScripts + # AI Parameters STR_AI_SETTINGS_CAPTION_AI :АИ STR_AI_SETTINGS_CAPTION_GAMESCRIPT :GameScript diff --git a/src/lang/unfinished/maltese.txt b/src/lang/unfinished/maltese.txt index 8f9079d282..2728fd297f 100644 --- a/src/lang/unfinished/maltese.txt +++ b/src/lang/unfinished/maltese.txt @@ -338,7 +338,6 @@ STR_PERFORMANCE_DETAIL_PERCENT :{WHITE}{NUM}% ############ End of order list # Music window -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}------ @@ -1022,6 +1021,7 @@ STR_AI_CONFIG_CHANGE_NONE : + # AI Parameters diff --git a/src/lang/unfinished/marathi.txt b/src/lang/unfinished/marathi.txt index f6e6832ff3..6ef399f161 100644 --- a/src/lang/unfinished/marathi.txt +++ b/src/lang/unfinished/marathi.txt @@ -436,9 +436,6 @@ STR_NEWS_MENU_MESSAGE_HISTORY_MENU :निरोप STR_ABOUT_MENU_LAND_BLOCK_INFO :जागाची माहिती STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_SCREENSHOT :द्श्य -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :द्श्य मोठे करा -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :स्थिर द्श्य -STR_ABOUT_MENU_GIANT_SCREENSHOT :संपूर्ण नकाशा स्क्रीनशॉट STR_ABOUT_MENU_ABOUT_OPENTTD :ओपेन टीटीडी बद्दल ############ range ends here @@ -601,9 +598,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}सानुकूल २ STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}संगीत आवाज STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}प्रभाव आवाज -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}कमी -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}अधिक -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}------ @@ -1490,6 +1484,7 @@ STR_AI_CONFIG_CHANGE_NONE : + # AI Parameters STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} diff --git a/src/lang/unfinished/persian.txt b/src/lang/unfinished/persian.txt index 907d4deb35..907bd0935c 100644 --- a/src/lang/unfinished/persian.txt +++ b/src/lang/unfinished/persian.txt @@ -459,9 +459,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :باز و بسته کردن کنسول STR_ABOUT_MENU_AI_DEBUG :خطایابی هوش مصنوعی STR_ABOUT_MENU_SCREENSHOT :تصویر از بازی -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :عکس از صفحه تمام بزرگنمایی شده -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :اندازه پیش فرض عکس برداری از صفحه -STR_ABOUT_MENU_GIANT_SCREENSHOT :تصویر از همه نقشه STR_ABOUT_MENU_ABOUT_OPENTTD :'OpenTTD' درباره STR_ABOUT_MENU_SPRITE_ALIGNER :تراز کردن تصویر گرافیکی STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :باز/بسته کردن محدوده جعبه ها @@ -631,9 +628,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}انتخابی 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}شدت صدای موسیقی STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}شدت صدای محیط -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}کمینه -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}بیشینه -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}------ @@ -3290,6 +3284,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}انتخ STR_AI_LIST_CANCEL :{BLACK}لغو STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}کد را تغییر نده + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} پارامترها STR_AI_SETTINGS_CAPTION_AI :هوش مصنوعی(AI) diff --git a/src/lang/unfinished/urdu.txt b/src/lang/unfinished/urdu.txt index 60b897192c..30d80d58a1 100644 --- a/src/lang/unfinished/urdu.txt +++ b/src/lang/unfinished/urdu.txt @@ -452,9 +452,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :حائطھ تدویم STR_ABOUT_MENU_AI_DEBUG :AI debug STR_ABOUT_MENU_SCREENSHOT :اسکرین کی تصویر -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :مکمل قریب سے اسکرین کی تصویر -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :پہلے سے طے شدہ قربت سے اسکرین کی تصویر -STR_ABOUT_MENU_GIANT_SCREENSHOT :پورے نقشے کی اسکرین کی تصویر STR_ABOUT_MENU_ABOUT_OPENTTD :Open TTD کے بارے میں STR_ABOUT_MENU_SPRITE_ALIGNER :sprite صف بندھ STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :احاطہ کرنے والے ڈبوں کی تدویم کیجئیے @@ -622,9 +619,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}اپنی مرضی کے مطابق 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}موسیقی کی آواز STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}اثرات کی آواز -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}کم -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}زیادہ -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}------ @@ -2546,6 +2540,7 @@ STR_AI_CONFIG_CHANGE_NONE : + # AI Parameters diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index ec481da973..7d036eaeb8 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -478,9 +478,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Bật/tắt bảng lệnh STR_ABOUT_MENU_AI_DEBUG :Gỡ rối AI / Game script STR_ABOUT_MENU_SCREENSHOT :Ảnh chụp màn hình -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 @@ -651,9 +648,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Tự Chọn 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Âm Lượng STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Hiệu Ứng Tiếng -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}Nhỏ -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}Lớn -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}------ @@ -4174,6 +4168,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Chấp n STR_AI_LIST_CANCEL :{BLACK}Huỷ bỏ STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Không đổi tập lệnh + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Các Thông Số STR_AI_SETTINGS_CAPTION_AI :AI diff --git a/src/lang/welsh.txt b/src/lang/welsh.txt index d107bd82d5..84a203f842 100644 --- a/src/lang/welsh.txt +++ b/src/lang/welsh.txt @@ -470,9 +470,6 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Toglu Consol STR_ABOUT_MENU_AI_DEBUG :Dadnamu AI / Sgript Gêm STR_ABOUT_MENU_SCREENSHOT :Ciplun -STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Ciplun lefel mwyhád uchaf -STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Ciplun pellter rhagosodedig -STR_ABOUT_MENU_GIANT_SCREENSHOT :Ciplun o'r map cyfan STR_ABOUT_MENU_ABOUT_OPENTTD :Gwybodaeth am 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Aliniwr corluniau STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Toglo bocsys ffinio @@ -642,9 +639,6 @@ STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLA STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Cyfaddas 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Lefel Sain Cerddoriaeth STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Lefel Sain Effeithiau -STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}ISAF -STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}UCHAF -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}------ @@ -4032,6 +4026,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Dewis y STR_AI_LIST_CANCEL :{BLACK}Canslo STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Peidio newid y sgript + # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Paramedrau STR_AI_SETTINGS_CAPTION_AI :AI diff --git a/src/linkgraph/mcf.cpp b/src/linkgraph/mcf.cpp index c64674237f..c8c031ea3b 100644 --- a/src/linkgraph/mcf.cpp +++ b/src/linkgraph/mcf.cpp @@ -494,13 +494,17 @@ MCF1stPass::MCF1stPass(LinkGraphJob &job) : MultiCommodityFlow(job) uint size = job.Size(); uint accuracy = job.Settings().accuracy; bool more_loops; + std::vector finished_sources(size); do { more_loops = false; for (NodeID source = 0; source < size; ++source) { + if (finished_sources[source]) continue; + /* First saturate the shortest paths. */ this->Dijkstra(source, paths); + bool source_demand_left = false; for (NodeID dest = 0; dest < size; ++dest) { Edge edge = job[source][dest]; if (edge.UnsatisfiedDemand() > 0) { @@ -518,8 +522,10 @@ MCF1stPass::MCF1stPass(LinkGraphJob &job) : MultiCommodityFlow(job) path->GetFreeCapacity() > INT_MIN) { this->PushFlow(edge, path, accuracy, UINT_MAX); } + if (edge.UnsatisfiedDemand() > 0) source_demand_left = true; } } + finished_sources[source] = !source_demand_left; this->CleanupPaths(source, paths); } } while (more_loops || this->EliminateCycles()); @@ -537,18 +543,27 @@ MCF2ndPass::MCF2ndPass(LinkGraphJob &job) : MultiCommodityFlow(job) uint size = job.Size(); uint accuracy = job.Settings().accuracy; bool demand_left = true; + std::vector finished_sources(size); while (demand_left) { demand_left = false; for (NodeID source = 0; source < size; ++source) { + if (finished_sources[source]) continue; + this->Dijkstra(source, paths); + + bool source_demand_left = false; for (NodeID dest = 0; dest < size; ++dest) { Edge edge = this->job[source][dest]; Path *path = paths[dest]; if (edge.UnsatisfiedDemand() > 0 && path->GetFreeCapacity() > INT_MIN) { this->PushFlow(edge, path, accuracy, UINT_MAX); - if (edge.UnsatisfiedDemand() > 0) demand_left = true; + if (edge.UnsatisfiedDemand() > 0) { + demand_left = true; + source_demand_left = true; + } } } + finished_sources[source] = !source_demand_left; this->CleanupPaths(source, paths); } } diff --git a/src/misc.cpp b/src/misc.cpp index c56eb6a38d..dcb04fa026 100644 --- a/src/misc.cpp +++ b/src/misc.cpp @@ -29,6 +29,7 @@ #include "station_kdtree.h" #include "town_kdtree.h" #include "viewport_kdtree.h" +#include "newgrf_profiling.h" #include "safeguards.h" @@ -69,6 +70,8 @@ void InitializeGame(uint size_x, uint size_y, bool reset_date, bool reset_settin _thd.redsq = INVALID_TILE; if (reset_settings) MakeNewgameSettingsLive(); + _newgrf_profilers.clear(); + if (reset_date) { SetDate(ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1), 0); InitializeOldNames(); diff --git a/src/music/fluidsynth.cpp b/src/music/fluidsynth.cpp index aa70767716..64abe0e538 100644 --- a/src/music/fluidsynth.cpp +++ b/src/music/fluidsynth.cpp @@ -15,11 +15,13 @@ #include "midifile.hpp" #include #include "../mixer.h" +#include static struct { fluid_settings_t* settings; ///< FluidSynth settings handle fluid_synth_t* synth; ///< FluidSynth synthesizer handle fluid_player_t* player; ///< FluidSynth MIDI player handle + std::mutex synth_mutex; ///< Guard mutex for synth access } _midi; ///< Metadata about the midi we're playing. /** Factory for the FluidSynth driver. */ @@ -42,12 +44,16 @@ static const char *default_sf[] = { static void RenderMusicStream(int16 *buffer, size_t samples) { - if (!_midi.synth || !_midi.player) return; + std::unique_lock lock{ _midi.synth_mutex, std::try_to_lock }; + + if (!lock.owns_lock() || !_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) { + std::lock_guard lock{ _midi.synth_mutex }; + const char *sfont_name = GetDriverParam(param, "soundfont"); int sfont_id; @@ -59,6 +65,11 @@ const char *MusicDriver_FluidSynth::Start(const char * const *param) /* Don't try to lock sample data in memory, OTTD usually does not run with privileges allowing that */ fluid_settings_setint(_midi.settings, "synth.lock-memory", 0); + /* Install the music render routine and set up the samplerate */ + uint32 samplerate = MxSetMusicSource(RenderMusicStream); + fluid_settings_setnum(_midi.settings, "synth.sample-rate", samplerate); + DEBUG(driver, 1, "Fluidsynth: samplerate %.0f", (float)samplerate); + /* Create the synthesizer. */ _midi.synth = new_fluid_synth(_midi.settings); if (!_midi.synth) return "Could not open synth"; @@ -81,19 +92,23 @@ const char *MusicDriver_FluidSynth::Start(const char * const *param) _midi.player = nullptr; - uint32 samplerate = MxSetMusicSource(RenderMusicStream); - fluid_synth_set_sample_rate(_midi.synth, samplerate); - DEBUG(driver, 1, "Fluidsynth: samplerate %.0f", (float)samplerate); - return nullptr; } void MusicDriver_FluidSynth::Stop() { MxSetMusicSource(nullptr); - this->StopSong(); - delete_fluid_synth(_midi.synth); - delete_fluid_settings(_midi.settings); + + std::lock_guard lock{ _midi.synth_mutex }; + + if (_midi.player != nullptr) delete_fluid_player(_midi.player); + _midi.player = nullptr; + + if (_midi.synth != nullptr) delete_fluid_synth(_midi.synth); + _midi.synth = nullptr; + + if (_midi.settings != nullptr) delete_fluid_settings(_midi.settings); + _midi.settings = nullptr; } void MusicDriver_FluidSynth::PlaySong(const MusicSongInfo &song) @@ -106,6 +121,8 @@ void MusicDriver_FluidSynth::PlaySong(const MusicSongInfo &song) return; } + std::lock_guard lock{ _midi.synth_mutex }; + _midi.player = new_fluid_player(_midi.synth); if (!_midi.player) { DEBUG(driver, 0, "Could not create midi player"); @@ -128,6 +145,8 @@ void MusicDriver_FluidSynth::PlaySong(const MusicSongInfo &song) void MusicDriver_FluidSynth::StopSong() { + std::lock_guard lock{ _midi.synth_mutex }; + if (!_midi.player) return; fluid_player_stop(_midi.player); @@ -136,11 +155,13 @@ void MusicDriver_FluidSynth::StopSong() } delete_fluid_player(_midi.player); fluid_synth_system_reset(_midi.synth); + fluid_synth_all_sounds_off(_midi.synth, -1); _midi.player = nullptr; } bool MusicDriver_FluidSynth::IsSongPlaying() { + std::lock_guard lock{ _midi.synth_mutex }; if (!_midi.player) return false; return fluid_player_get_status(_midi.player) == FLUID_PLAYER_PLAYING; @@ -148,12 +169,15 @@ bool MusicDriver_FluidSynth::IsSongPlaying() void MusicDriver_FluidSynth::SetVolume(byte vol) { + std::lock_guard lock{ _midi.synth_mutex }; + if (_midi.settings == nullptr) return; + /* Allowed range of synth.gain is 0.0 to 10.0 */ /* fluidsynth's default gain is 0.2, so use this as "full * volume". Set gain using OpenTTD's volume, as a number between 0 * and 0.2. */ double gain = (1.0 * vol) / (128.0 * 5.0); - if (fluid_settings_setnum(_midi.settings, "synth.gain", gain) != 1) { + if (fluid_settings_setnum(_midi.settings, "synth.gain", gain) != FLUID_OK) { DEBUG(driver, 0, "Could not set volume"); } } diff --git a/src/music_gui.cpp b/src/music_gui.cpp index 269bb7f3c3..d15025ea3d 100644 --- a/src/music_gui.cpp +++ b/src/music_gui.cpp @@ -732,23 +732,35 @@ 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; + MusicSystem::PlaylistEntry entry(_music.GetCurrentSong()); if (BaseMusic::GetUsedSet()->num_available == 0) { str = STR_MUSIC_TITLE_NOMUSIC; } else if (_music.IsPlaying()) { str = STR_MUSIC_TITLE_NAME; - SetDParamStr(0, _music.GetCurrentSong().songname); + SetDParamStr(0, entry.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: { - 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); + /* Draw a wedge indicating low to high volume level. */ + const int ha = (r.bottom - r.top) / 5; + int wx1 = r.left, wx2 = r.right; + if (_current_text_dir == TD_RTL) std::swap(wx1, wx2); + const uint shadow = _colour_gradient[COLOUR_GREY][3]; + const uint fill = _colour_gradient[COLOUR_GREY][6]; + const uint light = _colour_gradient[COLOUR_GREY][7]; + const std::vector wedge{ Point{wx1, r.bottom - ha}, Point{wx2, r.top + ha}, Point{wx2, r.bottom - ha} }; + GfxFillPolygon(wedge, fill); + GfxDrawLine(wedge[0].x, wedge[0].y, wedge[2].x, wedge[2].y, light); + GfxDrawLine(wedge[1].x, wedge[1].y, wedge[2].x, wedge[2].y, _current_text_dir == TD_RTL ? shadow : light); + GfxDrawLine(wedge[0].x, wedge[0].y, wedge[1].x, wedge[1].y, shadow); + /* Draw a slider handle indicating current volume level. */ + const int sw = ScaleGUITrad(slider_width); byte volume = (widget == WID_M_MUSIC_VOL) ? _settings_client.music.music_vol : _settings_client.music.effect_vol; if (_current_text_dir == TD_RTL) volume = 127 - volume; - int x = r.left + (volume * (r.right - r.left - sw) / 127); + const int x = r.left + (volume * (r.right - r.left - sw) / 127); DrawFrameRect(x, r.top, x + sw, r.bottom, COLOUR_GREY, FR_NONE); break; } @@ -853,32 +865,14 @@ static const NWidgetPart _nested_music_window_widgets[] = { NWidget(WWT_PANEL, COLOUR_GREY, -1), SetFill(1, 1), EndContainer(), EndContainer(), NWidget(WWT_PANEL, COLOUR_GREY, WID_M_SLIDERS), - NWidget(NWID_HORIZONTAL), SetPIP(20, 20, 20), + NWidget(NWID_HORIZONTAL), SetPIP(4, 0, 4), NWidget(NWID_VERTICAL), NWidget(WWT_LABEL, COLOUR_GREY, -1), SetFill(1, 0), SetDataTip(STR_MUSIC_MUSIC_VOLUME, STR_NULL), - NWidget(WWT_EMPTY, COLOUR_GREY, WID_M_MUSIC_VOL), SetMinimalSize(67, 0), SetMinimalTextLines(1, 0), SetFill(1, 0), SetDataTip(0x0, STR_MUSIC_TOOLTIP_DRAG_SLIDERS_TO_SET_MUSIC), - NWidget(NWID_HORIZONTAL), - NWidget(WWT_LABEL, COLOUR_GREY, -1), SetDataTip(STR_MUSIC_RULER_MIN, STR_NULL), - NWidget(WWT_LABEL, COLOUR_GREY, -1), SetDataTip(STR_MUSIC_RULER_MARKER, STR_NULL), SetFill(1, 0), - NWidget(WWT_LABEL, COLOUR_GREY, -1), SetDataTip(STR_MUSIC_RULER_MARKER, STR_NULL), SetFill(1, 0), - NWidget(WWT_LABEL, COLOUR_GREY, -1), SetDataTip(STR_MUSIC_RULER_MARKER, STR_NULL), SetFill(1, 0), - NWidget(WWT_LABEL, COLOUR_GREY, -1), SetDataTip(STR_MUSIC_RULER_MARKER, STR_NULL), SetFill(1, 0), - NWidget(WWT_LABEL, COLOUR_GREY, -1), SetDataTip(STR_MUSIC_RULER_MARKER, STR_NULL), SetFill(1, 0), - NWidget(WWT_LABEL, COLOUR_GREY, -1), SetDataTip(STR_MUSIC_RULER_MAX, STR_NULL), - EndContainer(), + NWidget(WWT_EMPTY, COLOUR_GREY, WID_M_MUSIC_VOL), SetMinimalSize(67, 0), SetPadding(2), SetMinimalTextLines(1, 0), SetFill(1, 0), SetDataTip(0x0, STR_MUSIC_TOOLTIP_DRAG_SLIDERS_TO_SET_MUSIC), EndContainer(), NWidget(NWID_VERTICAL), NWidget(WWT_LABEL, COLOUR_GREY, -1), SetFill(1, 0), SetDataTip(STR_MUSIC_EFFECTS_VOLUME, STR_NULL), - NWidget(WWT_EMPTY, COLOUR_GREY, WID_M_EFFECT_VOL), SetMinimalSize(67, 0), SetMinimalTextLines(1, 0), SetFill(1, 0), SetDataTip(0x0, STR_MUSIC_TOOLTIP_DRAG_SLIDERS_TO_SET_MUSIC), - NWidget(NWID_HORIZONTAL), - NWidget(WWT_LABEL, COLOUR_GREY, -1), SetDataTip(STR_MUSIC_RULER_MIN, STR_NULL), - NWidget(WWT_LABEL, COLOUR_GREY, -1), SetDataTip(STR_MUSIC_RULER_MARKER, STR_NULL), SetFill(1, 0), - NWidget(WWT_LABEL, COLOUR_GREY, -1), SetDataTip(STR_MUSIC_RULER_MARKER, STR_NULL), SetFill(1, 0), - NWidget(WWT_LABEL, COLOUR_GREY, -1), SetDataTip(STR_MUSIC_RULER_MARKER, STR_NULL), SetFill(1, 0), - NWidget(WWT_LABEL, COLOUR_GREY, -1), SetDataTip(STR_MUSIC_RULER_MARKER, STR_NULL), SetFill(1, 0), - NWidget(WWT_LABEL, COLOUR_GREY, -1), SetDataTip(STR_MUSIC_RULER_MARKER, STR_NULL), SetFill(1, 0), - NWidget(WWT_LABEL, COLOUR_GREY, -1), SetDataTip(STR_MUSIC_RULER_MAX, STR_NULL), - EndContainer(), + NWidget(WWT_EMPTY, COLOUR_GREY, WID_M_EFFECT_VOL), SetMinimalSize(67, 0), SetPadding(2), SetMinimalTextLines(1, 0), SetFill(1, 0), SetDataTip(0x0, STR_MUSIC_TOOLTIP_DRAG_SLIDERS_TO_SET_MUSIC), EndContainer(), EndContainer(), EndContainer(), diff --git a/src/network/network.cpp b/src/network/network.cpp index fe7e6a8552..e8c99c89bb 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -248,6 +248,7 @@ void NetworkTextMessage(NetworkAction action, TextColour colour, bool self_send, case NETWORK_ACTION_GIVE_MONEY: strid = self_send ? STR_NETWORK_MESSAGE_GAVE_MONEY_AWAY : STR_NETWORK_MESSAGE_GIVE_MONEY; break; case NETWORK_ACTION_CHAT_COMPANY: strid = self_send ? STR_NETWORK_CHAT_TO_COMPANY : STR_NETWORK_CHAT_COMPANY; break; case NETWORK_ACTION_CHAT_CLIENT: strid = self_send ? STR_NETWORK_CHAT_TO_CLIENT : STR_NETWORK_CHAT_CLIENT; break; + case NETWORK_ACTION_KICKED: strid = STR_NETWORK_MESSAGE_KICKED; break; default: strid = STR_NETWORK_CHAT_ALL; break; } diff --git a/src/network/network_admin.h b/src/network/network_admin.h index 98dbab4816..16bd57a4d6 100644 --- a/src/network/network_admin.h +++ b/src/network/network_admin.h @@ -83,15 +83,18 @@ public: return "admin"; } + struct ServerNetworkAdminSocketHandlerFilter { + bool operator() (size_t index) { return ServerNetworkAdminSocketHandler::Get(index)->GetAdminStatus() == ADMIN_STATUS_ACTIVE; } + }; + /** * Returns an iterable ensemble of all active admin sockets * @param from index of the first socket to consider * @return an iterable ensemble of all active admin sockets */ - static Pool::IterateWrapper IterateActive(size_t from = 0) + static Pool::IterateWrapperFiltered IterateActive(size_t from = 0) { - return Pool::IterateWrapper(from, - [](size_t index) { return ServerNetworkAdminSocketHandler::Get(index)->GetAdminStatus() == ADMIN_STATUS_ACTIVE; }); + return Pool::IterateWrapperFiltered(from, ServerNetworkAdminSocketHandlerFilter{}); } }; diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp index 08ec7823e1..74b802f919 100644 --- a/src/network/network_client.cpp +++ b/src/network/network_client.cpp @@ -687,8 +687,15 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR(Packet *p StringID err = STR_NETWORK_ERROR_LOSTCONNECTION; if (error < (ptrdiff_t)lengthof(network_error_strings)) err = network_error_strings[error]; - - ShowErrorMessage(err, INVALID_STRING_ID, WL_CRITICAL); + /* In case of kicking a client, we assume there is a kick message in the packet if we can read one byte */ + if (error == NETWORK_ERROR_KICKED && p->CanReadFromPacket(1)) { + char kick_msg[255]; + p->Recv_string(kick_msg, sizeof(kick_msg)); + SetDParamStr(0, kick_msg); + ShowErrorMessage(err, STR_NETWORK_ERROR_KICK_MESSAGE, WL_CRITICAL); + } else { + ShowErrorMessage(err, INVALID_STRING_ID, WL_CRITICAL); + } /* Perform an emergency save if we had already entered the game */ if (this->status == STATUS_ACTIVE) ClientNetworkEmergencySave(); diff --git a/src/network/network_func.h b/src/network/network_func.h index d4a62ddd36..cbb89820cf 100644 --- a/src/network/network_func.h +++ b/src/network/network_func.h @@ -75,9 +75,9 @@ void NetworkServerDoMove(ClientID client_id, CompanyID company_id); void NetworkServerSendRcon(ClientID client_id, TextColour colour_code, const char *string); void NetworkServerSendChat(NetworkAction action, DestType type, int dest, const char *msg, ClientID from_id, int64 data = 0, bool from_admin = false); -void NetworkServerKickClient(ClientID client_id); -uint NetworkServerKickOrBanIP(ClientID client_id, bool ban); -uint NetworkServerKickOrBanIP(const char *ip, bool ban); +void NetworkServerKickClient(ClientID client_id, const char *reason); +uint NetworkServerKickOrBanIP(ClientID client_id, bool ban, const char *reason); +uint NetworkServerKickOrBanIP(const char *ip, bool ban, const char *reason); void NetworkInitChatMessage(); void CDECL NetworkAddChatMessage(TextColour colour, uint duration, const char *message, ...) WARN_FORMAT(3, 4); diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index 2faf5a3950..c4488f35d9 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -1687,12 +1687,12 @@ static WindowDesc _client_list_popup_desc( /* Here we start to define the options out of the menu */ static void ClientList_Kick(const NetworkClientInfo *ci) { - NetworkServerKickClient(ci->client_id); + NetworkServerKickClient(ci->client_id, nullptr); } static void ClientList_Ban(const NetworkClientInfo *ci) { - NetworkServerKickOrBanIP(ci->client_id, true); + NetworkServerKickOrBanIP(ci->client_id, true, nullptr); } static void ClientList_GiveMoney(const NetworkClientInfo *ci) diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index f9c9e91f23..36a15d3ae3 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -407,13 +407,15 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendCompanyInfo() /** * Send an error to the client, and close its connection. * @param error The error to disconnect for. + * @param reason In case of kicking a client, specifies the reason for kicking the client. */ -NetworkRecvStatus ServerNetworkGameSocketHandler::SendError(NetworkErrorCode error) +NetworkRecvStatus ServerNetworkGameSocketHandler::SendError(NetworkErrorCode error, const char *reason) { char str[100]; Packet *p = new Packet(PACKET_SERVER_ERROR); p->Send_uint8(error); + if (reason != nullptr) p->Send_string(reason); this->SendPacket(p); StringID strid = GetNetworkErrorMsg(error); @@ -427,7 +429,11 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendError(NetworkErrorCode err DEBUG(net, 1, "'%s' made an error and has been disconnected. Reason: '%s'", client_name, str); - NetworkTextMessage(NETWORK_ACTION_LEAVE, CC_DEFAULT, false, client_name, nullptr, strid); + if (error == NETWORK_ERROR_KICKED && reason != nullptr) { + NetworkTextMessage(NETWORK_ACTION_KICKED, CC_DEFAULT, false, client_name, reason, strid); + } else { + NetworkTextMessage(NETWORK_ACTION_LEAVE, CC_DEFAULT, false, client_name, nullptr, strid); + } for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) { if (new_cs->status > STATUS_AUTHORIZED && new_cs != this) { @@ -1589,7 +1595,20 @@ static void NetworkCheckRestartMap() if (_settings_client.network.restart_game_year != 0 && _cur_year >= _settings_client.network.restart_game_year) { DEBUG(net, 0, "Auto-restarting map. Year %d reached", _cur_year); - StartNewGameWithoutGUI(GENERATE_NEW_SEED); + _settings_newgame.game_creation.generation_seed = GENERATE_NEW_SEED; + switch(_file_to_saveload.abstract_ftype) { + case FT_SAVEGAME: + case FT_SCENARIO: + _switch_mode = SM_LOAD_GAME; + break; + + case FT_HEIGHTMAP: + _switch_mode = SM_START_HEIGHTMAP; + break; + + default: + _switch_mode = SM_NEWGAME; + } } } @@ -2026,29 +2045,32 @@ void NetworkServerSendRcon(ClientID client_id, TextColour colour_code, const cha /** * Kick a single client. * @param client_id The client to kick. + * @param reason In case of kicking a client, specifies the reason for kicking the client. */ -void NetworkServerKickClient(ClientID client_id) +void NetworkServerKickClient(ClientID client_id, const char *reason) { if (client_id == CLIENT_ID_SERVER) return; - NetworkClientSocket::GetByClientID(client_id)->SendError(NETWORK_ERROR_KICKED); + NetworkClientSocket::GetByClientID(client_id)->SendError(NETWORK_ERROR_KICKED, reason); } /** * Ban, or kick, everyone joined from the given client's IP. * @param client_id The client to check for. * @param ban Whether to ban or kick. + * @param reason In case of kicking a client, specifies the reason for kicking the client. */ -uint NetworkServerKickOrBanIP(ClientID client_id, bool ban) +uint NetworkServerKickOrBanIP(ClientID client_id, bool ban, const char *reason) { - return NetworkServerKickOrBanIP(NetworkClientSocket::GetByClientID(client_id)->GetClientIP(), ban); + return NetworkServerKickOrBanIP(NetworkClientSocket::GetByClientID(client_id)->GetClientIP(), ban, reason); } /** * Kick or ban someone based on an IP address. * @param ip The IP address/range to ban/kick. * @param ban Whether to ban or just kick. + * @param reason In case of kicking a client, specifies the reason for kicking the client. */ -uint NetworkServerKickOrBanIP(const char *ip, bool ban) +uint NetworkServerKickOrBanIP(const char *ip, bool ban, const char *reason) { /* Add address to ban-list */ if (ban) { @@ -2064,11 +2086,16 @@ uint NetworkServerKickOrBanIP(const char *ip, bool ban) uint n = 0; - /* There can be multiple clients with the same IP, kick them all */ + /* There can be multiple clients with the same IP, kick them all but don't kill the server, + * or the client doing the rcon. The latter can't be kicked because kicking frees closes + * and subsequently free the connection related instances, which we would be reading from + * and writing to after returning. So we would read or write data from freed memory up till + * the segfault triggers. */ for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) { if (cs->client_id == CLIENT_ID_SERVER) continue; + if (cs->client_id == _redirect_console_to_client) continue; if (cs->client_address.IsInNetmask(ip)) { - NetworkServerKickClient(cs->client_id); + NetworkServerKickClient(cs->client_id, reason); n++; } } diff --git a/src/network/network_server.h b/src/network/network_server.h index 9a1873520c..3dfcf5594f 100644 --- a/src/network/network_server.h +++ b/src/network/network_server.h @@ -89,7 +89,7 @@ public: NetworkRecvStatus SendMove(ClientID client_id, CompanyID company_id); NetworkRecvStatus SendClientInfo(NetworkClientInfo *ci); - NetworkRecvStatus SendError(NetworkErrorCode error); + NetworkRecvStatus SendError(NetworkErrorCode error, const char *reason = nullptr); NetworkRecvStatus SendChat(NetworkAction action, ClientID client_id, bool self_send, const char *msg, int64 data); NetworkRecvStatus SendJoin(ClientID client_id); NetworkRecvStatus SendFrame(); diff --git a/src/network/network_type.h b/src/network/network_type.h index 595eaad0f0..5f796b83d7 100644 --- a/src/network/network_type.h +++ b/src/network/network_type.h @@ -85,6 +85,7 @@ enum DestType { enum NetworkAction { NETWORK_ACTION_JOIN, NETWORK_ACTION_LEAVE, + NETWORK_ACTION_KICKED, NETWORK_ACTION_SERVER_MESSAGE, NETWORK_ACTION_CHAT, NETWORK_ACTION_CHAT_COMPANY, diff --git a/src/newgrf.cpp b/src/newgrf.cpp index f4197c9aa9..c422fe99c0 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -66,6 +66,11 @@ /** List of all loaded GRF files */ static std::vector _grf_files; +const std::vector &GetAllGRFFiles() +{ + return _grf_files; +} + /** Miscellaneous GRF features, set by Action 0x0D, parameter 0x9E */ byte _misc_grf_features = 0; @@ -5000,6 +5005,7 @@ static void NewSpriteGroup(ByteReader *buf) assert(DeterministicSpriteGroup::CanAllocateItem()); DeterministicSpriteGroup *group = new DeterministicSpriteGroup(); + group->nfo_line = _cur.nfo_line; act_group = group; group->var_scope = HasBit(type, 1) ? VSG_SCOPE_PARENT : VSG_SCOPE_SELF; @@ -5116,6 +5122,7 @@ static void NewSpriteGroup(ByteReader *buf) { assert(RandomizedSpriteGroup::CanAllocateItem()); RandomizedSpriteGroup *group = new RandomizedSpriteGroup(); + group->nfo_line = _cur.nfo_line; act_group = group; group->var_scope = HasBit(type, 1) ? VSG_SCOPE_PARENT : VSG_SCOPE_SELF; @@ -5164,6 +5171,7 @@ static void NewSpriteGroup(ByteReader *buf) assert(RealSpriteGroup::CanAllocateItem()); RealSpriteGroup *group = new RealSpriteGroup(); + group->nfo_line = _cur.nfo_line; act_group = group; group->num_loaded = num_loaded; @@ -5197,6 +5205,7 @@ static void NewSpriteGroup(ByteReader *buf) assert(TileLayoutSpriteGroup::CanAllocateItem()); TileLayoutSpriteGroup *group = new TileLayoutSpriteGroup(); + group->nfo_line = _cur.nfo_line; act_group = group; /* On error, bail out immediately. Temporary GRF data was already freed */ @@ -5212,6 +5221,7 @@ static void NewSpriteGroup(ByteReader *buf) assert(IndustryProductionSpriteGroup::CanAllocateItem()); IndustryProductionSpriteGroup *group = new IndustryProductionSpriteGroup(); + group->nfo_line = _cur.nfo_line; act_group = group; group->version = type; if (type == 0) { diff --git a/src/newgrf_airport.cpp b/src/newgrf_airport.cpp index 4540698a1a..61ad46ac0e 100644 --- a/src/newgrf_airport.cpp +++ b/src/newgrf_airport.cpp @@ -58,6 +58,9 @@ struct AirportResolverObject : public ResolverObject { } const SpriteGroup *ResolveReal(const RealSpriteGroup *group) const override; + + GrfSpecFeature GetFeature() const override; + uint32 GetDebugID() const override; }; /** @@ -226,6 +229,16 @@ void AirportOverrideManager::SetEntitySpec(AirportSpec *as) return nullptr; } +GrfSpecFeature AirportResolverObject::GetFeature() const +{ + return GSF_AIRPORTS; +} + +uint32 AirportResolverObject::GetDebugID() const +{ + return AirportSpec::Get(this->airport_scope.airport_id)->grf_prop.local_id; +} + /* virtual */ uint32 AirportScopeResolver::GetRandomBits() const { return this->st == nullptr ? 0 : this->st->random_bits; diff --git a/src/newgrf_airporttiles.cpp b/src/newgrf_airporttiles.cpp index 7a420f3e1d..3059174a86 100644 --- a/src/newgrf_airporttiles.cpp +++ b/src/newgrf_airporttiles.cpp @@ -220,6 +220,16 @@ AirportTileResolverObject::AirportTileResolverObject(const AirportTileSpec *ats, this->root_spritegroup = ats->grf_prop.spritegroup[0]; } +GrfSpecFeature AirportTileResolverObject::GetFeature() const +{ + return GSF_AIRPORTTILES; +} + +uint32 AirportTileResolverObject::GetDebugID() const +{ + return this->tiles_scope.ats->grf_prop.local_id; +} + 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 191b79e9ac..37460622d4 100644 --- a/src/newgrf_airporttiles.h +++ b/src/newgrf_airporttiles.h @@ -22,6 +22,7 @@ struct AirportTileScopeResolver : public ScopeResolver { struct Station *st; ///< %Station of the airport for which the callback is run, or \c nullptr for build gui. byte airport_id; ///< Type of airport for which the callback is run. TileIndex tile; ///< Tile for the callback, only valid for airporttile callbacks. + const AirportTileSpec *ats; /** * Constructor of the scope resolver specific for airport tiles. @@ -30,7 +31,7 @@ struct AirportTileScopeResolver : public ScopeResolver { * @param st Station of the airport for which the callback is run, or \c nullptr for build gui. */ AirportTileScopeResolver(ResolverObject &ro, const AirportTileSpec *ats, TileIndex tile, Station *st) - : ScopeResolver(ro), st(st), tile(tile) + : ScopeResolver(ro), st(st), tile(tile), ats(ats) { assert(st != nullptr); this->airport_id = st->airport.type; @@ -54,6 +55,9 @@ struct AirportTileResolverObject : public ResolverObject { default: return ResolverObject::GetScope(scope, relative); } } + + GrfSpecFeature GetFeature() const override; + uint32 GetDebugID() const override; }; /** diff --git a/src/newgrf_canal.cpp b/src/newgrf_canal.cpp index 0209aa9ad8..7295e5551b 100644 --- a/src/newgrf_canal.cpp +++ b/src/newgrf_canal.cpp @@ -13,6 +13,7 @@ #include "newgrf_canal.h" #include "water.h" #include "water_map.h" +#include "spritecache.h" #include "safeguards.h" @@ -35,6 +36,7 @@ struct CanalScopeResolver : public ScopeResolver { /** Resolver object for canals. */ struct CanalResolverObject : public ResolverObject { CanalScopeResolver canal_scope; + CanalFeature feature; CanalResolverObject(CanalFeature feature, TileIndex tile, CallbackID callback = CBID_NO_CALLBACK, uint32 callback_param1 = 0, uint32 callback_param2 = 0); @@ -48,6 +50,9 @@ struct CanalResolverObject : public ResolverObject { } const SpriteGroup *ResolveReal(const RealSpriteGroup *group) const override; + + GrfSpecFeature GetFeature() const override; + uint32 GetDebugID() const override; }; /* virtual */ uint32 CanalScopeResolver::GetRandomBits() const @@ -111,6 +116,16 @@ struct CanalResolverObject : public ResolverObject { return group->loaded[0]; } +GrfSpecFeature CanalResolverObject::GetFeature() const +{ + return GSF_CANALS; +} + +uint32 CanalResolverObject::GetDebugID() const +{ + return this->feature; +} + /** * Canal resolver constructor. * @param feature Which canal feature we want. @@ -121,7 +136,7 @@ struct CanalResolverObject : public ResolverObject { */ CanalResolverObject::CanalResolverObject(CanalFeature feature, TileIndex tile, CallbackID callback, uint32 callback_param1, uint32 callback_param2) - : ResolverObject(_water_feature[feature].grffile, callback, callback_param1, callback_param2), canal_scope(*this, tile) + : ResolverObject(_water_feature[feature].grffile, callback, callback_param1, callback_param2), canal_scope(*this, tile), feature(feature) { this->root_spritegroup = _water_feature[feature].group; } diff --git a/src/newgrf_cargo.cpp b/src/newgrf_cargo.cpp index b0fd632b5b..22c7120d82 100644 --- a/src/newgrf_cargo.cpp +++ b/src/newgrf_cargo.cpp @@ -15,9 +15,14 @@ /** Resolver of cargo. */ struct CargoResolverObject : public ResolverObject { + const CargoSpec *cargospec; + CargoResolverObject(const CargoSpec *cs, CallbackID callback = CBID_NO_CALLBACK, uint32 callback_param1 = 0, uint32 callback_param2 = 0); const SpriteGroup *ResolveReal(const RealSpriteGroup *group) const override; + + GrfSpecFeature GetFeature() const override; + uint32 GetDebugID() const override; }; /* virtual */ const SpriteGroup *CargoResolverObject::ResolveReal(const RealSpriteGroup *group) const @@ -30,6 +35,16 @@ struct CargoResolverObject : public ResolverObject { return nullptr; } +GrfSpecFeature CargoResolverObject::GetFeature() const +{ + return GSF_CARGOES; +} + +uint32 CargoResolverObject::GetDebugID() const +{ + return this->cargospec->label; +} + /** * Constructor of the cargo resolver. * @param cs Cargo being resolved. @@ -38,7 +53,7 @@ struct CargoResolverObject : public ResolverObject { * @param callback_param2 Second parameter (var 18) of the callback. */ CargoResolverObject::CargoResolverObject(const CargoSpec *cs, CallbackID callback, uint32 callback_param1, uint32 callback_param2) - : ResolverObject(cs->grffile, callback, callback_param1, callback_param2) + : ResolverObject(cs->grffile, callback, callback_param1, callback_param2), cargospec(cs) { this->root_spritegroup = cs->group; } diff --git a/src/newgrf_engine.cpp b/src/newgrf_engine.cpp index dc0e1cfe01..db2f5ac43c 100644 --- a/src/newgrf_engine.cpp +++ b/src/newgrf_engine.cpp @@ -946,6 +946,22 @@ static uint32 VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *object, return in_motion ? group->loaded[set] : group->loading[set]; } +GrfSpecFeature VehicleResolverObject::GetFeature() const +{ + switch (Engine::Get(this->self_scope.self_type)->type) { + case VEH_TRAIN: return GSF_TRAINS; + case VEH_ROAD: return GSF_ROADVEHICLES; + case VEH_SHIP: return GSF_SHIPS; + case VEH_AIRCRAFT: return GSF_AIRCRAFT; + default: return GSF_INVALID; + } +} + +uint32 VehicleResolverObject::GetDebugID() const +{ + return Engine::Get(this->self_scope.self_type)->grf_prop.local_id; +} + /** * Get the grf file associated with an engine type. * @param engine_type Engine to query. diff --git a/src/newgrf_engine.h b/src/newgrf_engine.h index 817fefb5d0..f830ff499d 100644 --- a/src/newgrf_engine.h +++ b/src/newgrf_engine.h @@ -65,6 +65,9 @@ struct VehicleResolverObject : public ResolverObject { ScopeResolver *GetScope(VarSpriteGroupScope scope = VSG_SCOPE_SELF, byte relative = 0) override; const SpriteGroup *ResolveReal(const RealSpriteGroup *group) const override; + + GrfSpecFeature GetFeature() const override; + uint32 GetDebugID() const override; }; static const uint TRAININFO_DEFAULT_VEHICLE_WIDTH = 29; diff --git a/src/newgrf_generic.cpp b/src/newgrf_generic.cpp index be7caefb83..6538b79b66 100644 --- a/src/newgrf_generic.cpp +++ b/src/newgrf_generic.cpp @@ -29,6 +29,8 @@ struct GenericScopeResolver : public ScopeResolver { uint8 count; uint8 station_size; + uint8 feature; + /** * Generic scope resolver. * @param ro Surrounding resolver. @@ -36,7 +38,7 @@ struct GenericScopeResolver : public ScopeResolver { */ 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) + event(), count(0), station_size(0), feature(GSF_INVALID), ai_callback(ai_callback) { } @@ -62,6 +64,16 @@ struct GenericResolverObject : public ResolverObject { } const SpriteGroup *ResolveReal(const RealSpriteGroup *group) const override; + + GrfSpecFeature GetFeature() const override + { + return (GrfSpecFeature)this->generic_scope.feature; + } + + uint32 GetDebugID() const override + { + return 0; + } }; struct GenericCallback { @@ -226,6 +238,7 @@ uint16 GetAiPurchaseCallbackResult(uint8 feature, CargoID cargo_type, uint8 defa object.generic_scope.event = event; object.generic_scope.count = count; object.generic_scope.station_size = station_size; + object.generic_scope.feature = feature; uint16 callback = GetGenericCallbackResult(feature, object, 0, 0, file); if (callback != CALLBACK_FAILED) callback = GB(callback, 0, 8); @@ -247,6 +260,7 @@ void AmbientSoundEffectCallback(TileIndex tile) /* Prepare resolver object. */ GenericResolverObject object(false, CBID_SOUNDS_AMBIENT_EFFECT); + object.generic_scope.feature = GSF_SOUNDFX; uint32 param1_v7 = GetTileType(tile) << 28 | Clamp(TileHeight(tile), 0, 15) << 24 | GB(r, 16, 8) << 16 | GetTerrainType(tile); uint32 param1_v8 = GetTileType(tile) << 24 | GetTileZ(tile) << 16 | GB(r, 16, 8) << 8 | (HasTileWaterClass(tile) ? GetWaterClass(tile) : 0) << 3 | GetTerrainType(tile); diff --git a/src/newgrf_house.cpp b/src/newgrf_house.cpp index b7d8048c94..b585a682dc 100644 --- a/src/newgrf_house.cpp +++ b/src/newgrf_house.cpp @@ -62,6 +62,16 @@ HouseResolverObject::HouseResolverObject(HouseID house_id, TileIndex tile, Town this->root_spritegroup = HouseSpec::Get(house_id)->grf_prop.spritegroup[0]; } +GrfSpecFeature HouseResolverObject::GetFeature() const +{ + return GSF_HOUSES; +} + +uint32 HouseResolverObject::GetDebugID() const +{ + return HouseSpec::Get(this->house_scope.house_id)->grf_prop.local_id; +} + HouseClassID AllocateHouseClassID(byte grf_class_id, uint32 grfid) { /* Start from 1 because 0 means that no class has been assigned. */ diff --git a/src/newgrf_house.h b/src/newgrf_house.h index b59d28ab51..b4c1f61de3 100644 --- a/src/newgrf_house.h +++ b/src/newgrf_house.h @@ -64,6 +64,9 @@ struct HouseResolverObject : public ResolverObject { default: return ResolverObject::GetScope(scope, relative); } } + + GrfSpecFeature GetFeature() const override; + uint32 GetDebugID() const override; }; /** diff --git a/src/newgrf_industries.cpp b/src/newgrf_industries.cpp index fd32f3e948..a8748a4953 100644 --- a/src/newgrf_industries.cpp +++ b/src/newgrf_industries.cpp @@ -489,6 +489,16 @@ TownScopeResolver *IndustriesResolverObject::GetTown() return this->town_scope; } +GrfSpecFeature IndustriesResolverObject::GetFeature() const +{ + return GSF_INDUSTRIES; +} + +uint32 IndustriesResolverObject::GetDebugID() const +{ + return GetIndustrySpec(this->industries_scope.type)->grf_prop.local_id; +} + /** * Perform an industry callback. * @param callback The callback to perform. diff --git a/src/newgrf_industries.h b/src/newgrf_industries.h index d791eaf0d8..01a185aa19 100644 --- a/src/newgrf_industries.h +++ b/src/newgrf_industries.h @@ -63,6 +63,9 @@ struct IndustriesResolverObject : public ResolverObject { return ResolverObject::GetScope(scope, relative); } } + + GrfSpecFeature GetFeature() const override; + uint32 GetDebugID() const override; }; /** When should the industry(tile) be triggered for random bits? */ diff --git a/src/newgrf_industrytiles.cpp b/src/newgrf_industrytiles.cpp index 03d86a7717..e9c99f6cd5 100644 --- a/src/newgrf_industrytiles.cpp +++ b/src/newgrf_industrytiles.cpp @@ -139,11 +139,22 @@ IndustryTileResolverObject::IndustryTileResolverObject(IndustryGfx gfx, TileInde CallbackID callback, uint32 callback_param1, uint32 callback_param2) : ResolverObject(GetIndTileGrffile(gfx), callback, callback_param1, callback_param2), indtile_scope(*this, indus, tile), - ind_scope(*this, tile, indus, indus->type) + ind_scope(*this, tile, indus, indus->type), + gfx(gfx) { this->root_spritegroup = GetIndustryTileSpec(gfx)->grf_prop.spritegroup[0]; } +GrfSpecFeature IndustryTileResolverObject::GetFeature() const +{ + return GSF_INDUSTRYTILES; +} + +uint32 IndustryTileResolverObject::GetDebugID() const +{ + return GetIndustryTileSpec(gfx)->grf_prop.local_id; +} + static void IndustryDrawTileLayout(const TileInfo *ti, const TileLayoutSpriteGroup *group, byte rnd_colour, byte stage, IndustryGfx gfx) { const DrawTileSprites *dts = group->ProcessRegisters(&stage); diff --git a/src/newgrf_industrytiles.h b/src/newgrf_industrytiles.h index 838dcc5332..e5494ea302 100644 --- a/src/newgrf_industrytiles.h +++ b/src/newgrf_industrytiles.h @@ -39,6 +39,7 @@ struct IndustryTileScopeResolver : public ScopeResolver { struct IndustryTileResolverObject : public ResolverObject { IndustryTileScopeResolver indtile_scope; ///< Scope resolver for the industry tile. IndustriesScopeResolver ind_scope; ///< Scope resolver for the industry owning the tile. + IndustryGfx gfx; IndustryTileResolverObject(IndustryGfx gfx, TileIndex tile, Industry *indus, CallbackID callback = CBID_NO_CALLBACK, uint32 callback_param1 = 0, uint32 callback_param2 = 0); @@ -51,6 +52,9 @@ struct IndustryTileResolverObject : public ResolverObject { default: return ResolverObject::GetScope(scope, relative); } } + + GrfSpecFeature GetFeature() const override; + uint32 GetDebugID() const override; }; bool DrawNewIndustryTile(TileInfo *ti, Industry *i, IndustryGfx gfx, const IndustryTileSpec *inds); diff --git a/src/newgrf_object.cpp b/src/newgrf_object.cpp index 34e18c43a2..8827245d36 100644 --- a/src/newgrf_object.cpp +++ b/src/newgrf_object.cpp @@ -352,7 +352,7 @@ unhandled: */ ObjectResolverObject::ObjectResolverObject(const ObjectSpec *spec, Object *obj, TileIndex tile, uint8 view, CallbackID callback, uint32 param1, uint32 param2) - : ResolverObject(spec->grf_prop.grffile, callback, param1, param2), object_scope(*this, obj, tile, view) + : ResolverObject(spec->grf_prop.grffile, callback, param1, param2), object_scope(*this, obj, spec, tile, view) { this->town_scope = nullptr; this->root_spritegroup = (obj == nullptr && spec->grf_prop.spritegroup[CT_PURCHASE_OBJECT] != nullptr) ? @@ -384,6 +384,16 @@ TownScopeResolver *ObjectResolverObject::GetTown() return this->town_scope; } +GrfSpecFeature ObjectResolverObject::GetFeature() const +{ + return GSF_OBJECTS; +} + +uint32 ObjectResolverObject::GetDebugID() const +{ + return this->object_scope.spec->grf_prop.local_id; +} + /** * Perform a callback for an object. * @param callback The callback to perform. diff --git a/src/newgrf_object.h b/src/newgrf_object.h index 90be24042c..1776b760ab 100644 --- a/src/newgrf_object.h +++ b/src/newgrf_object.h @@ -98,9 +98,10 @@ struct ObjectSpec { /** Object scope resolver. */ struct ObjectScopeResolver : public ScopeResolver { - struct Object *obj; ///< The object the callback is ran for. - TileIndex tile; ///< The tile related to the object. - uint8 view; ///< The view of the object. + struct Object *obj; ///< The object the callback is ran for. + const ObjectSpec *spec; ///< Specification of the object type. + TileIndex tile; ///< The tile related to the object. + uint8 view; ///< The view of the object. /** * Constructor of an object scope resolver. @@ -109,8 +110,8 @@ struct ObjectScopeResolver : public ScopeResolver { * @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) + ObjectScopeResolver(ResolverObject &ro, Object *obj, const ObjectSpec *spec, TileIndex tile, uint8 view = 0) + : ScopeResolver(ro), obj(obj), spec(spec), tile(tile), view(view) { } @@ -144,6 +145,9 @@ struct ObjectResolverObject : public ResolverObject { } } + GrfSpecFeature GetFeature() const override; + uint32 GetDebugID() const override; + private: TownScopeResolver *GetTown(); }; diff --git a/src/newgrf_profiling.cpp b/src/newgrf_profiling.cpp new file mode 100644 index 0000000000..e9a0dd92d2 --- /dev/null +++ b/src/newgrf_profiling.cpp @@ -0,0 +1,162 @@ +/* + * 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 newgrf_profiling.cpp Profiling of NewGRF action 2 handling. */ + +#include "newgrf_profiling.h" +#include "date_func.h" +#include "fileio_func.h" +#include "string_func.h" +#include "console_func.h" +#include "spritecache.h" + +#include +#include + + +std::vector _newgrf_profilers; +Date _newgrf_profile_end_date; + + +/** + * Create profiler object and begin profiling session. + * @param grffile The GRF file to collect profiling data on + * @param end_date Game date to end profiling on + */ +NewGRFProfiler::NewGRFProfiler(const GRFFile *grffile) : grffile{ grffile }, active{ false }, cur_call{} +{ +} + +/** + * Complete profiling session and write data to file + */ +NewGRFProfiler::~NewGRFProfiler() +{ +} + +/** + * Capture the start of a sprite group resolution. + * @param resolver Data about sprite group being resolved + */ +void NewGRFProfiler::BeginResolve(const ResolverObject &resolver) +{ + using namespace std::chrono; + this->cur_call.root_sprite = resolver.root_spritegroup->nfo_line; + this->cur_call.subs = 0; + this->cur_call.time = (uint32)time_point_cast(high_resolution_clock::now()).time_since_epoch().count(); + this->cur_call.tick = _tick_counter; + this->cur_call.cb = resolver.callback; + this->cur_call.feat = resolver.GetFeature(); + this->cur_call.item = resolver.GetDebugID(); +} + +/** + * Capture the completion of a sprite group resolution. + */ +void NewGRFProfiler::EndResolve(const SpriteGroup *result) +{ + using namespace std::chrono; + this->cur_call.time = (uint32)time_point_cast(high_resolution_clock::now()).time_since_epoch().count() - this->cur_call.time; + + if (result == nullptr) { + this->cur_call.result = 0; + } else if (result->type == SGT_CALLBACK) { + this->cur_call.result = static_cast(result)->result; + } else if (result->type == SGT_RESULT) { + this->cur_call.result = GetSpriteLocalID(static_cast(result)->sprite); + } else { + this->cur_call.result = result->nfo_line; + } + + this->calls.push_back(this->cur_call); +} + +/** + * Capture a recursive sprite group resolution. + */ +void NewGRFProfiler::RecursiveResolve() +{ + this->cur_call.subs += 1; +} + +void NewGRFProfiler::Start() +{ + this->Abort(); + this->active = true; + this->start_tick = _tick_counter; +} + +uint32 NewGRFProfiler::Finish() +{ + if (!this->active) return 0; + + if (this->calls.empty()) { + IConsolePrintF(CC_DEBUG, "Finished profile of NewGRF [%08X], no events collected, not writing a file", BSWAP32(this->grffile->grfid)); + return 0; + } + + std::string filename = this->GetOutputFilename(); + IConsolePrintF(CC_DEBUG, "Finished profile of NewGRF [%08X], writing %u events to %s", BSWAP32(this->grffile->grfid), (uint)this->calls.size(), filename.c_str()); + + FILE *f = FioFOpenFile(filename.c_str(), "wt", Subdirectory::NO_DIRECTORY); + FileCloser fcloser(f); + + uint32 total_microseconds = 0; + + fputs("Tick,Sprite,Feature,Item,CallbackID,Microseconds,Depth,Result\n", f); + for (const Call &c : this->calls) { + fprintf(f, "%u,%u,0x%X,%d,0x%X,%u,%u,%u\n", c.tick, c.root_sprite, c.feat, c.item, (uint)c.cb, c.time, c.subs, c.result); + total_microseconds += c.time; + } + + this->Abort(); + + return total_microseconds; +} + +void NewGRFProfiler::Abort() +{ + this->active = false; + this->calls.clear(); +} + +/** + * Get name of the file that will be written. + * @return File name of profiling output file. + */ +std::string NewGRFProfiler::GetOutputFilename() const +{ + time_t write_time = time(nullptr); + + char timestamp[16] = {}; + strftime(timestamp, lengthof(timestamp), "%Y%m%d-%H%M", localtime(&write_time)); + + char filepath[MAX_PATH] = {}; + seprintf(filepath, lastof(filepath), "%sgrfprofile-%s-%08X.csv", FiosGetScreenshotDir(), timestamp, BSWAP32(this->grffile->grfid)); + + return std::string(filepath); +} + +uint32 NewGRFProfiler::FinishAll() +{ + int max_ticks = 0; + uint32 total_microseconds = 0; + for (NewGRFProfiler &pr : _newgrf_profilers) { + if (pr.active) { + total_microseconds += pr.Finish(); + max_ticks = max(max_ticks, _tick_counter - pr.start_tick); + } + } + + if (total_microseconds > 0 && max_ticks > 0) { + IConsolePrintF(CC_DEBUG, "Total NewGRF callback processing: %u microseconds over %d ticks", total_microseconds, max_ticks); + } + + _newgrf_profile_end_date = MAX_DAY; + + return total_microseconds; +} diff --git a/src/newgrf_profiling.h b/src/newgrf_profiling.h new file mode 100644 index 0000000000..e5b2813f59 --- /dev/null +++ b/src/newgrf_profiling.h @@ -0,0 +1,63 @@ +/* + * 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 newgrf_profiling.h Profiling of NewGRF action 2 handling. */ + +#ifndef NEWGRF_PROFILING_H +#define NEWGRF_PROFILING_H + +#include "stdafx.h" +#include "date_type.h" +#include "newgrf.h" +#include "newgrf_callbacks.h" +#include "newgrf_spritegroup.h" + +#include +#include +#include + +/** + * Callback profiler for NewGRF development + */ +struct NewGRFProfiler { + NewGRFProfiler(const GRFFile *grffile); + ~NewGRFProfiler(); + + void BeginResolve(const ResolverObject &resolver); + void EndResolve(const SpriteGroup *result); + void RecursiveResolve(); + + void Start(); + uint32 Finish(); + void Abort(); + std::string GetOutputFilename() const; + + static uint32 FinishAll(); + + /** Measurement of a single sprite group resolution */ + struct Call { + uint32 root_sprite; ///< Pseudo-sprite index in GRF file + uint32 item; ///< Local ID of item being resolved for + uint32 result; ///< Result of callback + uint32 subs; ///< Sub-calls to other sprite groups + uint32 time; ///< Time taken for resolution (microseconds) + uint16 tick; ///< Game tick + CallbackID cb; ///< Callback ID + GrfSpecFeature feat; ///< GRF feature being resolved for + }; + + const GRFFile *grffile; ///< Which GRF is being profiled + bool active; ///< Is this profiler collecting data + uint16 start_tick; ///< Tick number this profiler was started on + Call cur_call; ///< Data for current call in progress + std::vector calls; ///< All calls collected so far +}; + +extern std::vector _newgrf_profilers; +extern Date _newgrf_profile_end_date; + +#endif /* NEWGRF_PROFILING_H */ diff --git a/src/newgrf_railtype.cpp b/src/newgrf_railtype.cpp index 451076ccc2..2a98948e7b 100644 --- a/src/newgrf_railtype.cpp +++ b/src/newgrf_railtype.cpp @@ -65,6 +65,16 @@ return nullptr; } +GrfSpecFeature RailTypeResolverObject::GetFeature() const +{ + return GSF_RAILTYPES; +} + +uint32 RailTypeResolverObject::GetDebugID() const +{ + return this->railtype_scope.rti->label; +} + /** * Resolver object for rail types. * @param rti Railtype. nullptr in NewGRF Inspect window. @@ -75,7 +85,7 @@ * @param param2 Extra parameter (second parameter of the callback, except railtypes do not have callbacks). */ RailTypeResolverObject::RailTypeResolverObject(const RailtypeInfo *rti, TileIndex tile, TileContext context, RailTypeSpriteGroup rtsg, uint32 param1, uint32 param2) - : ResolverObject(rti != nullptr ? rti->grffile[rtsg] : nullptr, CBID_NO_CALLBACK, param1, param2), railtype_scope(*this, tile, context) + : ResolverObject(rti != nullptr ? rti->grffile[rtsg] : nullptr, CBID_NO_CALLBACK, param1, param2), railtype_scope(*this, rti, tile, context) { this->root_spritegroup = rti != nullptr ? rti->group[rtsg] : nullptr; } diff --git a/src/newgrf_railtype.h b/src/newgrf_railtype.h index 223cfdd63b..1e0ff01d82 100644 --- a/src/newgrf_railtype.h +++ b/src/newgrf_railtype.h @@ -18,6 +18,7 @@ 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? + const RailtypeInfo *rti; /** * Constructor of the railtype scope resolvers. @@ -25,8 +26,8 @@ struct RailTypeScopeResolver : public ScopeResolver { * @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) + RailTypeScopeResolver(ResolverObject &ro, const RailtypeInfo *rti, TileIndex tile, TileContext context) + : ScopeResolver(ro), tile(tile), context(context), rti(rti) { } @@ -49,6 +50,9 @@ struct RailTypeResolverObject : public ResolverObject { } const SpriteGroup *ResolveReal(const RealSpriteGroup *group) const override; + + GrfSpecFeature GetFeature() const override; + uint32 GetDebugID() const override; }; SpriteID GetCustomRailSprite(const RailtypeInfo *rti, TileIndex tile, RailTypeSpriteGroup rtsg, TileContext context = TCX_NORMAL, uint *num_results = nullptr); diff --git a/src/newgrf_roadtype.cpp b/src/newgrf_roadtype.cpp index 34a8eb11a6..c49faa59f1 100644 --- a/src/newgrf_roadtype.cpp +++ b/src/newgrf_roadtype.cpp @@ -65,16 +65,32 @@ return nullptr; } +GrfSpecFeature RoadTypeResolverObject::GetFeature() const +{ + RoadType rt = GetRoadTypeByLabel(this->roadtype_scope.rti->label, false); + switch (GetRoadTramType(rt)) { + case RTT_ROAD: return GSF_ROADTYPES; + case RTT_TRAM: return GSF_TRAMTYPES; + default: return GSF_INVALID; + } +} + +uint32 RoadTypeResolverObject::GetDebugID() const +{ + return this->roadtype_scope.rti->label; +} + /** * Constructor of the roadtype 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? */ -RoadTypeScopeResolver::RoadTypeScopeResolver(ResolverObject &ro, TileIndex tile, TileContext context) : ScopeResolver(ro) +RoadTypeScopeResolver::RoadTypeScopeResolver(ResolverObject &ro, const RoadTypeInfo *rti, TileIndex tile, TileContext context) : ScopeResolver(ro) { this->tile = tile; this->context = context; + this->rti = rti; } /** @@ -87,7 +103,7 @@ RoadTypeScopeResolver::RoadTypeScopeResolver(ResolverObject &ro, TileIndex tile, * @param param2 Extra parameter (second parameter of the callback, except roadtypes do not have callbacks). */ RoadTypeResolverObject::RoadTypeResolverObject(const RoadTypeInfo *rti, TileIndex tile, TileContext context, RoadTypeSpriteGroup rtsg, uint32 param1, uint32 param2) - : ResolverObject(rti != nullptr ? rti->grffile[rtsg] : nullptr, CBID_NO_CALLBACK, param1, param2), roadtype_scope(*this, tile, context) + : ResolverObject(rti != nullptr ? rti->grffile[rtsg] : nullptr, CBID_NO_CALLBACK, param1, param2), roadtype_scope(*this, rti, tile, context) { this->root_spritegroup = rti != nullptr ? rti->group[rtsg] : nullptr; } diff --git a/src/newgrf_roadtype.h b/src/newgrf_roadtype.h index ee0773d7df..07451f6566 100644 --- a/src/newgrf_roadtype.h +++ b/src/newgrf_roadtype.h @@ -18,8 +18,9 @@ struct RoadTypeScopeResolver : 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? + const RoadTypeInfo *rti; - RoadTypeScopeResolver(ResolverObject &ro, TileIndex tile, TileContext context); + RoadTypeScopeResolver(ResolverObject &ro, const RoadTypeInfo *rti, TileIndex tile, TileContext context); /* virtual */ uint32 GetRandomBits() const; /* virtual */ uint32 GetVariable(byte variable, uint32 parameter, bool *available) const; @@ -31,7 +32,7 @@ struct RoadTypeResolverObject : public ResolverObject { RoadTypeResolverObject(const RoadTypeInfo *rti, TileIndex tile, TileContext context, RoadTypeSpriteGroup rtsg, uint32 param1 = 0, uint32 param2 = 0); - /* virtual */ ScopeResolver *GetScope(VarSpriteGroupScope scope = VSG_SCOPE_SELF, byte relative = 0) + ScopeResolver *GetScope(VarSpriteGroupScope scope = VSG_SCOPE_SELF, byte relative = 0) override { switch (scope) { case VSG_SCOPE_SELF: return &this->roadtype_scope; @@ -39,7 +40,10 @@ struct RoadTypeResolverObject : public ResolverObject { } } - /* virtual */ const SpriteGroup *ResolveReal(const RealSpriteGroup *group) const; + const SpriteGroup *ResolveReal(const RealSpriteGroup *group) const override; + + GrfSpecFeature GetFeature() const override; + uint32 GetDebugID() const override; }; SpriteID GetCustomRoadSprite(const RoadTypeInfo *rti, TileIndex tile, RoadTypeSpriteGroup rtsg, TileContext context = TCX_NORMAL, uint *num_results = nullptr); diff --git a/src/newgrf_spritegroup.cpp b/src/newgrf_spritegroup.cpp index 76f8df20f3..824ba0439e 100644 --- a/src/newgrf_spritegroup.cpp +++ b/src/newgrf_spritegroup.cpp @@ -11,6 +11,7 @@ #include #include "debug.h" #include "newgrf_spritegroup.h" +#include "newgrf_profiling.h" #include "core/pool_func.hpp" #include "safeguards.h" @@ -34,10 +35,23 @@ TemporaryStorageArray _temp_store; /* static */ const SpriteGroup *SpriteGroup::Resolve(const SpriteGroup *group, ResolverObject &object, bool top_level) { if (group == nullptr) return nullptr; - if (top_level) { + + const GRFFile *grf = object.grffile; + auto profiler = std::find_if(_newgrf_profilers.begin(), _newgrf_profilers.end(), [&](const NewGRFProfiler &pr) { return pr.grffile == grf; }); + + if (profiler == _newgrf_profilers.end() || !profiler->active) { + if (top_level) _temp_store.ClearChanges(); + return group->Resolve(object); + } else if (top_level) { + profiler->BeginResolve(object); _temp_store.ClearChanges(); + const SpriteGroup *result = group->Resolve(object); + profiler->EndResolve(result); + return result; + } else { + profiler->RecursiveResolve(); + return group->Resolve(object); } - return group->Resolve(object); } RealSpriteGroup::~RealSpriteGroup() diff --git a/src/newgrf_spritegroup.h b/src/newgrf_spritegroup.h index 00bfc49d04..80f70df55d 100644 --- a/src/newgrf_spritegroup.h +++ b/src/newgrf_spritegroup.h @@ -56,13 +56,14 @@ extern SpriteGroupPool _spritegroup_pool; /* Common wrapper for all the different sprite group types */ struct SpriteGroup : SpriteGroupPool::PoolItem<&_spritegroup_pool> { protected: - SpriteGroup(SpriteGroupType type) : type(type) {} + SpriteGroup(SpriteGroupType type) : nfo_line(0), type(type) {} /** Base sprite group resolver */ virtual const SpriteGroup *Resolve(ResolverObject &object) const { return this; }; public: virtual ~SpriteGroup() {} + uint32 nfo_line; SpriteGroupType type; virtual SpriteID GetResult() const { return 0; } @@ -398,6 +399,18 @@ struct ResolverObject { this->used_triggers = 0; memset(this->reseed, 0, sizeof(this->reseed)); } + + /** + * Get the feature number being resolved for. + * This function is mainly intended for the callback profiling feature. + */ + virtual GrfSpecFeature GetFeature() const { return GSF_INVALID; } + /** + * Get an identifier for the item being resolved. + * This function is mainly intended for the callback profiling feature, + * and should return an identifier recognisable by the NewGRF developer. + */ + virtual uint32 GetDebugID() const { return 0; } }; #endif /* NEWGRF_SPRITEGROUP_H */ diff --git a/src/newgrf_station.cpp b/src/newgrf_station.cpp index 8e8e52a629..19f32bd754 100644 --- a/src/newgrf_station.cpp +++ b/src/newgrf_station.cpp @@ -368,6 +368,16 @@ TownScopeResolver *StationResolverObject::GetTown() return res; } + case 0x6A: { // GRFID of nearby station tiles + TileIndex nearby_tile = GetNearbyTile(parameter, this->tile); + + if (!HasStationTileRail(nearby_tile)) return 0xFFFFFFFF; + if (!IsCustomStationSpecIndex(nearby_tile)) return 0; + + const StationSpecList ssl = BaseStation::GetByTile(nearby_tile)->speclist[GetCustomStationSpecIndex(nearby_tile)]; + return ssl.grfid; + } + /* General station variables */ case 0x82: return 50; case 0x84: return this->st->string_id; @@ -527,6 +537,16 @@ uint32 Waypoint::GetNewGRFVariable(const ResolverObject &object, byte variable, return group->loading[0]; } +GrfSpecFeature StationResolverObject::GetFeature() const +{ + return GSF_STATIONS; +} + +uint32 StationResolverObject::GetDebugID() const +{ + return this->station_scope.statspec->grf_prop.local_id; +} + /** * Resolver for stations. * @param statspec Station (type) specification. diff --git a/src/newgrf_station.h b/src/newgrf_station.h index a79ea3fe29..fac5d64ddd 100644 --- a/src/newgrf_station.h +++ b/src/newgrf_station.h @@ -75,6 +75,9 @@ struct StationResolverObject : public ResolverObject { } const SpriteGroup *ResolveReal(const RealSpriteGroup *group) const override; + + GrfSpecFeature GetFeature() const override; + uint32 GetDebugID() const override; }; enum StationClassID : byte { diff --git a/src/openttd.cpp b/src/openttd.cpp index 48d889aef4..ffd30cf7b8 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -804,7 +804,7 @@ int openttd_main(int argc, char *argv[]) if (sounds_set == nullptr && BaseSounds::ini_set != nullptr) sounds_set = stredup(BaseSounds::ini_set); if (!BaseSounds::SetSet(sounds_set)) { if (StrEmpty(sounds_set) || !BaseSounds::SetSet(nullptr)) { - usererror("Failed to find a sounds set. Please acquire a sounds set for OpenTTD. See section 4.1 of README.md."); + usererror("Failed to find a sounds set. Please acquire a sounds set for OpenTTD. See section 1.4 of README.md."); } else { ErrorMessageData msg(STR_CONFIG_ERROR, STR_CONFIG_ERROR_INVALID_BASE_SOUNDS_NOT_FOUND); msg.SetDParamStr(0, sounds_set); @@ -817,7 +817,7 @@ int openttd_main(int argc, char *argv[]) if (music_set == nullptr && BaseMusic::ini_set != nullptr) music_set = stredup(BaseMusic::ini_set); if (!BaseMusic::SetSet(music_set)) { if (StrEmpty(music_set) || !BaseMusic::SetSet(nullptr)) { - usererror("Failed to find a music set. Please acquire a music set for OpenTTD. See section 4.1 of README.md."); + usererror("Failed to find a music set. Please acquire a music set for OpenTTD. See section 1.4 of README.md."); } else { ErrorMessageData msg(STR_CONFIG_ERROR, STR_CONFIG_ERROR_INVALID_BASE_MUSIC_NOT_FOUND); msg.SetDParamStr(0, music_set); diff --git a/src/order_base.h b/src/order_base.h index 347adbcee0..ba4959c0f3 100644 --- a/src/order_base.h +++ b/src/order_base.h @@ -281,6 +281,8 @@ public: void Initialize(Order *chain, Vehicle *v); + void RecalculateTimetableDuration(); + /** * Get the first order of the order chain. * @return the first order of the chain. diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp index 67092bc775..1e9e8f2f3b 100644 --- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -296,15 +296,15 @@ void OrderList::Initialize(Order *chain, Vehicle *v) this->num_manual_orders = 0; this->num_vehicles = 1; this->timetable_duration = 0; - this->total_duration = 0; for (Order *o = this->first; o != nullptr; o = o->next) { ++this->num_orders; if (!o->IsType(OT_IMPLICIT)) ++this->num_manual_orders; - this->timetable_duration += o->GetTimetabledWait() + o->GetTimetabledTravel(); this->total_duration += o->GetWaitTime() + o->GetTravelTime(); } + this->RecalculateTimetableDuration(); + for (Vehicle *u = this->first_shared->PreviousShared(); u != nullptr; u = u->PreviousShared()) { ++this->num_vehicles; this->first_shared = u; @@ -313,6 +313,18 @@ void OrderList::Initialize(Order *chain, Vehicle *v) for (const Vehicle *u = v->NextShared(); u != nullptr; u = u->NextShared()) ++this->num_vehicles; } +/** + * Recomputes Timetable duration. + * Split out into a separate function so it can be used by afterload. + */ +void OrderList::RecalculateTimetableDuration() +{ + this->timetable_duration = 0; + for (Order *o = this->first; o != nullptr; o = o->next) { + this->timetable_duration += o->GetTimetabledWait() + o->GetTimetabledTravel(); + } +} + /** * Free a complete order chain. * @param keep_orderlist If this is true only delete the orders, otherwise also delete the OrderList. diff --git a/src/os/macosx/crashlog_osx.cpp b/src/os/macosx/crashlog_osx.cpp index effbc73541..17686d9e1a 100644 --- a/src/os/macosx/crashlog_osx.cpp +++ b/src/os/macosx/crashlog_osx.cpp @@ -12,6 +12,7 @@ #include "../../string_func.h" #include "../../gamelog.h" #include "../../saveload/saveload.h" +#include "../../video/video_driver.hpp" #include "macos.h" #include @@ -240,7 +241,9 @@ void CDECL HandleCrash(int signum) CrashLogOSX log(signum); log.MakeCrashLog(); - log.DisplayCrashDialog(); + if (VideoDriver::GetInstance() == nullptr || VideoDriver::GetInstance()->HasGUI()) { + log.DisplayCrashDialog(); + } CrashLog::AfterCrashLogCleanup(); abort(); diff --git a/src/pathfinder/pathfinder_type.h b/src/pathfinder/pathfinder_type.h index f837f4840b..eb0381d8a3 100644 --- a/src/pathfinder/pathfinder_type.h +++ b/src/pathfinder/pathfinder_type.h @@ -44,6 +44,9 @@ static const int YAPF_SHIP_PATH_CACHE_LENGTH = 32; /** Maximum segments of road vehicle path cache */ static const int YAPF_ROADVEH_PATH_CACHE_SEGMENTS = 8; +/** Distance from destination road stops to not cache any further */ +static const int YAPF_ROADVEH_PATH_CACHE_DESTINATION_LIMIT = 8; + /** * Helper container to find a depot */ diff --git a/src/pathfinder/yapf/yapf_road.cpp b/src/pathfinder/yapf/yapf_road.cpp index 248bf1a40a..1b85c8d4ec 100644 --- a/src/pathfinder/yapf/yapf_road.cpp +++ b/src/pathfinder/yapf/yapf_road.cpp @@ -251,6 +251,11 @@ public: } } + const Station *GetDestinationStation() const + { + return m_dest_station != INVALID_STATION ? Station::GetIfValid(m_dest_station) : nullptr; + } + protected: /** to access inherited path finder */ Tpf& Yapf() @@ -402,6 +407,22 @@ public: path_cache.td.pop_back(); path_cache.tile.pop_back(); } + + /* Check if target is a station, and cached path ends within 8 tiles of the dest tile */ + const Station *st = Yapf().GetDestinationStation(); + if (st) { + const RoadStop *stop = st->GetPrimaryRoadStop(v); + if (stop != nullptr && (IsDriveThroughStopTile(stop->xy) || stop->GetNextRoadStop(v) != nullptr)) { + /* Destination station has at least 2 usable road stops, or first is a drive-through stop, + * trim end of path cache within a number of tiles of road stop tile area */ + TileArea non_cached_area = v->IsBus() ? st->bus_station : st->truck_station; + non_cached_area.Expand(YAPF_ROADVEH_PATH_CACHE_DESTINATION_LIMIT); + while (!path_cache.empty() && non_cached_area.Contains(path_cache.tile.back())) { + path_cache.td.pop_back(); + path_cache.tile.pop_back(); + } + } + } } return next_trackdir; } diff --git a/src/rev.cpp b/src/rev.cpp index 5692d8d554..f3c6f75be7 100644 --- a/src/rev.cpp +++ b/src/rev.cpp @@ -35,7 +35,7 @@ bool IsReleasedVersion() * * shows a "M", if the binary is made from modified source code. */ -const char _openttd_revision[] = "1.10.0-beta2"; +const char _openttd_revision[] = "1.10.0-RC1"; /** * The text version of OpenTTD's build date. @@ -48,7 +48,7 @@ const char _openttd_build_date[] = __DATE__ " " __TIME__; /** * The git revision hash of this version. */ -const char _openttd_revision_hash[] = "18f03a300b12bb022fb3273ff6273c430b28f787"; +const char _openttd_revision_hash[] = "49d2a07f667b8e9a8d984b35b2a41302c70c3c1e"; /** * Let us know if current build was modified. This detection diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index ae328a0652..5a9efb8567 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -1955,6 +1955,12 @@ static void TileLoop_Road(TileIndex tile) if (old_rb != new_rb) { RemoveRoad(tile, DC_EXEC | DC_AUTO | DC_NO_WATER, (old_rb ^ new_rb), RTT_ROAD, true); + + /* If new_rb is 0, there are now no road pieces left and the tile is no longer a road tile */ + if (new_rb == 0) { + MarkTileDirtyByTile(tile); + return; + } } } @@ -2269,12 +2275,12 @@ static Vehicle *UpdateRoadVehPowerProc(Vehicle *v, void *data) } /** - * Checks the tile and returns whether the current player is allowed to convert the roadtype to another roadtype + * Checks the tile and returns whether the current player is allowed to convert the roadtype to another roadtype without taking ownership * @param owner the tile owner. * @param rtt Road/tram type. * @return whether the road is convertible */ -static bool CanConvertRoadType(Owner owner, RoadTramType rtt) +static bool CanConvertUnownedRoadType(Owner owner, RoadTramType rtt) { return (owner == OWNER_NONE || (owner == OWNER_TOWN && rtt == RTT_ROAD)); } @@ -2370,7 +2376,7 @@ CommandCost CmdConvertRoad(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3 /* Trying to convert other's road */ Owner owner = GetRoadOwner(tile, rtt); - if (!CanConvertRoadType(owner, rtt)) { + if (!CanConvertUnownedRoadType(owner, rtt)) { CommandCost ret = CheckOwnership(owner, tile); if (ret.Failed()) { error = ret; @@ -2400,7 +2406,7 @@ CommandCost CmdConvertRoad(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3 if (flags & DC_EXEC) { // we can safely convert, too /* Update the company infrastructure counters. */ - if (!IsRoadStopTile(tile) && CanConvertRoadType(owner, rtt) && owner != OWNER_TOWN) { + if (!IsRoadStopTile(tile) && owner == _current_company) { ConvertRoadTypeOwner(tile, num_pieces, owner, from_type, to_type); } @@ -2447,7 +2453,7 @@ CommandCost CmdConvertRoad(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3 if (flags & DC_EXEC) { /* Update the company infrastructure counters. */ - if (CanConvertRoadType(owner, rtt) && owner != OWNER_TOWN) { + if (owner == _current_company) { ConvertRoadTypeOwner(tile, num_pieces, owner, from_type, to_type); ConvertRoadTypeOwner(endtile, num_pieces, owner, from_type, to_type); SetTunnelBridgeOwner(tile, endtile, _current_company); diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index dd9fcd534f..022fd28e93 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -222,6 +222,13 @@ void UpdateAllVirtCoords() RebuildViewportKdtree(); } +void ClearAllCachedNames() +{ + ClearAllStationCachedNames(); + ClearAllTownCachedNames(); + ClearAllIndustryCachedNames(); +} + /** * Initialization of the windows and several kinds of caches. * This is not done directly in AfterLoadGame because these @@ -238,6 +245,7 @@ static void InitializeWindowsAndCaches() SetupColoursAndInitialWindow(); /* Update coordinates of the signs. */ + ClearAllCachedNames(); UpdateAllVirtCoords(); ResetViewportAfterLoadGame(); @@ -747,6 +755,15 @@ bool AfterLoadGame() _settings_game.linkgraph.distribution_default = DT_MANUAL; } + if (IsSavegameVersionBefore(SLV_105)) { + extern int32 _old_ending_year_slv_105; // in date.cpp + _settings_game.game_creation.ending_year = _old_ending_year_slv_105 - 1; + } else if (IsSavegameVersionBefore(SLV_ENDING_YEAR)) { + /* Ending year was a GUI setting before SLV_105, was removed in revision 683b65ee1 (svn r14755). */ + /* This also converts scenarios, both when loading them into the editor, and when starting a new game. */ + _settings_game.game_creation.ending_year = DEF_END_YEAR; + } + /* Load the sprites */ GfxLoadSprites(); LoadStringWidthTable(); @@ -2954,6 +2971,16 @@ bool AfterLoadGame() } } + if (IsSavegameVersionBefore(SLV_190)) { + for (Order *order : Order::Iterate()) { + order->SetTravelTimetabled(order->GetTravelTime() > 0); + order->SetWaitTimetabled(order->GetWaitTime() > 0); + } + for (OrderList *orderlist : OrderList::Iterate()) { + orderlist->RecalculateTimetableDuration(); + } + } + /* * Only keep order-backups for network clients (and when replaying). * If we are a network server or not networking, then we just loaded a previously diff --git a/src/saveload/engine_sl.cpp b/src/saveload/engine_sl.cpp index 4ba38d04bb..44ba6498ef 100644 --- a/src/saveload/engine_sl.cpp +++ b/src/saveload/engine_sl.cpp @@ -140,6 +140,11 @@ void CopyTempEngineData() if (se->name != nullptr) e->name = stredup(se->name); } + ResetTempEngineData(); +} + +void ResetTempEngineData() +{ /* Get rid of temporary data */ for (std::vector::iterator it = _temp_engine.begin(); it != _temp_engine.end(); ++it) { FreeEngine(*it); diff --git a/src/saveload/labelmaps_sl.cpp b/src/saveload/labelmaps_sl.cpp index 472a328810..542b85b9f1 100644 --- a/src/saveload/labelmaps_sl.cpp +++ b/src/saveload/labelmaps_sl.cpp @@ -12,6 +12,7 @@ #include "../tunnelbridge_map.h" #include "saveload.h" +#include "saveload_internal.h" #include "../safeguards.h" @@ -79,6 +80,11 @@ void AfterLoadLabelMaps() } } + ResetLabelMaps(); +} + +void ResetLabelMaps() +{ _railtype_list.clear(); } @@ -106,7 +112,7 @@ static void Save_RAIL() static void Load_RAIL() { - _railtype_list.clear(); + ResetLabelMaps(); LabelObject lo; diff --git a/src/saveload/order_sl.cpp b/src/saveload/order_sl.cpp index 0a9fa2a8cc..c8747d36bb 100644 --- a/src/saveload/order_sl.cpp +++ b/src/saveload/order_sl.cpp @@ -182,10 +182,6 @@ static void Load_ORDR() while ((index = SlIterateArray()) != -1) { Order *order = new (index) Order(); SlObject(order, GetOrderDescription()); - if (IsSavegameVersionBefore(SLV_190)) { - order->SetTravelTimetabled(order->GetTravelTime() > 0); - order->SetWaitTimetabled(order->GetWaitTime() > 0); - } } } } diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index d652f0d253..aeaa7a5edd 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -2377,6 +2377,16 @@ void InitializeGame(uint size_x, uint size_y, bool reset_date, bool reset_settin extern bool AfterLoadGame(); extern bool LoadOldSaveGame(const char *file); +/** + * Clear temporary data that is passed between various saveload phases. + */ +static void ResetSaveloadData() +{ + ResetTempEngineData(); + ResetLabelMaps(); + ResetOldWaypoints(); +} + /** * Clear/free saveload state. */ @@ -2623,6 +2633,8 @@ static SaveOrLoadResult DoLoad(LoadFilter *reader, bool load_check) _next_offs = 0; if (!load_check) { + ResetSaveloadData(); + /* Old maps were hardcoded to 256x256 and thus did not contain * any mapsize information. Pre-initialize to 256x256 to not to * confuse old games */ @@ -2727,6 +2739,8 @@ SaveOrLoadResult SaveOrLoad(const char *filename, SaveLoadOperation fop, Detaile try { /* Load a TTDLX or TTDPatch game */ if (fop == SLO_LOAD && dft == DFT_OLD_GAME_FILE) { + ResetSaveloadData(); + 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 diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index beecdc8c49..14c8c32315 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -301,6 +301,7 @@ enum SaveLoadVersion : uint16 { SLV_SCRIPT_MEMLIMIT, ///< 215 PR#7516 Limit on AI/GS memory consumption. SLV_MULTITILE_DOCKS, ///< 216 PR#7380 Multiple docks per station. SLV_TRADING_AGE, ///< 217 PR#7780 Configurable company trading age. + SLV_ENDING_YEAR, ///< 218 PR#7747 Configurable ending year. SL_MAX_VERSION, ///< Highest possible saveload version }; @@ -470,7 +471,8 @@ enum VarTypes { SLF_NO_NETWORK_SYNC = 1 << 10, ///< do not synchronize over network (but it is saved if SLF_NOT_IN_SAVE is not set) SLF_ALLOW_CONTROL = 1 << 11, ///< allow control codes in the strings SLF_ALLOW_NEWLINE = 1 << 12, ///< allow new lines in the strings - /* 3 more possible flags */ + SLF_HEX = 1 << 13, ///< print numbers as hex in the config file (only useful for unsigned) + /* 2 more possible flags */ }; typedef uint32 VarType; diff --git a/src/saveload/saveload_internal.h b/src/saveload/saveload_internal.h index 02cd90f69e..8a3f433c22 100644 --- a/src/saveload/saveload_internal.h +++ b/src/saveload/saveload_internal.h @@ -20,6 +20,7 @@ StringID RemapOldStringID(StringID s); char *CopyFromOldName(StringID id); void ResetOldNames(); +void ResetOldWaypoints(); void MoveBuoysToWaypoints(); void MoveWaypointsToBaseStations(); const SaveLoad *GetBaseStationDescription(); @@ -28,6 +29,7 @@ void AfterLoadVehicles(bool part_of_load); void FixupTrainLengths(); void AfterLoadStations(); void AfterLoadRoadStops(); +void ResetLabelMaps(); void AfterLoadLabelMaps(); void AfterLoadStoryBook(); void AfterLoadLinkGraphs(); @@ -42,6 +44,7 @@ void ResetViewportAfterLoadGame(); void ConvertOldMultiheadToNew(); void ConnectMultiheadedTrains(); +void ResetTempEngineData(); Engine *GetTempDataEngine(EngineID index); void CopyTempEngineData(); diff --git a/src/saveload/waypoint_sl.cpp b/src/saveload/waypoint_sl.cpp index c0570f81d3..5336d247b4 100644 --- a/src/saveload/waypoint_sl.cpp +++ b/src/saveload/waypoint_sl.cpp @@ -9,6 +9,7 @@ #include "../stdafx.h" #include "../waypoint_base.h" +#include "../debug.h" #include "../newgrf_station.h" #include "../vehicle_base.h" #include "../town.h" @@ -98,33 +99,45 @@ void MoveWaypointsToBaseStations() /* All saveload conversions have been done. Create the new waypoints! */ for (OldWaypoint &wp : _old_waypoints) { - Waypoint *new_wp = new Waypoint(wp.xy); + TileIndex t = wp.xy; + /* Sometimes waypoint (sign) locations became disconnected from their actual location in + * the map array. If this is the case, try to locate the actual location in the map array */ + if (!IsTileType(t, MP_RAILWAY) || GetRailTileType(t) != 2 /* RAIL_TILE_WAYPOINT */ || _m[t].m2 != wp.index) { + DEBUG(sl, 0, "Found waypoint tile %u with invalid position", t); + for (t = 0; t < MapSize(); t++) { + if (IsTileType(t, MP_RAILWAY) && GetRailTileType(t) == 2 /* RAIL_TILE_WAYPOINT */ && _m[t].m2 == wp.index) { + DEBUG(sl, 0, "Found actual waypoint position at %u", t); + break; + } + } + } + if (t == MapSize()) { + SlErrorCorrupt("Waypoint with invalid tile"); + } + + Waypoint *new_wp = new Waypoint(t); new_wp->town = wp.town; new_wp->town_cn = wp.town_cn; new_wp->name = wp.name; new_wp->delete_ctr = 0; // Just reset delete counter for once. new_wp->build_date = wp.build_date; new_wp->owner = wp.owner; + new_wp->string_id = STR_SV_STNAME_WAYPOINT; - new_wp->string_id = STR_SV_STNAME_WAYPOINT; + /* The tile might've been reserved! */ + bool reserved = !IsSavegameVersionBefore(SLV_100) && HasBit(_m[t].m5, 4); - TileIndex t = wp.xy; - if (IsTileType(t, MP_RAILWAY) && GetRailTileType(t) == 2 /* RAIL_TILE_WAYPOINT */ && _m[t].m2 == wp.index) { - /* The tile might've been reserved! */ - bool reserved = !IsSavegameVersionBefore(SLV_100) && HasBit(_m[t].m5, 4); + /* The tile really has our waypoint, so reassign the map array */ + MakeRailWaypoint(t, GetTileOwner(t), new_wp->index, (Axis)GB(_m[t].m5, 0, 1), 0, GetRailType(t)); + new_wp->facilities |= FACIL_TRAIN; + new_wp->owner = GetTileOwner(t); - /* The tile really has our waypoint, so reassign the map array */ - MakeRailWaypoint(t, GetTileOwner(t), new_wp->index, (Axis)GB(_m[t].m5, 0, 1), 0, GetRailType(t)); - new_wp->facilities |= FACIL_TRAIN; - new_wp->owner = GetTileOwner(t); + SetRailStationReservation(t, reserved); - SetRailStationReservation(t, reserved); - - if (wp.spec != nullptr) { - SetCustomStationSpecIndex(t, AllocateSpecToStation(wp.spec, new_wp, true)); - } - new_wp->rect.BeforeAddTile(t, StationRect::ADD_FORCE); + if (wp.spec != nullptr) { + SetCustomStationSpecIndex(t, AllocateSpecToStation(wp.spec, new_wp, true)); } + new_wp->rect.BeforeAddTile(t, StationRect::ADD_FORCE); wp.new_index = new_wp->index; } @@ -142,6 +155,11 @@ void MoveWaypointsToBaseStations() UpdateWaypointOrder(&v->current_order); } + ResetOldWaypoints(); +} + +void ResetOldWaypoints() +{ _old_waypoints.clear(); _old_waypoints.shrink_to_fit(); } @@ -169,7 +187,7 @@ static const SaveLoad _old_waypoint_desc[] = { static void Load_WAYP() { /* Precaution for when loading failed and it didn't get cleared */ - _old_waypoints.clear(); + ResetOldWaypoints(); int index; diff --git a/src/screenshot.cpp b/src/screenshot.cpp index 60196cdf07..07a8121fe3 100644 --- a/src/screenshot.cpp +++ b/src/screenshot.cpp @@ -16,6 +16,7 @@ #include "zoom_func.h" #include "core/endian_func.hpp" #include "saveload/saveload.h" +#include "company_base.h" #include "company_func.h" #include "strings_func.h" #include "error.h" @@ -66,6 +67,8 @@ struct ScreenshotFormat { ScreenshotHandlerProc *proc; ///< Function for writing the screenshot. }; +#define MKCOLOUR(x) TO_LE32X(x) + /************************************************* **** SCREENSHOT CODE FOR WINDOWS BITMAP (.BMP) *************************************************/ @@ -709,38 +712,66 @@ static bool MakeSmallScreenshot(bool crashlog) */ void SetupScreenshotViewport(ScreenshotType t, ViewPort *vp) { - /* Determine world coordinates of screenshot */ - if (t == SC_WORLD) { - vp->zoom = ZOOM_LVL_WORLD_SCREENSHOT; + switch(t) { + case SC_VIEWPORT: + case SC_CRASHLOG: { + Window *w = FindWindowById(WC_MAIN_WINDOW, 0); + vp->virtual_left = w->viewport->virtual_left; + vp->virtual_top = w->viewport->virtual_top; + vp->virtual_width = w->viewport->virtual_width; + vp->virtual_height = w->viewport->virtual_height; - TileIndex north_tile = _settings_game.construction.freeform_edges ? TileXY(1, 1) : TileXY(0, 0); - TileIndex south_tile = MapSize() - 1; + /* Compute pixel coordinates */ + vp->left = 0; + vp->top = 0; + vp->width = _screen.width; + vp->height = _screen.height; + vp->overlay = w->viewport->overlay; + break; + } + case SC_WORLD: { + /* Determine world coordinates of screenshot */ + vp->zoom = ZOOM_LVL_WORLD_SCREENSHOT; - /* We need to account for a hill or high building at tile 0,0. */ - int extra_height_top = TilePixelHeight(north_tile) + 150; - /* If there is a hill at the bottom don't create a large black area. */ - int reclaim_height_bottom = TilePixelHeight(south_tile); + TileIndex north_tile = _settings_game.construction.freeform_edges ? TileXY(1, 1) : TileXY(0, 0); + TileIndex south_tile = MapSize() - 1; - vp->virtual_left = RemapCoords(TileX(south_tile) * TILE_SIZE, TileY(north_tile) * TILE_SIZE, 0).x; - vp->virtual_top = RemapCoords(TileX(north_tile) * TILE_SIZE, TileY(north_tile) * TILE_SIZE, extra_height_top).y; - vp->virtual_width = RemapCoords(TileX(north_tile) * TILE_SIZE, TileY(south_tile) * TILE_SIZE, 0).x - vp->virtual_left + 1; - vp->virtual_height = RemapCoords(TileX(south_tile) * TILE_SIZE, TileY(south_tile) * TILE_SIZE, reclaim_height_bottom).y - vp->virtual_top + 1; - } else { - vp->zoom = (t == SC_ZOOMEDIN) ? _settings_client.gui.zoom_min : ZOOM_LVL_VIEWPORT; + /* We need to account for a hill or high building at tile 0,0. */ + int extra_height_top = TilePixelHeight(north_tile) + 150; + /* If there is a hill at the bottom don't create a large black area. */ + int reclaim_height_bottom = TilePixelHeight(south_tile); - Window *w = FindWindowById(WC_MAIN_WINDOW, 0); - vp->virtual_left = w->viewport->virtual_left; - vp->virtual_top = w->viewport->virtual_top; - vp->virtual_width = w->viewport->virtual_width; - vp->virtual_height = w->viewport->virtual_height; + vp->virtual_left = RemapCoords(TileX(south_tile) * TILE_SIZE, TileY(north_tile) * TILE_SIZE, 0).x; + vp->virtual_top = RemapCoords(TileX(north_tile) * TILE_SIZE, TileY(north_tile) * TILE_SIZE, extra_height_top).y; + vp->virtual_width = RemapCoords(TileX(north_tile) * TILE_SIZE, TileY(south_tile) * TILE_SIZE, 0).x - vp->virtual_left + 1; + vp->virtual_height = RemapCoords(TileX(south_tile) * TILE_SIZE, TileY(south_tile) * TILE_SIZE, reclaim_height_bottom).y - vp->virtual_top + 1; + + /* Compute pixel coordinates */ + vp->left = 0; + vp->top = 0; + vp->width = UnScaleByZoom(vp->virtual_width, vp->zoom); + vp->height = UnScaleByZoom(vp->virtual_height, vp->zoom); + vp->overlay = nullptr; + break; + } + default: { + vp->zoom = (t == SC_ZOOMEDIN) ? _settings_client.gui.zoom_min : ZOOM_LVL_VIEWPORT; + + Window *w = FindWindowById(WC_MAIN_WINDOW, 0); + vp->virtual_left = w->viewport->virtual_left; + vp->virtual_top = w->viewport->virtual_top; + vp->virtual_width = w->viewport->virtual_width; + vp->virtual_height = w->viewport->virtual_height; + + /* Compute pixel coordinates */ + vp->left = 0; + vp->top = 0; + vp->width = UnScaleByZoom(vp->virtual_width, vp->zoom); + vp->height = UnScaleByZoom(vp->virtual_height, vp->zoom); + vp->overlay = nullptr; + break; + } } - - /* Compute pixel coordinates */ - vp->left = 0; - vp->top = 0; - vp->width = UnScaleByZoom(vp->virtual_width, vp->zoom); - vp->height = UnScaleByZoom(vp->virtual_height, vp->zoom); - vp->overlay = nullptr; } /** @@ -842,6 +873,10 @@ bool MakeScreenshot(ScreenshotType t, const char *name) break; } + case SC_MINIMAP: + ret = MakeMinimapWorldScreenshot(); + break; + default: NOT_REACHED(); } @@ -855,3 +890,75 @@ bool MakeScreenshot(ScreenshotType t, const char *name) return ret; } + + +/** + * Return the owner of a tile to display it with in the small map in mode "Owner". + * + * @param tile The tile of which we would like to get the colour. + * @return The owner of tile in the small map in mode "Owner" + */ +static Owner GetMinimapOwner(TileIndex tile) +{ + Owner o; + + if (IsTileType(tile, MP_VOID)) { + return OWNER_END; + } else { + switch (GetTileType(tile)) { + case MP_INDUSTRY: o = OWNER_DEITY; break; + case MP_HOUSE: o = OWNER_TOWN; break; + default: o = GetTileOwner(tile); break; + /* FIXME: For MP_ROAD there are multiple owners. + * GetTileOwner returns the rail owner (level crossing) resp. the owner of ROADTYPE_ROAD (normal road), + * even if there are no ROADTYPE_ROAD bits on the tile. + */ + } + + return o; + } +} + +static void MinimapScreenCallback(void *userdata, void *buf, uint y, uint pitch, uint n) +{ + /* Fill with the company colours */ + byte owner_colours[OWNER_END + 1]; + for (const Company *c : Company::Iterate()) { + owner_colours[c->index] = MKCOLOUR(_colour_gradient[c->colour][5]); + } + + /* Fill with some special colours */ + owner_colours[OWNER_TOWN] = PC_DARK_RED; + owner_colours[OWNER_NONE] = PC_GRASS_LAND; + owner_colours[OWNER_WATER] = PC_WATER; + owner_colours[OWNER_DEITY] = PC_DARK_GREY; // industry + owner_colours[OWNER_END] = PC_BLACK; + + uint32 *ubuf = (uint32 *)buf; + uint num = (pitch * n); + for (uint i = 0; i < num; i++) { + uint row = y + (int)(i / pitch); + uint col = (MapSizeX() - 1) - (i % pitch); + + TileIndex tile = TileXY(col, row); + Owner o = GetMinimapOwner(tile); + byte val = owner_colours[o]; + + uint32 colour_buf = 0; + colour_buf = (_cur_palette.palette[val].b << 0); + colour_buf |= (_cur_palette.palette[val].g << 8); + colour_buf |= (_cur_palette.palette[val].r << 16); + + *ubuf = colour_buf; + ubuf++; // Skip alpha + } +} + +/** + * Make a minimap screenshot. + */ +bool MakeMinimapWorldScreenshot() +{ + const ScreenshotFormat *sf = _screenshot_formats + _cur_screenshot_format; + return sf->proc(MakeScreenshotName(SCREENSHOT_NAME, sf->extension), MinimapScreenCallback, nullptr, MapSizeX(), MapSizeY(), 32, _cur_palette.palette); +} diff --git a/src/screenshot.h b/src/screenshot.h index 7a08cd4fb6..aea08a8d5f 100644 --- a/src/screenshot.h +++ b/src/screenshot.h @@ -22,11 +22,13 @@ enum ScreenshotType { SC_DEFAULTZOOM, ///< Zoomed to default zoom level screenshot of the visible area. SC_WORLD, ///< World screenshot. SC_HEIGHTMAP, ///< Heightmap of the world. + SC_MINIMAP, ///< Minimap screenshot. }; void SetupScreenshotViewport(ScreenshotType t, struct ViewPort *vp); bool MakeHeightmapScreenshot(const char *filename); bool MakeScreenshot(ScreenshotType t, const char *name); +bool MakeMinimapWorldScreenshot(); extern char _screenshot_format_name[8]; extern uint _num_screenshot_formats; diff --git a/src/screenshot_gui.cpp b/src/screenshot_gui.cpp new file mode 100644 index 0000000000..3230020245 --- /dev/null +++ b/src/screenshot_gui.cpp @@ -0,0 +1,108 @@ +/* + * 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 screenshot_gui.cpp GUI functions related to screenshots. */ + +#include "stdafx.h" +#include "gui.h" +#include "viewport_func.h" +#include "window_func.h" +#include "window_gui.h" +#include "screenshot.h" +#include "textbuf_gui.h" +#include "strings_func.h" + +#include "widgets/screenshot_widget.h" + +#include "table/strings.h" + +static ScreenshotType _screenshot_type; + +struct ScreenshotWindow : Window { + ScreenshotWindow(WindowDesc *desc) : Window(desc) { + this->CreateNestedTree(); + this->FinishInitNested(); + } + + void OnPaint() override { + this->DrawWidgets(); + } + + void OnClick(Point pt, int widget, int click_count) override { + if (widget < 0) return; + ScreenshotType st; + switch (widget) { + default: + case WID_SC_TAKE: st = SC_VIEWPORT; break; + case WID_SC_TAKE_ZOOMIN: st = SC_ZOOMEDIN; break; + case WID_SC_TAKE_DEFAULTZOOM: st = SC_DEFAULTZOOM; break; + case WID_SC_TAKE_WORLD: st = SC_WORLD; break; + case WID_SC_TAKE_HEIGHTMAP: st = SC_HEIGHTMAP; break; + case WID_SC_TAKE_MINIMAP: st = SC_MINIMAP; break; + } + TakeScreenshot(st); + } + + /** + * Make a screenshot. + * Ask for confirmation if the screenshot will be huge. + * @param t Screenshot type: World, defaultzoom, heightmap or viewport screenshot + */ + static void TakeScreenshot(ScreenshotType st) { + ViewPort vp; + SetupScreenshotViewport(st, &vp); + if ((uint64)vp.width * (uint64)vp.height > 8192 * 8192) { + /* Ask for confirmation */ + _screenshot_type = st; + SetDParam(0, vp.width); + SetDParam(1, vp.height); + ShowQuery(STR_WARNING_SCREENSHOT_SIZE_CAPTION, STR_WARNING_SCREENSHOT_SIZE_MESSAGE, nullptr, ScreenshotConfirmationCallback); + } + else { + /* Less than 64M pixels, just do it */ + MakeScreenshot(st, nullptr); + } + } + + /** + * Callback on the confirmation window for huge screenshots. + * @param w Window with viewport + * @param confirmed true on confirmation + */ + static void ScreenshotConfirmationCallback(Window *w, bool confirmed) { + if (confirmed) MakeScreenshot(_screenshot_type, nullptr); + } +}; + +static const NWidgetPart _nested_screenshot[] = { + NWidget(NWID_HORIZONTAL), + NWidget(WWT_CLOSEBOX, COLOUR_GREY), + NWidget(WWT_CAPTION, COLOUR_GREY), SetDataTip(STR_SCREENSHOT_CAPTION, 0), + NWidget(WWT_SHADEBOX, COLOUR_GREY), + NWidget(WWT_STICKYBOX, COLOUR_GREY), + EndContainer(), + NWidget(NWID_VERTICAL, NC_EQUALSIZE), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SC_TAKE), SetFill(1, 1), SetDataTip(STR_SCREENSHOT_SCREENSHOT, 0), SetMinimalTextLines(2, 0), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SC_TAKE_ZOOMIN), SetFill(1, 1), SetDataTip(STR_SCREENSHOT_ZOOMIN_SCREENSHOT, 0), SetMinimalTextLines(2, 0), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SC_TAKE_DEFAULTZOOM), SetFill(1, 1), SetDataTip(STR_SCREENSHOT_DEFAULTZOOM_SCREENSHOT, 0), SetMinimalTextLines(2, 0), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SC_TAKE_WORLD), SetFill(1, 1), SetDataTip(STR_SCREENSHOT_WORLD_SCREENSHOT, 0), SetMinimalTextLines(2, 0), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SC_TAKE_HEIGHTMAP), SetFill(1, 1), SetDataTip(STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT, 0), SetMinimalTextLines(2, 0), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SC_TAKE_MINIMAP), SetFill(1, 1), SetDataTip(STR_SCREENSHOT_MINIMAP_SCREENSHOT, 0), SetMinimalTextLines(2, 0), + EndContainer(), +}; + +static WindowDesc _screenshot_window_desc( + WDP_AUTO, "take_a_screenshot", 200, 100, + WC_SCREENSHOT, WC_NONE, + 0, + _nested_screenshot, lengthof(_nested_screenshot) +); + +void ShowScreenshotWindow() { + DeleteWindowById(WC_SCREENSHOT, 0); + new ScreenshotWindow(&_screenshot_window_desc); +} diff --git a/src/screenshot_gui.h b/src/screenshot_gui.h new file mode 100644 index 0000000000..44a395edb1 --- /dev/null +++ b/src/screenshot_gui.h @@ -0,0 +1,15 @@ +/* + * 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 screenshot_gui.h GUI functions related to screenshots. */ + +#ifndef SCREENSHOT_GUI_H +#define SCREENSHOT_GUI_H + +void ShowScreenshotWindow(); + +#endif /* SCREENSHOT_GUI_H */ diff --git a/src/script/api/Doxyfile_AI b/src/script/api/Doxyfile_AI index 4e033d21f6..d882599152 100644 --- a/src/script/api/Doxyfile_AI +++ b/src/script/api/Doxyfile_AI @@ -9,8 +9,8 @@ # Project related configuration options #--------------------------------------------------------------------------- DOXYFILE_ENCODING = UTF-8 -PROJECT_NAME = "OpenTTD NoAI API" -PROJECT_NUMBER = +PROJECT_NAME = "OpenTTD AI API" +PROJECT_NUMBER = $(VERSION) OUTPUT_DIRECTORY = ../../../docs/aidocs/ CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English diff --git a/src/script/api/Doxyfile_Game b/src/script/api/Doxyfile_Game index eb5691d8b5..99b2ab05eb 100644 --- a/src/script/api/Doxyfile_Game +++ b/src/script/api/Doxyfile_Game @@ -9,8 +9,8 @@ # Project related configuration options #--------------------------------------------------------------------------- DOXYFILE_ENCODING = UTF-8 -PROJECT_NAME = "OpenTTD Game API" -PROJECT_NUMBER = +PROJECT_NAME = "OpenTTD GameScript API" +PROJECT_NUMBER = $(VERSION) OUTPUT_DIRECTORY = ../../../docs/gamedocs/ CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English diff --git a/src/script/api/game/game_engine.hpp.sq b/src/script/api/game/game_engine.hpp.sq index fdef599c39..2efa1414a9 100644 --- a/src/script/api/game/game_engine.hpp.sq +++ b/src/script/api/game/game_engine.hpp.sq @@ -46,6 +46,8 @@ void SQGSEngine_Register(Squirrel *engine) SQGSEngine.DefSQStaticMethod(engine, &ScriptEngine::IsArticulated, "IsArticulated", 2, ".i"); SQGSEngine.DefSQStaticMethod(engine, &ScriptEngine::GetPlaneType, "GetPlaneType", 2, ".i"); SQGSEngine.DefSQStaticMethod(engine, &ScriptEngine::GetMaximumOrderDistance, "GetMaximumOrderDistance", 2, ".i"); + SQGSEngine.DefSQStaticMethod(engine, &ScriptEngine::EnableForCompany, "EnableForCompany", 3, ".ii"); + SQGSEngine.DefSQStaticMethod(engine, &ScriptEngine::DisableForCompany, "DisableForCompany", 3, ".ii"); SQGSEngine.PostRegister(engine); } diff --git a/src/script/api/game/game_town.hpp.sq b/src/script/api/game/game_town.hpp.sq index b97cb59d20..5cf394ca1c 100644 --- a/src/script/api/game/game_town.hpp.sq +++ b/src/script/api/game/game_town.hpp.sq @@ -79,6 +79,8 @@ void SQGSTown_Register(Squirrel *engine) SQGSTown.DefSQStaticMethod(engine, &ScriptTown::ExpandTown, "ExpandTown", 3, ".ii"); SQGSTown.DefSQStaticMethod(engine, &ScriptTown::FoundTown, "FoundTown", 6, ".iibi."); SQGSTown.DefSQStaticMethod(engine, &ScriptTown::GetRating, "GetRating", 3, ".ii"); + SQGSTown.DefSQStaticMethod(engine, &ScriptTown::GetDetailedRating, "GetDetailedRating", 3, ".ii"); + SQGSTown.DefSQStaticMethod(engine, &ScriptTown::ChangeRating, "ChangeRating", 4, ".iii"); SQGSTown.DefSQStaticMethod(engine, &ScriptTown::GetAllowedNoise, "GetAllowedNoise", 2, ".i"); SQGSTown.DefSQStaticMethod(engine, &ScriptTown::GetRoadLayout, "GetRoadLayout", 2, ".i"); diff --git a/src/script/api/game/game_window.hpp.sq b/src/script/api/game/game_window.hpp.sq index be89676047..609030676a 100644 --- a/src/script/api/game/game_window.hpp.sq +++ b/src/script/api/game/game_window.hpp.sq @@ -138,6 +138,7 @@ void SQGSWindow_Register(Squirrel *engine) 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_SCREENSHOT, "WC_SCREENSHOT"); SQGSWindow.DefSQConst(engine, ScriptWindow::WC_INVALID, "WC_INVALID"); SQGSWindow.DefSQConst(engine, ScriptWindow::TC_BLUE, "TC_BLUE"); SQGSWindow.DefSQConst(engine, ScriptWindow::TC_SILVER, "TC_SILVER"); @@ -588,6 +589,8 @@ void SQGSWindow_Register(Squirrel *engine) SQGSWindow.DefSQConst(engine, ScriptWindow::WID_IV_DISPLAY, "WID_IV_DISPLAY"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_ID_DROPDOWN_ORDER, "WID_ID_DROPDOWN_ORDER"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_ID_DROPDOWN_CRITERIA, "WID_ID_DROPDOWN_CRITERIA"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_ID_FILTER_BY_ACC_CARGO, "WID_ID_FILTER_BY_ACC_CARGO"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_ID_FILTER_BY_PROD_CARGO, "WID_ID_FILTER_BY_PROD_CARGO"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_ID_INDUSTRY_LIST, "WID_ID_INDUSTRY_LIST"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_ID_SCROLLBAR, "WID_ID_SCROLLBAR"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_IC_CAPTION, "WID_IC_CAPTION"); @@ -1028,6 +1031,12 @@ void SQGSWindow_Register(Squirrel *engine) SQGSWindow.DefSQConst(engine, ScriptWindow::WID_BROS_LT_OFF, "WID_BROS_LT_OFF"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_BROS_LT_ON, "WID_BROS_LT_ON"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_BROS_INFO, "WID_BROS_INFO"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_SC_TAKE, "WID_SC_TAKE"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_SC_TAKE_ZOOMIN, "WID_SC_TAKE_ZOOMIN"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_SC_TAKE_DEFAULTZOOM, "WID_SC_TAKE_DEFAULTZOOM"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_SC_TAKE_WORLD, "WID_SC_TAKE_WORLD"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_SC_TAKE_HEIGHTMAP, "WID_SC_TAKE_HEIGHTMAP"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_SC_TAKE_MINIMAP, "WID_SC_TAKE_MINIMAP"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_GO_BACKGROUND, "WID_GO_BACKGROUND"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_GO_CURRENCY_DROPDOWN, "WID_GO_CURRENCY_DROPDOWN"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_GO_DISTANCE_DROPDOWN, "WID_GO_DISTANCE_DROPDOWN"); diff --git a/src/script/api/game_changelog.hpp b/src/script/api/game_changelog.hpp index 74fdb6423a..235dcee986 100644 --- a/src/script/api/game_changelog.hpp +++ b/src/script/api/game_changelog.hpp @@ -25,6 +25,8 @@ * \li GSRoad::RoadVehHasPowerOnRoad * \li GSRoad::ConvertRoadType * \li GSRoad::GetMaxSpeed + * \li GSEngine::EnableForCompany + * \li GSEngine::DisableForCompany * * \b 1.9.0 * diff --git a/src/script/api/script_engine.cpp b/src/script/api/script_engine.cpp index 6b1e267ff3..1ec1b23a8e 100644 --- a/src/script/api/script_engine.cpp +++ b/src/script/api/script_engine.cpp @@ -276,3 +276,25 @@ return 0; } } + +/* static */ bool ScriptEngine::EnableForCompany(EngineID engine_id, ScriptCompany::CompanyID company) +{ + company = ScriptCompany::ResolveCompanyID(company); + + EnforcePrecondition(false, ScriptObject::GetCompany() == OWNER_DEITY); + EnforcePrecondition(false, IsValidEngine(engine_id)); + EnforcePrecondition(false, company != ScriptCompany::COMPANY_INVALID); + + return ScriptObject::DoCommand(0, engine_id, (uint32)company | (1 << 31), CMD_ENGINE_CTRL); +} + +/* static */ bool ScriptEngine::DisableForCompany(EngineID engine_id, ScriptCompany::CompanyID company) +{ + company = ScriptCompany::ResolveCompanyID(company); + + EnforcePrecondition(false, ScriptObject::GetCompany() == OWNER_DEITY); + EnforcePrecondition(false, IsValidEngine(engine_id)); + EnforcePrecondition(false, company != ScriptCompany::COMPANY_INVALID); + + return ScriptObject::DoCommand(0, engine_id, company, CMD_ENGINE_CTRL); +} diff --git a/src/script/api/script_engine.hpp b/src/script/api/script_engine.hpp index 4a570fb9ca..f6bdbedbf2 100644 --- a/src/script/api/script_engine.hpp +++ b/src/script/api/script_engine.hpp @@ -287,6 +287,29 @@ public: * @see ScriptOrder::GetOrderDistance */ static uint GetMaximumOrderDistance(EngineID engine_id); + + /** + * Allows a company to use an engine before its intro date or after retirement. + * @param engine_id The engine to enable. + * @param company_id The company to allow using the engine. + * @pre IsValidEngine(engine_id). + * @pre ScriptCompany.ResolveCompanyID(company_id) != ScriptCompany::COMPANY_INVALID. + * @return True if the action succeeded. + * @api -ai + */ + static bool EnableForCompany(EngineID engine_id, ScriptCompany::CompanyID company_id); + + /** + * Forbids a company to use an engine before its natural retirement. + * @param engine_id The engine to disable. + * @param company_id The company to forbid using the engine. + * @pre IsValidEngine(engine_id). + * @pre ScriptCompany.ResolveCompanyID(company_id) != ScriptCompany::COMPANY_INVALID. + * @return True if the action succeeded. + * @api -ai + */ + static bool DisableForCompany(EngineID engine_id, ScriptCompany::CompanyID company_id); + }; #endif /* SCRIPT_ENGINE_HPP */ diff --git a/src/script/api/script_town.cpp b/src/script/api/script_town.cpp index 1cb6e32bb1..afe5614566 100644 --- a/src/script/api/script_town.cpp +++ b/src/script/api/script_town.cpp @@ -336,6 +336,33 @@ } } +/* static */ int ScriptTown::GetDetailedRating(TownID town_id, ScriptCompany::CompanyID company_id) +{ + if (!IsValidTown(town_id)) return TOWN_RATING_INVALID; + ScriptCompany::CompanyID company = ScriptCompany::ResolveCompanyID(company_id); + if (company == ScriptCompany::COMPANY_INVALID) return TOWN_RATING_INVALID; + + const Town *t = ::Town::Get(town_id); + return t->ratings[company]; +} + +/* static */ bool ScriptTown::ChangeRating(TownID town_id, ScriptCompany::CompanyID company_id, int delta) +{ + EnforcePrecondition(false, ScriptObject::GetCompany() == OWNER_DEITY); + EnforcePrecondition(false, IsValidTown(town_id)); + ScriptCompany::CompanyID company = ScriptCompany::ResolveCompanyID(company_id); + EnforcePrecondition(false, company != ScriptCompany::COMPANY_INVALID); + + const Town *t = ::Town::Get(town_id); + int16 new_rating = Clamp(t->ratings[company] + delta, RATING_MINIMUM, RATING_MAXIMUM); + if (new_rating == t->ratings[company]) return false; + + uint16 p2 = 0; + memcpy(&p2, &new_rating, sizeof(p2)); + + return ScriptObject::DoCommand(0, town_id | (company_id << 16), p2, CMD_TOWN_RATING); +} + /* static */ int ScriptTown::GetAllowedNoise(TownID town_id) { if (!IsValidTown(town_id)) return -1; diff --git a/src/script/api/script_town.hpp b/src/script/api/script_town.hpp index 71fb5a712a..6ae7ee33f5 100644 --- a/src/script/api/script_town.hpp +++ b/src/script/api/script_town.hpp @@ -423,6 +423,30 @@ public: */ static TownRating GetRating(TownID town_id, ScriptCompany::CompanyID company_id); + /** + * Get the accurate rating of a company within a town. + * @param town_id The town to get the rating for. + * @param company_id The company to get the rating for. + * @pre IsValidTown(town_id). + * @pre ScriptCompany.ResolveCompanyID(company) != ScriptCompany::COMPANY_INVALID. + * @return The rating as a number between -1000 (worst) and 1000 (best). + * @api -ai + */ + static int GetDetailedRating(TownID town_id, ScriptCompany::CompanyID company_id); + + /** + * Change the rating of a company within a town. + * @param town_id The town to change the rating in. + * @param company_id The company to change the rating for. + * @param delta How much to change rating by (range -1000 to +1000). + * @return True if the rating was changed. + * @pre IsValidTown(town_id). + * @pre ScriptCompany.ResolveCompanyID(company) != ScriptCompany::COMPANY_INVALID. + * @pre no company mode in scope + * @api -ai + */ + static bool ChangeRating(TownID town_id, ScriptCompany::CompanyID company_id, int delta); + /** * Get the maximum level of noise that still can be added by airports * before the town start to refuse building a new airport. diff --git a/src/script/api/script_window.hpp b/src/script/api/script_window.hpp index 4efcc5bb6b..69d6b81f9b 100644 --- a/src/script/api/script_window.hpp +++ b/src/script/api/script_window.hpp @@ -52,6 +52,7 @@ #include "../../widgets/osk_widget.h" #include "../../widgets/rail_widget.h" #include "../../widgets/road_widget.h" +#include "../../widgets/screenshot_widget.h" #include "../../widgets/settings_widget.h" #include "../../widgets/sign_widget.h" #include "../../widgets/smallmap_widget.h" @@ -775,6 +776,12 @@ public: */ WC_FRAMETIME_GRAPH = ::WC_FRAMETIME_GRAPH, + /** + * Screenshot window; %Window numbers: + * - 0 = #ScreenshotWidgets + */ + WC_SCREENSHOT = ::WC_SCREENSHOT, + WC_INVALID = ::WC_INVALID, ///< Invalid window. }; @@ -1516,6 +1523,8 @@ public: enum IndustryDirectoryWidgets { WID_ID_DROPDOWN_ORDER = ::WID_ID_DROPDOWN_ORDER, ///< Dropdown for the order of the sort. WID_ID_DROPDOWN_CRITERIA = ::WID_ID_DROPDOWN_CRITERIA, ///< Dropdown for the criteria of the sort. + WID_ID_FILTER_BY_ACC_CARGO = ::WID_ID_FILTER_BY_ACC_CARGO, ///< Accepted cargo filter dropdown list. + WID_ID_FILTER_BY_PROD_CARGO = ::WID_ID_FILTER_BY_PROD_CARGO, ///< Produced cargo filter dropdown list. WID_ID_INDUSTRY_LIST = ::WID_ID_INDUSTRY_LIST, ///< Industry list. WID_ID_SCROLLBAR = ::WID_ID_SCROLLBAR, ///< Scrollbar of the list. }; @@ -2171,6 +2180,17 @@ public: WID_BROS_INFO = ::WID_BROS_INFO, ///< Station acceptance info. }; + /* automatically generated from ../../widgets/screenshot_widget.h */ + /** Widgets of the #ScreenshotWindow class. */ + enum ScreenshotWindowWidgets { + WID_SC_TAKE = ::WID_SC_TAKE, ///< Button for taking a normal screenshot + WID_SC_TAKE_ZOOMIN = ::WID_SC_TAKE_ZOOMIN, ///< Button for taking a zoomed in screenshot + WID_SC_TAKE_DEFAULTZOOM = ::WID_SC_TAKE_DEFAULTZOOM, ///< Button for taking a screenshot at normal zoom + WID_SC_TAKE_WORLD = ::WID_SC_TAKE_WORLD, ///< Button for taking a screenshot of the whole world + WID_SC_TAKE_HEIGHTMAP = ::WID_SC_TAKE_HEIGHTMAP, ///< Button for taking a heightmap "screenshot" + WID_SC_TAKE_MINIMAP = ::WID_SC_TAKE_MINIMAP, ///< Button for taking a minimap screenshot + }; + /* automatically generated from ../../widgets/settings_widget.h */ /** Widgets of the #GameOptionsWindow class. */ enum GameOptionsWidgets { diff --git a/src/script/api/template/template_window.hpp.sq b/src/script/api/template/template_window.hpp.sq index 016726db2f..723c98a91b 100644 --- a/src/script/api/template/template_window.hpp.sq +++ b/src/script/api/template/template_window.hpp.sq @@ -193,6 +193,8 @@ namespace SQConvert { template <> inline int Return(HSQUIRRELVM vm, ScriptWindow::BuildRoadDepotWidgets res) { sq_pushinteger(vm, (int32)res); return 1; } template <> inline ScriptWindow::BuildRoadStationWidgets GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (ScriptWindow::BuildRoadStationWidgets)tmp; } template <> inline int Return(HSQUIRRELVM vm, ScriptWindow::BuildRoadStationWidgets res) { sq_pushinteger(vm, (int32)res); return 1; } + template <> inline ScriptWindow::ScreenshotWindowWidgets GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (ScriptWindow::ScreenshotWindowWidgets)tmp; } + template <> inline int Return(HSQUIRRELVM vm, ScriptWindow::ScreenshotWindowWidgets res) { sq_pushinteger(vm, (int32)res); return 1; } template <> inline ScriptWindow::GameOptionsWidgets GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (ScriptWindow::GameOptionsWidgets)tmp; } template <> inline int Return(HSQUIRRELVM vm, ScriptWindow::GameOptionsWidgets res) { sq_pushinteger(vm, (int32)res); return 1; } template <> inline ScriptWindow::GameSettingsWidgets GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (ScriptWindow::GameSettingsWidgets)tmp; } diff --git a/src/settings.cpp b/src/settings.cpp index 0a7ac89ac3..7fb2e72491 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -22,6 +22,7 @@ */ #include "stdafx.h" +#include #include "currency.h" #include "screenshot.h" #include "network/network.h" @@ -169,7 +170,8 @@ static size_t LookupManyOfMany(const char *many, const char *str) * @param maxitems the maximum number of elements the integerlist-array has * @return returns the number of items found, or -1 on an error */ -static int ParseIntList(const char *p, int *items, int maxitems) +template +static int ParseIntList(const char *p, T *items, int maxitems) { int n = 0; // number of items read so far bool comma = false; // do we accept comma? @@ -189,9 +191,9 @@ static int ParseIntList(const char *p, int *items, int maxitems) default: { if (n == maxitems) return -1; // we don't accept that many numbers char *end; - long v = strtol(p, &end, 0); + unsigned long v = strtoul(p, &end, 0); if (p == end) return -1; // invalid character (not a number) - if (sizeof(int) < sizeof(long)) v = ClampToI32(v); + if (sizeof(T) < sizeof(v)) v = Clamp(v, std::numeric_limits::min(), std::numeric_limits::max()); items[n++] = v; p = end; // first non-number comma = true; // we accept comma now @@ -217,7 +219,7 @@ static int ParseIntList(const char *p, int *items, int maxitems) */ static bool LoadIntList(const char *str, void *array, int nelems, VarType type) { - int items[64]; + unsigned long items[64]; int i, nitems; if (str == nullptr) { @@ -266,7 +268,7 @@ static void MakeIntList(char *buf, const char *last, const void *array, int nele const byte *p = (const byte *)array; for (i = 0; i != nelems; i++) { - switch (type) { + switch (GetVarMemType(type)) { case SLE_VAR_BL: case SLE_VAR_I8: v = *(const int8 *)p; p += 1; break; case SLE_VAR_U8: v = *(const uint8 *)p; p += 1; break; @@ -276,7 +278,13 @@ static void MakeIntList(char *buf, const char *last, const void *array, int nele case SLE_VAR_U32: v = *(const uint32 *)p; p += 4; break; default: NOT_REACHED(); } - buf += seprintf(buf, last, (i == 0) ? "%d" : ",%d", v); + if (IsSignedVarMemType(type)) { + buf += seprintf(buf, last, (i == 0) ? "%d" : ",%d", v); + } else if (type & SLF_HEX) { + buf += seprintf(buf, last, (i == 0) ? "0x%X" : ",0x%X", v); + } else { + buf += seprintf(buf, last, (i == 0) ? "%u" : ",%u", v); + } } } @@ -671,7 +679,7 @@ static void IniSaveSettings(IniFile *ini, const SettingDesc *sd, const char *grp switch (sdb->cmd) { case SDT_BOOLX: strecpy(buf, (i != 0) ? "true" : "false", lastof(buf)); break; - case SDT_NUMX: seprintf(buf, lastof(buf), IsSignedVarMemType(sld->conv) ? "%d" : "%u", i); break; + case SDT_NUMX: seprintf(buf, lastof(buf), IsSignedVarMemType(sld->conv) ? "%d" : (sld->conv & SLF_HEX) ? "%X" : "%u", i); break; case SDT_ONEOFMANY: MakeOneOfMany(buf, lastof(buf), sdb->many, i); break; case SDT_MANYOFMANY: MakeManyOfMany(buf, lastof(buf), sdb->many, i); break; default: NOT_REACHED(); @@ -699,7 +707,7 @@ static void IniSaveSettings(IniFile *ini, const SettingDesc *sd, const char *grp break; case SDT_INTLIST: - MakeIntList(buf, lastof(buf), ptr, sld->length, GetVarMemType(sld->conv)); + MakeIntList(buf, lastof(buf), ptr, sld->length, sld->conv); break; default: NOT_REACHED(); @@ -1534,7 +1542,7 @@ static GRFConfig *GRFLoadConfig(IniFile *ini, const char *grpname, bool is_stati /* Parse parameters */ if (!StrEmpty(item->value)) { - int count = ParseIntList(item->value, (int*)c->param, lengthof(c->param)); + int count = ParseIntList(item->value, c->param, lengthof(c->param)); if (count < 0) { SetDParamStr(0, filename); ShowErrorMessage(STR_CONFIG_ERROR, STR_CONFIG_ERROR_ARRAY, WL_CRITICAL); diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 4b7768dfa9..968be54f67 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -526,6 +526,7 @@ struct GameOptionsWindow : Window { ReadLanguagePack(&_languages[index]); DeleteWindowByClass(WC_QUERY_STRING); CheckForMissingGlyphs(); + ClearAllCachedNames(); UpdateAllVirtCoords(); ReInitAllWindows(); break; @@ -1566,6 +1567,7 @@ static SettingsContainer &GetSettingsTree() interface->Add(new SettingEntry("gui.timetable_in_ticks")); interface->Add(new SettingEntry("gui.timetable_arrival_departure")); interface->Add(new SettingEntry("gui.expenses_layout")); + interface->Add(new SettingEntry("gui.show_newgrf_name")); } SettingsPage *advisors = main->Add(new SettingsPage(STR_CONFIG_SETTING_ADVISORS)); @@ -1698,6 +1700,7 @@ static SettingsContainer &GetSettingsTree() genworld->Add(new SettingEntry("economy.town_layout")); genworld->Add(new SettingEntry("difficulty.industry_density")); genworld->Add(new SettingEntry("gui.pause_on_newgame")); + genworld->Add(new SettingEntry("game_creation.ending_year")); } SettingsPage *environment = main->Add(new SettingsPage(STR_CONFIG_SETTING_ENVIRONMENT)); diff --git a/src/settings_type.h b/src/settings_type.h index 60db6c9f97..fdb2b0f862 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -145,6 +145,7 @@ struct GUISettings { uint8 graph_line_thickness; ///< the thickness of the lines in the various graph guis uint8 osk_activation; ///< Mouse gesture to trigger the OSK. byte starting_colour; ///< default color scheme for the company to start a new game with + bool show_newgrf_name; ///< Show the name of the NewGRF in the build vehicle window uint16 console_backlog_timeout; ///< the minimum amount of time items should be in the console backlog before they will be removed in ~3 seconds granularity. uint16 console_backlog_length; ///< the minimum amount of items in the console backlog before items will be removed. @@ -278,6 +279,7 @@ struct NetworkSettings { struct GameCreationSettings { uint32 generation_seed; ///< noise seed for world generation Year starting_year; ///< starting date + Year ending_year; ///< scoring end date uint8 map_x; ///< X size of map uint8 map_y; ///< Y size of map byte land_generator; ///< the landscape generator diff --git a/src/ship_cmd.cpp b/src/ship_cmd.cpp index 35edda113e..1758454add 100644 --- a/src/ship_cmd.cpp +++ b/src/ship_cmd.cpp @@ -501,10 +501,9 @@ static Track ChooseShipTrack(Ship *v, TileIndex tile, DiagDirection enterdir, Tr * Get the available water tracks on a tile for a ship entering a tile. * @param tile The tile about to enter. * @param dir The entry direction. - * @param trackdir The trackdir the ship has on the old tile. * @return The available trackbits on the next tile. */ -static inline TrackBits GetAvailShipTracks(TileIndex tile, DiagDirection dir, Trackdir trackdir) +static inline TrackBits GetAvailShipTracks(TileIndex tile, DiagDirection dir) { TrackBits tracks = GetTileShipTrackStatus(tile) & DiagdirReachesTracks(dir); @@ -715,7 +714,7 @@ static void ShipController(Ship *v) DiagDirection diagdir = DiagdirBetweenTiles(gp.old_tile, gp.new_tile); assert(diagdir != INVALID_DIAGDIR); - tracks = GetAvailShipTracks(gp.new_tile, diagdir, v->GetVehicleTrackdir()); + tracks = GetAvailShipTracks(gp.new_tile, diagdir); if (tracks == TRACK_BIT_NONE) goto reverse_direction; /* Choose a direction, and continue if we find one */ diff --git a/src/smallmap_gui.cpp b/src/smallmap_gui.cpp index 00f682f635..c4b650fc22 100644 --- a/src/smallmap_gui.cpp +++ b/src/smallmap_gui.cpp @@ -40,13 +40,6 @@ static uint8 _linkstat_colours_in_legenda[] = {0, 1, 3, 5, 7, 9, 11}; static const int NUM_NO_COMPANY_ENTRIES = 4; ///< Number of entries in the owner legend that are not companies. -static const uint8 PC_ROUGH_LAND = 0x52; ///< Dark green palette colour for rough land. -static const uint8 PC_GRASS_LAND = 0x54; ///< Dark green palette colour for grass land. -static const uint8 PC_BARE_LAND = 0x37; ///< Brown palette colour for bare land. -static const uint8 PC_FIELDS = 0x25; ///< Light brown palette colour for fields. -static const uint8 PC_TREES = 0x57; ///< Green palette colour for trees. -static const uint8 PC_WATER = 0xC9; ///< Dark blue palette colour for water. - /** Macro for ordinary entry of LegendAndColour */ #define MK(a, b) {a, b, INVALID_INDUSTRYTYPE, 0, INVALID_COMPANY, true, false, false} diff --git a/src/spritecache.cpp b/src/spritecache.cpp index f36354c013..da0ca80484 100644 --- a/src/spritecache.cpp +++ b/src/spritecache.cpp @@ -145,6 +145,17 @@ uint GetOriginFileSlot(SpriteID sprite) return GetSpriteCache(sprite)->file_slot; } +/** + * Get the GRF-local sprite id of a given sprite. + * @param sprite The sprite to look at. + * @return The GRF-local sprite id. + */ +uint32 GetSpriteLocalID(SpriteID sprite) +{ + if (!SpriteExists(sprite)) return 0; + return GetSpriteCache(sprite)->id; +} + /** * Count the sprites which originate from a specific file slot in a range of SpriteIDs. * @param file_slot FIOS file slot. diff --git a/src/spritecache.h b/src/spritecache.h index 3b3e1c9de5..1b738a8658 100644 --- a/src/spritecache.h +++ b/src/spritecache.h @@ -30,6 +30,7 @@ bool SpriteExists(SpriteID sprite); SpriteType GetSpriteType(SpriteID sprite); uint GetOriginFileSlot(SpriteID sprite); +uint32 GetSpriteLocalID(SpriteID sprite); uint GetSpriteCountForSlot(uint file_slot, SpriteID begin, SpriteID end); uint GetMaxSpriteID(); diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 8f057453f9..385072b956 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -453,6 +453,22 @@ void UpdateAllStationVirtCoords() } } +void BaseStation::FillCachedName() const +{ + char buf[MAX_LENGTH_STATION_NAME_CHARS * MAX_CHAR_LENGTH]; + int64 args_array[] = { this->index }; + StringParameters tmp_params(args_array); + char *end = GetStringWithArgs(buf, Waypoint::IsExpected(this) ? STR_WAYPOINT_NAME : STR_STATION_NAME, &tmp_params, lastof(buf)); + this->cached_name.assign(buf, end); +} + +void ClearAllStationCachedNames() +{ + for (BaseStation *st : BaseStation::Iterate()) { + st->cached_name.clear(); + } +} + /** * Get a mask of the cargo types that the station accepts. * @param st Station to query @@ -3842,7 +3858,7 @@ void StationMonthlyLoop() void ModifyStationRatingAround(TileIndex tile, Owner owner, int amount, uint radius) { ForAllStationsRadius(tile, radius, [&](Station *st) { - if (st->owner == owner) { + if (st->owner == owner && DistanceManhattan(tile, st->xy) <= radius) { for (CargoID i = 0; i < NUM_CARGO; i++) { GoodsEntry *ge = &st->goods[i]; @@ -3933,6 +3949,7 @@ CommandCost CmdRenameStation(TileIndex tile, DoCommandFlag flags, uint32 p1, uin } if (flags & DC_EXEC) { + st->cached_name.clear(); free(st->name); st->name = reset ? nullptr : stredup(text); @@ -4014,68 +4031,109 @@ const StationList *StationFinder::GetStations() return &this->stations; } +static bool CanMoveGoodsToStation(const Station *st, CargoID type) +{ + /* Is the station reserved exclusively for somebody else? */ + if (st->owner != OWNER_NONE && st->town->exclusive_counter > 0 && st->town->exclusivity != st->owner) return false; + + /* Lowest possible rating, better not to give cargo anymore. */ + if (st->goods[type].rating == 0) return false; + + /* Selectively servicing stations, and not this one. */ + if (_settings_game.order.selectgoods && !st->goods[type].HasVehicleEverTriedLoading()) return false; + + if (IsCargoInClass(type, CC_PASSENGERS)) { + /* Passengers are never served by just a truck stop. */ + if (st->facilities == FACIL_TRUCK_STOP) return false; + } else { + /* Non-passengers are never served by just a bus stop. */ + if (st->facilities == FACIL_BUS_STOP) return false; + } + return true; +} + uint MoveGoodsToStation(CargoID type, uint amount, SourceType source_type, SourceID source_id, const StationList *all_stations) { /* Return if nothing to do. Also the rounding below fails for 0. */ + if (all_stations->empty()) return 0; if (amount == 0) return 0; - Station *st1 = nullptr; // Station with best rating - Station *st2 = nullptr; // Second best station - uint best_rating1 = 0; // rating of st1 - uint best_rating2 = 0; // rating of st2 + Station *first_station = nullptr; + typedef std::pair StationInfo; + std::vector used_stations; for (Station *st : *all_stations) { - /* Is the station reserved exclusively for somebody else? */ - if (st->owner != OWNER_NONE && st->town->exclusive_counter > 0 && st->town->exclusivity != st->owner) continue; + if (!CanMoveGoodsToStation(st, type)) continue; - if (st->goods[type].rating == 0) continue; // Lowest possible rating, better not to give cargo anymore - - if (_settings_game.order.selectgoods && !st->goods[type].HasVehicleEverTriedLoading()) continue; // Selectively servicing stations, and not this one - - if (IsCargoInClass(type, CC_PASSENGERS)) { - if (st->facilities == FACIL_TRUCK_STOP) continue; // passengers are never served by just a truck stop - } else { - if (st->facilities == FACIL_BUS_STOP) continue; // non-passengers are never served by just a bus stop + /* Avoid allocating a vector if there is only one station to significantly + * improve performance in this common case. */ + if (first_station == nullptr) { + first_station = st; + continue; } - - /* This station can be used, add it to st1/st2 */ - if (st1 == nullptr || st->goods[type].rating >= best_rating1) { - st2 = st1; best_rating2 = best_rating1; st1 = st; best_rating1 = st->goods[type].rating; - } else if (st2 == nullptr || st->goods[type].rating >= best_rating2) { - st2 = st; best_rating2 = st->goods[type].rating; + if (used_stations.empty()) { + used_stations.reserve(2); + used_stations.emplace_back(std::make_pair(first_station, 0)); } + used_stations.emplace_back(std::make_pair(st, 0)); } /* no stations around at all? */ - if (st1 == nullptr) return 0; + if (first_station == nullptr) return 0; - /* From now we'll calculate with fractal cargo amounts. - * First determine how much cargo we really have. */ - amount *= best_rating1 + 1; - - if (st2 == nullptr) { + if (used_stations.empty()) { /* only one station around */ - return UpdateStationWaiting(st1, type, amount, source_type, source_id); + amount *= first_station->goods[type].rating + 1; + return UpdateStationWaiting(first_station, type, amount, source_type, source_id); } - /* several stations around, the best two (highest rating) are in st1 and st2 */ - assert(st1 != nullptr); - assert(st2 != nullptr); - assert(best_rating1 != 0 || best_rating2 != 0); + uint company_best[OWNER_NONE + 1] = {}; // best rating for each company, including OWNER_NONE + uint company_sum[OWNER_NONE + 1] = {}; // sum of ratings for each company + uint best_rating = 0; + uint best_sum = 0; // sum of best ratings for each company - /* Then determine the amount the worst station gets. We do it this way as the - * best should get a bonus, which in this case is the rounding difference from - * this calculation. In reality that will mean the bonus will be pretty low. - * Nevertheless, the best station should always get the most cargo regardless - * of rounding issues. */ - uint worst_cargo = amount * best_rating2 / (best_rating1 + best_rating2); - assert(worst_cargo <= (amount - worst_cargo)); + for (auto &p : used_stations) { + auto owner = p.first->owner; + auto rating = p.first->goods[type].rating; + if (rating > company_best[owner]) { + best_sum += rating - company_best[owner]; // it's usually faster than iterating companies later + company_best[owner] = rating; + if (rating > best_rating) best_rating = rating; + } + company_sum[owner] += rating; + } - /* And then send the cargo to the stations! */ - uint moved = UpdateStationWaiting(st1, type, amount - worst_cargo, source_type, source_id); - /* These two UpdateStationWaiting's can't be in the statement as then the order - * of execution would be undefined and that could cause desyncs with callbacks. */ - return moved + UpdateStationWaiting(st2, type, worst_cargo, source_type, source_id); + /* From now we'll calculate with fractional cargo amounts. + * First determine how much cargo we really have. */ + amount *= best_rating + 1; + + uint moving = 0; + for (auto &p : used_stations) { + uint owner = p.first->owner; + /* Multiply the amount by (company best / sum of best for each company) to get cargo allocated to a company + * and by (station rating / sum of ratings in a company) to get the result for a single station. */ + p.second = amount * company_best[owner] * p.first->goods[type].rating / best_sum / company_sum[owner]; + moving += p.second; + } + + /* If there is some cargo left due to rounding issues distribute it among the best rated stations. */ + if (amount > moving) { + std::sort(used_stations.begin(), used_stations.end(), [type] (const StationInfo &a, const StationInfo &b) { + return b.first->goods[type].rating < a.first->goods[type].rating; + }); + + assert(amount - moving <= used_stations.size()); + for (uint i = 0; i < amount - moving; i++) { + used_stations[i].second++; + } + } + + uint moved = 0; + for (auto &p : used_stations) { + moved += UpdateStationWaiting(p.first, type, p.second, source_type, source_id); + } + + return moved; } void UpdateStationDockingTiles(Station *st) diff --git a/src/station_func.h b/src/station_func.h index e7a32b8a5b..f9959089ee 100644 --- a/src/station_func.h +++ b/src/station_func.h @@ -26,6 +26,7 @@ void FindStationsAroundTiles(const TileArea &location, StationList *stations, bo void ShowStationViewWindow(StationID station); void UpdateAllStationVirtCoords(); +void ClearAllStationCachedNames(); CargoArray GetProductionAroundTiles(TileIndex tile, int w, int h, int rad); CargoArray GetAcceptanceAroundTiles(TileIndex tile, int w, int h, int rad, CargoTypes *always_accepted = nullptr); diff --git a/src/station_gui.cpp b/src/station_gui.cpp index a4804528cd..764d34748c 100644 --- a/src/station_gui.cpp +++ b/src/station_gui.cpp @@ -207,7 +207,6 @@ protected: static bool include_empty; // whether we should include stations without waiting cargo 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 */ static const StringID sorter_names[]; @@ -259,19 +258,7 @@ protected: /** Sort stations by their name */ static bool StationNameSorter(const Station * const &a, const Station * const &b) { - static char buf_cache[64]; - char buf[64]; - - SetDParam(0, a->index); - GetString(buf, STR_STATION_NAME, lastof(buf)); - - if (b != last_station) { - last_station = b; - SetDParam(0, b->index); - GetString(buf_cache, STR_STATION_NAME, lastof(buf_cache)); - } - - int r = strnatcmp(buf, buf_cache); // Sort by name (natural sorting). + int r = strnatcmp(a->GetCachedName(), b->GetCachedName()); // Sort by name (natural sorting). if (r == 0) return a->index < b->index; return r < 0; } @@ -343,9 +330,6 @@ protected: { if (!this->stations.Sort()) return; - /* Reset name sorter sort cache */ - this->last_station = nullptr; - /* Set the modified widget dirty */ this->SetWidgetDirty(WID_STL_LIST); } @@ -703,7 +687,6 @@ byte CompanyStationsWindow::facilities = FACIL_TRAIN | FACIL_TRUCK_STOP | FACIL_ bool CompanyStationsWindow::include_empty = true; const CargoTypes CompanyStationsWindow::cargo_filter_max = ALL_CARGOTYPES; CargoTypes CompanyStationsWindow::cargo_filter = ALL_CARGOTYPES; -const Station *CompanyStationsWindow::last_station = nullptr; /* Available station sorting functions */ GUIStationList::SortFunction * const CompanyStationsWindow::sorter_funcs[] = { @@ -1222,21 +1205,13 @@ bool CargoSorter::SortCount(const CargoDataEntry *cd1, const CargoDataEntry *cd2 bool CargoSorter::SortStation(StationID st1, StationID st2) const { - static char buf1[MAX_LENGTH_STATION_NAME_CHARS]; - static char buf2[MAX_LENGTH_STATION_NAME_CHARS]; - if (!Station::IsValidID(st1)) { return Station::IsValidID(st2) ? this->order == SO_ASCENDING : this->SortId(st1, st2); } else if (!Station::IsValidID(st2)) { return order == SO_DESCENDING; } - SetDParam(0, st1); - GetString(buf1, STR_STATION_NAME, lastof(buf1)); - SetDParam(0, st2); - GetString(buf2, STR_STATION_NAME, lastof(buf2)); - - int res = strnatcmp(buf1, buf2); // Sort by name (natural sorting). + int res = strnatcmp(Station::Get(st1)->GetCachedName(), Station::Get(st2)->GetCachedName()); // Sort by name (natural sorting). if (res == 0) { return this->SortId(st1, st2); } else { diff --git a/src/table/company_settings.ini b/src/table/company_settings.ini index e853810a17..86035b9d77 100644 --- a/src/table/company_settings.ini +++ b/src/table/company_settings.ini @@ -41,6 +41,7 @@ var = engine_renew def = false str = STR_CONFIG_SETTING_AUTORENEW_VEHICLE strhelp = STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT +cat = SC_BASIC [SDT_VAR] base = CompanySettings diff --git a/src/table/newgrf_debug_data.h b/src/table/newgrf_debug_data.h index c5ed48df47..d14415051c 100644 --- a/src/table/newgrf_debug_data.h +++ b/src/table/newgrf_debug_data.h @@ -127,6 +127,7 @@ static const NIVariable _niv_stations[] = { NIV(0x67, "land info of nearby tiles"), NIV(0x68, "station info of nearby tiles"), NIV(0x69, "information about cargo accepted in the past"), + NIV(0x6A, "GRFID of nearby station tiles"), NIV_END() }; diff --git a/src/table/settings.ini b/src/table/settings.ini index 4c3d6ce0d4..43bd3aec32 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -47,6 +47,8 @@ static bool UpdateServerPassword(int32 p1); static bool UpdateRconPassword(int32 p1); static bool UpdateClientConfigValues(int32 p1); +extern int32 _old_ending_year_slv_105; + /* End - Callback Functions for the various settings */ /* Some settings do not need to be synchronised when playing in multiplayer. @@ -1402,9 +1404,30 @@ str = STR_CONFIG_SETTING_STARTING_YEAR strval = STR_JUST_INT cat = SC_BASIC -[SDT_NULL] -length = 4 +[SDTG_VAR] +name = ""old_ending_year_slv_105"" +var = _old_ending_year_slv_105 +flags = SLF_NOT_IN_CONFIG +type = SLE_INT32 to = SLV_105 +def = DEF_END_YEAR +min = MIN_YEAR +max = MAX_YEAR + +[SDT_VAR] +base = GameSettings +var = game_creation.ending_year +type = SLE_INT32 +from = SLV_ENDING_YEAR +guiflags = SGF_0ISDISABLED +def = DEF_END_YEAR +min = MIN_YEAR +max = MAX_YEAR +interval = 1 +str = STR_CONFIG_SETTING_ENDING_YEAR +strhelp = STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT +strval = STR_CONFIG_SETTING_ENDING_YEAR_VALUE +cat = SC_ADVANCED [SDT_BOOL] base = GameSettings @@ -3217,6 +3240,15 @@ strhelp = STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT strval = STR_JUST_COMMA proc = RedrawScreen +[SDTC_BOOL] +var = gui.show_newgrf_name +flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +def = false +str = STR_CONFIG_SETTING_SHOW_NEWGRF_NAME +strhelp = STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT +proc = RedrawScreen +cat = SC_ADVANCED + ; For the dedicated build we'll enable dates in logs by default. [SDTC_BOOL] ifdef = DEDICATED diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index 9a58ff4374..d2fe466911 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -48,6 +48,7 @@ #include "toolbar_gui.h" #include "framerate_type.h" #include "guitimer_func.h" +#include "screenshot_gui.h" #include "widgets/toolbar_widget.h" @@ -939,6 +940,7 @@ static CallBackFunction ToolbarBuildWaterClick(Window *w) DropDownList list; list.emplace_back(new DropDownListIconItem(SPR_IMG_BUILD_CANAL, PAL_NONE, STR_WATERWAYS_MENU_WATERWAYS_CONSTRUCTION, 0, false)); ShowDropDownList(w, std::move(list), 0, WID_TN_WATER, 140, true, true); + if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP); return CBF_NONE; } @@ -961,6 +963,7 @@ static CallBackFunction ToolbarBuildAirClick(Window *w) DropDownList list; list.emplace_back(new DropDownListIconItem(SPR_IMG_AIRPORT, PAL_NONE, STR_AIRCRAFT_MENU_AIRPORT_CONSTRUCTION, 0, false)); ShowDropDownList(w, std::move(list), 0, WID_TN_AIR, 140, true, true); + if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP); return CBF_NONE; } @@ -985,6 +988,7 @@ static CallBackFunction ToolbarForestClick(Window *w) list.emplace_back(new DropDownListIconItem(SPR_IMG_PLANTTREES, PAL_NONE, STR_LANDSCAPING_MENU_PLANT_TREES, 1, false)); list.emplace_back(new DropDownListIconItem(SPR_IMG_SIGN, PAL_NONE, STR_LANDSCAPING_MENU_PLACE_SIGN, 2, false)); ShowDropDownList(w, std::move(list), 0, WID_TN_LANDSCAPE, 100, true, true); + if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP); return CBF_NONE; } @@ -1063,15 +1067,10 @@ static CallBackFunction PlaceLandBlockInfo() static CallBackFunction ToolbarHelpClick(Window *w) { - PopupMainToolbMenu(w, _game_mode == GM_EDITOR ? (int)WID_TE_HELP : (int)WID_TN_HELP, STR_ABOUT_MENU_LAND_BLOCK_INFO, _settings_client.gui.newgrf_developer_tools ? 13 : 10); + PopupMainToolbMenu(w, _game_mode == GM_EDITOR ? (int)WID_TE_HELP : (int)WID_TN_HELP, STR_ABOUT_MENU_LAND_BLOCK_INFO, _settings_client.gui.newgrf_developer_tools ? 10 : 7); return CBF_NONE; } -static void MenuClickSmallScreenshot() -{ - MakeScreenshot(SC_VIEWPORT, nullptr); -} - /** * Callback on the confirmation window for huge screenshots. * @param w Window with viewport @@ -1087,7 +1086,7 @@ static void ScreenshotConfirmCallback(Window *w, bool confirmed) * Ask for confirmation if the screenshot will be huge. * @param t Screenshot type: World or viewport screenshot */ -static void MenuClickLargeWorldScreenshot(ScreenshotType t) +static void MenuClickScreenshot(ScreenshotType t) { ViewPort vp; SetupScreenshotViewport(t, &vp); @@ -1161,15 +1160,12 @@ static CallBackFunction MenuClickHelp(int index) case 0: return PlaceLandBlockInfo(); case 2: IConsoleSwitch(); break; case 3: ShowAIDebugWindow(); break; - case 4: MenuClickSmallScreenshot(); break; - case 5: MenuClickLargeWorldScreenshot(SC_ZOOMEDIN); break; - case 6: MenuClickLargeWorldScreenshot(SC_DEFAULTZOOM); break; - case 7: MenuClickLargeWorldScreenshot(SC_WORLD); break; - case 8: ShowFramerateWindow(); break; - case 9: ShowAboutWindow(); break; - case 10: ShowSpriteAlignerWindow(); break; - case 11: ToggleBoundingBoxes(); break; - case 12: ToggleDirtyBlocks(); break; + case 4: ShowScreenshotWindow(); break; + case 5: ShowFramerateWindow(); break; + case 6: ShowAboutWindow(); break; + case 7: ShowSpriteAlignerWindow(); break; + case 8: ToggleBoundingBoxes(); break; + case 9: ToggleDirtyBlocks(); break; } return CBF_NONE; } @@ -2121,10 +2117,10 @@ struct MainToolbarWindow : Window { case MTHK_BUILD_TREES: ShowBuildTreesToolbar(); break; case MTHK_MUSIC: ShowMusicWindow(); break; case MTHK_AI_DEBUG: ShowAIDebugWindow(); break; - case MTHK_SMALL_SCREENSHOT: MenuClickSmallScreenshot(); break; - case MTHK_ZOOMEDIN_SCREENSHOT: MenuClickLargeWorldScreenshot(SC_ZOOMEDIN); break; - case MTHK_DEFAULTZOOM_SCREENSHOT: MenuClickLargeWorldScreenshot(SC_DEFAULTZOOM); break; - case MTHK_GIANT_SCREENSHOT: MenuClickLargeWorldScreenshot(SC_WORLD); break; + case MTHK_SMALL_SCREENSHOT: MenuClickScreenshot(SC_VIEWPORT); break; + case MTHK_ZOOMEDIN_SCREENSHOT: MenuClickScreenshot(SC_ZOOMEDIN); break; + case MTHK_DEFAULTZOOM_SCREENSHOT: MenuClickScreenshot(SC_DEFAULTZOOM); break; + case MTHK_GIANT_SCREENSHOT: MenuClickScreenshot(SC_WORLD); break; case MTHK_CHEATS: if (!_networking) ShowCheatWindow(); break; case MTHK_TERRAFORM: ShowTerraformToolbar(); break; case MTHK_EXTRA_VIEWPORT: ShowExtraViewPortWindowForTileUnderCursor(); break; @@ -2493,10 +2489,10 @@ struct ScenarioEditorToolbarWindow : Window { case MTEHK_SIGN: cbf = ToolbarScenPlaceSign(this); break; case MTEHK_MUSIC: ShowMusicWindow(); break; case MTEHK_LANDINFO: cbf = PlaceLandBlockInfo(); break; - case MTEHK_SMALL_SCREENSHOT: MenuClickSmallScreenshot(); break; - case MTEHK_ZOOMEDIN_SCREENSHOT: MenuClickLargeWorldScreenshot(SC_ZOOMEDIN); break; - case MTEHK_DEFAULTZOOM_SCREENSHOT: MenuClickLargeWorldScreenshot(SC_DEFAULTZOOM); break; - case MTEHK_GIANT_SCREENSHOT: MenuClickLargeWorldScreenshot(SC_WORLD); break; + case MTEHK_SMALL_SCREENSHOT: MenuClickScreenshot(SC_VIEWPORT); break; + case MTEHK_ZOOMEDIN_SCREENSHOT: MenuClickScreenshot(SC_ZOOMEDIN); break; + case MTEHK_DEFAULTZOOM_SCREENSHOT: MenuClickScreenshot(SC_DEFAULTZOOM); break; + case MTEHK_GIANT_SCREENSHOT: MenuClickScreenshot(SC_WORLD); break; case MTEHK_ZOOM_IN: ToolbarZoomInClick(this); break; case MTEHK_ZOOM_OUT: ToolbarZoomOutClick(this); break; case MTEHK_TERRAFORM: ShowEditorTerraformToolbar(); break; diff --git a/src/town.h b/src/town.h index c8903d4ff3..8399fa63f3 100644 --- a/src/town.h +++ b/src/town.h @@ -60,6 +60,7 @@ struct Town : TownPool::PoolItem<&_town_pool> { uint16 townnametype; uint32 townnameparts; char *name; ///< Custom town name. If nullptr, the town was not renamed and uses the generated name. + mutable std::string cached_name; ///< NOSAVE: Cache of the resolved name of the town, if not using a custom town name byte flags; ///< See #TownFlags. @@ -130,6 +131,13 @@ struct Town : TownPool::PoolItem<&_town_pool> { void UpdateVirtCoord(); + inline const char *GetCachedName() const + { + if (this->name != nullptr) return this->name; + if (this->cached_name.empty()) this->FillCachedName(); + return this->cached_name.c_str(); + } + static inline Town *GetByTile(TileIndex tile) { return Town::Get(GetTownIndex(tile)); @@ -137,11 +145,15 @@ struct Town : TownPool::PoolItem<&_town_pool> { static Town *GetRandom(); static void PostDestructor(size_t index); + +private: + void FillCachedName() const; }; uint32 GetWorldPopulation(); void UpdateAllTownVirtCoords(); +void ClearAllTownCachedNames(); void ShowTownViewWindow(TownID town); void ExpandTown(Town *t); @@ -161,7 +173,8 @@ enum TownRatingCheckType { /** Special values for town list window for the data parameter of #InvalidateWindowData. */ enum TownDirectoryInvalidateWindowData { TDIWD_FORCE_REBUILD, - TDIWD_FILTER_CHANGES, ///< The filename filter has changed (via the editbox) + TDIWD_POPULATION_CHANGE, + TDIWD_FORCE_RESORT, }; /** diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 7b1d5c90ff..0a582eee7f 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -153,7 +153,7 @@ Town::~Town() */ void Town::PostDestructor(size_t index) { - InvalidateWindowData(WC_TOWN_DIRECTORY, 0, 0); + InvalidateWindowData(WC_TOWN_DIRECTORY, 0, TDIWD_FORCE_REBUILD); UpdateNearestTownForRoadTiles(false); /* Give objects a new home! */ @@ -199,6 +199,13 @@ void Town::InitializeLayout(TownLayout layout) return Town::Get(index); } +void Town::FillCachedName() const +{ + char buf[MAX_LENGTH_TOWN_NAME_CHARS * MAX_CHAR_LENGTH]; + char *end = GetTownName(buf, this, lastof(buf)); + this->cached_name.assign(buf, end); +} + /** * Get the cost for removing this house * @return the cost (inflation corrected etc) @@ -412,6 +419,13 @@ void UpdateAllTownVirtCoords() } } +void ClearAllTownCachedNames() +{ + for (Town *t : Town::Iterate()) { + t->cached_name.clear(); + } +} + /** * Change the towns population * @param t Town which population has changed @@ -423,7 +437,7 @@ static void ChangePopulation(Town *t, int mod) InvalidateWindowData(WC_TOWN_VIEW, t->index); // Cargo requirements may appear/vanish for small populations if (_settings_client.gui.population_in_label) t->UpdateVirtCoord(); - InvalidateWindowData(WC_TOWN_DIRECTORY, 0, 1); + InvalidateWindowData(WC_TOWN_DIRECTORY, 0, TDIWD_POPULATION_CHANGE); } /** @@ -1777,7 +1791,7 @@ static void DoCreateTown(Town *t, TileIndex tile, uint32 townnameparts, TownSize t->townnameparts = townnameparts; t->UpdateVirtCoord(); - InvalidateWindowData(WC_TOWN_DIRECTORY, 0, 0); + InvalidateWindowData(WC_TOWN_DIRECTORY, 0, TDIWD_FORCE_REBUILD); t->InitializeLayout(layout); @@ -2681,11 +2695,14 @@ CommandCost CmdRenameTown(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 } if (flags & DC_EXEC) { + t->cached_name.clear(); free(t->name); t->name = reset ? nullptr : stredup(text); t->UpdateVirtCoord(); - InvalidateWindowData(WC_TOWN_DIRECTORY, 0, 1); + InvalidateWindowData(WC_TOWN_DIRECTORY, 0, TDIWD_FORCE_RESORT); + ClearAllStationCachedNames(); + ClearAllIndustryCachedNames(); UpdateAllStationVirtCoords(); } return CommandCost(); @@ -2804,6 +2821,35 @@ CommandCost CmdTownGrowthRate(TileIndex tile, DoCommandFlag flags, uint32 p1, ui return CommandCost(); } +/** + * Change the rating of a company in a town + * @param tile Unused. + * @param flags Type of operation. + * @param p1 Bit 0..15 = Town ID to change, bit 16..23 = Company ID to change. + * @param p2 Bit 0..15 = New rating of company (signed int16). + * @param text Unused. + * @return Empty cost or an error. + */ +CommandCost CmdTownRating(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) +{ + if (_current_company != OWNER_DEITY) return CMD_ERROR; + + TownID town_id = (TownID)GB(p1, 0, 16); + Town *t = Town::GetIfValid(town_id); + if (t == nullptr) return CMD_ERROR; + + CompanyID company_id = (CompanyID)GB(p1, 16, 8); + if (!Company::IsValidID(company_id)) return CMD_ERROR; + + int16 new_rating = Clamp((int16)GB(p2, 0, 16), RATING_MINIMUM, RATING_MAXIMUM); + if (flags & DC_EXEC) { + t->ratings[company_id] = new_rating; + InvalidateWindowData(WC_TOWN_AUTHORITY, town_id); + } + + return CommandCost(); +} + /** * Expand a town (scenario editor only). * @param tile Unused. diff --git a/src/town_gui.cpp b/src/town_gui.cpp index 6320803794..bc65322baa 100644 --- a/src/town_gui.cpp +++ b/src/town_gui.cpp @@ -671,7 +671,6 @@ struct TownDirectoryWindow : public Window { private: /* Runtime saved values */ static Listing last_sorting; - static const Town *last_town; /* Constants for sorting towns */ static const StringID sorter_names[]; @@ -690,7 +689,13 @@ private: this->towns.clear(); for (const Town *t : Town::Iterate()) { - this->towns.push_back(t); + if (this->string_filter.IsEmpty()) { + this->towns.push_back(t); + continue; + } + this->string_filter.ResetState(); + this->string_filter.AddLine(t->GetCachedName()); + if (this->string_filter.GetState()) this->towns.push_back(t); } this->towns.shrink_to_fit(); @@ -698,7 +703,6 @@ private: this->vscroll->SetCount((uint)this->towns.size()); // Update scrollbar as well. } /* Always sort the towns. */ - this->last_town = nullptr; this->towns.Sort(); this->SetWidgetDirty(WID_TD_LIST); // Force repaint of the displayed towns. } @@ -706,22 +710,7 @@ private: /** Sort by town name */ static bool TownNameSorter(const Town * const &a, const Town * const &b) { - static char buf_cache[MAX_LENGTH_TOWN_NAME_CHARS * MAX_CHAR_LENGTH]; - char buf[MAX_LENGTH_TOWN_NAME_CHARS * MAX_CHAR_LENGTH]; - - SetDParam(0, a->index); - GetString(buf, STR_TOWN_NAME, lastof(buf)); - - /* If 'b' is the same town as in the last round, use the cached value - * We do this to speed stuff up ('b' is called with the same value a lot of - * times after each other) */ - if (b != last_town) { - last_town = b; - SetDParam(0, b->index); - GetString(buf_cache, STR_TOWN_NAME, lastof(buf_cache)); - } - - return strnatcmp(buf, buf_cache) < 0; // Sort by name (natural sorting). + return strnatcmp(a->GetCachedName(), b->GetCachedName()) < 0; // Sort by name (natural sorting). } /** Sort by population (default descending, as big towns are of the most interest). */ @@ -965,7 +954,7 @@ public: { if (wid == WID_TD_FILTER) { this->string_filter.SetFilterTerm(this->townname_editbox.text.buf); - this->InvalidateData(TDIWD_FILTER_CHANGES); + this->InvalidateData(TDIWD_FORCE_REBUILD); } } @@ -976,38 +965,16 @@ public: */ void OnInvalidateData(int data = 0, bool gui_scope = true) override { - char buf[MAX_LENGTH_TOWN_NAME_CHARS * MAX_CHAR_LENGTH]; - switch (data) { case TDIWD_FORCE_REBUILD: /* This needs to be done in command-scope to enforce rebuilding before resorting invalid data */ this->towns.ForceRebuild(); break; - case TDIWD_FILTER_CHANGES: - if (this->string_filter.IsEmpty()) { - this->towns.ForceRebuild(); - } else { - this->towns.clear(); - - for (const Town *t : Town::Iterate()) { - this->string_filter.ResetState(); - - SetDParam(0, t->index); - GetString(buf, STR_TOWN_NAME, lastof(buf)); - - this->string_filter.AddLine(buf); - if (this->string_filter.GetState()) this->towns.push_back(t); - } - - this->towns.SetListing(this->last_sorting); - this->towns.ForceResort(); - this->towns.Sort(); - this->towns.shrink_to_fit(); - this->towns.RebuildDone(); - this->vscroll->SetCount((int)this->towns.size()); // Update scrollbar as well. - } + case TDIWD_POPULATION_CHANGE: + if (this->towns.SortType() == 1) this->towns.ForceResort(); break; + default: this->towns.ForceResort(); } @@ -1015,7 +982,6 @@ public: }; Listing TownDirectoryWindow::last_sorting = {false, 0}; -const Town *TownDirectoryWindow::last_town = nullptr; /** Names of the sorting functions. */ const StringID TownDirectoryWindow::sorter_names[] = { diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index 00c362e776..9023ea2233 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -551,12 +551,12 @@ CommandCost CmdBuildBridge(TileIndex end_tile, DoCommandFlag flags, uint32 p1, u YapfNotifyTrackLayoutChange(tile_start, track); } - /* for human player that builds the bridge he gets a selection to choose from bridges (DC_QUERY_COST) - * It's unnecessary to execute this command every time for every bridge. So it is done only - * and cost is computed in "bridge_gui.c". For AI, Towns this has to be of course calculated - */ + /* Human players that build bridges get a selection to choose from (DC_QUERY_COST) + * It's unnecessary to execute this command every time for every bridge. + * So it is done only for humans and cost is computed in bridge_gui.cpp. + * For (non-spectated) AI, Towns this has to be of course calculated. */ Company *c = Company::GetIfValid(company); - if (!(flags & DC_QUERY_COST) || (c != nullptr && c->is_ai)) { + if (!(flags & DC_QUERY_COST) || (c != nullptr && c->is_ai && company != _local_company)) { bridge_len += 2; // begin and end tiles/ramps switch (transport_type) { diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 806bf47959..2c57d970de 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -1785,7 +1785,7 @@ bool CanBuildVehicleInfrastructure(VehicleType type, byte subtype) /* We should be able to build infrastructure when we have the actual vehicle type */ for (const Vehicle *v : Vehicle::Iterate()) { - if (type == VEH_ROAD && GetRoadTramType(RoadVehicle::From(v)->roadtype) != (RoadTramType)subtype) continue; + if (v->type == VEH_ROAD && GetRoadTramType(RoadVehicle::From(v)->roadtype) != (RoadTramType)subtype) continue; if (v->owner == _local_company && v->type == type) return true; } diff --git a/src/video/sdl2_v.cpp b/src/video/sdl2_v.cpp index 9ae8c3ca2a..0b3b9b8e30 100644 --- a/src/video/sdl2_v.cpp +++ b/src/video/sdl2_v.cpp @@ -647,7 +647,7 @@ const char *VideoDriver_SDL::Start(const char * const *parm) return SDL_GetError(); } - const char *dname = SDL_GetVideoDriver(0); + const char *dname = SDL_GetCurrentVideoDriver(); DEBUG(driver, 1, "SDL2: using driver '%s'", dname); MarkWholeScreenDirty(); diff --git a/src/viewport.cpp b/src/viewport.cpp index 06f5023795..1c9dca1ef6 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -1728,7 +1728,7 @@ void ViewportDoDraw(const ViewPort *vp, int left, int top, int right, int bottom */ static void ViewportDrawChk(const ViewPort *vp, int left, int top, int right, int bottom) { - if (ScaleByZoom(bottom - top, vp->zoom) * ScaleByZoom(right - left, vp->zoom) > (int)(180000 * ZOOM_LVL_BASE * ZOOM_LVL_BASE)) { + if ((int64)ScaleByZoom(bottom - top, vp->zoom) * (int64)ScaleByZoom(right - left, vp->zoom) > (int64)(180000 * ZOOM_LVL_BASE * ZOOM_LVL_BASE)) { if ((bottom - top) > (right - left)) { int t = (top + bottom) >> 1; ViewportDrawChk(vp, left, top, right, t); diff --git a/src/viewport_func.h b/src/viewport_func.h index 0ac70b270b..c47185323d 100644 --- a/src/viewport_func.h +++ b/src/viewport_func.h @@ -74,6 +74,7 @@ bool ScrollMainWindowToTile(TileIndex tile, bool instant = false); bool ScrollMainWindowTo(int x, int y, int z = -1, bool instant = false); void UpdateAllVirtCoords(); +void ClearAllCachedNames(); extern Point _tile_fract_coords; diff --git a/src/widgets/industry_widget.h b/src/widgets/industry_widget.h index d31de978ef..e9fb2b1148 100644 --- a/src/widgets/industry_widget.h +++ b/src/widgets/industry_widget.h @@ -30,10 +30,12 @@ enum IndustryViewWidgets { /** Widgets of the #IndustryDirectoryWindow class. */ enum IndustryDirectoryWidgets { - WID_ID_DROPDOWN_ORDER, ///< Dropdown for the order of the sort. - WID_ID_DROPDOWN_CRITERIA, ///< Dropdown for the criteria of the sort. - WID_ID_INDUSTRY_LIST, ///< Industry list. - WID_ID_SCROLLBAR, ///< Scrollbar of the list. + WID_ID_DROPDOWN_ORDER, ///< Dropdown for the order of the sort. + WID_ID_DROPDOWN_CRITERIA, ///< Dropdown for the criteria of the sort. + WID_ID_FILTER_BY_ACC_CARGO, ///< Accepted cargo filter dropdown list. + WID_ID_FILTER_BY_PROD_CARGO, ///< Produced cargo filter dropdown list. + WID_ID_INDUSTRY_LIST, ///< Industry list. + WID_ID_SCROLLBAR, ///< Scrollbar of the list. }; /** Widgets of the #IndustryCargoesWindow class */ diff --git a/src/widgets/screenshot_widget.h b/src/widgets/screenshot_widget.h new file mode 100644 index 0000000000..6f42b784d6 --- /dev/null +++ b/src/widgets/screenshot_widget.h @@ -0,0 +1,26 @@ +/* + * 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 screenshot_widget.h Types related to the screenshot widgets. */ + +#ifndef WIDGETS_SCREENSHOT_WIDGET_H +#define WIDGETS_SCREENSHOT_WIDGET_H + +/** Widgets of the #ScreenshotWindow class. */ + +enum ScreenshotWindowWidgets { + WID_SC_TAKE, ///< Button for taking a normal screenshot + WID_SC_TAKE_ZOOMIN, ///< Button for taking a zoomed in screenshot + WID_SC_TAKE_DEFAULTZOOM, ///< Button for taking a screenshot at normal zoom + WID_SC_TAKE_WORLD, ///< Button for taking a screenshot of the whole world + WID_SC_TAKE_HEIGHTMAP, ///< Button for taking a heightmap "screenshot" + WID_SC_TAKE_MINIMAP, ///< Button for taking a minimap screenshot +}; + + +#endif /* WIDGETS_SCREENSHOT_WIDGET_H */ + diff --git a/src/window.cpp b/src/window.cpp index 93777d28f6..30fa4d3d12 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -389,7 +389,7 @@ QueryString *Window::GetQueryString(uint widnum) */ /* virtual */ Point Window::GetCaretPosition() const { - if (this->nested_focus != nullptr && this->nested_focus->type == WWT_EDITBOX) { + if (this->nested_focus != nullptr && this->nested_focus->type == WWT_EDITBOX && !this->querystrings.empty()) { return this->GetQueryString(this->nested_focus->index)->GetCaretPosition(this, this->nested_focus->index); } @@ -1094,6 +1094,9 @@ Window::~Window() /* We can't scroll the window when it's closed. */ if (_last_scroll_window == this) _last_scroll_window = nullptr; + /* Make sure we don't try to access non-existing query strings. */ + this->querystrings.clear(); + /* Make sure we don't try to access this window as the focused window when it doesn't exist anymore. */ if (_focused_window == this) { this->OnFocusLost(); diff --git a/src/window_type.h b/src/window_type.h index 15b022b562..f99b5cb6d7 100644 --- a/src/window_type.h +++ b/src/window_type.h @@ -691,6 +691,12 @@ enum WindowClass { */ WC_FRAMETIME_GRAPH, + /** + * Screenshot window; %Window numbers: + * - 0 = #ScreenshotWidgets + */ + WC_SCREENSHOT, + WC_INVALID = 0xFFFF, ///< Invalid window. };