From b76e2c3fd5ab1aff83f7907b29860978973e5d33 Mon Sep 17 00:00:00 2001 From: Pavel Stupnikov Date: Sun, 4 Dec 2022 23:57:51 +0400 Subject: [PATCH 1/2] Fix train_sprites.h --- src/citymania/cm_export.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/citymania/cm_export.cpp b/src/citymania/cm_export.cpp index d833d8d788..090ba6bb30 100644 --- a/src/citymania/cm_export.cpp +++ b/src/citymania/cm_export.cpp @@ -11,7 +11,7 @@ #include "../strings_type.h" #include "../table/palettes.h" #include "../table/sprites.h" -#include "../table/train_cmd.h" +#include "../table/train_sprites.h" #include #include From 59c991fa52bb73141f4078ae46063ec3f5cbeb13 Mon Sep 17 00:00:00 2001 From: Pavel Stupnikov Date: Tue, 3 Jan 2023 15:58:14 +0400 Subject: [PATCH 2/2] Update to 13.0-RC1 --- .changelog | 76 +++ .github/workflows/ci-build.yml | 6 +- .github/workflows/preview_build.yml | 4 +- .github/workflows/release.yml | 2 +- .ottdrev | 2 +- .release_date | 2 +- .version | 2 +- CMakeLists.txt | 2 +- CREDITS.md | 1 + changelog.txt | 76 +++ cmake/CompileFlags.cmake | 6 +- media/baseset/openttd.grf | Bin 508716 -> 509868 bytes media/baseset/openttd/oneway.nfo | 28 +- media/baseset/openttd/oneway.png | Bin 1222 -> 7846 bytes media/baseset/opntitle.dat | Bin 138710 -> 251952 bytes media/baseset/orig_extra.grf | Bin 328676 -> 329463 bytes media/baseset/orig_extra/fix_gui_icons.nfo | 12 + media/baseset/orig_extra/fix_gui_icons.png | Bin 0 -> 1493 bytes media/baseset/orig_extra/orig_extra.nfo | 1 + os/emscripten/Dockerfile | 2 +- os/emscripten/README.md | 30 +- os/emscripten/emsdk-liblzma.patch | 62 +- os/macosx/Info.plist.in | 2 +- regression/regression/main.nut | 21 + regression/regression/result.txt | 8 + src/3rdparty/squirrel/squirrel/sqstate.cpp | 2 +- src/CMakeLists.txt | 6 + src/ai/ai.hpp | 5 - src/ai/ai_core.cpp | 17 +- src/ai/ai_gui.cpp | 221 +++---- src/ai/ai_gui.hpp | 2 + src/ai/ai_instance.cpp | 3 + src/ai/ai_scanner.cpp | 6 + src/aircraft_cmd.cpp | 6 +- src/aircraft_gui.cpp | 45 +- src/airport_gui.cpp | 34 +- src/autoreplace_gui.cpp | 98 ++- src/base_station_base.h | 3 +- src/bitmap_type.h | 4 +- src/blitter/40bpp_anim.cpp | 2 - src/blitter/40bpp_anim.hpp | 2 - src/bootstrap_gui.cpp | 19 +- src/bridge_gui.cpp | 14 +- src/build_vehicle_gui.cpp | 311 ++++++---- src/cargotype.cpp | 6 + src/cargotype.h | 7 + src/cheat_gui.cpp | 66 +- src/command.cpp | 1 + src/command_type.h | 7 + src/company_cmd.cpp | 13 +- src/company_gui.cpp | 218 ++++--- src/console_cmds.cpp | 79 +++ src/console_gui.cpp | 15 +- src/core/geometry_func.cpp | 2 + src/core/geometry_type.hpp | 170 ++++++ src/depot_gui.cpp | 176 ++++-- src/dock_gui.cpp | 61 +- src/economy.cpp | 16 +- src/elrail.cpp | 5 +- src/engine.cpp | 91 ++- src/engine_base.h | 12 + src/engine_func.h | 3 +- src/engine_gui.cpp | 14 +- src/engine_gui.h | 17 +- src/engine_type.h | 13 +- src/error_gui.cpp | 36 +- src/fileio.cpp | 20 +- src/fios_gui.cpp | 237 +++---- src/fontcache.cpp | 55 +- src/fontcache.h | 21 +- src/fontcache/freetypefontcache.cpp | 32 +- src/fontcache/spritefontcache.cpp | 8 +- src/framerate_gui.cpp | 62 +- src/game/CMakeLists.txt | 2 + src/game/game.hpp | 5 - src/game/game_core.cpp | 15 +- src/game/game_gui.cpp | 465 ++++++++++++++ src/game/game_gui.hpp | 15 + src/genworld_gui.cpp | 188 +++--- src/gfx.cpp | 84 ++- src/gfx_func.h | 46 +- src/gfx_layout.cpp | 12 +- src/gfx_type.h | 7 + src/goal_gui.cpp | 36 +- src/graph_gui.cpp | 300 ++------- src/graph_gui.h | 1 - src/group_gui.cpp | 141 +++-- src/highscore_gui.cpp | 16 +- src/industry_cmd.cpp | 16 +- src/industry_gui.cpp | 257 ++++---- src/intro_gui.cpp | 38 +- src/landscape.cpp | 86 ++- src/lang/afrikaans.txt | 106 ++-- src/lang/arabic_egypt.txt | 105 ++-- src/lang/basque.txt | 101 ++- src/lang/belarusian.txt | 106 ++-- src/lang/brazilian_portuguese.txt | 253 ++++---- src/lang/bulgarian.txt | 102 ++-- src/lang/catalan.txt | 215 ++++--- src/lang/chuvash.txt | 72 +-- src/lang/croatian.txt | 107 ++-- src/lang/czech.txt | 110 ++-- src/lang/danish.txt | 109 ++-- src/lang/dutch.txt | 218 ++++--- src/lang/english.txt | 231 ++++--- src/lang/english_AU.txt | 231 ++++--- src/lang/english_US.txt | 231 ++++--- src/lang/esperanto.txt | 97 ++- src/lang/estonian.txt | 109 ++-- src/lang/faroese.txt | 97 ++- src/lang/finnish.txt | 319 +++++----- src/lang/french.txt | 210 ++++--- src/lang/frisian.txt | 107 ++-- src/lang/gaelic.txt | 102 ++-- src/lang/galician.txt | 110 ++-- src/lang/german.txt | 142 ++--- src/lang/greek.txt | 109 ++-- src/lang/hebrew.txt | 102 ++-- src/lang/hindi.txt | 37 +- src/lang/hungarian.txt | 156 +++-- src/lang/icelandic.txt | 97 ++- src/lang/ido.txt | 26 +- src/lang/indonesian.txt | 110 ++-- src/lang/irish.txt | 109 ++-- src/lang/italian.txt | 246 +++++--- src/lang/japanese.txt | 109 ++-- src/lang/korean.txt | 321 +++++----- src/lang/latin.txt | 107 ++-- src/lang/latvian.txt | 131 ++-- src/lang/lithuanian.txt | 109 ++-- src/lang/luxembourgish.txt | 109 ++-- src/lang/macedonian.txt | 30 +- src/lang/malay.txt | 102 ++-- src/lang/maltese.txt | 26 +- src/lang/marathi.txt | 59 +- src/lang/norwegian_bokmal.txt | 110 ++-- src/lang/norwegian_nynorsk.txt | 102 ++-- src/lang/persian.txt | 98 ++- src/lang/polish.txt | 241 ++++---- src/lang/portuguese.txt | 375 +++++++----- src/lang/romanian.txt | 245 +++++--- src/lang/russian.txt | 233 ++++--- src/lang/serbian.txt | 109 ++-- src/lang/simplified_chinese.txt | 158 +++-- src/lang/slovak.txt | 318 ++++++---- src/lang/slovenian.txt | 103 ++-- src/lang/spanish.txt | 407 ++++++------ src/lang/spanish_MX.txt | 366 ++++++----- src/lang/swedish.txt | 110 ++-- src/lang/tamil.txt | 110 ++-- src/lang/thai.txt | 103 ++-- src/lang/traditional_chinese.txt | 110 ++-- src/lang/turkish.txt | 224 ++++--- src/lang/ukrainian.txt | 109 ++-- src/lang/urdu.txt | 91 +-- src/lang/vietnamese.txt | 213 ++++--- src/lang/welsh.txt | 102 ++-- src/league_base.h | 68 +++ src/league_cmd.cpp | 176 ++++++ src/league_cmd.h | 29 + src/league_gui.cpp | 452 ++++++++++++++ src/league_gui.h | 19 + src/league_type.h | 40 ++ src/linkgraph/linkgraph_gui.cpp | 43 +- src/map_type.h | 8 +- src/misc/lrucache.hpp | 2 - src/misc_gui.cpp | 133 ++-- src/mixer.cpp | 61 +- src/mixer.h | 2 + src/music_gui.cpp | 45 +- src/network/network_chat_gui.cpp | 9 +- src/network/network_command.cpp | 3 +- src/network/network_content_gui.cpp | 163 ++--- src/network/network_content_gui.h | 1 + src/network/network_gui.cpp | 352 ++++++----- src/newgrf.cpp | 248 ++++---- src/newgrf.h | 5 +- src/newgrf_debug_gui.cpp | 91 ++- src/newgrf_engine.cpp | 2 + src/newgrf_gui.cpp | 284 ++++----- src/newgrf_sound.cpp | 5 +- src/newgrf_sound.h | 2 +- src/newgrf_spritegroup.h | 2 +- src/newgrf_station.cpp | 36 +- src/news_gui.cpp | 46 +- src/object_cmd.cpp | 2 +- src/object_cmd.h | 2 +- src/object_gui.cpp | 55 +- src/openttd.cpp | 10 +- src/order_gui.cpp | 62 +- src/os/macosx/font_osx.cpp | 35 +- src/os/macosx/string_osx.cpp | 3 +- src/os/windows/font_win32.cpp | 40 +- src/os/windows/font_win32.h | 2 +- src/os/windows/string_uniscribe.cpp | 3 +- src/pbs.cpp | 3 +- src/rail_cmd.cpp | 3 + src/rail_gui.cpp | 96 +-- src/rev.cpp.in | 6 +- src/road.h | 3 +- src/road_cmd.cpp | 90 ++- src/road_func.h | 5 +- src/road_gui.cpp | 111 ++-- src/roadveh.h | 42 +- src/roadveh_cmd.cpp | 23 +- src/roadveh_cmd.h | 2 + src/roadveh_gui.cpp | 56 +- src/saveload/CMakeLists.txt | 1 + src/saveload/afterload.cpp | 83 ++- src/saveload/ai_sl.cpp | 9 +- src/saveload/game_sl.cpp | 7 +- src/saveload/league_sl.cpp | 91 +++ src/saveload/oldloader_sl.cpp | 3 +- src/saveload/saveload.cpp | 14 +- src/saveload/saveload.h | 1 + src/saveload/station_sl.cpp | 27 +- src/screenshot.cpp | 10 +- src/script/api/CMakeLists.txt | 2 + src/script/api/game_changelog.hpp | 1 + src/script/api/script_cargo.cpp | 2 +- src/script/api/script_league.cpp | 122 ++++ src/script/api/script_league.hpp | 134 ++++ src/script/api/script_object.cpp | 2 +- src/script/api/script_object.hpp | 3 + src/script/api/script_tilelist.cpp | 2 +- src/script/api/script_town.cpp | 2 +- src/script/script_config.cpp | 14 + src/script/script_config.hpp | 20 +- src/script/script_instance.cpp | 130 ++-- src/script/script_instance.hpp | 42 +- src/settings.cpp | 6 +- src/settings_gui.cpp | 302 +++++---- src/settings_type.h | 5 +- src/ship.h | 2 +- src/ship_cmd.cpp | 18 +- src/ship_gui.cpp | 35 +- src/signs_gui.cpp | 28 +- src/slope_type.h | 2 +- src/smallmap_gui.cpp | 50 +- src/smallmap_gui.h | 4 +- src/sound.cpp | 3 +- src/sound/allegro_s.h | 2 +- src/sound/cocoa_s.h | 2 +- src/sound/sdl_s.h | 2 +- src/sound/win32_s.h | 2 +- src/sound/xaudio2_s.h | 2 +- src/sprite.cpp | 2 +- src/spritecache.cpp | 16 +- src/station.cpp | 8 +- src/station_cmd.cpp | 13 +- src/station_gui.cpp | 108 ++-- src/statusbar_gui.cpp | 24 +- src/story_gui.cpp | 30 +- src/string.cpp | 11 +- src/string_type.h | 1 + src/strings.cpp | 28 +- src/strings_func.h | 1 + src/subsidy_gui.cpp | 24 +- src/table/control_codes.h | 1 + src/table/elrail_data.h | 16 +- src/table/engines.h | 12 +- src/table/opengl_shader.h | 2 - src/table/road_land.h | 40 ++ src/table/settings/economy_settings.ini | 8 +- src/table/settings/game_settings.ini | 2 +- src/table/settings/gui_settings.ini | 17 + src/table/settings/misc_settings.ini | 21 +- src/table/settings/world_settings.ini | 2 +- src/table/sprites.h | 18 +- src/table/strgen_tables.h | 1 + src/textfile_gui.cpp | 20 +- src/textfile_gui.h | 3 - src/timetable_cmd.cpp | 33 + src/timetable_cmd.h | 10 +- src/timetable_gui.cpp | 80 ++- src/toolbar_gui.cpp | 171 ++++-- src/town.h | 24 +- src/town_cmd.cpp | 14 +- src/town_gui.cpp | 282 +++++---- src/train.h | 43 +- src/train_cmd.cpp | 188 ++++-- src/train_gui.cpp | 93 ++- src/transparency_gui.cpp | 10 +- src/tree_gui.cpp | 10 +- src/tunnelbridge_cmd.cpp | 22 +- src/vehicle.cpp | 62 ++ src/vehicle_base.h | 15 +- src/vehicle_cmd.cpp | 2 +- src/vehicle_func.h | 3 + src/vehicle_gui.cpp | 553 ++++++++++++----- src/vehicle_gui.h | 14 +- src/vehicle_gui_base.h | 33 +- src/video/cocoa/cocoa_wnd.mm | 2 +- src/video/opengl.cpp | 2 - src/video/opengl.h | 2 - src/video/video_driver.hpp | 8 +- src/video/win32_v.cpp | 2 +- src/viewport.cpp | 44 +- src/viewport_func.h | 2 +- src/viewport_type.h | 8 - src/water_cmd.cpp | 6 - src/widget.cpp | 679 +++++++++++++-------- src/widget_type.h | 52 +- src/widgets/CMakeLists.txt | 2 + src/widgets/ai_widget.h | 1 - src/widgets/dropdown.cpp | 63 +- src/widgets/dropdown_type.h | 6 +- src/widgets/game_widget.h | 28 + src/widgets/genworld_widget.h | 4 + src/widgets/graph_widget.h | 5 - src/widgets/group_widget.h | 1 + src/widgets/intro_widget.h | 1 + src/widgets/league_widget.h | 24 + src/widgets/network_content_widget.h | 5 +- src/widgets/network_widget.h | 5 +- src/widgets/newgrf_debug_widget.h | 2 + src/widgets/settings_widget.h | 6 +- src/widgets/slider.cpp | 69 ++- src/widgets/slider_func.h | 12 +- src/widgets/town_widget.h | 1 + src/widgets/vehicle_widget.h | 3 + src/window.cpp | 54 +- src/window_gui.h | 165 ++--- src/window_type.h | 2 + src/zoom_func.h | 32 +- src/zoom_type.h | 11 +- 326 files changed, 12923 insertions(+), 8705 deletions(-) create mode 100644 media/baseset/orig_extra/fix_gui_icons.nfo create mode 100644 media/baseset/orig_extra/fix_gui_icons.png create mode 100644 src/game/game_gui.cpp create mode 100644 src/game/game_gui.hpp create mode 100644 src/league_base.h create mode 100644 src/league_cmd.cpp create mode 100644 src/league_cmd.h create mode 100644 src/league_gui.cpp create mode 100644 src/league_gui.h create mode 100644 src/league_type.h create mode 100644 src/saveload/league_sl.cpp create mode 100644 src/script/api/script_league.cpp create mode 100644 src/script/api/script_league.hpp create mode 100644 src/widgets/game_widget.h create mode 100644 src/widgets/league_widget.h diff --git a/.changelog b/.changelog index 2e6467bc61..436afd8bb5 100644 --- a/.changelog +++ b/.changelog @@ -1,3 +1,79 @@ +13.0-RC1 (2023-01-01) +------------------------------------------------------------------------ +Feature: 'font' console command to configure fonts within game (#10278) +Feature: Ctrl-click to bulk edit timetable speeds/waiting times (#10265) +Feature: [NewGRF] Vehicle variants in expandable purchase list (#10220) +Feature: Expand all towns in the scenario editor (#10215) +Add: [NewGRF] Slope-aware and roadtype-specific one-way sprites (#10282) +Change: Display text files in black (#10291) +Change: Make vehicle list dropdown buttons resize to fit strings (#10286) +Change: [NewGRF] Support flipping shorter engines without explicit support (#10262) +Change: Separate ground sprite from foundation sprite offsets (#10256) +Change: Vertically centre sprite font relative to TrueType font (#10254) +Change: [macOS] Set minimum macOS version to 10.13 (#10253) +Change: Use lowered not disabled widget for current vehicle details tab (#10252) +Change: Various improvements to NewGRF sprite aligner (#10249) +Change: reset_engines console command now rerandomises introduction dates and reliability (#10220) +Change: Show error message on failed industry prospecting (#10202) +Fix: Local authority window rating list height ignored icon sizes (#10285) +Fix #10150: Town signs could be truncated when using custom fonts (#10283) +Fix #8971: Resize QueryStrings with interface scale change (#10281) +Fix #10274: Crash when rescanning scripts with GS selected (#10276) +Fix #10151: Use smaller padding for signs (#10272) +Fix #10263: [Script] Restore tile validation for commands (#10269) +Fix: Missing scrollbar for rail/roadtype dropdowns (#10264) +Fix #10260: Incorrect rect height drawing image in vehicle details (#10261) +Fix #10257: Incorrect catenary position on sloped bridge heads (#10258) +Fix: Vertically centre chat prompt (#10250) +Fix #10214: League and graph buttons in toolbar did not have a default action (#10246) +Fix #10242: Allow a space for text shadow when clipping text (#10243) +Fix #10206: Fully disable scripts in intro game (#10241) +Fix #10218: Don't try to create river tiles along incorrect slopes (#10235) +Fix #10208: [NewGRF] Allow using a specific underlay for road/tram tunnels (#10233) +Fix #10224: Don't change fast-forward mode while saving (#10230) +Fix #10147: Sound effect volume slider no longer set volume (#10228) +Fix #10223: Crash when vehicle cloning fails on order cloning (#10225) +Fix: Maximum space for engine preview image was never scaled (#10219) +Fix #10216: Crash when upgrading savegame with crashed vehicles (#10217) +Fix #10212: [Script] Nested ScriptAccounting scopes not restored properly (#10213) +Fix #10114: Incorrect drag-highlight position with non-power-of-2 scaling (#10211) +Fix #10198: Rearrange Intro GUI to make button rows narrower (#10203) +Fix: Missing extra padding when drawing tooltip text (#10201) +Fix: Bad alignment of button icons when using the original baseset (#10200) +Fix: Signal icons incorrectly positioned in UI (#10199) +Fix #10021: Object GUI resized when switching between different objects (#10196) +Fix #9720: Delay start of GS/AI to after loading of savegame (#9745) + + +13.0-beta2 (2022-11-27) +------------------------------------------------------------------------ +Feature: Allow AI/GS to be fully modified in scenario editor (#10152) +Feature: Display power-to-weight ratio in ground vehicle details GUI (#10123) +Feature: Variable interface scaling (with chunky bevels!) (#10114) +Feature: Hotkey to honk a vehicle's horn (#10110) +Feature: Split AI/Game Script configuration windows and add them to world gen window (#10058) +Feature: [GS] Scriptable league tables (#10001) +Feature: Multi-track level crossings (#9931) +Feature: Improved local authority action window (#9928) +Feature: Automatic console command screenshot numbering with a filename ending in '#' (#9781) +Feature: Add buttons to toggle music in the Game Options menu (#9727) +Feature: Contextual actions for vehicles grouped by shared orders (#8425) +Feature: Add cargo filter support to vehicle list (#8308) +Feature: Show the cargoes the vehicles can carry in the vehicle list window (#8304) +Change: Allow building canal by area outside editor (#10173) +Change: Minor improvements to the new Finance GUI (#10168) +Change: Let AI developers edit non-editable AI/Game Script Parameters (#8895) +Change: Allow building docks on clearable watered object tiles (#8514) +Fix #8770: Center vehicle status bar icon (#10178) +Fix: Crash if error message window is too wide for screen. (#10172) +Fix #10155: Network games not syncing company settings properly (#10158) +Fix #10154: Network game desync related to setting a random company face (#10157) +Fix #10011: Incorrect infrastructure totals when overbuilding bay road stop (#10143) +Fix #10117: Object burst limit allowed one fewer object than the setting (#10120) +Fix #10023: Allow negative input in text fields when needed (#10112) +Fix #9908: Fix crash which could occur when a company was deleted when a depot window was open (#9912) + + 13.0-beta1 (2022-10-31) ------------------------------------------------------------------------ Feature: Airport construction GUI displays infrastructure cost (#10094) diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index b95f8baaf0..4d83725045 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-20.04 container: # If you change this version, change the number in the cache step too. - image: emscripten/emsdk:2.0.31 + image: emscripten/emsdk:3.1.28 steps: - name: Checkout @@ -26,7 +26,7 @@ jobs: uses: actions/cache@v3 with: path: /emsdk/upstream/emscripten/cache - key: 2.0.31-${{ runner.os }} + key: 3.1.28-${{ runner.os }} - name: Patch Emscripten to support LZMA run: | @@ -162,7 +162,7 @@ jobs: runs-on: macos-latest env: - MACOSX_DEPLOYMENT_TARGET: 10.14 + MACOSX_DEPLOYMENT_TARGET: 10.13 steps: - name: Checkout diff --git a/.github/workflows/preview_build.yml b/.github/workflows/preview_build.yml index d2935cefbc..68ca5f083f 100644 --- a/.github/workflows/preview_build.yml +++ b/.github/workflows/preview_build.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-20.04 container: # If you change this version, change the number in the cache step too. - image: emscripten/emsdk:2.0.31 + image: emscripten/emsdk:3.1.28 steps: - name: Update deployment status to in progress @@ -44,7 +44,7 @@ jobs: uses: actions/cache@v3 with: path: /emsdk/upstream/emscripten/cache - key: 2.0.31-${{ runner.os }} + key: 3.1.28-${{ runner.os }} - name: Patch Emscripten to support LZMA run: | diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7a06e23baf..939649a14c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -469,7 +469,7 @@ jobs: runs-on: macos-11 env: - MACOSX_DEPLOYMENT_TARGET: 10.14 + MACOSX_DEPLOYMENT_TARGET: 10.13 steps: - name: Download source diff --git a/.ottdrev b/.ottdrev index 203d48e351..bbd4eede7e 100644 --- a/.ottdrev +++ b/.ottdrev @@ -1 +1 @@ -13.0-beta1 20221031 0 c4e655b1d4fa83b8f192d2df0062f6dd7f346aad 1 0 2022 +13.0-RC1 20230101 0 4b123394cf5102688d9635d2988a13dbc9018d4d 1 0 2023 diff --git a/.release_date b/.release_date index cf53716dd2..7c94b77584 100644 --- a/.release_date +++ b/.release_date @@ -1 +1 @@ -2022-11-01 19:19 UTC +2023-01-01 18:22 UTC diff --git a/.version b/.version index 61c359a5f0..53cbd03799 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -13.0-beta1 +13.0-RC1 diff --git a/CMakeLists.txt b/CMakeLists.txt index f4e08daf4a..911ebbad40 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,7 +22,7 @@ if (EMSCRIPTEN) endif() set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake") -set(CMAKE_OSX_DEPLOYMENT_TARGET 10.14) +set(CMAKE_OSX_DEPLOYMENT_TARGET 10.13) # Use GNUInstallDirs to allow customisation # but set our own default data and bin dir diff --git a/CREDITS.md b/CREDITS.md index 698ea54ebb..8826c9dcfe 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -10,6 +10,7 @@ - Peter Nelson (peter1138) - Spiritual descendant from newGRF gods (since 0.4.5) - Remko Bijker (Rubidium) - Coder and way more (since 0.4.5) - Patric Stout (TrueBrain) - NoProgrammer (since 0.3), sys op +- Tyler Trahan (2TallTyler) - General coding (since 13) ### Inactive Developers: diff --git a/changelog.txt b/changelog.txt index 12d3ffe756..84689fd2d8 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,79 @@ +13.0-RC1 (2023-01-01) +------------------------------------------------------------------------ +Feature: 'font' console command to configure fonts within game (#10278) +Feature: Ctrl-click to bulk edit timetable speeds/waiting times (#10265) +Feature: [NewGRF] Vehicle variants in expandable purchase list (#10220) +Feature: Expand all towns in the scenario editor (#10215) +Add: [NewGRF] Slope-aware and roadtype-specific one-way sprites (#10282) +Change: Display text files in black (#10291) +Change: Make vehicle list dropdown buttons resize to fit strings (#10286) +Change: [NewGRF] Support flipping shorter engines without explicit support (#10262) +Change: Separate ground sprite from foundation sprite offsets (#10256) +Change: Vertically centre sprite font relative to TrueType font (#10254) +Change: [macOS] Set minimum macOS version to 10.13 (#10253) +Change: Use lowered not disabled widget for current vehicle details tab (#10252) +Change: Various improvements to NewGRF sprite aligner (#10249) +Change: reset_engines console command now rerandomises introduction dates and reliability (#10220) +Change: Show error message on failed industry prospecting (#10202) +Fix: Local authority window rating list height ignored icon sizes (#10285) +Fix #10150: Town signs could be truncated when using custom fonts (#10283) +Fix #8971: Resize QueryStrings with interface scale change (#10281) +Fix #10274: Crash when rescanning scripts with GS selected (#10276) +Fix #10151: Use smaller padding for signs (#10272) +Fix #10263: [Script] Restore tile validation for commands (#10269) +Fix: Missing scrollbar for rail/roadtype dropdowns (#10264) +Fix #10260: Incorrect rect height drawing image in vehicle details (#10261) +Fix #10257: Incorrect catenary position on sloped bridge heads (#10258) +Fix: Vertically centre chat prompt (#10250) +Fix #10214: League and graph buttons in toolbar did not have a default action (#10246) +Fix #10242: Allow a space for text shadow when clipping text (#10243) +Fix #10206: Fully disable scripts in intro game (#10241) +Fix #10218: Don't try to create river tiles along incorrect slopes (#10235) +Fix #10208: [NewGRF] Allow using a specific underlay for road/tram tunnels (#10233) +Fix #10224: Don't change fast-forward mode while saving (#10230) +Fix #10147: Sound effect volume slider no longer set volume (#10228) +Fix #10223: Crash when vehicle cloning fails on order cloning (#10225) +Fix: Maximum space for engine preview image was never scaled (#10219) +Fix #10216: Crash when upgrading savegame with crashed vehicles (#10217) +Fix #10212: [Script] Nested ScriptAccounting scopes not restored properly (#10213) +Fix #10114: Incorrect drag-highlight position with non-power-of-2 scaling (#10211) +Fix #10198: Rearrange Intro GUI to make button rows narrower (#10203) +Fix: Missing extra padding when drawing tooltip text (#10201) +Fix: Bad alignment of button icons when using the original baseset (#10200) +Fix: Signal icons incorrectly positioned in UI (#10199) +Fix #10021: Object GUI resized when switching between different objects (#10196) +Fix #9720: Delay start of GS/AI to after loading of savegame (#9745) + + +13.0-beta2 (2022-11-27) +------------------------------------------------------------------------ +Feature: Allow AI/GS to be fully modified in scenario editor (#10152) +Feature: Display power-to-weight ratio in ground vehicle details GUI (#10123) +Feature: Variable interface scaling (with chunky bevels!) (#10114) +Feature: Hotkey to honk a vehicle's horn (#10110) +Feature: Split AI/Game Script configuration windows and add them to world gen window (#10058) +Feature: [GS] Scriptable league tables (#10001) +Feature: Multi-track level crossings (#9931) +Feature: Improved local authority action window (#9928) +Feature: Automatic console command screenshot numbering with a filename ending in '#' (#9781) +Feature: Add buttons to toggle music in the Game Options menu (#9727) +Feature: Contextual actions for vehicles grouped by shared orders (#8425) +Feature: Add cargo filter support to vehicle list (#8308) +Feature: Show the cargoes the vehicles can carry in the vehicle list window (#8304) +Change: Allow building canal by area outside editor (#10173) +Change: Minor improvements to the new Finance GUI (#10168) +Change: Let AI developers edit non-editable AI/Game Script Parameters (#8895) +Change: Allow building docks on clearable watered object tiles (#8514) +Fix #8770: Center vehicle status bar icon (#10178) +Fix: Crash if error message window is too wide for screen. (#10172) +Fix #10155: Network games not syncing company settings properly (#10158) +Fix #10154: Network game desync related to setting a random company face (#10157) +Fix #10011: Incorrect infrastructure totals when overbuilding bay road stop (#10143) +Fix #10117: Object burst limit allowed one fewer object than the setting (#10120) +Fix #10023: Allow negative input in text fields when needed (#10112) +Fix #9908: Fix crash which could occur when a company was deleted when a depot window was open (#9912) + + 13.0-beta1 (2022-10-31) ------------------------------------------------------------------------ Feature: Airport construction GUI displays infrastructure cost (#10094) diff --git a/cmake/CompileFlags.cmake b/cmake/CompileFlags.cmake index b1cec89daf..27d9a48efa 100644 --- a/cmake/CompileFlags.cmake +++ b/cmake/CompileFlags.cmake @@ -44,8 +44,8 @@ macro(compile_flags) "$<$>:-fstack-protector>" # Prevent undefined references when _FORTIFY_SOURCE > 0 ) if(CMAKE_SIZEOF_VOID_P EQUAL 8) - add_link_options( - "$<$:-Wl,--disable-dynamicbase,--disable-high-entropy-va,--default-image-base-low>" # ASLR somehow breaks linking for x64 Debug builds + add_compile_options( + "$<$:-Wa,-mbig-obj>" # Switch to pe-bigobj-x86-64 as x64 Debug builds push pe-x86-64 to the limits (linking errors with ASLR, ...) ) endif() endif() @@ -56,7 +56,7 @@ macro(compile_flags) if(MSVC) add_compile_options(/W3) - if(MSVC_VERSION GREATER 1929) + if(MSVC_VERSION GREATER 1929 AND CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") # Starting with version 19.30, there is an optimisation bug, see #9966 for details # This flag disables the broken optimisation to work around the bug add_compile_options(/d2ssa-rse-) diff --git a/media/baseset/openttd.grf b/media/baseset/openttd.grf index e3ebf2dd675589b31cdab66116ae5db1d72520bf..9e08fb17c3a801a57391f8f6656f9240f5e3d2f0 100644 GIT binary patch delta 798 zcmZ3}Ccma%o`r?s|ItR4Ru;xq7N%Af=B+F&8x^^PIv5!RBpAN^|32OE9E<$)dx|WU z%%A`NoGzura)|lk|8LXpE3rf}LS-YAS*#epPFGZA5uSeGF(b?LRmv>hoDd^E|NjOu zLb`s%1jch6a}J1iNF2~(yx3uIK%C{`xpU__OkTLWkYK#{Lb{{qh3*5fj;aeH9Tg`e zI$SnLbnH7(*0Gm~fdOLFm;XQhGczzSykNe-_JW7?90+uXJP>EOc=6)J4hfLaCtN!W zZbUzD>2TlS(ouGyv!i4~U&rDddppi49=O`^wBt)BbEiXX{rdmMe@+Gl1_qE7=N@oA;61?cKmuZqIhP(4Ad``(h!);O|iXJ1+qFe=bP#4g5yOr`}YNNhsXm_R#2E;oFREa_<_^}i3_?fj5<7S7 z^o?Z@Pke%eud*I1$kcNk7cWSFLqKMQ`n6lsFGnU delta 106 zcmZ3}FTbWuo`r?s|IS91Ru;xq7N%Af=B+F&8xy;Os3d#MJy G`FsGT+a%%u diff --git a/media/baseset/openttd/oneway.nfo b/media/baseset/openttd/oneway.nfo index 46f3b8f947..56d2e2809a 100644 --- a/media/baseset/openttd/oneway.nfo +++ b/media/baseset/openttd/oneway.nfo @@ -4,10 +4,24 @@ // See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . // -1 * 0 0C "One way road graphics" - -1 * 3 05 09 06 - -1 sprites/oneway.png 8bpp 34 8 24 16 -12 -8 normal - -1 sprites/oneway.png 8bpp 66 8 24 16 -12 -8 normal - -1 sprites/oneway.png 8bpp 98 8 24 16 -12 -8 normal - -1 sprites/oneway.png 8bpp 130 8 24 16 -12 -8 normal - -1 sprites/oneway.png 8bpp 162 8 24 16 -12 -8 normal - -1 sprites/oneway.png 8bpp 194 8 24 16 -12 -8 normal + -1 * 3 05 09 12 + -1 sprites/oneway.png 8bpp 34 8 24 16 -10 -9 normal + -1 sprites/oneway.png 8bpp 66 8 24 16 -13 -7 normal + -1 sprites/oneway.png 8bpp 98 8 24 16 -12 -8 normal + -1 sprites/oneway.png 8bpp 130 8 24 16 -15 -10 normal + -1 sprites/oneway.png 8bpp 162 8 24 16 -12 -9 normal + -1 sprites/oneway.png 8bpp 194 8 24 16 -11 -8 normal + + -1 sprites/oneway.png 8bpp 34 40 24 16 -13 -10 normal + -1 sprites/oneway.png 8bpp 66 40 24 16 -12 -8 normal + -1 sprites/oneway.png 8bpp 98 40 24 16 -12 -9 normal + -1 sprites/oneway.png 8bpp 130 40 24 16 -11 -8 normal + -1 sprites/oneway.png 8bpp 162 40 24 16 -9 -10 normal + -1 sprites/oneway.png 8bpp 194 40 24 16 -10 -9 normal + + -1 sprites/oneway.png 8bpp 34 72 24 16 -8 -11 normal + -1 sprites/oneway.png 8bpp 66 72 24 16 -11 -5 normal + -1 sprites/oneway.png 8bpp 98 72 24 16 -12 -8 normal + -1 sprites/oneway.png 8bpp 130 72 24 16 -12 -5 normal + -1 sprites/oneway.png 8bpp 162 72 24 16 -14 -10 normal + -1 sprites/oneway.png 8bpp 194 72 24 16 -12 -8 normal diff --git a/media/baseset/openttd/oneway.png b/media/baseset/openttd/oneway.png index 15542af8563cdcc8870d2a251d01ae0a8daf9e83..843747677fc0296025e49b4fc7b70c3a789c465f 100644 GIT binary patch literal 7846 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%0DIeEoa6}C!XbFK1 z^!3Zj%k|2Q_413-^$jg8E%gnI^o@*ki&D~bi!1X=5-W7`ij_e|K+JGSElw`VEGWs$ z&r<-InV6JcT4JlD#HFC105!ZKx4_pIZhT%bG!&BabM-3{3-k^34D@qz^^tWHm$;Ud z;MY+cQdy9yACy|0Us{x$>ROhXSE7t;L`pJTe?e(c4%j;>$@-}|sky0nCB^!NdWI-g zx_kNtz;%FvAU!j;0IaJbw*WWx|Zh2DY{AKMuw)wsfI~u zCT2)RdFB#;vA5)Z)!w6a{FKbJN<*d~BnS5hf4? zNQI0YmjXmA$i>Z$%SInu(t%1nh=HI|hn5%`7qqlOL1EMqlEQa1xJHAEq!1uU@o4HA z4K9*GfF#AEsf%jC#f9ijrRJsBDwQkQ+x@s7($X_y z&Vn@?b{si#;f{e0i-QeMfR9K*j7&v^!;~p08#c6@IkUn;hb6*BBqKnlCc|S!OU#Z1 z6<795`EqB20|QG0i$H;ZLWhFM0t=r#AvtFUvy9CRi` zIIPL=IZ_evpeN(cf{s6XR{UX*$YD@vVK7<1;IV@t;fh4X9g7JsB3688IPz!DgFgZe z2@(N08VMC91uX$R3rf};m~-aNnGb)~n3!BKG5KR+@+T$Y&xD#kI~M%8apKRHHy$Dd zF*-d3E-QLcj;!c-aAL!c3p@V5xbVk@fgy&0p@D&60RzJk28IU=41X9H{sb`m$zk}@ z!SH7Z!=D2Tf9^2+`NMFggX75rmOpbC{%kP#b0p=@jTsyg5j-jxA|^F5E`uR z{ABp~i{aOAhTne}{`_V5`;Xz@e}?})5*#@?5)(X3Hspj{npF44hT%^L!=DU>KQ#=0 zrZD_j!|>+_g98J@e+C8v0|o~NhJXNu|Nj{jTnbb?N;G^bbOLG&LK-|$CZx2ixbfvr zLchHDK6&NXH@wmEHBS$*$H ze}K%vD%Q+pe@^UR$Y+xiV&Pur$i}oovMz2n+e+z!4Uw#j4gv{sj6 z7h4(pVwc=!`S9-d_xbB%{U$6{>i;(1t4ZV+`yAVVPU;O)P$MK z9OnQ2yRK~dt9v5r-p*I3Sf_BX`^5`i28ECbmfI7v_ZR!zbYnZj+WBXK_+Le#4sn$a z8XjK)#T3FOJUHBPv0bt8MXb*8yN&`3EQ}mX0xSv~4gw7d42}#<4EZ`8zZ4uSEv~XN z9^+VK$H8F~EAZ9v!@X>QuZ|8N^=aZMPg<9L{(IQ)ZSiz5^?&=ggCjO81- z$Pz8~WJ*BdBn4Y%j;6DmMW;?0drtVL)2(o0hQeBzyB-s==X<}o)@$?k%QEHq_*#KA zF%$F}!*ouiMDlXusq9a(Ugkb z38$0~{Qafy_t;TWKjU5X4=kImuzmRZOW`ZiD*h%_)|K;_c(1XqoO5U;f74Nx&S)3+ zd?tpEO=q_7Mn^lOpE5HN(DQiGzUKx1!~?-BomN~zwNqFt`V?NTFmM%E6ENYx;};i? zzibQug#}WufWm1{qr$6ZhNllgCn~ z`R|N7y5DW0<)2KM@@~1_`)R)vDq2lXsQye``8W5|E4|$0t5Pnt0(%ZgJ(<+>@mu9a zyA!2{j&Ol2*VehT{3`p(*d?p^n_O8}@;^BEOJOP~AX-^wW^$QC$S*14T5iW7Ca6*- zD7%-F;Ru(}W3x9rPx;;Qm6;bdxzwNN{wKiM!Yx!OqVh|FTfpXMm#vRPt%Oj=y`x2U mWLX&D2?G=Y0xUN~{xg&=ykedD<^EjARHnTBlWEd)pqpdT=jR8i9G5+mbbP?d zB6<5@nIl&$i{pcrEI$jCtD9ulxSGy7B+{4WNt`ai88xQ?aqHkZ;pm(~1?3`?4} z*tGTDD~>7d;ZYEGshqfcUkA$tZlxNoMRli`7Kpn1nGx_;Ldc=E>u7Pgg8+kr00Rpn fGSRU7k+kqRUv!+REx9Q=so~SQ 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

VCon;EqY>kcX5J5@2O7yU1OyVcEUUemM* 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 literal 138710 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%0AW(A5mRI`K#>0oLR6rC#<<~7E8cCF)i~K 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 RwY!6F{P^^ragp^+Jpc%4;iCWm diff --git a/media/baseset/orig_extra.grf b/media/baseset/orig_extra.grf index 728a8b2555bb3de7506193ed1124209dafa33ad7..881c4631cec0aeb0ccd4b64bef6b8fcb520be2d4 100644 GIT binary patch delta 791 zcmaFTF7mxsgoTCS|EETlRu;xq7N%Af=2jM#tt_m!m@VZQ{`0tHRwyLqWTxlkrskC> zpL1BOkieY zWPHK=fNg^?*RkU#PM$gq0uMxQ$S^YQ5Pl%S!r0K<@XFyomABFxP#tuHiKj~zRH z{P+uIrV}S0XfU_5iaroIAk28`fz1PUHb%x%XU?2?!OVR2?2HEiFY;L!xwuX~C}BBu z^5p3oA}@rQ8QC}RhZR;Iwfz~~n&OaV*>+L;0aUI=r>1jhuM2gd{k-VkSGdLhga9c&&O7i%8- zK#VcqfiPph3t{fqc-dIlxY*!e^XL~&57gLVWMyOH<6elfnFj~UMhCu#XN-Q~#T0M; zK%L1v=0zw|O!N(PwwM<4IP>5a!c4(2FQQ&Fy^wiOFUK4c9sQz$B|11d_<=7|OUw)R z7dkJ*Kq{;stbL%&82o^ZIXJlGg)C#>gU$z{OfkVP*k1%NMn5=zW7CVO7Y;85+9jLA0)8Dmc9-wmVrr%Nh(S?CR*}A&x>Rp z^I&s{NTw($et=8+Ovl9Ey{v>5B94y5n~OG;!(Nl7Y6NwG;vzS#02g)iD% zLV`&`QYkW0N;y~ZKmfa}q@<)0oALu;M#&osSc8LO%(Gt1V^xxhl8m}h!ORd4^J4ys zjqDPV5=u(BxhEyKV;Hg|n3yD`*p%2_oW7aPl9|bn`6Bs61uI*Olv3^m5tb|liOd(m QEPT;YV0VDhE&~Gt04bvuUH||9 delta 37 pcmey~EApgWgoTCS|Jz2ERu;xq7N%Af=2jM#tt_m!nAsS>008R%319#K diff --git a/media/baseset/orig_extra/fix_gui_icons.nfo b/media/baseset/orig_extra/fix_gui_icons.nfo new file mode 100644 index 0000000000..2fdb8880bd --- /dev/null +++ b/media/baseset/orig_extra/fix_gui_icons.nfo @@ -0,0 +1,12 @@ +// This file is part of OpenTTD. +// OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. +// OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . +// + -1 * 0 0C "Fix alignment of button icons." + +// Fix alignment of button icons. + -1 * 11 0A 03 01 DC 02 01 E2 02 01 E6 02 + -1 sprites/fix_gui_icons.png 8bpp 8 13 20 20 0 0 normal nocrop + -1 sprites/fix_gui_icons.png 8bpp 40 13 20 20 0 0 normal nocrop + -1 sprites/fix_gui_icons.png 8bpp 72 13 20 20 0 0 normal nocrop diff --git a/media/baseset/orig_extra/fix_gui_icons.png b/media/baseset/orig_extra/fix_gui_icons.png new file mode 100644 index 0000000000000000000000000000000000000000..0630179616f43a479145cfe056ec48d1d03257fe GIT binary patch literal 1493 zcmeAS@N?(olHy`uVBq!ia0y~yU`S?QU{K>=W?*1=UU0R7fq|JJz$e6&f#JV^fPjL6 zf`Ng7gM&jrKtM`LN=ZpcOH0d?DN|OgSg~WrjuR(N+_-V$#fukz{`@hq@o@2piAX5O zDQRixnK5Uo`A{-$y0y#P|4Hg~|I0Z&Ma zNX8VIh7~$8CK5U>3N{f20U0(KH9iefVrFc}*>a{vz(hj9L&qY)!>1%7p(CeaNym%> zD|XyDp&-FvA;aLI!4hG@li?sy6Qa|TfXe#+ok-U%oPY{l@U^ zJHz)M3_pG{{QSl6>o>#iKMa5VGW`9=@b5pve;)~s936=X9wr-dLM~0J`(wlKCxqco z2E(5khCfpn{;Xm6bA-Wxf#E*`gMk5qg9AfA0K@oJ{39vH3lIK9w`%2 zT2|cn@+YBTiAzGy|Ns9_hkGw%U|`@Z@Q5sCVBi)8VMc~ob0ioT7}!fZeO=j~@kokE z8s7-s@SK5xDZ|snF~sBe+iCH6j|>Ek20$8TN@dz83+uExQnLw`P`cEtqtpBh%_|o}Btg}~LSYK!MlSAigwb)(blrp7b zOZdLc(?9m_^Unm%?%AK4|JBb(>^WG;%f|G*#Z)1!mbI?mY7(tJZv~_P+Y6cYN;o zHeHGh1!3mhZszlnlG==qIeM&fah(~nUZ_@d-dz5U8HzoOiz3B*H)gE4y3R~l_MDiH z#=>W!mNQ?(*8RWGWT+6QC+Wy4>bg0GVewks7+GVF=(*>Q#Do^RdLDEB&2g;mzsQ@N z-4b$%UxTV8XKhe1Pn$6BX|$&3loc*#D}VpEYkW_j-P>(~G@|l7wO83R095#A*Z<1@BvgwRg|AfvM#)F$@>nT{g@7u`tTs5M8>$a`?DwEmv zU5WN_U-_(P-Wtp2=91^neQpmmY0ij|pQmHDWq*>~V@vfOb^(i1MccjK?Y8-S?6;@Q zdbhpYET0+=H7N8*zTJIf+fIR?)YP^>|9$or_4flG{nf~EDt+*S_w?)z$=STO7d&~f zx+i4k@7LubPHl(3sP`ErpZ>%v;O7~tR#Njf|G!Dk{PdEF*F51}^B5Qy7(8A5T-G@y GGywqboTbA6 literal 0 HcmV?d00001 diff --git a/media/baseset/orig_extra/orig_extra.nfo b/media/baseset/orig_extra/orig_extra.nfo index 903d96a572..e6ecca8a00 100644 --- a/media/baseset/orig_extra/orig_extra.nfo +++ b/media/baseset/orig_extra/orig_extra.nfo @@ -83,3 +83,4 @@ #include "rivers/arctic.nfo" #include "rivers/tropic.nfo" #include "rivers/toyland.nfo" +#include "fix_gui_icons.nfo" diff --git a/os/emscripten/Dockerfile b/os/emscripten/Dockerfile index 5d54b54114..ae3579ec0a 100644 --- a/os/emscripten/Dockerfile +++ b/os/emscripten/Dockerfile @@ -1,4 +1,4 @@ -FROM emscripten/emsdk:2.0.34 +FROM emscripten/emsdk:3.1.28 COPY emsdk-liblzma.patch / RUN cd /emsdk/upstream/emscripten && patch -p1 < /emsdk-liblzma.patch diff --git a/os/emscripten/README.md b/os/emscripten/README.md index c78dc6727b..cf8e3ed692 100644 --- a/os/emscripten/README.md +++ b/os/emscripten/README.md @@ -1,40 +1,38 @@ ## How to build with Emscripten -Building with Emscripten works with emsdk 2.0.31 and above. +Please use docker with the supplied `Dockerfile` to build for emscripten. +It takes care of a few things: +- Use a version of emscripten we know works +- Patch in LibLZMA support (as this is not supported by upstream) -Currently there is no LibLZMA support upstream; for this we suggest to apply -the provided patch in this folder to your emsdk installation. - -For convenience, a Dockerfile is supplied that does this patches for you -against upstream emsdk docker. Best way to use it: - -Build the docker image: +First, build the docker image by navigating in the folder this `README.md` is in, and executing: ``` docker build -t emsdk-lzma . ``` -Build the host tools first: +Next, navigate back to the root folder of this project. + +Now we build the host tools first: ``` mkdir build-host docker run -it --rm -v $(pwd):$(pwd) -u $(id -u):$(id -g) --workdir $(pwd)/build-host emsdk-lzma cmake .. -DOPTION_TOOLS_ONLY=ON - docker run -it --rm -v $(pwd):$(pwd) -u $(id -u):$(id -g) --workdir $(pwd)/build-host emsdk-lzma make -j5 tools + docker run -it --rm -v $(pwd):$(pwd) -u $(id -u):$(id -g) --workdir $(pwd)/build-host emsdk-lzma make -j$(nproc) tools ``` -Next, build the game with emscripten: - +Finally, we build the actual game: ``` mkdir build docker run -it --rm -v $(pwd):$(pwd) -u $(id -u):$(id -g) --workdir $(pwd)/build emsdk-lzma emcmake cmake .. -DHOST_BINARY_DIR=../build-host -DCMAKE_BUILD_TYPE=Release -DOPTION_USE_ASSERTS=OFF - docker run -it --rm -v $(pwd):$(pwd) -u $(id -u):$(id -g) --workdir $(pwd)/build emsdk-lzma emmake make -j5 + docker run -it --rm -v $(pwd):$(pwd) -u $(id -u):$(id -g) --workdir $(pwd)/build emsdk-lzma emmake make -j$(nproc) ``` -And now you have in your build folder files like "openttd.html". +In the `build` folder you will now see `openttd.html`. -To run it locally, you would have to start a local webserver, like: +To run it locally, you would have to start a local webserver; something like: ``` cd build python3 -m http.server ```` -Now you can play the game via http://127.0.0.1:8000/openttd.html . +You can now play the game via http://127.0.0.1:8000/openttd.html . diff --git a/os/emscripten/emsdk-liblzma.patch b/os/emscripten/emsdk-liblzma.patch index aa75fa5a49..fbb24e7ca9 100644 --- a/os/emscripten/emsdk-liblzma.patch +++ b/os/emscripten/emsdk-liblzma.patch @@ -13,7 +13,7 @@ of emsdk. diff --git a/tools/settings.py b/tools/settings.py --- a/tools/settings.py +++ b/tools/settings.py -@@ -38,6 +38,7 @@ +@@ -40,6 +40,7 @@ PORTS_SETTINGS = { 'USE_SDL_NET', 'USE_SDL_GFX', 'USE_LIBJPEG', @@ -24,24 +24,23 @@ diff --git a/tools/settings.py b/tools/settings.py diff --git a/src/settings.js b/src/settings.js --- a/src/settings.js +++ b/src/settings.js -@@ -1382,8 +1382,12 @@ var USE_BZIP2 = 0; - // 1 = use libjpeg from emscripten-ports - // [link] - var USE_LIBJPEG = 0; +@@ -1450,6 +1450,10 @@ var USE_GIFLIB = false; + // [compile+link] + var USE_LIBJPEG = false; +// 1 = use liblzma from emscripten-ports -+// [link] -+var USE_LIBLZMA = 0; ++// [compile+link] ++var USE_LIBLZMA = false; + // 1 = use libpng from emscripten-ports - // [link] - var USE_LIBPNG = 0; + // [compile+link] + var USE_LIBPNG = false; diff --git a/tools/ports/liblzma.py b/tools/ports/liblzma.py new file mode 100644 --- /dev/null +++ b/tools/ports/liblzma.py -@@ -0,0 +1,160 @@ +@@ -0,0 +1,151 @@ +# Copyright 2020 The Emscripten Authors. All rights reserved. +# Emscripten is available under two separate licenses, the MIT license and the +# University of Illinois/NCSA Open Source License. Both these licenses can be @@ -52,8 +51,8 @@ new file mode 100644 +import logging +from pathlib import Path + -+VERSION = '5.2.5' -+HASH = '7443674247deda2935220fbc4dfc7665e5bb5a260be8ad858c8bd7d7b9f0f868f04ea45e62eb17c0a5e6a2de7c7500ad2d201e2d668c48ca29bd9eea5a73a3ce' ++VERSION = '5.4.0' ++HASH = '29b2cd25bb5b234b329ffe9547692d2c29be393db9d8d4ce70a66dfdaebd54433e79a89d80c57e58cd4559c3c68b9845507d5fedf3eec1c528a81e3d9ddbd811' + + +def needed(settings): @@ -61,40 +60,31 @@ new file mode 100644 + + +def get(ports, settings, shared): -+ ports.fetch_project('liblzma', 'https://tukaani.org/xz/xz-' + VERSION + '.tar.gz', 'xz-' + VERSION, sha512hash=HASH) ++ ports.fetch_project('liblzma', f'https://tukaani.org/xz/xz-{VERSION}.tar.gz', sha512hash=HASH) + + def create(final): + logging.info('building port: liblzma') + + ports.clear_project_build('liblzma') + -+ source_path = os.path.join(ports.get_dir(), 'liblzma', 'xz-' + VERSION) -+ dest_path = os.path.join(ports.get_build_dir(), 'liblzma') -+ -+ shared.try_delete(dest_path) -+ os.makedirs(dest_path) -+ shutil.rmtree(dest_path, ignore_errors=True) -+ shutil.copytree(source_path, dest_path) ++ source_path = os.path.join(ports.get_dir(), 'liblzma', f'xz-{VERSION}', 'src', 'liblzma') ++ ports.write_file(os.path.join(source_path, 'config.h'), config_h) ++ ports.install_headers(os.path.join(source_path, 'api'), pattern='lzma.h') ++ ports.install_headers(os.path.join(source_path, 'api', 'lzma'), pattern='*.h', target='lzma') + + build_flags = ['-DHAVE_CONFIG_H', '-DTUKLIB_SYMBOL_PREFIX=lzma_', '-fvisibility=hidden'] -+ exclude_dirs = ['xzdec', 'xz', 'lzmainfo'] -+ exclude_files = ['crc32_small.c', 'crc64_small.c', 'crc32_tablegen.c', 'crc64_tablegen.c', 'price_tablegen.c', 'fastpos_tablegen.c' ++ exclude_files = ['crc32_small.c', 'crc64_small.c', 'crc32_tablegen.c', 'crc64_tablegen.c', 'price_tablegen.c', 'fastpos_tablegen.c', + 'tuklib_exit.c', 'tuklib_mbstr_fw.c', 'tuklib_mbstr_width.c', 'tuklib_open_stdxxx.c', 'tuklib_progname.c'] -+ include_dirs_rel = ['../common', 'api', 'common', 'check', 'lz', 'rangecoder', 'lzma', 'delta', 'simple'] ++ include_dirs_rel = ['../common', 'api', 'check', 'common', 'delta', 'lz', 'lzma', 'rangecoder', 'simple'] + -+ Path(dest_path, os.path.join('src', 'config.h')).write_text(config_h) ++ include_dirs = [os.path.join(source_path, p) for p in include_dirs_rel] ++ ports.build_port(source_path, final, 'liblzma', flags=build_flags, exclude_files=exclude_files, includes=include_dirs) + -+ include_dirs = [os.path.join(dest_path, 'src', 'liblzma', p) for p in include_dirs_rel] -+ ports.build_port(os.path.join(dest_path, 'src'), final, flags=build_flags, exclude_dirs=exclude_dirs, exclude_files=exclude_files, includes=include_dirs) -+ -+ ports.install_headers(os.path.join(dest_path, 'src', 'liblzma', 'api'), 'lzma.h') -+ ports.install_headers(os.path.join(dest_path, 'src', 'liblzma', 'api', 'lzma'), '*.h', 'lzma') -+ -+ return [shared.Cache.get_lib('liblzma.a', create, what='port')] ++ return [shared.cache.get_lib('liblzma.a', create, what='port')] + + +def clear(ports, settings, shared): -+ shared.Cache.erase_lib('liblzma.a') ++ shared.cache.erase_lib('liblzma.a') + + +def process_args(ports): @@ -105,7 +95,7 @@ new file mode 100644 + return 'liblzma (USE_LIBLZMA=1; public domain)' + + -+config_h = r''' ++config_h = ''' +#define ASSUME_RAM 128 +#define ENABLE_NLS 1 +#define HAVE_CHECK_CRC32 1 @@ -177,9 +167,9 @@ new file mode 100644 +#define PACKAGE "xz" +#define PACKAGE_BUGREPORT "lasse.collin@tukaani.org" +#define PACKAGE_NAME "XZ Utils" -+#define PACKAGE_STRING "XZ Utils 5.2.5" ++#define PACKAGE_STRING "XZ Utils 5.4.0" +#define PACKAGE_TARNAME "xz" -+#define PACKAGE_VERSION "5.2.5" ++#define PACKAGE_VERSION "5.4.0" +#define SIZEOF_SIZE_T 4 +#define STDC_HEADERS 1 +#define TUKLIB_CPUCORES_SYSCONF 1 @@ -200,5 +190,5 @@ new file mode 100644 +#ifndef __EXTENSIONS__ +# define __EXTENSIONS__ 1 +#endif -+#define VERSION "5.2.5" ++#define VERSION "5.4.0" +''' diff --git a/os/macosx/Info.plist.in b/os/macosx/Info.plist.in index 0148ab289a..71619d8936 100644 --- a/os/macosx/Info.plist.in +++ b/os/macosx/Info.plist.in @@ -32,6 +32,6 @@ NSHighResolutionCapable True LSMinimumSystemVersion - 10.14.0 + 10.13.0 diff --git a/regression/regression/main.nut b/regression/regression/main.nut index 05d6f275bd..7621c49c6f 100644 --- a/regression/regression/main.nut +++ b/regression/regression/main.nut @@ -562,6 +562,25 @@ function Regression::Prices() print(" BT_CLEAR_WATER: " + AITile.GetBuildCost(AITile.BT_CLEAR_WATER)); } +function Regression::Commands() +{ + print(""); + print("--Commands--"); + + print(" -Command accounting-"); + local test = AITestMode(); + local costs = AIAccounting(); + AITile.DemolishTile(2834); + print(" Command cost: " + costs.GetCosts()); + { + local inner = AIAccounting(); + print(" New inner cost scope: " + costs.GetCosts()); + AITile.DemolishTile(2835); + print(" Further command cost: " + costs.GetCosts()); + } + print(" Saved cost of outer scope: " + costs.GetCosts()); +} + function cost_callback(old_path, new_tile, new_direction, self) { if (old_path == null) return 0; return old_path.GetCost() + 1; } function estimate_callback(tile, direction, goals, self) { return goals[0] - tile; } function neighbours_callback(path, cur_tile, self) { return [[cur_tile + 1, 1]]; } @@ -1684,6 +1703,7 @@ function Regression::Vehicle() print(" BuildVehicle(): " + AIVehicle.BuildVehicle(33417, 153)); print(" IsValidVehicle(12): " + AIVehicle.IsValidVehicle(12)); print(" CloneVehicle(): " + AIVehicle.CloneVehicle(33417, 12, true)); + print(" BuildVehicle(): " + AIVehicle.BuildVehicle(-1, 153)); local bank_after = AICompany.GetBankBalance(AICompany.COMPANY_SELF); @@ -1940,6 +1960,7 @@ function Regression::Start() /* Do this first as it gains maximum loan (which is faked to quite a lot). */ this.Company(); + this.Commands(); this.Airport(); this.Bridge(); this.BridgeList(); diff --git a/regression/regression/result.txt b/regression/regression/result.txt index 27f90220dc..dc3e294844 100644 --- a/regression/regression/result.txt +++ b/regression/regression/result.txt @@ -788,6 +788,13 @@ ERROR: IsEnd() is invalid as Begin() is never called GetQuarterlyPerformanceRating(): 0 GetQuarterlyCompanyValue(): 0 +--Commands-- + -Command accounting- + Command cost: 7500 + New inner cost scope: 0 + Further command cost: 30 + Saved cost of outer scope: 7500 + --AIAirport-- IsHangarTile(): false IsAirportTile(): false @@ -9288,6 +9295,7 @@ ERROR: IsEnd() is invalid as Begin() is never called BuildVehicle(): 12 IsValidVehicle(12): true CloneVehicle(): 13 + BuildVehicle(): 1048575 --Accounting-- GetCosts(): 11894 Should be: 11894 diff --git a/src/3rdparty/squirrel/squirrel/sqstate.cpp b/src/3rdparty/squirrel/squirrel/sqstate.cpp index 0f95c396c9..23bd520a1a 100644 --- a/src/3rdparty/squirrel/squirrel/sqstate.cpp +++ b/src/3rdparty/squirrel/squirrel/sqstate.cpp @@ -450,7 +450,7 @@ void RefTable::Resize(SQUnsignedInteger size) SQUnsignedInteger oldnumofslots = _numofslots; AllocNodes(size); //rehash - SQUnsignedInteger nfound = 0; + [[maybe_unused]] SQUnsignedInteger nfound = 0; for(SQUnsignedInteger n = 0; n < oldnumofslots; n++) { if(type(t->obj) != OT_NULL) { //add back; diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e526c5d595..b27a4ca080 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -216,6 +216,12 @@ add_files( landscape_cmd.h landscape_type.h language.h + league_base.h + league_cmd.h + league_cmd.cpp + league_gui.h + league_gui.cpp + league_type.h livery.h main_gui.cpp map.cpp diff --git a/src/ai/ai.hpp b/src/ai/ai.hpp index f9112fc177..1e2e99d22f 100644 --- a/src/ai/ai.hpp +++ b/src/ai/ai.hpp @@ -128,11 +128,6 @@ public: */ static void Save(CompanyID company); - /** - * Load data for an AI from a savegame. - */ - static void Load(CompanyID company, int version); - /** * Get the number of days before the next AI should start. */ diff --git a/src/ai/ai_core.cpp b/src/ai/ai_core.cpp index add76e0685..4d878b2905 100644 --- a/src/ai/ai_core.cpp +++ b/src/ai/ai_core.cpp @@ -57,6 +57,8 @@ assert(c->ai_instance == nullptr); c->ai_instance = new AIInstance(); c->ai_instance->Initialize(info); + c->ai_instance->LoadOnStack(config->GetToLoadData()); + config->SetToLoadData(nullptr); cur_company.Restore(); @@ -289,21 +291,6 @@ } } -/* static */ void AI::Load(CompanyID company, int version) -{ - if (!_networking || _network_server) { - Company *c = Company::GetIfValid(company); - assert(c != nullptr && c->ai_instance != nullptr); - - Backup cur_company(_current_company, company, FILE_LINE); - c->ai_instance->Load(version); - cur_company.Restore(); - } else { - /* Read, but ignore, the load data */ - AIInstance::LoadEmpty(); - } -} - /* static */ int AI::GetStartNextTime() { /* Find the first company which doesn't exist yet */ diff --git a/src/ai/ai_gui.cpp b/src/ai/ai_gui.cpp index b97e9f72ea..d885de813b 100644 --- a/src/ai/ai_gui.cpp +++ b/src/ai/ai_gui.cpp @@ -112,7 +112,7 @@ struct AIListWindow : public Window { void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override { if (widget == WID_AIL_LIST) { - this->line_height = FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM; + this->line_height = FONT_HEIGHT_NORMAL + padding.height; resize->width = 1; resize->height = this->line_height; @@ -125,45 +125,45 @@ struct AIListWindow : public Window { switch (widget) { case WID_AIL_LIST: { /* Draw a list of all available AIs. */ - int y = this->GetWidget(WID_AIL_LIST)->pos_y; + Rect tr = r.Shrink(WidgetDimensions::scaled.matrix); /* First AI in the list is hardcoded to random */ if (this->vscroll->IsVisible(0)) { - DrawString(r.left + WD_MATRIX_LEFT, r.right - WD_MATRIX_LEFT, y + WD_MATRIX_TOP, this->slot == OWNER_DEITY ? STR_AI_CONFIG_NONE : STR_AI_CONFIG_RANDOM_AI, this->selected == -1 ? TC_WHITE : TC_ORANGE); - y += this->line_height; + DrawString(tr, this->slot == OWNER_DEITY ? STR_AI_CONFIG_NONE : STR_AI_CONFIG_RANDOM_AI, this->selected == -1 ? TC_WHITE : TC_ORANGE); + tr.top += this->line_height; } int i = 0; for (const auto &item : *this->info_list) { i++; if (this->vscroll->IsVisible(i)) { - DrawString(r.left + WD_MATRIX_LEFT, r.right - WD_MATRIX_RIGHT, y + WD_MATRIX_TOP, item.second->GetName(), (this->selected == i - 1) ? TC_WHITE : TC_ORANGE); - y += this->line_height; + DrawString(tr, item.second->GetName(), (this->selected == i - 1) ? TC_WHITE : TC_ORANGE); + tr.top += this->line_height; } } break; } case WID_AIL_INFO_BG: { - AIInfo *selected_info = nullptr; + ScriptInfo *selected_info = nullptr; int i = 0; for (const auto &item : *this->info_list) { i++; - if (this->selected == i - 1) selected_info = static_cast(item.second); + if (this->selected == i - 1) selected_info = static_cast(item.second); } /* Some info about the currently selected AI. */ if (selected_info != nullptr) { - int y = r.top + WD_FRAMERECT_TOP; + Rect tr = r.Shrink(WidgetDimensions::scaled.frametext, WidgetDimensions::scaled.framerect); SetDParamStr(0, selected_info->GetAuthor()); - DrawString(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, y, STR_AI_LIST_AUTHOR); - y += FONT_HEIGHT_NORMAL + WD_PAR_VSEP_NORMAL; + DrawString(tr, STR_AI_LIST_AUTHOR); + tr.top += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; SetDParam(0, selected_info->GetVersion()); - DrawString(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, y, STR_AI_LIST_VERSION); - y += FONT_HEIGHT_NORMAL + WD_PAR_VSEP_NORMAL; + DrawString(tr, STR_AI_LIST_VERSION); + tr.top += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; if (selected_info->GetURL() != nullptr) { SetDParamStr(0, selected_info->GetURL()); - DrawString(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, y, STR_AI_LIST_URL); - y += FONT_HEIGHT_NORMAL + WD_PAR_VSEP_NORMAL; + DrawString(tr, STR_AI_LIST_URL); + tr.top += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; } SetDParamStr(0, selected_info->GetDescription()); - DrawStringMultiLine(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, y, r.bottom - WD_FRAMERECT_BOTTOM, STR_JUST_RAW_STRING, TC_WHITE); + DrawStringMultiLine(tr, STR_JUST_RAW_STRING, TC_WHITE); } break; } @@ -182,7 +182,7 @@ struct AIListWindow : public Window { for (int i = 0; i < this->selected; i++) it++; GetConfig(slot)->Change((*it).second->GetName(), (*it).second->GetVersion()); } - InvalidateWindowData(WC_GAME_OPTIONS, WN_GAME_OPTIONS_AI); + InvalidateWindowData(WC_GAME_OPTIONS, slot == OWNER_DEITY ? WN_GAME_OPTIONS_GS : WN_GAME_OPTIONS_AI); InvalidateWindowClassesData(WC_AI_SETTINGS); CloseWindowByClass(WC_QUERY_STRING); InvalidateWindowClassesData(WC_TEXTFILE); @@ -253,7 +253,7 @@ static const NWidgetPart _nested_ai_list_widgets[] = { NWidget(WWT_MATRIX, COLOUR_MAUVE, WID_AIL_LIST), SetMinimalSize(188, 112), SetFill(1, 1), SetResize(1, 1), SetMatrixDataTip(1, 0, STR_AI_LIST_TOOLTIP), SetScrollbar(WID_AIL_SCROLLBAR), NWidget(NWID_VSCROLLBAR, COLOUR_MAUVE, WID_AIL_SCROLLBAR), EndContainer(), - NWidget(WWT_PANEL, COLOUR_MAUVE, WID_AIL_INFO_BG), SetMinimalTextLines(8, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM), SetResize(1, 0), + NWidget(WWT_PANEL, COLOUR_MAUVE, WID_AIL_INFO_BG), SetMinimalTextLines(8, WidgetDimensions::unscaled.framerect.Vertical() + WidgetDimensions::unscaled.vsep_normal * 3), SetResize(1, 0), EndContainer(), NWidget(NWID_HORIZONTAL), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), @@ -276,7 +276,7 @@ static WindowDesc _ai_list_desc( * Open the AI list window to chose an AI for the given company slot. * @param slot The slot to change the AI of. */ -static void ShowAIListWindow(CompanyID slot) +void ShowAIListWindow(CompanyID slot) { CloseWindowByClass(WC_AI_LIST); new AIListWindow(&_ai_list_desc, slot); @@ -296,7 +296,7 @@ struct AISettingsWindow : public Window { int clicked_row; ///< The clicked row of settings. int line_height; ///< Height of a row in the matrix widget. Scrollbar *vscroll; ///< Cache of the vertical scrollbar. - typedef std::vector VisibleSettingsList; + typedef std::vector VisibleSettingsList; ///< typdef for a vector of script settings VisibleSettingsList visible_settings; ///< List of visible AI settings /** @@ -320,15 +320,6 @@ struct AISettingsWindow : public Window { this->RebuildVisibleSettings(); } - void SetStringParameters(int widget) const override - { - switch (widget) { - case WID_AIS_CAPTION: - SetDParam(0, (this->slot == OWNER_DEITY) ? STR_AI_SETTINGS_CAPTION_GAMESCRIPT : STR_AI_SETTINGS_CAPTION_AI); - break; - } - } - /** * Rebuilds the list of visible settings. AI settings with the flag * AICONFIG_AI_DEVELOPER set will only be visible if the game setting @@ -351,7 +342,7 @@ struct AISettingsWindow : public Window { void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override { if (widget == WID_AIS_BACKGROUND) { - this->line_height = std::max(SETTING_BUTTON_HEIGHT, FONT_HEIGHT_NORMAL) + WD_MATRIX_TOP + WD_MATRIX_BOTTOM; + this->line_height = std::max(SETTING_BUTTON_HEIGHT, FONT_HEIGHT_NORMAL) + padding.height; resize->width = 1; resize->height = this->line_height; @@ -368,11 +359,10 @@ struct AISettingsWindow : public Window { int i = 0; for (; !this->vscroll->IsVisible(i); i++) it++; + Rect ir = r.Shrink(WidgetDimensions::scaled.framerect); bool rtl = _current_text_dir == TD_RTL; - uint buttons_left = rtl ? r.right - SETTING_BUTTON_WIDTH - 3 : r.left + 4; - uint text_left = r.left + (rtl ? WD_FRAMERECT_LEFT : SETTING_BUTTON_WIDTH + 8); - uint text_right = r.right - (rtl ? SETTING_BUTTON_WIDTH + 8 : WD_FRAMERECT_RIGHT); - + Rect br = ir.WithWidth(SETTING_BUTTON_WIDTH, rtl); + Rect tr = ir.Indent(SETTING_BUTTON_WIDTH + WidgetDimensions::scaled.hsep_wide, rtl); int y = r.top; int button_y_offset = (this->line_height - SETTING_BUTTON_HEIGHT) / 2; @@ -401,13 +391,13 @@ struct AISettingsWindow : public Window { } if ((config_item.flags & SCRIPTCONFIG_BOOLEAN) != 0) { - DrawBoolButton(buttons_left, y + button_y_offset, current_value != 0, editable); + DrawBoolButton(br.left, y + button_y_offset, current_value != 0, editable); SetDParam(idx++, current_value == 0 ? STR_CONFIG_SETTING_OFF : STR_CONFIG_SETTING_ON); } else { if (config_item.complete_labels) { - DrawDropDownButton(buttons_left, y + button_y_offset, COLOUR_YELLOW, this->clicked_row == i && clicked_dropdown, editable); + DrawDropDownButton(br.left, y + button_y_offset, COLOUR_YELLOW, this->clicked_row == i && clicked_dropdown, editable); } else { - DrawArrowButtons(buttons_left, y + button_y_offset, COLOUR_YELLOW, (this->clicked_button == i) ? 1 + (this->clicked_increase != rtl) : 0, editable && current_value > config_item.min_value, editable && current_value < config_item.max_value); + DrawArrowButtons(br.left, y + button_y_offset, COLOUR_YELLOW, (this->clicked_button == i) ? 1 + (this->clicked_increase != rtl) : 0, editable && current_value > config_item.min_value, editable && current_value < config_item.max_value); } if (config_item.labels != nullptr && config_item.labels->Contains(current_value)) { SetDParam(idx++, STR_JUST_RAW_STRING); @@ -418,7 +408,7 @@ struct AISettingsWindow : public Window { } } - DrawString(text_left, text_right, y + text_y_offset, str, colour); + DrawString(tr.left, tr.right, y + text_y_offset, str, colour); y += this->line_height; } } @@ -436,8 +426,8 @@ struct AISettingsWindow : public Window { { switch (widget) { case WID_AIS_BACKGROUND: { - const NWidgetBase *wid = this->GetWidget(WID_AIS_BACKGROUND); - int num = (pt.y - wid->pos_y) / this->line_height + this->vscroll->GetPosition(); + Rect r = this->GetWidget(widget)->GetCurrentRect().Shrink(WidgetDimensions::scaled.matrix, RectPadding::zero); + int num = (pt.y - r.top) / this->line_height + this->vscroll->GetPosition(); if (num >= (int)this->visible_settings.size()) break; VisibleSettingsList::const_iterator it = this->visible_settings.begin(); @@ -454,9 +444,8 @@ struct AISettingsWindow : public Window { bool bool_item = (config_item.flags & SCRIPTCONFIG_BOOLEAN) != 0; - int x = pt.x - wid->pos_x; - if (_current_text_dir == TD_RTL) x = wid->current_x - 1 - x; - x -= 4; + int x = pt.x - r.left; + if (_current_text_dir == TD_RTL) x = r.Width() - 1 - x; /* One of the arrows is clicked (or green/red rect in case of bool value) */ int old_val = this->ai_config->GetSetting(config_item.name); @@ -467,8 +456,7 @@ struct AISettingsWindow : public Window { this->clicked_dropdown = false; this->closing_dropdown = false; } else { - const NWidgetBase *wid = this->GetWidget(WID_AIS_BACKGROUND); - int rel_y = (pt.y - (int)wid->pos_y) % this->line_height; + int rel_y = (pt.y - r.top) % this->line_height; Rect wi_rect; wi_rect.left = pt.x - (_current_text_dir == TD_RTL ? SETTING_BUTTON_WIDTH - 1 - x : x); @@ -476,7 +464,7 @@ struct AISettingsWindow : public Window { wi_rect.top = pt.y - rel_y + (this->line_height - SETTING_BUTTON_HEIGHT) / 2; wi_rect.bottom = wi_rect.top + SETTING_BUTTON_HEIGHT - 1; - /* For dropdowns we also have to check the y position thoroughly, the mouse may not above the just opening dropdown */ + /* If the mouse is still held but dragged outside of the dropdown list, keep the dropdown open */ if (pt.y >= wi_rect.top && pt.y <= wi_rect.bottom) { this->clicked_dropdown = true; this->closing_dropdown = false; @@ -533,24 +521,15 @@ struct AISettingsWindow : public Window { void OnQueryTextFinished(char *str) override { if (StrEmpty(str)) return; - VisibleSettingsList::const_iterator it = this->visible_settings.begin(); - for (int i = 0; i < this->clicked_row; i++) it++; - const ScriptConfigItem config_item = **it; - if (_game_mode == GM_NORMAL && ((this->slot == OWNER_DEITY) || Company::IsValidID(this->slot)) && (config_item.flags & SCRIPTCONFIG_INGAME) == 0) return; int32 value = atoi(str); - this->ai_config->SetSetting(config_item.name, value); - this->SetDirty(); + + SetValue(value); } void OnDropdownSelect(int widget, int index) override { assert(this->clicked_dropdown); - VisibleSettingsList::const_iterator it = this->visible_settings.begin(); - for (int i = 0; i < this->clicked_row; i++) it++; - const ScriptConfigItem config_item = **it; - if (_game_mode == GM_NORMAL && ((this->slot == OWNER_DEITY) || Company::IsValidID(this->slot)) && (config_item.flags & SCRIPTCONFIG_INGAME) == 0) return; - this->ai_config->SetSetting(config_item.name, index); - this->SetDirty(); + SetValue(index); } void OnDropdownClose(Point pt, int widget, int index, bool instant_close) override @@ -592,7 +571,21 @@ struct AISettingsWindow : public Window { private: bool IsEditableItem(const ScriptConfigItem &config_item) const { - return _game_mode == GM_MENU || ((this->slot != OWNER_DEITY) && !Company::IsValidID(this->slot)) || (config_item.flags & SCRIPTCONFIG_INGAME) != 0; + return _game_mode == GM_MENU + || _game_mode == GM_EDITOR + || ((this->slot != OWNER_DEITY) && !Company::IsValidID(this->slot)) + || (config_item.flags & SCRIPTCONFIG_INGAME) != 0 + || _settings_client.gui.ai_developer_tools; + } + + void SetValue(int value) + { + VisibleSettingsList::const_iterator it = this->visible_settings.begin(); + for (int i = 0; i < this->clicked_row; i++) it++; + const ScriptConfigItem config_item = **it; + if (_game_mode == GM_NORMAL && ((this->slot == OWNER_DEITY) || Company::IsValidID(this->slot)) && (config_item.flags & SCRIPTCONFIG_INGAME) == 0) return; + this->ai_config->SetSetting(config_item.name, value); + this->SetDirty(); } }; @@ -600,7 +593,7 @@ private: static const NWidgetPart _nested_ai_settings_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_MAUVE), - NWidget(WWT_CAPTION, COLOUR_MAUVE, WID_AIS_CAPTION), SetDataTip(STR_AI_SETTINGS_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), + NWidget(WWT_CAPTION, COLOUR_MAUVE, WID_AIS_CAPTION), SetDataTip(STR_AI_SETTINGS_CAPTION_AI, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), NWidget(WWT_DEFSIZEBOX, COLOUR_MAUVE), EndContainer(), NWidget(NWID_HORIZONTAL), @@ -680,7 +673,7 @@ void ShowScriptTextfileWindow(TextfileType file_type, CompanyID slot) static const NWidgetPart _nested_ai_config_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_MAUVE), - NWidget(WWT_CAPTION, COLOUR_MAUVE), SetDataTip(STR_AI_CONFIG_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), + NWidget(WWT_CAPTION, COLOUR_MAUVE), SetDataTip(STR_AI_CONFIG_CAPTION_AI, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), EndContainer(), NWidget(WWT_PANEL, COLOUR_MAUVE, WID_AIC_BACKGROUND), NWidget(NWID_VERTICAL), SetPIP(4, 4, 4), @@ -688,7 +681,7 @@ static const NWidgetPart _nested_ai_config_widgets[] = { NWidget(WWT_PUSHARROWBTN, COLOUR_YELLOW, WID_AIC_DECREASE), SetDataTip(AWV_DECREASE, STR_NULL), NWidget(WWT_PUSHARROWBTN, COLOUR_YELLOW, WID_AIC_INCREASE), SetDataTip(AWV_INCREASE, STR_NULL), NWidget(NWID_SPACER), SetMinimalSize(6, 0), - NWidget(WWT_TEXT, COLOUR_MAUVE, WID_AIC_NUMBER), SetDataTip(STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS, STR_NULL), SetFill(1, 0), + NWidget(WWT_TEXT, COLOUR_MAUVE, WID_AIC_NUMBER), SetDataTip(STR_AI_CONFIG_MAX_COMPETITORS, STR_NULL), SetFill(1, 0), EndContainer(), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(7, 0, 7), NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_MOVE_UP), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_AI_CONFIG_MOVE_UP, STR_AI_CONFIG_MOVE_UP_TOOLTIP), @@ -702,16 +695,13 @@ static const NWidgetPart _nested_ai_config_widgets[] = { EndContainer(), EndContainer(), NWidget(NWID_SPACER), SetMinimalSize(0, 9), - NWidget(WWT_FRAME, COLOUR_MAUVE), SetDataTip(STR_AI_CONFIG_GAMESCRIPT, STR_NULL), SetPadding(0, 5, 4, 5), - NWidget(WWT_MATRIX, COLOUR_MAUVE, WID_AIC_GAMELIST), SetMinimalSize(288, 14), SetFill(1, 0), SetMatrixDataTip(1, 1, STR_AI_CONFIG_GAMELIST_TOOLTIP), - EndContainer(), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(7, 0, 7), - NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CHANGE), SetFill(1, 0), SetMinimalSize(93, 0), SetDataTip(STR_AI_CONFIG_CHANGE, STR_AI_CONFIG_CHANGE_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CHANGE), SetFill(1, 0), SetMinimalSize(93, 0), SetDataTip(STR_AI_CONFIG_CHANGE_AI, STR_AI_CONFIG_CHANGE_TOOLTIP), NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CONFIGURE), SetFill(1, 0), SetMinimalSize(93, 0), SetDataTip(STR_AI_CONFIG_CONFIGURE, STR_AI_CONFIG_CONFIGURE_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CLOSE), SetFill(1, 0), SetMinimalSize(93, 0), SetDataTip(STR_AI_SETTINGS_CLOSE, STR_NULL), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_NULL), EndContainer(), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(7, 0, 7), - NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_NULL), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CLOSE), SetFill(1, 0), SetMinimalSize(93, 0), SetDataTip(STR_AI_SETTINGS_CLOSE, STR_NULL), NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_CHANGELOG), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_NULL), NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_LICENSE), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_NULL), EndContainer(), @@ -759,21 +749,6 @@ struct AIConfigWindow : public Window { case WID_AIC_NUMBER: SetDParam(0, GetGameSettings().difficulty.max_no_competitors); break; - case WID_AIC_CHANGE: - switch (selected_slot) { - case OWNER_DEITY: - SetDParam(0, STR_AI_CONFIG_CHANGE_GAMESCRIPT); - break; - - case INVALID_COMPANY: - SetDParam(0, STR_AI_CONFIG_CHANGE_NONE); - break; - - default: - SetDParam(0, STR_AI_CONFIG_CHANGE_AI); - break; - } - break; } } @@ -785,32 +760,11 @@ struct AIConfigWindow : public Window { *size = maxdim(*size, NWidgetScrollbar::GetHorizontalDimension()); break; - case WID_AIC_GAMELIST: - this->line_height = FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM; - size->height = 1 * this->line_height; - break; - case WID_AIC_LIST: - this->line_height = FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM; + this->line_height = FONT_HEIGHT_NORMAL + padding.height; resize->height = this->line_height; size->height = 8 * this->line_height; break; - - case WID_AIC_CHANGE: { - SetDParam(0, STR_AI_CONFIG_CHANGE_GAMESCRIPT); - Dimension dim = GetStringBoundingBox(STR_AI_CONFIG_CHANGE); - - SetDParam(0, STR_AI_CONFIG_CHANGE_NONE); - dim = maxdim(dim, GetStringBoundingBox(STR_AI_CONFIG_CHANGE)); - - SetDParam(0, STR_AI_CONFIG_CHANGE_AI); - dim = maxdim(dim, GetStringBoundingBox(STR_AI_CONFIG_CHANGE)); - - dim.width += padding.width; - dim.height += padding.height; - *size = maxdim(*size, dim); - break; - } } } @@ -821,8 +775,6 @@ struct AIConfigWindow : public Window { */ static bool IsEditable(CompanyID slot) { - if (slot == OWNER_DEITY) return _game_mode != GM_NORMAL || Game::GetInstance() != nullptr; - if (_game_mode != GM_NORMAL) { return slot > 0 && slot <= GetGameSettings().difficulty.max_no_competitors; } @@ -838,22 +790,8 @@ struct AIConfigWindow : public Window { void DrawWidget(const Rect &r, int widget) const override { switch (widget) { - case WID_AIC_GAMELIST: { - StringID text = STR_AI_CONFIG_NONE; - - if (GameConfig::GetConfig()->GetInfo() != nullptr) { - SetDParamStr(0, GameConfig::GetConfig()->GetInfo()->GetName()); - text = STR_JUST_RAW_STRING; - } - - DrawString(r.left + 10, r.right - 10, r.top + WD_MATRIX_TOP, text, - (this->selected_slot == OWNER_DEITY) ? TC_WHITE : (IsEditable(OWNER_DEITY) ? TC_ORANGE : TC_SILVER)); - - break; - } - case WID_AIC_LIST: { - int y = r.top; + Rect tr = r.Shrink(WidgetDimensions::scaled.matrix); for (int i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < MAX_COMPANIES; i++) { StringID text; @@ -865,9 +803,9 @@ struct AIConfigWindow : public Window { } else { text = STR_AI_CONFIG_RANDOM_AI; } - DrawString(r.left + 10, r.right - 10, y + WD_MATRIX_TOP, text, + DrawString(tr, text, (this->selected_slot == i) ? TC_WHITE : (IsEditable((CompanyID)i) ? TC_ORANGE : TC_SILVER)); - y += this->line_height; + tr.top += this->line_height; } break; } @@ -896,13 +834,6 @@ struct AIConfigWindow : public Window { break; } - case WID_AIC_GAMELIST: { - this->selected_slot = OWNER_DEITY; - this->InvalidateData(); - if (click_count > 1 && this->selected_slot != INVALID_COMPANY && _game_mode != GM_NORMAL) ShowAIListWindow((CompanyID)this->selected_slot); - break; - } - case WID_AIC_LIST: { // Select a slot this->selected_slot = (CompanyID)this->vscroll->GetScrolledRowFromWidget(pt.y, this, widget); this->InvalidateData(); @@ -944,7 +875,7 @@ struct AIConfigWindow : public Window { if (!_network_available) { ShowErrorMessage(STR_NETWORK_ERROR_NOTAVAILABLE, INVALID_STRING_ID, WL_ERROR); } else { - ShowNetworkContentListWindow(nullptr, CONTENT_TYPE_AI, CONTENT_TYPE_GAME); + ShowNetworkContentListWindow(nullptr, CONTENT_TYPE_AI); } break; } @@ -965,10 +896,10 @@ struct AIConfigWindow : public Window { this->SetWidgetDisabledState(WID_AIC_DECREASE, GetGameSettings().difficulty.max_no_competitors == 0); this->SetWidgetDisabledState(WID_AIC_INCREASE, GetGameSettings().difficulty.max_no_competitors == MAX_COMPANIES - 1); - this->SetWidgetDisabledState(WID_AIC_CHANGE, (this->selected_slot == OWNER_DEITY && _game_mode == GM_NORMAL) || this->selected_slot == INVALID_COMPANY); + this->SetWidgetDisabledState(WID_AIC_CHANGE, this->selected_slot == INVALID_COMPANY); this->SetWidgetDisabledState(WID_AIC_CONFIGURE, this->selected_slot == INVALID_COMPANY || GetConfig(this->selected_slot)->GetConfigList()->size() == 0); - this->SetWidgetDisabledState(WID_AIC_MOVE_UP, this->selected_slot == OWNER_DEITY || this->selected_slot == INVALID_COMPANY || !IsEditable((CompanyID)(this->selected_slot - 1))); - this->SetWidgetDisabledState(WID_AIC_MOVE_DOWN, this->selected_slot == OWNER_DEITY || this->selected_slot == INVALID_COMPANY || !IsEditable((CompanyID)(this->selected_slot + 1))); + this->SetWidgetDisabledState(WID_AIC_MOVE_UP, this->selected_slot == INVALID_COMPANY || !IsEditable((CompanyID)(this->selected_slot - 1))); + this->SetWidgetDisabledState(WID_AIC_MOVE_DOWN, this->selected_slot == INVALID_COMPANY || !IsEditable((CompanyID)(this->selected_slot + 1))); for (TextfileType tft = TFT_BEGIN; tft < TFT_END; tft++) { this->SetWidgetDisabledState(WID_AIC_TEXTFILE + tft, this->selected_slot == INVALID_COMPANY || (GetConfig(this->selected_slot)->GetTextfile(tft, this->selected_slot) == nullptr)); @@ -1008,9 +939,6 @@ static bool SetScriptButtonColour(NWidgetCore &button, bool dead, bool paused) * Window with everything an AI prints via ScriptLog. */ struct AIDebugWindow : public Window { - static const int top_offset; ///< Offset of the text at the top of the WID_AID_LOG_PANEL. - static const int bottom_offset; ///< Offset of the text at the bottom of the WID_AID_LOG_PANEL. - static const uint MAX_BREAK_STR_STRING_LENGTH = 256; ///< Maximum length of the break string. static CompanyID ai_debug_company; ///< The AI that is (was last) being debugged. @@ -1114,8 +1042,8 @@ struct AIDebugWindow : public Window { void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override { if (widget == WID_AID_LOG_PANEL) { - resize->height = FONT_HEIGHT_NORMAL + WD_PAR_VSEP_NORMAL; - size->height = 14 * resize->height + this->top_offset + this->bottom_offset; + resize->height = FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; + size->height = 14 * resize->height + WidgetDimensions::scaled.framerect.Vertical(); } } @@ -1229,7 +1157,8 @@ struct AIDebugWindow : public Window { ScriptLog::LogData *log = this->GetLogPointer(); if (log == nullptr) return; - int y = this->top_offset; + Rect br = r.Shrink(WidgetDimensions::scaled.bevel); + Rect tr = r.Shrink(WidgetDimensions::scaled.framerect); for (int i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < log->used; i++) { int pos = (i + log->pos + 1 - log->used + log->count) % log->count; if (log->lines[pos] == nullptr) break; @@ -1246,12 +1175,12 @@ struct AIDebugWindow : public Window { /* Check if the current line should be highlighted */ if (pos == this->highlight_row) { - GfxFillRect(r.left + 1, r.top + y, r.right - 1, r.top + y + this->resize.step_height - WD_PAR_VSEP_NORMAL, PC_BLACK); + GfxFillRect(br.left, tr.top, br.right, tr.top + this->resize.step_height - 1, PC_BLACK); if (colour == TC_BLACK) colour = TC_WHITE; // Make black text readable by inverting it to white. } - DrawString(r.left + 7, r.right - 7, r.top + y, log->lines[pos], colour, SA_LEFT | SA_FORCE); - y += this->resize.step_height; + DrawString(tr, log->lines[pos], colour, SA_LEFT | SA_FORCE); + tr.top += this->resize.step_height; } break; } @@ -1423,14 +1352,12 @@ struct AIDebugWindow : public Window { void OnResize() override { - this->vscroll->SetCapacityFromWidget(this, WID_AID_LOG_PANEL); + this->vscroll->SetCapacityFromWidget(this, WID_AID_LOG_PANEL, WidgetDimensions::scaled.framerect.Vertical()); } static HotkeyList hotkeys; }; -const int AIDebugWindow::top_offset = WD_FRAMERECT_TOP + 2; -const int AIDebugWindow::bottom_offset = WD_FRAMERECT_BOTTOM; CompanyID AIDebugWindow::ai_debug_company = INVALID_COMPANY; char AIDebugWindow::break_string[MAX_BREAK_STR_STRING_LENGTH] = ""; bool AIDebugWindow::break_check_enabled = true; diff --git a/src/ai/ai_gui.hpp b/src/ai/ai_gui.hpp index 12c8ca859b..be6263ddd5 100644 --- a/src/ai/ai_gui.hpp +++ b/src/ai/ai_gui.hpp @@ -12,8 +12,10 @@ #include "../company_type.h" +void ShowAIListWindow(CompanyID slot); Window* ShowAIDebugWindow(CompanyID show_company = INVALID_COMPANY); void ShowAIConfigWindow(); +void ShowScriptTextfileWindow(TextfileType file_type, CompanyID slot); void ShowAIDebugWindowIfAIError(); void InitializeAIGui(); diff --git a/src/ai/ai_instance.cpp b/src/ai/ai_instance.cpp index 0e8355d733..fbec89270f 100644 --- a/src/ai/ai_instance.cpp +++ b/src/ai/ai_instance.cpp @@ -61,6 +61,9 @@ void AIInstance::Died() { ScriptInstance::Died(); + /* Intro is not supposed to use AI, but it may have 'dummy' AI which instant dies. */ + if (_game_mode == GM_MENU) return; + ShowAIDebugWindow(_current_company); const AIInfo *info = AIConfig::GetConfig(_current_company, AIConfig::SSS_FORCE_GAME)->GetInfo(); diff --git a/src/ai/ai_scanner.cpp b/src/ai/ai_scanner.cpp index e99b9f8f61..ac77a0b8fd 100644 --- a/src/ai/ai_scanner.cpp +++ b/src/ai/ai_scanner.cpp @@ -10,6 +10,7 @@ #include "../stdafx.h" #include "../debug.h" #include "../network/network.h" +#include "../openttd.h" #include "../core/random_func.hpp" #include "../script/squirrel_class.hpp" @@ -59,6 +60,11 @@ void AIScannerInfo::RegisterAPI(class Squirrel *engine) AIInfo *AIScannerInfo::SelectRandomAI() const { + if (_game_mode == GM_MENU) { + Debug(script, 0, "The intro game should not use AI, loading 'dummy' AI."); + return this->info_dummy; + } + uint num_random_ais = 0; for (const auto &item : info_single_list) { AIInfo *i = static_cast(item.second); diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp index d67969c006..7a33d4c262 100644 --- a/src/aircraft_cmd.cpp +++ b/src/aircraft_cmd.cpp @@ -231,7 +231,7 @@ void DrawAircraftEngine(int left, int right, int preferred_x, int y, EngineID en VehicleSpriteSeq rotor_seq; GetCustomRotorIcon(engine, image_type, &rotor_seq); if (!rotor_seq.IsValid()) rotor_seq.Set(SPR_ROTOR_STOPPED); - rotor_seq.Draw(preferred_x, y - ScaleGUITrad(5), PAL_NONE, false); + rotor_seq.Draw(preferred_x, y - ScaleSpriteTrad(5), PAL_NONE, false); } } @@ -252,8 +252,8 @@ void GetAircraftSpriteSize(EngineID engine, uint &width, uint &height, int &xoff Rect rect; seq.GetBounds(&rect); - width = UnScaleGUI(rect.right - rect.left + 1); - height = UnScaleGUI(rect.bottom - rect.top + 1); + width = UnScaleGUI(rect.Width()); + height = UnScaleGUI(rect.Height()); xoffs = UnScaleGUI(rect.left); yoffs = UnScaleGUI(rect.top); } diff --git a/src/aircraft_gui.cpp b/src/aircraft_gui.cpp index 422f422002..421ddaf33b 100644 --- a/src/aircraft_gui.cpp +++ b/src/aircraft_gui.cpp @@ -25,59 +25,58 @@ * Draw the details for the given vehicle at the given position * * @param v current vehicle - * @param left The left most coordinate to draw - * @param right The right most coordinate to draw - * @param y The y coordinate + * @param r the Rect to draw within */ -void DrawAircraftDetails(const Aircraft *v, int left, int right, int y) +void DrawAircraftDetails(const Aircraft *v, const Rect &r) { - int y_offset = (v->Next()->cargo_cap != 0) ? -(FONT_HEIGHT_NORMAL + 1): 0; Money feeder_share = 0; + int y = r.top; for (const Aircraft *u = v; u != nullptr; u = u->Next()) { if (u->IsNormalAircraft()) { SetDParam(0, u->engine_type); SetDParam(1, u->build_year); SetDParam(2, u->value); - DrawString(left, right, y, STR_VEHICLE_INFO_BUILT_VALUE); + DrawString(r.left, r.right, y, STR_VEHICLE_INFO_BUILT_VALUE); + y += FONT_HEIGHT_NORMAL; SetDParam(0, u->cargo_type); SetDParam(1, u->cargo_cap); SetDParam(2, u->Next()->cargo_type); SetDParam(3, u->Next()->cargo_cap); SetDParam(4, GetCargoSubtypeText(u)); - DrawString(left, right, y + FONT_HEIGHT_NORMAL, (u->Next()->cargo_cap != 0) ? STR_VEHICLE_INFO_CAPACITY_CAPACITY : STR_VEHICLE_INFO_CAPACITY); + DrawString(r.left, r.right, y, (u->Next()->cargo_cap != 0) ? STR_VEHICLE_INFO_CAPACITY_CAPACITY : STR_VEHICLE_INFO_CAPACITY); + y += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; } if (u->cargo_cap != 0) { uint cargo_count = u->cargo.StoredCount(); - y_offset += FONT_HEIGHT_NORMAL + 1; if (cargo_count != 0) { /* Cargo names (fix pluralness) */ SetDParam(0, u->cargo_type); SetDParam(1, cargo_count); SetDParam(2, u->cargo.Source()); - DrawString(left, right, y + 2 * FONT_HEIGHT_NORMAL + 1 + y_offset, STR_VEHICLE_DETAILS_CARGO_FROM); + DrawString(r.left, r.right, y, STR_VEHICLE_DETAILS_CARGO_FROM); + y += FONT_HEIGHT_NORMAL; feeder_share += u->cargo.FeederShare(); } } } + y += WidgetDimensions::scaled.vsep_normal; SetDParam(0, feeder_share); - DrawString(left, right, y + 3 * FONT_HEIGHT_NORMAL + 3 + y_offset, STR_VEHICLE_INFO_FEEDER_CARGO_VALUE); + DrawString(r.left, r.right, y, STR_VEHICLE_INFO_FEEDER_CARGO_VALUE); } /** * Draws an image of an aircraft * @param v Front vehicle - * @param left The minimum horizontal position - * @param right The maximum horizontal position - * @param y Vertical position to draw at + * @param r Rect to draw at * @param selection Selected vehicle to draw a frame around */ -void DrawAircraftImage(const Vehicle *v, int left, int right, int y, VehicleID selection, EngineImageType image_type) +void DrawAircraftImage(const Vehicle *v, const Rect &r, VehicleID selection, EngineImageType image_type) { bool rtl = _current_text_dir == TD_RTL; @@ -87,27 +86,29 @@ void DrawAircraftImage(const Vehicle *v, int left, int right, int y, VehicleID s Rect rect; seq.GetBounds(&rect); - int width = UnScaleGUI(rect.right - rect.left + 1); + int width = UnScaleGUI(rect.Width()); int x_offs = UnScaleGUI(rect.left); - int x = rtl ? right - width - x_offs : left - x_offs; + int x = rtl ? r.right - width - x_offs : r.left - x_offs; + /* This magic -1 offset is related to the sprite_y_offsets in build_vehicle_gui.cpp */ + int y = ScaleSpriteTrad(-1) + CenterBounds(r.top, r.bottom, 0); bool helicopter = v->subtype == AIR_HELICOPTER; - int y_offs = ScaleGUITrad(10); int heli_offs = 0; PaletteID pal = (v->vehstatus & VS_CRASHED) ? PALETTE_CRASH : GetVehiclePalette(v); - seq.Draw(x, y + y_offs, pal, (v->vehstatus & VS_CRASHED) != 0); + seq.Draw(x, y, pal, (v->vehstatus & VS_CRASHED) != 0); if (helicopter) { const Aircraft *a = Aircraft::From(v); VehicleSpriteSeq rotor_seq; GetCustomRotorSprite(a, image_type, &rotor_seq); if (!rotor_seq.IsValid()) rotor_seq.Set(SPR_ROTOR_STOPPED); - heli_offs = ScaleGUITrad(5); - rotor_seq.Draw(x, y + y_offs - heli_offs, PAL_NONE, false); + heli_offs = ScaleSpriteTrad(5); + rotor_seq.Draw(x, y - heli_offs, PAL_NONE, false); } if (v->index == selection) { x += x_offs; - y += UnScaleGUI(rect.top) + y_offs - heli_offs; - DrawFrameRect(x - 1, y - 1, x + width + 1, y + UnScaleGUI(rect.bottom - rect.top + 1) + heli_offs + 1, COLOUR_WHITE, FR_BORDERONLY); + y += UnScaleGUI(rect.top) - heli_offs; + Rect hr = {x, y, x + width - 1, y + UnScaleGUI(rect.Height()) + heli_offs - 1}; + DrawFrameRect(hr.Expand(WidgetDimensions::scaled.bevel), COLOUR_WHITE, FR_BORDERONLY); } } diff --git a/src/airport_gui.cpp b/src/airport_gui.cpp index f8ef410d85..ca747ca262 100644 --- a/src/airport_gui.cpp +++ b/src/airport_gui.cpp @@ -340,10 +340,10 @@ public: const AirportSpec *as = AirportSpec::Get(i); if (!as->enabled) continue; - size->width = std::max(size->width, GetStringBoundingBox(as->name).width); + size->width = std::max(size->width, GetStringBoundingBox(as->name).width + padding.width); } - this->line_height = FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM; + this->line_height = FONT_HEIGHT_NORMAL + padding.height; size->height = 5 * this->line_height; break; } @@ -356,8 +356,8 @@ public: SpriteID sprite = GetCustomAirportSprite(as, layout); if (sprite != 0) { Dimension d = GetSpriteSize(sprite); - d.width += WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; - d.height += WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; + d.width += WidgetDimensions::scaled.framerect.Horizontal(); + d.height += WidgetDimensions::scaled.framerect.Vertical(); *size = maxdim(d, *size); } } @@ -388,15 +388,17 @@ public: { switch (widget) { case WID_AP_AIRPORT_LIST: { - int y = r.top; + Rect row = r.WithHeight(this->line_height).Shrink(WidgetDimensions::scaled.bevel); + Rect text = r.WithHeight(this->line_height).Shrink(WidgetDimensions::scaled.matrix); AirportClass *apclass = AirportClass::Get(_selected_airport_class); for (uint i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < apclass->GetSpecCount(); i++) { const AirportSpec *as = apclass->GetSpec(i); if (!as->IsAvailable()) { - GfxFillRect(r.left + 1, y + 1, r.right - 1, y + this->line_height - 2, PC_BLACK, FILLRECT_CHECKER); + GfxFillRect(row, PC_BLACK, FILLRECT_CHECKER); } - DrawString(r.left + WD_MATRIX_LEFT, r.right - WD_MATRIX_RIGHT, y + WD_MATRIX_TOP, as->name, ((int)i == _selected_airport_index) ? TC_WHITE : TC_BLACK); - y += this->line_height; + DrawString(text, as->name, ((int)i == _selected_airport_index) ? TC_WHITE : TC_BLACK); + row = row.Translate(0, this->line_height); + text = text.Translate(0, this->line_height); } break; } @@ -404,7 +406,7 @@ public: case WID_AP_AIRPORT_SPRITE: if (this->preview_sprite != 0) { Dimension d = GetSpriteSize(this->preview_sprite); - DrawSprite(this->preview_sprite, COMPANY_SPRITE_COLOUR(_local_company), (r.left + r.right - d.width) / 2, (r.top + r.bottom - d.height) / 2); + DrawSprite(this->preview_sprite, COMPANY_SPRITE_COLOUR(_local_company), CenterBounds(r.left, r.right, d.width), CenterBounds(r.top, r.bottom, d.height)); } break; @@ -426,7 +428,7 @@ public: this->DrawWidgets(); Rect r = this->GetWidget(WID_AP_ACCEPTANCE)->GetCurrentRect(); - int top = r.top + ScaleGUITrad(WD_PAR_VSEP_NORMAL); + int top = r.top + WidgetDimensions::scaled.vsep_normal; if (_selected_airport_index != -1) { const AirportSpec *as = AirportClass::Get(_selected_airport_class)->GetSpec(_selected_airport_index); @@ -437,19 +439,19 @@ public: /* show the noise of the selected airport */ SetDParam(0, as->noise_level); DrawString(r.left, r.right, top, STR_STATION_BUILD_NOISE); - top += FONT_HEIGHT_NORMAL + ScaleGUITrad(WD_PAR_VSEP_NORMAL); + top += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; } if (_settings_game.economy.infrastructure_maintenance) { Money monthly = _price[PR_INFRASTRUCTURE_AIRPORT] * as->maintenance_cost >> 3; SetDParam(0, monthly * 12); DrawString(r.left, r.right, top, STR_STATION_BUILD_INFRASTRUCTURE_COST); - top += FONT_HEIGHT_NORMAL + ScaleGUITrad(WD_PAR_VSEP_NORMAL); + top += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; } /* strings such as 'Size' and 'Coverage Area' */ - top = DrawStationCoverageAreaText(r.left, r.right, top, SCT_ALL, rad, false) + ScaleGUITrad(WD_PAR_VSEP_NORMAL); - top = DrawStationCoverageAreaText(r.left, r.right, top, SCT_ALL, rad, true) + ScaleGUITrad(WD_PAR_VSEP_NORMAL); + top = DrawStationCoverageAreaText(r.left, r.right, top, SCT_ALL, rad, false) + WidgetDimensions::scaled.vsep_normal; + top = DrawStationCoverageAreaText(r.left, r.right, top, SCT_ALL, rad, true) + WidgetDimensions::scaled.vsep_normal; } /* Resize background if the window is too small. @@ -603,7 +605,7 @@ static const NWidgetPart _nested_build_airport_widgets[] = { EndContainer(), /* Bottom panel. */ NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_AP_BOTTOMPANEL), - NWidget(WWT_LABEL, COLOUR_DARK_GREEN), SetPadding(WD_FRAMERECT_TOP, WD_FRAMERECT_RIGHT, WD_FRAMERECT_BOTTOM, WD_FRAMERECT_LEFT), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), SetFill(1, 0), + NWidget(WWT_LABEL, COLOUR_DARK_GREEN), SetPadding(WidgetDimensions::unscaled.framerect), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), SetFill(1, 0), NWidget(NWID_HORIZONTAL), NWidget(NWID_SPACER), SetMinimalSize(14, 0), SetFill(1, 0), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), @@ -614,7 +616,7 @@ static const NWidgetPart _nested_build_airport_widgets[] = { EndContainer(), NWidget(NWID_SPACER), SetMinimalSize(14, 0), SetFill(1, 0), EndContainer(), - NWidget(WWT_EMPTY, COLOUR_DARK_GREEN, WID_AP_ACCEPTANCE), SetPadding(0, WD_FRAMERECT_RIGHT, 0, WD_FRAMERECT_LEFT), SetResize(0, 1), SetFill(1, 0), + NWidget(WWT_EMPTY, COLOUR_DARK_GREEN, WID_AP_ACCEPTANCE), SetPadding(WidgetDimensions::unscaled.framerect), SetResize(0, 1), SetFill(1, 0), EndContainer(), }; diff --git a/src/autoreplace_gui.cpp b/src/autoreplace_gui.cpp index 4dae0eedc7..2c8186f294 100644 --- a/src/autoreplace_gui.cpp +++ b/src/autoreplace_gui.cpp @@ -33,11 +33,11 @@ #include "safeguards.h" -void DrawEngineList(VehicleType type, int x, int r, int y, const GUIEngineList *eng_list, uint16 min, uint16 max, EngineID selected_id, bool show_count, GroupID selected_group); +void DrawEngineList(VehicleType type, const Rect &r, const GUIEngineList &eng_list, uint16 min, uint16 max, EngineID selected_id, bool show_count, GroupID selected_group); -static bool EngineNumberSorter(const EngineID &a, const EngineID &b) +static bool EngineNumberSorter(const GUIEngineListItem &a, const GUIEngineListItem &b) { - return Engine::Get(a)->list_position < Engine::Get(b)->list_position; + return Engine::Get(a.engine_id)->list_position < Engine::Get(b.engine_id)->list_position; } /** @@ -113,6 +113,26 @@ class ReplaceVehicleWindow : public Window { return true; } + void AddChildren(const GUIEngineList &source, GUIEngineList &target, EngineID parent, int indent, int side) + { + for (const auto &item : source) { + if (item.variant_id != parent || item.engine_id == parent) continue; + + const Engine *e = Engine::Get(item.engine_id); + EngineDisplayFlags flags = item.flags; + if (e->display_last_variant != INVALID_ENGINE) flags &= ~EngineDisplayFlags::Shaded; + target.emplace_back(e->display_last_variant == INVALID_ENGINE ? item.engine_id : e->display_last_variant, item.engine_id, flags, indent); + + /* Add variants if not folded */ + if ((item.flags & (EngineDisplayFlags::HasVariants | EngineDisplayFlags::IsFolded)) == EngineDisplayFlags::HasVariants) { + /* Add this engine again as a child */ + if ((item.flags & EngineDisplayFlags::Shaded) == EngineDisplayFlags::None) { + target.emplace_back(item.engine_id, item.engine_id, EngineDisplayFlags::None, indent + 1); + } + AddChildren(source, target, item.engine_id, indent + 1, side); + } + } + } /** * Generate an engines list @@ -120,12 +140,12 @@ class ReplaceVehicleWindow : public Window { */ void GenerateReplaceVehList(bool draw_left) { + std::vector variants; EngineID selected_engine = INVALID_ENGINE; VehicleType type = (VehicleType)this->window_number; byte side = draw_left ? 0 : 1; - GUIEngineList *list = &this->engines[side]; - list->clear(); + GUIEngineList list; for (const Engine *e : Engine::IterateType(type)) { if (!draw_left && !this->show_hidden_engines && e->IsHidden(_local_company)) continue; @@ -155,15 +175,37 @@ class ReplaceVehicleWindow : public Window { if (!CheckAutoreplaceValidity(this->sel_engine[0], eid, _local_company)) continue; } - list->push_back(eid); + EngineDisplayFlags flags = (side == 0) ? EngineDisplayFlags::None : e->display_flags; + if (side == 1 && eid == this->sel_engine[0]) flags |= EngineDisplayFlags::Shaded; + list.emplace_back(eid, e->info.variant_id, flags, 0); + + if (side == 1 && e->info.variant_id != INVALID_ENGINE) variants.push_back(e->info.variant_id); if (eid == this->sel_engine[side]) selected_engine = eid; // The selected engine is still in the list } + + if (side == 1) { + /* ensure primary engine of variant group is in list */ + for (const auto &variant : variants) { + if (std::find(list.begin(), list.end(), variant) == list.end()) { + const Engine *e = Engine::Get(variant); + list.emplace_back(variant, e->info.variant_id, e->display_flags | EngineDisplayFlags::Shaded, 0); + } + } + } + this->sel_engine[side] = selected_engine; // update which engine we selected (the same or none, if it's not in the list anymore) if (draw_left) { - EngList_Sort(list, &EngineNumberSorter); + EngList_Sort(&list, &EngineNumberSorter); } else { _engine_sort_direction = this->descending_sort_order; - EngList_Sort(list, _engine_sort_functions[this->window_number][this->sort_criteria]); + EngList_Sort(&list, _engine_sort_functions[this->window_number][this->sort_criteria]); + } + + this->engines[side].clear(); + if (side == 1) { + AddChildren(list, this->engines[side], INVALID_ENGINE, 0, side); + } else { + this->engines[side].swap(list); } } @@ -177,7 +219,7 @@ class ReplaceVehicleWindow : public Window { this->GenerateReplaceVehList(true); this->vscroll[0]->SetCount((uint)this->engines[0].size()); if (this->reset_sel_engine && this->sel_engine[0] == INVALID_ENGINE && this->engines[0].size() != 0) { - this->sel_engine[0] = this->engines[0][0]; + this->sel_engine[0] = this->engines[0][0].engine_id; } } @@ -198,8 +240,8 @@ class ReplaceVehicleWindow : public Window { this->vscroll[1]->SetCount((uint)this->engines[1].size()); if (this->reset_sel_engine && this->sel_engine[1] != INVALID_ENGINE) { int position = 0; - for (EngineID &eid : this->engines[1]) { - if (eid == this->sel_engine[1]) break; + for (const auto &item : this->engines[1]) { + if (item.engine_id == this->sel_engine[1]) break; ++position; } this->vscroll[1]->ScrollTowards(position); @@ -304,8 +346,8 @@ public: case WID_RV_INFO_TAB: { Dimension d = GetStringBoundingBox(STR_REPLACE_NOT_REPLACING); d = maxdim(d, GetStringBoundingBox(STR_REPLACE_NOT_REPLACING_VEHICLE_SELECTED)); - d.width += WD_FRAMETEXT_LEFT + WD_FRAMETEXT_RIGHT; - d.height += WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; + d.width += padding.width; + d.height += padding.height; *size = maxdim(*size, d); break; } @@ -422,7 +464,7 @@ public: str = STR_REPLACE_NOT_REPLACING_VEHICLE_SELECTED; } - DrawString(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, r.top + WD_FRAMERECT_TOP, str, TC_BLACK, SA_HOR_CENTER); + DrawString(r.Shrink(WidgetDimensions::scaled.frametext, WidgetDimensions::scaled.framerect), str, TC_BLACK, SA_HOR_CENTER); break; } @@ -433,8 +475,7 @@ public: EngineID end = static_cast(std::min(this->vscroll[side]->GetCapacity() + start, this->engines[side].size())); /* Do the actual drawing */ - DrawEngineList((VehicleType)this->window_number, r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, - &this->engines[side], start, end, this->sel_engine[side], side == 0, this->sel_group); + DrawEngineList((VehicleType)this->window_number, r, this->engines[side], start, end, this->sel_engine[side], side == 0, this->sel_group); break; } } @@ -485,10 +526,10 @@ public: ted.cargo = e->GetDefaultCargoType(); ted.capacity = e->GetDisplayDefaultCapacity(&ted.mail_capacity); - NWidgetBase *nwi = this->GetWidget(side == 0 ? WID_RV_LEFT_DETAILS : WID_RV_RIGHT_DETAILS); - int text_end = DrawVehiclePurchaseInfo(nwi->pos_x + WD_FRAMETEXT_LEFT, nwi->pos_x + nwi->current_x - WD_FRAMETEXT_RIGHT, - nwi->pos_y + WD_FRAMERECT_TOP, this->sel_engine[side], ted); - needed_height = std::max(needed_height, (text_end - (int)nwi->pos_y - WD_FRAMERECT_TOP) / FONT_HEIGHT_NORMAL); + const Rect r = this->GetWidget(side == 0 ? WID_RV_LEFT_DETAILS : WID_RV_RIGHT_DETAILS)->GetCurrentRect() + .Shrink(WidgetDimensions::scaled.frametext, WidgetDimensions::scaled.framerect); + int text_end = DrawVehiclePurchaseInfo(r.left, r.right, r.top, this->sel_engine[side], ted); + needed_height = std::max(needed_height, (text_end - r.top) / FONT_HEIGHT_NORMAL); } } if (needed_height != this->details_height) { // Details window are not high enough, enlarge them. @@ -580,7 +621,22 @@ public: uint i = this->vscroll[click_side]->GetScrolledRowFromWidget(pt.y, this, widget); size_t engine_count = this->engines[click_side].size(); - EngineID e = engine_count > i ? this->engines[click_side][i] : INVALID_ENGINE; + EngineID e = INVALID_ENGINE; + if (i < engine_count) { + const auto &item = this->engines[click_side][i]; + const Rect r = this->GetWidget(widget)->GetCurrentRect().Shrink(WidgetDimensions::scaled.matrix).WithWidth(WidgetDimensions::scaled.hsep_indent * (item.indent + 1), _current_text_dir == TD_RTL); + if ((item.flags & EngineDisplayFlags::HasVariants) != EngineDisplayFlags::None && IsInsideMM(r.left, r.right, pt.x)) { + /* toggle folded flag on engine */ + assert(item.variant_id != INVALID_ENGINE); + Engine *engine = Engine::Get(item.variant_id); + engine->display_flags ^= EngineDisplayFlags::IsFolded; + + InvalidateWindowData(WC_REPLACE_VEHICLE, (VehicleType)this->window_number, 0); // Update the autoreplace window + InvalidateWindowClassesData(WC_BUILD_VEHICLE); // The build windows needs updating as well + return; + } + if ((item.flags & EngineDisplayFlags::Shaded) == EngineDisplayFlags::None) e = item.engine_id; + } /* If Ctrl is pressed on the left side and we don't have any engines of the selected type, stop autoreplacing. * This is most common when we have finished autoreplacing the engine and want to remove it from the list. */ diff --git a/src/base_station_base.h b/src/base_station_base.h index 40543f1b8f..2ad09ca21c 100644 --- a/src/base_station_base.h +++ b/src/base_station_base.h @@ -62,8 +62,7 @@ struct BaseStation : StationPool::PoolItem<&_station_pool> { Owner owner; ///< The owner of this station StationFacility facilities; ///< The facilities that this station has - uint8 num_specs; ///< Number of specs in the speclist - StationSpecList *speclist; ///< List of station specs of this station + std::vector speclist; ///< List of rail station specs of this station. Date build_date; ///< Date of construction diff --git a/src/bitmap_type.h b/src/bitmap_type.h index 99c29bf181..75f9ab6642 100644 --- a/src/bitmap_type.h +++ b/src/bitmap_type.h @@ -58,8 +58,8 @@ public: void Initialize(const Rect &r) { this->tile = TileXY(r.left, r.top); - this->w = r.right - r.left + 1; - this->h = r.bottom - r.top + 1; + this->w = r.Width(); + this->h = r.Height(); this->data.clear(); this->data.resize(Index(w, h)); } diff --git a/src/blitter/40bpp_anim.cpp b/src/blitter/40bpp_anim.cpp index d29b34a179..fe805a23e9 100644 --- a/src/blitter/40bpp_anim.cpp +++ b/src/blitter/40bpp_anim.cpp @@ -1,5 +1,3 @@ -/* $Id$ */ - /* * This file is part of OpenTTD. * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. diff --git a/src/blitter/40bpp_anim.hpp b/src/blitter/40bpp_anim.hpp index c0bea15ae0..6687809593 100644 --- a/src/blitter/40bpp_anim.hpp +++ b/src/blitter/40bpp_anim.hpp @@ -1,5 +1,3 @@ -/* $Id$ */ - /* * This file is part of OpenTTD. * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. diff --git a/src/bootstrap_gui.cpp b/src/bootstrap_gui.cpp index ddfda8f50b..a1ae02acf6 100644 --- a/src/bootstrap_gui.cpp +++ b/src/bootstrap_gui.cpp @@ -101,14 +101,14 @@ public: { if (widget == WID_BEM_MESSAGE) { *size = GetStringBoundingBox(STR_MISSING_GRAPHICS_ERROR); - size->height = GetStringHeight(STR_MISSING_GRAPHICS_ERROR, size->width - WD_FRAMETEXT_LEFT - WD_FRAMETEXT_RIGHT) + WD_FRAMETEXT_BOTTOM + WD_FRAMETEXT_TOP; + size->height = GetStringHeight(STR_MISSING_GRAPHICS_ERROR, size->width - WidgetDimensions::scaled.frametext.Horizontal()) + WidgetDimensions::scaled.frametext.Vertical(); } } void DrawWidget(const Rect &r, int widget) const override { if (widget == WID_BEM_MESSAGE) { - DrawStringMultiLine(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, r.top + WD_FRAMETEXT_TOP, r.bottom - WD_FRAMETEXT_BOTTOM, STR_MISSING_GRAPHICS_ERROR, TC_FROMSTRING, SA_CENTER); + DrawStringMultiLine(r.Shrink(WidgetDimensions::scaled.frametext), STR_MISSING_GRAPHICS_ERROR, TC_FROMSTRING, SA_CENTER); } } @@ -123,8 +123,11 @@ public: /** Nested widgets for the download window. */ static const NWidgetPart _nested_bootstrap_download_status_window_widgets[] = { NWidget(WWT_CAPTION, COLOUR_GREY), SetDataTip(STR_CONTENT_DOWNLOAD_TITLE, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), - NWidget(WWT_PANEL, COLOUR_GREY, WID_NCDS_BACKGROUND), - NWidget(NWID_SPACER), SetMinimalSize(350, 0), SetMinimalTextLines(3, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM + 30), + NWidget(WWT_PANEL, COLOUR_GREY), + NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_wide, 0), SetPadding(WidgetDimensions::unscaled.modalpopup), + NWidget(WWT_EMPTY, INVALID_COLOUR, WID_NCDS_PROGRESS_BAR), SetFill(1, 0), + NWidget(WWT_EMPTY, INVALID_COLOUR, WID_NCDS_PROGRESS_TEXT), SetFill(1, 0), SetMinimalSize(350, 0), + EndContainer(), EndContainer(), }; @@ -214,15 +217,15 @@ public: /* We cache the button size. This is safe as no reinit can happen here. */ if (this->button_size.width == 0) { this->button_size = maxdim(GetStringBoundingBox(STR_MISSING_GRAPHICS_YES_DOWNLOAD), GetStringBoundingBox(STR_MISSING_GRAPHICS_NO_QUIT)); - this->button_size.width += WD_FRAMETEXT_LEFT + WD_FRAMETEXT_RIGHT; - this->button_size.height += WD_FRAMETEXT_TOP + WD_FRAMETEXT_BOTTOM; + this->button_size.width += WidgetDimensions::scaled.frametext.Horizontal(); + this->button_size.height += WidgetDimensions::scaled.frametext.Vertical(); } switch (widget) { case WID_BAFD_QUESTION: /* The question is twice as wide as the buttons, and determine the height based on the width. */ size->width = this->button_size.width * 2; - size->height = GetStringHeight(STR_MISSING_GRAPHICS_SET_MESSAGE, size->width - WD_FRAMETEXT_LEFT - WD_FRAMETEXT_RIGHT) + WD_FRAMETEXT_BOTTOM + WD_FRAMETEXT_TOP; + size->height = GetStringHeight(STR_MISSING_GRAPHICS_SET_MESSAGE, size->width - WidgetDimensions::scaled.frametext.Horizontal()) + WidgetDimensions::scaled.frametext.Vertical(); break; case WID_BAFD_YES: @@ -236,7 +239,7 @@ public: { if (widget != 0) return; - DrawStringMultiLine(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, r.top + WD_FRAMETEXT_TOP, r.bottom - WD_FRAMETEXT_BOTTOM, STR_MISSING_GRAPHICS_SET_MESSAGE, TC_FROMSTRING, SA_CENTER); + DrawStringMultiLine(r.Shrink(WidgetDimensions::scaled.frametext), STR_MISSING_GRAPHICS_SET_MESSAGE, TC_FROMSTRING, SA_CENTER); } void OnClick(Point pt, int widget, int click_count) override diff --git a/src/bridge_gui.cpp b/src/bridge_gui.cpp index 515a9318c3..23ae9dbf82 100644 --- a/src/bridge_gui.cpp +++ b/src/bridge_gui.cpp @@ -194,10 +194,10 @@ public: } sprite_dim.height++; // Sprite is rendered one pixel down in the matrix field. text_dim.height++; // Allowing the bottom row pixels to be rendered on the edge of the matrix field. - resize->height = std::max(sprite_dim.height, text_dim.height) + 2; // Max of both sizes + account for matrix edges. + resize->height = std::max(sprite_dim.height, text_dim.height) + padding.height; // Max of both sizes + account for matrix edges. - this->bridgetext_offset = WD_MATRIX_LEFT + sprite_dim.width + 1; // Left edge of text, 1 pixel distance from the sprite. - size->width = this->bridgetext_offset + text_dim.width + WD_MATRIX_RIGHT; + this->bridgetext_offset = sprite_dim.width + WidgetDimensions::scaled.hsep_normal; // Left edge of text, 1 pixel distance from the sprite. + size->width = this->bridgetext_offset + text_dim.width + padding.width; size->height = 4 * resize->height; // Smallest bridge gui is 4 entries high in the matrix. break; } @@ -222,7 +222,7 @@ public: break; case WID_BBS_BRIDGE_LIST: { - uint y = r.top; + Rect tr = r.WithHeight(this->resize.step_height).Shrink(WidgetDimensions::scaled.matrix); for (int i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < (int)this->bridges->size(); i++) { const BridgeSpec *b = this->bridges->at(i).spec; @@ -230,10 +230,10 @@ public: SetDParam(1, b->speed); SetDParam(0, b->material); - DrawSprite(b->sprite, b->pal, r.left + WD_MATRIX_LEFT, y + this->resize.step_height - 1 - GetSpriteSize(b->sprite).height); - DrawStringMultiLine(r.left + this->bridgetext_offset, r.right, y + 2, y + this->resize.step_height, + DrawSprite(b->sprite, b->pal, tr.left, tr.bottom - GetSpriteSize(b->sprite).height); + DrawStringMultiLine(tr.Indent(this->bridgetext_offset, false), _game_mode == GM_EDITOR ? STR_SELECT_BRIDGE_SCENEDIT_INFO : STR_SELECT_BRIDGE_INFO); - y += this->resize.step_height; + tr = tr.Translate(0, this->resize.step_height); } break; } diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index 04392c9b03..8b4802aea5 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -33,6 +33,7 @@ #include "engine_cmd.h" #include "train_cmd.h" #include "vehicle_cmd.h" +#include "zoom_func.h" #include "widgets/build_vehicle_widget.h" @@ -47,7 +48,7 @@ */ uint GetEngineListHeight(VehicleType type) { - return std::max(FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM, GetVehicleImageCellSize(type, EIT_PURCHASE).height); + return std::max(FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.matrix.Vertical(), GetVehicleImageCellSize(type, EIT_PURCHASE).height); } static const NWidgetPart _nested_build_vehicle_widgets[] = { @@ -105,9 +106,9 @@ static CargoID _engine_sort_last_cargo_criteria[] = {CF_ANY, CF_ANY, CF_ANY, CF_ * @param b second engine to compare * @return for descending order: returns true if a < b. Vice versa for ascending order */ -static bool EngineNumberSorter(const EngineID &a, const EngineID &b) +static bool EngineNumberSorter(const GUIEngineListItem &a, const GUIEngineListItem &b) { - int r = Engine::Get(a)->list_position - Engine::Get(b)->list_position; + int r = Engine::Get(a.engine_id)->list_position - Engine::Get(b.engine_id)->list_position; return _engine_sort_direction ? r > 0 : r < 0; } @@ -118,10 +119,10 @@ static bool EngineNumberSorter(const EngineID &a, const EngineID &b) * @param b second engine to compare * @return for descending order: returns true if a < b. Vice versa for ascending order */ -static bool EngineIntroDateSorter(const EngineID &a, const EngineID &b) +static bool EngineIntroDateSorter(const GUIEngineListItem &a, const GUIEngineListItem &b) { - const int va = Engine::Get(a)->intro_date; - const int vb = Engine::Get(b)->intro_date; + const int va = Engine::Get(a.engine_id)->intro_date; + const int vb = Engine::Get(b.engine_id)->intro_date; const int r = va - vb; /* Use EngineID to sort instead since we want consistent sorting */ @@ -138,19 +139,19 @@ static EngineID _last_engine[2] = { INVALID_ENGINE, INVALID_ENGINE }; * @param b second engine to compare * @return for descending order: returns true if a < b. Vice versa for ascending order */ -static bool EngineNameSorter(const EngineID &a, const EngineID &b) +static bool EngineNameSorter(const GUIEngineListItem &a, const GUIEngineListItem &b) { static char last_name[2][64] = { "", "" }; - if (a != _last_engine[0]) { - _last_engine[0] = a; - SetDParam(0, a); + if (a.engine_id != _last_engine[0]) { + _last_engine[0] = a.engine_id; + SetDParam(0, a.engine_id); GetString(last_name[0], STR_ENGINE_NAME, lastof(last_name[0])); } - if (b != _last_engine[1]) { - _last_engine[1] = b; - SetDParam(0, b); + if (b.engine_id != _last_engine[1]) { + _last_engine[1] = b.engine_id; + SetDParam(0, b.engine_id); GetString(last_name[1], STR_ENGINE_NAME, lastof(last_name[1])); } @@ -167,10 +168,10 @@ static bool EngineNameSorter(const EngineID &a, const EngineID &b) * @param b second engine to compare * @return for descending order: returns true if a < b. Vice versa for ascending order */ -static bool EngineReliabilitySorter(const EngineID &a, const EngineID &b) +static bool EngineReliabilitySorter(const GUIEngineListItem &a, const GUIEngineListItem &b) { - const int va = Engine::Get(a)->reliability; - const int vb = Engine::Get(b)->reliability; + const int va = Engine::Get(a.engine_id)->reliability; + const int vb = Engine::Get(b.engine_id)->reliability; const int r = va - vb; /* Use EngineID to sort instead since we want consistent sorting */ @@ -184,10 +185,10 @@ static bool EngineReliabilitySorter(const EngineID &a, const EngineID &b) * @param b second engine to compare * @return for descending order: returns true if a < b. Vice versa for ascending order */ -static bool EngineCostSorter(const EngineID &a, const EngineID &b) +static bool EngineCostSorter(const GUIEngineListItem &a, const GUIEngineListItem &b) { - Money va = Engine::Get(a)->GetCost(); - Money vb = Engine::Get(b)->GetCost(); + Money va = Engine::Get(a.engine_id)->GetCost(); + Money vb = Engine::Get(b.engine_id)->GetCost(); int r = ClampToI32(va - vb); /* Use EngineID to sort instead since we want consistent sorting */ @@ -201,10 +202,10 @@ static bool EngineCostSorter(const EngineID &a, const EngineID &b) * @param b second engine to compare * @return for descending order: returns true if a < b. Vice versa for ascending order */ -static bool EngineSpeedSorter(const EngineID &a, const EngineID &b) +static bool EngineSpeedSorter(const GUIEngineListItem &a, const GUIEngineListItem &b) { - int va = Engine::Get(a)->GetDisplayMaxSpeed(); - int vb = Engine::Get(b)->GetDisplayMaxSpeed(); + int va = Engine::Get(a.engine_id)->GetDisplayMaxSpeed(); + int vb = Engine::Get(b.engine_id)->GetDisplayMaxSpeed(); int r = va - vb; /* Use EngineID to sort instead since we want consistent sorting */ @@ -218,10 +219,10 @@ static bool EngineSpeedSorter(const EngineID &a, const EngineID &b) * @param b second engine to compare * @return for descending order: returns true if a < b. Vice versa for ascending order */ -static bool EnginePowerSorter(const EngineID &a, const EngineID &b) +static bool EnginePowerSorter(const GUIEngineListItem &a, const GUIEngineListItem &b) { - int va = Engine::Get(a)->GetPower(); - int vb = Engine::Get(b)->GetPower(); + int va = Engine::Get(a.engine_id)->GetPower(); + int vb = Engine::Get(b.engine_id)->GetPower(); int r = va - vb; /* Use EngineID to sort instead since we want consistent sorting */ @@ -235,10 +236,10 @@ static bool EnginePowerSorter(const EngineID &a, const EngineID &b) * @param b second engine to compare * @return for descending order: returns true if a < b. Vice versa for ascending order */ -static bool EngineTractiveEffortSorter(const EngineID &a, const EngineID &b) +static bool EngineTractiveEffortSorter(const GUIEngineListItem &a, const GUIEngineListItem &b) { - int va = Engine::Get(a)->GetDisplayMaxTractiveEffort(); - int vb = Engine::Get(b)->GetDisplayMaxTractiveEffort(); + int va = Engine::Get(a.engine_id)->GetDisplayMaxTractiveEffort(); + int vb = Engine::Get(b.engine_id)->GetDisplayMaxTractiveEffort(); int r = va - vb; /* Use EngineID to sort instead since we want consistent sorting */ @@ -252,10 +253,10 @@ static bool EngineTractiveEffortSorter(const EngineID &a, const EngineID &b) * @param b second engine to compare * @return for descending order: returns true if a < b. Vice versa for ascending order */ -static bool EngineRunningCostSorter(const EngineID &a, const EngineID &b) +static bool EngineRunningCostSorter(const GUIEngineListItem &a, const GUIEngineListItem &b) { - Money va = Engine::Get(a)->GetRunningCost(); - Money vb = Engine::Get(b)->GetRunningCost(); + Money va = Engine::Get(a.engine_id)->GetRunningCost(); + Money vb = Engine::Get(b.engine_id)->GetRunningCost(); int r = ClampToI32(va - vb); /* Use EngineID to sort instead since we want consistent sorting */ @@ -269,10 +270,10 @@ static bool EngineRunningCostSorter(const EngineID &a, const EngineID &b) * @param b second engine to compare * @return for descending order: returns true if a < b. Vice versa for ascending order */ -static bool EnginePowerVsRunningCostSorter(const EngineID &a, const EngineID &b) +static bool EnginePowerVsRunningCostSorter(const GUIEngineListItem &a, const GUIEngineListItem &b) { - const Engine *e_a = Engine::Get(a); - const Engine *e_b = Engine::Get(b); + const Engine *e_a = Engine::Get(a.engine_id); + const Engine *e_b = Engine::Get(b.engine_id); uint p_a = e_a->GetPower(); uint p_b = e_b->GetPower(); Money r_a = e_a->GetRunningCost(); @@ -311,13 +312,13 @@ static bool EnginePowerVsRunningCostSorter(const EngineID &a, const EngineID &b) * @param b second engine to compare * @return for descending order: returns true if a < b. Vice versa for ascending order */ -static bool TrainEngineCapacitySorter(const EngineID &a, const EngineID &b) +static bool TrainEngineCapacitySorter(const GUIEngineListItem &a, const GUIEngineListItem &b) { - const RailVehicleInfo *rvi_a = RailVehInfo(a); - const RailVehicleInfo *rvi_b = RailVehInfo(b); + const RailVehicleInfo *rvi_a = RailVehInfo(a.engine_id); + const RailVehicleInfo *rvi_b = RailVehInfo(b.engine_id); - int va = GetTotalCapacityOfArticulatedParts(a) * (rvi_a->railveh_type == RAILVEH_MULTIHEAD ? 2 : 1); - int vb = GetTotalCapacityOfArticulatedParts(b) * (rvi_b->railveh_type == RAILVEH_MULTIHEAD ? 2 : 1); + int va = GetTotalCapacityOfArticulatedParts(a.engine_id) * (rvi_a->railveh_type == RAILVEH_MULTIHEAD ? 2 : 1); + int vb = GetTotalCapacityOfArticulatedParts(b.engine_id) * (rvi_b->railveh_type == RAILVEH_MULTIHEAD ? 2 : 1); int r = va - vb; /* Use EngineID to sort instead since we want consistent sorting */ @@ -331,10 +332,10 @@ static bool TrainEngineCapacitySorter(const EngineID &a, const EngineID &b) * @param b second engine to compare * @return for descending order: returns true if a < b. Vice versa for ascending order */ -static bool TrainEnginesThenWagonsSorter(const EngineID &a, const EngineID &b) +static bool TrainEnginesThenWagonsSorter(const GUIEngineListItem &a, const GUIEngineListItem &b) { - int val_a = (RailVehInfo(a)->railveh_type == RAILVEH_WAGON ? 1 : 0); - int val_b = (RailVehInfo(b)->railveh_type == RAILVEH_WAGON ? 1 : 0); + int val_a = (RailVehInfo(a.engine_id)->railveh_type == RAILVEH_WAGON ? 1 : 0); + int val_b = (RailVehInfo(b.engine_id)->railveh_type == RAILVEH_WAGON ? 1 : 0); int r = val_a - val_b; /* Use EngineID to sort instead since we want consistent sorting */ @@ -350,10 +351,10 @@ static bool TrainEnginesThenWagonsSorter(const EngineID &a, const EngineID &b) * @param b second engine to compare * @return for descending order: returns true if a < b. Vice versa for ascending order */ -static bool RoadVehEngineCapacitySorter(const EngineID &a, const EngineID &b) +static bool RoadVehEngineCapacitySorter(const GUIEngineListItem &a, const GUIEngineListItem &b) { - int va = GetTotalCapacityOfArticulatedParts(a); - int vb = GetTotalCapacityOfArticulatedParts(b); + int va = GetTotalCapacityOfArticulatedParts(a.engine_id); + int vb = GetTotalCapacityOfArticulatedParts(b.engine_id); int r = va - vb; /* Use EngineID to sort instead since we want consistent sorting */ @@ -369,10 +370,10 @@ static bool RoadVehEngineCapacitySorter(const EngineID &a, const EngineID &b) * @param b second engine to compare * @return for descending order: returns true if a < b. Vice versa for ascending order */ -static bool ShipEngineCapacitySorter(const EngineID &a, const EngineID &b) +static bool ShipEngineCapacitySorter(const GUIEngineListItem &a, const GUIEngineListItem &b) { - const Engine *e_a = Engine::Get(a); - const Engine *e_b = Engine::Get(b); + const Engine *e_a = Engine::Get(a.engine_id); + const Engine *e_b = Engine::Get(b.engine_id); int va = e_a->GetDisplayDefaultCapacity(); int vb = e_b->GetDisplayDefaultCapacity(); @@ -391,10 +392,10 @@ static bool ShipEngineCapacitySorter(const EngineID &a, const EngineID &b) * @param b second engine to compare * @return for descending order: returns true if a < b. Vice versa for ascending order */ -static bool AircraftEngineCargoSorter(const EngineID &a, const EngineID &b) +static bool AircraftEngineCargoSorter(const GUIEngineListItem &a, const GUIEngineListItem &b) { - const Engine *e_a = Engine::Get(a); - const Engine *e_b = Engine::Get(b); + const Engine *e_a = Engine::Get(a.engine_id); + const Engine *e_b = Engine::Get(b.engine_id); uint16 mail_a, mail_b; int va = e_a->GetDisplayDefaultCapacity(&mail_a); @@ -419,10 +420,10 @@ static bool AircraftEngineCargoSorter(const EngineID &a, const EngineID &b) * @param b second engine to compare * @return for descending order: returns true if a < b. Vice versa for ascending order */ -static bool AircraftRangeSorter(const EngineID &a, const EngineID &b) +static bool AircraftRangeSorter(const GUIEngineListItem &a, const GUIEngineListItem &b) { - uint16 r_a = Engine::Get(a)->GetRange(); - uint16 r_b = Engine::Get(b)->GetRange(); + uint16 r_a = Engine::Get(a.engine_id)->GetRange(); + uint16 r_b = Engine::Get(b.engine_id)->GetRange(); int r = r_a - r_b; @@ -536,14 +537,14 @@ const StringID _engine_sort_listing[][12] = {{ }}; /** Filters vehicles by cargo and engine (in case of rail vehicle). */ -static bool CDECL CargoAndEngineFilter(const EngineID *eid, const CargoID cid) +static bool CDECL CargoAndEngineFilter(const GUIEngineListItem *item, const CargoID cid) { if (cid == CF_ANY) { return true; } else if (cid == CF_ENGINES) { - return Engine::Get(*eid)->GetPower() != 0; + return Engine::Get(item->engine_id)->GetPower() != 0; } else { - CargoTypes refit_mask = GetUnionOfArticulatedRefitMasks(*eid, true) & _standard_cargo_mask; + CargoTypes refit_mask = GetUnionOfArticulatedRefitMasks(item->engine_id, true) & _standard_cargo_mask; return (cid == CF_NONE ? refit_mask == 0 : HasBit(refit_mask, cid)); } } @@ -590,7 +591,7 @@ static int DrawRailWagonPurchaseInfo(int left, int right, int y, EngineID engine /* Wagon weight - (including cargo) */ uint weight = e->GetDisplayWeight(); SetDParam(0, weight); - uint cargo_weight = (e->CanCarryCargo() ? CargoSpec::Get(te.cargo)->weight * te.capacity / 16 : 0); + uint cargo_weight = (e->CanCarryCargo() ? CargoSpec::Get(te.cargo)->WeightOfNUnitsInTrain(te.capacity) : 0); SetDParam(1, cargo_weight + weight); DrawString(left, right, y, STR_PURCHASE_INFO_WEIGHT_CWEIGHT); y += FONT_HEIGHT_NORMAL; @@ -684,7 +685,7 @@ static int DrawRoadVehPurchaseInfo(int left, int right, int y, EngineID engine_n /* Road vehicle weight - (including cargo) */ int16 weight = e->GetDisplayWeight(); SetDParam(0, weight); - uint cargo_weight = (e->CanCarryCargo() ? CargoSpec::Get(te.cargo)->weight * te.capacity / 16 : 0); + uint cargo_weight = (e->CanCarryCargo() ? CargoSpec::Get(te.cargo)->WeightOfNUnits(te.capacity) : 0); SetDParam(1, cargo_weight + weight); DrawString(left, right, y, STR_PURCHASE_INFO_WEIGHT_CWEIGHT); y += FONT_HEIGHT_NORMAL; @@ -953,9 +954,7 @@ int DrawVehiclePurchaseInfo(int left, int right, int y, EngineID engine_number, /** * Engine drawing loop * @param type Type of vehicle (VEH_*) - * @param l The left most location of the list - * @param r The right most location of the list - * @param y The top most location of the list + * @param r The Rect of the list * @param eng_list What engines to draw * @param min where to start in the list * @param max where in the list to end @@ -963,21 +962,23 @@ int DrawVehiclePurchaseInfo(int left, int right, int y, EngineID engine_number, * @param show_count Whether to show the amount of engines or not * @param selected_group the group to list the engines of */ -void DrawEngineList(VehicleType type, int l, int r, int y, const GUIEngineList *eng_list, uint16 min, uint16 max, EngineID selected_id, bool show_count, GroupID selected_group) +void DrawEngineList(VehicleType type, const Rect &r, const GUIEngineList &eng_list, uint16 min, uint16 max, EngineID selected_id, bool show_count, GroupID selected_group) { static const int sprite_y_offsets[] = { -1, -1, -2, -2 }; /* Obligatory sanity checks! */ - assert(max <= eng_list->size()); + assert(max <= eng_list.size()); bool rtl = _current_text_dir == TD_RTL; int step_size = GetEngineListHeight(type); int sprite_left = GetVehicleImageCellSize(type, EIT_PURCHASE).extend_left; int sprite_right = GetVehicleImageCellSize(type, EIT_PURCHASE).extend_right; int sprite_width = sprite_left + sprite_right; + int circle_width = std::max(GetScaledSpriteSize(SPR_CIRCLE_FOLDED).width, GetScaledSpriteSize(SPR_CIRCLE_UNFOLDED).width); + int linecolour = _colour_gradient[COLOUR_ORANGE][4]; - int sprite_x = rtl ? r - sprite_right - 1 : l + sprite_left + 1; - int sprite_y_offset = sprite_y_offsets[type] + step_size / 2; + Rect ir = r.WithHeight(step_size).Shrink(WidgetDimensions::scaled.matrix); + int sprite_y_offset = ScaleSpriteTrad(sprite_y_offsets[type]) + ir.Height() / 2; Dimension replace_icon = {0, 0}; int count_width = 0; @@ -987,33 +988,51 @@ void DrawEngineList(VehicleType type, int l, int r, int y, const GUIEngineList * count_width = GetStringBoundingBox(STR_TINY_BLACK_COMA).width; } - int text_left = l + (rtl ? WD_FRAMERECT_LEFT + replace_icon.width + 8 + count_width : sprite_width + WD_FRAMETEXT_LEFT); - int text_right = r - (rtl ? sprite_width + WD_FRAMETEXT_RIGHT : WD_FRAMERECT_RIGHT + replace_icon.width + 8 + count_width); - int replace_icon_left = rtl ? l + WD_FRAMERECT_LEFT : r - WD_FRAMERECT_RIGHT - replace_icon.width; - int count_left = l; - int count_right = rtl ? text_left : r - WD_FRAMERECT_RIGHT - replace_icon.width - 8; + Rect tr = ir.Indent(circle_width + WidgetDimensions::scaled.hsep_normal + sprite_width + WidgetDimensions::scaled.hsep_wide, rtl); // Name position + Rect cr = tr.Indent(replace_icon.width + WidgetDimensions::scaled.hsep_wide, !rtl).WithWidth(count_width, !rtl); // Count position + Rect rr = tr.WithWidth(replace_icon.width, !rtl); // Replace icon position + if (show_count) tr = tr.Indent(count_width + WidgetDimensions::scaled.hsep_normal + replace_icon.width + WidgetDimensions::scaled.hsep_wide, !rtl); - int normal_text_y_offset = (step_size - FONT_HEIGHT_NORMAL) / 2; - int small_text_y_offset = step_size - FONT_HEIGHT_SMALL - WD_FRAMERECT_BOTTOM - 1; - int replace_icon_y_offset = (step_size - replace_icon.height) / 2 - 1; + int normal_text_y_offset = (ir.Height() - FONT_HEIGHT_NORMAL) / 2; + int small_text_y_offset = ir.Height() - FONT_HEIGHT_SMALL; + int replace_icon_y_offset = (ir.Height() - replace_icon.height) / 2; + int y = ir.top; for (; min < max; min++, y += step_size) { - const EngineID engine = (*eng_list)[min]; + const auto &item = eng_list[min]; + uint indent = item.indent * WidgetDimensions::scaled.hsep_indent; + bool has_variants = (item.flags & EngineDisplayFlags::HasVariants) != EngineDisplayFlags::None; + bool is_folded = (item.flags & EngineDisplayFlags::IsFolded) != EngineDisplayFlags::None; + bool shaded = (item.flags & EngineDisplayFlags::Shaded) != EngineDisplayFlags::None; /* Note: num_engines is only used in the autoreplace GUI, so it is correct to use _local_company here. */ - const uint num_engines = GetGroupNumEngines(_local_company, selected_group, engine); + const uint num_engines = GetGroupNumEngines(_local_company, selected_group, item.engine_id); - const Engine *e = Engine::Get(engine); + const Engine *e = Engine::Get(item.engine_id); bool hidden = HasBit(e->company_hidden, _local_company); StringID str = hidden ? STR_HIDDEN_ENGINE_NAME : STR_ENGINE_NAME; - TextColour tc = (engine == selected_id) ? TC_WHITE : (TC_NO_SHADE | (hidden ? TC_GREY : TC_BLACK)); + TextColour tc = (item.engine_id == selected_id) ? TC_WHITE : (TC_NO_SHADE | ((hidden | shaded) ? TC_GREY : TC_BLACK)); - SetDParam(0, engine); - DrawString(text_left, text_right, y + normal_text_y_offset, str, tc); - DrawVehicleEngine(l, r, sprite_x, y + sprite_y_offset, engine, (show_count && num_engines == 0) ? PALETTE_CRASH : GetEnginePalette(engine, _local_company), EIT_PURCHASE); + SetDParam(0, item.engine_id); + Rect itr = tr.Indent(indent, rtl); + DrawString(itr.left, itr.right, y + normal_text_y_offset, str, tc); + int sprite_x = ir.Indent(indent + circle_width + WidgetDimensions::scaled.hsep_normal, rtl).WithWidth(sprite_width, rtl).left + sprite_left; + DrawVehicleEngine(r.left, r.right, sprite_x, y + sprite_y_offset, item.engine_id, (show_count && num_engines == 0) ? PALETTE_CRASH : GetEnginePalette(item.engine_id, _local_company), EIT_PURCHASE); if (show_count) { SetDParam(0, num_engines); - DrawString(count_left, count_right, y + small_text_y_offset, STR_TINY_BLACK_COMA, TC_FROMSTRING, SA_RIGHT | SA_FORCE); - if (EngineHasReplacementForCompany(Company::Get(_local_company), engine, selected_group)) DrawSprite(SPR_GROUP_REPLACE_ACTIVE, num_engines == 0 ? PALETTE_CRASH : PAL_NONE, replace_icon_left, y + replace_icon_y_offset); + DrawString(cr.left, cr.right, y + small_text_y_offset, STR_TINY_BLACK_COMA, TC_FROMSTRING, SA_RIGHT | SA_FORCE); + if (EngineHasReplacementForCompany(Company::Get(_local_company), item.engine_id, selected_group)) DrawSprite(SPR_GROUP_REPLACE_ACTIVE, num_engines == 0 ? PALETTE_CRASH : PAL_NONE, rr.left, y + replace_icon_y_offset); + } + if (has_variants) { + Rect fr = ir.Indent(indent, rtl).WithWidth(circle_width, rtl); + DrawSpriteIgnorePadding(is_folded ? SPR_CIRCLE_FOLDED : SPR_CIRCLE_UNFOLDED, PAL_NONE, {fr.left, y, fr.right, y + ir.Height() - 1}, false, SA_CENTER); + } + if (indent > 0) { + /* Draw tree lines */ + Rect fr = ir.Indent(indent - WidgetDimensions::scaled.hsep_indent, rtl).WithWidth(circle_width, rtl); + int ycenter = y + normal_text_y_offset + FONT_HEIGHT_NORMAL / 2; + bool continues = (min + 1U) < eng_list.size() && eng_list[min + 1].indent == item.indent; + GfxDrawLine(fr.left + circle_width / 2, y - WidgetDimensions::scaled.matrix.top, fr.left + circle_width / 2, continues ? y - WidgetDimensions::scaled.matrix.top + step_size - 1 : ycenter, linecolour, WidgetDimensions::scaled.fullbevel.top); + GfxDrawLine(fr.left + circle_width / 2, ycenter, fr.right, ycenter, linecolour, WidgetDimensions::scaled.fullbevel.top); } } } @@ -1078,6 +1097,27 @@ struct BuildVehicleWindow : Window { } } + void AddChildren(const GUIEngineList &source, EngineID parent, int indent) + { + for (const auto &item : source) { + if (item.variant_id != parent || item.engine_id == parent) continue; + + const Engine *e = Engine::Get(item.engine_id); + EngineDisplayFlags flags = item.flags; + if (e->display_last_variant != INVALID_ENGINE) flags &= ~EngineDisplayFlags::Shaded; + this->eng_list.emplace_back(e->display_last_variant == INVALID_ENGINE ? item.engine_id : e->display_last_variant, item.engine_id, flags, indent); + + /* Add variants if not folded */ + if ((item.flags & (EngineDisplayFlags::HasVariants | EngineDisplayFlags::IsFolded)) == EngineDisplayFlags::HasVariants) { + /* Add this engine again as a child */ + if ((item.flags & EngineDisplayFlags::Shaded) == EngineDisplayFlags::None) { + this->eng_list.emplace_back(item.engine_id, item.engine_id, EngineDisplayFlags::None, indent + 1); + } + AddChildren(source, item.engine_id, indent + 1); + } + } + } + BuildVehicleWindow(WindowDesc *desc, TileIndex tile, VehicleType type) : Window(desc) { this->vehicle_type = type; @@ -1125,7 +1165,7 @@ struct BuildVehicleWindow : Window { this->GenerateBuildList(); // generate the list, since we need it in the next line /* Select the first engine in the list as default when opening the window */ if (this->eng_list.size() > 0) { - this->SelectEngine(this->eng_list[0]); + this->SelectEngine(this->eng_list[0].engine_id); } else { this->SelectEngine(INVALID_ENGINE); } @@ -1257,7 +1297,7 @@ struct BuildVehicleWindow : Window { if (0 == this->eng_list.size()) { // no engine passed through the filter, invalidate the previously selected engine this->SelectEngine(INVALID_ENGINE); } else if (std::find(this->eng_list.begin(), this->eng_list.end(), this->sel_engine) == this->eng_list.end()) { // previously selected engine didn't pass the filter, select the first engine of the list - this->SelectEngine(this->eng_list[0]); + this->SelectEngine(this->eng_list[0].engine_id); } } @@ -1265,17 +1305,19 @@ struct BuildVehicleWindow : Window { bool FilterSingleEngine(EngineID eid) { CargoID filter_type = this->cargo_filter[this->cargo_filter_criteria]; - return CargoAndEngineFilter(&eid, filter_type); + GUIEngineListItem item = {eid, eid, EngineDisplayFlags::None, 0}; + return CargoAndEngineFilter(&item, filter_type); } /* Figure out what train EngineIDs to put in the list */ - void GenerateBuildTrainList() + void GenerateBuildTrainList(GUIEngineList &list) { + std::vector variants; EngineID sel_id = INVALID_ENGINE; int num_engines = 0; int num_wagons = 0; - this->eng_list.clear(); + list.clear(); /* Make list of all available train engines and wagons. * Also check to see if the previously selected engine is still available, @@ -1292,7 +1334,7 @@ struct BuildVehicleWindow : Window { /* Filter now! So num_engines and num_wagons is valid */ if (!FilterSingleEngine(eid)) continue; - this->eng_list.push_back(eid); + list.emplace_back(eid, e->info.variant_id, e->display_flags, 0); if (rvi->railveh_type != RAILVEH_WAGON) { num_engines++; @@ -1300,9 +1342,18 @@ struct BuildVehicleWindow : Window { num_wagons++; } + if (e->info.variant_id != eid && e->info.variant_id != INVALID_ENGINE) variants.push_back(e->info.variant_id); if (eid == this->sel_engine) sel_id = eid; } + /* ensure primary engine of variant group is in list */ + for (const auto &variant : variants) { + if (std::find(list.begin(), list.end(), variant) == list.end()) { + const Engine *e = Engine::Get(variant); + list.emplace_back(variant, e->info.variant_id, e->display_flags | EngineDisplayFlags::Shaded, 0); + } + } + this->SelectEngine(sel_id); /* invalidate cached values for name sorter - engine names could change */ @@ -1310,14 +1361,14 @@ struct BuildVehicleWindow : Window { /* make engines first, and then wagons, sorted by selected sort_criteria */ _engine_sort_direction = false; - EngList_Sort(&this->eng_list, TrainEnginesThenWagonsSorter); + EngList_Sort(&list, TrainEnginesThenWagonsSorter); /* and then sort engines */ _engine_sort_direction = this->descending_sort_order; - EngList_SortPartial(&this->eng_list, _engine_sort_functions[0][this->sort_criteria], 0, num_engines); + EngList_SortPartial(&list, _engine_sort_functions[0][this->sort_criteria], 0, num_engines); /* and finally sort wagons */ - EngList_SortPartial(&this->eng_list, _engine_sort_functions[0][this->sort_criteria], num_engines, num_wagons); + EngList_SortPartial(&list, _engine_sort_functions[0][this->sort_criteria], num_engines, num_wagons); } /* Figure out what road vehicle EngineIDs to put in the list */ @@ -1333,7 +1384,7 @@ struct BuildVehicleWindow : Window { if (!IsEngineBuildable(eid, VEH_ROAD, _local_company)) continue; if (this->filter.roadtype != INVALID_ROADTYPE && !HasPowerOnRoad(e->u.road.roadtype, this->filter.roadtype)) continue; - this->eng_list.push_back(eid); + this->eng_list.emplace_back(eid, e->info.variant_id, e->display_flags, 0); if (eid == this->sel_engine) sel_id = eid; } @@ -1350,7 +1401,7 @@ struct BuildVehicleWindow : Window { if (!this->show_hidden_engines && e->IsHidden(_local_company)) continue; EngineID eid = e->index; if (!IsEngineBuildable(eid, VEH_SHIP, _local_company)) continue; - this->eng_list.push_back(eid); + this->eng_list.emplace_back(eid, e->info.variant_id, e->display_flags, 0); if (eid == this->sel_engine) sel_id = eid; } @@ -1377,7 +1428,7 @@ struct BuildVehicleWindow : Window { /* First VEH_END window_numbers are fake to allow a window open for all different types at once */ if (!this->listview_mode && !CanVehicleUseStation(eid, st)) continue; - this->eng_list.push_back(eid); + this->eng_list.emplace_back(eid, e->info.variant_id, e->display_flags, 0); if (eid == this->sel_engine) sel_id = eid; } @@ -1392,13 +1443,18 @@ struct BuildVehicleWindow : Window { /* Update filter type in case the road/railtype of the depot got converted */ this->UpdateFilterByTile(); + this->eng_list.clear(); + + GUIEngineList list; + switch (this->vehicle_type) { default: NOT_REACHED(); case VEH_TRAIN: - this->GenerateBuildTrainList(); + this->GenerateBuildTrainList(list); + AddChildren(list, INVALID_ENGINE, 0); this->eng_list.shrink_to_fit(); this->eng_list.RebuildDone(); - return; // trains should not reach the last sorting + return; case VEH_ROAD: this->GenerateBuildRoadVehList(); break; @@ -1412,9 +1468,23 @@ struct BuildVehicleWindow : Window { this->FilterEngineList(); + /* ensure primary engine of variant group is in list after filtering */ + std::vector variants; + for (const auto &item : this->eng_list) { + if (item.engine_id != item.variant_id && item.variant_id != INVALID_ENGINE) variants.push_back(item.variant_id); + } + for (const auto &variant : variants) { + if (std::find(this->eng_list.begin(), this->eng_list.end(), variant) == this->eng_list.end()) { + const Engine *e = Engine::Get(variant); + this->eng_list.emplace_back(variant, e->info.variant_id, e->display_flags | EngineDisplayFlags::Shaded, 0); + } + } + _engine_sort_direction = this->descending_sort_order; EngList_Sort(&this->eng_list, _engine_sort_functions[this->vehicle_type][this->sort_criteria]); + this->eng_list.swap(list); + AddChildren(list, INVALID_ENGINE, 0); this->eng_list.shrink_to_fit(); this->eng_list.RebuildDone(); } @@ -1440,7 +1510,23 @@ struct BuildVehicleWindow : Window { case WID_BV_LIST: { uint i = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_BV_LIST); size_t num_items = this->eng_list.size(); - this->SelectEngine((i < num_items) ? this->eng_list[i] : INVALID_ENGINE); + EngineID e = INVALID_ENGINE; + if (i < num_items) { + const auto &item = this->eng_list[i]; + const Rect r = this->GetWidget(widget)->GetCurrentRect().Shrink(WidgetDimensions::scaled.matrix).WithWidth(WidgetDimensions::scaled.hsep_indent * (item.indent + 1), _current_text_dir == TD_RTL); + if ((item.flags & EngineDisplayFlags::HasVariants) != EngineDisplayFlags::None && IsInsideMM(r.left, r.right, pt.x)) { + /* toggle folded flag on engine */ + assert(item.variant_id != INVALID_ENGINE); + Engine *engine = Engine::Get(item.variant_id); + engine->display_flags ^= EngineDisplayFlags::IsFolded; + + InvalidateWindowData(WC_REPLACE_VEHICLE, this->vehicle_type, 0); // Update the autoreplace window + InvalidateWindowClassesData(WC_BUILD_VEHICLE); // The build windows needs updating as well + return; + } + if ((item.flags & EngineDisplayFlags::Shaded) == EngineDisplayFlags::None) e = item.engine_id; + } + this->SelectEngine(e); this->SetDirty(); if (_ctrl_pressed) { this->OnClick(pt, WID_BV_SHOW_HIDE, 1); @@ -1476,6 +1562,20 @@ struct BuildVehicleWindow : Window { } else { Command::Post(GetCmdBuildVehMsg(this->vehicle_type), CcBuildPrimaryVehicle, this->window_number, sel_eng, true, cargo, INVALID_CLIENT_ID); } + + /* Update last used variant and refresh if necessary. */ + bool refresh = false; + int recursion = 10; /* In case of infinite loop */ + for (Engine *e = Engine::Get(sel_eng); recursion > 0; e = Engine::Get(e->info.variant_id), --recursion) { + refresh |= (e->display_last_variant != sel_eng); + e->display_last_variant = sel_eng; + if (e->info.variant_id == INVALID_ENGINE) break; + } + if (refresh) { + InvalidateWindowData(WC_REPLACE_VEHICLE, this->vehicle_type, 0); // Update the autoreplace window + InvalidateWindowClassesData(WC_BUILD_VEHICLE); // The build windows needs updating as well + return; + } } break; } @@ -1551,7 +1651,7 @@ struct BuildVehicleWindow : Window { case WID_BV_LIST: resize->height = GetEngineListHeight(this->vehicle_type); size->height = 3 * resize->height; - size->width = std::max(size->width, GetVehicleImageCellSize(this->vehicle_type, EIT_PURCHASE).extend_left + GetVehicleImageCellSize(this->vehicle_type, EIT_PURCHASE).extend_right + 165); + size->width = std::max(size->width, GetVehicleImageCellSize(this->vehicle_type, EIT_PURCHASE).extend_left + GetVehicleImageCellSize(this->vehicle_type, EIT_PURCHASE).extend_right + 165) + padding.width; break; case WID_BV_PANEL: @@ -1588,10 +1688,8 @@ struct BuildVehicleWindow : Window { case WID_BV_LIST: DrawEngineList( this->vehicle_type, - r.left + WD_FRAMERECT_LEFT, - r.right - WD_FRAMERECT_RIGHT, - r.top + WD_FRAMERECT_TOP, - &this->eng_list, + r, + this->eng_list, this->vscroll->GetPosition(), static_cast(std::min(this->vscroll->GetPosition() + this->vscroll->GetCapacity(), this->eng_list.size())), this->sel_engine, @@ -1622,10 +1720,9 @@ struct BuildVehicleWindow : Window { int needed_height = this->details_height; /* Draw details panels. */ if (this->sel_engine != INVALID_ENGINE) { - NWidgetBase *nwi = this->GetWidget(WID_BV_PANEL); - int text_end = DrawVehiclePurchaseInfo(nwi->pos_x + WD_FRAMETEXT_LEFT, nwi->pos_x + nwi->current_x - WD_FRAMETEXT_RIGHT, - nwi->pos_y + WD_FRAMERECT_TOP, this->sel_engine, this->te); - needed_height = std::max(needed_height, (text_end - (int)nwi->pos_y - WD_FRAMERECT_TOP) / FONT_HEIGHT_NORMAL); + const Rect r = this->GetWidget(WID_BV_PANEL)->GetCurrentRect().Shrink(WidgetDimensions::scaled.frametext, WidgetDimensions::scaled.framerect); + int text_end = DrawVehiclePurchaseInfo(r.left, r.right, r.top, this->sel_engine, this->te); + needed_height = std::max(needed_height, (text_end - r.top) / FONT_HEIGHT_NORMAL); } if (needed_height != this->details_height) { // Details window are not high enough, enlarge them. int resize = needed_height - this->details_height; diff --git a/src/cargotype.cpp b/src/cargotype.cpp index e35c94d2fe..1bb490a2cf 100644 --- a/src/cargotype.cpp +++ b/src/cargotype.cpp @@ -12,6 +12,7 @@ #include "newgrf_cargo.h" #include "string_func.h" #include "strings_func.h" +#include "settings_type.h" #include "table/sprites.h" #include "table/strings.h" @@ -209,3 +210,8 @@ void InitializeSortedCargoSpecs() _sorted_standard_cargo_specs = { _sorted_cargo_specs.data(), nb_standard_cargo }; } +uint64 CargoSpec::WeightOfNUnitsInTrain(uint32 n) const +{ + if (this->is_freight) n *= _settings_game.vehicle.freight_trains; + return this->WeightOfNUnits(n); +} diff --git a/src/cargotype.h b/src/cargotype.h index 54d24f1d7a..6e73f36958 100644 --- a/src/cargotype.h +++ b/src/cargotype.h @@ -123,6 +123,13 @@ struct CargoSpec { SpriteID GetCargoIcon() const; + inline uint64 WeightOfNUnits(uint32 n) const + { + return n * this->weight / 16u; + } + + uint64 WeightOfNUnitsInTrain(uint32 n) const; + /** * Iterator to iterate all valid CargoSpec */ diff --git a/src/cheat_gui.cpp b/src/cheat_gui.cpp index eb62dc0317..030bbeb693 100644 --- a/src/cheat_gui.cpp +++ b/src/cheat_gui.cpp @@ -29,6 +29,7 @@ #include "newgrf.h" #include "error.h" #include "misc_cmd.h" +#include "core/geometry_func.hpp" #include "widgets/cheat_widget.h" @@ -207,7 +208,7 @@ static const NWidgetPart _nested_cheat_widgets[] = { EndContainer(), NWidget(WWT_PANEL, COLOUR_GREY, WID_C_PANEL), SetDataTip(0x0, STR_CHEATS_TOOLTIP), EndContainer(), NWidget(WWT_PANEL, COLOUR_GREY), - NWidget(WWT_LABEL, COLOUR_GREY, WID_C_NOTE), SetFill(1, 1), SetDataTip(STR_CHEATS_NOTE, STR_NULL), SetPadding(WD_PAR_VSEP_NORMAL, 4, WD_PAR_VSEP_NORMAL, 4), + NWidget(WWT_LABEL, COLOUR_GREY, WID_C_NOTE), SetFill(1, 1), SetDataTip(STR_CHEATS_NOTE, STR_NULL), SetPadding(WidgetDimensions::unscaled.frametext), EndContainer(), }; @@ -216,39 +217,48 @@ struct CheatWindow : Window { int clicked; int clicked_widget; uint line_height; - int box_width; + Dimension box; ///< Dimension of box sprite + Dimension icon; ///< Dimension of company icon sprite CheatWindow(WindowDesc *desc) : Window(desc) { - this->box_width = GetSpriteSize(SPR_BOX_EMPTY).width; this->InitNested(); } + void OnInit() override + { + this->box = maxdim(GetSpriteSize(SPR_BOX_EMPTY), GetSpriteSize(SPR_BOX_CHECKED)); + this->icon = GetSpriteSize(SPR_COMPANY_ICON); + } + void DrawWidget(const Rect &r, int widget) const override { if (widget != WID_C_PANEL) return; - int y = r.top + WD_FRAMERECT_TOP + WD_PAR_VSEP_NORMAL; + const Rect ir = r.Shrink(WidgetDimensions::scaled.framerect); + int y = ir.top; bool rtl = _current_text_dir == TD_RTL; - uint box_left = rtl ? r.right - this->box_width - 5 : r.left + 5; - uint button_left = rtl ? r.right - this->box_width - 10 - SETTING_BUTTON_WIDTH : r.left + this->box_width + 10; - uint text_left = r.left + (rtl ? WD_FRAMERECT_LEFT : 20 + this->box_width + SETTING_BUTTON_WIDTH); - uint text_right = r.right - (rtl ? 20 + this->box_width + SETTING_BUTTON_WIDTH : WD_FRAMERECT_RIGHT); + uint box_left = rtl ? ir.right - this->box.width - WidgetDimensions::scaled.hsep_wide : ir.left + WidgetDimensions::scaled.hsep_wide; + uint button_left = rtl ? ir.right - this->box.width - WidgetDimensions::scaled.hsep_wide * 2 - SETTING_BUTTON_WIDTH : ir.left + this->box.width + WidgetDimensions::scaled.hsep_wide * 2; + uint text_left = ir.left + (rtl ? 0 : WidgetDimensions::scaled.hsep_wide * 4 + this->box.width + SETTING_BUTTON_WIDTH); + uint text_right = ir.right - (rtl ? WidgetDimensions::scaled.hsep_wide * 4 + this->box.width + SETTING_BUTTON_WIDTH : 0); int text_y_offset = (this->line_height - FONT_HEIGHT_NORMAL) / 2; - int icon_y_offset = (this->line_height - SETTING_BUTTON_HEIGHT) / 2; + int box_y_offset = (this->line_height - this->box.height) / 2; + int button_y_offset = (this->line_height - SETTING_BUTTON_HEIGHT) / 2; + int icon_y_offset = (this->line_height - this->icon.height) / 2; for (int i = 0; i != lengthof(_cheats_ui); i++) { const CheatEntry *ce = &_cheats_ui[i]; - DrawSprite((*ce->been_used) ? SPR_BOX_CHECKED : SPR_BOX_EMPTY, PAL_NONE, box_left, y + icon_y_offset + 2); + DrawSprite((*ce->been_used) ? SPR_BOX_CHECKED : SPR_BOX_EMPTY, PAL_NONE, box_left, y + box_y_offset); switch (ce->type) { case SLE_BOOL: { bool on = (*(bool*)ce->variable); - DrawBoolButton(button_left, y + icon_y_offset, on, true); + DrawBoolButton(button_left, y + button_y_offset, on, true); SetDParam(0, on ? STR_CONFIG_SETTING_ON : STR_CONFIG_SETTING_OFF); break; } @@ -258,7 +268,7 @@ struct CheatWindow : Window { char buf[512]; /* Draw [<][>] boxes for settings of an integer-type */ - DrawArrowButtons(button_left, y + icon_y_offset, COLOUR_YELLOW, clicked - (i * 2), true, true); + DrawArrowButtons(button_left, y + button_y_offset, COLOUR_YELLOW, clicked - (i * 2), true, true); switch (ce->str) { /* Display date for change date cheat */ @@ -268,8 +278,8 @@ struct CheatWindow : Window { case STR_CHEAT_CHANGE_COMPANY: { SetDParam(0, val + 1); GetString(buf, STR_CHEAT_CHANGE_COMPANY, lastof(buf)); - uint offset = 10 + GetStringBoundingBox(buf).width; - DrawCompanyIcon(_local_company, rtl ? text_right - offset - 10 : text_left + offset, y + icon_y_offset + 2); + uint offset = WidgetDimensions::scaled.hsep_indent + GetStringBoundingBox(buf).width; + DrawCompanyIcon(_local_company, rtl ? text_right - offset - WidgetDimensions::scaled.hsep_indent : text_left + offset, y + icon_y_offset); break; } @@ -311,7 +321,7 @@ struct CheatWindow : Window { /* Draw coloured flag for change company cheat */ case STR_CHEAT_CHANGE_COMPANY: SetDParamMaxValue(0, MAX_COMPANIES); - width = std::max(width, GetStringBoundingBox(ce->str).width + 10 + 10); + width = std::max(width, GetStringBoundingBox(ce->str).width + WidgetDimensions::scaled.hsep_wide * 4); break; default: @@ -323,21 +333,21 @@ struct CheatWindow : Window { } } - this->line_height = std::max(GetSpriteSize(SPR_BOX_CHECKED).height, GetSpriteSize(SPR_BOX_EMPTY).height); + this->line_height = std::max(this->box.height, this->icon.height); this->line_height = std::max(this->line_height, SETTING_BUTTON_HEIGHT); - this->line_height = std::max(this->line_height, FONT_HEIGHT_NORMAL) + WD_PAR_VSEP_NORMAL; + this->line_height = std::max(this->line_height, FONT_HEIGHT_NORMAL) + WidgetDimensions::scaled.framerect.Vertical(); - size->width = width + 20 + this->box_width + SETTING_BUTTON_WIDTH /* stuff on the left */ + 10 /* extra spacing on right */; - size->height = WD_FRAMERECT_TOP + WD_PAR_VSEP_NORMAL + WD_FRAMERECT_BOTTOM + this->line_height * lengthof(_cheats_ui); + size->width = width + WidgetDimensions::scaled.hsep_wide * 4 + this->box.width + SETTING_BUTTON_WIDTH /* stuff on the left */ + WidgetDimensions::scaled.hsep_wide * 2 /* extra spacing on right */; + size->height = WidgetDimensions::scaled.framerect.Vertical() + this->line_height * lengthof(_cheats_ui); } void OnClick(Point pt, int widget, int click_count) override { - const NWidgetBase *wid = this->GetWidget(WID_C_PANEL); - uint btn = (pt.y - wid->pos_y - WD_FRAMERECT_TOP - WD_PAR_VSEP_NORMAL) / this->line_height; - int x = pt.x - wid->pos_x; + Rect r = this->GetWidget(WID_C_PANEL)->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect); + uint btn = (pt.y - r.top) / this->line_height; + uint x = pt.x - r.left; bool rtl = _current_text_dir == TD_RTL; - if (rtl) x = wid->current_x - x; + if (rtl) x = r.Width() - 1 - x; if (btn >= lengthof(_cheats_ui)) return; @@ -345,13 +355,13 @@ struct CheatWindow : Window { int value = (int32)ReadValue(ce->variable, ce->type); int oldvalue = value; - if (btn == CHT_CHANGE_DATE && x >= 20 + this->box_width + SETTING_BUTTON_WIDTH) { + if (btn == CHT_CHANGE_DATE && x >= WidgetDimensions::scaled.hsep_wide * 2 + this->box.width + SETTING_BUTTON_WIDTH) { /* Click at the date text directly. */ clicked_widget = CHT_CHANGE_DATE; SetDParam(0, value); ShowQueryString(STR_JUST_INT, STR_CHEAT_CHANGE_DATE_QUERY_CAPT, 8, this, CS_NUMERAL, QSF_ACCEPT_UNCHANGED); return; - } else if (btn == CHT_EDIT_MAX_HL && x >= 20 + this->box_width + SETTING_BUTTON_WIDTH) { + } else if (btn == CHT_EDIT_MAX_HL && x >= WidgetDimensions::scaled.hsep_wide * 2 + this->box.width + SETTING_BUTTON_WIDTH) { clicked_widget = CHT_EDIT_MAX_HL; SetDParam(0, value); ShowQueryString(STR_JUST_INT, STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT, 8, this, CS_NUMERAL, QSF_ACCEPT_UNCHANGED); @@ -359,7 +369,7 @@ struct CheatWindow : Window { } /* Not clicking a button? */ - if (!IsInsideMM(x, 10 + this->box_width, 10 + this->box_width + SETTING_BUTTON_WIDTH)) return; + if (!IsInsideMM(x, WidgetDimensions::scaled.hsep_wide * 2 + this->box.width, WidgetDimensions::scaled.hsep_wide * 2 + this->box.width + SETTING_BUTTON_WIDTH)) return; *ce->been_used = true; @@ -371,10 +381,10 @@ struct CheatWindow : Window { default: /* Take whatever the function returns */ - value = ce->proc(value + ((x >= 10 + this->box_width + SETTING_BUTTON_WIDTH / 2) ? 1 : -1), (x >= 10 + this->box_width + SETTING_BUTTON_WIDTH / 2) ? 1 : -1); + value = ce->proc(value + ((x >= WidgetDimensions::scaled.hsep_wide * 2 + this->box.width + SETTING_BUTTON_WIDTH / 2) ? 1 : -1), (x >= WidgetDimensions::scaled.hsep_wide * 2 + this->box.width + SETTING_BUTTON_WIDTH / 2) ? 1 : -1); /* The first cheat (money), doesn't return a different value. */ - if (value != oldvalue || btn == CHT_MONEY) this->clicked = btn * 2 + 1 + ((x >= 10 + this->box_width + SETTING_BUTTON_WIDTH / 2) != rtl ? 1 : 0); + if (value != oldvalue || btn == CHT_MONEY) this->clicked = btn * 2 + 1 + ((x >= WidgetDimensions::scaled.hsep_wide * 2 + this->box.width + SETTING_BUTTON_WIDTH / 2) != rtl ? 1 : 0); break; } diff --git a/src/command.cpp b/src/command.cpp index 65e5acf10c..bd85690e2d 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -32,6 +32,7 @@ #include "goal_cmd.h" #include "group_cmd.h" #include "industry_cmd.h" +#include "league_cmd.h" #include "landscape_cmd.h" #include "misc_cmd.h" #include "news_cmd.h" diff --git a/src/command_type.h b/src/command_type.h index 85f5680aea..d2b573b333 100644 --- a/src/command_type.h +++ b/src/command_type.h @@ -331,12 +331,19 @@ enum Commands : uint16 { CMD_MOVE_ORDER, ///< move an order CMD_CHANGE_TIMETABLE, ///< change the timetable for a vehicle + CMD_BULK_CHANGE_TIMETABLE, ///< change the timetable for all orders of a vehicle CMD_SET_VEHICLE_ON_TIME, ///< set the vehicle on time feature (timetable) CMD_AUTOFILL_TIMETABLE, ///< autofill the timetable CMD_SET_TIMETABLE_START, ///< set the date that a timetable should start CMD_OPEN_CLOSE_AIRPORT, ///< open/close an airport to incoming aircraft + CMD_CREATE_LEAGUE_TABLE, ///< create a new league table + CMD_CREATE_LEAGUE_TABLE_ELEMENT, ///< create a new element in a league table + CMD_UPDATE_LEAGUE_TABLE_ELEMENT_DATA, ///< update the data fields of a league table element + CMD_UPDATE_LEAGUE_TABLE_ELEMENT_SCORE, ///< update the score of a league table element + CMD_REMOVE_LEAGUE_TABLE_ELEMENT, ///< remove a league table element + CMD_END, ///< Must ALWAYS be on the end of this list!! (period) }; diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp index 681912f17c..a4e5fc9c3b 100644 --- a/src/company_cmd.cpp +++ b/src/company_cmd.cpp @@ -115,8 +115,11 @@ void SetLocalCompany(CompanyID new_company) _current_company = _local_company = new_company; - /* Delete any construction windows... */ - if (switching_company) CloseConstructionWindows(); + if (switching_company) { + InvalidateWindowClassesData(WC_COMPANY); + /* Delete any construction windows... */ + CloseConstructionWindows(); + } /* ... and redraw the whole screen. */ MarkWholeScreenDirty(); @@ -566,8 +569,8 @@ Company *DoStartupNewCompany(bool is_ai, CompanyID company = INVALID_COMPANY) c->inaugurated_year = _cur_year; /* If starting a player company in singleplayer and a favorite company manager face is selected, choose it. Otherwise, use a random face. - * In a network game, we'll choose the favorite face later in CmdCompanyCtrl to sync it to all clients, but we choose it here for the first (host) company. */ - if (_company_manager_face != 0 && !is_ai) { + * In a network game, we'll choose the favorite face later in CmdCompanyCtrl to sync it to all clients. */ + if (_company_manager_face != 0 && !is_ai && !_networking) { c->face = _company_manager_face; } else { RandomCompanyManagerFaceBits(c->face, (GenderEthnicity)Random(), false, false); @@ -889,8 +892,6 @@ CommandCost CmdCompanyCtrl(DoCommandFlag flags, CompanyCtrlAction cca, CompanyID if (!(flags & DC_EXEC)) return CommandCost(); - /* Delete any open window of the company */ - CloseCompanyWindows(c->index); CompanyNewsInformation *cni = new CompanyNewsInformation(c); /* Show the bankrupt news */ diff --git a/src/company_gui.cpp b/src/company_gui.cpp index fdcc7309df..bf43af43d4 100644 --- a/src/company_gui.cpp +++ b/src/company_gui.cpp @@ -49,10 +49,6 @@ /** Company GUI constants. */ -static const uint EXP_LINESPACE = 2; ///< Amount of vertical space for a horizontal (sub-)total line. -static const uint EXP_BLOCKSPACE = 10; ///< Amount of vertical space between two blocks of numbers. -static const int EXP_INDENT = 10; ///< Amount of horizontal space for an indented line. - static void DoSelectCompanyManagerFace(Window *parent); static void ShowCompanyInfrastructure(CompanyID company); @@ -122,15 +118,15 @@ static const ExpensesList _expenses_list_types[] = { static uint GetTotalCategoriesHeight() { /* There's an empty line and blockspace on the year row */ - uint total_height = FONT_HEIGHT_NORMAL + EXP_BLOCKSPACE; + uint total_height = FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_wide; for (uint i = 0; i < lengthof(_expenses_list_types); i++) { /* Title + expense list + total line + total + blockspace after category */ - total_height += FONT_HEIGHT_NORMAL + _expenses_list_types[i].GetHeight() + EXP_LINESPACE + FONT_HEIGHT_NORMAL + EXP_BLOCKSPACE; + total_height += FONT_HEIGHT_NORMAL + _expenses_list_types[i].GetHeight() + WidgetDimensions::scaled.vsep_normal + FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_wide; } /* Total income */ - total_height += EXP_LINESPACE + FONT_HEIGHT_NORMAL + EXP_BLOCKSPACE; + total_height += WidgetDimensions::scaled.vsep_normal + FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_wide; return total_height; } @@ -148,7 +144,7 @@ static uint GetMaxCategoriesWidth() /* Title of category */ max_width = std::max(max_width, GetStringBoundingBox(STR_FINANCES_REVENUE_TITLE + i).width); /* Entries in category */ - max_width = std::max(max_width, _expenses_list_types[i].GetListWidth()); + max_width = std::max(max_width, _expenses_list_types[i].GetListWidth() + WidgetDimensions::scaled.hsep_indent); } return max_width; @@ -159,16 +155,15 @@ static uint GetMaxCategoriesWidth() */ static void DrawCategory(const Rect &r, int start_y, ExpensesList list) { - int offs_left = _current_text_dir == TD_LTR ? EXP_INDENT : 0; - int offs_right = _current_text_dir == TD_LTR ? 0 : EXP_INDENT; + Rect tr = r.Indent(WidgetDimensions::scaled.hsep_indent, _current_text_dir == TD_RTL); - int y = start_y; + tr.top = start_y; ExpensesType et; for (uint i = 0; i < list.length; i++) { et = list.et[i]; - DrawString(r.left + offs_left, r.right - offs_right, y, STR_FINANCES_SECTION_CONSTRUCTION + et); - y += FONT_HEIGHT_NORMAL; + DrawString(tr, STR_FINANCES_SECTION_CONSTRUCTION + et); + tr.top += FONT_HEIGHT_NORMAL; } } @@ -180,7 +175,7 @@ static void DrawCategory(const Rect &r, int start_y, ExpensesList list) static void DrawCategories(const Rect &r) { /* Start with an empty space in the year row, plus the blockspace under the year. */ - int y = r.top + FONT_HEIGHT_NORMAL + EXP_BLOCKSPACE; + int y = r.top + FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_wide; for (uint i = 0; i < lengthof(_expenses_list_types); i++) { /* Draw category title and advance y */ @@ -191,16 +186,20 @@ static void DrawCategories(const Rect &r) DrawCategory(r, y, _expenses_list_types[i]); y += _expenses_list_types[i].GetHeight(); - /* Advance y by the height of the total and associated total line */ - y += EXP_LINESPACE + FONT_HEIGHT_NORMAL; + /* Advance y by the height of the horizontal line between amounts and subtotal */ + y += WidgetDimensions::scaled.vsep_normal; + + /* Draw category total and advance y */ + DrawString(r.left, r.right, y, STR_FINANCES_TOTAL_CAPTION, TC_FROMSTRING, SA_RIGHT); + y += FONT_HEIGHT_NORMAL; /* Advance y by a blockspace after this category block */ - y += EXP_BLOCKSPACE; + y += WidgetDimensions::scaled.vsep_wide; } /* Draw total profit/loss */ - y += EXP_LINESPACE; - DrawString(r.left, r.right, y, STR_FINANCES_NET_PROFIT, TC_FROMSTRING, SA_LEFT); + y += WidgetDimensions::scaled.vsep_normal; + DrawString(r.left, r.right, y, STR_FINANCES_PROFIT, TC_FROMSTRING, SA_LEFT); } /** @@ -244,7 +243,7 @@ static Money DrawYearCategory (const Rect &r, int start_y, ExpensesList list, co /* Draw the total at the bottom of the category. */ GfxFillRect(r.left, y, r.right, y, PC_BLACK); - y += EXP_LINESPACE; + y += WidgetDimensions::scaled.vsep_normal; if (sum != 0) DrawPrice(sum, r.left, r.right, y, TC_WHITE); /* Return the sum for the yearly total. */ @@ -267,19 +266,19 @@ static void DrawYearColumn(const Rect &r, int year, const Money (*tbl)[EXPENSES_ /* Year header */ SetDParam(0, year); DrawString(r.left, r.right, y, STR_FINANCES_YEAR, TC_FROMSTRING, SA_RIGHT, true); - y += FONT_HEIGHT_NORMAL + EXP_BLOCKSPACE; + y += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_wide; /* Categories */ for (uint i = 0; i < lengthof(_expenses_list_types); i++) { y += FONT_HEIGHT_NORMAL; sum += DrawYearCategory(r, y, _expenses_list_types[i], tbl); /* Expense list + expense category title + expense category total + blockspace after category */ - y += _expenses_list_types[i].GetHeight() + EXP_LINESPACE + FONT_HEIGHT_NORMAL + EXP_BLOCKSPACE; + y += _expenses_list_types[i].GetHeight() + WidgetDimensions::scaled.vsep_normal + FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_wide; } /* Total income. */ GfxFillRect(r.left, y, r.right, y, PC_BLACK); - y += EXP_LINESPACE; + y += WidgetDimensions::scaled.vsep_normal; DrawPrice(sum, r.left, r.right, y, TC_WHITE); } @@ -293,7 +292,7 @@ static const NWidgetPart _nested_company_finances_widgets[] = { EndContainer(), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_CF_SEL_PANEL), NWidget(WWT_PANEL, COLOUR_GREY), - NWidget(NWID_HORIZONTAL), SetPadding(WD_FRAMERECT_TOP, WD_FRAMERECT_RIGHT, WD_FRAMERECT_BOTTOM, WD_FRAMERECT_LEFT), SetPIP(0, 9, 0), + NWidget(NWID_HORIZONTAL), SetPadding(WidgetDimensions::unscaled.framerect), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0), NWidget(WWT_EMPTY, COLOUR_GREY, WID_CF_EXPS_CATEGORY), SetMinimalSize(120, 0), SetFill(0, 0), NWidget(WWT_EMPTY, COLOUR_GREY, WID_CF_EXPS_PRICE1), SetMinimalSize(86, 0), SetFill(0, 0), NWidget(WWT_EMPTY, COLOUR_GREY, WID_CF_EXPS_PRICE2), SetMinimalSize(86, 0), SetFill(0, 0), @@ -302,7 +301,7 @@ static const NWidgetPart _nested_company_finances_widgets[] = { EndContainer(), EndContainer(), NWidget(WWT_PANEL, COLOUR_GREY), - NWidget(NWID_HORIZONTAL), SetPadding(WD_FRAMERECT_TOP, WD_FRAMERECT_RIGHT, WD_FRAMERECT_BOTTOM, WD_FRAMERECT_LEFT), + NWidget(NWID_HORIZONTAL), SetPadding(WidgetDimensions::unscaled.framerect), NWidget(NWID_VERTICAL), // Vertical column with 'bank balance', 'loan' NWidget(WWT_TEXT, COLOUR_GREY), SetDataTip(STR_FINANCES_OWN_FUNDS_TITLE, STR_NULL), SetFill(1, 0), NWidget(WWT_TEXT, COLOUR_GREY), SetDataTip(STR_FINANCES_LOAN_TITLE, STR_NULL), SetFill(1, 0), @@ -315,7 +314,7 @@ static const NWidgetPart _nested_company_finances_widgets[] = { NWidget(WWT_TEXT, COLOUR_GREY, WID_CF_OWN_VALUE), SetDataTip(STR_FINANCES_TOTAL_CURRENCY, STR_NULL), SetAlignment(SA_VERT_CENTER | SA_RIGHT), NWidget(WWT_TEXT, COLOUR_GREY, WID_CF_LOAN_VALUE), SetDataTip(STR_FINANCES_TOTAL_CURRENCY, STR_NULL), SetAlignment(SA_VERT_CENTER | SA_RIGHT), NWidget(WWT_EMPTY, COLOUR_GREY, WID_CF_BALANCE_LINE), SetMinimalSize(0, 2), SetFill(1, 0), - NWidget(WWT_TEXT, COLOUR_GREY, WID_CF_BALANCE_VALUE), SetDataTip(STR_FINANCES_TOTAL_CURRENCY, STR_NULL), SetAlignment(SA_VERT_CENTER | SA_RIGHT), + NWidget(WWT_TEXT, COLOUR_GREY, WID_CF_BALANCE_VALUE), SetDataTip(STR_FINANCES_BANK_BALANCE, STR_NULL), SetAlignment(SA_VERT_CENTER | SA_RIGHT), EndContainer(), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_CF_SEL_MAXLOAN), NWidget(NWID_HORIZONTAL), @@ -603,23 +602,20 @@ public: return true; } - void Draw(int left, int right, int top, int bottom, bool sel, Colours bg_colour) const override + void Draw(const Rect &r, bool sel, Colours bg_colour) const override { bool rtl = _current_text_dir == TD_RTL; - int height = bottom - top; - int icon_y_offset = height / 2; - int text_y_offset = (height - FONT_HEIGHT_NORMAL) / 2 + 1; + int icon_y = CenterBounds(r.top, r.bottom, 0); + int text_y = CenterBounds(r.top, r.bottom, FONT_HEIGHT_NORMAL); + Rect tr = r.Shrink(WidgetDimensions::scaled.dropdowntext); DrawSprite(SPR_VEH_BUS_SIDE_VIEW, PALETTE_RECOLOUR_START + (this->result % COLOUR_END), - rtl ? right - 2 - ScaleGUITrad(14) : left + ScaleGUITrad(14) + 2, - top + icon_y_offset); - DrawString(rtl ? left + 2 : left + ScaleGUITrad(28) + 4, - rtl ? right - ScaleGUITrad(28) - 4 : right - 2, - top + text_y_offset, this->String(), sel ? TC_WHITE : TC_BLACK); + rtl ? tr.right - ScaleGUITrad(14) : tr.left + ScaleGUITrad(14), + icon_y); + tr = tr.Indent(ScaleGUITrad(28) + WidgetDimensions::scaled.hsep_normal, rtl); + DrawString(tr.left, tr.right, text_y, this->String(), sel ? TC_WHITE : TC_BLACK); } }; -static const int LEVEL_WIDTH = 10; ///< Indenting width of a sub-group in pixels - typedef GUIList GUIGroupList; /** Company livery colour scheme window. */ @@ -824,14 +820,14 @@ public: } } - size->width = std::max(size->width, 5 + d.width + WD_FRAMERECT_RIGHT); + size->width = std::max(size->width, 5 + d.width + padding.width); break; } case WID_SCL_MATRIX: { /* 11 items in the default rail class */ this->square = GetSpriteSize(SPR_SQUARE); - this->line_height = std::max(this->square.height, (uint)FONT_HEIGHT_NORMAL) + 4; + this->line_height = std::max(this->square.height, (uint)FONT_HEIGHT_NORMAL) + padding.height; size->height = 11 * this->line_height; resize->width = 1; @@ -848,7 +844,7 @@ public: case WID_SCL_PRI_COL_DROPDOWN: { this->square = GetSpriteSize(SPR_SQUARE); - int string_padding = this->square.width + NWidgetScrollbar::GetVerticalDimension().width + 10; + int string_padding = this->square.width + WidgetDimensions::scaled.hsep_normal + padding.width; for (const StringID *id = _colour_dropdown; id != endof(_colour_dropdown); id++) { size->width = std::max(size->width, GetStringBoundingBox(*id).width + string_padding); } @@ -918,40 +914,41 @@ public: bool rtl = _current_text_dir == TD_RTL; - /* Horizontal coordinates of scheme name column. */ + /* Coordinates of scheme name column. */ const NWidgetBase *nwi = this->GetWidget(WID_SCL_SPACER_DROPDOWN); - int sch_left = nwi->pos_x; - int sch_right = sch_left + nwi->current_x - 1; - /* Horizontal coordinates of first dropdown. */ + Rect sch = nwi->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect); + /* Coordinates of first dropdown. */ nwi = this->GetWidget(WID_SCL_PRI_COL_DROPDOWN); - int pri_left = nwi->pos_x; - int pri_right = pri_left + nwi->current_x - 1; - /* Horizontal coordinates of second dropdown. */ + Rect pri = nwi->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect); + /* Coordinates of second dropdown. */ nwi = this->GetWidget(WID_SCL_SEC_COL_DROPDOWN); - int sec_left = nwi->pos_x; - int sec_right = sec_left + nwi->current_x - 1; + Rect sec = nwi->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect); - int text_left = (rtl ? (uint)WD_FRAMERECT_LEFT : (this->square.width + 5)); - int text_right = (rtl ? (this->square.width + 5) : (uint)WD_FRAMERECT_RIGHT); + Rect pri_squ = pri.WithWidth(this->square.width, rtl); + Rect sec_squ = sec.WithWidth(this->square.width, rtl); - int square_offs = (this->line_height - this->square.height) / 2 + 1; - int text_offs = (this->line_height - FONT_HEIGHT_NORMAL) / 2 + 1; + pri = pri.Indent(this->square.width + WidgetDimensions::scaled.hsep_normal, rtl); + sec = sec.Indent(this->square.width + WidgetDimensions::scaled.hsep_normal, rtl); - int y = r.top; + Rect ir = r.WithHeight(this->resize.step_height).Shrink(WidgetDimensions::scaled.matrix); + int square_offs = (ir.Height() - this->square.height) / 2; + int text_offs = (ir.Height() - FONT_HEIGHT_NORMAL) / 2; + + int y = ir.top; /* Helper function to draw livery info. */ auto draw_livery = [&](StringID str, const Livery &liv, bool sel, bool def, int indent) { /* Livery Label. */ - DrawString(sch_left + WD_FRAMERECT_LEFT + (rtl ? 0 : indent), sch_right - WD_FRAMERECT_RIGHT - (rtl ? indent : 0), y + text_offs, str, sel ? TC_WHITE : TC_BLACK); + DrawString(sch.left + (rtl ? 0 : indent), sch.right - (rtl ? indent : 0), y + text_offs, str, sel ? TC_WHITE : TC_BLACK); /* Text below the first dropdown. */ - DrawSprite(SPR_SQUARE, GENERAL_SPRITE_COLOUR(liv.colour1), (rtl ? pri_right - (this->square.width + 5) + WD_FRAMERECT_RIGHT : pri_left) + WD_FRAMERECT_LEFT, y + square_offs); - DrawString(pri_left + text_left, pri_right - text_right, y + text_offs, (def || HasBit(liv.in_use, 0)) ? STR_COLOUR_DARK_BLUE + liv.colour1 : STR_COLOUR_DEFAULT, sel ? TC_WHITE : TC_GOLD); + DrawSprite(SPR_SQUARE, GENERAL_SPRITE_COLOUR(liv.colour1), pri_squ.left, y + square_offs); + DrawString(pri.left, pri.right, y + text_offs, (def || HasBit(liv.in_use, 0)) ? STR_COLOUR_DARK_BLUE + liv.colour1 : STR_COLOUR_DEFAULT, sel ? TC_WHITE : TC_GOLD); /* Text below the second dropdown. */ - if (sec_right > sec_left) { // Second dropdown has non-zero size. - DrawSprite(SPR_SQUARE, GENERAL_SPRITE_COLOUR(liv.colour2), (rtl ? sec_right - (this->square.width + 5) + WD_FRAMERECT_RIGHT : sec_left) + WD_FRAMERECT_LEFT, y + square_offs); - DrawString(sec_left + text_left, sec_right - text_right, y + text_offs, (def || HasBit(liv.in_use, 1)) ? STR_COLOUR_DARK_BLUE + liv.colour2 : STR_COLOUR_DEFAULT, sel ? TC_WHITE : TC_GOLD); + if (sec.right > sec.left) { // Second dropdown has non-zero size. + DrawSprite(SPR_SQUARE, GENERAL_SPRITE_COLOUR(liv.colour2), sec_squ.left, y + square_offs); + DrawString(sec.left, sec.right, y + text_offs, (def || HasBit(liv.in_use, 1)) ? STR_COLOUR_DARK_BLUE + liv.colour2 : STR_COLOUR_DEFAULT, sel ? TC_WHITE : TC_GOLD); } y += this->line_height; @@ -971,7 +968,7 @@ public: for (uint i = this->vscroll->GetPosition(); i < max; ++i) { const Group *g = this->groups[i]; SetDParam(0, g->index); - draw_livery(STR_GROUP_NAME, g->livery, this->sel == g->index, false, this->indents[i] * LEVEL_WIDTH); + draw_livery(STR_GROUP_NAME, g->livery, this->sel == g->index, false, this->indents[i] * WidgetDimensions::scaled.hsep_indent); } } } @@ -1269,81 +1266,81 @@ static const NWidgetPart _nested_select_company_manager_face_widgets[] = { EndContainer(), NWidget(NWID_SPACER), SetMinimalSize(0, 4), NWidget(NWID_HORIZONTAL), - NWidget(WWT_TEXT, INVALID_COLOUR, WID_SCMF_HAS_MOUSTACHE_EARRING_TEXT), SetFill(1, 0), SetPadding(0, WD_FRAMERECT_RIGHT, 0, WD_FRAMERECT_LEFT), + NWidget(WWT_TEXT, INVALID_COLOUR, WID_SCMF_HAS_MOUSTACHE_EARRING_TEXT), SetFill(1, 0), SetPadding(WidgetDimensions::unscaled.framerect), SetDataTip(STR_FACE_EYECOLOUR, STR_NULL), SetTextColour(TC_GOLD), SetAlignment(SA_VERT_CENTER | SA_RIGHT), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SCMF_HAS_MOUSTACHE_EARRING), SetDataTip(STR_WHITE_STRING, STR_FACE_MOUSTACHE_EARRING_TOOLTIP), EndContainer(), NWidget(NWID_HORIZONTAL), - NWidget(WWT_TEXT, INVALID_COLOUR, WID_SCMF_HAS_GLASSES_TEXT), SetFill(1, 0), SetPadding(0, WD_FRAMERECT_RIGHT, 0, WD_FRAMERECT_LEFT), + NWidget(WWT_TEXT, INVALID_COLOUR, WID_SCMF_HAS_GLASSES_TEXT), SetFill(1, 0), SetPadding(WidgetDimensions::unscaled.framerect), SetDataTip(STR_FACE_GLASSES, STR_NULL), SetTextColour(TC_GOLD), SetAlignment(SA_VERT_CENTER | SA_RIGHT), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SCMF_HAS_GLASSES), SetDataTip(STR_WHITE_STRING, STR_FACE_GLASSES_TOOLTIP), EndContainer(), NWidget(NWID_SPACER), SetMinimalSize(0, 2), SetFill(1, 0), NWidget(NWID_HORIZONTAL), - NWidget(WWT_TEXT, INVALID_COLOUR, WID_SCMF_HAIR_TEXT), SetFill(1, 0), SetPadding(0, WD_FRAMERECT_RIGHT, 0, WD_FRAMERECT_LEFT), + NWidget(WWT_TEXT, INVALID_COLOUR, WID_SCMF_HAIR_TEXT), SetFill(1, 0), SetPadding(WidgetDimensions::unscaled.framerect), SetDataTip(STR_FACE_HAIR, STR_NULL), SetTextColour(TC_GOLD), SetAlignment(SA_VERT_CENTER | SA_RIGHT), NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_SCMF_HAIR_L), SetDataTip(AWV_DECREASE, STR_FACE_HAIR_TOOLTIP), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SCMF_HAIR), SetDataTip(STR_WHITE_STRING, STR_FACE_HAIR_TOOLTIP), NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_SCMF_HAIR_R), SetDataTip(AWV_INCREASE, STR_FACE_HAIR_TOOLTIP), EndContainer(), NWidget(NWID_HORIZONTAL), - NWidget(WWT_TEXT, INVALID_COLOUR, WID_SCMF_EYEBROWS_TEXT), SetFill(1, 0), SetPadding(0, WD_FRAMERECT_RIGHT, 0, WD_FRAMERECT_LEFT), + NWidget(WWT_TEXT, INVALID_COLOUR, WID_SCMF_EYEBROWS_TEXT), SetFill(1, 0), SetPadding(WidgetDimensions::unscaled.framerect), SetDataTip(STR_FACE_EYEBROWS, STR_NULL), SetTextColour(TC_GOLD), SetAlignment(SA_VERT_CENTER | SA_RIGHT), NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_SCMF_EYEBROWS_L), SetDataTip(AWV_DECREASE, STR_FACE_EYEBROWS_TOOLTIP), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SCMF_EYEBROWS), SetDataTip(STR_WHITE_STRING, STR_FACE_EYEBROWS_TOOLTIP), NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_SCMF_EYEBROWS_R), SetDataTip(AWV_INCREASE, STR_FACE_EYEBROWS_TOOLTIP), EndContainer(), NWidget(NWID_HORIZONTAL), - NWidget(WWT_TEXT, INVALID_COLOUR, WID_SCMF_EYECOLOUR_TEXT), SetFill(1, 0), SetPadding(0, WD_FRAMERECT_RIGHT, 0, WD_FRAMERECT_LEFT), + NWidget(WWT_TEXT, INVALID_COLOUR, WID_SCMF_EYECOLOUR_TEXT), SetFill(1, 0), SetPadding(WidgetDimensions::unscaled.framerect), SetDataTip(STR_FACE_EYECOLOUR, STR_NULL), SetTextColour(TC_GOLD), SetAlignment(SA_VERT_CENTER | SA_RIGHT), NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_SCMF_EYECOLOUR_L), SetDataTip(AWV_DECREASE, STR_FACE_EYECOLOUR_TOOLTIP), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SCMF_EYECOLOUR), SetDataTip(STR_WHITE_STRING, STR_FACE_EYECOLOUR_TOOLTIP), NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_SCMF_EYECOLOUR_R), SetDataTip(AWV_INCREASE, STR_FACE_EYECOLOUR_TOOLTIP), EndContainer(), NWidget(NWID_HORIZONTAL), - NWidget(WWT_TEXT, INVALID_COLOUR, WID_SCMF_GLASSES_TEXT), SetFill(1, 0), SetPadding(0, WD_FRAMERECT_RIGHT, 0, WD_FRAMERECT_LEFT), + NWidget(WWT_TEXT, INVALID_COLOUR, WID_SCMF_GLASSES_TEXT), SetFill(1, 0), SetPadding(WidgetDimensions::unscaled.framerect), SetDataTip(STR_FACE_GLASSES, STR_NULL), SetTextColour(TC_GOLD), SetAlignment(SA_VERT_CENTER | SA_RIGHT), NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_SCMF_GLASSES_L), SetDataTip(AWV_DECREASE, STR_FACE_GLASSES_TOOLTIP_2), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SCMF_GLASSES), SetDataTip(STR_WHITE_STRING, STR_FACE_GLASSES_TOOLTIP_2), NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_SCMF_GLASSES_R), SetDataTip(AWV_INCREASE, STR_FACE_GLASSES_TOOLTIP_2), EndContainer(), NWidget(NWID_HORIZONTAL), - NWidget(WWT_TEXT, INVALID_COLOUR, WID_SCMF_NOSE_TEXT), SetFill(1, 0), SetPadding(0, WD_FRAMERECT_RIGHT, 0, WD_FRAMERECT_LEFT), + NWidget(WWT_TEXT, INVALID_COLOUR, WID_SCMF_NOSE_TEXT), SetFill(1, 0), SetPadding(WidgetDimensions::unscaled.framerect), SetDataTip(STR_FACE_NOSE, STR_NULL), SetTextColour(TC_GOLD), SetAlignment(SA_VERT_CENTER | SA_RIGHT), NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_SCMF_NOSE_L), SetDataTip(AWV_DECREASE, STR_FACE_NOSE_TOOLTIP), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SCMF_NOSE), SetDataTip(STR_WHITE_STRING, STR_FACE_NOSE_TOOLTIP), NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_SCMF_NOSE_R), SetDataTip(AWV_INCREASE, STR_FACE_NOSE_TOOLTIP), EndContainer(), NWidget(NWID_HORIZONTAL), - NWidget(WWT_TEXT, INVALID_COLOUR, WID_SCMF_LIPS_MOUSTACHE_TEXT), SetFill(1, 0), SetPadding(0, WD_FRAMERECT_RIGHT, 0, WD_FRAMERECT_LEFT), + NWidget(WWT_TEXT, INVALID_COLOUR, WID_SCMF_LIPS_MOUSTACHE_TEXT), SetFill(1, 0), SetPadding(WidgetDimensions::unscaled.framerect), SetDataTip(STR_FACE_MOUSTACHE, STR_NULL), SetTextColour(TC_GOLD), SetAlignment(SA_VERT_CENTER | SA_RIGHT), NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_SCMF_LIPS_MOUSTACHE_L), SetDataTip(AWV_DECREASE, STR_FACE_LIPS_MOUSTACHE_TOOLTIP), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SCMF_LIPS_MOUSTACHE), SetDataTip(STR_WHITE_STRING, STR_FACE_LIPS_MOUSTACHE_TOOLTIP), NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_SCMF_LIPS_MOUSTACHE_R), SetDataTip(AWV_INCREASE, STR_FACE_LIPS_MOUSTACHE_TOOLTIP), EndContainer(), NWidget(NWID_HORIZONTAL), - NWidget(WWT_TEXT, INVALID_COLOUR, WID_SCMF_CHIN_TEXT), SetFill(1, 0), SetPadding(0, WD_FRAMERECT_RIGHT, 0, WD_FRAMERECT_LEFT), + NWidget(WWT_TEXT, INVALID_COLOUR, WID_SCMF_CHIN_TEXT), SetFill(1, 0), SetPadding(WidgetDimensions::unscaled.framerect), SetDataTip(STR_FACE_CHIN, STR_NULL), SetTextColour(TC_GOLD), SetAlignment(SA_VERT_CENTER | SA_RIGHT), NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_SCMF_CHIN_L), SetDataTip(AWV_DECREASE, STR_FACE_CHIN_TOOLTIP), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SCMF_CHIN), SetDataTip(STR_WHITE_STRING, STR_FACE_CHIN_TOOLTIP), NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_SCMF_CHIN_R), SetDataTip(AWV_INCREASE, STR_FACE_CHIN_TOOLTIP), EndContainer(), NWidget(NWID_HORIZONTAL), - NWidget(WWT_TEXT, INVALID_COLOUR, WID_SCMF_JACKET_TEXT), SetFill(1, 0), SetPadding(0, WD_FRAMERECT_RIGHT, 0, WD_FRAMERECT_LEFT), + NWidget(WWT_TEXT, INVALID_COLOUR, WID_SCMF_JACKET_TEXT), SetFill(1, 0), SetPadding(WidgetDimensions::unscaled.framerect), SetDataTip(STR_FACE_JACKET, STR_NULL), SetTextColour(TC_GOLD), SetAlignment(SA_VERT_CENTER | SA_RIGHT), NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_SCMF_JACKET_L), SetDataTip(AWV_DECREASE, STR_FACE_JACKET_TOOLTIP), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SCMF_JACKET), SetDataTip(STR_WHITE_STRING, STR_FACE_JACKET_TOOLTIP), NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_SCMF_JACKET_R), SetDataTip(AWV_INCREASE, STR_FACE_JACKET_TOOLTIP), EndContainer(), NWidget(NWID_HORIZONTAL), - NWidget(WWT_TEXT, INVALID_COLOUR, WID_SCMF_COLLAR_TEXT), SetFill(1, 0), SetPadding(0, WD_FRAMERECT_RIGHT, 0, WD_FRAMERECT_LEFT), + NWidget(WWT_TEXT, INVALID_COLOUR, WID_SCMF_COLLAR_TEXT), SetFill(1, 0), SetPadding(WidgetDimensions::unscaled.framerect), SetDataTip(STR_FACE_COLLAR, STR_NULL), SetTextColour(TC_GOLD), SetAlignment(SA_VERT_CENTER | SA_RIGHT), NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_SCMF_COLLAR_L), SetDataTip(AWV_DECREASE, STR_FACE_COLLAR_TOOLTIP), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SCMF_COLLAR), SetDataTip(STR_WHITE_STRING, STR_FACE_COLLAR_TOOLTIP), NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_SCMF_COLLAR_R), SetDataTip(AWV_INCREASE, STR_FACE_COLLAR_TOOLTIP), EndContainer(), NWidget(NWID_HORIZONTAL), - NWidget(WWT_TEXT, INVALID_COLOUR, WID_SCMF_TIE_EARRING_TEXT), SetFill(1, 0), SetPadding(0, WD_FRAMERECT_RIGHT, 0, WD_FRAMERECT_LEFT), + NWidget(WWT_TEXT, INVALID_COLOUR, WID_SCMF_TIE_EARRING_TEXT), SetFill(1, 0), SetPadding(WidgetDimensions::unscaled.framerect), SetDataTip(STR_FACE_EARRING, STR_NULL), SetTextColour(TC_GOLD), SetAlignment(SA_VERT_CENTER | SA_RIGHT), NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_SCMF_TIE_EARRING_L), SetDataTip(AWV_DECREASE, STR_FACE_TIE_EARRING_TOOLTIP), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SCMF_TIE_EARRING), SetDataTip(STR_WHITE_STRING, STR_FACE_TIE_EARRING_TOOLTIP), @@ -1447,17 +1444,17 @@ public: { /* Size of the boolean yes/no button. */ Dimension yesno_dim = maxdim(GetStringBoundingBox(STR_FACE_YES), GetStringBoundingBox(STR_FACE_NO)); - yesno_dim.width += WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; - yesno_dim.height += WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; + yesno_dim.width += WidgetDimensions::scaled.framerect.Horizontal(); + yesno_dim.height += WidgetDimensions::scaled.framerect.Vertical(); /* Size of the number button + arrows. */ Dimension number_dim = {0, 0}; for (int val = 1; val <= 12; val++) { SetDParam(0, val); number_dim = maxdim(number_dim, GetStringBoundingBox(STR_JUST_INT)); } - uint arrows_width = GetSpriteSize(SPR_ARROW_LEFT).width + GetSpriteSize(SPR_ARROW_RIGHT).width + 2 * (WD_IMGBTN_LEFT + WD_IMGBTN_RIGHT); - number_dim.width += WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT + arrows_width; - number_dim.height += WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; + uint arrows_width = GetSpriteSize(SPR_ARROW_LEFT).width + GetSpriteSize(SPR_ARROW_RIGHT).width + 2 * (WidgetDimensions::scaled.imgbtn.Horizontal()); + number_dim.width += WidgetDimensions::scaled.framerect.Horizontal() + arrows_width; + number_dim.height += WidgetDimensions::scaled.framerect.Vertical(); /* Compute width of both buttons. */ yesno_dim.width = std::max(yesno_dim.width, number_dim.width); number_dim.width = yesno_dim.width - arrows_width; @@ -1796,28 +1793,28 @@ static const NWidgetPart _nested_company_infrastructure_widgets[] = { NWidget(WWT_STICKYBOX, COLOUR_GREY), EndContainer(), NWidget(WWT_PANEL, COLOUR_GREY), - NWidget(NWID_VERTICAL), SetPIP(WD_FRAMERECT_TOP, 4, WD_FRAMETEXT_BOTTOM), - NWidget(NWID_HORIZONTAL), SetPIP(2, 4, 2), + NWidget(NWID_VERTICAL), SetPadding(WidgetDimensions::unscaled.framerect), SetPIP(0, WidgetDimensions::unscaled.vsep_normal, 0), + NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0), NWidget(WWT_EMPTY, COLOUR_GREY, WID_CI_RAIL_DESC), SetMinimalTextLines(2, 0), SetFill(1, 0), NWidget(WWT_EMPTY, COLOUR_GREY, WID_CI_RAIL_COUNT), SetMinimalTextLines(2, 0), SetFill(0, 1), EndContainer(), - NWidget(NWID_HORIZONTAL), SetPIP(2, 4, 2), + NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0), NWidget(WWT_EMPTY, COLOUR_GREY, WID_CI_ROAD_DESC), SetMinimalTextLines(2, 0), SetFill(1, 0), NWidget(WWT_EMPTY, COLOUR_GREY, WID_CI_ROAD_COUNT), SetMinimalTextLines(2, 0), SetFill(0, 1), EndContainer(), - NWidget(NWID_HORIZONTAL), SetPIP(2, 4, 2), + NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0), NWidget(WWT_EMPTY, COLOUR_GREY, WID_CI_TRAM_DESC), SetMinimalTextLines(2, 0), SetFill(1, 0), NWidget(WWT_EMPTY, COLOUR_GREY, WID_CI_TRAM_COUNT), SetMinimalTextLines(2, 0), SetFill(0, 1), EndContainer(), - NWidget(NWID_HORIZONTAL), SetPIP(2, 4, 2), + NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0), NWidget(WWT_EMPTY, COLOUR_GREY, WID_CI_WATER_DESC), SetMinimalTextLines(2, 0), SetFill(1, 0), NWidget(WWT_EMPTY, COLOUR_GREY, WID_CI_WATER_COUNT), SetMinimalTextLines(2, 0), SetFill(0, 1), EndContainer(), - NWidget(NWID_HORIZONTAL), SetPIP(2, 4, 2), + NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0), NWidget(WWT_EMPTY, COLOUR_GREY, WID_CI_STATION_DESC), SetMinimalTextLines(3, 0), SetFill(1, 0), NWidget(WWT_EMPTY, COLOUR_GREY, WID_CI_STATION_COUNT), SetMinimalTextLines(3, 0), SetFill(0, 1), EndContainer(), - NWidget(NWID_HORIZONTAL), SetPIP(2, 4, 2), + NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0), NWidget(WWT_EMPTY, COLOUR_GREY, WID_CI_TOTAL_DESC), SetFill(1, 0), NWidget(WWT_EMPTY, COLOUR_GREY, WID_CI_TOTAL), SetFill(0, 1), EndContainer(), @@ -1918,12 +1915,12 @@ struct CompanyInfrastructureWindow : Window if (HasBit(this->railtypes, rt)) { lines++; SetDParam(0, GetRailTypeInfo(rt)->strings.name); - size->width = std::max(size->width, GetStringBoundingBox(STR_WHITE_STRING).width + WD_FRAMERECT_LEFT); + size->width = std::max(size->width, GetStringBoundingBox(STR_WHITE_STRING).width + WidgetDimensions::scaled.hsep_indent); } } if (this->railtypes != RAILTYPES_NONE) { lines++; - size->width = std::max(size->width, GetStringBoundingBox(STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS).width + WD_FRAMERECT_LEFT); + size->width = std::max(size->width, GetStringBoundingBox(STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS).width + WidgetDimensions::scaled.hsep_indent); } size->height = std::max(size->height, lines * FONT_HEIGHT_NORMAL); @@ -1940,7 +1937,7 @@ struct CompanyInfrastructureWindow : Window if (HasBit(this->roadtypes, rt) && RoadTypeIsRoad(rt) == (widget == WID_CI_ROAD_DESC)) { lines++; SetDParam(0, GetRoadTypeInfo(rt)->strings.name); - size->width = std::max(size->width, GetStringBoundingBox(STR_WHITE_STRING).width + WD_FRAMERECT_LEFT); + size->width = std::max(size->width, GetStringBoundingBox(STR_WHITE_STRING).width + WidgetDimensions::scaled.hsep_indent); } } @@ -1950,13 +1947,13 @@ struct CompanyInfrastructureWindow : Window case WID_CI_WATER_DESC: size->width = std::max(size->width, GetStringBoundingBox(STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT).width); - size->width = std::max(size->width, GetStringBoundingBox(STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS).width + WD_FRAMERECT_LEFT); + size->width = std::max(size->width, GetStringBoundingBox(STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS).width + WidgetDimensions::scaled.hsep_indent); break; case WID_CI_STATION_DESC: size->width = std::max(size->width, GetStringBoundingBox(STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT).width); - size->width = std::max(size->width, GetStringBoundingBox(STR_COMPANY_INFRASTRUCTURE_VIEW_STATIONS).width + WD_FRAMERECT_LEFT); - size->width = std::max(size->width, GetStringBoundingBox(STR_COMPANY_INFRASTRUCTURE_VIEW_AIRPORTS).width + WD_FRAMERECT_LEFT); + size->width = std::max(size->width, GetStringBoundingBox(STR_COMPANY_INFRASTRUCTURE_VIEW_STATIONS).width + WidgetDimensions::scaled.hsep_indent); + size->width = std::max(size->width, GetStringBoundingBox(STR_COMPANY_INFRASTRUCTURE_VIEW_AIRPORTS).width + WidgetDimensions::scaled.hsep_indent); break; case WID_CI_RAIL_COUNT: @@ -1990,11 +1987,11 @@ struct CompanyInfrastructureWindow : Window max_cost = std::max(max_cost, AirportMaintenanceCost(c->index)); SetDParamMaxValue(0, max_val); - uint count_width = GetStringBoundingBox(STR_WHITE_COMMA).width + 20; // Reserve some wiggle room + uint count_width = GetStringBoundingBox(STR_WHITE_COMMA).width + WidgetDimensions::scaled.hsep_indent; // Reserve some wiggle room if (_settings_game.economy.infrastructure_maintenance) { SetDParamMaxValue(0, this->GetTotalMaintenanceCost() * 12); // Convert to per year - this->total_width = GetStringBoundingBox(STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL).width + 20; + this->total_width = GetStringBoundingBox(STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL).width + WidgetDimensions::scaled.hsep_indent * 2; size->width = std::max(size->width, this->total_width); SetDParamMaxValue(0, max_cost * 12); // Convert to per year @@ -2005,7 +2002,7 @@ struct CompanyInfrastructureWindow : Window /* Set height of the total line. */ if (widget == WID_CI_TOTAL) { - size->height = _settings_game.economy.infrastructure_maintenance ? std::max(size->height, EXP_LINESPACE + FONT_HEIGHT_NORMAL) : 0; + size->height = _settings_game.economy.infrastructure_maintenance ? std::max(size->height, WidgetDimensions::scaled.vsep_normal + FONT_HEIGHT_NORMAL) : 0; } break; } @@ -2026,19 +2023,18 @@ struct CompanyInfrastructureWindow : Window if (_settings_game.economy.infrastructure_maintenance) { SetDParam(0, monthly_cost * 12); // Convert to per year - int left = _current_text_dir == TD_RTL ? r.right - this->total_width : r.left; - DrawString(left, left + this->total_width, y, STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL, TC_FROMSTRING, SA_RIGHT); + Rect tr = r.WithWidth(this->total_width, _current_text_dir == TD_RTL); + DrawString(tr.left, tr.right, y, STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL, TC_FROMSTRING, SA_RIGHT); } } void DrawWidget(const Rect &r, int widget) const override { const Company *c = Company::Get((CompanyID)this->window_number); + int y = r.top; - int offs_left = _current_text_dir == TD_LTR ? WD_FRAMERECT_LEFT : 0; - int offs_right = _current_text_dir == TD_LTR ? 0 : WD_FRAMERECT_LEFT; - + Rect ir = r.Indent(WidgetDimensions::scaled.hsep_indent, _current_text_dir == TD_RTL); switch (widget) { case WID_CI_RAIL_DESC: DrawString(r.left, r.right, y, STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT); @@ -2048,13 +2044,13 @@ struct CompanyInfrastructureWindow : Window for (const auto &rt : _sorted_railtypes) { if (HasBit(this->railtypes, rt)) { SetDParam(0, GetRailTypeInfo(rt)->strings.name); - DrawString(r.left + offs_left, r.right - offs_right, y += FONT_HEIGHT_NORMAL, STR_WHITE_STRING); + DrawString(ir.left, ir.right, y += FONT_HEIGHT_NORMAL, STR_WHITE_STRING); } } - DrawString(r.left + offs_left, r.right - offs_right, y += FONT_HEIGHT_NORMAL, STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS); + DrawString(ir.left, ir.right, y += FONT_HEIGHT_NORMAL, STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS); } else { /* No valid railtype. */ - DrawString(r.left + offs_left, r.right - offs_right, y += FONT_HEIGHT_NORMAL, STR_COMPANY_VIEW_INFRASTRUCTURE_NONE); + DrawString(ir.left, ir.right, y += FONT_HEIGHT_NORMAL, STR_COMPANY_VIEW_INFRASTRUCTURE_NONE); } break; @@ -2081,7 +2077,7 @@ struct CompanyInfrastructureWindow : Window for (const auto &rt : _sorted_roadtypes) { if (HasBit(this->roadtypes, rt) && RoadTypeIsRoad(rt) == (widget == WID_CI_ROAD_DESC)) { SetDParam(0, GetRoadTypeInfo(rt)->strings.name); - DrawString(r.left + offs_left, r.right - offs_right, y += FONT_HEIGHT_NORMAL, STR_WHITE_STRING); + DrawString(ir.left, ir.right, y += FONT_HEIGHT_NORMAL, STR_WHITE_STRING); } } @@ -2101,7 +2097,7 @@ struct CompanyInfrastructureWindow : Window case WID_CI_WATER_DESC: DrawString(r.left, r.right, y, STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT); - DrawString(r.left + offs_left, r.right - offs_right, y += FONT_HEIGHT_NORMAL, STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS); + DrawString(ir.left, ir.right, y += FONT_HEIGHT_NORMAL, STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS); break; case WID_CI_WATER_COUNT: @@ -2110,18 +2106,18 @@ struct CompanyInfrastructureWindow : Window case WID_CI_TOTAL: if (_settings_game.economy.infrastructure_maintenance) { - int left = _current_text_dir == TD_RTL ? r.right - this->total_width : r.left; - GfxFillRect(left, y, left + this->total_width, y, PC_WHITE); - y += EXP_LINESPACE; + Rect tr = r.WithWidth(this->total_width, _current_text_dir == TD_RTL); + GfxFillRect(tr.left, y, tr.right, y, PC_WHITE); + y += WidgetDimensions::scaled.vsep_normal; SetDParam(0, this->GetTotalMaintenanceCost() * 12); // Convert to per year - DrawString(left, left + this->total_width, y, STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL, TC_FROMSTRING, SA_RIGHT); + DrawString(tr.left, tr.right, y, STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL, TC_FROMSTRING, SA_RIGHT); } break; case WID_CI_STATION_DESC: DrawString(r.left, r.right, y, STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT); - DrawString(r.left + offs_left, r.right - offs_right, y += FONT_HEIGHT_NORMAL, STR_COMPANY_INFRASTRUCTURE_VIEW_STATIONS); - DrawString(r.left + offs_left, r.right - offs_right, y += FONT_HEIGHT_NORMAL, STR_COMPANY_INFRASTRUCTURE_VIEW_AIRPORTS); + DrawString(ir.left, ir.right, y += FONT_HEIGHT_NORMAL, STR_COMPANY_INFRASTRUCTURE_VIEW_STATIONS); + DrawString(ir.left, ir.right, y += FONT_HEIGHT_NORMAL, STR_COMPANY_INFRASTRUCTURE_VIEW_AIRPORTS); break; case WID_CI_STATION_COUNT: @@ -2466,7 +2462,7 @@ struct CompanyWindow : Window Point offset; Dimension d = GetSpriteSize(SPR_VEH_BUS_SW_VIEW, &offset); d.height -= offset.y; - DrawSprite(SPR_VEH_BUS_SW_VIEW, COMPANY_SPRITE_COLOUR(c->index), r.left - offset.x, (r.top + r.bottom - d.height) / 2 - offset.y); + DrawSprite(SPR_VEH_BUS_SW_VIEW, COMPANY_SPRITE_COLOUR(c->index), r.left - offset.x, CenterBounds(r.top, r.bottom, d.height) - offset.y); break; } diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index 2936a8a147..33b47d9600 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -23,6 +23,7 @@ #include "settings_func.h" #include "fios.h" #include "fileio_func.h" +#include "fontcache.h" #include "screenshot.h" #include "genworld.h" #include "strings_func.h" @@ -1493,6 +1494,7 @@ DEF_CONSOLE_CMD(ConScreenShot) IConsolePrint(CC_HELP, " 'minimap' makes a top-viewed minimap screenshot of the whole world which represents one tile by one pixel."); IConsolePrint(CC_HELP, " 'no_con' hides the console to create the screenshot (only useful in combination with 'viewport')."); IConsolePrint(CC_HELP, " 'size' sets the width and height of the viewport to make a screenshot of (only useful in combination with 'normal' or 'big')."); + IConsolePrint(CC_HELP, " A filename ending in # will prevent overwriting existing files and will number files counting upwards."); return true; } @@ -1981,6 +1983,82 @@ DEF_CONSOLE_CMD(ConContent) } #endif /* defined(WITH_ZLIB) */ +DEF_CONSOLE_CMD(ConFont) +{ + if (argc == 0) { + IConsolePrint(CC_HELP, "Manage the fonts configuration."); + IConsolePrint(CC_HELP, "Usage 'font'."); + IConsolePrint(CC_HELP, " Print out the fonts configuration."); + IConsolePrint(CC_HELP, "Usage 'font [medium|small|large|mono] [] [] [aa|noaa]'."); + IConsolePrint(CC_HELP, " Change the configuration for a font."); + IConsolePrint(CC_HELP, " Omitting an argument will keep the current value."); + IConsolePrint(CC_HELP, " Set to \"\" for the sprite font (size and aa have no effect on sprite font)."); + return true; + } + + FontSize argfs; + for (argfs = FS_BEGIN; argfs < FS_END; argfs++) { + if (argc > 1 && strcasecmp(argv[1], FontSizeToName(argfs)) == 0) break; + } + + /* First argument must be a FontSize. */ + if (argc > 1 && argfs == FS_END) return false; + + if (argc > 2) { + FontCacheSubSetting *setting = GetFontCacheSubSetting(argfs); + std::string font = setting->font; + uint size = setting->size; + bool aa = setting->aa; + + byte arg_index = 2; + + if (argc > arg_index) { + /* We may encounter "aa" or "noaa" but it must be the last argument. */ + if (strcasecmp(argv[arg_index], "aa") == 0 || strcasecmp(argv[arg_index], "noaa") == 0) { + aa = strncasecmp(argv[arg_index++], "no", 2) != 0; + if (argc > arg_index) return false; + } else { + /* For we want a string. */ + uint v; + if (!GetArgumentInteger(&v, argv[arg_index])) { + font = argv[arg_index++]; + } + } + } + + if (argc > arg_index) { + /* For we want a number. */ + uint v; + if (GetArgumentInteger(&v, argv[arg_index])) { + size = v; + arg_index++; + } + } + + if (argc > arg_index) { + /* Last argument must be "aa" or "noaa". */ + if (strcasecmp(argv[arg_index], "aa") != 0 && strcasecmp(argv[arg_index], "noaa") != 0) return false; + aa = strncasecmp(argv[arg_index++], "no", 2) != 0; + if (argc > arg_index) return false; + } + + SetFont(argfs, font, size, aa); + } + + for (FontSize fs = FS_BEGIN; fs < FS_END; fs++) { + FontCache *fc = FontCache::Get(fs); + FontCacheSubSetting *setting = GetFontCacheSubSetting(fs); + /* Make sure all non sprite fonts are loaded. */ + if (!setting->font.empty() && !fc->HasParent()) { + InitFontCache(fs == FS_MONO); + fc = FontCache::Get(fs); + } + IConsolePrint(CC_DEFAULT, "{}: \"{}\" {} {} [\"{}\" {} {}]", FontSizeToName(fs), fc->GetFontName(), fc->GetFontSize(), GetFontAAState(fs), setting->font, setting->size, setting->aa); + } + + return true; +} + DEF_CONSOLE_CMD(ConSetting) { if (argc == 0) { @@ -2479,6 +2557,7 @@ void IConsoleStdLibRegister() IConsole::CmdRegister("cd", ConChangeDirectory); IConsole::CmdRegister("pwd", ConPrintWorkingDirectory); IConsole::CmdRegister("clear", ConClearBuffer); + IConsole::CmdRegister("font", ConFont); IConsole::CmdRegister("setting", ConSetting); IConsole::CmdRegister("setting_newgame", ConSettingNewgame); IConsole::CmdRegister("list_settings", ConListSettings); diff --git a/src/console_gui.cpp b/src/console_gui.cpp index eaef1e4efa..972ef23b24 100644 --- a/src/console_gui.cpp +++ b/src/console_gui.cpp @@ -31,7 +31,6 @@ #include "safeguards.h" static const uint ICON_HISTORY_SIZE = 20; -static const uint ICON_LINE_SPACING = 2; static const uint ICON_RIGHT_BORDERWIDTH = 10; static const uint ICON_BOTTOM_BORDERWIDTH = 12; @@ -121,14 +120,18 @@ struct IConsoleWindow : Window IConsoleWindow() : Window(&_console_window_desc) { _iconsole_mode = ICONSOLE_OPENED; - this->line_height = FONT_HEIGHT_NORMAL + ICON_LINE_SPACING; - this->line_offset = GetStringBoundingBox("] ").width + 5; this->InitNested(0); this->truncate_timer.SetInterval(3000); ResizeWindow(this, _screen.width, _screen.height / 3); } + void OnInit() override + { + this->line_height = FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.hsep_normal; + this->line_offset = GetStringBoundingBox("] ").width + WidgetDimensions::scaled.frametext.left; + } + void Close() override { _iconsole_mode = ICONSOLE_CLOSED; @@ -156,20 +159,20 @@ struct IConsoleWindow : Window void OnPaint() override { - const int right = this->width - 5; + const int right = this->width - WidgetDimensions::scaled.frametext.right; GfxFillRect(0, 0, this->width - 1, this->height - 1, PC_BLACK); int ypos = this->height - this->line_height; for (size_t line_index = IConsoleWindow::scroll; line_index < _iconsole_buffer.size(); line_index++) { const IConsoleLine &print = _iconsole_buffer[line_index]; SetDParamStr(0, print.buffer); - ypos = DrawStringMultiLine(5, right, -this->line_height, ypos, STR_JUST_RAW_STRING, print.colour, SA_LEFT | SA_BOTTOM | SA_FORCE) - ICON_LINE_SPACING; + ypos = DrawStringMultiLine(WidgetDimensions::scaled.frametext.left, right, -this->line_height, ypos, STR_JUST_RAW_STRING, print.colour, SA_LEFT | SA_BOTTOM | SA_FORCE) - WidgetDimensions::scaled.hsep_normal; if (ypos < 0) break; } /* If the text is longer than the window, don't show the starting ']' */ int delta = this->width - this->line_offset - _iconsole_cmdline.pixels - ICON_RIGHT_BORDERWIDTH; if (delta > 0) { - DrawString(5, right, this->height - this->line_height, "]", (TextColour)CC_COMMAND, SA_LEFT | SA_FORCE); + DrawString(WidgetDimensions::scaled.frametext.left, right, this->height - this->line_height, "]", (TextColour)CC_COMMAND, SA_LEFT | SA_FORCE); delta = 0; } diff --git a/src/core/geometry_func.cpp b/src/core/geometry_func.cpp index dccef72ecc..3dd680347c 100644 --- a/src/core/geometry_func.cpp +++ b/src/core/geometry_func.cpp @@ -48,3 +48,5 @@ Rect BoundingRect(const Rect &r1, const Rect &r2) return r; } + +const RectPadding RectPadding::zero = {0, 0, 0, 0}; diff --git a/src/core/geometry_type.hpp b/src/core/geometry_type.hpp index cba944fb6f..36933de6ef 100644 --- a/src/core/geometry_type.hpp +++ b/src/core/geometry_type.hpp @@ -43,12 +43,182 @@ struct Dimension { } }; +/** Padding dimensions to apply to each side of a Rect. */ +struct RectPadding { + uint8 left; + uint8 top; + uint8 right; + uint8 bottom; + + static const RectPadding zero; + + /** + * Get total horizontal padding of RectPadding. + * @return total horizontal padding. + */ + inline uint Horizontal() const { return this->left + this->right; } + + /** + * Get total vertical padding of RectPadding. + * @return total vertical padding. + */ + inline uint Vertical() const { return this->top + this->bottom; } +}; + /** Specification of a rectangle with absolute coordinates of all edges */ struct Rect { int left; int top; int right; int bottom; + + /** + * Get width of Rect. + * @return width of Rect. + */ + inline int Width() const { return this->right - this->left + 1; } + + /** + * Get height of Rect. + * @return height of Rect. + */ + inline int Height() const { return this->bottom - this->top + 1; } + + /** + * Copy and shrink Rect by s pixels. + * @param s number of pixels to remove from each side of Rect. + * @return the new smaller Rect. + */ + [[nodiscard]] inline Rect Shrink(int s) const + { + return {this->left + s, this->top + s, this->right - s, this->bottom - s}; + } + + /** + * Copy and shrink Rect by h horizontal and v vertical pixels. + * @param h number of pixels to remove from left and right sides. + * @param v number of pixels to remove from top and bottom sides. + * @return the new smaller Rect. + */ + [[nodiscard]] inline Rect Shrink(int h, int v) const + { + return {this->left + h, this->top + v, this->right - h, this->bottom - v}; + } + + /** + * Copy and shrink Rect by pixels. + * @param left number of pixels to remove from left side. + * @param top number of pixels to remove from top side. + * @param right number of pixels to remove from right side. + * @param bottom number of pixels to remove from bottom side. + * @return the new smaller Rect. + */ + [[nodiscard]] inline Rect Shrink(int left, int top, int right, int bottom) const + { + return {this->left + left, this->top + top, this->right - right, this->bottom - bottom}; + } + + /** + * Copy and shrink Rect by a RectPadding. + * @param other RectPadding to remove from each side of Rect. + * @return the new smaller Rect. + */ + [[nodiscard]] inline Rect Shrink(const RectPadding &other) const + { + return {this->left + other.left, this->top + other.top, this->right - other.right, this->bottom - other.bottom}; + } + + /** + * Copy and shrink Rect by a different horizontal and vertical RectPadding. + * @param horz RectPadding to remove from left and right of Rect. + * @param vert RectPadding to remove from top and bottom of Rect. + * @return the new smaller Rect. + */ + [[nodiscard]] inline Rect Shrink(const RectPadding &horz, const RectPadding &vert) const + { + return {this->left + horz.left, this->top + vert.top, this->right - horz.right, this->bottom - vert.bottom}; + } + + /** + * Copy and expand Rect by s pixels. + * @param s number of pixels to add to each side of Rect. + * @return the new larger Rect. + */ + [[nodiscard]] inline Rect Expand(int s) const + { + return this->Shrink(-s); + } + + /** + * Copy and expand Rect by a RectPadding. + * @param other RectPadding to add to each side of Rect. + * @return the new larger Rect. + */ + [[nodiscard]] inline Rect Expand(const RectPadding &other) const + { + return {this->left - other.left, this->top - other.top, this->right + other.right, this->bottom + other.bottom}; + } + + /** + * Copy and translate Rect by x,y pixels. + * @param x number of pixels to move horizontally. + * @param y number of pixels to move vertically. + * @return the new translated Rect. + */ + [[nodiscard]] inline Rect Translate(int x, int y) const + { + return {this->left + x, this->top + y, this->right + x, this->bottom + y}; + } + + /** + * Copy Rect and set its width. + * @param width width in pixels for new Rect. + * @param end if set, set width at end of Rect, i.e. on right. + * @return the new resized Rect. + */ + [[nodiscard]] inline Rect WithWidth(int width, bool end) const + { + return end + ? Rect {this->right - width + 1, this->top, this->right, this->bottom} + : Rect {this->left, this->top, this->left + width - 1, this->bottom}; + } + + /** + * Copy Rect and indent it from its position. + * @param indent offset in pixels for new Rect. + * @param end if set, set indent at end of Rect, i.e. on right. + * @return the new resized Rect. + */ + [[nodiscard]] inline Rect Indent(int indent, bool end) const + { + return end + ? Rect {this->left, this->top, this->right - indent, this->bottom} + : Rect {this->left + indent, this->top, this->right, this->bottom}; + } + + /** + * Copy Rect and set its height. + * @param width height in pixels for new Rect. + * @param end if set, set height at end of Rect, i.e. at bottom. + * @return the new resized Rect. + */ + [[nodiscard]] inline Rect WithHeight(int height, bool end = false) const + { + return end + ? Rect {this->left, this->bottom - height + 1, this->right, this->bottom} + : Rect {this->left, this->top, this->right, this->top + height - 1}; + } + + /** + * Test if a point falls inside this Rect. + * @param pt the point to test. + * @return true iif the point falls inside the Rect. + */ + inline bool Contains(const Point &pt) const + { + /* This is a local version of IsInsideMM, to avoid including math_func everywhere. */ + return (uint)(pt.x - this->left) < (uint)(this->right - this->left) && (uint)(pt.y - this->top) < (uint)(this->bottom - this->top); + } }; /** diff --git a/src/depot_gui.cpp b/src/depot_gui.cpp index f95f9ade60..7f454946ce 100644 --- a/src/depot_gui.cpp +++ b/src/depot_gui.cpp @@ -24,11 +24,14 @@ #include "tilehighlight_func.h" #include "window_gui.h" #include "vehiclelist.h" +#include "vehicle_func.h" #include "order_backup.h" #include "zoom_func.h" +#include "error.h" #include "depot_cmd.h" #include "train_cmd.h" #include "vehicle_cmd.h" +#include "core/geometry_func.hpp" #include "widgets/depot_widget.h" @@ -190,17 +193,17 @@ static void InitBlocksizeForVehicles(VehicleType type, EngineImageType image_typ if ((int)x + x_offs > max_extend_right) max_extend_right = x + x_offs; } - int min_extend = ScaleGUITrad(16); - int max_extend = ScaleGUITrad(98); + int min_extend = ScaleSpriteTrad(16); + int max_extend = ScaleSpriteTrad(98); switch (image_type) { case EIT_IN_DEPOT: - _base_block_sizes_depot[type].height = std::max(ScaleGUITrad(GetVehicleHeight(type)), max_height); + _base_block_sizes_depot[type].height = std::max(ScaleSpriteTrad(GetVehicleHeight(type)), max_height); _base_block_sizes_depot[type].extend_left = Clamp(max_extend_left, min_extend, max_extend); _base_block_sizes_depot[type].extend_right = Clamp(max_extend_right, min_extend, max_extend); break; case EIT_PURCHASE: - _base_block_sizes_purchase[type].height = std::max(ScaleGUITrad(GetVehicleHeight(type)), max_height); + _base_block_sizes_purchase[type].height = std::max(ScaleSpriteTrad(GetVehicleHeight(type)), max_height); _base_block_sizes_purchase[type].extend_left = Clamp(max_extend_left, min_extend, max_extend); _base_block_sizes_purchase[type].extend_right = Clamp(max_extend_right, min_extend, max_extend); break; @@ -303,18 +306,15 @@ struct DepotWindow : Window { /** * Draw a vehicle in the depot window in the box with the top left corner at x,y. * @param v Vehicle to draw. - * @param left Left side of the box to draw in. - * @param right Right side of the box to draw in. - * @param y Top of the box to draw in. + * @param r Rect to draw in. */ - void DrawVehicleInDepot(const Vehicle *v, int left, int right, int y) const + void DrawVehicleInDepot(const Vehicle *v, const Rect &r) const { bool free_wagon = false; - int sprite_y = y + (this->resize.step_height - ScaleGUITrad(GetVehicleHeight(v->type))) / 2; bool rtl = _current_text_dir == TD_RTL; - int image_left = rtl ? left + this->count_width : left + this->header_width; - int image_right = rtl ? right - this->header_width : right - this->count_width; + Rect text = r.Shrink(RectPadding::zero, WidgetDimensions::scaled.matrix); /* Ract for text elements, horizontal is already applied. */ + Rect image = r.Indent(this->header_width, rtl).Indent(this->count_width, !rtl); /* Rect for vehicle images */ switch (v->type) { case VEH_TRAIN: { @@ -322,45 +322,45 @@ struct DepotWindow : Window { free_wagon = u->IsFreeWagon(); uint x_space = free_wagon ? - ScaleGUITrad(_consistent_train_width != 0 ? _consistent_train_width : TRAININFO_DEFAULT_VEHICLE_WIDTH) : + ScaleSpriteTrad(_consistent_train_width != 0 ? _consistent_train_width : TRAININFO_DEFAULT_VEHICLE_WIDTH) : 0; - DrawTrainImage(u, image_left + (rtl ? 0 : x_space), image_right - (rtl ? x_space : 0), sprite_y - 1, - this->sel, EIT_IN_DEPOT, free_wagon ? 0 : this->hscroll->GetPosition(), this->vehicle_over); + DrawTrainImage(u, image.Indent(x_space, rtl), this->sel, EIT_IN_DEPOT, free_wagon ? 0 : this->hscroll->GetPosition(), this->vehicle_over); /* Length of consist in tiles with 1 fractional digit (rounded up) */ SetDParam(0, CeilDiv(u->gcache.cached_total_length * 10, TILE_SIZE)); SetDParam(1, 1); - DrawString(rtl ? left + WD_FRAMERECT_LEFT : right - this->count_width, rtl ? left + this->count_width : right - WD_FRAMERECT_RIGHT, y + (this->resize.step_height - FONT_HEIGHT_SMALL) / 2, STR_TINY_BLACK_DECIMAL, TC_FROMSTRING, SA_RIGHT); // Draw the counter + Rect count = text.WithWidth(this->count_width - WidgetDimensions::scaled.hsep_normal, !rtl); + DrawString(count.left, count.right, count.bottom - FONT_HEIGHT_SMALL + 1, STR_TINY_BLACK_DECIMAL, TC_FROMSTRING, SA_RIGHT); // Draw the counter break; } - case VEH_ROAD: DrawRoadVehImage( v, image_left, image_right, sprite_y, this->sel, EIT_IN_DEPOT); break; - case VEH_SHIP: DrawShipImage( v, image_left, image_right, sprite_y, this->sel, EIT_IN_DEPOT); break; - case VEH_AIRCRAFT: DrawAircraftImage(v, image_left, image_right, sprite_y, this->sel, EIT_IN_DEPOT); break; + case VEH_ROAD: DrawRoadVehImage( v, image, this->sel, EIT_IN_DEPOT); break; + case VEH_SHIP: DrawShipImage( v, image, this->sel, EIT_IN_DEPOT); break; + case VEH_AIRCRAFT: DrawAircraftImage(v, image, this->sel, EIT_IN_DEPOT); break; default: NOT_REACHED(); } uint diff_x, diff_y; if (v->IsGroundVehicle()) { /* Arrange unitnumber and flag horizontally */ - diff_x = this->flag_width + WD_FRAMERECT_LEFT; - diff_y = (this->resize.step_height - this->flag_height) / 2 - 2; + diff_x = this->flag_size.width + WidgetDimensions::scaled.hsep_normal; + diff_y = WidgetDimensions::scaled.matrix.top; } else { /* Arrange unitnumber and flag vertically */ - diff_x = WD_FRAMERECT_LEFT; - diff_y = FONT_HEIGHT_NORMAL + WD_PAR_VSEP_NORMAL; + diff_x = 0; + diff_y = WidgetDimensions::scaled.matrix.top + FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; } - int text_left = rtl ? right - this->header_width - 1 : left + diff_x; - int text_right = rtl ? right - diff_x : left + this->header_width - 1; + text = text.WithWidth(this->header_width - WidgetDimensions::scaled.hsep_normal, rtl).WithHeight(FONT_HEIGHT_NORMAL).Indent(diff_x, rtl); if (free_wagon) { - DrawString(text_left, text_right, y + 2, STR_DEPOT_NO_ENGINE); + DrawString(text, STR_DEPOT_NO_ENGINE); } else { - DrawSprite((v->vehstatus & VS_STOPPED) ? SPR_FLAG_VEH_STOPPED : SPR_FLAG_VEH_RUNNING, PAL_NONE, rtl ? right - this->flag_width : left + WD_FRAMERECT_LEFT, y + diff_y); + Rect flag = r.WithWidth(this->flag_size.width, rtl).WithHeight(this->flag_size.height).Translate(0, diff_y); + DrawSpriteIgnorePadding((v->vehstatus & VS_STOPPED) ? SPR_FLAG_VEH_STOPPED : SPR_FLAG_VEH_RUNNING, PAL_NONE, flag, false, SA_CENTER); SetDParam(0, v->unitnumber); - DrawString(text_left, text_right, y + 2, (uint16)(v->max_age - DAYS_IN_LEAP_YEAR) >= v->age ? STR_BLACK_COMMA : STR_RED_COMMA); + DrawString(text, (uint16)(v->max_age - DAYS_IN_LEAP_YEAR) >= v->age ? STR_BLACK_COMMA : STR_RED_COMMA); } } @@ -373,24 +373,28 @@ struct DepotWindow : Window { /* Set the row and number of boxes in each row based on the number of boxes drawn in the matrix */ const NWidgetCore *wid = this->GetWidget(WID_D_MATRIX); + /* Set up rect for each cell */ + Rect ir = r.WithHeight(this->resize.step_height); + if (this->num_columns != 1) ir = ir.WithWidth(this->resize.step_width, rtl); + ir = ir.Shrink(WidgetDimensions::scaled.framerect, RectPadding::zero); + /* Draw vertical separators at whole tiles. * This only works in two cases: * - All vehicles use VEHICLEINFO_FULL_VEHICLE_WIDTH as reference width. * - All vehicles are 8/8. This cannot be checked for NewGRF, so instead we check for "all vehicles are original vehicles". */ if (this->type == VEH_TRAIN && _consistent_train_width != 0) { - int w = ScaleGUITrad(2 * _consistent_train_width); + int w = ScaleSpriteTrad(2 * _consistent_train_width); int col = _colour_gradient[wid->colour][4]; - int image_left = rtl ? r.left + this->count_width : r.left + this->header_width; - int image_right = rtl ? r.right - this->header_width : r.right - this->count_width; + Rect image = ir.Indent(this->header_width, rtl).Indent(this->count_width, !rtl); int first_line = w + (-this->hscroll->GetPosition()) % w; if (rtl) { - for (int x = image_right - first_line; x >= image_left; x -= w) { - GfxDrawLine(x, r.top, x, r.bottom, col, 1, 3); + for (int x = image.right - first_line; x >= image.left; x -= w) { + GfxDrawLine(x, r.top, x, r.bottom, col, ScaleGUITrad(1), ScaleGUITrad(3)); } } else { - for (int x = image_left + first_line; x <= image_right; x += w) { - GfxDrawLine(x, r.top, x, r.bottom, col, 1, 3); + for (int x = image.left + first_line; x <= image.right; x += w) { + GfxDrawLine(x, r.top, x, r.bottom, col, ScaleGUITrad(1), ScaleGUITrad(3)); } } } @@ -399,26 +403,22 @@ struct DepotWindow : Window { uint num = this->vscroll->GetPosition() * this->num_columns; uint maxval = static_cast(std::min(this->vehicle_list.size(), num + (rows_in_display * this->num_columns))); - int y; - for (y = r.top + 1; num < maxval; y += this->resize.step_height) { // Draw the rows + for (; num < maxval; ir = ir.Translate(0, this->resize.step_height)) { // Draw the rows + Rect cell = ir; /* Keep track of horizontal cells */ for (uint i = 0; i < this->num_columns && num < maxval; i++, num++) { /* Draw all vehicles in the current row */ const Vehicle *v = this->vehicle_list[num]; - if (this->num_columns == 1) { - this->DrawVehicleInDepot(v, r.left, r.right, y); - } else { - int x = r.left + (rtl ? (this->num_columns - i - 1) : i) * this->resize.step_width; - this->DrawVehicleInDepot(v, x, x + this->resize.step_width - 1, y); - } + this->DrawVehicleInDepot(v, cell); + cell = cell.Translate(rtl ? -(int)this->resize.step_width : (int)this->resize.step_width, 0); } } maxval = static_cast(std::min(this->vehicle_list.size() + this->wagon_list.size(), (this->vscroll->GetPosition() * this->num_columns) + (rows_in_display * this->num_columns))); /* Draw the train wagons without an engine in front. */ - for (; num < maxval; num++, y += this->resize.step_height) { + for (; num < maxval; num++, ir = ir.Translate(0, this->resize.step_height)) { const Vehicle *v = this->wagon_list[num - this->vehicle_list.size()]; - this->DrawVehicleInDepot(v, r.left, r.right, y); + this->DrawVehicleInDepot(v, ir); } } @@ -484,7 +484,7 @@ struct DepotWindow : Window { pos -= (uint)this->vehicle_list.size(); *veh = this->wagon_list[pos]; /* free wagons don't have an initial loco. */ - x -= ScaleGUITrad(VEHICLEINFO_FULL_VEHICLE_WIDTH); + x -= ScaleSpriteTrad(VEHICLEINFO_FULL_VEHICLE_WIDTH); wagon = true; } @@ -501,12 +501,12 @@ struct DepotWindow : Window { FALLTHROUGH; case VEH_ROAD: - if (xm <= this->flag_width) return MODE_START_STOP; + if (xm <= this->flag_size.width) return MODE_START_STOP; break; case VEH_SHIP: case VEH_AIRCRAFT: - if (xm <= this->flag_width && ym >= (uint)(FONT_HEIGHT_NORMAL + WD_PAR_VSEP_NORMAL)) return MODE_START_STOP; + if (xm <= this->flag_size.width && ym >= (uint)(FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal)) return MODE_START_STOP; break; default: NOT_REACHED(); @@ -643,10 +643,16 @@ struct DepotWindow : Window { } } - uint count_width; - uint header_width; - uint flag_width; - uint flag_height; + uint count_width; ///< Width of length count, including separator. + uint header_width; ///< Width of unit number and flag, including separator. + Dimension flag_size; ///< Size of start/stop flag. + VehicleCellSize cell_size; ///< Vehicle sprite cell size. + + void OnInit() override + { + this->cell_size = GetVehicleImageCellSize(this->type, EIT_IN_DEPOT); + this->flag_size = maxdim(GetScaledSpriteSize(SPR_FLAG_VEH_STOPPED), GetScaledSpriteSize(SPR_FLAG_VEH_RUNNING)); + } void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override { @@ -657,33 +663,30 @@ struct DepotWindow : Window { if (this->type == VEH_TRAIN) { SetDParamMaxValue(0, 1000, 0, FS_SMALL); SetDParam(1, 1); - this->count_width = GetStringBoundingBox(STR_TINY_BLACK_DECIMAL).width + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; + this->count_width = GetStringBoundingBox(STR_TINY_BLACK_DECIMAL).width + WidgetDimensions::scaled.hsep_normal; } else { this->count_width = 0; } SetDParamMaxDigits(0, this->unitnumber_digits); Dimension unumber = GetStringBoundingBox(STR_BLACK_COMMA); - const Sprite *spr = GetSprite(SPR_FLAG_VEH_STOPPED, ST_NORMAL); - this->flag_width = UnScaleGUI(spr->width) + WD_FRAMERECT_RIGHT; - this->flag_height = UnScaleGUI(spr->height); if (this->type == VEH_TRAIN || this->type == VEH_ROAD) { - min_height = std::max(unumber.height + WD_MATRIX_TOP, UnScaleGUI(spr->height)); - this->header_width = unumber.width + this->flag_width + WD_FRAMERECT_LEFT; + min_height = std::max(unumber.height, this->flag_size.height); + this->header_width = unumber.width + WidgetDimensions::scaled.hsep_normal + this->flag_size.width + WidgetDimensions::scaled.hsep_normal; } else { - min_height = unumber.height + UnScaleGUI(spr->height) + WD_MATRIX_TOP + WD_PAR_VSEP_NORMAL + WD_MATRIX_BOTTOM; - this->header_width = std::max(unumber.width, this->flag_width) + WD_FRAMERECT_RIGHT; + min_height = unumber.height + WidgetDimensions::scaled.vsep_normal + this->flag_size.height; + this->header_width = std::max(unumber.width, this->flag_size.width) + WidgetDimensions::scaled.hsep_normal; } - int base_width = this->count_width + this->header_width; + int base_width = this->count_width + this->header_width + padding.width; - resize->height = std::max(GetVehicleImageCellSize(this->type, EIT_IN_DEPOT).height, min_height); + resize->height = std::max(this->cell_size.height, min_height + padding.height); if (this->type == VEH_TRAIN) { resize->width = 1; - size->width = base_width + 2 * ScaleGUITrad(29); // about 2 parts + size->width = base_width + 2 * ScaleSpriteTrad(29); // about 2 parts size->height = resize->height * 6; } else { - resize->width = base_width + GetVehicleImageCellSize(this->type, EIT_IN_DEPOT).extend_left + GetVehicleImageCellSize(this->type, EIT_IN_DEPOT).extend_right; + resize->width = base_width + this->cell_size.extend_left + this->cell_size.extend_right; size->width = resize->width * (this->type == VEH_ROAD ? 5 : 3); size->height = resize->height * (this->type == VEH_ROAD ? 5 : 3); } @@ -723,7 +726,7 @@ struct DepotWindow : Window { /* determine amount of items for scroller */ if (this->type == VEH_TRAIN) { - uint max_width = ScaleGUITrad(VEHICLEINFO_FULL_VEHICLE_WIDTH); + uint max_width = ScaleSpriteTrad(VEHICLEINFO_FULL_VEHICLE_WIDTH); for (uint num = 0; num < this->vehicle_list.size(); num++) { uint width = 0; for (const Train *v = Train::From(this->vehicle_list[num]); v != nullptr; v = v->Next()) { @@ -734,7 +737,7 @@ struct DepotWindow : Window { /* Always have 1 empty row, so people can change the setting of the train */ this->vscroll->SetCount((uint)this->vehicle_list.size() + (uint)this->wagon_list.size() + 1); /* Always make it longer than the longest train, so you can attach vehicles at the end, and also see the next vertical tile separator line */ - this->hscroll->SetCount(max_width + ScaleGUITrad(2 * VEHICLEINFO_FULL_VEHICLE_WIDTH + 1)); + this->hscroll->SetCount(max_width + ScaleSpriteTrad(2 * VEHICLEINFO_FULL_VEHICLE_WIDTH + 1)); } else { this->vscroll->SetCount(CeilDiv((uint)this->vehicle_list.size(), this->num_columns)); } @@ -916,6 +919,49 @@ struct DepotWindow : Window { return true; } + /** + * Clones a vehicle from a vehicle list. If this doesn't make sense (because not all vehicles in the list have the same orders), then it displays an error. + * @return This always returns true, which indicates that the contextual action handled the mouse click. + * Note that it's correct behaviour to always handle the click even though an error is displayed, + * because users aren't going to expect the default action to be performed just because they overlooked that cloning doesn't make sense. + */ + bool OnVehicleSelect(VehicleList::const_iterator begin, VehicleList::const_iterator end) override + { + if (!_ctrl_pressed) { + /* If CTRL is not pressed: If all the vehicles in this list have the same orders, then copy orders */ + if (AllEqual(begin, end, [](const Vehicle *v1, const Vehicle *v2) { + return VehiclesHaveSameEngineList(v1, v2); + })) { + if (AllEqual(begin, end, [](const Vehicle *v1, const Vehicle *v2) { + return VehiclesHaveSameOrderList(v1, v2); + })) { + OnVehicleSelect(*begin); + } else { + ShowErrorMessage(STR_ERROR_CAN_T_BUY_TRAIN + (*begin)->type, STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST, WL_INFO); + } + } else { + ShowErrorMessage(STR_ERROR_CAN_T_BUY_TRAIN + (*begin)->type, STR_ERROR_CAN_T_CLONE_VEHICLE_LIST, WL_INFO); + } + } else { + /* If CTRL is pressed: If all the vehicles in this list share orders, then copy orders */ + if (AllEqual(begin, end, [](const Vehicle *v1, const Vehicle *v2) { + return VehiclesHaveSameEngineList(v1, v2); + })) { + if (AllEqual(begin, end, [](const Vehicle *v1, const Vehicle *v2) { + return v1->FirstShared() == v2->FirstShared(); + })) { + OnVehicleSelect(*begin); + } else { + ShowErrorMessage(STR_ERROR_CAN_T_BUY_TRAIN + (*begin)->type, STR_ERROR_CAN_T_SHARE_ORDER_VEHICLE_LIST, WL_INFO); + } + } else { + ShowErrorMessage(STR_ERROR_CAN_T_BUY_TRAIN + (*begin)->type, STR_ERROR_CAN_T_CLONE_VEHICLE_LIST, WL_INFO); + } + } + + return true; + } + void OnPlaceObjectAbort() override { /* abort clone */ diff --git a/src/dock_gui.cpp b/src/dock_gui.cpp index f5149b8b07..c8f0ad46a3 100644 --- a/src/dock_gui.cpp +++ b/src/dock_gui.cpp @@ -192,7 +192,7 @@ struct BuildDocksToolbarWindow : Window { { switch (this->last_clicked_widget) { case WID_DT_CANAL: // Build canal button - VpStartPlaceSizing(tile, (_game_mode == GM_EDITOR) ? VPM_X_AND_Y : VPM_X_OR_Y, DDSP_CREATE_WATER); + VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_CREATE_WATER); break; case WID_DT_LOCK: // Build lock button @@ -447,9 +447,9 @@ public: /* strings such as 'Size' and 'Coverage Area' */ Rect r = this->GetWidget(BDSW_ACCEPTANCE)->GetCurrentRect(); - int top = r.top + ScaleGUITrad(WD_PAR_VSEP_NORMAL); - top = DrawStationCoverageAreaText(r.left, r.right, top, SCT_ALL, rad, false) + ScaleGUITrad(WD_PAR_VSEP_NORMAL); - top = DrawStationCoverageAreaText(r.left, r.right, top, SCT_ALL, rad, true) + ScaleGUITrad(WD_PAR_VSEP_NORMAL); + int top = r.top + WidgetDimensions::scaled.vsep_normal; + top = DrawStationCoverageAreaText(r.left, r.right, top, SCT_ALL, rad, false) + WidgetDimensions::scaled.vsep_normal; + top = DrawStationCoverageAreaText(r.left, r.right, top, SCT_ALL, rad, true) + WidgetDimensions::scaled.vsep_normal; /* Resize background if the window is too small. * Never make the window smaller to avoid oscillating if the size change affects the acceptance. * (This is the case, if making the window bigger moves the mouse into the window.) */ @@ -486,12 +486,12 @@ static const NWidgetPart _nested_build_dock_station_widgets[] = { NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_STATION_BUILD_DOCK_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), EndContainer(), NWidget(WWT_PANEL, COLOUR_DARK_GREEN, BDSW_BACKGROUND), - NWidget(WWT_LABEL, COLOUR_DARK_GREEN, BDSW_INFO), SetPadding(WD_FRAMERECT_TOP, WD_FRAMERECT_RIGHT, WD_FRAMERECT_BOTTOM, WD_FRAMERECT_LEFT), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), SetFill(1, 0), + NWidget(WWT_LABEL, COLOUR_DARK_GREEN, BDSW_INFO), SetPadding(WidgetDimensions::unscaled.framerect), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), SetFill(1, 0), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(14, 0, 14), NWidget(WWT_TEXTBTN, COLOUR_GREY, BDSW_LT_OFF), SetMinimalSize(60, 12), SetFill(1, 0), SetDataTip(STR_STATION_BUILD_COVERAGE_OFF, STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP), NWidget(WWT_TEXTBTN, COLOUR_GREY, BDSW_LT_ON), SetMinimalSize(60, 12), SetFill(1, 0), SetDataTip(STR_STATION_BUILD_COVERAGE_ON, STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP), EndContainer(), - NWidget(WWT_EMPTY, COLOUR_GREY, BDSW_ACCEPTANCE), SetPadding(0, WD_FRAMERECT_RIGHT, 0, WD_FRAMERECT_LEFT), SetResize(0, 1), + NWidget(WWT_EMPTY, COLOUR_GREY, BDSW_ACCEPTANCE), SetPadding(WidgetDimensions::unscaled.framerect), SetResize(0, 1), EndContainer(), }; @@ -531,25 +531,35 @@ public: switch (widget) { case WID_BDD_X: case WID_BDD_Y: - size->width = ScaleGUITrad(96) + 2; - size->height = ScaleGUITrad(64) + 2; + size->width = ScaleGUITrad(96) + WidgetDimensions::scaled.fullbevel.Horizontal(); + size->height = ScaleGUITrad(64) + WidgetDimensions::scaled.fullbevel.Vertical(); break; } } - void OnPaint() override + void DrawWidget(const Rect &r, int widget) const override { - this->DrawWidgets(); + DrawPixelInfo tmp_dpi; - int x1 = ScaleGUITrad(63) + 1; - int x2 = ScaleGUITrad(31) + 1; - int y1 = ScaleGUITrad(17) + 1; - int y2 = ScaleGUITrad(33) + 1; + switch (widget) { + case WID_BDD_X: + case WID_BDD_Y: { + Axis axis = widget == WID_BDD_X ? AXIS_X : AXIS_Y; - DrawShipDepotSprite(this->GetWidget(WID_BDD_X)->pos_x + x1, this->GetWidget(WID_BDD_X)->pos_y + y1, AXIS_X, DEPOT_PART_NORTH); - DrawShipDepotSprite(this->GetWidget(WID_BDD_X)->pos_x + x2, this->GetWidget(WID_BDD_X)->pos_y + y2, AXIS_X, DEPOT_PART_SOUTH); - DrawShipDepotSprite(this->GetWidget(WID_BDD_Y)->pos_x + x2, this->GetWidget(WID_BDD_Y)->pos_y + y1, AXIS_Y, DEPOT_PART_NORTH); - DrawShipDepotSprite(this->GetWidget(WID_BDD_Y)->pos_x + x1, this->GetWidget(WID_BDD_Y)->pos_y + y2, AXIS_Y, DEPOT_PART_SOUTH); + if (FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.Width(), r.Height())) { + DrawPixelInfo *old_dpi = _cur_dpi; + _cur_dpi = &tmp_dpi; + int x = (r.Width() - ScaleSpriteTrad(96)) / 2; + int y = (r.Height() - ScaleSpriteTrad(64)) / 2; + int x1 = ScaleSpriteTrad(63); + int x2 = ScaleSpriteTrad(31); + DrawShipDepotSprite(x + (axis == AXIS_X ? x1 : x2), y + ScaleSpriteTrad(17), axis, DEPOT_PART_NORTH); + DrawShipDepotSprite(x + (axis == AXIS_X ? x2 : x1), y + ScaleSpriteTrad(33), axis, DEPOT_PART_SOUTH); + _cur_dpi = old_dpi; + } + break; + } + } } void OnClick(Point pt, int widget, int click_count) override @@ -574,17 +584,14 @@ static const NWidgetPart _nested_build_docks_depot_widgets[] = { NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_DEPOT_BUILD_SHIP_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), EndContainer(), NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BDD_BACKGROUND), - NWidget(NWID_SPACER), SetMinimalSize(0, 3), - NWidget(NWID_HORIZONTAL_LTR), - NWidget(NWID_SPACER), SetMinimalSize(3, 0), - NWidget(WWT_PANEL, COLOUR_GREY, WID_BDD_X), SetMinimalSize(98, 66), SetDataTip(0x0, STR_DEPOT_BUILD_SHIP_ORIENTATION_TOOLTIP), + NWidget(NWID_HORIZONTAL), SetPadding(3), + NWidget(NWID_SPACER), SetFill(1, 0), + NWidget(NWID_HORIZONTAL_LTR), SetPIP(0, 2, 0), + NWidget(WWT_PANEL, COLOUR_GREY, WID_BDD_X), SetMinimalSize(98, 66), SetDataTip(0x0, STR_DEPOT_BUILD_SHIP_ORIENTATION_TOOLTIP), EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY, WID_BDD_Y), SetMinimalSize(98, 66), SetDataTip(0x0, STR_DEPOT_BUILD_SHIP_ORIENTATION_TOOLTIP), EndContainer(), EndContainer(), - NWidget(NWID_SPACER), SetMinimalSize(2, 0), - NWidget(WWT_PANEL, COLOUR_GREY, WID_BDD_Y), SetMinimalSize(98, 66), SetDataTip(0x0, STR_DEPOT_BUILD_SHIP_ORIENTATION_TOOLTIP), - EndContainer(), - NWidget(NWID_SPACER), SetMinimalSize(3, 0), + NWidget(NWID_SPACER), SetFill(1, 0), EndContainer(), - NWidget(NWID_SPACER), SetMinimalSize(0, 3), EndContainer(), }; diff --git a/src/economy.cpp b/src/economy.cpp index bc3fa29894..5e8318fd0d 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -101,6 +101,8 @@ Economy _economy; Prices _price; static PriceMultipliers _price_base_multiplier; +extern int GetAmountOwnedBy(const Company *c, Owner owner); + /** * Calculate the value of the company. That is the value of all * assets (vehicles, stations, shares) and money minus the loan, @@ -115,18 +117,12 @@ Money CalculateCompanyValue(const Company *c, bool including_loan) Money owned_shares_value = 0; for (const Company *co : Company::Iterate()) { - uint8 shares_owned = 0; + int shares_owned = GetAmountOwnedBy(co, c->index); - for (uint8 i = 0; i < 4; i++) { - if (co->share_owners[i] == c->index) { - shares_owned++; - } - } - - owned_shares_value += (CalculateCompanyValueExcludingShares(co) / 4) * shares_owned; + if (shares_owned > 0) owned_shares_value += (CalculateCompanyValueExcludingShares(co) / 4) * shares_owned; } - return std::max(owned_shares_value + CalculateCompanyValueExcludingShares(c), 1); + return owned_shares_value + CalculateCompanyValueExcludingShares(c); } Money CalculateCompanyValueExcludingShares(const Company *c, bool including_loan) @@ -2018,8 +2014,6 @@ static void DoAcquireCompany(Company *c) delete c; } -extern int GetAmountOwnedBy(const Company *c, Owner owner); - /** * Acquire shares in an opposing company. * @param flags type of operation diff --git a/src/elrail.cpp b/src/elrail.cpp index 03adb0c8c9..6f238ee515 100644 --- a/src/elrail.cpp +++ b/src/elrail.cpp @@ -485,10 +485,11 @@ static void DrawRailCatenaryRailway(const TileInfo *ti) /* * The "wire"-sprite position is inside the tile, i.e. 0 <= sss->?_offset < TILE_SIZE. * Therefore it is safe to use GetSlopePixelZ() for the elevation. - * Also note that the result of GetSlopePixelZ() is very special for bridge-ramps. + * Also note that the result of GetSlopePixelZ() is very special for bridge-ramps, so we round the result up or + * down to the nearest full height change. */ AddSortableSpriteToDraw(wire_base + sss->image_offset, PAL_NONE, ti->x + sss->x_offset, ti->y + sss->y_offset, - sss->x_size, sss->y_size, sss->z_size, GetSlopePixelZ(ti->x + sss->x_offset, ti->y + sss->y_offset) + sss->z_offset, + sss->x_size, sss->y_size, sss->z_size, (GetSlopePixelZ(ti->x + sss->x_offset, ti->y + sss->y_offset) + 4) / 8 * 8 + sss->z_offset, IsTransparencySet(TO_CATENARY)); } } diff --git a/src/engine.cpp b/src/engine.cpp index d1e9cc472f..26259066c3 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -73,6 +73,7 @@ Engine::Engine(VehicleType type, EngineID base) this->grf_prop.local_id = base; this->list_position = base; this->preview_company = INVALID_COMPANY; + this->display_last_variant = INVALID_ENGINE; /* Check if this base engine is within the original engine data range */ if (base >= _engine_counts[type]) { @@ -93,6 +94,8 @@ Engine::Engine(VehicleType type, EngineID base) } /* Set cargo aging period to the default value. */ this->info.cargo_age_period = CARGO_AGING_TICKS; + /* Not a variant */ + this->info.variant_id = INVALID_ENGINE; return; } @@ -535,7 +538,7 @@ void SetupEngines() _engine_pool.CleanPool(); assert(_engine_mngr.size() >= _engine_mngr.NUM_DEFAULT_ENGINES); - uint index = 0; + [[maybe_unused]] uint index = 0; for (const EngineIDMapping &eid : _engine_mngr) { /* Assert is safe; there won't be more than 256 original vehicles * in any case, and we just cleaned the pool. */ @@ -559,13 +562,32 @@ static bool IsWagon(EngineID index) return e->type == VEH_TRAIN && e->u.rail.railveh_type == RAILVEH_WAGON; } +/** + * Ensure engine is not set as the last used variant for any other engine. + * @param engine_id Engine being removed. + * @param type Type of engine. + */ +static void ClearLastVariant(EngineID engine_id, VehicleType type) +{ + for (Engine *e : Engine::IterateType(type)) { + if (e->display_last_variant == engine_id) e->display_last_variant = INVALID_ENGINE; + } +} + /** * Update #Engine::reliability and (if needed) update the engine GUIs. * @param e %Engine to update. */ -static void CalcEngineReliability(Engine *e) +void CalcEngineReliability(Engine *e, bool new_month) { - uint age = e->age; + /* Get source engine for reliability age. This is normally our engine unless variant reliability syncing is requested. */ + Engine *re = e; + while (re->info.variant_id != INVALID_ENGINE && re->info.variant_id != re->index && (re->info.extra_flags & ExtraEngineFlags::SyncReliability) != ExtraEngineFlags::None) { + re = Engine::Get(re->info.variant_id); + } + + uint age = re->age; + if (new_month && re->index > e->index && age != MAX_DAY) age++; /* parent variant's age has not yet updated. */ /* Check for early retirement */ if (e->company_avail != 0 && !_settings_game.vehicle.never_expire_vehicles && e->info.base_life != 0xFF) { @@ -574,6 +596,7 @@ static void CalcEngineReliability(Engine *e) if (retire_early != 0 && age >= retire_early_max_age) { /* Early retirement is enabled and we're past the date... */ e->company_avail = 0; + ClearLastVariant(e->index, e->type); AddRemoveEngineFromAutoreplaceAndBuildWindows(e->type); } } @@ -594,10 +617,10 @@ static void CalcEngineReliability(Engine *e) e->company_avail = 0; e->reliability = e->reliability_final; /* Kick this engine out of the lists */ + ClearLastVariant(e->index, e->type); AddRemoveEngineFromAutoreplaceAndBuildWindows(e->type); } - SetWindowClassesDirty(WC_BUILD_VEHICLE); // Update to show the new reliability - SetWindowClassesDirty(WC_REPLACE_VEHICLE); + } /** Compute the value for #_year_engine_aging_stops. */ @@ -625,8 +648,9 @@ void SetYearEngineAgingStops() * Start/initialise one engine. * @param e The engine to initialise. * @param aging_date The date used for age calculations. + * @param seed Random seed. */ -void StartupOneEngine(Engine *e, Date aging_date) +void StartupOneEngine(Engine *e, Date aging_date, uint32 seed) { const EngineInfo *ei = &e->info; @@ -639,7 +663,7 @@ void StartupOneEngine(Engine *e, Date aging_date) * Make sure they use the same randomisation of the date. */ SavedRandomSeeds saved_seeds; SaveRandomSeeds(&saved_seeds); - SetRandomSeed(_settings_game.game_creation.generation_seed ^ + SetRandomSeed(_settings_game.game_creation.generation_seed ^ seed ^ ei->base_intro ^ e->type ^ e->GetGRFID()); @@ -655,7 +679,17 @@ void StartupOneEngine(Engine *e, Date aging_date) e->flags |= ENGINE_AVAILABLE; } - RestoreRandomSeeds(saved_seeds); + /* Get parent variant index for syncing reliability via random seed. */ + const Engine *re = e; + while (re->info.variant_id != INVALID_ENGINE && re->info.variant_id != re->index && (re->info.extra_flags & ExtraEngineFlags::SyncReliability) != ExtraEngineFlags::None) { + re = Engine::Get(re->info.variant_id); + } + + SetRandomSeed(_settings_game.game_creation.generation_seed ^ seed ^ + (re->index << 16) ^ (re->info.base_intro << 12) ^ (re->info.decay_speed << 8) ^ + (re->info.lifelength << 4) ^ re->info.retire_early ^ + e->type ^ + e->GetGRFID()); r = Random(); e->reliability_start = GB(r, 16, 14) + 0x7AE0; @@ -667,9 +701,9 @@ void StartupOneEngine(Engine *e, Date aging_date) e->duration_phase_2 = GB(r, 5, 4) + ei->base_life * 12 - 96; e->duration_phase_3 = GB(r, 9, 7) + 120; - e->reliability_spd_dec = ei->decay_speed << 2; + RestoreRandomSeeds(saved_seeds); - CalcEngineReliability(e); + e->reliability_spd_dec = ei->decay_speed << 2; /* prevent certain engines from ever appearing. */ if (!HasBit(ei->climates, _settings_game.game_creation.landscape)) { @@ -686,9 +720,13 @@ void StartupEngines() { /* Aging of vehicles stops, so account for that when starting late */ const Date aging_date = std::min(_date, ConvertYMDToDate(_year_engine_aging_stops, 0, 1)); + uint32 seed = Random(); for (Engine *e : Engine::Iterate()) { - StartupOneEngine(e, aging_date); + StartupOneEngine(e, aging_date, seed); + } + for (Engine *e : Engine::Iterate()) { + CalcEngineReliability(e, false); } /* Update the bitmasks for the vehicle lists */ @@ -699,6 +737,9 @@ void StartupEngines() /* Invalidate any open purchase lists */ InvalidateWindowClassesData(WC_BUILD_VEHICLE); + + SetWindowClassesDirty(WC_BUILD_VEHICLE); + SetWindowClassesDirty(WC_REPLACE_VEHICLE); } /** @@ -747,6 +788,7 @@ static void DisableEngineForCompany(EngineID eid, CompanyID company) } if (company == _local_company) { + ClearLastVariant(e->index, e->type); AddRemoveEngineFromAutoreplaceAndBuildWindows(e->type); } } @@ -755,8 +797,9 @@ static void DisableEngineForCompany(EngineID eid, CompanyID company) * Company \a company accepts engine \a eid for preview. * @param eid Engine being accepted (is under preview). * @param company Current company previewing the engine. + * @param recursion_depth Recursion depth to avoid infinite loop. */ -static void AcceptEnginePreview(EngineID eid, CompanyID company) +static void AcceptEnginePreview(EngineID eid, CompanyID company, int recursion_depth = 0) { Engine *e = Engine::Get(eid); @@ -771,6 +814,16 @@ static void AcceptEnginePreview(EngineID eid, CompanyID company) * we have to use the GUI-scope scheduling of InvalidateWindowData. */ InvalidateWindowData(WC_ENGINE_PREVIEW, eid); + + /* Don't search for variants to include if we are 10 levels deep already. */ + if (recursion_depth >= 10) return; + + /* Find variants to be included in preview. */ + for (Engine *ve : Engine::IterateType(e->type)) { + if (ve->index != eid && ve->info.variant_id == eid && (ve->info.extra_flags & ExtraEngineFlags::JoinPreview) != ExtraEngineFlags::None) { + AcceptEnginePreview(ve->index, company, recursion_depth + 1); + } + } } /** @@ -994,7 +1047,7 @@ static void NewVehicleAvailable(Engine *e) if (!IsVehicleTypeDisabled(e->type, true)) AI::BroadcastNewEvent(new ScriptEventEngineAvailable(index)); /* Only provide the "New Vehicle available" news paper entry, if engine can be built. */ - if (!IsVehicleTypeDisabled(e->type, false)) { + if (!IsVehicleTypeDisabled(e->type, false) && (e->info.extra_flags & ExtraEngineFlags::NoNews) == ExtraEngineFlags::None) { SetDParam(0, GetEngineCategoryName(index)); SetDParam(1, index); AddNewsItem(STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE, NT_NEW_VEHICLES, NF_VEHICLE, NR_ENGINE, index); @@ -1013,11 +1066,13 @@ static void NewVehicleAvailable(Engine *e) void EnginesMonthlyLoop() { if (_cur_year < _year_engine_aging_stops) { + bool refresh = false; for (Engine *e : Engine::Iterate()) { /* Age the vehicle */ if ((e->flags & ENGINE_AVAILABLE) && e->age != MAX_DAY) { e->age++; - CalcEngineReliability(e); + CalcEngineReliability(e, true); + refresh = true; } /* Do not introduce invalid engines */ @@ -1036,6 +1091,9 @@ void EnginesMonthlyLoop() /* Do not introduce new rail wagons */ if (IsWagon(e->index)) continue; + /* Engine has no preview */ + if ((e->info.extra_flags & ExtraEngineFlags::NoPreview) != ExtraEngineFlags::None) continue; + /* Show preview dialog to one of the companies. */ e->flags |= ENGINE_EXCLUSIVE_PREVIEW; e->preview_company = INVALID_COMPANY; @@ -1044,6 +1102,11 @@ void EnginesMonthlyLoop() } InvalidateWindowClassesData(WC_BUILD_VEHICLE); // rebuild the purchase list (esp. when sorted by reliability) + + if (refresh) { + SetWindowClassesDirty(WC_BUILD_VEHICLE); + SetWindowClassesDirty(WC_REPLACE_VEHICLE); + } } } diff --git a/src/engine_base.h b/src/engine_base.h index 7822111e77..14af402021 100644 --- a/src/engine_base.h +++ b/src/engine_base.h @@ -21,6 +21,15 @@ struct WagonOverride { const SpriteGroup *group; }; +/** Flags used client-side in the purchase/autorenew engine list. */ +enum class EngineDisplayFlags : byte { + None = 0, ///< No flag set. + HasVariants = (1U << 0), ///< Set if engine has variants. + IsFolded = (1U << 1), ///< Set if display of variants should be folded (hidden). + Shaded = (1U << 2), ///< Set if engine should be masked. +}; +DECLARE_ENUM_AS_BIT_SET(EngineDisplayFlags) + typedef Pool EnginePool; extern EnginePool _engine_pool; @@ -45,6 +54,9 @@ struct Engine : EnginePool::PoolItem<&_engine_pool> { uint8 original_image_index; ///< Original vehicle image index, thus the image index of the overridden vehicle VehicleType type; ///< %Vehicle type, ie #VEH_ROAD, #VEH_TRAIN, etc. + EngineDisplayFlags display_flags; ///< NOSAVE client-side-only display flags for build engine list. + EngineID display_last_variant; ///< NOSAVE client-side-only last variant selected. + EngineInfo info; union { diff --git a/src/engine_func.h b/src/engine_func.h index 97bfd0894b..0d69743bfe 100644 --- a/src/engine_func.h +++ b/src/engine_func.h @@ -26,7 +26,8 @@ bool IsEngineBuildable(EngineID engine, VehicleType type, CompanyID company); bool IsEngineRefittable(EngineID engine); void GetArticulatedVehicleCargoesAndRefits(EngineID engine, CargoArray *cargoes, CargoTypes *refits, CargoID cargo_type, uint cargo_capacity); void SetYearEngineAgingStops(); -void StartupOneEngine(Engine *e, Date aging_date); +void CalcEngineReliability(Engine *e, bool new_month); +void StartupOneEngine(Engine *e, Date aging_date, uint32 seed); uint GetTotalCapacityOfArticulatedParts(EngineID engine); diff --git a/src/engine_gui.cpp b/src/engine_gui.cpp index a14bc2652c..452b9b6eaa 100644 --- a/src/engine_gui.cpp +++ b/src/engine_gui.cpp @@ -24,6 +24,7 @@ #include "ship.h" #include "aircraft.h" #include "engine_cmd.h" +#include "zoom_func.h" #include "widgets/engine_widget.h" @@ -94,11 +95,11 @@ struct EnginePreviewWindow : Window { case VEH_SHIP: GetShipSpriteSize( engine, x, y, x_offs, y_offs, image_type); break; case VEH_AIRCRAFT: GetAircraftSpriteSize(engine, x, y, x_offs, y_offs, image_type); break; } - this->vehicle_space = std::max(40, y - y_offs); + this->vehicle_space = std::max(ScaleSpriteTrad(40), y - y_offs); size->width = std::max(size->width, x - x_offs); SetDParam(0, GetEngineCategoryName(engine)); - size->height = GetStringHeight(STR_ENGINE_PREVIEW_MESSAGE, size->width) + WD_PAR_VSEP_WIDE + FONT_HEIGHT_NORMAL + this->vehicle_space; + size->height = GetStringHeight(STR_ENGINE_PREVIEW_MESSAGE, size->width) + WidgetDimensions::scaled.vsep_wide + FONT_HEIGHT_NORMAL + this->vehicle_space; SetDParam(0, engine); size->height += GetStringHeight(GetEngineInfoString(engine), size->width); } @@ -109,17 +110,16 @@ struct EnginePreviewWindow : Window { EngineID engine = this->window_number; SetDParam(0, GetEngineCategoryName(engine)); - int y = r.top + GetStringHeight(STR_ENGINE_PREVIEW_MESSAGE, r.right - r.left + 1); - y = DrawStringMultiLine(r.left, r.right, r.top, y, STR_ENGINE_PREVIEW_MESSAGE, TC_FROMSTRING, SA_CENTER) + WD_PAR_VSEP_WIDE; + int y = DrawStringMultiLine(r, STR_ENGINE_PREVIEW_MESSAGE, TC_FROMSTRING, SA_HOR_CENTER | SA_TOP) + WidgetDimensions::scaled.vsep_wide; SetDParam(0, engine); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_ENGINE_NAME, TC_BLACK, SA_HOR_CENTER); + DrawString(r.left, r.right, y, STR_ENGINE_NAME, TC_BLACK, SA_HOR_CENTER); y += FONT_HEIGHT_NORMAL; - DrawVehicleEngine(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, this->width >> 1, y + this->vehicle_space / 2, engine, GetEnginePalette(engine, _local_company), EIT_PREVIEW); + DrawVehicleEngine(r.left, r.right, this->width >> 1, y + this->vehicle_space / 2, engine, GetEnginePalette(engine, _local_company), EIT_PREVIEW); y += this->vehicle_space; - DrawStringMultiLine(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, r.bottom, GetEngineInfoString(engine), TC_FROMSTRING, SA_CENTER); + DrawStringMultiLine(r.left, r.right, y, r.bottom, GetEngineInfoString(engine), TC_FROMSTRING, SA_CENTER); } void OnClick(Point pt, int widget, int click_count) override diff --git a/src/engine_gui.h b/src/engine_gui.h index f987f57d35..7a766bfc8a 100644 --- a/src/engine_gui.h +++ b/src/engine_gui.h @@ -14,10 +14,23 @@ #include "sortlist_type.h" #include "gfx_type.h" #include "vehicle_type.h" +#include "engine_base.h" -typedef GUIList GUIEngineList; +struct GUIEngineListItem { + EngineID engine_id; ///< Engine to display in build purchase list + EngineID variant_id; ///< Variant group of the engine. + EngineDisplayFlags flags; ///< Flags for toggling/drawing (un)folded status and controlling indentation. + int8 indent; ///< Display indentation level. -typedef bool EngList_SortTypeFunction(const EngineID&, const EngineID&); ///< argument type for #EngList_Sort. + GUIEngineListItem(EngineID engine_id, EngineID variant_id, EngineDisplayFlags flags, int indent) : engine_id(engine_id), variant_id(variant_id), flags(flags), indent(indent) {} + + /* Used when searching list only by engine_id. */ + bool operator == (const EngineID &other) const { return this->engine_id == other; } +}; + +typedef GUIList GUIEngineList; + +typedef bool EngList_SortTypeFunction(const GUIEngineListItem&, const GUIEngineListItem&); ///< argument type for #EngList_Sort. void EngList_Sort(GUIEngineList *el, EngList_SortTypeFunction compare); void EngList_SortPartial(GUIEngineList *el, EngList_SortTypeFunction compare, uint begin, uint num_items); diff --git a/src/engine_type.h b/src/engine_type.h index f0b6ea5450..eeccf3e2b8 100644 --- a/src/engine_type.h +++ b/src/engine_type.h @@ -126,6 +126,15 @@ struct RoadVehicleInfo { RoadType roadtype; ///< Road type }; +enum class ExtraEngineFlags : uint32 { + None = 0, + NoNews = (1U << 0), ///< No 'new vehicle' news will be generated. + NoPreview = (1U << 1), ///< No exclusive preview will be offered. + JoinPreview = (1U << 2), ///< Engine will join exclusive preview with variant parent. + SyncReliability = (1U << 3), ///< Engine reliability will be synced with variant parent. +}; +DECLARE_ENUM_AS_BIT_SET(ExtraEngineFlags); + /** * Information about a vehicle * @see table/engines.h @@ -145,6 +154,8 @@ struct EngineInfo { int8 retire_early; ///< Number of years early to retire vehicle StringID string_id; ///< Default name of engine uint16 cargo_age_period; ///< Number of ticks before carried cargo is aged. + EngineID variant_id; ///< Engine variant ID. If set, will be treated specially in purchase lists. + ExtraEngineFlags extra_flags; }; /** @@ -155,7 +166,7 @@ enum EngineMiscFlags { EF_ROAD_TRAM = 0, ///< Road vehicle is a tram/light rail vehicle EF_USES_2CC = 1, ///< Vehicle uses two company colours EF_RAIL_IS_MU = 2, ///< Rail vehicle is a multiple-unit (DMU/EMU) - EF_RAIL_FLIPS = 3, ///< Rail vehicle can be flipped in the depot + EF_RAIL_FLIPS = 3, ///< Rail vehicle has old depot-flip handling EF_AUTO_REFIT = 4, ///< Automatic refitting is allowed EF_NO_DEFAULT_CARGO_MULTIPLIER = 5, ///< Use the new capacity algorithm. The default cargotype of the vehicle does not affect capacity multipliers. CB 15 is also called in purchase list. EF_NO_BREAKDOWN_SMOKE = 6, ///< Do not show black smoke during a breakdown. diff --git a/src/error_gui.cpp b/src/error_gui.cpp index d23589683a..77a96bfc7d 100644 --- a/src/error_gui.cpp +++ b/src/error_gui.cpp @@ -35,7 +35,7 @@ static const NWidgetPart _nested_errmsg_widgets[] = { NWidget(WWT_CAPTION, COLOUR_RED, WID_EM_CAPTION), SetDataTip(STR_ERROR_MESSAGE_CAPTION, STR_NULL), EndContainer(), NWidget(WWT_PANEL, COLOUR_RED), - NWidget(WWT_EMPTY, COLOUR_RED, WID_EM_MESSAGE), SetPadding(0, 2, 0, 2), SetMinimalSize(236, 32), + NWidget(WWT_EMPTY, COLOUR_RED, WID_EM_MESSAGE), SetPadding(WidgetDimensions::unscaled.modalpopup), SetFill(1, 0), SetMinimalSize(236, 0), EndContainer(), }; @@ -52,9 +52,9 @@ static const NWidgetPart _nested_errmsg_face_widgets[] = { NWidget(WWT_CAPTION, COLOUR_RED, WID_EM_CAPTION), SetDataTip(STR_ERROR_MESSAGE_CAPTION_OTHER_COMPANY, STR_NULL), EndContainer(), NWidget(WWT_PANEL, COLOUR_RED), - NWidget(NWID_HORIZONTAL), SetPIP(2, 1, 2), - NWidget(WWT_EMPTY, COLOUR_RED, WID_EM_FACE), SetMinimalSize(92, 119), SetFill(0, 1), SetPadding(2, 0, 1, 0), - NWidget(WWT_EMPTY, COLOUR_RED, WID_EM_MESSAGE), SetFill(0, 1), SetMinimalSize(238, 123), + NWidget(NWID_HORIZONTAL), + NWidget(WWT_EMPTY, COLOUR_RED, WID_EM_FACE), SetPadding(2, 0, 2, 2), SetFill(0, 1), SetMinimalSize(92, 119), + NWidget(WWT_EMPTY, COLOUR_RED, WID_EM_MESSAGE), SetPadding(WidgetDimensions::unscaled.modalpopup), SetFill(1, 1), SetMinimalSize(236, 0), EndContainer(), EndContainer(), }; @@ -200,14 +200,13 @@ public: CopyInDParam(0, this->decode_params, lengthof(this->decode_params)); if (this->textref_stack_size > 0) StartTextRefStackUsage(this->textref_stack_grffile, this->textref_stack_size, this->textref_stack); - int text_width = std::max(0, (int)size->width - WD_FRAMETEXT_LEFT - WD_FRAMETEXT_RIGHT); - this->height_summary = GetStringHeight(this->summary_msg, text_width); - this->height_detailed = (this->detailed_msg == INVALID_STRING_ID) ? 0 : GetStringHeight(this->detailed_msg, text_width); + this->height_summary = GetStringHeight(this->summary_msg, size->width); + this->height_detailed = (this->detailed_msg == INVALID_STRING_ID) ? 0 : GetStringHeight(this->detailed_msg, size->width); if (this->textref_stack_size > 0) StopTextRefStackUsage(); - uint panel_height = WD_FRAMERECT_TOP + this->height_summary + WD_FRAMERECT_BOTTOM; - if (this->detailed_msg != INVALID_STRING_ID) panel_height += this->height_detailed + WD_PAR_VSEP_WIDE; + uint panel_height = this->height_summary; + if (this->detailed_msg != INVALID_STRING_ID) panel_height += this->height_detailed + WidgetDimensions::scaled.vsep_wide; size->height = std::max(size->height, panel_height); break; @@ -246,8 +245,8 @@ public: pt.y = UnScaleByZoom(pt.y - vp->virtual_top, vp->zoom) + vp->top; pt.y = (pt.y < (_screen.height >> 1)) ? scr_bot - sm_height : scr_top; } else { - pt.x = Clamp(UnScaleByZoom(pt.x - vp->virtual_left, vp->zoom) + vp->left - (sm_width / 2), 0, _screen.width - sm_width); - pt.y = Clamp(UnScaleByZoom(pt.y - vp->virtual_top, vp->zoom) + vp->top - (sm_height / 2), scr_top, scr_bot - sm_height); + pt.x = std::min(std::max(UnScaleByZoom(pt.x - vp->virtual_left, vp->zoom) + vp->left - (sm_width / 2), 0), _screen.width - sm_width); + pt.y = std::min(std::max(UnScaleByZoom(pt.y - vp->virtual_top, vp->zoom) + vp->top - (sm_height / 2), scr_top), scr_bot - sm_height); } return pt; } @@ -282,19 +281,14 @@ public: if (this->textref_stack_size > 0) StartTextRefStackUsage(this->textref_stack_grffile, this->textref_stack_size, this->textref_stack); if (this->detailed_msg == INVALID_STRING_ID) { - DrawStringMultiLine(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, r.top + WD_FRAMERECT_TOP, r.bottom - WD_FRAMERECT_BOTTOM, - this->summary_msg, TC_FROMSTRING, SA_CENTER); + DrawStringMultiLine(r, this->summary_msg, TC_FROMSTRING, SA_CENTER); } else { - int extra = (r.bottom - r.top + 1 - this->height_summary - this->height_detailed - WD_PAR_VSEP_WIDE) / 2; + /* Extra space when message is shorter than company face window */ + int extra = (r.Height() - this->height_summary - this->height_detailed - WidgetDimensions::scaled.vsep_wide) / 2; /* Note: NewGRF supplied error message often do not start with a colour code, so default to white. */ - int top = r.top + WD_FRAMERECT_TOP; - int bottom = top + this->height_summary + extra; - DrawStringMultiLine(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, top, bottom, this->summary_msg, TC_WHITE, SA_CENTER); - - bottom = r.bottom - WD_FRAMERECT_BOTTOM; - top = bottom - this->height_detailed - extra; - DrawStringMultiLine(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, top, bottom, this->detailed_msg, TC_WHITE, SA_CENTER); + DrawStringMultiLine(r.WithHeight(this->height_summary + extra, false), this->summary_msg, TC_WHITE, SA_CENTER); + DrawStringMultiLine(r.WithHeight(this->height_detailed + extra, true), this->detailed_msg, TC_WHITE, SA_CENTER); } if (this->textref_stack_size > 0) StopTextRefStackUsage(); diff --git a/src/fileio.cpp b/src/fileio.cpp index 23562cf6a5..287f31f93c 100644 --- a/src/fileio.cpp +++ b/src/fileio.cpp @@ -418,7 +418,7 @@ uint TarScanner::DoScan(Subdirectory sd) /* static */ uint TarScanner::DoScan(TarScanner::Mode mode) { - Debug(misc, 1, "Scanning for tars"); + Debug(misc, 2, "Scanning for tars"); TarScanner fs; uint num = 0; if (mode & TarScanner::BASESET) { @@ -439,7 +439,7 @@ uint TarScanner::DoScan(Subdirectory sd) num += fs.DoScan(SCENARIO_DIR); num += fs.DoScan(HEIGHTMAP_DIR); } - Debug(misc, 1, "Scan complete, found {} files", num); + Debug(misc, 2, "Scan complete, found {} files", num); return num; } @@ -571,7 +571,7 @@ bool TarScanner::AddFile(const std::string &filename, size_t basepath_length, co /* Only allow relative links */ if (link[0] == PATHSEPCHAR) { - Debug(misc, 1, "Ignoring absolute link in tar: {} -> {}", name, link); + Debug(misc, 5, "Ignoring absolute link in tar: {} -> {}", name, link); break; } @@ -597,7 +597,7 @@ bool TarScanner::AddFile(const std::string &filename, size_t basepath_length, co } else if (strcmp(pos, "..") == 0) { /* level up */ if (dest[0] == '\0') { - Debug(misc, 1, "Ignoring link pointing outside of data directory: {} -> {}", name, link); + Debug(misc, 5, "Ignoring link pointing outside of data directory: {} -> {}", name, link); break; } @@ -652,7 +652,7 @@ bool TarScanner::AddFile(const std::string &filename, size_t basepath_length, co pos += skip; } - Debug(misc, 1, "Found tar '{}' with {} new files", filename, num); + Debug(misc, 4, "Found tar '{}' with {} new files", filename, num); fclose(f); /* Resolve file links and store directory links. @@ -690,7 +690,7 @@ bool ExtractTar(const std::string &tar_filename, Subdirectory subdir) /* The file doesn't have a sub directory! */ if (dirname.empty()) { - Debug(misc, 1, "Extracting {} failed; archive rejected, the contents must be in a sub directory", tar_filename); + Debug(misc, 3, "Extracting {} failed; archive rejected, the contents must be in a sub directory", tar_filename); return false; } @@ -987,7 +987,7 @@ void DeterminePaths(const char *exe, bool only_local_path) for (Searchpath sp : _valid_searchpaths) { if (sp == SP_WORKING_DIR && !_do_scan_working_directory) continue; - Debug(misc, 4, "{} added as search path", _searchpaths[sp]); + Debug(misc, 3, "{} added as search path", _searchpaths[sp]); } std::string config_dir; @@ -1020,7 +1020,7 @@ void DeterminePaths(const char *exe, bool only_local_path) _config_file = config_dir + "openttd.cfg"; } - Debug(misc, 3, "{} found as config directory", config_dir); + Debug(misc, 1, "{} found as config directory", config_dir); _highscore_file = config_dir + "hs.dat"; extern std::string _hotkeys_file; @@ -1056,7 +1056,7 @@ void DeterminePaths(const char *exe, bool only_local_path) FioCreateDirectory(_personal_dir); #endif - Debug(misc, 3, "{} found as personal directory", _personal_dir); + Debug(misc, 1, "{} found as personal directory", _personal_dir); static const Subdirectory default_subdirs[] = { SAVE_DIR, AUTOSAVE_DIR, SCENARIO_DIR, HEIGHTMAP_DIR, BASESET_DIR, NEWGRF_DIR, AI_DIR, AI_LIBRARY_DIR, GAME_DIR, GAME_LIBRARY_DIR, SCREENSHOT_DIR @@ -1068,7 +1068,7 @@ void DeterminePaths(const char *exe, bool only_local_path) /* If we have network we make a directory for the autodownloading of content */ _searchpaths[SP_AUTODOWNLOAD_DIR] = _personal_dir + "content_download" PATHSEP; - Debug(misc, 4, "{} added as search path", _searchpaths[SP_AUTODOWNLOAD_DIR]); + Debug(misc, 3, "{} added as search path", _searchpaths[SP_AUTODOWNLOAD_DIR]); FioCreateDirectory(_searchpaths[SP_AUTODOWNLOAD_DIR]); FillValidSearchPaths(only_local_path); diff --git a/src/fios_gui.cpp b/src/fios_gui.cpp index 95fcc41cfb..4d963e5ff3 100644 --- a/src/fios_gui.cpp +++ b/src/fios_gui.cpp @@ -83,8 +83,8 @@ static const NWidgetPart _nested_load_dialog_widgets[] = { NWidget(NWID_VERTICAL), /* Filter box with label */ NWidget(WWT_PANEL, COLOUR_GREY), SetFill(1, 1), SetResize(1, 1), - NWidget(NWID_HORIZONTAL), SetPadding(WD_FRAMERECT_TOP, 0, WD_FRAMERECT_BOTTOM, 0), - SetPIP(WD_FRAMETEXT_LEFT, WD_FRAMETEXT_RIGHT, 0), + NWidget(NWID_HORIZONTAL), SetPadding(WidgetDimensions::unscaled.framerect.top, 0, WidgetDimensions::unscaled.framerect.bottom, 0), + SetPIP(WidgetDimensions::unscaled.frametext.left, WidgetDimensions::unscaled.frametext.right, 0), NWidget(WWT_TEXT, COLOUR_GREY), SetFill(0, 1), SetDataTip(STR_SAVELOAD_FILTER_TITLE , STR_NULL), NWidget(WWT_EDITBOX, COLOUR_GREY, WID_SL_FILTER), SetFill(1, 0), SetMinimalSize(50, 12), SetResize(1, 0), SetDataTip(STR_LIST_FILTER_OSKTITLE, STR_LIST_FILTER_TOOLTIP), @@ -141,8 +141,8 @@ static const NWidgetPart _nested_load_heightmap_dialog_widgets[] = { /* Filter box with label */ NWidget(WWT_PANEL, COLOUR_GREY), SetFill(1, 1), SetResize(1, 1), - NWidget(NWID_HORIZONTAL), SetPadding(WD_FRAMERECT_TOP, 0, WD_FRAMERECT_BOTTOM, 0), - SetPIP(WD_FRAMETEXT_LEFT, WD_FRAMETEXT_RIGHT, 0), + NWidget(NWID_HORIZONTAL), SetPadding(WidgetDimensions::unscaled.framerect.top, 0, WidgetDimensions::unscaled.framerect.bottom, 0), + SetPIP(WidgetDimensions::unscaled.frametext.left, WidgetDimensions::unscaled.frametext.right, 0), NWidget(WWT_TEXT, COLOUR_GREY), SetFill(0, 1), SetDataTip(STR_SAVELOAD_FILTER_TITLE , STR_NULL), NWidget(WWT_EDITBOX, COLOUR_GREY, WID_SL_FILTER), SetFill(1, 0), SetMinimalSize(50, 12), SetResize(1, 0), SetDataTip(STR_LIST_FILTER_OSKTITLE, STR_LIST_FILTER_TOOLTIP), @@ -188,8 +188,8 @@ static const NWidgetPart _nested_save_dialog_widgets[] = { NWidget(NWID_VERTICAL), /* Filter box with label */ NWidget(WWT_PANEL, COLOUR_GREY), SetFill(1, 1), SetResize(1, 1), - NWidget(NWID_HORIZONTAL), SetPadding(WD_FRAMERECT_TOP, 0, WD_FRAMERECT_BOTTOM, 0), - SetPIP(WD_FRAMETEXT_LEFT, WD_FRAMETEXT_RIGHT, 0), + NWidget(NWID_HORIZONTAL), SetPadding(WidgetDimensions::unscaled.framerect.top, 0, WidgetDimensions::unscaled.framerect.bottom, 0), + SetPIP(WidgetDimensions::unscaled.frametext.left, WidgetDimensions::unscaled.frametext.right, 0), NWidget(WWT_TEXT, COLOUR_GREY), SetFill(0, 1), SetDataTip(STR_SAVELOAD_FILTER_TITLE , STR_NULL), NWidget(WWT_EDITBOX, COLOUR_GREY, WID_SL_FILTER), SetFill(1, 0), SetMinimalSize(50, 12), SetResize(1, 0), SetDataTip(STR_LIST_FILTER_OSKTITLE, STR_LIST_FILTER_TOOLTIP), @@ -223,10 +223,10 @@ static const NWidgetPart _nested_save_dialog_widgets[] = { EndContainer(), /* Right side : game details */ - NWidget(WWT_PANEL, COLOUR_GREY), - NWidget(WWT_EMPTY, INVALID_COLOUR, WID_SL_DETAILS), SetResize(1, 1), SetFill(1, 1), + NWidget(NWID_VERTICAL), + NWidget(WWT_PANEL, COLOUR_GREY, WID_SL_DETAILS), SetResize(1, 1), SetFill(1, 1), EndContainer(), NWidget(NWID_HORIZONTAL), - NWidget(NWID_SPACER), SetResize(1, 0), SetFill(1, 1), + NWidget(WWT_PANEL, COLOUR_GREY), SetResize(1, 0), SetFill(1, 1), EndContainer(), NWidget(WWT_RESIZEBOX, COLOUR_GREY), EndContainer(), EndContainer(), @@ -437,18 +437,21 @@ public: _fios_path_changed = false; } + Rect ir = r.Shrink(WidgetDimensions::scaled.framerect); + if (str != STR_ERROR_UNABLE_TO_READ_DRIVE) SetDParam(0, tot); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + FONT_HEIGHT_NORMAL + WD_FRAMERECT_TOP, str); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, path, TC_BLACK); + DrawString(ir.left, ir.right, ir.top + FONT_HEIGHT_NORMAL, str); + DrawString(ir.left, ir.right, ir.top, path, TC_BLACK); break; } case WID_SL_DRIVES_DIRECTORIES_LIST: { - GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, PC_BLACK); + const Rect br = r.Shrink(WidgetDimensions::scaled.bevel); + GfxFillRect(br, PC_BLACK); - uint y = r.top + WD_FRAMERECT_TOP; + Rect tr = r.Shrink(WidgetDimensions::scaled.inset).WithHeight(this->resize.step_height); uint scroll_pos = this->vscroll->GetPosition(); - for (uint row = 0; row < this->fios_items.size(); row++) { + for (uint row = 0; row < this->fios_items.size() && tr.top < br.bottom; row++) { if (!this->fios_items_shown[row]) { /* The current item is filtered out : we do not show it */ scroll_pos++; @@ -458,107 +461,117 @@ public: const FiosItem *item = &this->fios_items[row]; if (item == this->selected) { - GfxFillRect(r.left + 1, y, r.right - 1, y + this->resize.step_height - 1, PC_DARK_BLUE); + GfxFillRect(br.left, tr.top, br.right, tr.bottom, PC_DARK_BLUE); } else if (item == this->highlighted) { - GfxFillRect(r.left + 1, y, r.right - 1, y + this->resize.step_height - 1, PC_VERY_DARK_BLUE); + GfxFillRect(br.left, tr.top, br.right, tr.bottom, 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; - if (y >= this->vscroll->GetCapacity() * this->resize.step_height + r.top + WD_FRAMERECT_TOP) break; + DrawString(tr, item->title, _fios_colours[GetDetailedFileType(item->type)]); + tr = tr.Translate(0, this->resize.step_height); } break; } - case WID_SL_DETAILS: { - GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.top + FONT_HEIGHT_NORMAL * 2 + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM, PC_GREY); - DrawString(r.left, r.right, r.top + FONT_HEIGHT_NORMAL / 2 + WD_FRAMERECT_TOP, STR_SAVELOAD_DETAIL_CAPTION, TC_FROMSTRING, SA_HOR_CENTER); - - if (this->selected == nullptr) break; - - uint y = r.top + FONT_HEIGHT_NORMAL * 2 + WD_PAR_VSEP_NORMAL + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; - uint y_max = r.bottom - FONT_HEIGHT_NORMAL - WD_FRAMERECT_BOTTOM; - - if (y > y_max) break; - if (!_load_check_data.checkable) { - /* Old savegame, no information available */ - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_SAVELOAD_DETAIL_NOT_AVAILABLE); - y += FONT_HEIGHT_NORMAL; - } else if (_load_check_data.error != INVALID_STRING_ID) { - /* Incompatible / broken savegame */ - SetDParamStr(0, _load_check_data.error_data); - y = DrawStringMultiLine(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, - y, r.bottom - WD_FRAMERECT_BOTTOM, _load_check_data.error, TC_RED); - } else { - /* Mapsize */ - SetDParam(0, _load_check_data.map_size_x); - SetDParam(1, _load_check_data.map_size_y); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_NETWORK_SERVER_LIST_MAP_SIZE); - y += FONT_HEIGHT_NORMAL; - if (y > y_max) break; - - /* Climate */ - byte landscape = _load_check_data.settings.game_creation.landscape; - if (landscape < NUM_LANDSCAPE) { - SetDParam(0, STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE + landscape); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_NETWORK_SERVER_LIST_LANDSCAPE); - y += FONT_HEIGHT_NORMAL; - } - - y += WD_PAR_VSEP_NORMAL; - if (y > y_max) break; - - /* Start date (if available) */ - if (_load_check_data.settings.game_creation.starting_year != 0) { - SetDParam(0, ConvertYMDToDate(_load_check_data.settings.game_creation.starting_year, 0, 1)); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_NETWORK_SERVER_LIST_START_DATE); - y += FONT_HEIGHT_NORMAL; - } - if (y > y_max) break; - - /* Hide current date for scenarios */ - if (this->abstract_filetype != FT_SCENARIO) { - /* Current date */ - SetDParam(0, _load_check_data.current_date); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_NETWORK_SERVER_LIST_CURRENT_DATE); - y += FONT_HEIGHT_NORMAL; - } - - /* Hide the NewGRF stuff when saving. We also hide the button. */ - if (this->fop == SLO_LOAD && (this->abstract_filetype == FT_SAVEGAME || this->abstract_filetype == FT_SCENARIO)) { - y += WD_PAR_VSEP_NORMAL; - if (y > y_max) break; - - /* NewGrf compatibility */ - SetDParam(0, _load_check_data.grfconfig == nullptr ? STR_NEWGRF_LIST_NONE : - STR_NEWGRF_LIST_ALL_FOUND + _load_check_data.grf_compatibility); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_SAVELOAD_DETAIL_GRFSTATUS); - y += FONT_HEIGHT_NORMAL; - } - if (y > y_max) break; - - /* Hide the company stuff for scenarios */ - if (this->abstract_filetype != FT_SCENARIO) { - y += FONT_HEIGHT_NORMAL; - if (y > y_max) break; - - /* Companies / AIs */ - for (auto &pair : _load_check_data.companies) { - SetDParam(0, pair.first + 1); - const CompanyProperties &c = *pair.second; - if (!c.name.empty()) { - SetDParam(1, STR_JUST_RAW_STRING); - SetDParamStr(2, c.name); - } else { - SetDParam(1, c.name_1); - SetDParam(2, c.name_2); - } - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_SAVELOAD_DETAIL_COMPANY_INDEX); - y += FONT_HEIGHT_NORMAL; - if (y > y_max) break; - } - } - } + case WID_SL_DETAILS: + this->DrawDetails(r); break; + } + } + + void DrawDetails(const Rect &r) const + { + /* Header panel */ + int HEADER_HEIGHT = FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.frametext.Vertical(); + + Rect hr = r.WithHeight(HEADER_HEIGHT).Shrink(WidgetDimensions::scaled.frametext); + Rect tr = r.Shrink(WidgetDimensions::scaled.frametext); + tr.top += HEADER_HEIGHT; + + /* Create the nice grayish rectangle at the details top */ + GfxFillRect(r.WithHeight(HEADER_HEIGHT).Shrink(WidgetDimensions::scaled.bevel.left, WidgetDimensions::scaled.bevel.top, WidgetDimensions::scaled.bevel.right, 0), PC_GREY); + DrawString(hr.left, hr.right, hr.top, STR_SAVELOAD_DETAIL_CAPTION, TC_FROMSTRING, SA_HOR_CENTER); + + if (this->selected == nullptr) return; + + /* Details panel */ + tr.bottom -= FONT_HEIGHT_NORMAL - 1; + if (tr.top > tr.bottom) return; + + if (!_load_check_data.checkable) { + /* Old savegame, no information available */ + DrawString(tr, STR_SAVELOAD_DETAIL_NOT_AVAILABLE); + tr.top += FONT_HEIGHT_NORMAL; + } else if (_load_check_data.error != INVALID_STRING_ID) { + /* Incompatible / broken savegame */ + SetDParamStr(0, _load_check_data.error_data); + tr.top = DrawStringMultiLine(tr, _load_check_data.error, TC_RED); + } else { + /* Mapsize */ + SetDParam(0, _load_check_data.map_size_x); + SetDParam(1, _load_check_data.map_size_y); + DrawString(tr, STR_NETWORK_SERVER_LIST_MAP_SIZE); + tr.top += FONT_HEIGHT_NORMAL; + if (tr.top > tr.bottom) return; + + /* Climate */ + byte landscape = _load_check_data.settings.game_creation.landscape; + if (landscape < NUM_LANDSCAPE) { + SetDParam(0, STR_CLIMATE_TEMPERATE_LANDSCAPE + landscape); + DrawString(tr, STR_NETWORK_SERVER_LIST_LANDSCAPE); + tr.top += FONT_HEIGHT_NORMAL; + } + + tr.top += WidgetDimensions::scaled.vsep_normal; + if (tr.top > tr.bottom) return; + + /* Start date (if available) */ + if (_load_check_data.settings.game_creation.starting_year != 0) { + SetDParam(0, ConvertYMDToDate(_load_check_data.settings.game_creation.starting_year, 0, 1)); + DrawString(tr, STR_NETWORK_SERVER_LIST_START_DATE); + tr.top += FONT_HEIGHT_NORMAL; + } + if (tr.top > tr.bottom) return; + + /* Hide current date for scenarios */ + if (this->abstract_filetype != FT_SCENARIO) { + /* Current date */ + SetDParam(0, _load_check_data.current_date); + DrawString(tr, STR_NETWORK_SERVER_LIST_CURRENT_DATE); + tr.top += FONT_HEIGHT_NORMAL; + } + + /* Hide the NewGRF stuff when saving. We also hide the button. */ + if (this->fop == SLO_LOAD && (this->abstract_filetype == FT_SAVEGAME || this->abstract_filetype == FT_SCENARIO)) { + tr.top += WidgetDimensions::scaled.vsep_normal; + if (tr.top > tr.bottom) return; + + /* NewGrf compatibility */ + SetDParam(0, _load_check_data.grfconfig == nullptr ? STR_NEWGRF_LIST_NONE : + STR_NEWGRF_LIST_ALL_FOUND + _load_check_data.grf_compatibility); + DrawString(tr, STR_SAVELOAD_DETAIL_GRFSTATUS); + tr.top += FONT_HEIGHT_NORMAL; + } + if (tr.top > tr.bottom) return; + + /* Hide the company stuff for scenarios */ + if (this->abstract_filetype != FT_SCENARIO) { + tr.top += WidgetDimensions::scaled.vsep_wide; + if (tr.top > tr.bottom) return; + + /* Companies / AIs */ + for (auto &pair : _load_check_data.companies) { + SetDParam(0, pair.first + 1); + const CompanyProperties &c = *pair.second; + if (!c.name.empty()) { + SetDParam(1, STR_JUST_RAW_STRING); + SetDParamStr(2, c.name); + } else { + SetDParam(1, c.name_1); + SetDParam(2, c.name_2); + } + DrawString(tr, STR_SAVELOAD_DETAIL_COMPANY_INDEX); + tr.top += FONT_HEIGHT_NORMAL; + if (tr.top > tr.bottom) break; + } } } } @@ -567,12 +580,12 @@ public: { switch (widget) { case WID_SL_BACKGROUND: - size->height = 2 * FONT_HEIGHT_NORMAL + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; + size->height = 2 * FONT_HEIGHT_NORMAL + padding.height; break; case WID_SL_DRIVES_DIRECTORIES_LIST: resize->height = FONT_HEIGHT_NORMAL; - size->height = resize->height * 10 + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; + size->height = resize->height * 10 + padding.height; break; case WID_SL_SORT_BYNAME: case WID_SL_SORT_BYDATE: { @@ -652,7 +665,7 @@ public: break; case WID_SL_DRIVES_DIRECTORIES_LIST: { // Click the listbox - int y = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_SL_DRIVES_DIRECTORIES_LIST, WD_FRAMERECT_TOP); + int y = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_SL_DRIVES_DIRECTORIES_LIST, WidgetDimensions::scaled.inset.top); if (y == INT_MAX) return; /* Get the corresponding non-filtered out item from the list */ @@ -732,7 +745,7 @@ public: void OnMouseOver(Point pt, int widget) override { if (widget == WID_SL_DRIVES_DIRECTORIES_LIST) { - int y = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_SL_DRIVES_DIRECTORIES_LIST, WD_FRAMERECT_TOP); + int y = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_SL_DRIVES_DIRECTORIES_LIST, WidgetDimensions::scaled.inset.top); if (y == INT_MAX) return; /* Get the corresponding non-filtered out item from the list */ diff --git a/src/fontcache.cpp b/src/fontcache.cpp index 91dae57564..546199bc1f 100644 --- a/src/fontcache.cpp +++ b/src/fontcache.cpp @@ -13,6 +13,11 @@ #include "blitter/factory.hpp" #include "gfx_layout.h" #include "fontcache/spritefontcache.h" +#include "openttd.h" +#include "settings_func.h" +#include "strings_func.h" +#include "viewport_func.h" +#include "window_func.h" #include "safeguards.h" @@ -70,15 +75,51 @@ bool GetFontAAState(FontSize size, bool check_blitter) /* AA is only supported for 32 bpp */ if (check_blitter && BlitterFactory::GetCurrentBlitter()->GetScreenDepth() != 32) return false; - switch (size) { - default: NOT_REACHED(); - case FS_NORMAL: return _fcsettings.medium.aa; - case FS_SMALL: return _fcsettings.small.aa; - case FS_LARGE: return _fcsettings.large.aa; - case FS_MONO: return _fcsettings.mono.aa; - } + return GetFontCacheSubSetting(size)->aa; } +void SetFont(FontSize fontsize, const std::string& font, uint size, bool aa) +{ + FontCacheSubSetting *setting = GetFontCacheSubSetting(fontsize); + bool changed = false; + + if (setting->font != font) { + setting->font = font; + changed = true; + } + + if (setting->size != size) { + setting->size = size; + changed = true; + } + + if (setting->aa != aa) { + setting->aa = aa; + changed = true; + } + + if (!changed) return; + + if (fontsize != FS_MONO) { + /* Try to reload only the modified font. */ + FontCacheSettings backup = _fcsettings; + for (FontSize fs = FS_BEGIN; fs < FS_END; fs++) { + if (fs == fontsize) continue; + FontCache *fc = FontCache::Get(fs); + GetFontCacheSubSetting(fs)->font = fc->HasParent() ? fc->GetFontName() : ""; + } + CheckForMissingGlyphs(); + _fcsettings = backup; + } else { + InitFontCache(true); + } + + LoadStringWidthTable(); + UpdateAllVirtCoords(); + ReInitAllWindows(true); + + if (_save_config) SaveToConfig(); +} /** * (Re)initialize the font cache related things, i.e. load the non-sprite fonts. diff --git a/src/fontcache.h b/src/fontcache.h index 8eb6535a53..efc1496304 100644 --- a/src/fontcache.h +++ b/src/fontcache.h @@ -29,12 +29,12 @@ protected: int descender; ///< The descender value of the font. int units_per_em; ///< The units per EM value of the font. - static int GetDefaultFontHeight(FontSize fs); - public: FontCache(FontSize fs); virtual ~FontCache(); + static int GetDefaultFontHeight(FontSize fs); + /** * Get the FontSize of the font. * @return The FontSize. @@ -218,10 +218,27 @@ struct FontCacheSettings { extern FontCacheSettings _fcsettings; +/** + * Get the settings of a given font size. + * @param fs The font size to look up. + * @return The settings. + */ +static inline FontCacheSubSetting *GetFontCacheSubSetting(FontSize fs) +{ + switch (fs) { + default: NOT_REACHED(); + case FS_SMALL: return &_fcsettings.small; + case FS_NORMAL: return &_fcsettings.medium; + case FS_LARGE: return &_fcsettings.large; + case FS_MONO: return &_fcsettings.mono; + } +} + void InitFontCache(bool monospace); void UninitFontCache(); bool HasAntialiasedFonts(); bool GetFontAAState(FontSize size, bool check_blitter = true); +void SetFont(FontSize fontsize, const std::string &font, uint size, bool aa); #endif /* FONTCACHE_H */ diff --git a/src/fontcache/freetypefontcache.cpp b/src/fontcache/freetypefontcache.cpp index dac2f87668..621b33fa9d 100644 --- a/src/fontcache/freetypefontcache.cpp +++ b/src/fontcache/freetypefontcache.cpp @@ -65,18 +65,19 @@ void FreeTypeFontCache::SetFontSize(FontSize fs, FT_Face face, int pixels) { if (pixels == 0) { /* Try to determine a good height based on the minimal height recommended by the font. */ - int scaled_height = ScaleFontTrad(this->GetDefaultFontHeight(this->fs)); + int scaled_height = ScaleGUITrad(FontCache::GetDefaultFontHeight(this->fs)); pixels = scaled_height; TT_Header *head = (TT_Header *)FT_Get_Sfnt_Table(this->face, ft_sfnt_head); if (head != nullptr) { /* Font height is minimum height plus the difference between the default * height for this font size and the small size. */ - int diff = scaled_height - ScaleFontTrad(this->GetDefaultFontHeight(FS_SMALL)); - pixels = Clamp(std::min(head->Lowest_Rec_PPEM, MAX_FONT_MIN_REC_SIZE) + diff, scaled_height, MAX_FONT_SIZE); + int diff = scaled_height - ScaleGUITrad(FontCache::GetDefaultFontHeight(FS_SMALL)); + /* Clamp() is not used as scaled_height could be greater than MAX_FONT_SIZE, which is not permitted in Clamp(). */ + pixels = std::min(std::max(std::min(head->Lowest_Rec_PPEM, MAX_FONT_MIN_REC_SIZE) + diff, scaled_height), MAX_FONT_SIZE); } } else { - pixels = ScaleFontTrad(pixels); + pixels = ScaleGUITrad(pixels); } this->used_size = pixels; @@ -121,14 +122,7 @@ void FreeTypeFontCache::SetFontSize(FontSize fs, FT_Face face, int pixels) */ void LoadFreeTypeFont(FontSize fs) { - FontCacheSubSetting *settings = nullptr; - switch (fs) { - default: NOT_REACHED(); - case FS_SMALL: settings = &_fcsettings.small; break; - case FS_NORMAL: settings = &_fcsettings.medium; break; - case FS_LARGE: settings = &_fcsettings.large; break; - case FS_MONO: settings = &_fcsettings.mono; break; - } + FontCacheSubSetting *settings = GetFontCacheSubSetting(fs); if (settings->font.empty()) return; @@ -196,8 +190,7 @@ void LoadFreeTypeFont(FontSize fs) FT_Done_Face(face); - static const char *SIZE_TO_NAME[] = { "medium", "small", "large", "mono" }; - ShowInfoF("Unable to use '%s' for %s font, FreeType reported error 0x%X, using sprite font instead", font_name, SIZE_TO_NAME[fs], error); + ShowInfoF("Unable to use '%s' for %s font, FreeType reported error 0x%X, using sprite font instead", font_name, FontSizeToName(fs), error); return; found_face: @@ -237,9 +230,10 @@ const Sprite *FreeTypeFontCache::InternalGetGlyph(GlyphID key, bool aa) /* Despite requesting a normal glyph, FreeType may have returned a bitmap */ aa = (slot->bitmap.pixel_mode == FT_PIXEL_MODE_GRAY); - /* Add 1 pixel for the shadow on the medium font. Our sprite must be at least 1x1 pixel */ - uint width = std::max(1U, (uint)slot->bitmap.width + (this->fs == FS_NORMAL)); - uint height = std::max(1U, (uint)slot->bitmap.rows + (this->fs == FS_NORMAL)); + /* Add 1 scaled pixel for the shadow on the medium font. Our sprite must be at least 1x1 pixel */ + uint shadow = (this->fs == FS_NORMAL) ? ScaleGUITrad(1) : 0; + uint width = std::max(1U, (uint)slot->bitmap.width + shadow); + uint height = std::max(1U, (uint)slot->bitmap.rows + shadow); /* Limit glyph size to prevent overflows later on. */ if (width > MAX_GLYPH_DIM || height > MAX_GLYPH_DIM) usererror("Font glyph is too large"); @@ -259,8 +253,8 @@ const Sprite *FreeTypeFontCache::InternalGetGlyph(GlyphID key, bool aa) for (uint y = 0; y < (uint)slot->bitmap.rows; y++) { for (uint x = 0; x < (uint)slot->bitmap.width; x++) { if (HasBit(slot->bitmap.buffer[(x / 8) + y * slot->bitmap.pitch], 7 - (x % 8))) { - sprite.data[1 + x + (1 + y) * sprite.width].m = SHADOW_COLOUR; - sprite.data[1 + x + (1 + y) * sprite.width].a = 0xFF; + sprite.data[shadow + x + (shadow + y) * sprite.width].m = SHADOW_COLOUR; + sprite.data[shadow + x + (shadow + y) * sprite.width].a = 0xFF; } } } diff --git a/src/fontcache/spritefontcache.cpp b/src/fontcache/spritefontcache.cpp index 2b1b0b5335..2a2f3ed9fd 100644 --- a/src/fontcache/spritefontcache.cpp +++ b/src/fontcache/spritefontcache.cpp @@ -28,7 +28,8 @@ static const int ASCII_LETTERSTART = 32; ///< First printable ASCII letter. SpriteFontCache::SpriteFontCache(FontSize fs) : FontCache(fs), glyph_to_spriteid_map(nullptr) { this->InitializeUnicodeGlyphMap(); - this->height = ScaleFontTrad(this->GetDefaultFontHeight(this->fs)); + this->height = ScaleGUITrad(FontCache::GetDefaultFontHeight(this->fs)); + this->ascender = (this->height - ScaleSpriteTrad(FontCache::GetDefaultFontHeight(this->fs))) / 2; } /** @@ -104,7 +105,8 @@ void SpriteFontCache::ClearGlyphToSpriteMap() void SpriteFontCache::ClearFontCache() { Layouter::ResetFontCache(this->fs); - this->height = ScaleFontTrad(this->GetDefaultFontHeight(this->fs)); + this->height = ScaleGUITrad(FontCache::GetDefaultFontHeight(this->fs)); + this->ascender = (this->height - ScaleSpriteTrad(FontCache::GetDefaultFontHeight(this->fs))) / 2; } const Sprite *SpriteFontCache::GetGlyph(GlyphID key) @@ -118,7 +120,7 @@ uint SpriteFontCache::GetGlyphWidth(GlyphID key) { SpriteID sprite = this->GetUnicodeGlyph(key); if (sprite == 0) sprite = this->GetUnicodeGlyph('?'); - return SpriteExists(sprite) ? GetSprite(sprite, ST_FONT)->width + ScaleFontTrad(this->fs != FS_NORMAL ? 1 : 0) : 0; + return SpriteExists(sprite) ? GetSprite(sprite, ST_FONT)->width + ScaleSpriteTrad(this->fs != FS_NORMAL ? 1 : 0) : 0; } bool SpriteFontCache::GetDrawGlyphShadow() diff --git a/src/framerate_gui.cpp b/src/framerate_gui.cpp index 903086caa5..1a676933ee 100644 --- a/src/framerate_gui.cpp +++ b/src/framerate_gui.cpp @@ -25,8 +25,16 @@ #include "game/game_instance.hpp" #include "widgets/framerate_widget.h" + +#include +#include +#include + #include "safeguards.h" +static std::mutex _sound_perf_lock; +static std::atomic _sound_perf_pending; +static std::vector _sound_perf_measurements; /** * Private declarations for performance measurement implementation @@ -251,6 +259,20 @@ PerformanceMeasurer::~PerformanceMeasurer() return; } } + if (this->elem == PFE_SOUND) { + /* PFE_SOUND measurements are made from the mixer thread. + * _pf_data cannot be concurrently accessed from the mixer thread + * and the main thread, so store the measurement results in a + * mutex-protected queue which is drained by the main thread. + * See: ProcessPendingPerformanceMeasurements() */ + TimingMeasurement end = GetPerformanceTimer(); + std::lock_guard lk(_sound_perf_lock); + if (_sound_perf_measurements.size() >= NUM_FRAMERATE_POINTS * 2) return; + _sound_perf_measurements.push_back(this->start_time); + _sound_perf_measurements.push_back(end); + _sound_perf_pending.store(true, std::memory_order_release); + return; + } _pf_data[this->elem].Add(this->start_time, GetPerformanceTimer()); } @@ -358,7 +380,7 @@ static const NWidgetPart _framerate_window_widgets[] = { NWidget(WWT_STICKYBOX, COLOUR_GREY), EndContainer(), NWidget(WWT_PANEL, COLOUR_GREY), - NWidget(NWID_VERTICAL), SetPadding(6), SetPIP(0, 3, 0), + NWidget(NWID_VERTICAL), SetPadding(WidgetDimensions::unscaled.frametext), SetPIP(0, WidgetDimensions::unscaled.vsep_normal, 0), NWidget(WWT_TEXT, COLOUR_GREY, WID_FRW_RATE_GAMELOOP), SetDataTip(STR_FRAMERATE_RATE_GAMELOOP, STR_FRAMERATE_RATE_GAMELOOP_TOOLTIP), SetFill(1, 0), SetResize(1, 0), NWidget(WWT_TEXT, COLOUR_GREY, WID_FRW_RATE_DRAWING), SetDataTip(STR_FRAMERATE_RATE_BLITTER, STR_FRAMERATE_RATE_BLITTER_TOOLTIP), SetFill(1, 0), SetResize(1, 0), NWidget(WWT_TEXT, COLOUR_GREY, WID_FRW_RATE_FACTOR), SetDataTip(STR_FRAMERATE_SPEED_FACTOR, STR_FRAMERATE_SPEED_FACTOR_TOOLTIP), SetFill(1, 0), SetResize(1, 0), @@ -366,8 +388,8 @@ static const NWidgetPart _framerate_window_widgets[] = { EndContainer(), NWidget(NWID_HORIZONTAL), NWidget(WWT_PANEL, COLOUR_GREY), - NWidget(NWID_VERTICAL), SetPadding(6), SetPIP(0, 3, 0), - NWidget(NWID_HORIZONTAL), SetPIP(0, 8, 0), + NWidget(NWID_VERTICAL), SetPadding(WidgetDimensions::unscaled.frametext), SetPIP(0, WidgetDimensions::unscaled.vsep_wide, 0), + NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0), NWidget(WWT_EMPTY, COLOUR_GREY, WID_FRW_TIMES_NAMES), SetScrollbar(WID_FRW_SCROLLBAR), NWidget(WWT_EMPTY, COLOUR_GREY, WID_FRW_TIMES_CURRENT), SetScrollbar(WID_FRW_SCROLLBAR), NWidget(WWT_EMPTY, COLOUR_GREY, WID_FRW_TIMES_AVERAGE), SetScrollbar(WID_FRW_SCROLLBAR), @@ -425,7 +447,6 @@ struct FramerateWindow : Window { CachedDecimal times_shortterm[PFE_MAX]; ///< cached short term average times CachedDecimal times_longterm[PFE_MAX]; ///< cached long term average times - static constexpr int VSPACING = 3; ///< space between column heading and values static constexpr int MIN_ELEMENTS = 5; ///< smallest number of elements to display FramerateWindow(WindowDesc *desc, WindowNumber number) : Window(desc) @@ -545,7 +566,7 @@ struct FramerateWindow : Window { case WID_FRW_TIMES_NAMES: { size->width = 0; - size->height = FONT_HEIGHT_NORMAL + VSPACING + MIN_ELEMENTS * FONT_HEIGHT_NORMAL; + size->height = FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal + MIN_ELEMENTS * FONT_HEIGHT_NORMAL; resize->width = 0; resize->height = FONT_HEIGHT_NORMAL; for (PerformanceElement e : DISPLAY_ORDER_PFE) { @@ -571,7 +592,7 @@ struct FramerateWindow : Window { SetDParam(1, 2); Dimension item_size = GetStringBoundingBox(STR_FRAMERATE_MS_GOOD); size->width = std::max(size->width, item_size.width); - size->height += FONT_HEIGHT_NORMAL * MIN_ELEMENTS + VSPACING; + size->height += FONT_HEIGHT_NORMAL * MIN_ELEMENTS + WidgetDimensions::scaled.vsep_normal; resize->width = 0; resize->height = FONT_HEIGHT_NORMAL; break; @@ -587,7 +608,7 @@ struct FramerateWindow : Window { int drawable = this->num_displayed; int y = r.top; DrawString(r.left, r.right, y, heading_str, TC_FROMSTRING, SA_CENTER, true); - y += FONT_HEIGHT_NORMAL + VSPACING; + y += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; for (PerformanceElement e : DISPLAY_ORDER_PFE) { if (_pf_data[e].num_valid == 0) continue; if (skip > 0) { @@ -609,7 +630,7 @@ struct FramerateWindow : Window { int drawable = this->num_displayed; int y = r.top; DrawString(r.left, r.right, y, STR_FRAMERATE_MEMORYUSE, TC_FROMSTRING, SA_CENTER, true); - y += FONT_HEIGHT_NORMAL + VSPACING; + y += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; for (PerformanceElement e : DISPLAY_ORDER_PFE) { if (_pf_data[e].num_valid == 0) continue; if (skip > 0) { @@ -641,7 +662,7 @@ struct FramerateWindow : Window { const Scrollbar *sb = this->GetScrollbar(WID_FRW_SCROLLBAR); uint16 skip = sb->GetPosition(); int drawable = this->num_displayed; - int y = r.top + FONT_HEIGHT_NORMAL + VSPACING; // first line contains headings in the value columns + int y = r.top + FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; // first line contains headings in the value columns for (PerformanceElement e : DISPLAY_ORDER_PFE) { if (_pf_data[e].num_valid == 0) continue; if (skip > 0) { @@ -683,7 +704,7 @@ struct FramerateWindow : Window { case WID_FRW_TIMES_AVERAGE: { /* Open time graph windows when clicking detail measurement lines */ const Scrollbar *sb = this->GetScrollbar(WID_FRW_SCROLLBAR); - int line = sb->GetScrolledRowFromWidget(pt.y, this, widget, VSPACING + FONT_HEIGHT_NORMAL); + int line = sb->GetScrolledRowFromWidget(pt.y, this, widget, WidgetDimensions::scaled.vsep_normal + FONT_HEIGHT_NORMAL); if (line != INT_MAX) { line++; /* Find the visible line that was clicked */ @@ -703,7 +724,7 @@ struct FramerateWindow : Window { void OnResize() override { auto *wid = this->GetWidget(WID_FRW_TIMES_NAMES); - this->num_displayed = (wid->current_y - wid->min_y - VSPACING) / FONT_HEIGHT_NORMAL - 1; // subtract 1 for headings + this->num_displayed = (wid->current_y - wid->min_y - WidgetDimensions::scaled.vsep_normal) / FONT_HEIGHT_NORMAL - 1; // subtract 1 for headings this->GetScrollbar(WID_FRW_SCROLLBAR)->SetCapacity(this->num_displayed); } }; @@ -1079,3 +1100,22 @@ void ConPrintFramerate() IConsolePrint(CC_ERROR, "No performance measurements have been taken yet."); } } + +/** + * This drains the PFE_SOUND measurement data queue into _pf_data. + * PFE_SOUND measurements are made by the mixer thread and so cannot be stored + * into _pf_data directly, because this would not be thread safe and would violate + * the invariants of the FPS and frame graph windows. + * @see PerformanceMeasurement::~PerformanceMeasurement() + */ +void ProcessPendingPerformanceMeasurements() +{ + if (_sound_perf_pending.load(std::memory_order_acquire)) { + std::lock_guard lk(_sound_perf_lock); + for (size_t i = 0; i < _sound_perf_measurements.size(); i += 2) { + _pf_data[PFE_SOUND].Add(_sound_perf_measurements[i], _sound_perf_measurements[i + 1]); + } + _sound_perf_measurements.clear(); + _sound_perf_pending.store(false, std::memory_order_relaxed); + } +} diff --git a/src/game/CMakeLists.txt b/src/game/CMakeLists.txt index aafb5a7b8d..3f25e9bbe5 100644 --- a/src/game/CMakeLists.txt +++ b/src/game/CMakeLists.txt @@ -3,6 +3,8 @@ add_files( game_config.cpp game_config.hpp game_core.cpp + game_gui.cpp + game_gui.hpp game_info.cpp game_info.hpp game_instance.cpp diff --git a/src/game/game.hpp b/src/game/game.hpp index c72b081be6..98f436d397 100644 --- a/src/game/game.hpp +++ b/src/game/game.hpp @@ -87,11 +87,6 @@ public: */ static void Save(); - /** - * Load data for a GameScript from a savegame. - */ - static void Load(int version); - /** Wrapper function for GameScanner::GetConsoleList */ static std::string GetConsoleList(bool newest_only = false); /** Wrapper function for GameScanner::GetConsoleLibraryList */ diff --git a/src/game/game_core.cpp b/src/game/game_core.cpp index 32ca99e6a4..c5ba56e460 100644 --- a/src/game/game_core.cpp +++ b/src/game/game_core.cpp @@ -88,6 +88,8 @@ Game::info = info; Game::instance = new GameInstance(); Game::instance->Initialize(info); + Game::instance->LoadOnStack(config->GetToLoadData()); + config->SetToLoadData(nullptr); cur_company.Restore(); @@ -199,6 +201,7 @@ InvalidateWindowData(WC_AI_LIST, 0, 1); SetWindowClassesDirty(WC_AI_DEBUG); InvalidateWindowClassesData(WC_AI_SETTINGS); + InvalidateWindowClassesData(WC_GAME_OPTIONS); } @@ -213,18 +216,6 @@ } } -/* static */ void Game::Load(int version) -{ - if (Game::instance != nullptr && (!_networking || _network_server)) { - Backup cur_company(_current_company, OWNER_DEITY, FILE_LINE); - Game::instance->Load(version); - cur_company.Restore(); - } else { - /* Read, but ignore, the load data */ - GameInstance::LoadEmpty(); - } -} - /* static */ std::string Game::GetConsoleList(bool newest_only) { return Game::scanner_info->GetConsoleList(newest_only); diff --git a/src/game/game_gui.cpp b/src/game/game_gui.cpp new file mode 100644 index 0000000000..d111ff192c --- /dev/null +++ b/src/game/game_gui.cpp @@ -0,0 +1,465 @@ +/* + * 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 game_gui.cpp %Window for configuring the Game Script */ + +#include "../stdafx.h" +#include "../table/sprites.h" +#include "../error.h" +#include "../settings_gui.h" +#include "../querystring_gui.h" +#include "../stringfilter_type.h" +#include "../company_base.h" +#include "../company_gui.h" +#include "../strings_func.h" +#include "../window_func.h" +#include "../window_type.h" +#include "../gfx_func.h" +#include "../command_func.h" +#include "../network/network.h" +#include "../settings_func.h" +#include "../network/network_content.h" +#include "../textfile_gui.h" +#include "../widgets/dropdown_type.h" +#include "../widgets/dropdown_func.h" +#include "../hotkeys.h" +#include "../core/geometry_func.hpp" +#include "../guitimer_func.h" +#include "../company_cmd.h" +#include "../misc_cmd.h" + +#include "game_gui.hpp" +#include "../ai/ai_config.hpp" +#include "../ai/ai_gui.hpp" +#include "../widgets/game_widget.h" +#include "../table/strings.h" +#include "../game/game.hpp" +#include "../game/game_config.hpp" +#include "../game/game_info.hpp" +#include "../game/game_instance.hpp" + +#include "../safeguards.h" + + +/** Widgets for the configure GS window. */ +static const NWidgetPart _nested_gs_config_widgets[] = { + NWidget(NWID_HORIZONTAL), + NWidget(WWT_CLOSEBOX, COLOUR_MAUVE), + NWidget(WWT_CAPTION, COLOUR_MAUVE), SetDataTip(STR_AI_CONFIG_CAPTION_GAMESCRIPT, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), + NWidget(WWT_DEFSIZEBOX, COLOUR_MAUVE), + EndContainer(), + NWidget(WWT_PANEL, COLOUR_MAUVE, WID_GSC_BACKGROUND), SetFill(1, 0), SetResize(1, 0), + NWidget(NWID_SPACER), SetMinimalSize(0, 3), SetFill(1, 0), SetResize(1, 0), + NWidget(WWT_FRAME, COLOUR_MAUVE), SetDataTip(STR_AI_CONFIG_GAMESCRIPT, STR_NULL), SetFill(1, 0), SetResize(1, 0), SetPadding(0, 5, 4, 5), + NWidget(WWT_MATRIX, COLOUR_MAUVE, WID_GSC_GSLIST), SetMinimalSize(288, 14), SetFill(1, 0), SetResize(1, 0), SetMatrixDataTip(1, 1, STR_AI_CONFIG_GAMELIST_TOOLTIP), + EndContainer(), + NWidget(NWID_SPACER), SetMinimalSize(0, 6), SetFill(1, 0), SetResize(1, 0), + NWidget(WWT_FRAME, COLOUR_MAUVE), SetDataTip(STR_AI_CONFIG_GAMESCRIPT_PARAM, STR_NULL), SetFill(1, 0), SetResize(1, 0), SetPadding(0, 5, 4, 5), + NWidget(NWID_HORIZONTAL), + NWidget(WWT_MATRIX, COLOUR_MAUVE, WID_GSC_SETTINGS), SetFill(1, 0), SetResize(1, 1), SetMinimalSize(188, 182), SetMatrixDataTip(1, 0, STR_NULL), SetScrollbar(WID_GSC_SCROLLBAR), + NWidget(NWID_VSCROLLBAR, COLOUR_MAUVE, WID_GSC_SCROLLBAR), + EndContainer(), + EndContainer(), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(7, 0, 7), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_CHANGE), SetFill(1, 0), SetResize(1, 0), SetMinimalSize(93, 0), SetDataTip(STR_AI_CONFIG_CHANGE_GAMESCRIPT, STR_AI_CONFIG_CHANGE_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), SetMinimalSize(93, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_NULL), + EndContainer(), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(7, 0, 7), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_TEXTFILE + TFT_CHANGELOG), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_NULL), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_TEXTFILE + TFT_LICENSE), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_NULL), + EndContainer(), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_CONTENT_DOWNLOAD), SetFill(1, 0), SetResize(1, 0), SetMinimalSize(279, 0), SetPadding(0, 7, 9, 7), SetDataTip(STR_INTRO_ONLINE_CONTENT, STR_INTRO_TOOLTIP_ONLINE_CONTENT), + EndContainer(), + NWidget(NWID_HORIZONTAL), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), + NWidget(WWT_PUSHTXTBTN, COLOUR_MAUVE, WID_GSC_ACCEPT), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_AI_SETTINGS_CLOSE, STR_NULL), + NWidget(WWT_PUSHTXTBTN, COLOUR_MAUVE, WID_GSC_RESET), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_AI_SETTINGS_RESET, STR_NULL), + EndContainer(), + NWidget(WWT_RESIZEBOX, COLOUR_MAUVE), + EndContainer(), +}; + +/** Window definition for the configure GS window. */ +static WindowDesc _gs_config_desc( + WDP_CENTER, "settings_gs_config", 500, 350, + WC_GAME_OPTIONS, WC_NONE, + 0, + _nested_gs_config_widgets, lengthof(_nested_gs_config_widgets) +); + +/** + * Window to configure which GSs will start. + */ +struct GSConfigWindow : public Window { + ScriptConfig* gs_config; ///< The configuration we're modifying. + int line_height; ///< Height of a single GS-name line. + int clicked_button; ///< The button we clicked. + bool clicked_increase; ///< Whether we clicked the increase or decrease button. + bool clicked_dropdown; ///< Whether the dropdown is open. + bool closing_dropdown; ///< True, if the dropdown list is currently closing. + GUITimer timeout; ///< Timeout for unclicking the button. + int clicked_row; ///< The clicked row of settings. + Scrollbar* vscroll; ///< Cache of the vertical scrollbar. + typedef std::vector VisibleSettingsList; ///< typdef for a vector of script settings + VisibleSettingsList visible_settings; ///< List of visible GS settings + + GSConfigWindow() : Window(&_gs_config_desc), + clicked_button(-1), + clicked_dropdown(false), + closing_dropdown(false), + timeout(0) + { + this->gs_config = GameConfig::GetConfig(); + + this->CreateNestedTree(); // Initializes 'this->line_height' as a side effect. + this->vscroll = this->GetScrollbar(WID_GSC_SCROLLBAR); + this->FinishInitNested(WN_GAME_OPTIONS_GS); + this->OnInvalidateData(0); + + this->RebuildVisibleSettings(); + } + + void Close() override + { + CloseWindowByClass(WC_AI_LIST); + this->Window::Close(); + } + + /** + * Rebuilds the list of visible settings. GS settings with the flag + * GSCONFIG_GS_DEVELOPER set will only be visible if the game setting + * gui.ai_developer_tools is enabled. + */ + void RebuildVisibleSettings() + { + visible_settings.clear(); + + for (const auto& item : *this->gs_config->GetConfigList()) { + bool no_hide = (item.flags & SCRIPTCONFIG_DEVELOPER) == 0; + if (no_hide || _settings_client.gui.ai_developer_tools) { + visible_settings.push_back(&item); + } + } + + this->vscroll->SetCount((int)this->visible_settings.size()); + } + + void UpdateWidgetSize(int widget, Dimension* size, const Dimension& padding, Dimension* fill, Dimension* resize) override + { + switch (widget) { + case WID_GSC_SETTINGS: + this->line_height = std::max(SETTING_BUTTON_HEIGHT, FONT_HEIGHT_NORMAL) + padding.height; + resize->width = 1; + resize->height = this->line_height; + size->height = 5 * this->line_height; + break; + + case WID_GSC_GSLIST: + this->line_height = FONT_HEIGHT_NORMAL + padding.height; + size->height = 1 * this->line_height; + break; + } + } + + /** + * Can the GS config be edited? + * @return True if the given GS Config slot can be edited, otherwise false. + */ + static bool IsEditable() + { + return _game_mode != GM_NORMAL || Game::GetInstance() != nullptr; + } + + void DrawWidget(const Rect& r, int widget) const override + { + switch (widget) { + case WID_GSC_GSLIST: { + StringID text = STR_AI_CONFIG_NONE; + + if (GameConfig::GetConfig()->GetInfo() != nullptr) { + SetDParamStr(0, GameConfig::GetConfig()->GetInfo()->GetName()); + text = STR_JUST_RAW_STRING; + } + + /* There is only one slot, unlike with the GS GUI, so it should never be white */ + DrawString(r.Shrink(WidgetDimensions::scaled.matrix), text, (IsEditable() ? TC_ORANGE : TC_SILVER)); + break; + } + case WID_GSC_SETTINGS: { + ScriptConfig* config = this->gs_config; + VisibleSettingsList::const_iterator it = this->visible_settings.begin(); + int i = 0; + for (; !this->vscroll->IsVisible(i); i++) it++; + + Rect ir = r.Shrink(WidgetDimensions::scaled.framerect); + bool rtl = _current_text_dir == TD_RTL; + Rect br = ir.WithWidth(SETTING_BUTTON_WIDTH, rtl); + Rect tr = ir.Indent(SETTING_BUTTON_WIDTH + WidgetDimensions::scaled.hsep_wide, rtl); + + int y = r.top; + int button_y_offset = (this->line_height - SETTING_BUTTON_HEIGHT) / 2; + int text_y_offset = (this->line_height - FONT_HEIGHT_NORMAL) / 2; + for (; this->vscroll->IsVisible(i) && it != visible_settings.end(); i++, it++) { + const ScriptConfigItem& config_item = **it; + int current_value = config->GetSetting((config_item).name); + bool editable = this->IsEditableItem(config_item); + + StringID str; + TextColour colour; + uint idx = 0; + if (StrEmpty(config_item.description)) { + if (!strcmp(config_item.name, "start_date")) { + /* Build-in translation */ + str = STR_AI_SETTINGS_START_DELAY; + colour = TC_LIGHT_BLUE; + } else { + str = STR_JUST_STRING; + colour = TC_ORANGE; + } + } else { + str = STR_AI_SETTINGS_SETTING; + colour = TC_LIGHT_BLUE; + SetDParamStr(idx++, config_item.description); + } + + if ((config_item.flags & SCRIPTCONFIG_BOOLEAN) != 0) { + DrawBoolButton(br.left, y + button_y_offset, current_value != 0, editable); + SetDParam(idx++, current_value == 0 ? STR_CONFIG_SETTING_OFF : STR_CONFIG_SETTING_ON); + } else { + if (config_item.complete_labels) { + DrawDropDownButton(br.left, y + button_y_offset, COLOUR_YELLOW, this->clicked_row == i && clicked_dropdown, editable); + } else { + DrawArrowButtons(br.left, y + button_y_offset, COLOUR_YELLOW, (this->clicked_button == i) ? 1 + (this->clicked_increase != rtl) : 0, editable && current_value > config_item.min_value, editable && current_value < config_item.max_value); + } + if (config_item.labels != nullptr && config_item.labels->Contains(current_value)) { + SetDParam(idx++, STR_JUST_RAW_STRING); + SetDParamStr(idx++, config_item.labels->Find(current_value)->second); + } else { + SetDParam(idx++, STR_JUST_INT); + SetDParam(idx++, current_value); + } + } + + DrawString(tr.left, tr.right, y + text_y_offset, str, colour); + y += this->line_height; + } + break; + } + } + } + + void OnPaint() override + { + if (this->closing_dropdown) { + this->closing_dropdown = false; + this->clicked_dropdown = false; + } + this->DrawWidgets(); + } + + void OnClick(Point pt, int widget, int click_count) override + { + if (widget >= WID_GSC_TEXTFILE && widget < WID_GSC_TEXTFILE + TFT_END) { + if (GameConfig::GetConfig() == nullptr) return; + + ShowScriptTextfileWindow((TextfileType)(widget - WID_GSC_TEXTFILE), (CompanyID)OWNER_DEITY); + return; + } + + switch (widget) { + case WID_GSC_GSLIST: { + this->InvalidateData(); + if (click_count > 1 && _game_mode != GM_NORMAL) ShowAIListWindow((CompanyID)OWNER_DEITY); + break; + } + + case WID_GSC_CHANGE: // choose other Game Script + ShowAIListWindow((CompanyID)OWNER_DEITY); + break; + + case WID_GSC_CONTENT_DOWNLOAD: + if (!_network_available) { + ShowErrorMessage(STR_NETWORK_ERROR_NOTAVAILABLE, INVALID_STRING_ID, WL_ERROR); + } else { + ShowNetworkContentListWindow(nullptr, CONTENT_TYPE_GAME); + } + break; + + case WID_GSC_SETTINGS: { + Rect r = this->GetWidget(widget)->GetCurrentRect().Shrink(WidgetDimensions::scaled.matrix, RectPadding::zero); + int num = (pt.y - r.top) / this->line_height + this->vscroll->GetPosition(); + if (num >= (int)this->visible_settings.size()) break; + + VisibleSettingsList::const_iterator it = this->visible_settings.begin(); + for (int i = 0; i < num; i++) it++; + const ScriptConfigItem config_item = **it; + if (!this->IsEditableItem(config_item)) return; + + if (this->clicked_row != num) { + this->CloseChildWindows(WC_QUERY_STRING); + HideDropDownMenu(this); + this->clicked_row = num; + this->clicked_dropdown = false; + } + + bool bool_item = (config_item.flags & SCRIPTCONFIG_BOOLEAN) != 0; + + int x = pt.x - r.left; + if (_current_text_dir == TD_RTL) x = r.Width() - 1 - x; + + /* One of the arrows is clicked (or green/red rect in case of bool value) */ + int old_val = this->gs_config->GetSetting(config_item.name); + if (!bool_item && IsInsideMM(x, 0, SETTING_BUTTON_WIDTH) && config_item.complete_labels) { + if (this->clicked_dropdown) { + /* unclick the dropdown */ + HideDropDownMenu(this); + this->clicked_dropdown = false; + this->closing_dropdown = false; + } else { + int rel_y = (pt.y - r.top) % this->line_height; + + Rect wi_rect; + wi_rect.left = pt.x - (_current_text_dir == TD_RTL ? SETTING_BUTTON_WIDTH - 1 - x : x); + wi_rect.right = wi_rect.left + SETTING_BUTTON_WIDTH - 1; + wi_rect.top = pt.y - rel_y + (this->line_height - SETTING_BUTTON_HEIGHT) / 2; + wi_rect.bottom = wi_rect.top + SETTING_BUTTON_HEIGHT - 1; + + /* If the mouse is still held but dragged outside of the dropdown list, keep the dropdown open */ + if (pt.y >= wi_rect.top && pt.y <= wi_rect.bottom) { + this->clicked_dropdown = true; + this->closing_dropdown = false; + + DropDownList list; + for (int i = config_item.min_value; i <= config_item.max_value; i++) { + list.emplace_back(new DropDownListCharStringItem(config_item.labels->Find(i)->second, i, false)); + } + + ShowDropDownListAt(this, std::move(list), old_val, -1, wi_rect, COLOUR_ORANGE, true); + } + } + } else if (IsInsideMM(x, 0, SETTING_BUTTON_WIDTH)) { + int new_val = old_val; + if (bool_item) { + new_val = !new_val; + } else if (x >= SETTING_BUTTON_WIDTH / 2) { + /* Increase button clicked */ + new_val += config_item.step_size; + if (new_val > config_item.max_value) new_val = config_item.max_value; + this->clicked_increase = true; + } else { + /* Decrease button clicked */ + new_val -= config_item.step_size; + if (new_val < config_item.min_value) new_val = config_item.min_value; + this->clicked_increase = false; + } + + if (new_val != old_val) { + this->gs_config->SetSetting(config_item.name, new_val); + this->clicked_button = num; + this->timeout.SetInterval(150); + } + } else if (!bool_item && !config_item.complete_labels) { + /* Display a query box so users can enter a custom value. */ + SetDParam(0, old_val); + ShowQueryString(STR_JUST_INT, STR_CONFIG_SETTING_QUERY_CAPTION, 10, this, CS_NUMERAL, QSF_NONE); + } + this->SetDirty(); + break; + } + + case WID_GSC_ACCEPT: + this->Close(); + break; + + case WID_GSC_RESET: + this->gs_config->ResetEditableSettings(_game_mode == GM_MENU); + this->SetDirty(); + break; + } + } + + void OnQueryTextFinished(char* str) override + { + if (StrEmpty(str)) return; + int32 value = atoi(str); + SetValue(value); + } + + void OnDropdownSelect(int widget, int index) override + { + assert(this->clicked_dropdown); + SetValue(index); + } + + void OnDropdownClose(Point pt, int widget, int index, bool instant_close) override + { + /* We cannot raise the dropdown button just yet. OnClick needs some hint, whether + * the same dropdown button was clicked again, and then not open the dropdown again. + * So, we only remember that it was closed, and process it on the next OnPaint, which is + * after OnClick. */ + assert(this->clicked_dropdown); + this->closing_dropdown = true; + this->SetDirty(); + } + + void OnResize() override + { + this->vscroll->SetCapacityFromWidget(this, WID_GSC_SETTINGS); + } + + void OnRealtimeTick(uint delta_ms) override + { + if (this->timeout.Elapsed(delta_ms)) { + this->clicked_button = -1; + this->SetDirty(); + } + } + + /** + * Some data on this window has become invalid. + * @param data Information about the changed data. + * @param gui_scope Whether the call is done from GUI scope. You may not do everything when not in GUI scope. See #InvalidateWindowData() for details. + */ + void OnInvalidateData(int data = 0, bool gui_scope = true) override + { + if (!gui_scope) return; + + this->SetWidgetDisabledState(WID_GSC_CHANGE, (_game_mode == GM_NORMAL) || !IsEditable()); + + for (TextfileType tft = TFT_BEGIN; tft < TFT_END; tft++) { + this->SetWidgetDisabledState(WID_GSC_TEXTFILE + tft, GameConfig::GetConfig()->GetTextfile(tft, (CompanyID)OWNER_DEITY) == nullptr); + } + this->RebuildVisibleSettings(); + HideDropDownMenu(this); + this->CloseChildWindows(WC_QUERY_STRING); + } +private: + bool IsEditableItem(const ScriptConfigItem &config_item) const + { + return _game_mode == GM_MENU + || _game_mode == GM_EDITOR + || (config_item.flags & SCRIPTCONFIG_INGAME) != 0 + || _settings_client.gui.ai_developer_tools; + } + + void SetValue(int value) + { + VisibleSettingsList::const_iterator it = this->visible_settings.begin(); + for (int i = 0; i < this->clicked_row; i++) it++; + const ScriptConfigItem config_item = **it; + if (_game_mode == GM_NORMAL && (config_item.flags & SCRIPTCONFIG_INGAME) == 0) return; + this->gs_config->SetSetting(config_item.name, value); + this->SetDirty(); + } +}; + +/** Open the GS config window. */ +void ShowGSConfigWindow() +{ + CloseWindowByClass(WC_GAME_OPTIONS); + new GSConfigWindow(); +} diff --git a/src/game/game_gui.hpp b/src/game/game_gui.hpp new file mode 100644 index 0000000000..d0159a00d5 --- /dev/null +++ b/src/game/game_gui.hpp @@ -0,0 +1,15 @@ +/* + * This file is part of OpenTTD. + * OpenTTD is free software; you can redistribute itand /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 < http://www.gnu.org/licenses/>. + */ + +/** @file game_gui.hpp %Window for configuring the Games */ + +#ifndef GAME_GUI_HPP +#define GAME_GUI_HPP + +void ShowGSConfigWindow(); + +#endif /* AI_GUI_HPP */ diff --git a/src/genworld_gui.cpp b/src/genworld_gui.cpp index 9e915304ea..042c98260c 100644 --- a/src/genworld_gui.cpp +++ b/src/genworld_gui.cpp @@ -30,6 +30,8 @@ #include "newgrf_townname.h" #include "townname_type.h" #include "video/video_driver.hpp" +#include "ai/ai_gui.hpp" +#include "game/game_gui.hpp" #include "widgets/genworld_widget.h" @@ -86,38 +88,42 @@ static const NWidgetPart _nested_generate_landscape_widgets[] = { NWidget(NWID_SPACER), SetFill(1, 0), EndContainer(), NWidget(NWID_SPACER), SetMinimalSize(0, 11), + /* Generation options. */ NWidget(NWID_HORIZONTAL), SetPIP(10, 5, 10), - NWidget(NWID_HORIZONTAL), SetPIP(0, 3, 0), - /* Left column with labels. */ - NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, 4, 0), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_MAPSIZE, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_LAND_GENERATOR, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_TERRAIN_TYPE, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_VARIETY, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_QUANTITY_OF_SEA_LAKES, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_NUMBER_OF_TOWNS, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_NUMBER_OF_INDUSTRIES, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_BORDER_TYPE, STR_NULL), SetFill(1, 1), - EndContainer(), - /* Widgets at the right of the labels. */ - NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, 4, 0), - /* Mapsize X * Y. */ - NWidget(NWID_HORIZONTAL), SetPIP(0, 4, 0), - NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_MAPSIZE_X_PULLDOWN), SetDataTip(STR_JUST_INT, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 0), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_BY, STR_NULL), SetPadding(1, 0, 0, 0), SetFill(1, 1), - NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_MAPSIZE_Y_PULLDOWN), SetDataTip(STR_JUST_INT, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 0), + /* Left half (land generation options) */ + NWidget(NWID_VERTICAL), + NWidget(NWID_HORIZONTAL), SetPIP(0, 3, 0), + /* Labels on the left side (global column 1). */ + NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, 4, 0), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_MAPSIZE, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_LAND_GENERATOR, STR_NULL), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_TERRAIN_TYPE, STR_NULL), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_VARIETY, STR_NULL), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_SMOOTHNESS, STR_NULL), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_QUANTITY_OF_RIVERS, STR_NULL), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_BORDER_TYPE, STR_NULL), SetFill(1, 1), + EndContainer(), + /* Widgets on the right side (global column 2). */ + NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, 4, 0), + /* Mapsize X * Y. */ + NWidget(NWID_HORIZONTAL), SetPIP(0, 4, 0), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_MAPSIZE_X_PULLDOWN), SetDataTip(STR_JUST_INT, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 0), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_BY, STR_NULL), SetPadding(1, 0, 0, 0), SetFill(1, 1), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_MAPSIZE_Y_PULLDOWN), SetDataTip(STR_JUST_INT, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 0), + EndContainer(), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_LANDSCAPE_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TERRAIN_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_VARIETY_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_SMOOTHNESS_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_RIVER_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0), + NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_BORDERS_RANDOM), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0), EndContainer(), - NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_LANDSCAPE_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0), - NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TERRAIN_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0), - NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_VARIETY_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0), - NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_WATER_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0), - NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWN_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0), - NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_INDUSTRY_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0), - NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_BORDERS_RANDOM), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0), EndContainer(), EndContainer(), - NWidget(NWID_VERTICAL), SetPIP(0, 4, 0), + /* Right half (all other options) */ + NWidget(NWID_VERTICAL), NWidget(NWID_HORIZONTAL), SetPIP(0, 3, 0), + /* Labels on the left side (global column 3). */ NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, 4, 0), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_GL_CLIMATE_SEL_LABEL), NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_SNOW_COVERAGE, STR_NULL), SetFill(1, 1), @@ -125,11 +131,14 @@ static const NWidgetPart _nested_generate_landscape_widgets[] = { NWidget(NWID_SPACER), EndContainer(), NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_DATE, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_SMOOTHNESS, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_QUANTITY_OF_RIVERS, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_GAME_OPTIONS_TOWN_NAMES_FRAME, STR_NULL), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_TOWN_NAME_LABEL, STR_NULL), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_NUMBER_OF_TOWNS, STR_NULL), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_NUMBER_OF_INDUSTRIES, STR_NULL), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_SEA_LEVEL, STR_NULL), SetFill(1, 1), EndContainer(), + /* Widgets on the right side (global column 4). */ NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, 4, 0), + /* Climate selector. */ NWidget(NWID_SELECTION, INVALID_COLOUR, WID_GL_CLIMATE_SEL_SELECTOR), /* Snow coverage. */ NWidget(NWID_HORIZONTAL), @@ -143,7 +152,7 @@ static const NWidgetPart _nested_generate_landscape_widgets[] = { NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_DESERT_COVERAGE_TEXT), SetDataTip(STR_MAPGEN_DESERT_COVERAGE_TEXT, STR_NULL), SetFill(1, 0), NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_DESERT_COVERAGE_UP), SetDataTip(SPR_ARROW_UP, STR_MAPGEN_DESERT_COVERAGE_UP), SetFill(0, 1), EndContainer(), - /* Temperate/Toyland spacer */ + /* Temperate/Toyland spacer. */ NWidget(NWID_SPACER), EndContainer(), /* Starting date. */ @@ -152,12 +161,12 @@ static const NWidgetPart _nested_generate_landscape_widgets[] = { NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_GL_START_DATE_TEXT), SetDataTip(STR_BLACK_DATE_LONG, STR_NULL), SetFill(1, 0), NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_START_DATE_UP), SetDataTip(SPR_ARROW_UP, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD), SetFill(0, 1), EndContainer(), - NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_SMOOTHNESS_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0), - NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_RIVER_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0), - NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWNNAME_DROPDOWN), SetDataTip(STR_BLACK_STRING, STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP), SetFill(1, 0), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWNNAME_DROPDOWN), SetDataTip(STR_BLACK_STRING, STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP), SetFill(1, 0), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWN_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_INDUSTRY_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_WATER_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0), EndContainer(), EndContainer(), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREEN, WID_GL_GENERATE_BUTTON), SetMinimalSize(84, 0), SetDataTip(STR_MAPGEN_GENERATE, STR_NULL), SetFill(1, 1), EndContainer(), EndContainer(), NWidget(NWID_SPACER), SetMinimalSize(0, 4), @@ -186,6 +195,16 @@ static const NWidgetPart _nested_generate_landscape_widgets[] = { NWidget(NWID_SPACER), SetFill(1, 1), EndContainer(), EndContainer(), + NWidget(NWID_SPACER), SetMinimalSize(0, 6), SetFill(1, 1), + /* AI, GS, and NewGRF settings */ + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(10, 0, 10), + NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_GL_AI_BUTTON), SetMinimalSize(0, 24), SetDataTip(STR_MAPGEN_AI_SETTINGS, STR_MAPGEN_AI_SETTINGS_TOOLTIP), SetFill(1, 0), + NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_GL_GS_BUTTON), SetMinimalSize(0, 24), SetDataTip(STR_MAPGEN_GS_SETTINGS, STR_MAPGEN_GS_SETTINGS_TOOLTIP), SetFill(1, 0), + NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_GL_NEWGRF_BUTTON), SetMinimalSize(0, 24), SetDataTip(STR_MAPGEN_NEWGRF_SETTINGS, STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP), SetFill(1, 0), + EndContainer(), + NWidget(NWID_SPACER), SetMinimalSize(0, 7), SetFill(1, 1), + /* Generate */ + NWidget(WWT_PUSHTXTBTN, COLOUR_GREEN, WID_GL_GENERATE_BUTTON), SetMinimalSize(84, 36), SetDataTip(STR_MAPGEN_GENERATE, STR_NULL), SetPadding(0, 10, 0, 10), SetFill(1, 1), NWidget(NWID_SPACER), SetMinimalSize(0, 9), SetFill(1, 1), EndContainer(), }; @@ -212,21 +231,24 @@ static const NWidgetPart _nested_heightmap_load_widgets[] = { NWidget(NWID_SPACER), SetFill(1, 0), EndContainer(), NWidget(NWID_SPACER), SetMinimalSize(0, 11), SetFill(0, 1), + /* Generation options. */ NWidget(NWID_HORIZONTAL), SetPIP(10, 3, 10), - /* Labels at the left side. */ + /* Left half labels (global column 1) and heightmap name label */ NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, 4, 0), + /* Heightmap name label. */ NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_HEIGHTMAP_NAME, STR_NULL), SetFill(1, 1), + /* Land generation option labels */ NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_HEIGHTMAP_SIZE_LABEL, STR_NULL), SetFill(1, 1), NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_MAPSIZE, STR_NULL), SetFill(1, 1), NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_HEIGHTMAP_ROTATION, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_NUMBER_OF_TOWNS, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_NUMBER_OF_INDUSTRIES, STR_NULL), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_HEIGHTMAP_HEIGHT, STR_NULL), SetFill(1, 1), NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_QUANTITY_OF_RIVERS, STR_NULL), SetFill(1, 1), EndContainer(), - /* Widgets at the right of the labels. */ + /* All other columns. */ NWidget(NWID_VERTICAL), SetPIP(0, 4, 0), NWidget(WWT_TEXT, COLOUR_ORANGE, WID_GL_HEIGHTMAP_NAME_TEXT), SetTextColour(TC_ORANGE), SetDataTip(STR_JUST_RAW_STRING, STR_EMPTY), SetFill(1, 0), NWidget(NWID_HORIZONTAL), SetPIP(0, 5, 0), + /* Left half widgets (global column 2) */ NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, 4, 0), NWidget(WWT_TEXT, COLOUR_ORANGE, WID_GL_HEIGHTMAP_SIZE_TEXT), SetDataTip(STR_MAPGEN_HEIGHTMAP_SIZE, STR_NULL), SetFill(1, 0), /* Mapsize X * Y. */ @@ -236,54 +258,72 @@ static const NWidgetPart _nested_heightmap_load_widgets[] = { NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_MAPSIZE_Y_PULLDOWN), SetDataTip(STR_JUST_INT, STR_NULL), SetFill(1, 0), EndContainer(), NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_HEIGHTMAP_ROTATION_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0), - NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWN_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0), - NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_INDUSTRY_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0), + /* Heightmap highest peak. */ + NWidget(NWID_HORIZONTAL), + NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_HEIGHTMAP_HEIGHT_DOWN), SetDataTip(SPR_ARROW_DOWN, STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN), SetFill(0, 1), + NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_HEIGHTMAP_HEIGHT_TEXT), SetDataTip(STR_BLACK_INT, STR_NULL), SetFill(1, 0), + NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_HEIGHTMAP_HEIGHT_UP), SetDataTip(SPR_ARROW_UP, STR_MAPGEN_HEIGHTMAP_HEIGHT_UP), SetFill(0, 1), + EndContainer(), NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_RIVER_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0), EndContainer(), NWidget(NWID_VERTICAL), SetPIP(0, 4, 0), NWidget(NWID_HORIZONTAL), SetPIP(0, 3, 0), + /* Right half labels (global column 3) */ NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, 4, 0), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_HEIGHTMAP_HEIGHT, STR_NULL), SetFill(1, 1), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_GL_CLIMATE_SEL_LABEL), NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_SNOW_COVERAGE, STR_NULL), SetFill(1, 1), NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_DESERT_COVERAGE, STR_NULL), SetFill(1, 1), NWidget(NWID_SPACER), EndContainer(), NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_DATE, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_GAME_OPTIONS_TOWN_NAMES_FRAME, STR_NULL), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_TOWN_NAME_LABEL, STR_NULL), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_NUMBER_OF_TOWNS, STR_NULL), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_NUMBER_OF_INDUSTRIES, STR_NULL), SetFill(1, 1), EndContainer(), + /* Right half widgets (global column 4) */ NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, 4, 0), - NWidget(NWID_HORIZONTAL), - NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_HEIGHTMAP_HEIGHT_DOWN), SetDataTip(SPR_ARROW_DOWN, STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN), SetFill(0, 1), - NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_HEIGHTMAP_HEIGHT_TEXT), SetDataTip(STR_BLACK_INT, STR_NULL), SetFill(1, 0), - NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_HEIGHTMAP_HEIGHT_UP), SetDataTip(SPR_ARROW_UP, STR_MAPGEN_HEIGHTMAP_HEIGHT_UP), SetFill(0, 1), - EndContainer(), + /* Climate selector. */ NWidget(NWID_SELECTION, INVALID_COLOUR, WID_GL_CLIMATE_SEL_SELECTOR), + /* Snow coverage. */ NWidget(NWID_HORIZONTAL), NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_SNOW_COVERAGE_DOWN), SetDataTip(SPR_ARROW_DOWN, STR_MAPGEN_SNOW_COVERAGE_DOWN), SetFill(0, 1), NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_SNOW_COVERAGE_TEXT), SetDataTip(STR_MAPGEN_SNOW_COVERAGE_TEXT, STR_NULL), SetFill(1, 0), NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_SNOW_COVERAGE_UP), SetDataTip(SPR_ARROW_UP, STR_MAPGEN_SNOW_COVERAGE_UP), SetFill(0, 1), EndContainer(), + /* Desert coverage. */ NWidget(NWID_HORIZONTAL), NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_DESERT_COVERAGE_DOWN), SetDataTip(SPR_ARROW_DOWN, STR_MAPGEN_DESERT_COVERAGE_DOWN), SetFill(0, 1), NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_DESERT_COVERAGE_TEXT), SetDataTip(STR_MAPGEN_DESERT_COVERAGE_TEXT, STR_NULL), SetFill(1, 0), NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_DESERT_COVERAGE_UP), SetDataTip(SPR_ARROW_UP, STR_MAPGEN_DESERT_COVERAGE_UP), SetFill(0, 1), EndContainer(), + /* Temperate/Toyland spacer. */ NWidget(NWID_SPACER), EndContainer(), + /* Starting date. */ NWidget(NWID_HORIZONTAL), NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_START_DATE_DOWN), SetDataTip(SPR_ARROW_DOWN, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD), SetFill(0, 1), NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_GL_START_DATE_TEXT), SetDataTip(STR_BLACK_DATE_LONG, STR_NULL), SetFill(1, 0), NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_START_DATE_UP), SetDataTip(SPR_ARROW_UP, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD), SetFill(0, 1), EndContainer(), - NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWNNAME_DROPDOWN), SetDataTip(STR_BLACK_STRING, STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP), SetFill(1, 0), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWNNAME_DROPDOWN), SetDataTip(STR_BLACK_STRING, STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP), SetFill(1, 0), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWN_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_INDUSTRY_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0), EndContainer(), EndContainer(), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREEN, WID_GL_GENERATE_BUTTON), SetMinimalSize(84, 0), SetDataTip(STR_MAPGEN_GENERATE, STR_NULL), SetFill(1, 1), EndContainer(), EndContainer(), EndContainer(), EndContainer(), + NWidget(NWID_SPACER), SetMinimalSize(0, 6), SetFill(1, 1), + /* AI, GS, and NewGRF settings */ + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(10, 0, 10), + NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_GL_AI_BUTTON), SetMinimalSize(0, 24), SetDataTip(STR_MAPGEN_AI_SETTINGS, STR_MAPGEN_AI_SETTINGS_TOOLTIP), SetFill(1, 0), + NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_GL_GS_BUTTON), SetMinimalSize(0, 24), SetDataTip(STR_MAPGEN_GS_SETTINGS, STR_MAPGEN_GS_SETTINGS_TOOLTIP), SetFill(1, 0), + NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_GL_NEWGRF_BUTTON), SetMinimalSize(0, 24), SetDataTip(STR_MAPGEN_NEWGRF_SETTINGS, STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP), SetFill(1, 0), + EndContainer(), + NWidget(NWID_SPACER), SetMinimalSize(0, 7), SetFill(1, 1), + /* Generate */ + NWidget(WWT_PUSHTXTBTN, COLOUR_GREEN, WID_GL_GENERATE_BUTTON), SetMinimalSize(84, 36), SetDataTip(STR_MAPGEN_GENERATE, STR_NULL), SetPadding(0, 10, 0, 10), SetFill(1, 1), NWidget(NWID_SPACER), SetMinimalSize(0, 9), SetFill(1, 1), EndContainer(), }; @@ -344,7 +384,7 @@ static DropDownList BuildTownNameDropDown() /* Add and sort original townnames generators */ for (uint i = 0; i < BUILTIN_TOWNNAME_GENERATOR_COUNT; i++) { - list.emplace_back(new DropDownListStringItem(STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH + i, i, false)); + list.emplace_back(new DropDownListStringItem(STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH + i, i, false)); } std::sort(list.begin() + newgrf_size, list.end(), DropDownListStringItem::NatSortFunc); @@ -415,7 +455,7 @@ struct GenerateLandscapeWindow : public Window { case WID_GL_TOWNNAME_DROPDOWN: { uint gen = _settings_newgame.game_creation.town_name; StringID name = gen < BUILTIN_TOWNNAME_GENERATOR_COUNT ? - STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH + gen : + STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH + gen : GetGRFTownNameName(gen - BUILTIN_TOWNNAME_GENERATOR_COUNT); SetDParam(0, name); break; @@ -622,7 +662,7 @@ struct GenerateLandscapeWindow : public Window { } } size->width += padding.width; - size->height = std::max(size->height, (uint)(FONT_HEIGHT_NORMAL + WD_DROPDOWNTEXT_TOP + WD_DROPDOWNTEXT_BOTTOM)); + size->height = std::max(size->height, (uint)(FONT_HEIGHT_NORMAL + padding.height)); } void OnClick(Point pt, int widget, int click_count) override @@ -815,6 +855,18 @@ struct GenerateLandscapeWindow : public Window { _settings_newgame.game_creation.water_borders = (_settings_newgame.game_creation.water_borders == BORDERS_RANDOM) ? 0 : BORDERS_RANDOM; this->InvalidateData(); break; + + case WID_GL_AI_BUTTON: ///< AI Settings + ShowAIConfigWindow(); + break; + + case WID_GL_GS_BUTTON: ///< Game Script Settings + ShowGSConfigWindow(); + break; + + case WID_GL_NEWGRF_BUTTON: ///< NewGRF Settings + ShowNewGRFSettings(true, true, false, &_grfconfig_newgame); + break; } } @@ -882,7 +934,7 @@ struct GenerateLandscapeWindow : public Window { if ((uint)index == CUSTOM_SEA_LEVEL_NUMBER_DIFFICULTY) { this->widget_id = widget; SetDParam(0, _settings_newgame.game_creation.custom_sea_level); - ShowQueryString(STR_JUST_INT, STR_MAPGEN_QUANTITY_OF_SEA_LAKES, 3, this, CS_NUMERAL, QSF_NONE); + ShowQueryString(STR_JUST_INT, STR_MAPGEN_SEA_LEVEL, 3, this, CS_NUMERAL, QSF_NONE); } _settings_newgame.difficulty.quantity_sea_lakes = index; break; @@ -1270,12 +1322,10 @@ void ShowCreateScenario() static const NWidgetPart _nested_generate_progress_widgets[] = { NWidget(WWT_CAPTION, COLOUR_GREY), SetDataTip(STR_GENERATION_WORLD, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), NWidget(WWT_PANEL, COLOUR_GREY), - NWidget(NWID_HORIZONTAL), SetPIP(20, 0, 20), - NWidget(NWID_VERTICAL), SetPIP(11, 8, 11), - NWidget(WWT_EMPTY, INVALID_COLOUR, WID_GP_PROGRESS_BAR), SetFill(1, 0), - NWidget(WWT_EMPTY, INVALID_COLOUR, WID_GP_PROGRESS_TEXT), SetFill(1, 0), - NWidget(WWT_TEXTBTN, COLOUR_WHITE, WID_GP_ABORT), SetDataTip(STR_GENERATION_ABORT, STR_NULL), SetFill(1, 0), - EndContainer(), + NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_wide, 0), SetPadding(WidgetDimensions::unscaled.modalpopup), + NWidget(WWT_EMPTY, INVALID_COLOUR, WID_GP_PROGRESS_BAR), SetFill(1, 0), + NWidget(WWT_EMPTY, INVALID_COLOUR, WID_GP_PROGRESS_TEXT), SetFill(1, 0), + NWidget(WWT_TEXTBTN, COLOUR_WHITE, WID_GP_ABORT), SetDataTip(STR_GENERATION_ABORT, STR_NULL), SetFill(1, 0), EndContainer(), EndContainer(), }; @@ -1353,8 +1403,8 @@ struct GenerateProgressWindow : public Window { SetDParamMaxValue(0, 100); *size = GetStringBoundingBox(STR_GENERATION_PROGRESS); /* We need some spacing for the 'border' */ - size->height += 8; - size->width += 8; + size->height += WidgetDimensions::scaled.frametext.Horizontal(); + size->width += WidgetDimensions::scaled.frametext.Vertical(); break; } @@ -1362,7 +1412,7 @@ struct GenerateProgressWindow : public Window { for (uint i = 0; i < GWP_CLASS_COUNT; i++) { size->width = std::max(size->width, GetStringBoundingBox(_generation_class_table[i]).width); } - size->height = FONT_HEIGHT_NORMAL * 2 + WD_PAR_VSEP_NORMAL; + size->height = FONT_HEIGHT_NORMAL * 2 + WidgetDimensions::scaled.vsep_normal; break; } } @@ -1370,13 +1420,15 @@ struct GenerateProgressWindow : public Window { void DrawWidget(const Rect &r, int widget) const override { switch (widget) { - case WID_GP_PROGRESS_BAR: + case WID_GP_PROGRESS_BAR: { /* Draw the % complete with a bar and a text */ - DrawFrameRect(r.left, r.top, r.right, r.bottom, COLOUR_GREY, FR_BORDERONLY); - DrawFrameRect(r.left + 1, r.top + 1, (int)((r.right - r.left - 2) * _gws.percent / 100) + r.left + 1, r.bottom - 1, COLOUR_MAUVE, FR_NONE); + DrawFrameRect(r, COLOUR_GREY, FR_BORDERONLY | FR_LOWERED); + Rect br = r.Shrink(WidgetDimensions::scaled.bevel); + DrawFrameRect(br.WithWidth(br.Width() * _gws.percent / 100, false), COLOUR_MAUVE, FR_NONE); SetDParam(0, _gws.percent); - DrawString(r.left, r.right, r.top + 5, STR_GENERATION_PROGRESS, TC_FROMSTRING, SA_HOR_CENTER); + DrawString(br.left, br.right, CenterBounds(br.top, br.bottom, FONT_HEIGHT_NORMAL), STR_GENERATION_PROGRESS, TC_FROMSTRING, SA_HOR_CENTER); break; + } case WID_GP_PROGRESS_TEXT: /* Tell which class we are generating */ @@ -1385,7 +1437,7 @@ struct GenerateProgressWindow : public Window { /* And say where we are in that class */ SetDParam(0, _gws.current); SetDParam(1, _gws.total); - DrawString(r.left, r.right, r.top + FONT_HEIGHT_NORMAL + WD_PAR_VSEP_NORMAL, STR_GENERATION_PROGRESS_NUM, TC_FROMSTRING, SA_HOR_CENTER); + DrawString(r.left, r.right, r.top + FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal, STR_GENERATION_PROGRESS_NUM, TC_FROMSTRING, SA_HOR_CENTER); } } }; diff --git a/src/gfx.cpp b/src/gfx.cpp index d96b2bdac4..43a2072d4a 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -61,12 +61,9 @@ static void GfxMainBlitter(const Sprite *sprite, int x, int y, BlitterMode mode, static ReusableBuffer _cursor_backup; -ZoomLevel _gui_zoom; ///< GUI Zoom level -ZoomLevel _font_zoom; ///< Font Zoom level - -int8 _gui_zoom_cfg; ///< GUI zoom level in config. -int8 _font_zoom_cfg; ///< Font zoom level in config. - +ZoomLevel _gui_zoom = ZOOM_LVL_OUT_4X; ///< GUI Zoom level +int _gui_scale = MIN_INTERFACE_SCALE; ///< GUI scale, 100 is 100%. +int _gui_scale_cfg; ///< GUI scale in config. /** * The rect for repaint. @@ -564,6 +561,8 @@ static int DrawLayoutLine(const ParagraphLayouter::Line &line, int y, int left, NOT_REACHED(); } + const uint shadow_offset = ScaleGUITrad(1); + TextColour colour = TC_BLACK; bool draw_shadow = false; for (int run_index = 0; run_index < line.CountRuns(); run_index++) { @@ -599,7 +598,7 @@ static int DrawLayoutLine(const ParagraphLayouter::Line &line, int y, int left, if (draw_shadow && (glyph & SPRITE_GLYPH) == 0) { SetColourRemap(TC_BLACK); - GfxMainBlitter(sprite, begin_x + 1, top + 1, BM_COLOUR_REMAP); + GfxMainBlitter(sprite, begin_x + shadow_offset, top + shadow_offset, BM_COLOUR_REMAP); SetColourRemap(colour); } GfxMainBlitter(sprite, begin_x, top, BM_COLOUR_REMAP); @@ -611,7 +610,7 @@ static int DrawLayoutLine(const ParagraphLayouter::Line &line, int y, int left, for (int i = 0; i < 3; i++, x += dot_width) { if (draw_shadow) { SetColourRemap(TC_BLACK); - GfxMainBlitter(dot_sprite, x + 1, y + 1, BM_COLOUR_REMAP); + GfxMainBlitter(dot_sprite, x + shadow_offset, y + shadow_offset, BM_COLOUR_REMAP); SetColourRemap(colour); } GfxMainBlitter(dot_sprite, x, y, BM_COLOUR_REMAP); @@ -915,12 +914,27 @@ Dimension GetStringBoundingBox(const std::string &str, FontSize start_fontsize) * @param strid String to examine. * @return Width and height of the bounding box for the string in pixels. */ -Dimension GetStringBoundingBox(StringID strid) +Dimension GetStringBoundingBox(StringID strid, FontSize start_fontsize) { char buffer[DRAW_STRING_BUFFER]; GetString(buffer, strid, lastof(buffer)); - return GetStringBoundingBox(buffer); + return GetStringBoundingBox(buffer, start_fontsize); +} + +/** + * Get maximum width of a list of strings. + * @param list List of strings, terminated with INVALID_STRING_ID. + * @param fontsize Font size to use. + * @return Width of longest string within the list. + */ +uint GetStringListWidth(const StringID *list, FontSize fontsize) +{ + uint width = 0; + for (const StringID *str = list; *str != INVALID_STRING_ID; str++) { + width = std::max(width, GetStringBoundingBox(*str, fontsize).width); + } + return width; } /** @@ -2026,48 +2040,52 @@ void SortResolutions() void UpdateGUIZoom() { /* Determine real GUI zoom to use. */ - if (_gui_zoom_cfg == ZOOM_LVL_CFG_AUTO) { - _gui_zoom = static_cast(Clamp(VideoDriver::GetInstance()->GetSuggestedUIZoom(), _settings_client.gui.zoom_min, _settings_client.gui.zoom_max)); + if (_gui_scale_cfg == -1) { + _gui_scale = VideoDriver::GetInstance()->GetSuggestedUIScale(); } else { - /* Ensure the gui_zoom is clamped between min/max. Change the - * _gui_zoom_cfg if it isn't, as this is used to visually show the - * selection in the Game Options. */ - _gui_zoom_cfg = Clamp(_gui_zoom_cfg, _settings_client.gui.zoom_min, _settings_client.gui.zoom_max); - _gui_zoom = static_cast(_gui_zoom_cfg); + _gui_scale = Clamp(_gui_scale_cfg, MIN_INTERFACE_SCALE, MAX_INTERFACE_SCALE); } - /* Determine real font zoom to use. */ - if (_font_zoom_cfg == ZOOM_LVL_CFG_AUTO) { - _font_zoom = static_cast(VideoDriver::GetInstance()->GetSuggestedUIZoom()); - } else { - _font_zoom = static_cast(_font_zoom_cfg); - } + int8 new_zoom = ScaleGUITrad(1) <= 1 ? ZOOM_LVL_OUT_4X : ScaleGUITrad(1) >= 4 ? ZOOM_LVL_MIN : ZOOM_LVL_OUT_2X; + /* Ensure the gui_zoom is clamped between min/max. */ + new_zoom = Clamp(new_zoom, _settings_client.gui.zoom_min, _settings_client.gui.zoom_max); + _gui_zoom = static_cast(new_zoom); } /** * Resolve GUI zoom level and adjust GUI to new zoom, if auto-suggestion is requested. + * @param automatic Set if the change is occuring due to OS DPI scaling being changed. * @returns true when the zoom level has changed, caller must call ReInitAllWindows(true) * after resizing the application's window/buffer. */ -bool AdjustGUIZoom() +bool AdjustGUIZoom(bool automatic) { - auto old_zoom = _gui_zoom; + ZoomLevel old_zoom = _gui_zoom; + int old_scale = _gui_scale; UpdateGUIZoom(); - if (old_zoom == _gui_zoom) return false; - GfxClearSpriteCache(); - VideoDriver::GetInstance()->ClearSystemSprites(); + if (old_scale == _gui_scale) return false; + + /* Reload sprites if sprite zoom level has changed. */ + if (old_zoom != _gui_zoom) { + GfxClearSpriteCache(); + VideoDriver::GetInstance()->ClearSystemSprites(); + UpdateCursorSize(); + } + ClearFontCache(); - GfxClearSpriteCache(); + LoadStringWidthTable(); UpdateAllVirtCoords(); /* Adjust all window sizes to match the new zoom level, so that they don't appear to move around when the application is moved to a screen with different DPI. */ auto zoom_shift = old_zoom - _gui_zoom; for (Window *w : Window::Iterate()) { - w->left = AdjustByZoom(w->left, zoom_shift); - w->top = AdjustByZoom(w->top, zoom_shift); - w->width = AdjustByZoom(w->width, zoom_shift); - w->height = AdjustByZoom(w->height, zoom_shift); + if (automatic) { + w->left = (w->left * _gui_scale) / old_scale; + w->top = (w->top * _gui_scale) / old_scale; + w->width = (w->width * _gui_scale) / old_scale; + w->height = (w->height * _gui_scale) / old_scale; + } if (w->viewport != nullptr) { w->viewport->zoom = Clamp(ZoomLevel(w->viewport->zoom - zoom_shift), _settings_client.gui.zoom_min, _settings_client.gui.zoom_max); } diff --git a/src/gfx_func.h b/src/gfx_func.h index 4ebb85aed2..78891e1dc7 100644 --- a/src/gfx_func.h +++ b/src/gfx_func.h @@ -79,8 +79,7 @@ void ChangeGameSpeed(bool enable_fast_forward); void DrawMouseCursor(); void ScreenSizeChanged(); void GameSizeChanged(); -void UpdateGUIZoom(); -bool AdjustGUIZoom(); +bool AdjustGUIZoom(bool automatic); void UndrawMouseCursor(); /** Size of the buffer used for drawing strings. */ @@ -90,8 +89,10 @@ void RedrawScreenRect(int left, int top, int right, int bottom); void GfxScroll(int left, int top, int width, int height, int xo, int yo); Dimension GetSpriteSize(SpriteID sprid, Point *offset = nullptr, ZoomLevel zoom = ZOOM_LVL_GUI); +Dimension GetScaledSpriteSize(SpriteID sprid); /* widget.cpp */ void DrawSpriteViewport(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub = nullptr); void DrawSprite(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub = nullptr, ZoomLevel zoom = ZOOM_LVL_GUI); +void DrawSpriteIgnorePadding(SpriteID img, PaletteID pal, const Rect &r, bool clicked, StringAlignment align); /* widget.cpp */ std::unique_ptr DrawSpriteToRgbaBuffer(SpriteID spriteId, ZoomLevel zoom = ZOOM_LVL_GUI); int DrawString(int left, int right, int top, const char *str, TextColour colour = TC_FROMSTRING, StringAlignment align = SA_LEFT, bool underline = false, FontSize fontsize = FS_NORMAL); @@ -108,9 +109,46 @@ void GfxFillPolygon(const std::vector &shape, int colour, FillRectMode mo 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); +/* Versions of DrawString/DrawStringMultiLine that accept a Rect instead of separate left, right, top and bottom parameters. */ +static inline int DrawString(const Rect &r, const char *str, TextColour colour = TC_FROMSTRING, StringAlignment align = SA_LEFT, bool underline = false, FontSize fontsize = FS_NORMAL) +{ + return DrawString(r.left, r.right, r.top, str, colour, align, underline, fontsize); +} + +static inline int DrawString(const Rect &r, const std::string &str, TextColour colour = TC_FROMSTRING, StringAlignment align = SA_LEFT, bool underline = false, FontSize fontsize = FS_NORMAL) +{ + return DrawString(r.left, r.right, r.top, str, colour, align, underline, fontsize); +} + +static inline int DrawString(const Rect &r, StringID str, TextColour colour = TC_FROMSTRING, StringAlignment align = SA_LEFT, bool underline = false, FontSize fontsize = FS_NORMAL) +{ + return DrawString(r.left, r.right, r.top, str, colour, align, underline, fontsize); +} + +static inline int DrawStringMultiLine(const Rect &r, const char *str, TextColour colour = TC_FROMSTRING, StringAlignment align = (SA_TOP | SA_LEFT), bool underline = false, FontSize fontsize = FS_NORMAL) +{ + return DrawStringMultiLine(r.left, r.right, r.top, r.bottom, str, colour, align, underline, fontsize); +} + +static inline int DrawStringMultiLine(const Rect &r, const std::string &str, TextColour colour = TC_FROMSTRING, StringAlignment align = (SA_TOP | SA_LEFT), bool underline = false, FontSize fontsize = FS_NORMAL) +{ + return DrawStringMultiLine(r.left, r.right, r.top, r.bottom, str, colour, align, underline, fontsize); +} + +static inline int DrawStringMultiLine(const Rect &r, StringID str, TextColour colour = TC_FROMSTRING, StringAlignment align = (SA_TOP | SA_LEFT), bool underline = false, FontSize fontsize = FS_NORMAL) +{ + return DrawStringMultiLine(r.left, r.right, r.top, r.bottom, str, colour, align, underline, fontsize); +} + +static inline void GfxFillRect(const Rect &r, int colour, FillRectMode mode = FILLRECT_OPAQUE) +{ + GfxFillRect(r.left, r.top, r.right, r.bottom, colour, mode); +} + Dimension GetStringBoundingBox(const char *str, FontSize start_fontsize = FS_NORMAL); Dimension GetStringBoundingBox(const std::string &str, FontSize start_fontsize = FS_NORMAL); -Dimension GetStringBoundingBox(StringID strid); +Dimension GetStringBoundingBox(StringID strid, FontSize start_fontsize = FS_NORMAL); +uint GetStringListWidth(const StringID *list, FontSize fontsize = FS_NORMAL); int GetStringHeight(const char *str, int maxw, FontSize fontsize = FS_NORMAL); int GetStringHeight(StringID str, int maxw); int GetStringLineCount(StringID str, int maxw); @@ -139,7 +177,7 @@ bool FillDrawPixelInfo(DrawPixelInfo *n, int left, int top, int width, int heigh */ static inline int CenterBounds(int min, int max, int size) { - return min + (max - min - size + 1) / 2; + return (min + max - size + 1) / 2; } /* window.cpp */ diff --git a/src/gfx_layout.cpp b/src/gfx_layout.cpp index 38f6d62e59..40f9adeb94 100644 --- a/src/gfx_layout.cpp +++ b/src/gfx_layout.cpp @@ -11,6 +11,7 @@ #include "gfx_layout.h" #include "string_func.h" #include "strings_func.h" +#include "zoom_func.h" #include "debug.h" #include "table/control_codes.h" @@ -333,18 +334,25 @@ public: FallbackParagraphLayout::FallbackVisualRun::FallbackVisualRun(Font *font, const WChar *chars, int char_count, int x) : font(font), glyph_count(char_count) { + const bool isbuiltin = font->fc->IsBuiltInFont(); + this->glyphs = MallocT(this->glyph_count); this->glyph_to_char = MallocT(this->glyph_count); /* Positions contains the location of the begin of each of the glyphs, and the end of the last one. */ this->positions = MallocT(this->glyph_count * 2 + 2); this->positions[0] = x; - this->positions[1] = 0; for (int i = 0; i < this->glyph_count; i++) { this->glyphs[i] = font->fc->MapCharToGlyph(chars[i]); + if (isbuiltin) { + this->positions[2 * i + 1] = font->fc->GetAscender(); // Apply sprite font's ascender. + } else if (chars[i] >= SCC_SPRITE_START && chars[i] <= SCC_SPRITE_END) { + this->positions[2 * i + 1] = (font->fc->GetHeight() - ScaleSpriteTrad(FontCache::GetDefaultFontHeight(font->fc->GetSize()))) / 2; // Align sprite font to centre + } else { + this->positions[2 * i + 1] = 0; // No ascender adjustment. + } this->positions[2 * i + 2] = this->positions[2 * i] + font->fc->GetGlyphWidth(this->glyphs[i]); - this->positions[2 * i + 3] = 0; this->glyph_to_char[i] = i; } } diff --git a/src/gfx_type.h b/src/gfx_type.h index 932a6cb87d..8a3fc64dfd 100644 --- a/src/gfx_type.h +++ b/src/gfx_type.h @@ -214,6 +214,13 @@ enum FontSize { }; DECLARE_POSTFIX_INCREMENT(FontSize) +static inline const char *FontSizeToName(FontSize fs) +{ + static const char *SIZE_TO_NAME[] = { "medium", "small", "large", "mono" }; + assert(fs < FS_END); + return SIZE_TO_NAME[fs]; +} + /** * Used to only draw a part of the sprite. * Draw the subsprite in the rect (sprite_x_offset + left, sprite_y_offset + top) to (sprite_x_offset + right, sprite_y_offset + bottom). diff --git a/src/goal_gui.cpp b/src/goal_gui.cpp index 639901ee5b..1d81131321 100644 --- a/src/goal_gui.cpp +++ b/src/goal_gui.cpp @@ -76,7 +76,7 @@ struct GoalListWindow : public Window { break; case WID_GOAL_LIST: { - int y = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_GOAL_LIST, WD_FRAMERECT_TOP); + int y = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_GOAL_LIST, WidgetDimensions::scaled.framerect.top); for (const Goal *s : Goal::Iterate()) { if (s->company == this->window_number) { if (y == 0) { @@ -174,11 +174,12 @@ struct GoalListWindow : public Window { if (widget != WID_GOAL_LIST) return; Dimension d = GetStringBoundingBox(STR_GOALS_NONE); + resize->width = 1; resize->height = d.height; d.height *= 5; - d.width += padding.width + WD_FRAMERECT_RIGHT + WD_FRAMERECT_LEFT; - d.height += padding.height + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; + d.width += WidgetDimensions::scaled.framerect.Horizontal(); + d.height += WidgetDimensions::scaled.framerect.Vertical(); *size = maxdim(*size, d); } @@ -192,9 +193,7 @@ struct GoalListWindow : public Window { void DrawListColumn(GoalColumn column, NWidgetBase *wid, uint progress_col_width) const { /* Get column draw area. */ - int y = wid->pos_y + WD_FRAMERECT_TOP; - int x = wid->pos_x + WD_FRAMERECT_LEFT; - int right = x + wid->current_x - WD_FRAMERECT_RIGHT; + Rect r = wid->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect); bool rtl = _current_text_dir == TD_RTL; int pos = -this->vscroll->GetPosition(); @@ -208,8 +207,8 @@ struct GoalListWindow : public Window { case GC_GOAL: { /* Display the goal. */ SetDParamStr(0, s->text); - uint width_reduction = progress_col_width > 0 ? progress_col_width + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT : 0; - DrawString(x + (rtl ? width_reduction : 0), right - (rtl ? 0 : width_reduction), y + pos * FONT_HEIGHT_NORMAL, STR_GOALS_TEXT); + uint width_reduction = progress_col_width > 0 ? progress_col_width + WidgetDimensions::scaled.framerect.Horizontal() : 0; + DrawString(r.Indent(width_reduction, !rtl), STR_GOALS_TEXT); break; } @@ -217,12 +216,11 @@ struct GoalListWindow : public Window { if (s->progress != nullptr) { SetDParamStr(0, s->progress); StringID str = s->completed ? STR_GOALS_PROGRESS_COMPLETE : STR_GOALS_PROGRESS; - int progress_x = x; - int progress_right = rtl ? x + progress_col_width : right; - DrawString(progress_x, progress_right, y + pos * FONT_HEIGHT_NORMAL, str, TC_FROMSTRING, SA_RIGHT | SA_FORCE); + DrawString(r.WithWidth(progress_col_width, !rtl), str, TC_FROMSTRING, SA_RIGHT | SA_FORCE); } break; } + r.top += FONT_HEIGHT_NORMAL; } pos++; num++; @@ -231,9 +229,8 @@ struct GoalListWindow : public Window { if (num == 0) { if (column == GC_GOAL && IsInsideMM(pos, 0, cap)) { - DrawString(x, right, y + pos * FONT_HEIGHT_NORMAL, STR_GOALS_NONE); + DrawString(r, STR_GOALS_NONE); } - pos++; } } @@ -265,7 +262,7 @@ struct GoalListWindow : public Window { void OnResize() override { - this->vscroll->SetCapacityFromWidget(this, WID_GOAL_LIST); + this->vscroll->SetCapacityFromWidget(this, WID_GOAL_LIST, WidgetDimensions::scaled.framerect.Vertical()); } /** @@ -289,16 +286,15 @@ static const NWidgetPart _nested_goals_list_widgets[] = { NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN, WID_GOAL_CAPTION), SetDataTip(STR_JUST_STRING, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_GOAL_SELECT_BUTTONS), - NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_GOAL_GLOBAL_BUTTON), SetMinimalSize(50, 0), SetMinimalTextLines(1, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM + 2), SetDataTip(STR_GOALS_GLOBAL_BUTTON, STR_GOALS_GLOBAL_BUTTON_HELPTEXT), - NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_GOAL_COMPANY_BUTTON), SetMinimalSize(50, 0), SetMinimalTextLines(1, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM + 2), SetDataTip(STR_GOALS_COMPANY_BUTTON, STR_GOALS_COMPANY_BUTTON_HELPTEXT), + NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_GOAL_GLOBAL_BUTTON), SetMinimalSize(50, 0), SetMinimalTextLines(1, WidgetDimensions::unscaled.captiontext.Vertical()), SetDataTip(STR_GOALS_GLOBAL_BUTTON, STR_GOALS_GLOBAL_BUTTON_HELPTEXT), + NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_GOAL_COMPANY_BUTTON), SetMinimalSize(50, 0), SetMinimalTextLines(1, WidgetDimensions::unscaled.captiontext.Vertical()), SetDataTip(STR_GOALS_COMPANY_BUTTON, STR_GOALS_COMPANY_BUTTON_HELPTEXT), EndContainer(), NWidget(WWT_SHADEBOX, COLOUR_BROWN), NWidget(WWT_DEFSIZEBOX, COLOUR_BROWN), NWidget(WWT_STICKYBOX, COLOUR_BROWN), EndContainer(), NWidget(NWID_HORIZONTAL), - NWidget(WWT_PANEL, COLOUR_BROWN), SetDataTip(0x0, STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER), SetScrollbar(WID_GOAL_SCROLLBAR), - NWidget(WWT_EMPTY, COLOUR_GREY, WID_GOAL_LIST), SetResize(1, 1), SetMinimalTextLines(2, 0), SetFill(1, 1), SetPadding(WD_FRAMERECT_TOP, 2, WD_FRAMETEXT_BOTTOM, 2), + NWidget(WWT_PANEL, COLOUR_BROWN, WID_GOAL_LIST), SetDataTip(0x0, STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER), SetScrollbar(WID_GOAL_SCROLLBAR), SetResize(1, 1), SetMinimalTextLines(2, 0), EndContainer(), NWidget(NWID_VERTICAL), NWidget(NWID_VSCROLLBAR, COLOUR_BROWN, WID_GOAL_SCROLLBAR), @@ -404,7 +400,7 @@ struct GoalQuestionWindow : public Window { if (widget != WID_GQ_QUESTION) return; SetDParamStr(0, this->question); - size->height = GetStringHeight(STR_JUST_RAW_STRING, size->width) + WD_PAR_VSEP_WIDE; + size->height = GetStringHeight(STR_JUST_RAW_STRING, size->width) + WidgetDimensions::scaled.vsep_wide; } void DrawWidget(const Rect &r, int widget) const override @@ -412,7 +408,7 @@ struct GoalQuestionWindow : public Window { if (widget != WID_GQ_QUESTION) return; SetDParamStr(0, this->question); - DrawStringMultiLine(r.left, r.right, r.top, UINT16_MAX, STR_JUST_RAW_STRING, this->colour, SA_TOP | SA_HOR_CENTER); + DrawStringMultiLine(r, STR_JUST_RAW_STRING, this->colour, SA_TOP | SA_HOR_CENTER); } }; diff --git a/src/graph_gui.cpp b/src/graph_gui.cpp index e5e09aa66b..792aee681a 100644 --- a/src/graph_gui.cpp +++ b/src/graph_gui.cpp @@ -18,7 +18,6 @@ #include "window_func.h" #include "date_func.h" #include "gfx_func.h" -#include "sortlist_type.h" #include "core/geometry_func.hpp" #include "currency.h" #include "zoom_func.h" @@ -65,12 +64,14 @@ struct GraphLegendWindow : Window { bool rtl = _current_text_dir == TD_RTL; + const Rect ir = r.Shrink(WidgetDimensions::scaled.framerect); Dimension d = GetSpriteSize(SPR_COMPANY_ICON); - DrawCompanyIcon(cid, rtl ? r.right - d.width - ScaleGUITrad(2) : r.left + ScaleGUITrad(2), CenterBounds(r.top, r.bottom, d.height)); + DrawCompanyIcon(cid, rtl ? ir.right - d.width : ir.left, CenterBounds(ir.top, ir.bottom, d.height)); + const Rect tr = ir.Indent(d.width + WidgetDimensions::scaled.hsep_normal, rtl); SetDParam(0, cid); SetDParam(1, cid); - DrawString(r.left + (rtl ? (uint)WD_FRAMERECT_LEFT : (d.width + ScaleGUITrad(4))), r.right - (rtl ? (d.width + ScaleGUITrad(4)) : (uint)WD_FRAMERECT_RIGHT), CenterBounds(r.top, r.bottom, FONT_HEIGHT_NORMAL), STR_COMPANY_NAME_COMPANY_NUM, HasBit(_legend_excluded_companies, cid) ? TC_BLACK : TC_WHITE); + DrawString(tr.left, tr.right, CenterBounds(tr.top, tr.bottom, FONT_HEIGHT_NORMAL), STR_COMPANY_NAME_COMPANY_NUM, HasBit(_legend_excluded_companies, cid) ? TC_BLACK : TC_WHITE); } void OnClick(Point pt, int widget, int click_count) override @@ -116,8 +117,8 @@ static NWidgetBase *MakeNWidgetCompanyLines(int *biggest_index) for (int widnum = WID_GL_FIRST_COMPANY; widnum <= WID_GL_LAST_COMPANY; widnum++) { NWidgetBackground *panel = new NWidgetBackground(WWT_PANEL, COLOUR_BROWN, widnum); - panel->SetMinimalSize(246, sprite_height + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM); - panel->SetMinimalTextLines(1, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM, FS_NORMAL); + panel->SetMinimalSize(246, sprite_height + WidgetDimensions::unscaled.framerect.Vertical()); + panel->SetMinimalTextLines(1, WidgetDimensions::unscaled.framerect.Vertical(), FS_NORMAL); panel->SetFill(1, 1); panel->SetDataTip(0x0, STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP); vert->Add(panel); @@ -297,15 +298,15 @@ protected: /* Rect r will be adjusted to contain just the graph, with labels being * placed outside the area. */ - r.top += 5 + GetCharacterHeight(FS_SMALL) / 2; - r.bottom -= (this->month == 0xFF ? 1 : 2) * GetCharacterHeight(FS_SMALL) + 4; - r.left += 9; - r.right -= 5; + r.top += ScaleGUITrad(5) + GetCharacterHeight(FS_SMALL) / 2; + r.bottom -= (this->month == 0xFF ? 1 : 2) * GetCharacterHeight(FS_SMALL) + ScaleGUITrad(4); + r.left += ScaleGUITrad(9); + r.right -= ScaleGUITrad(5); /* Initial number of horizontal lines. */ - int num_hori_lines = 160 / MIN_GRID_PIXEL_SIZE; + int num_hori_lines = 160 / ScaleGUITrad(MIN_GRID_PIXEL_SIZE); /* For the rest of the height, the number of horizontal lines will increase more slowly. */ - int resize = (r.bottom - r.top - 160) / (2 * MIN_GRID_PIXEL_SIZE); + int resize = (r.bottom - r.top - 160) / (2 * ScaleGUITrad(MIN_GRID_PIXEL_SIZE)); if (resize > 0) num_hori_lines += resize; interval = GetValuesInterval(num_hori_lines); @@ -343,7 +344,7 @@ protected: y = r.bottom; for (int i = 0; i < (num_hori_lines + 1); i++) { - GfxFillRect(r.left - 3, y, r.left - 1, y, GRAPH_AXIS_LINE_COLOUR); + GfxFillRect(r.left - ScaleGUITrad(3), y, r.left - 1, y, GRAPH_AXIS_LINE_COLOUR); GfxFillRect(r.left, y, r.right, y, GRAPH_GRID_COLOUR); y -= y_sep; } @@ -370,7 +371,7 @@ protected: for (int i = 0; i < (num_hori_lines + 1); i++) { SetDParam(0, this->format_str_y_axis); SetDParam(1, y_label); - DrawString(r.left - label_width - 4, r.left - 4, y, STR_GRAPH_Y_LABEL, GRAPH_AXIS_LABEL_COLOUR, SA_RIGHT); + DrawString(r.left - label_width - ScaleGUITrad(4), r.left - ScaleGUITrad(4), y, STR_GRAPH_Y_LABEL, GRAPH_AXIS_LABEL_COLOUR, SA_RIGHT); y_label -= y_label_separation; y += y_sep; @@ -379,7 +380,7 @@ protected: /* Draw x-axis labels and markings for graphs based on financial quarters and years. */ if (this->month != 0xFF) { x = r.left; - y = r.bottom + 2; + y = r.bottom + ScaleGUITrad(2); byte month = this->month; Year year = this->year; for (int i = 0; i < this->num_on_x_axis; i++) { @@ -400,7 +401,7 @@ protected: } else { /* Draw x-axis labels for graphs not based on quarterly performance (cargo payment rates). */ x = r.left; - y = r.bottom + 2; + y = r.bottom + ScaleGUITrad(2); uint16 label = this->x_values_start; for (int i = 0; i < this->num_on_x_axis; i++) { @@ -520,8 +521,8 @@ public: SetDParam(1, INT64_MAX); uint y_label_width = GetStringBoundingBox(STR_GRAPH_Y_LABEL).width; - size->width = std::max(size->width, 5 + y_label_width + this->num_on_x_axis * (x_label_width + 5) + 9); - size->height = std::max(size->height, 5 + (1 + MIN_GRAPH_NUM_LINES_Y * 2 + (this->month != 0xFF ? 3 : 1)) * FONT_HEIGHT_SMALL + 4); + size->width = std::max(size->width, ScaleGUITrad(5) + y_label_width + this->num_on_x_axis * (x_label_width + ScaleGUITrad(5)) + ScaleGUITrad(9)); + size->height = std::max(size->height, ScaleGUITrad(5) + (1 + MIN_GRAPH_NUM_LINES_Y * 2 + (this->month != 0xFF ? 3 : 1)) * FONT_HEIGHT_SMALL + ScaleGUITrad(4)); size->height = std::max(size->height, size->width / 3); } @@ -634,7 +635,7 @@ static const NWidgetPart _nested_operating_profit_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN), SetDataTip(STR_GRAPH_OPERATING_PROFIT_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), - NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_CV_KEY_BUTTON), SetMinimalSize(50, 0), SetMinimalTextLines(1, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM + 2), SetDataTip(STR_GRAPH_KEY_BUTTON, STR_GRAPH_KEY_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_CV_KEY_BUTTON), SetMinimalSize(50, 0), SetMinimalTextLines(1, WidgetDimensions::unscaled.framerect.Vertical() + 2), SetDataTip(STR_GRAPH_KEY_BUTTON, STR_GRAPH_KEY_TOOLTIP), NWidget(WWT_SHADEBOX, COLOUR_BROWN), NWidget(WWT_DEFSIZEBOX, COLOUR_BROWN), NWidget(WWT_STICKYBOX, COLOUR_BROWN), @@ -685,7 +686,7 @@ static const NWidgetPart _nested_income_graph_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN), SetDataTip(STR_GRAPH_INCOME_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), - NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_CV_KEY_BUTTON), SetMinimalSize(50, 0), SetMinimalTextLines(1, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM + 2), SetDataTip(STR_GRAPH_KEY_BUTTON, STR_GRAPH_KEY_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_CV_KEY_BUTTON), SetMinimalSize(50, 0), SetMinimalTextLines(1, WidgetDimensions::unscaled.framerect.Vertical() + 2), SetDataTip(STR_GRAPH_KEY_BUTTON, STR_GRAPH_KEY_TOOLTIP), NWidget(WWT_SHADEBOX, COLOUR_BROWN), NWidget(WWT_DEFSIZEBOX, COLOUR_BROWN), NWidget(WWT_STICKYBOX, COLOUR_BROWN), @@ -734,7 +735,7 @@ static const NWidgetPart _nested_delivered_cargo_graph_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN), SetDataTip(STR_GRAPH_CARGO_DELIVERED_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), - NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_CV_KEY_BUTTON), SetMinimalSize(50, 0), SetMinimalTextLines(1, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM + 2), SetDataTip(STR_GRAPH_KEY_BUTTON, STR_GRAPH_KEY_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_CV_KEY_BUTTON), SetMinimalSize(50, 0), SetMinimalTextLines(1, WidgetDimensions::unscaled.framerect.Vertical() + 2), SetDataTip(STR_GRAPH_KEY_BUTTON, STR_GRAPH_KEY_TOOLTIP), NWidget(WWT_SHADEBOX, COLOUR_BROWN), NWidget(WWT_DEFSIZEBOX, COLOUR_BROWN), NWidget(WWT_STICKYBOX, COLOUR_BROWN), @@ -789,8 +790,8 @@ static const NWidgetPart _nested_performance_history_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN), SetDataTip(STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), - NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_PHG_DETAILED_PERFORMANCE), SetMinimalSize(50, 0), SetMinimalTextLines(1, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM + 2), SetDataTip(STR_PERFORMANCE_DETAIL_KEY, STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_PHG_KEY), SetMinimalSize(50, 0), SetMinimalTextLines(1, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM + 2), SetDataTip(STR_GRAPH_KEY_BUTTON, STR_GRAPH_KEY_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_PHG_DETAILED_PERFORMANCE), SetMinimalSize(50, 0), SetMinimalTextLines(1, WidgetDimensions::unscaled.framerect.Vertical() + 2), SetDataTip(STR_PERFORMANCE_DETAIL_KEY, STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_PHG_KEY), SetMinimalSize(50, 0), SetMinimalTextLines(1, WidgetDimensions::unscaled.framerect.Vertical() + 2), SetDataTip(STR_GRAPH_KEY_BUTTON, STR_GRAPH_KEY_TOOLTIP), NWidget(WWT_SHADEBOX, COLOUR_BROWN), NWidget(WWT_DEFSIZEBOX, COLOUR_BROWN), NWidget(WWT_STICKYBOX, COLOUR_BROWN), @@ -839,7 +840,7 @@ static const NWidgetPart _nested_company_value_graph_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN), SetDataTip(STR_GRAPH_COMPANY_VALUES_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), - NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_CV_KEY_BUTTON), SetMinimalSize(50, 0), SetMinimalTextLines(1, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM + 2), SetDataTip(STR_GRAPH_KEY_BUTTON, STR_GRAPH_KEY_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_CV_KEY_BUTTON), SetMinimalSize(50, 0), SetMinimalTextLines(1, WidgetDimensions::unscaled.framerect.Vertical() + 2), SetDataTip(STR_GRAPH_KEY_BUTTON, STR_GRAPH_KEY_TOOLTIP), NWidget(WWT_SHADEBOX, COLOUR_BROWN), NWidget(WWT_DEFSIZEBOX, COLOUR_BROWN), NWidget(WWT_STICKYBOX, COLOUR_BROWN), @@ -898,7 +899,7 @@ struct PaymentRatesGraphWindow : BaseGraphWindow { void OnInit() override { /* Width of the legend blob. */ - this->legend_width = (FONT_HEIGHT_SMALL - ScaleFontTrad(1)) * 8 / 5; + this->legend_width = (FONT_HEIGHT_SMALL - ScaleGUITrad(1)) * 8 / 5; } void UpdateExcludedData() @@ -922,9 +923,9 @@ struct PaymentRatesGraphWindow : BaseGraphWindow { for (const CargoSpec *cs : _sorted_standard_cargo_specs) { SetDParam(0, cs->name); Dimension d = GetStringBoundingBox(STR_GRAPH_CARGO_PAYMENT_CARGO); - d.width += this->legend_width + 4; // colour field - d.width += WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; - d.height += WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; + d.width += this->legend_width + WidgetDimensions::scaled.hsep_normal; // colour field + d.width += WidgetDimensions::scaled.framerect.Horizontal(); + d.height += WidgetDimensions::scaled.framerect.Vertical(); *size = maxdim(d, *size); } @@ -943,32 +944,31 @@ struct PaymentRatesGraphWindow : BaseGraphWindow { bool rtl = _current_text_dir == TD_RTL; - int x = r.left + WD_FRAMERECT_LEFT; - int y = r.top; - uint row_height = FONT_HEIGHT_SMALL; - int padding = ScaleFontTrad(1); - int pos = this->vscroll->GetPosition(); int max = pos + this->vscroll->GetCapacity(); + Rect line = r.WithHeight(this->line_height); for (const CargoSpec *cs : _sorted_standard_cargo_specs) { if (pos-- > 0) continue; if (--max < 0) break; bool lowered = !HasBit(_legend_excluded_cargo, cs->Index()); - /* Redraw box if lowered */ - if (lowered) DrawFrameRect(r.left, y, r.right, y + this->line_height - 1, COLOUR_BROWN, FR_LOWERED); + /* Redraw frame if lowered */ + if (lowered) DrawFrameRect(line, COLOUR_BROWN, FR_LOWERED); - byte clk_dif = lowered ? 1 : 0; - int rect_x = clk_dif + (rtl ? r.right - this->legend_width - WD_FRAMERECT_RIGHT : r.left + WD_FRAMERECT_LEFT); + const Rect text = line.Shrink(WidgetDimensions::scaled.framerect).Translate(lowered ? WidgetDimensions::scaled.pressed : 0, lowered ? WidgetDimensions::scaled.pressed : 0); - GfxFillRect(rect_x, y + padding + clk_dif, rect_x + this->legend_width, y + row_height - 1 + clk_dif, PC_BLACK); - GfxFillRect(rect_x + 1, y + padding + 1 + clk_dif, rect_x + this->legend_width - 1, y + row_height - 2 + clk_dif, cs->legend_colour); + /* Cargo-colour box with outline */ + const Rect cargo = text.WithWidth(this->legend_width, rtl); + GfxFillRect(cargo, PC_BLACK); + GfxFillRect(cargo.Shrink(WidgetDimensions::scaled.bevel), cs->legend_colour); + + /* Cargo name */ SetDParam(0, cs->name); - DrawString(rtl ? r.left : x + this->legend_width + 4 + clk_dif, (rtl ? r.right - this->legend_width - 4 + clk_dif : r.right), y + clk_dif, STR_GRAPH_CARGO_PAYMENT_CARGO); + DrawString(text.Indent(this->legend_width + WidgetDimensions::scaled.hsep_normal, rtl), STR_GRAPH_CARGO_PAYMENT_CARGO); - y += this->line_height; + line = line.Translate(0, this->line_height); } } @@ -1078,7 +1078,7 @@ static const NWidgetPart _nested_cargo_payment_rates_widgets[] = { NWidget(NWID_SPACER), SetMinimalSize(5, 0), SetFill(0, 1), SetResize(0, 1), EndContainer(), NWidget(NWID_HORIZONTAL), - NWidget(NWID_SPACER), SetMinimalSize(WD_RESIZEBOX_WIDTH, 0), SetFill(1, 0), SetResize(1, 0), + NWidget(NWID_SPACER), SetMinimalSize(12, 0), SetFill(1, 0), SetResize(1, 0), NWidget(WWT_TEXT, COLOUR_BROWN, WID_CPR_FOOTER), SetMinimalSize(0, 6), SetPadding(2, 0, 2, 0), SetDataTip(STR_GRAPH_CARGO_PAYMENT_RATES_X_LABEL, STR_NULL), NWidget(NWID_SPACER), SetFill(1, 0), SetResize(1, 0), NWidget(WWT_RESIZEBOX, COLOUR_BROWN, WID_CPR_RESIZE), @@ -1099,192 +1099,6 @@ void ShowCargoPaymentRates() AllocateWindowDescFront(&_cargo_payment_rates_desc, 0); } -/************************/ -/* COMPANY LEAGUE TABLE */ -/************************/ - -static const StringID _performance_titles[] = { - STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER, - STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER, - STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRAFFIC_MANAGER, - STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRAFFIC_MANAGER, - STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRANSPORT_COORDINATOR, - STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRANSPORT_COORDINATOR, - STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ROUTE_SUPERVISOR, - STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ROUTE_SUPERVISOR, - STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_DIRECTOR, - STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_DIRECTOR, - STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHIEF_EXECUTIVE, - STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHIEF_EXECUTIVE, - STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHAIRMAN, - STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHAIRMAN, - STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_PRESIDENT, - STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TYCOON, -}; - -static inline StringID GetPerformanceTitleFromValue(uint value) -{ - return _performance_titles[std::min(value, 1000u) >> 6]; -} - -class CompanyLeagueWindow : public Window { -private: - GUIList companies; - uint ordinal_width; ///< The width of the ordinal number - uint text_width; ///< The width of the actual text - uint icon_width; ///< The width of the company icon - int line_height; ///< Height of the text lines - - /** - * (Re)Build the company league list - */ - void BuildCompanyList() - { - if (!this->companies.NeedRebuild()) return; - - this->companies.clear(); - - for (const Company *c : Company::Iterate()) { - this->companies.push_back(c); - } - - this->companies.shrink_to_fit(); - this->companies.RebuildDone(); - } - - /** Sort the company league by performance history */ - static bool PerformanceSorter(const Company * const &c1, const Company * const &c2) - { - return c2->old_economy[0].performance_history < c1->old_economy[0].performance_history; - } - -public: - CompanyLeagueWindow(WindowDesc *desc, WindowNumber window_number) : Window(desc) - { - this->InitNested(window_number); - this->companies.ForceRebuild(); - this->companies.NeedResort(); - } - - void OnPaint() override - { - this->BuildCompanyList(); - this->companies.Sort(&PerformanceSorter); - - this->DrawWidgets(); - } - - void DrawWidget(const Rect &r, int widget) const override - { - if (widget != WID_CL_BACKGROUND) return; - - int icon_y_offset = 1 + (FONT_HEIGHT_NORMAL - this->line_height) / 2; - uint y = r.top + WD_FRAMERECT_TOP - icon_y_offset; - - bool rtl = _current_text_dir == TD_RTL; - uint ordinal_left = rtl ? r.right - WD_FRAMERECT_LEFT - this->ordinal_width : r.left + WD_FRAMERECT_LEFT; - uint ordinal_right = rtl ? r.right - WD_FRAMERECT_LEFT : r.left + WD_FRAMERECT_LEFT + this->ordinal_width; - uint icon_left = r.left + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT + (rtl ? this->text_width : this->ordinal_width); - uint text_left = rtl ? r.left + WD_FRAMERECT_LEFT : r.right - WD_FRAMERECT_LEFT - this->text_width; - uint text_right = rtl ? r.left + WD_FRAMERECT_LEFT + this->text_width : r.right - WD_FRAMERECT_LEFT; - - for (uint i = 0; i != this->companies.size(); i++) { - const Company *c = this->companies[i]; - DrawString(ordinal_left, ordinal_right, y, i + STR_ORDINAL_NUMBER_1ST, i == 0 ? TC_WHITE : TC_YELLOW); - - DrawCompanyIcon(c->index, icon_left, y + icon_y_offset); - - SetDParam(0, c->index); - SetDParam(1, c->index); - SetDParam(2, GetPerformanceTitleFromValue(c->old_economy[0].performance_history)); - DrawString(text_left, text_right, y, STR_COMPANY_LEAGUE_COMPANY_NAME); - y += this->line_height; - } - } - - void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override - { - if (widget != WID_CL_BACKGROUND) return; - - this->ordinal_width = 0; - for (uint i = 0; i < MAX_COMPANIES; i++) { - this->ordinal_width = std::max(this->ordinal_width, GetStringBoundingBox(STR_ORDINAL_NUMBER_1ST + i).width); - } - this->ordinal_width += 5; // Keep some extra spacing - - uint widest_width = 0; - uint widest_title = 0; - for (uint i = 0; i < lengthof(_performance_titles); i++) { - uint width = GetStringBoundingBox(_performance_titles[i]).width; - if (width > widest_width) { - widest_title = i; - widest_width = width; - } - } - - Dimension d = GetSpriteSize(SPR_COMPANY_ICON); - this->icon_width = d.width + 2; - this->line_height = std::max(d.height + 2, FONT_HEIGHT_NORMAL); - - for (const Company *c : Company::Iterate()) { - SetDParam(0, c->index); - SetDParam(1, c->index); - SetDParam(2, _performance_titles[widest_title]); - widest_width = std::max(widest_width, GetStringBoundingBox(STR_COMPANY_LEAGUE_COMPANY_NAME).width); - } - - this->text_width = widest_width + 30; // Keep some extra spacing - - size->width = WD_FRAMERECT_LEFT + this->ordinal_width + WD_FRAMERECT_RIGHT + this->icon_width + WD_FRAMERECT_LEFT + this->text_width + WD_FRAMERECT_RIGHT; - size->height = WD_FRAMERECT_TOP + this->line_height * MAX_COMPANIES + WD_FRAMERECT_BOTTOM; - } - - - void OnGameTick() override - { - if (this->companies.NeedResort()) { - this->SetDirty(); - } - } - - /** - * Some data on this window has become invalid. - * @param data Information about the changed data. - * @param gui_scope Whether the call is done from GUI scope. You may not do everything when not in GUI scope. See #InvalidateWindowData() for details. - */ - 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->companies.ForceRebuild(); - } else { - this->companies.ForceResort(); - } - } -}; - -static const NWidgetPart _nested_company_league_widgets[] = { - NWidget(NWID_HORIZONTAL), - NWidget(WWT_CLOSEBOX, COLOUR_BROWN), - NWidget(WWT_CAPTION, COLOUR_BROWN), SetDataTip(STR_COMPANY_LEAGUE_TABLE_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), - NWidget(WWT_SHADEBOX, COLOUR_BROWN), - NWidget(WWT_STICKYBOX, COLOUR_BROWN), - EndContainer(), - NWidget(WWT_PANEL, COLOUR_BROWN, WID_CL_BACKGROUND), SetMinimalSize(400, 0), SetMinimalTextLines(15, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM), -}; - -static WindowDesc _company_league_desc( - WDP_AUTO, "league", 0, 0, - WC_COMPANY_LEAGUE, WC_NONE, - 0, - _nested_company_league_widgets, lengthof(_nested_company_league_widgets) -); - -void ShowCompanyLeagueTable() -{ - AllocateWindowDescFront(&_company_league_desc, 0); -} - /*****************************/ /* PERFORMANCE RATING DETAIL */ /*****************************/ @@ -1325,18 +1139,18 @@ struct PerformanceRatingDetailWindow : Window { { switch (widget) { case WID_PRD_SCORE_FIRST: - this->bar_height = FONT_HEIGHT_NORMAL + 4; - size->height = this->bar_height + 2 * WD_MATRIX_TOP; + this->bar_height = FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.fullbevel.Vertical(); + size->height = this->bar_height + WidgetDimensions::scaled.matrix.Vertical(); uint score_info_width = 0; for (uint i = SCORE_BEGIN; i < SCORE_END; i++) { score_info_width = std::max(score_info_width, GetStringBoundingBox(STR_PERFORMANCE_DETAIL_VEHICLES + i).width); } SetDParamMaxValue(0, 1000); - score_info_width += GetStringBoundingBox(STR_BLACK_COMMA).width + WD_FRAMERECT_LEFT; + score_info_width += GetStringBoundingBox(STR_BLACK_COMMA).width + WidgetDimensions::scaled.hsep_wide; SetDParamMaxValue(0, 100); - this->bar_width = GetStringBoundingBox(STR_PERFORMANCE_DETAIL_PERCENT).width + 20; // Wide bars! + this->bar_width = GetStringBoundingBox(STR_PERFORMANCE_DETAIL_PERCENT).width + WidgetDimensions::scaled.hsep_indent * 2; // Wide bars! /* At this number we are roughly at the max; it can become wider, * but then you need at 1000 times more money. At that time you're @@ -1362,9 +1176,9 @@ struct PerformanceRatingDetailWindow : Window { SetDParam(1, max); uint score_detail_width = GetStringBoundingBox(STR_PERFORMANCE_DETAIL_AMOUNT_CURRENCY).width; - size->width = 7 + score_info_width + 5 + this->bar_width + 5 + score_detail_width + 7; - uint left = 7; - uint right = size->width - 7; + size->width = WidgetDimensions::scaled.frametext.Horizontal() + score_info_width + WidgetDimensions::scaled.hsep_wide + this->bar_width + WidgetDimensions::scaled.hsep_wide + score_detail_width; + uint left = WidgetDimensions::scaled.frametext.left; + uint right = size->width - WidgetDimensions::scaled.frametext.right; bool rtl = _current_text_dir == TD_RTL; this->score_info_left = rtl ? right - score_info_width : left; @@ -1373,8 +1187,8 @@ struct PerformanceRatingDetailWindow : Window { this->score_detail_left = rtl ? left : right - score_detail_width; this->score_detail_right = rtl ? left + score_detail_width : right; - this->bar_left = left + (rtl ? score_detail_width : score_info_width) + 5; - this->bar_right = this->bar_left + this->bar_width; + this->bar_left = left + (rtl ? score_detail_width : score_info_width) + WidgetDimensions::scaled.hsep_wide; + this->bar_right = this->bar_left + this->bar_width - 1; break; } } @@ -1387,9 +1201,9 @@ struct PerformanceRatingDetailWindow : Window { if (IsInsideMM(widget, WID_PRD_COMPANY_FIRST, WID_PRD_COMPANY_LAST + 1)) { if (this->IsWidgetDisabled(widget)) return; CompanyID cid = (CompanyID)(widget - WID_PRD_COMPANY_FIRST); - int offset = (cid == this->company) ? 1 : 0; + int offset = (cid == this->company) ? WidgetDimensions::scaled.pressed : 0; Dimension sprite_size = GetSpriteSize(SPR_COMPANY_ICON); - DrawCompanyIcon(cid, (r.left + r.right - sprite_size.width) / 2 + offset, (r.top + r.bottom - sprite_size.height) / 2 + offset); + DrawCompanyIcon(cid, CenterBounds(r.left, r.right, sprite_size.width) + offset, CenterBounds(r.top, r.bottom, sprite_size.height) + offset); return; } @@ -1412,8 +1226,8 @@ struct PerformanceRatingDetailWindow : Window { needed = SCORE_MAX; } - uint bar_top = r.top + WD_MATRIX_TOP; - uint text_top = bar_top + 2; + uint bar_top = CenterBounds(r.top, r.bottom, this->bar_height); + uint text_top = CenterBounds(r.top, r.bottom, FONT_HEIGHT_NORMAL); DrawString(this->score_info_left, this->score_info_right, text_top, STR_PERFORMANCE_DETAIL_VEHICLES + score_type); @@ -1431,8 +1245,8 @@ struct PerformanceRatingDetailWindow : Window { } /* Draw the bar */ - if (x != this->bar_left) GfxFillRect(this->bar_left, bar_top, x, bar_top + this->bar_height, rtl ? colour_notdone : colour_done); - if (x != this->bar_right) GfxFillRect(x, bar_top, this->bar_right, bar_top + this->bar_height, rtl ? colour_done : colour_notdone); + if (x != this->bar_left) GfxFillRect(this->bar_left, bar_top, x, bar_top + this->bar_height - 1, rtl ? colour_notdone : colour_done); + if (x != this->bar_right) GfxFillRect(x, bar_top, this->bar_right, bar_top + this->bar_height - 1, rtl ? colour_done : colour_notdone); /* Draw it */ SetDParam(0, Clamp(val, 0, needed) * 100 / needed); @@ -1563,7 +1377,7 @@ static const NWidgetPart _nested_performance_rating_detail_widgets[] = { NWidget(WWT_STICKYBOX, COLOUR_BROWN), EndContainer(), NWidget(WWT_PANEL, COLOUR_BROWN), - NWidgetFunction(MakeCompanyButtonRowsGraphGUI), SetPadding(0, 1, 1, 2), + NWidgetFunction(MakeCompanyButtonRowsGraphGUI), SetPadding(2), EndContainer(), NWidgetFunction(MakePerformanceDetailPanels), }; diff --git a/src/graph_gui.h b/src/graph_gui.h index 8338878c01..32c7776456 100644 --- a/src/graph_gui.h +++ b/src/graph_gui.h @@ -16,7 +16,6 @@ void ShowDeliveredCargoGraph(); void ShowPerformanceHistoryGraph(); void ShowCompanyValueGraph(); void ShowCargoPaymentRates(); -void ShowCompanyLeagueTable(); void ShowPerformanceRatingDetail(); #endif /* GRAPH_GUI_H */ diff --git a/src/group_gui.cpp b/src/group_gui.cpp index 197be9e2e7..6b50133880 100644 --- a/src/group_gui.cpp +++ b/src/group_gui.cpp @@ -27,6 +27,7 @@ #include "gui.h" #include "group_cmd.h" #include "vehicle_cmd.h" +#include "gfx_func.h" #include "widgets/group_widget.h" @@ -34,8 +35,6 @@ #include "safeguards.h" -static const int LEVEL_WIDTH = 10; ///< Indenting width of a sub-group in pixels - typedef GUIList GUIGroupList; static const NWidgetPart _nested_group_widgets[] = { @@ -56,7 +55,7 @@ static const NWidgetPart _nested_group_widgets[] = { SetFill(1, 0), SetResize(0, 1), SetScrollbar(WID_GL_LIST_GROUP_SCROLLBAR), NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_GL_LIST_GROUP_SCROLLBAR), EndContainer(), - NWidget(WWT_PANEL, COLOUR_GREY, WID_GL_INFO), SetFill(1, 1), SetMinimalTextLines(3, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM), EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY, WID_GL_INFO), SetFill(1, 1), SetMinimalTextLines(3, WidgetDimensions::unscaled.framerect.Vertical()), EndContainer(), NWidget(NWID_HORIZONTAL), NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_GL_CREATE_GROUP), SetDataTip(SPR_GROUP_CREATE_TRAIN, STR_GROUP_CREATE_TOOLTIP), @@ -74,14 +73,21 @@ static const NWidgetPart _nested_group_widgets[] = { /* right part */ NWidget(NWID_VERTICAL), NWidget(NWID_HORIZONTAL), - NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_GL_GROUP_BY_ORDER), SetMinimalSize(81, 12), SetDataTip(STR_STATION_VIEW_GROUP, STR_TOOLTIP_GROUP_ORDER), - NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GL_GROUP_BY_DROPDOWN), SetMinimalSize(167, 12), SetDataTip(0x0, STR_TOOLTIP_GROUP_ORDER), - NWidget(WWT_PANEL, COLOUR_GREY), SetMinimalSize(12, 12), SetResize(1, 0), EndContainer(), - EndContainer(), - NWidget(NWID_HORIZONTAL), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GL_SORT_BY_ORDER), SetMinimalSize(81, 12), SetDataTip(STR_BUTTON_SORT_BY, STR_TOOLTIP_SORT_ORDER), - NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GL_SORT_BY_DROPDOWN), SetMinimalSize(167, 12), SetDataTip(0x0, STR_TOOLTIP_SORT_CRITERIA), - NWidget(WWT_PANEL, COLOUR_GREY), SetMinimalSize(12, 12), SetResize(1, 0), EndContainer(), + NWidget(NWID_VERTICAL), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_GL_GROUP_BY_ORDER), SetFill(1, 0), SetMinimalSize(0, 12), SetDataTip(STR_STATION_VIEW_GROUP, STR_TOOLTIP_GROUP_ORDER), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GL_SORT_BY_ORDER), SetFill(1, 0), SetMinimalSize(0, 12), SetDataTip(STR_BUTTON_SORT_BY, STR_TOOLTIP_SORT_ORDER), + EndContainer(), + NWidget(NWID_VERTICAL), + NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GL_GROUP_BY_DROPDOWN), SetFill(1, 0), SetMinimalSize(0, 12), SetDataTip(0x0, STR_TOOLTIP_GROUP_ORDER), + NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GL_SORT_BY_DROPDOWN), SetFill(1, 0), SetMinimalSize(0, 12), SetDataTip(0x0, STR_TOOLTIP_SORT_CRITERIA), + EndContainer(), + NWidget(NWID_VERTICAL), + NWidget(WWT_PANEL, COLOUR_GREY), SetMinimalSize(0, 12), SetResize(1, 0), EndContainer(), + NWidget(NWID_HORIZONTAL), + NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GL_FILTER_BY_CARGO), SetMinimalSize(0, 12), SetDataTip(STR_JUST_STRING, STR_TOOLTIP_FILTER_CRITERIA), + NWidget(WWT_PANEL, COLOUR_GREY), SetMinimalSize(0, 12), SetResize(1, 0), EndContainer(), + EndContainer(), + EndContainer(), EndContainer(), NWidget(NWID_HORIZONTAL), NWidget(WWT_MATRIX, COLOUR_GREY, WID_GL_LIST_VEHICLE), SetMinimalSize(248, 0), SetMatrixDataTip(1, 0, STR_NULL), SetResize(1, 1), SetFill(1, 0), SetScrollbar(WID_GL_LIST_VEHICLE_SCROLLBAR), @@ -118,7 +124,6 @@ private: VGC_END }; - VehicleID vehicle_sel; ///< Selected vehicle GroupID group_sel; ///< Selected group (for drag/drop) GroupID group_rename; ///< Group being renamed, INVALID_GROUP if none GroupID group_over; ///< Group over which a vehicle is dragged, INVALID_GROUP if none @@ -207,7 +212,7 @@ private: this->tiny_step_height = this->column_size[VGC_FOLD].height; this->column_size[VGC_NAME] = maxdim(GetStringBoundingBox(STR_GROUP_DEFAULT_TRAINS + this->vli.vtype), GetStringBoundingBox(STR_GROUP_ALL_TRAINS + this->vli.vtype)); - this->column_size[VGC_NAME].width = std::max(170u, this->column_size[VGC_NAME].width); + this->column_size[VGC_NAME].width = std::max(170u, this->column_size[VGC_NAME].width) + WidgetDimensions::scaled.hsep_indent; this->tiny_step_height = std::max(this->tiny_step_height, this->column_size[VGC_NAME].height); this->column_size[VGC_PROTECT] = GetSpriteSize(SPR_GROUP_REPLACE_PROTECT); @@ -231,16 +236,16 @@ private: this->column_size[VGC_NUMBER] = GetStringBoundingBox(STR_GROUP_COUNT_WITH_SUBGROUP); this->tiny_step_height = std::max(this->tiny_step_height, this->column_size[VGC_NUMBER].height); - this->tiny_step_height += WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; + this->tiny_step_height += WidgetDimensions::scaled.framerect.Vertical(); - return WD_FRAMERECT_LEFT + 8 + - this->column_size[VGC_FOLD].width + 2 + - this->column_size[VGC_NAME].width + 8 + - this->column_size[VGC_PROTECT].width + 2 + - this->column_size[VGC_AUTOREPLACE].width + 2 + - this->column_size[VGC_PROFIT].width + 2 + - this->column_size[VGC_NUMBER].width + 2 + - WD_FRAMERECT_RIGHT; + return WidgetDimensions::scaled.framerect.left + + this->column_size[VGC_FOLD].width + WidgetDimensions::scaled.hsep_normal + + this->column_size[VGC_NAME].width + WidgetDimensions::scaled.hsep_wide + + this->column_size[VGC_PROTECT].width + WidgetDimensions::scaled.hsep_normal + + this->column_size[VGC_AUTOREPLACE].width + WidgetDimensions::scaled.hsep_normal + + this->column_size[VGC_PROFIT].width + WidgetDimensions::scaled.hsep_normal + + this->column_size[VGC_NUMBER].width + + WidgetDimensions::scaled.framerect.right; } /** @@ -257,7 +262,7 @@ private: { /* Highlight the group if a vehicle is dragged over it */ if (g_id == this->group_over) { - GfxFillRect(left + WD_FRAMERECT_LEFT, y + WD_FRAMERECT_TOP + 1, right - WD_FRAMERECT_RIGHT, y + this->tiny_step_height - WD_FRAMERECT_BOTTOM - 1, _colour_gradient[COLOUR_GREY][7]); + GfxFillRect(left + WidgetDimensions::scaled.bevel.left, y + WidgetDimensions::scaled.framerect.top, right - WidgetDimensions::scaled.bevel.right, y + this->tiny_step_height - 1 - WidgetDimensions::scaled.framerect.bottom, _colour_gradient[COLOUR_GREY][7]); } if (g_id == NEW_GROUP) return; @@ -268,7 +273,7 @@ private: bool rtl = _current_text_dir == TD_RTL; /* draw fold / unfold button */ - int x = rtl ? right - WD_FRAMERECT_RIGHT - 8 - this->column_size[VGC_FOLD].width + 1 : left + WD_FRAMERECT_LEFT + 8; + int x = rtl ? right - WidgetDimensions::scaled.framerect.right - this->column_size[VGC_FOLD].width + 1 : left + WidgetDimensions::scaled.framerect.left; if (has_children) { DrawSprite(Group::Get(g_id)->folded ? SPR_CIRCLE_FOLDED : SPR_CIRCLE_UNFOLDED, PAL_NONE, rtl ? x - indent : x + indent, y + (this->tiny_step_height - this->column_size[VGC_FOLD].height) / 2); } @@ -283,19 +288,19 @@ private: SetDParam(0, g_id); str = STR_GROUP_NAME; } - x = rtl ? x - 2 - this->column_size[VGC_NAME].width : x + 2 + this->column_size[VGC_FOLD].width; + x = rtl ? x - WidgetDimensions::scaled.hsep_normal - this->column_size[VGC_NAME].width : x + WidgetDimensions::scaled.hsep_normal + this->column_size[VGC_FOLD].width; DrawString(x + (rtl ? 0 : indent), x + this->column_size[VGC_NAME].width - 1 - (rtl ? indent : 0), y + (this->tiny_step_height - this->column_size[VGC_NAME].height) / 2, str, colour); /* draw autoreplace protection */ - x = rtl ? x - 8 - this->column_size[VGC_PROTECT].width : x + 8 + this->column_size[VGC_NAME].width; + x = rtl ? x - WidgetDimensions::scaled.hsep_wide - this->column_size[VGC_PROTECT].width : x + WidgetDimensions::scaled.hsep_wide + this->column_size[VGC_NAME].width; if (protection) DrawSprite(SPR_GROUP_REPLACE_PROTECT, PAL_NONE, x, y + (this->tiny_step_height - this->column_size[VGC_PROTECT].height) / 2); /* draw autoreplace status */ - x = rtl ? x - 2 - this->column_size[VGC_AUTOREPLACE].width : x + 2 + this->column_size[VGC_PROTECT].width; + x = rtl ? x - WidgetDimensions::scaled.hsep_normal - this->column_size[VGC_AUTOREPLACE].width : x + WidgetDimensions::scaled.hsep_normal + this->column_size[VGC_PROTECT].width; if (stats.autoreplace_defined) DrawSprite(SPR_GROUP_REPLACE_ACTIVE, stats.autoreplace_finished ? PALETTE_CRASH : PAL_NONE, x, y + (this->tiny_step_height - this->column_size[VGC_AUTOREPLACE].height) / 2); /* draw the profit icon */ - x = rtl ? x - 2 - this->column_size[VGC_PROFIT].width : x + 2 + this->column_size[VGC_AUTOREPLACE].width; + x = rtl ? x - WidgetDimensions::scaled.hsep_normal - this->column_size[VGC_PROFIT].width : x + WidgetDimensions::scaled.hsep_normal + this->column_size[VGC_AUTOREPLACE].width; SpriteID spr; uint num_profit_vehicle = GetGroupNumProfitVehicle(this->vli.company, g_id, this->vli.vtype); Money profit_last_year = GetGroupProfitLastYear(this->vli.company, g_id, this->vli.vtype); @@ -311,7 +316,7 @@ private: DrawSprite(spr, PAL_NONE, x, y + (this->tiny_step_height - this->column_size[VGC_PROFIT].height) / 2); /* draw the number of vehicles of the group */ - x = rtl ? x - 2 - this->column_size[VGC_NUMBER].width : x + 2 + this->column_size[VGC_PROFIT].width; + x = rtl ? x - WidgetDimensions::scaled.hsep_normal - this->column_size[VGC_NUMBER].width : x + WidgetDimensions::scaled.hsep_normal + this->column_size[VGC_PROFIT].width; int num_vehicle_with_subgroups = GetGroupNumVehicle(this->vli.company, g_id, this->vli.vtype); int num_vehicle = GroupStatistics::Get(this->vli.company, g_id, this->vli.vtype).num_vehicle; if (IsAllGroupID(g_id) || IsDefaultGroupID(g_id) || num_vehicle_with_subgroups == num_vehicle) { @@ -349,7 +354,6 @@ public: this->group_sb = this->GetScrollbar(WID_GL_LIST_GROUP_SCROLLBAR); this->vli.index = ALL_GROUP; - this->vehicle_sel = INVALID_VEHICLE; this->group_sel = INVALID_GROUP; this->group_rename = INVALID_GROUP; this->group_over = INVALID_GROUP; @@ -409,6 +413,20 @@ public: size->height = 4 * resize->height; break; + case WID_GL_GROUP_BY_DROPDOWN: + size->width = GetStringListWidth(this->vehicle_group_by_names) + padding.width; + break; + + case WID_GL_SORT_BY_DROPDOWN: + size->width = GetStringListWidth(this->vehicle_group_none_sorter_names); + size->width = std::max(size->width, GetStringListWidth(this->vehicle_group_shared_orders_sorter_names)); + size->width += padding.width; + break; + + case WID_GL_FILTER_BY_CARGO: + size->width = GetStringListWidth(this->cargo_filter_texts) + padding.width; + break; + case WID_GL_MANAGE_VEHICLES_DROPDOWN: { Dimension d = this->GetActionDropdownSize(true, true); d.height += padding.height; @@ -451,6 +469,10 @@ public: void SetStringParameters(int widget) const override { switch (widget) { + case WID_GL_FILTER_BY_CARGO: + SetDParam(0, this->cargo_filter_texts[this->cargo_filter_criteria]); + break; + case WID_GL_AVAILABLE_VEHICLES: SetDParam(0, STR_VEHICLE_LIST_AVAILABLE_TRAINS + this->vli.vtype); break; @@ -530,6 +552,9 @@ public: /* Set text of "sort by" dropdown widget. */ this->GetWidget(WID_GL_SORT_BY_DROPDOWN)->widget_data = this->GetVehicleSorterNames()[this->vehgroups.SortType()]; + /* Set text of filter by cargo dropdown */ + this->GetWidget(WID_GL_FILTER_BY_CARGO)->widget_data = this->cargo_filter_texts[this->cargo_filter_criteria]; + this->DrawWidgets(); } @@ -557,25 +582,23 @@ public: occupancy += v->trip_occupancy; } - const int left = r.left + WD_FRAMERECT_LEFT + 8; - const int right = r.right - WD_FRAMERECT_RIGHT - 8; + Rect tr = r.Shrink(WidgetDimensions::scaled.framerect); - int y = r.top + WD_FRAMERECT_TOP; - DrawString(left, right, y, STR_GROUP_PROFIT_THIS_YEAR, TC_BLACK); + DrawString(tr, STR_GROUP_PROFIT_THIS_YEAR, TC_BLACK); SetDParam(0, this_year); - DrawString(left, right, y, STR_JUST_CURRENCY_LONG, TC_BLACK, SA_RIGHT); + DrawString(tr, STR_JUST_CURRENCY_LONG, TC_BLACK, SA_RIGHT); - y += FONT_HEIGHT_NORMAL; - DrawString(left, right, y, STR_GROUP_PROFIT_LAST_YEAR, TC_BLACK); + tr.top += FONT_HEIGHT_NORMAL; + DrawString(tr, STR_GROUP_PROFIT_LAST_YEAR, TC_BLACK); SetDParam(0, last_year); - DrawString(left, right, y, STR_JUST_CURRENCY_LONG, TC_BLACK, SA_RIGHT); + DrawString(tr, STR_JUST_CURRENCY_LONG, TC_BLACK, SA_RIGHT); - y += FONT_HEIGHT_NORMAL; - DrawString(left, right, y, STR_GROUP_OCCUPANCY, TC_BLACK); + tr.top += FONT_HEIGHT_NORMAL; + DrawString(tr, STR_GROUP_OCCUPANCY, TC_BLACK); const size_t vehicle_count = this->vehicles.size(); if (vehicle_count > 0) { SetDParam(0, occupancy / vehicle_count); - DrawString(left, right, y, STR_GROUP_OCCUPANCY_VALUE, TC_BLACK, SA_RIGHT); + DrawString(tr, STR_GROUP_OCCUPANCY_VALUE, TC_BLACK, SA_RIGHT); } break; @@ -589,7 +612,7 @@ public: assert(g->owner == this->owner); - DrawGroupInfo(y1, r.left, r.right, g->index, this->indents[i] * LEVEL_WIDTH, HasBit(g->flags, GroupFlags::GF_REPLACE_PROTECTION), g->folded || (i + 1 < (int)this->groups.size() && indents[i + 1] > this->indents[i])); + DrawGroupInfo(y1, r.left, r.right, g->index, this->indents[i] * WidgetDimensions::scaled.hsep_indent, HasBit(g->flags, GroupFlags::GF_REPLACE_PROTECTION), g->folded || (i + 1 < (int)this->groups.size() && indents[i + 1] > this->indents[i])); y1 += this->tiny_step_height; } @@ -606,14 +629,14 @@ public: case WID_GL_LIST_VEHICLE: if (this->vli.index != ALL_GROUP && this->grouping == GB_NONE) { /* Mark vehicles which are in sub-groups (only if we are not using shared order coalescing) */ - int y = r.top; + Rect mr = r.WithHeight(this->resize.step_height); uint max = static_cast(std::min(this->vscroll->GetPosition() + this->vscroll->GetCapacity(), this->vehgroups.size())); for (uint i = this->vscroll->GetPosition(); i < max; ++i) { const Vehicle *v = this->vehgroups[i].GetSingleVehicle(); if (v->group_id != this->vli.index) { - GfxFillRect(r.left + 1, y + 1, r.right - 1, y + this->resize.step_height - 2, _colour_gradient[COLOUR_GREY][3], FILLRECT_CHECKER); + GfxFillRect(mr.Shrink(WidgetDimensions::scaled.bevel), _colour_gradient[COLOUR_GREY][3], FILLRECT_CHECKER); } - y += this->resize.step_height; + mr = mr.Translate(0, this->resize.step_height); } } @@ -647,6 +670,10 @@ public: ShowDropDownMenu(this, this->GetVehicleSorterNames(), this->vehgroups.SortType(), WID_GL_SORT_BY_DROPDOWN, 0, (this->vli.vtype == VEH_TRAIN || this->vli.vtype == VEH_ROAD) ? 0 : (1 << 10)); return; + case WID_GL_FILTER_BY_CARGO: // Select filtering criteria dropdown menu + ShowDropDownMenu(this, this->cargo_filter_texts, this->cargo_filter_criteria, WID_GL_FILTER_BY_CARGO, 0, 0); + break; + case WID_GL_ALL_VEHICLES: // All vehicles button if (!IsAllGroupID(this->vli.index)) { this->vli.index = ALL_GROUP; @@ -671,8 +698,8 @@ public: /* The group has children, check if the user clicked the fold / unfold button. */ NWidgetCore *group_display = this->GetWidget(widget); int x = _current_text_dir == TD_RTL ? - group_display->pos_x + group_display->current_x - WD_FRAMERECT_RIGHT - 8 - this->indents[id_g] * LEVEL_WIDTH - this->column_size[VGC_FOLD].width : - group_display->pos_x + WD_FRAMERECT_LEFT + 8 + this->indents[id_g] * LEVEL_WIDTH; + group_display->pos_x + group_display->current_x - WidgetDimensions::scaled.framerect.right - this->indents[id_g] * WidgetDimensions::scaled.hsep_indent - this->column_size[VGC_FOLD].width : + group_display->pos_x + WidgetDimensions::scaled.framerect.left + this->indents[id_g] * WidgetDimensions::scaled.hsep_indent; if (click_count > 1 || (pt.x >= x && pt.x < (int)(x + this->column_size[VGC_FOLD].width))) { GroupID g = this->vli.index; @@ -878,14 +905,14 @@ public: } case GB_SHARED_ORDERS: { - const Vehicle *v = vehgroup.vehicles_begin[0]; - /* We do not support VehicleClicked() here since the contextual action may only make sense for individual vehicles */ - - if (vindex == v->index) { - if (vehgroup.NumVehicles() == 1) { - ShowVehicleViewWindow(v); - } else { - ShowVehicleListWindow(v); + if (!VehicleClicked(vehgroup)) { + const Vehicle* v = vehgroup.vehicles_begin[0]; + if (vindex == v->index) { + if (vehgroup.NumVehicles() == 1) { + ShowVehicleViewWindow(v); + } else { + ShowVehicleListWindow(v); + } } } break; @@ -930,6 +957,10 @@ public: this->vehgroups.SetSortType(index); break; + case WID_GL_FILTER_BY_CARGO: // Select a cargo filter criteria + this->SetCargoFilterIndex(index); + break; + case WID_GL_MANAGE_VEHICLES_DROPDOWN: assert(this->vehicles.size() != 0); diff --git a/src/highscore_gui.cpp b/src/highscore_gui.cpp index 0ccc288f05..9b57ba659a 100644 --- a/src/highscore_gui.cpp +++ b/src/highscore_gui.cpp @@ -133,7 +133,7 @@ struct EndGameWindow : EndGameHighScoreBaseWindow { void OnPaint() override { this->SetupHighScoreEndWindow(); - Point pt = this->GetTopLeft(ScaleGUITrad(640), ScaleGUITrad(480)); + Point pt = this->GetTopLeft(ScaleSpriteTrad(640), ScaleSpriteTrad(480)); const Company *c = Company::GetIfValid(_local_company); if (c == nullptr) return; @@ -144,11 +144,11 @@ struct EndGameWindow : EndGameHighScoreBaseWindow { SetDParam(0, c->index); SetDParam(1, c->index); SetDParam(2, EndGameGetPerformanceTitleFromValue(c->old_economy[0].performance_history)); - DrawStringMultiLine(pt.x + ScaleGUITrad(15), pt.x + ScaleGUITrad(640) - ScaleGUITrad(25), pt.y + ScaleGUITrad(90), pt.y + ScaleGUITrad(160), STR_HIGHSCORE_PRESIDENT_OF_COMPANY_ACHIEVES_STATUS, TC_FROMSTRING, SA_CENTER); + DrawStringMultiLine(pt.x + ScaleSpriteTrad(15), pt.x + ScaleSpriteTrad(640) - ScaleSpriteTrad(25), pt.y + ScaleSpriteTrad(90), pt.y + ScaleSpriteTrad(160), STR_HIGHSCORE_PRESIDENT_OF_COMPANY_ACHIEVES_STATUS, TC_FROMSTRING, SA_CENTER); } else { SetDParam(0, c->index); SetDParam(1, EndGameGetPerformanceTitleFromValue(c->old_economy[0].performance_history)); - DrawStringMultiLine(pt.x + ScaleGUITrad(36), pt.x + ScaleGUITrad(640), pt.y + ScaleGUITrad(140), pt.y + ScaleGUITrad(206), STR_HIGHSCORE_COMPANY_ACHIEVES_STATUS, TC_FROMSTRING, SA_CENTER); + DrawStringMultiLine(pt.x + ScaleSpriteTrad(36), pt.x + ScaleSpriteTrad(640), pt.y + ScaleSpriteTrad(140), pt.y + ScaleSpriteTrad(206), STR_HIGHSCORE_COMPANY_ACHIEVES_STATUS, TC_FROMSTRING, SA_CENTER); } } }; @@ -185,24 +185,24 @@ struct HighScoreWindow : EndGameHighScoreBaseWindow { const HighScore *hs = _highscore_table[this->window_number]; this->SetupHighScoreEndWindow(); - Point pt = this->GetTopLeft(ScaleGUITrad(640), ScaleGUITrad(480)); + Point pt = this->GetTopLeft(ScaleSpriteTrad(640), ScaleSpriteTrad(480)); SetDParam(0, _settings_game.game_creation.ending_year); - DrawStringMultiLine(pt.x + ScaleGUITrad(70), pt.x + ScaleGUITrad(570), pt.y, pt.y + ScaleGUITrad(140), !_networking ? STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED : STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME, TC_FROMSTRING, SA_CENTER); + DrawStringMultiLine(pt.x + ScaleSpriteTrad(70), pt.x + ScaleSpriteTrad(570), pt.y, pt.y + ScaleSpriteTrad(140), !_networking ? STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED : STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME, TC_FROMSTRING, SA_CENTER); /* Draw Highscore peepz */ for (uint8 i = 0; i < lengthof(_highscore_table[0]); i++) { SetDParam(0, i + 1); - DrawString(pt.x + ScaleGUITrad(40), pt.x + ScaleGUITrad(600), pt.y + ScaleGUITrad(140 + i * 55), STR_HIGHSCORE_POSITION); + DrawString(pt.x + ScaleSpriteTrad(40), pt.x + ScaleSpriteTrad(600), pt.y + ScaleSpriteTrad(140 + i * 55), STR_HIGHSCORE_POSITION); if (hs[i].company[0] != '\0') { TextColour colour = (this->rank == i) ? TC_RED : TC_BLACK; // draw new highscore in red SetDParamStr(0, hs[i].company); - DrawString(pt.x + ScaleGUITrad(71), pt.x + ScaleGUITrad(569), pt.y + ScaleGUITrad(140 + i * 55), STR_JUST_BIG_RAW_STRING, colour); + DrawString(pt.x + ScaleSpriteTrad(71), pt.x + ScaleSpriteTrad(569), pt.y + ScaleSpriteTrad(140 + i * 55), STR_JUST_BIG_RAW_STRING, colour); SetDParam(0, hs[i].title); SetDParam(1, hs[i].score); - DrawString(pt.x + ScaleGUITrad(71), pt.x + ScaleGUITrad(569), pt.y + ScaleGUITrad(140) + FONT_HEIGHT_LARGE + ScaleGUITrad(i * 55), STR_HIGHSCORE_STATS, colour); + DrawString(pt.x + ScaleSpriteTrad(71), pt.x + ScaleSpriteTrad(569), pt.y + ScaleSpriteTrad(140) + FONT_HEIGHT_LARGE + ScaleSpriteTrad(i * 55), STR_HIGHSCORE_STATS, colour); } } } diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index b81ba18604..e1c2db2289 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -2040,12 +2040,13 @@ CommandCost CmdBuildIndustry(DoCommandFlag flags, TileIndex tile, IndustryType i Industry *ind = nullptr; if (deity_prospect || (_game_mode != GM_EDITOR && _current_company != OWNER_DEITY && _settings_game.construction.raw_industry_construction == 2 && indspec->IsRawIndustry())) { if (flags & DC_EXEC) { - /* Prospected industries are build as OWNER_TOWN to not e.g. be build on owned land of the founder */ - Backup cur_company(_current_company, OWNER_TOWN, FILE_LINE); /* Prospecting has a chance to fail, however we cannot guarantee that something can * be built on the map, so the chance gets lower when the map is fuller, but there * is nothing we can really do about that. */ - if (deity_prospect || Random() <= indspec->prospecting_chance) { + bool prospect_success = deity_prospect || Random() <= indspec->prospecting_chance; + if (prospect_success) { + /* Prospected industries are build as OWNER_TOWN to not e.g. be build on owned land of the founder */ + Backup cur_company(_current_company, OWNER_TOWN, FILE_LINE); for (int i = 0; i < 5000; i++) { /* We should not have more than one Random() in a function call * because parameter evaluation order is not guaranteed in the c++ standard @@ -2061,8 +2062,15 @@ CommandCost CmdBuildIndustry(DoCommandFlag flags, TileIndex tile, IndustryType i } if (ret.Succeeded()) break; } + cur_company.Restore(); + } + if (ret.Failed()) { + if (prospect_success) { + ShowErrorMessage(STR_ERROR_CAN_T_PROSPECT_INDUSTRY, STR_ERROR_NO_SUITABLE_PLACES_FOR_PROSPECTING, WL_INFO); + } else { + ShowErrorMessage(STR_ERROR_CAN_T_PROSPECT_INDUSTRY, STR_ERROR_PROSPECTING_WAS_UNLUCKY, WL_INFO); + } } - cur_company.Restore(); } } else { size_t layout = first_layout; diff --git a/src/industry_gui.cpp b/src/industry_gui.cpp index cf78f4db90..b87d125196 100644 --- a/src/industry_gui.cpp +++ b/src/industry_gui.cpp @@ -422,8 +422,8 @@ public: if (this->index[i] == INVALID_INDUSTRYTYPE) continue; d = maxdim(d, GetStringBoundingBox(GetIndustrySpec(this->index[i])->name)); } - resize->height = std::max(this->legend.height, FONT_HEIGHT_NORMAL) + WD_MATRIX_TOP + WD_MATRIX_BOTTOM; - d.width += this->legend.width + ScaleFontTrad(7) + padding.width; + resize->height = std::max(this->legend.height, FONT_HEIGHT_NORMAL) + padding.height; + d.width += this->legend.width + WidgetDimensions::scaled.hsep_wide + padding.width; d.height = 5 * resize->height; *size = maxdim(*size, d); break; @@ -471,8 +471,8 @@ public: /* Set it to something more sane :) */ height += extra_lines_prd + extra_lines_req + extra_lines_newgrf; - size->height = height * FONT_HEIGHT_NORMAL + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; - size->width = d.width + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; + size->height = height * FONT_HEIGHT_NORMAL + padding.height; + size->width = d.width + padding.width; break; } @@ -513,52 +513,40 @@ public: { switch (widget) { case WID_DPI_MATRIX_WIDGET: { - uint text_left, text_right, icon_left, icon_right; - if (_current_text_dir == TD_RTL) { - icon_right = r.right - WD_MATRIX_RIGHT; - icon_left = icon_right - this->legend.width; - text_right = icon_left - ScaleFontTrad(7); - text_left = r.left + WD_MATRIX_LEFT; - } else { - icon_left = r.left + WD_MATRIX_LEFT; - icon_right = icon_left + this->legend.width; - text_left = icon_right + ScaleFontTrad(7); - text_right = r.right - WD_MATRIX_RIGHT; - } + bool rtl = _current_text_dir == TD_RTL; + Rect text = r.WithHeight(this->resize.step_height).Shrink(WidgetDimensions::scaled.matrix); + Rect icon = text.WithWidth(this->legend.width, rtl); + text = text.Indent(this->legend.width + WidgetDimensions::scaled.hsep_wide, rtl); /* Vertical offset for legend icon. */ - int icon_top = (this->resize.step_height - this->legend.height + 1) / 2; - int icon_bottom = icon_top + this->legend.height; + icon.top = r.top + (this->resize.step_height - this->legend.height + 1) / 2; + icon.bottom = icon.top + this->legend.height - 1; - int y = r.top; for (uint16 i = 0; i < this->vscroll->GetCapacity() && i + this->vscroll->GetPosition() < this->count; i++) { bool selected = this->selected_index == i + this->vscroll->GetPosition(); if (this->index[i + this->vscroll->GetPosition()] == INVALID_INDUSTRYTYPE) { - DrawString(text_left, text_right, y + WD_MATRIX_TOP, STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES, selected ? TC_WHITE : TC_ORANGE); - y += this->resize.step_height; - continue; + DrawString(text, STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES, selected ? TC_WHITE : TC_ORANGE); + } else { + const IndustrySpec *indsp = GetIndustrySpec(this->index[i + this->vscroll->GetPosition()]); + + /* Draw the name of the industry in white is selected, otherwise, in orange */ + DrawString(text, indsp->name, selected ? TC_WHITE : TC_ORANGE); + GfxFillRect(icon, selected ? PC_WHITE : PC_BLACK); + GfxFillRect(icon.Shrink(WidgetDimensions::scaled.bevel), indsp->map_colour); } - const IndustrySpec *indsp = GetIndustrySpec(this->index[i + this->vscroll->GetPosition()]); - /* Draw the name of the industry in white is selected, otherwise, in orange */ - DrawString(text_left, text_right, y + WD_MATRIX_TOP, indsp->name, selected ? TC_WHITE : TC_ORANGE); - GfxFillRect(icon_left, y + icon_top, icon_right, y + icon_bottom, selected ? PC_WHITE : PC_BLACK); - GfxFillRect(icon_left + 1, y + icon_top + 1, icon_right - 1, y + icon_bottom - 1, indsp->map_colour); - - y += this->resize.step_height; + text = text.Translate(0, this->resize.step_height); + icon = icon.Translate(0, this->resize.step_height); } break; } case WID_DPI_INFOPANEL: { - int y = r.top + WD_FRAMERECT_TOP; - int bottom = r.bottom - WD_FRAMERECT_BOTTOM; - int left = r.left + WD_FRAMERECT_LEFT; - int right = r.right - WD_FRAMERECT_RIGHT; + Rect ir = r.Shrink(WidgetDimensions::scaled.framerect); if (this->selected_type == INVALID_INDUSTRYTYPE) { - DrawStringMultiLine(left, right, y, bottom, STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_TOOLTIP); + DrawStringMultiLine(ir, STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_TOOLTIP); break; } @@ -566,8 +554,8 @@ public: if (_game_mode != GM_EDITOR) { SetDParam(0, indsp->GetConstructionCost()); - DrawString(left, right, y, STR_FUND_INDUSTRY_INDUSTRY_BUILD_COST); - y += FONT_HEIGHT_NORMAL; + DrawString(ir, STR_FUND_INDUSTRY_INDUSTRY_BUILD_COST); + ir.top += FONT_HEIGHT_NORMAL; } CargoSuffix cargo_suffix[lengthof(indsp->accepts_cargo)]; @@ -575,12 +563,12 @@ public: /* Draw the accepted cargoes, if any. Otherwise, will print "Nothing". */ GetAllCargoSuffixes(CARGOSUFFIX_IN, CST_FUND, nullptr, this->selected_type, indsp, indsp->accepts_cargo, cargo_suffix); std::string cargostring = this->MakeCargoListString(indsp->accepts_cargo, cargo_suffix, lengthof(indsp->accepts_cargo), STR_INDUSTRY_VIEW_REQUIRES_N_CARGO); - y = DrawStringMultiLine(left, right, y, bottom, cargostring); + ir.top = DrawStringMultiLine(ir, cargostring); /* Draw the produced cargoes, if any. Otherwise, will print "Nothing". */ GetAllCargoSuffixes(CARGOSUFFIX_OUT, CST_FUND, nullptr, this->selected_type, indsp, indsp->produced_cargo, cargo_suffix); cargostring = this->MakeCargoListString(indsp->produced_cargo, cargo_suffix, lengthof(indsp->produced_cargo), STR_INDUSTRY_VIEW_PRODUCES_N_CARGO); - y = DrawStringMultiLine(left, right, y, bottom, cargostring); + ir.top = DrawStringMultiLine(ir, cargostring); /* Get the additional purchase info text, if it has not already been queried. */ if (HasBit(indsp->callback_mask, CBM_IND_FUND_MORE_TEXT)) { @@ -592,7 +580,7 @@ public: StringID str = GetGRFStringID(indsp->grf_prop.grffile->grfid, 0xD000 + callback_res); // No. here's the new string if (str != STR_UNDEFINED) { StartTextRefStackUsage(indsp->grf_prop.grffile, 6); - DrawStringMultiLine(left, right, y, bottom, str, TC_YELLOW); + DrawStringMultiLine(ir, str, TC_YELLOW); StopTextRefStackUsage(); } } @@ -825,6 +813,7 @@ class IndustryViewWindow : public Window byte clicked_button; ///< The button that has been clicked (to raise) int production_offset_y; ///< The offset of the production texts/buttons int info_height; ///< Height needed for the #WID_IV_INFO panel + int cheat_line_height; ///< Height of each line for the #WID_IV_INFO panel public: IndustryViewWindow(WindowDesc *desc, WindowNumber window_number) : Window(desc) @@ -833,7 +822,7 @@ public: this->editbox_line = IL_NONE; this->clicked_line = IL_NONE; this->clicked_button = 0; - this->info_height = WD_FRAMERECT_TOP + 2 * FONT_HEIGHT_NORMAL + WD_FRAMERECT_BOTTOM + 1; // Info panel has at least two lines text. + this->info_height = WidgetDimensions::scaled.framerect.Vertical() + 2 * FONT_HEIGHT_NORMAL; // Info panel has at least two lines text. this->InitNested(window_number); NWidgetViewport *nvp = this->GetWidget(WID_IV_VIEWPORT); @@ -842,16 +831,22 @@ public: this->InvalidateData(); } + void OnInit() override + { + /* This only used when the cheat to alter industry production is enabled */ + this->cheat_line_height = std::max(SETTING_BUTTON_HEIGHT + WidgetDimensions::scaled.vsep_normal, FONT_HEIGHT_NORMAL); + } + void OnPaint() override { this->DrawWidgets(); if (this->IsShaded()) return; // Don't draw anything when the window is shaded. - NWidgetBase *nwi = this->GetWidget(WID_IV_INFO); - uint expected = this->DrawInfo(nwi->pos_x, nwi->pos_x + nwi->current_x - 1, nwi->pos_y) - nwi->pos_y; - if (expected > nwi->current_y - 1) { - this->info_height = expected + 1; + const Rect r = this->GetWidget(WID_IV_INFO)->GetCurrentRect(); + int expected = this->DrawInfo(r); + if (expected != r.bottom) { + this->info_height = expected - r.top + 1; this->ReInit(); return; } @@ -859,35 +854,33 @@ public: /** * Draw the text in the #WID_IV_INFO panel. - * @param left Left edge of the panel. - * @param right Right edge of the panel. - * @param top Top edge of the panel. + * @param r Rectangle of the panel. * @return Expected position of the bottom edge of the panel. */ - int DrawInfo(uint left, uint right, uint top) + int DrawInfo(const Rect &r) { + bool rtl = _current_text_dir == TD_RTL; Industry *i = Industry::Get(this->window_number); const IndustrySpec *ind = GetIndustrySpec(i->type); - int y = top + WD_FRAMERECT_TOP; + Rect ir = r.Shrink(WidgetDimensions::scaled.framerect); bool first = true; bool has_accept = false; if (i->prod_level == PRODLEVEL_CLOSURE) { - DrawString(left + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, y, STR_INDUSTRY_VIEW_INDUSTRY_ANNOUNCED_CLOSURE); - y += 2 * FONT_HEIGHT_NORMAL; + DrawString(ir, STR_INDUSTRY_VIEW_INDUSTRY_ANNOUNCED_CLOSURE); + ir.top += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_wide; } CargoSuffix cargo_suffix[lengthof(i->accepts_cargo)]; GetAllCargoSuffixes(CARGOSUFFIX_IN, CST_VIEW, i, i->type, ind, i->accepts_cargo, cargo_suffix); bool stockpiling = HasBit(ind->callback_mask, CBM_IND_PRODUCTION_CARGO_ARRIVAL) || HasBit(ind->callback_mask, CBM_IND_PRODUCTION_256_TICKS); - uint left_side = left + WD_FRAMERECT_LEFT * 4; // Indent accepted cargoes. for (byte j = 0; j < lengthof(i->accepts_cargo); j++) { if (i->accepts_cargo[j] == CT_INVALID) continue; has_accept = true; if (first) { - DrawString(left + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, y, STR_INDUSTRY_VIEW_REQUIRES); - y += FONT_HEIGHT_NORMAL; + DrawString(ir, STR_INDUSTRY_VIEW_REQUIRES); + ir.top += FONT_HEIGHT_NORMAL; first = false; } SetDParam(0, CargoSpec::Get(i->accepts_cargo[j])->name); @@ -913,19 +906,22 @@ public: default: NOT_REACHED(); } - DrawString(left_side, right - WD_FRAMERECT_RIGHT, y, str); - y += FONT_HEIGHT_NORMAL; + DrawString(ir.Indent(WidgetDimensions::scaled.hsep_indent, rtl), str); + ir.top += FONT_HEIGHT_NORMAL; } GetAllCargoSuffixes(CARGOSUFFIX_OUT, CST_VIEW, i, i->type, ind, i->produced_cargo, cargo_suffix); + int line_height = this->editable == EA_RATE ? this->cheat_line_height : FONT_HEIGHT_NORMAL; + int text_y_offset = (line_height - FONT_HEIGHT_NORMAL) / 2; + int button_y_offset = (line_height - SETTING_BUTTON_HEIGHT) / 2; first = true; for (byte j = 0; j < lengthof(i->produced_cargo); j++) { if (i->produced_cargo[j] == CT_INVALID) continue; if (first) { - if (has_accept) y += WD_PAR_VSEP_WIDE; - DrawString(left + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, y, STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE); - y += FONT_HEIGHT_NORMAL; - if (this->editable == EA_RATE) this->production_offset_y = y; + if (has_accept) ir.top += WidgetDimensions::scaled.vsep_wide; + DrawString(ir, STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE); + ir.top += FONT_HEIGHT_NORMAL; + if (this->editable == EA_RATE) this->production_offset_y = ir.top; first = false; } @@ -933,26 +929,27 @@ public: SetDParam(1, i->last_month_production[j]); SetDParamStr(2, cargo_suffix[j].text); SetDParam(3, ToPercent8(i->last_month_pct_transported[j])); - uint x = left + WD_FRAMETEXT_LEFT + (this->editable == EA_RATE ? SETTING_BUTTON_WIDTH + 10 : 0); - DrawString(x, right - WD_FRAMERECT_RIGHT, y, STR_INDUSTRY_VIEW_TRANSPORTED); + DrawString(ir.Indent(WidgetDimensions::scaled.hsep_indent + (this->editable == EA_RATE ? SETTING_BUTTON_WIDTH + WidgetDimensions::scaled.hsep_normal : 0), rtl).Translate(0, text_y_offset), STR_INDUSTRY_VIEW_TRANSPORTED); /* Let's put out those buttons.. */ if (this->editable == EA_RATE) { - DrawArrowButtons(left + WD_FRAMETEXT_LEFT, y, COLOUR_YELLOW, (this->clicked_line == IL_RATE1 + j) ? this->clicked_button : 0, + DrawArrowButtons(ir.Indent(WidgetDimensions::scaled.hsep_indent, rtl).WithWidth(SETTING_BUTTON_WIDTH, rtl).left, ir.top + button_y_offset, COLOUR_YELLOW, (this->clicked_line == IL_RATE1 + j) ? this->clicked_button : 0, i->production_rate[j] > 0, i->production_rate[j] < 255); } - y += FONT_HEIGHT_NORMAL; + ir.top += line_height; } /* Display production multiplier if editable */ if (this->editable == EA_MULTIPLIER) { - y += WD_PAR_VSEP_WIDE; - this->production_offset_y = y; + line_height = this->cheat_line_height; + text_y_offset = (line_height - FONT_HEIGHT_NORMAL) / 2; + button_y_offset = (line_height - SETTING_BUTTON_HEIGHT) / 2; + ir.top += WidgetDimensions::scaled.vsep_wide; + this->production_offset_y = ir.top; SetDParam(0, RoundDivSU(i->prod_level * 100, PRODLEVEL_DEFAULT)); - uint x = left + WD_FRAMETEXT_LEFT + SETTING_BUTTON_WIDTH + 10; - DrawString(x, right - WD_FRAMERECT_RIGHT, y, STR_INDUSTRY_VIEW_PRODUCTION_LEVEL); - DrawArrowButtons(left + WD_FRAMETEXT_LEFT, y, COLOUR_YELLOW, (this->clicked_line == IL_MULTIPLIER) ? this->clicked_button : 0, + DrawString(ir.Indent(WidgetDimensions::scaled.hsep_indent + SETTING_BUTTON_WIDTH + WidgetDimensions::scaled.hsep_normal, rtl).Translate(0, text_y_offset), STR_INDUSTRY_VIEW_PRODUCTION_LEVEL); + DrawArrowButtons(ir.Indent(WidgetDimensions::scaled.hsep_indent, rtl).WithWidth(SETTING_BUTTON_WIDTH, rtl).left, ir.top + button_y_offset, COLOUR_YELLOW, (this->clicked_line == IL_MULTIPLIER) ? this->clicked_button : 0, i->prod_level > PRODLEVEL_MINIMUM, i->prod_level < PRODLEVEL_MAXIMUM); - y += FONT_HEIGHT_NORMAL; + ir.top += line_height; } /* Get the extra message for the GUI */ @@ -964,13 +961,13 @@ public: } else { StringID message = GetGRFStringID(ind->grf_prop.grffile->grfid, 0xD000 + callback_res); if (message != STR_NULL && message != STR_UNDEFINED) { - y += WD_PAR_VSEP_WIDE; + ir.top += WidgetDimensions::scaled.vsep_wide; StartTextRefStackUsage(ind->grf_prop.grffile, 6); /* Use all the available space left from where we stand up to the * end of the window. We ALSO enlarge the window if needed, so we * can 'go' wild with the bottom of the window. */ - y = DrawStringMultiLine(left + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, y, UINT16_MAX, message, TC_BLACK); + ir.top = DrawStringMultiLine(ir.left, ir.right, ir.top, UINT16_MAX, message, TC_BLACK); StopTextRefStackUsage(); } } @@ -979,11 +976,12 @@ public: if (!i->text.empty()) { SetDParamStr(0, i->text); - y += WD_PAR_VSEP_WIDE; - y = DrawStringMultiLine(left + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, y, UINT16_MAX, STR_JUST_RAW_STRING, TC_BLACK); + ir.top += WidgetDimensions::scaled.vsep_wide; + ir.top = DrawStringMultiLine(ir.left, ir.right, ir.top, UINT16_MAX, STR_JUST_RAW_STRING, TC_BLACK); } - return y + WD_FRAMERECT_BOTTOM; + /* Return required bottom position, the last pixel row plus some padding. */ + return ir.top - 1 + WidgetDimensions::scaled.framerect.bottom; } void SetStringParameters(int widget) const override @@ -1007,12 +1005,12 @@ public: case EA_NONE: break; case EA_MULTIPLIER: - if (IsInsideBS(pt.y, this->production_offset_y, FONT_HEIGHT_NORMAL)) line = IL_MULTIPLIER; + if (IsInsideBS(pt.y, this->production_offset_y, this->cheat_line_height)) line = IL_MULTIPLIER; break; case EA_RATE: if (pt.y >= this->production_offset_y) { - int row = (pt.y - this->production_offset_y) / FONT_HEIGHT_NORMAL; + int row = (pt.y - this->production_offset_y) / this->cheat_line_height; for (uint j = 0; j < lengthof(i->produced_cargo); j++) { if (i->produced_cargo[j] == CT_INVALID) continue; row--; @@ -1026,15 +1024,15 @@ public: } if (line == IL_NONE) return; - NWidgetBase *nwi = this->GetWidget(widget); - int left = nwi->pos_x + WD_FRAMETEXT_LEFT; - int right = nwi->pos_x + nwi->current_x - 1 - WD_FRAMERECT_RIGHT; - if (IsInsideMM(pt.x, left, left + SETTING_BUTTON_WIDTH)) { + bool rtl = _current_text_dir == TD_RTL; + Rect r = this->GetWidget(widget)->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect).Indent(WidgetDimensions::scaled.hsep_indent, rtl); + + if (r.WithWidth(SETTING_BUTTON_WIDTH, rtl).Contains(pt)) { /* Clicked buttons, decrease or increase production */ - byte button = (pt.x < left + SETTING_BUTTON_WIDTH / 2) ? 1 : 2; + bool decrease = r.WithWidth(SETTING_BUTTON_WIDTH / 2, rtl).Contains(pt); switch (this->editable) { case EA_MULTIPLIER: - if (button == 1) { + if (decrease) { if (i->prod_level <= PRODLEVEL_MINIMUM) return; i->prod_level = std::max(i->prod_level / 2, PRODLEVEL_MINIMUM); } else { @@ -1044,7 +1042,7 @@ public: break; case EA_RATE: - if (button == 1) { + if (decrease) { if (i->production_rate[line - IL_RATE1] <= 0) return; i->production_rate[line - IL_RATE1] = std::max(i->production_rate[line - IL_RATE1] / 2, 0); } else { @@ -1062,8 +1060,8 @@ public: this->SetDirty(); this->SetTimeout(); this->clicked_line = line; - this->clicked_button = button; - } else if (IsInsideMM(pt.x, left + SETTING_BUTTON_WIDTH + 10, right)) { + this->clicked_button = (decrease ^ rtl) ? 1 : 2; + } else if (r.Indent(SETTING_BUTTON_WIDTH + WidgetDimensions::scaled.hsep_normal, rtl).Contains(pt)) { /* clicked the text */ this->editbox_line = line; switch (this->editable) { @@ -1195,7 +1193,7 @@ static const NWidgetPart _nested_industry_view_widgets[] = { NWidget(NWID_VIEWPORT, INVALID_COLOUR, WID_IV_VIEWPORT), SetMinimalSize(254, 86), SetFill(1, 0), SetResize(1, 1), EndContainer(), EndContainer(), - NWidget(WWT_PANEL, COLOUR_CREAM, WID_IV_INFO), SetMinimalSize(260, 2), SetResize(1, 0), + NWidget(WWT_PANEL, COLOUR_CREAM, WID_IV_INFO), SetMinimalSize(260, 0), SetMinimalTextLines(2, WidgetDimensions::unscaled.framerect.Vertical()), SetResize(1, 0), EndContainer(), NWidget(NWID_HORIZONTAL), NWidget(WWT_PUSHTXTBTN, COLOUR_CREAM, WID_IV_DISPLAY), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_INDUSTRY_DISPLAY_CHAIN, STR_INDUSTRY_DISPLAY_CHAIN_TOOLTIP), @@ -1661,9 +1659,9 @@ public: case WID_ID_INDUSTRY_LIST: { int n = 0; - int y = r.top + WD_FRAMERECT_TOP; + Rect ir = r.Shrink(WidgetDimensions::scaled.framerect); if (this->industries.size() == 0) { - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_INDUSTRY_DIRECTORY_NONE); + DrawString(ir, STR_INDUSTRY_DIRECTORY_NONE); break; } TextColour tc; @@ -1676,9 +1674,9 @@ public: tc = TC_GREY | TC_FORCED; } } - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, this->GetIndustryString(this->industries[i]), tc); + DrawString(ir, this->GetIndustryString(this->industries[i]), tc); - y += this->resize.step_height; + ir.top += this->resize.step_height; if (++n == this->vscroll->GetCapacity()) break; // max number of industries in 1 window } break; @@ -1715,8 +1713,8 @@ public: } resize->height = d.height; d.height *= 5; - d.width += padding.width + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; - d.height += padding.height + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; + d.width += padding.width; + d.height += padding.height; *size = maxdim(*size, d); break; } @@ -1745,7 +1743,7 @@ public: break; case WID_ID_INDUSTRY_LIST: { - uint p = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_ID_INDUSTRY_LIST, WD_FRAMERECT_TOP); + uint p = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_ID_INDUSTRY_LIST, WidgetDimensions::scaled.framerect.top); if (p < this->industries.size()) { if (_ctrl_pressed) { ShowExtraViewportWindow(this->industries[p]->location.tile); @@ -1906,8 +1904,8 @@ static const uint MAX_CARGOES = 16; ///< Maximum number of cargoes carried in a /** Data about a single field in the #IndustryCargoesWindow panel. */ struct CargoesField { - static const int VERT_INTER_INDUSTRY_SPACE; - static const int BLOB_DISTANCE; + static int vert_inter_industry_space; + static int blob_distance; static Dimension legend; static Dimension cargo_border; @@ -2097,8 +2095,8 @@ struct CargoesField { break; case CFT_INDUSTRY: { - int ypos1 = ypos + VERT_INTER_INDUSTRY_SPACE / 2; - int ypos2 = ypos + normal_height - 1 - VERT_INTER_INDUSTRY_SPACE / 2; + int ypos1 = ypos + vert_inter_industry_space / 2; + int ypos2 = ypos + normal_height - 1 - vert_inter_industry_space / 2; int xpos2 = xpos + industry_width - 1; GfxDrawLine(xpos, ypos1, xpos2, ypos1, INDUSTRY_LINE_COLOUR); GfxDrawLine(xpos, ypos1, xpos, ypos2, INDUSTRY_LINE_COLOUR); @@ -2112,14 +2110,14 @@ struct CargoesField { /* Draw the industry legend. */ int blob_left, blob_right; if (_current_text_dir == TD_RTL) { - blob_right = xpos2 - BLOB_DISTANCE; + blob_right = xpos2 - blob_distance; blob_left = blob_right - CargoesField::legend.width; } else { - blob_left = xpos + BLOB_DISTANCE; + blob_left = xpos + blob_distance; blob_right = blob_left + CargoesField::legend.width; } - GfxFillRect(blob_left, ypos2 - BLOB_DISTANCE - CargoesField::legend.height, blob_right, ypos2 - BLOB_DISTANCE, PC_BLACK); // Border - GfxFillRect(blob_left + 1, ypos2 - BLOB_DISTANCE - CargoesField::legend.height + 1, blob_right - 1, ypos2 - BLOB_DISTANCE - 1, indsp->map_colour); + GfxFillRect(blob_left, ypos2 - blob_distance - CargoesField::legend.height, blob_right, ypos2 - blob_distance, PC_BLACK); // Border + GfxFillRect(blob_left + 1, ypos2 - blob_distance - CargoesField::legend.height + 1, blob_right - 1, ypos2 - blob_distance - 1, indsp->map_colour); } else { DrawString(xpos, xpos2, ypos, STR_INDUSTRY_CARGOES_HOUSES, TC_FROMSTRING, SA_HOR_CENTER); } @@ -2154,8 +2152,8 @@ struct CargoesField { case CFT_CARGO: { int cargo_base = this->GetCargoBase(xpos); - int top = ypos + (this->u.cargo.top_end ? VERT_INTER_INDUSTRY_SPACE / 2 + 1 : 0); - int bot = ypos - (this->u.cargo.bottom_end ? VERT_INTER_INDUSTRY_SPACE / 2 + 1 : 0) + normal_height - 1; + int top = ypos + (this->u.cargo.top_end ? vert_inter_industry_space / 2 + 1 : 0); + int bot = ypos - (this->u.cargo.bottom_end ? vert_inter_industry_space / 2 + 1 : 0) + normal_height - 1; int colpos = cargo_base; for (int i = 0; i < this->u.cargo.num_cargoes; i++) { if (this->u.cargo.top_end) GfxDrawLine(colpos, top - 1, colpos + CargoesField::cargo_line.width - 1, top - 1, CARGO_LINE_COLOUR); @@ -2177,7 +2175,7 @@ struct CargoesField { hor_left = this->u.cargo.supp_cargoes; hor_right = this->u.cargo.cust_cargoes; } - ypos += CargoesField::cargo_border.height + VERT_INTER_INDUSTRY_SPACE / 2 + (FONT_HEIGHT_NORMAL - CargoesField::cargo_line.height) / 2; + ypos += CargoesField::cargo_border.height + vert_inter_industry_space / 2 + (FONT_HEIGHT_NORMAL - CargoesField::cargo_line.height) / 2; for (uint i = 0; i < MAX_CARGOES; i++) { if (hor_left[i] != INVALID_CARGO) { int col = hor_left[i]; @@ -2207,11 +2205,11 @@ struct CargoesField { } case CFT_CARGO_LABEL: - ypos += CargoesField::cargo_border.height + VERT_INTER_INDUSTRY_SPACE / 2; + ypos += CargoesField::cargo_border.height + vert_inter_industry_space / 2; for (uint i = 0; i < MAX_CARGOES; i++) { if (this->u.cargo_label.cargoes[i] != INVALID_CARGO) { const CargoSpec *csp = CargoSpec::Get(this->u.cargo_label.cargoes[i]); - DrawString(xpos + WD_FRAMERECT_LEFT, xpos + industry_width - 1 - WD_FRAMERECT_RIGHT, ypos, csp->name, TC_WHITE, + DrawString(xpos + WidgetDimensions::scaled.framerect.left, xpos + industry_width - 1 - WidgetDimensions::scaled.framerect.right, ypos, csp->name, TC_WHITE, (this->u.cargo_label.left_align) ? SA_LEFT : SA_RIGHT); } ypos += FONT_HEIGHT_NORMAL + CargoesField::cargo_space.height; @@ -2244,7 +2242,7 @@ struct CargoesField { } /* col = 0 -> left of first col, 1 -> left of 2nd col, ... this->u.cargo.num_cargoes right of last-col. */ - int vpos = VERT_INTER_INDUSTRY_SPACE / 2 + CargoesField::cargo_border.width; + int vpos = vert_inter_industry_space / 2 + CargoesField::cargo_border.width; uint row; for (row = 0; row < MAX_CARGOES; row++) { if (pt.y < vpos) return INVALID_CARGO; @@ -2291,7 +2289,7 @@ struct CargoesField { { assert(this->type == CFT_CARGO_LABEL); - int vpos = VERT_INTER_INDUSTRY_SPACE / 2 + CargoesField::cargo_border.height; + int vpos = vert_inter_industry_space / 2 + CargoesField::cargo_border.height; uint row; for (row = 0; row < MAX_CARGOES; row++) { if (pt.y < vpos) return INVALID_CARGO; @@ -2332,9 +2330,9 @@ int CargoesField::normal_height; ///< Height of the non-header rows. int CargoesField::industry_width; ///< Width of an industry field. int CargoesField::cargo_field_width; ///< Width of a cargo field. uint CargoesField::max_cargoes; ///< Largest number of cargoes actually on any industry. -const int CargoesField::VERT_INTER_INDUSTRY_SPACE = 6; ///< Amount of space between two industries in a column. +int CargoesField::vert_inter_industry_space; ///< Amount of space between two industries in a column. -const int CargoesField::BLOB_DISTANCE = 5; ///< Distance of the industry legend colour from the edge of the industry box. +int CargoesField::blob_distance; ///< Distance of the industry legend colour from the edge of the industry box. const int CargoesField::INDUSTRY_LINE_COLOUR = PC_YELLOW; ///< Line colour of the industry type box. const int CargoesField::CARGO_LINE_COLOUR = PC_YELLOW; ///< Line colour around the cargo. @@ -2477,8 +2475,6 @@ next_cargo: ; * customer industries). The remaining two columns are set to #CFT_EMPTY with a width equal to the average of a cargo and an industry column. */ struct IndustryCargoesWindow : public Window { - static const int HOR_TEXT_PADDING, VERT_TEXT_PADDING; - typedef std::vector Fields; Fields fields; ///< Fields to display in the #WID_IC_PANEL. @@ -2501,8 +2497,8 @@ struct IndustryCargoesWindow : public Window { /* Initialize static CargoesField size variables. */ Dimension d = GetStringBoundingBox(STR_INDUSTRY_CARGOES_PRODUCERS); d = maxdim(d, GetStringBoundingBox(STR_INDUSTRY_CARGOES_CUSTOMERS)); - d.width += WD_FRAMETEXT_LEFT + WD_FRAMETEXT_RIGHT; - d.height += WD_FRAMETEXT_TOP + WD_FRAMETEXT_BOTTOM; + d.width += WidgetDimensions::scaled.frametext.Horizontal(); + d.height += WidgetDimensions::scaled.frametext.Vertical(); CargoesField::small_height = d.height; /* Size of the legend blob -- slightly larger than the smallmap legend blob. */ @@ -2510,7 +2506,7 @@ struct IndustryCargoesWindow : public Window { CargoesField::legend.width = CargoesField::legend.height * 8 / 5; /* Size of cargo lines. */ - CargoesField::cargo_line.width = FONT_HEIGHT_NORMAL; + CargoesField::cargo_line.width = ScaleGUITrad(6); CargoesField::cargo_line.height = CargoesField::cargo_line.width; /* Size of border between cargo lines and industry boxes. */ @@ -2525,6 +2521,9 @@ struct IndustryCargoesWindow : public Window { CargoesField::cargo_stub.width = CargoesField::cargo_line.width / 2; CargoesField::cargo_stub.height = CargoesField::cargo_line.height; /* Unused */ + CargoesField::vert_inter_industry_space = WidgetDimensions::scaled.vsep_wide; + CargoesField::blob_distance = WidgetDimensions::scaled.hsep_normal; + /* Decide about the size of the box holding the text of an industry type. */ this->ind_textsize.width = 0; this->ind_textsize.height = 0; @@ -2551,13 +2550,13 @@ struct IndustryCargoesWindow : public Window { d = maxdim(d, this->cargo_textsize); // Box must also be wide enough to hold any cargo label. this->cargo_textsize = maxdim(this->cargo_textsize, GetStringBoundingBox(STR_INDUSTRY_CARGOES_SELECT_CARGO)); - d.width += 2 * HOR_TEXT_PADDING; + d.width += WidgetDimensions::scaled.frametext.Horizontal(); /* Ensure the height is enough for the industry type text, for the horizontal connections, and for the cargo labels. */ uint min_ind_height = CargoesField::cargo_border.height * 2 + CargoesField::max_cargoes * FONT_HEIGHT_NORMAL + (CargoesField::max_cargoes - 1) * CargoesField::cargo_space.height; - d.height = std::max(d.height + 2 * VERT_TEXT_PADDING, min_ind_height); + d.height = std::max(d.height + WidgetDimensions::scaled.frametext.Vertical(), min_ind_height); CargoesField::industry_width = d.width; - CargoesField::normal_height = d.height + CargoesField::VERT_INTER_INDUSTRY_SPACE; + CargoesField::normal_height = d.height + CargoesField::vert_inter_industry_space; /* Width of a #CFT_CARGO field. */ CargoesField::cargo_field_width = CargoesField::cargo_border.width * 2 + CargoesField::cargo_line.width * CargoesField::max_cargoes + CargoesField::cargo_space.width * (CargoesField::max_cargoes - 1); @@ -2568,8 +2567,8 @@ struct IndustryCargoesWindow : public Window { switch (widget) { case WID_IC_PANEL: resize->height = CargoesField::normal_height; - size->width = WD_FRAMETEXT_LEFT + CargoesField::industry_width * 3 + CargoesField::cargo_field_width * 2 + WD_FRAMETEXT_RIGHT; - size->height = WD_FRAMETEXT_TOP + CargoesField::small_height + 2 * resize->height + WD_FRAMETEXT_BOTTOM; + size->width = CargoesField::industry_width * 3 + CargoesField::cargo_field_width * 2 + WidgetDimensions::scaled.frametext.Horizontal(); + size->height = CargoesField::small_height + 2 * resize->height + WidgetDimensions::scaled.frametext.Vertical(); break; case WID_IC_IND_DROPDOWN: @@ -2920,14 +2919,13 @@ struct IndustryCargoesWindow : public Window { { if (widget != WID_IC_PANEL) return; + Rect ir = r.Shrink(WidgetDimensions::scaled.framerect); DrawPixelInfo tmp_dpi, *old_dpi; - int width = r.right - r.left + 1; - int height = r.bottom - r.top + 1 - WD_FRAMERECT_TOP - WD_FRAMERECT_BOTTOM; - if (!FillDrawPixelInfo(&tmp_dpi, r.left + WD_FRAMERECT_LEFT, r.top + WD_FRAMERECT_TOP, width, height)) return; + if (!FillDrawPixelInfo(&tmp_dpi, ir.left, ir.top, ir.Width(), ir.Height())) return; old_dpi = _cur_dpi; _cur_dpi = &tmp_dpi; - int left_pos = WD_FRAMERECT_LEFT; + int left_pos = ir.left; if (this->ind_cargo >= NUM_INDUSTRYTYPES) left_pos += (CargoesField::industry_width + CargoesField::cargo_field_width) / 2; int last_column = (this->ind_cargo < NUM_INDUSTRYTYPES) ? 4 : 2; @@ -2971,7 +2969,7 @@ struct IndustryCargoesWindow : public Window { pt.x -= nw->pos_x; pt.y -= nw->pos_y; - int vpos = WD_FRAMERECT_TOP + CargoesField::small_height - this->vscroll->GetPosition() * nw->resize_y; + int vpos = WidgetDimensions::scaled.framerect.top + CargoesField::small_height - this->vscroll->GetPosition() * nw->resize_y; if (pt.y < vpos) return false; int row = (pt.y - vpos) / CargoesField::normal_height; // row is relative to row 1. @@ -2979,7 +2977,7 @@ struct IndustryCargoesWindow : public Window { vpos = pt.y - vpos - row * CargoesField::normal_height; // Position in the row + 1 field row++; // rebase row to match index of this->fields. - int xpos = 2 * WD_FRAMERECT_LEFT + ((this->ind_cargo < NUM_INDUSTRYTYPES) ? 0 : (CargoesField::industry_width + CargoesField::cargo_field_width) / 2); + int xpos = 2 * WidgetDimensions::scaled.framerect.left + ((this->ind_cargo < NUM_INDUSTRYTYPES) ? 0 : (CargoesField::industry_width + CargoesField::cargo_field_width) / 2); if (pt.x < xpos) return false; int column; for (column = 0; column <= 5; column++) { @@ -3135,13 +3133,10 @@ struct IndustryCargoesWindow : public Window { void OnResize() override { - this->vscroll->SetCapacityFromWidget(this, WID_IC_PANEL, WD_FRAMERECT_TOP + CargoesField::small_height); + this->vscroll->SetCapacityFromWidget(this, WID_IC_PANEL, WidgetDimensions::scaled.framerect.top + CargoesField::small_height); } }; -const int IndustryCargoesWindow::HOR_TEXT_PADDING = 5; ///< Horizontal padding around the industry type text. -const int IndustryCargoesWindow::VERT_TEXT_PADDING = 5; ///< Vertical padding around the industry type text. - /** * Open the industry and cargoes window. * @param id Industry type to display, \c NUM_INDUSTRYTYPES selects a default industry type. diff --git a/src/intro_gui.cpp b/src/intro_gui.cpp index fe19ec0632..7e86c1e53c 100644 --- a/src/intro_gui.cpp +++ b/src/intro_gui.cpp @@ -22,6 +22,7 @@ #include "strings_func.h" #include "fios.h" #include "ai/ai_gui.hpp" +#include "game/game_gui.hpp" #include "gfx_func.h" #include "core/geometry_func.hpp" #include "language.h" @@ -368,6 +369,7 @@ struct SelectGameWindow : public Window { } break; case WID_SGI_AI_SETTINGS: ShowAIConfigWindow(); break; + case WID_SGI_GS_SETTINGS: ShowGSConfigWindow(); break; case WID_SGI_EXIT: HandleExitGameRequest(); break; } } @@ -378,7 +380,7 @@ static const NWidgetPart _nested_select_game_widgets[] = { NWidget(WWT_PANEL, COLOUR_BROWN), NWidget(NWID_SPACER), SetMinimalSize(0, 8), - /* 'generate game' and 'load game' buttons */ + /* 'New Game' and 'Load Game' buttons */ NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_SGI_GENERATE_GAME), SetMinimalSize(158, 12), SetDataTip(STR_INTRO_NEW_GAME, STR_INTRO_TOOLTIP_NEW_GAME), SetPadding(0, 0, 0, 10), SetFill(1, 0), @@ -388,7 +390,7 @@ static const NWidgetPart _nested_select_game_widgets[] = { NWidget(NWID_SPACER), SetMinimalSize(0, 6), - /* 'play scenario' and 'play heightmap' buttons */ + /* 'Play Scenario' and 'Play Heightmap' buttons */ NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_SGI_PLAY_SCENARIO), SetMinimalSize(158, 12), SetDataTip(STR_INTRO_PLAY_SCENARIO, STR_INTRO_TOOLTIP_PLAY_SCENARIO), SetPadding(0, 0, 0, 10), SetFill(1, 0), @@ -398,7 +400,7 @@ static const NWidgetPart _nested_select_game_widgets[] = { NWidget(NWID_SPACER), SetMinimalSize(0, 6), - /* 'edit scenario' and 'play multiplayer' buttons */ + /* 'Scenario Editor' and 'Multiplayer' buttons */ NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_SGI_EDIT_SCENARIO), SetMinimalSize(158, 12), SetDataTip(STR_INTRO_SCENARIO_EDITOR, STR_INTRO_TOOLTIP_SCENARIO_EDITOR), SetPadding(0, 0, 0, 10), SetFill(1, 0), @@ -408,7 +410,7 @@ static const NWidgetPart _nested_select_game_widgets[] = { NWidget(NWID_SPACER), SetMinimalSize(0, 7), - /* climate selection buttons */ + /* Climate selection buttons */ NWidget(NWID_HORIZONTAL), NWidget(NWID_SPACER), SetMinimalSize(10, 0), SetFill(1, 0), NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_SGI_TEMPERATE_LANDSCAPE), SetMinimalSize(77, 55), @@ -437,7 +439,7 @@ static const NWidgetPart _nested_select_game_widgets[] = { EndContainer(), EndContainer(), - /* 'game options' and 'advanced settings' buttons */ + /* 'Game Options' and 'Settings' buttons */ NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_SGI_OPTIONS), SetMinimalSize(158, 12), SetDataTip(STR_INTRO_GAME_OPTIONS, STR_INTRO_TOOLTIP_GAME_OPTIONS), SetPadding(0, 0, 0, 10), SetFill(1, 0), @@ -447,27 +449,35 @@ static const NWidgetPart _nested_select_game_widgets[] = { NWidget(NWID_SPACER), SetMinimalSize(0, 6), - /* 'script settings' and 'newgrf settings' buttons */ + /* 'AI Settings' and 'Game Script Settings' buttons */ NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_SGI_AI_SETTINGS), SetMinimalSize(158, 12), - SetDataTip(STR_INTRO_SCRIPT_SETTINGS, STR_INTRO_TOOLTIP_SCRIPT_SETTINGS), SetPadding(0, 0, 0, 10), SetFill(1, 0), + SetDataTip(STR_INTRO_AI_SETTINGS, STR_INTRO_TOOLTIP_AI_SETTINGS), SetPadding(0, 0, 0, 10), SetFill(1, 0), + NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_SGI_GS_SETTINGS), SetMinimalSize(158, 12), + SetDataTip(STR_INTRO_GAMESCRIPT_SETTINGS, STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS), SetPadding(0, 10, 0, 0), SetFill(1, 0), + EndContainer(), + + NWidget(NWID_SPACER), SetMinimalSize(0, 6), + + /* 'Check Online Content' and 'NewGRF Settings' buttons */ + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), + NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_SGI_CONTENT_DOWNLOAD), SetMinimalSize(158, 12), + SetDataTip(STR_INTRO_ONLINE_CONTENT, STR_INTRO_TOOLTIP_ONLINE_CONTENT), SetPadding(0, 0, 0, 10), SetFill(1, 0), NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_SGI_GRF_SETTINGS), SetMinimalSize(158, 12), SetDataTip(STR_INTRO_NEWGRF_SETTINGS, STR_INTRO_TOOLTIP_NEWGRF_SETTINGS), SetPadding(0, 10, 0, 0), SetFill(1, 0), EndContainer(), NWidget(NWID_SPACER), SetMinimalSize(0, 6), - /* 'online content' and 'highscore' buttons */ - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), - NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_SGI_CONTENT_DOWNLOAD), SetMinimalSize(158, 12), - SetDataTip(STR_INTRO_ONLINE_CONTENT, STR_INTRO_TOOLTIP_ONLINE_CONTENT), SetPadding(0, 0, 0, 10), SetFill(1, 0), - NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_SGI_HIGHSCORE), SetMinimalSize(158, 12), - SetDataTip(STR_INTRO_HIGHSCORE, STR_INTRO_TOOLTIP_HIGHSCORE), SetPadding(0, 10, 0, 0), SetFill(1, 0), + /* 'Highscore Table' button */ + NWidget(NWID_HORIZONTAL), + NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_SGI_HIGHSCORE), SetMinimalSize(316, 12), + SetDataTip(STR_INTRO_HIGHSCORE, STR_INTRO_TOOLTIP_HIGHSCORE), SetPadding(0, 10, 0, 10), SetFill(1, 0), EndContainer(), NWidget(NWID_SPACER), SetMinimalSize(0, 6), - /* 'exit program' button */ + /* 'Exit' button */ NWidget(NWID_HORIZONTAL), NWidget(NWID_SPACER), SetFill(1, 0), NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_SGI_EXIT), SetMinimalSize(128, 12), diff --git a/src/landscape.cpp b/src/landscape.cpp index 910f647c46..a0707108a4 100644 --- a/src/landscape.cpp +++ b/src/landscape.cpp @@ -500,7 +500,7 @@ void DrawFoundation(TileInfo *ti, Foundation f) if (!IsNonContinuousFoundation(f)) { /* Lower part of foundation */ AddSortableSpriteToDraw( - leveled_base + (ti->tileh & ~SLOPE_STEEP), PAL_NONE, ti->x, ti->y, 16, 16, 7, ti->z + leveled_base + (ti->tileh & ~SLOPE_STEEP), PAL_NONE, ti->x, ti->y, TILE_SIZE, TILE_SIZE, TILE_HEIGHT - 1, ti->z ); } @@ -512,38 +512,44 @@ void DrawFoundation(TileInfo *ti, Foundation f) byte inclined = highest_corner * 2 + (f == FOUNDATION_INCLINED_Y ? 1 : 0); AddSortableSpriteToDraw(inclined_base + inclined, PAL_NONE, ti->x, ti->y, - f == FOUNDATION_INCLINED_X ? 16 : 1, - f == FOUNDATION_INCLINED_Y ? 16 : 1, + f == FOUNDATION_INCLINED_X ? TILE_SIZE : 1, + f == FOUNDATION_INCLINED_Y ? TILE_SIZE : 1, TILE_HEIGHT, ti->z ); - OffsetGroundSprite(31, 9); + OffsetGroundSprite(0, 0); } else if (IsLeveledFoundation(f)) { - AddSortableSpriteToDraw(leveled_base + SlopeWithOneCornerRaised(highest_corner), PAL_NONE, ti->x, ti->y, 16, 16, 7, ti->z - TILE_HEIGHT); - OffsetGroundSprite(31, 1); + AddSortableSpriteToDraw(leveled_base + SlopeWithOneCornerRaised(highest_corner), PAL_NONE, ti->x, ti->y, TILE_SIZE, TILE_SIZE, TILE_HEIGHT - 1, ti->z - TILE_HEIGHT); + OffsetGroundSprite(0, -(int)TILE_HEIGHT); } else if (f == FOUNDATION_STEEP_LOWER) { /* one corner raised */ - OffsetGroundSprite(31, 1); + OffsetGroundSprite(0, -(int)TILE_HEIGHT); } else { /* halftile foundation */ - int x_bb = (((highest_corner == CORNER_W) || (highest_corner == CORNER_S)) ? 8 : 0); - int y_bb = (((highest_corner == CORNER_S) || (highest_corner == CORNER_E)) ? 8 : 0); + int x_bb = (((highest_corner == CORNER_W) || (highest_corner == CORNER_S)) ? TILE_SIZE / 2 : 0); + int y_bb = (((highest_corner == CORNER_S) || (highest_corner == CORNER_E)) ? TILE_SIZE / 2 : 0); - AddSortableSpriteToDraw(halftile_base + highest_corner, PAL_NONE, ti->x + x_bb, ti->y + y_bb, 8, 8, 7, ti->z + TILE_HEIGHT); - OffsetGroundSprite(31, 9); + AddSortableSpriteToDraw(halftile_base + highest_corner, PAL_NONE, ti->x + x_bb, ti->y + y_bb, TILE_SIZE / 2, TILE_SIZE / 2, TILE_HEIGHT - 1, ti->z + TILE_HEIGHT); + /* Reposition ground sprite back to original position after bounding box change above. This is similar to + * RemapCoords() but without zoom scaling. */ + Point pt = {(y_bb - x_bb) * 2, y_bb + x_bb}; + OffsetGroundSprite(-pt.x, -pt.y); } } else { if (IsLeveledFoundation(f)) { /* leveled foundation */ - AddSortableSpriteToDraw(leveled_base + ti->tileh, PAL_NONE, ti->x, ti->y, 16, 16, 7, ti->z); - OffsetGroundSprite(31, 1); + AddSortableSpriteToDraw(leveled_base + ti->tileh, PAL_NONE, ti->x, ti->y, TILE_SIZE, TILE_SIZE, TILE_HEIGHT - 1, ti->z); + OffsetGroundSprite(0, -(int)TILE_HEIGHT); } else if (IsNonContinuousFoundation(f)) { /* halftile foundation */ Corner halftile_corner = GetHalftileFoundationCorner(f); - int x_bb = (((halftile_corner == CORNER_W) || (halftile_corner == CORNER_S)) ? 8 : 0); - int y_bb = (((halftile_corner == CORNER_S) || (halftile_corner == CORNER_E)) ? 8 : 0); + int x_bb = (((halftile_corner == CORNER_W) || (halftile_corner == CORNER_S)) ? TILE_SIZE / 2 : 0); + int y_bb = (((halftile_corner == CORNER_S) || (halftile_corner == CORNER_E)) ? TILE_SIZE / 2 : 0); - AddSortableSpriteToDraw(halftile_base + halftile_corner, PAL_NONE, ti->x + x_bb, ti->y + y_bb, 8, 8, 7, ti->z); - OffsetGroundSprite(31, 9); + AddSortableSpriteToDraw(halftile_base + halftile_corner, PAL_NONE, ti->x + x_bb, ti->y + y_bb, TILE_SIZE / 2, TILE_SIZE / 2, TILE_HEIGHT - 1, ti->z); + /* Reposition ground sprite back to original position after bounding box change above. This is similar to + * RemapCoords() but without zoom scaling. */ + Point pt = {(y_bb - x_bb) * 2, y_bb + x_bb}; + OffsetGroundSprite(-pt.x, -pt.y); } else if (IsSpecialRailFoundation(f)) { /* anti-zig-zag foundation */ SpriteID spr; @@ -554,18 +560,18 @@ void DrawFoundation(TileInfo *ti, Foundation f) /* tile-slope = sloped along X/Y, foundation-slope = three corners raised */ spr = inclined_base + 2 * GetRailFoundationCorner(f) + ((ti->tileh == SLOPE_SW || ti->tileh == SLOPE_NE) ? 1 : 0); } - AddSortableSpriteToDraw(spr, PAL_NONE, ti->x, ti->y, 16, 16, 7, ti->z); - OffsetGroundSprite(31, 9); + AddSortableSpriteToDraw(spr, PAL_NONE, ti->x, ti->y, TILE_SIZE, TILE_SIZE, TILE_HEIGHT - 1, ti->z); + OffsetGroundSprite(0, 0); } else { /* inclined foundation */ byte inclined = GetHighestSlopeCorner(ti->tileh) * 2 + (f == FOUNDATION_INCLINED_Y ? 1 : 0); AddSortableSpriteToDraw(inclined_base + inclined, PAL_NONE, ti->x, ti->y, - f == FOUNDATION_INCLINED_X ? 16 : 1, - f == FOUNDATION_INCLINED_Y ? 16 : 1, + f == FOUNDATION_INCLINED_X ? TILE_SIZE : 1, + f == FOUNDATION_INCLINED_Y ? TILE_SIZE : 1, TILE_HEIGHT, ti->z ); - OffsetGroundSprite(31, 9); + OffsetGroundSprite(0, 0); } ti->z += ApplyPixelFoundationToSlope(f, &ti->tileh); } @@ -1176,9 +1182,39 @@ static bool RiverMakeWider(TileIndex tile, void *data) Command::Do(DC_EXEC | DC_AUTO, tile, to_change, true); } } + /* Update cur_slope after possibly terraforming. */ + cur_slope = GetTileSlope(tile); + } + + /* Sloped rivers need water both upstream and downstream. */ + if (IsInclinedSlope(cur_slope)) { + DiagDirection slope_direction = GetInclinedSlopeDirection(cur_slope); + + TileIndex upstream_tile = TileAddByDiagDir(tile, slope_direction); + TileIndex downstream_tile = TileAddByDiagDir(tile, ReverseDiagDir(slope_direction)); + + /* Don't look outside the map. */ + if (!IsValidTile(upstream_tile) || !IsValidTile(downstream_tile)) return false; + + /* Downstream might be new ocean created by our terraforming, and it hasn't flooded yet. */ + bool downstream_is_ocean = GetTileZ(downstream_tile) == 0 && (GetTileSlope(downstream_tile) == SLOPE_FLAT || IsSlopeWithOneCornerRaised(GetTileSlope(downstream_tile))); + + /* If downstream is dry, flat, and not ocean, try making it a river tile. */ + if (!IsWaterTile(downstream_tile) && !downstream_is_ocean) { + /* If the tile upstream isn't flat, don't bother. */ + if (GetTileSlope(downstream_tile) != SLOPE_FLAT) return false; + + MakeRiver(downstream_tile, Random()); + } + + /* If upstream is dry and flat, try making it a river tile. */ + if (!IsWaterTile(upstream_tile)) { + /* If the tile upstream isn't flat, don't bother. */ + if (GetTileSlope(upstream_tile) != SLOPE_FLAT) return false; + + MakeRiver(upstream_tile, Random()); + } } - /* Update cur_slope after possibly terraforming. */ - cur_slope = GetTileSlope(tile); /* If the tile slope matches the desired slope, add a river tile. */ if (cur_slope == desired_slope) { @@ -1289,7 +1325,7 @@ static void River_FoundEndNode(AyStar *aystar, OpenListNode *current) current_river_length = DistanceManhattan(data->spring, tile); radius = std::min(3u, (current_river_length / (long_river_length / 3u)) + 1u); - if (radius > 1) CircularTileSearch(&tile, radius + RandomRange(1), RiverMakeWider, (void *)&path->node.tile); + if (radius > 1) CircularTileSearch(&tile, radius, RiverMakeWider, (void *)&path->node.tile); } } } diff --git a/src/lang/afrikaans.txt b/src/lang/afrikaans.txt index bd36859ea5..8ec742f1b1 100644 --- a/src/lang/afrikaans.txt +++ b/src/lang/afrikaans.txt @@ -200,6 +200,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}pk STR_UNITS_POWER_METRIC :{COMMA}{NBSP}pk STR_UNITS_POWER_SI :{COMMA}{NBSP}kW + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -382,10 +383,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Verlaat # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Spel opsies STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Stellings -STR_SETTINGS_MENU_SCRIPT_SETTINGS :AI/Spel skript instellings STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF stellings STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Deursigtigheid opsies STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Dorp name vertoon @@ -945,36 +945,6 @@ STR_GAME_OPTIONS_CURRENCY_NTD :Nuwe Taiwan dol STR_GAME_OPTIONS_CURRENCY_CNY :Chinese Renminbi (CNY) STR_GAME_OPTIONS_CURRENCY_HKD :Hong Kong Dollar (HKD) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Bestuur aan linkerkant -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Bestuur aan regterkant - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Dorp name -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Kies dorp naam styl - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Engels (Oorspronkilik) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Frans -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Duits -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Engels (Addisioneel) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Latyns-Amerikaans -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Snaaks -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Sweeds -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Hollands -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finnish -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Polish -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slovak -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norwegian -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Hungarian -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Austrian -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Romanian -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Czech -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Swiss -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Deens -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turks -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italiaans -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Catalan - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Outostoor STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Kies interval tussen outomatiese store @@ -999,18 +969,8 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :ander -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK} Koppelvlak groote -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK} Kies die koppelvlak element groote om te gebruik -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normaal -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Dubbel groote -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Quad grootte -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Skrifgrootte - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normaal -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Dubbele grootte -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Quad grootte @@ -1057,8 +1017,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Voorsko STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 Pond (£) in jou koers STR_CURRENCY_CHANGE_PARAMETER :{BLACK}verander gebruiklike koers parameter -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Maksimum no. mededingers: {ORANGE}{COMMA} - STR_NONE :Geen STR_FUNDING_ONLY :Befondsing alleen STR_MINIMAL :Minimale @@ -1108,6 +1066,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Matige klimaat +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Sub-artiese landskap +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Sub-tropiese landskap +STR_CLIMATE_TOYLAND_LANDSCAPE :Speelgoedland landskap + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Baie Plat STR_TERRAIN_TYPE_FLAT :Plat @@ -1447,6 +1411,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Verbeter STR_CONFIG_SETTING_ROAD_SIDE :Padvoertuie: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Kies die bestuurskant +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Bestuur aan linkerkant +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Bestuur aan regterkant + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Reliëfkaart orientasie: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Anti-kloksgewys @@ -1935,7 +1903,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Outomatiese rig STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Laat treine toe om agteruit te gaan by signale, as hulle daar lank gewag het ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Aanbevole) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Aanbevole) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Verander stel waarde @@ -1976,7 +1944,6 @@ STR_INTRO_HIGHSCORE :{BLACK}Hoogste STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Stellings STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF Stellings STR_INTRO_ONLINE_CONTENT :{BLACK}Soek aanlyn -STR_INTRO_SCRIPT_SETTINGS :{BLACK}AI/Spel Skript Instellings STR_INTRO_QUIT :{BLACK}Verlaat STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Begin nuwe spel. Ctrl+klik ignoreer kaart konfigurasie @@ -1996,7 +1963,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Vertoon STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Vertoon instellings STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Wys NewGRF stellings STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Kyk vir nuwe of bygewerkde inhoud om af te laai -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Vertoon AI/Spel skript konfigurasie STR_INTRO_TOOLTIP_QUIT :{BLACK}Verlaat 'OpenTTD' STR_INTRO_TRANSLATION :{BLACK}Die vertaling kort {NUM} string{P "" s}. Help aseblief om OpenTTD beter te maak, deur aan te sluit as 'n vertaaler. Sien die readme.txt vir meer inligting. @@ -2025,12 +1991,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Verande STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Verander huidige jaar STR_CHEAT_SETUP_PROD :{LTBLUE}Aktiveer modifisering van produksie waardes: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Matige klimaat -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Sub-artiese landskap -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Sub-tropiese landskap -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Speelgoedland landskap - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Kleur Skema @@ -2921,16 +2881,41 @@ STR_MAPGEN_MAPSIZE :{BLACK}Kaart gr STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Kies kaartgrootte teëls. Die aantal werklike beskikbare teëls sal ietwat minder wees. STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Hoev. dorpe: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Dorp name +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Kies dorp naam styl STR_MAPGEN_DATE :{BLACK}Datum: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Hoev. nywerhede: STR_MAPGEN_LAND_GENERATOR :{BLACK}Land genereerder: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terrein tipe: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Seevlak: +STR_MAPGEN_SEA_LEVEL :{BLACK}Seevlak: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Riviere: STR_MAPGEN_SMOOTHNESS :{BLACK}Gladheid: STR_MAPGEN_VARIETY :{BLACK}Verskeidenheid verspreiding: STR_MAPGEN_GENERATE :{WHITE}Genereer +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Engels (Oorspronkilik) +STR_MAPGEN_TOWN_NAME_FRENCH :Frans +STR_MAPGEN_TOWN_NAME_GERMAN :Duits +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Engels (Addisioneel) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Latyns-Amerikaans +STR_MAPGEN_TOWN_NAME_SILLY :Snaaks +STR_MAPGEN_TOWN_NAME_SWEDISH :Sweeds +STR_MAPGEN_TOWN_NAME_DUTCH :Hollands +STR_MAPGEN_TOWN_NAME_FINNISH :Finnish +STR_MAPGEN_TOWN_NAME_POLISH :Polish +STR_MAPGEN_TOWN_NAME_SLOVAK :Slovak +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norwegian +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Hungarian +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Austrian +STR_MAPGEN_TOWN_NAME_ROMANIAN :Romanian +STR_MAPGEN_TOWN_NAME_CZECH :Czech +STR_MAPGEN_TOWN_NAME_SWISS :Swiss +STR_MAPGEN_TOWN_NAME_DANISH :Deens +STR_MAPGEN_TOWN_NAME_TURKISH :Turks +STR_MAPGEN_TOWN_NAME_ITALIAN :Italiaans +STR_MAPGEN_TOWN_NAME_CATALAN :Catalan + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Kaart kante: STR_MAPGEN_NORTHWEST :{BLACK}Noordwes @@ -3069,6 +3054,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Vorige s STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Gaan na vorige normale sprite, en ignoreer enige pseudo/her-kleur/font sprite en spring terug na die einde STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Voorstelling van geselekteerde sprite. Die belyning word geignoreer waneer sprite geteken word STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Beweeg die sprite rond, verander die X en Y afwyking. Ctrl-klik om die sprite agt lengtes rond te beweeg op 'n slag + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Relatiewe herstel STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Herstel die huidige relatiewe verplasing STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X verplasing: {NUM}, Y verplasing: {NUM} (Werklik) @@ -3610,6 +3599,8 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Maks. Tr STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Afstand: {GOLD}{COMMA} teëls STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Vliegtuig tipe: {GOLD}{STRING} +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Trein kieslys - klik op voertuig vir inligting. CTRL+kliek vir wegsteek van die voertuig tipe STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Pad voertuig kieslys - klik op voertuig vir inligting. CTRL+kliek vir wegsteek van die voertuig tipe @@ -4253,12 +4244,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Een van STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Rekenaar Speler/Spel Skrip Ontfout venster is slegs beskikbaar aan die verskaffer # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}AI/Spel Konfigurasie STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Spel Skrip wat in die volgende spel gelaai sal word STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}Die AIs wat om die volgende spel gelaai sal word STR_AI_CONFIG_HUMAN_PLAYER :Mens Speler STR_AI_CONFIG_RANDOM_AI :Lukraak AI STR_AI_CONFIG_NONE :(geen) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Maksimum no. mededingers: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Beweeg op STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Beweeg gekose AI op in die lys @@ -4268,8 +4259,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Beweeg g STR_AI_CONFIG_GAMESCRIPT :{SILVER}Spel Skrip STR_AI_CONFIG_AI :{SILVER}AIs -STR_AI_CONFIG_CHANGE :{BLACK}Selekteer {STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :AI STR_AI_CONFIG_CHANGE_GAMESCRIPT :Spel Skrip STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Laai nog 'n script @@ -4300,9 +4289,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Hoogteka STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Minimap-skermkiekie # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameters STR_AI_SETTINGS_CAPTION_AI :AI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Speletjie Skrif STR_AI_SETTINGS_CLOSE :{BLACK}Maak toe STR_AI_SETTINGS_RESET :{BLACK}Herstel STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4714,6 +4701,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Kan nie STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... voertuig is vernietig + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Geen voertuie gaan beskikbaar wees nie STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Verander jou NewGRF stellings STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Geen voertuie is op die oomblik beskikbaar nie diff --git a/src/lang/arabic_egypt.txt b/src/lang/arabic_egypt.txt index b7ed188074..467a24247c 100644 --- a/src/lang/arabic_egypt.txt +++ b/src/lang/arabic_egypt.txt @@ -199,6 +199,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}ح STR_UNITS_POWER_METRIC :{COMMA}{NBSP}حصان STR_UNITS_POWER_SI :{COMMA}{NBSP}ك واط + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP} طن STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}طن STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}كجم @@ -380,10 +381,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :انهاء # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :إعدادات اللعبه STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :الإعدادات -STR_SETTINGS_MENU_SCRIPT_SETTINGS :الذكاء الصناعي/ اعدادات اللعبة STR_SETTINGS_MENU_NEWGRF_SETTINGS :إعدادات اﻹضافات STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :خيارات الشفافية STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :عرض اسماء المدن @@ -933,36 +933,6 @@ STR_GAME_OPTIONS_CURRENCY_CNY :(CNY) الرن STR_GAME_OPTIONS_CURRENCY_HKD :(HKD) دولار هونج كونج STR_GAME_OPTIONS_CURRENCY_INR :الروبية الهندية (INR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :القيادة على اليسار -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :القيادة على اليمين - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}اسماء المدن: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}اختيار طريقة عرض اسماء المدن - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :English (Original) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :فرنسي -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :الماني -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :انجليزي اضافي -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :امريكي لاتيني -STR_GAME_OPTIONS_TOWN_NAME_SILLY :مضحك -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :سويدي -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :هولندي -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :فنلندي -STR_GAME_OPTIONS_TOWN_NAME_POLISH :بلغاري -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :سلوفاكي -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :نرويجي -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :هنغاري -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :نمساوي -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :روماني -STR_GAME_OPTIONS_TOWN_NAME_CZECH :تشيكي -STR_GAME_OPTIONS_TOWN_NAME_SWISS :سويدي -STR_GAME_OPTIONS_TOWN_NAME_DANISH :دنماكي -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :تركي -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :ايطالي -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :كتالونية - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}حفظ آلي STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}اختار مدة الحفظ الآلي @@ -991,20 +961,8 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}لن ي -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}حجم اللوحة -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}حدد العنصر المطلوب -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :تقريب عادي -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :تقريب ×2 -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :تقريب ×4 -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}حجم الخط -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}حدد حجم خط الواجهة المراد استخدامه - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(كشف أوتوماتيكي) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :عادي -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :حجم مزدوج -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :حجم رباعي STR_GAME_OPTIONS_GRAPHICS :{BLACK}الرسومات @@ -1056,8 +1014,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}عرض: STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK} 10000 جنية استرليني في عملتك STR_CURRENCY_CHANGE_PARAMETER :{BLACK}غير الخيارات الاختيارة -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}العدد الاقصى للمتنافسين: {ORANGE}{COMMA} - STR_NONE :بدون STR_FUNDING_ONLY :التمويل فقط STR_MINIMAL :الادنى @@ -1107,6 +1063,12 @@ STR_SUBSIDY_X2 :*2 STR_SUBSIDY_X3 :*3 STR_SUBSIDY_X4 :*4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :مناطق معتدلة +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :مناطق ثلجية +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :مناطق مدارية +STR_CLIMATE_TOYLAND_LANDSCAPE :ألعاب + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :مسطح تماما STR_TERRAIN_TYPE_FLAT :مسطح @@ -1358,6 +1320,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :المحسن STR_CONFIG_SETTING_ROAD_SIDE :السيارات: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :إختر جهة القيادة +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :القيادة على اليسار +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :القيادة على اليمين + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :اتجاة خريطة المرتفعات: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :عكس عقارب الساعة @@ -1711,7 +1677,7 @@ STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS :موجد طري STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :العكس عند الإشارات: {STRING} ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(مفضل) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(مفضل) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}عدل قيمة التغيير @@ -1748,7 +1714,6 @@ STR_INTRO_HIGHSCORE :{BLACK}قائم STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}الاعدادات STR_INTRO_NEWGRF_SETTINGS :{BLACK} اعدادات NewGRF STR_INTRO_ONLINE_CONTENT :{BLACK} إبحث عن المحتوى عبر الشبكه العنكبوتيه -STR_INTRO_SCRIPT_SETTINGS :{BLACK}إعدادات الذكاء الصناعى STR_INTRO_QUIT :{BLACK}خروج STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}بدأ لعبة جديدة @@ -1795,12 +1760,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}عدل STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}غير السنة الحالية STR_CHEAT_SETUP_PROD :{LTBLUE}تفعيل تغيير قيمة الانتاج: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :مناطق معتدلة -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :مناطق ثلجية -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :مناطق مدارية -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :ألعاب - # Livery window STR_LIVERY_GENERAL_TOOLTIP :{BLACK}اظهر اللون العام @@ -2672,6 +2631,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}حجم STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK} حدد حجم الخريطة بالمربعات. سيكون عدد المربعات المتاحة أصغر قليلاً STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}عدد المدن: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}اسماء المدن: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}اختيار طريقة عرض اسماء المدن STR_MAPGEN_DATE :{BLACK}التاريخ: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}عدد المصانع: STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}قم بزيادة أقصى ارتفاع لأعلى قمة على الخريطة بواحد @@ -2681,12 +2642,35 @@ STR_MAPGEN_DESERT_COVERAGE :{BLACK}مدى STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}مولد الخريطة: STR_MAPGEN_TERRAIN_TYPE :{BLACK} نوع التضاريس -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}مستوى البحر +STR_MAPGEN_SEA_LEVEL :{BLACK}مستوى البحر STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}انهار: STR_MAPGEN_SMOOTHNESS :{BLACK} النعومة: STR_MAPGEN_VARIETY :{BLACK}توزيع التنوع: STR_MAPGEN_GENERATE :{WHITE}ولد +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :English (Original) +STR_MAPGEN_TOWN_NAME_FRENCH :فرنسي +STR_MAPGEN_TOWN_NAME_GERMAN :الماني +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :انجليزي اضافي +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :امريكي لاتيني +STR_MAPGEN_TOWN_NAME_SILLY :مضحك +STR_MAPGEN_TOWN_NAME_SWEDISH :سويدي +STR_MAPGEN_TOWN_NAME_DUTCH :هولندي +STR_MAPGEN_TOWN_NAME_FINNISH :فنلندي +STR_MAPGEN_TOWN_NAME_POLISH :بلغاري +STR_MAPGEN_TOWN_NAME_SLOVAK :سلوفاكي +STR_MAPGEN_TOWN_NAME_NORWEGIAN :نرويجي +STR_MAPGEN_TOWN_NAME_HUNGARIAN :هنغاري +STR_MAPGEN_TOWN_NAME_AUSTRIAN :نمساوي +STR_MAPGEN_TOWN_NAME_ROMANIAN :روماني +STR_MAPGEN_TOWN_NAME_CZECH :تشيكي +STR_MAPGEN_TOWN_NAME_SWISS :سويدي +STR_MAPGEN_TOWN_NAME_DANISH :دنماكي +STR_MAPGEN_TOWN_NAME_TURKISH :تركي +STR_MAPGEN_TOWN_NAME_ITALIAN :ايطالي +STR_MAPGEN_TOWN_NAME_CATALAN :كتالونية + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK} حدود الخريطة: STR_MAPGEN_NORTHWEST :{BLACK} الشمال الغربي @@ -2821,6 +2805,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}العف STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}نابع للعفريتة الطبيعية التالية، تجاوز اي عفريتة موقوفة/ مصبوغة/مخطوطة و انهي في البداية. STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}عرض العفريتة المختارة حاليا. يتم تجاهل الموائمة عند رسم هذا العفريت. STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}حرك العفريتة في الجوار، غير الاحداثيات س ، ص. + +###length 2 + + STR_SPRITE_ALIGNER_PICKER_BUTTON :{BLACK}اختر عفريتة STR_SPRITE_ALIGNER_PICKER_TOOLTIP :{BLACK}اختر عفريتة من اي مكان في الشاشة. @@ -3301,6 +3289,8 @@ STR_PURCHASE_INFO_ALL_BUT :الكل الا STR_PURCHASE_INFO_MAX_TE :{BLACK}تأثير الجذب القصى: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}نوع الطائرة:{GOLD}{STRING} +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}قائمة اختيار القطارات - اضغط على العربة لعرض معلوماتها STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}قائمة اختيار العربات - اضغط على العربة لاظهار معلوماتها @@ -3914,11 +3904,11 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}واحد STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW} شاشة اخطاء الذكاء الصناعي متوفرة فقط للخادم (سرڤر) # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}إعدادات الذكاء الصناعي STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}مخطوطات اللعبة الذي سيتم تحميله في اللعبة التالية STR_AI_CONFIG_HUMAN_PLAYER :لاعب انساني STR_AI_CONFIG_RANDOM_AI :ذكاء صناعي عشوائي STR_AI_CONFIG_NONE :(لا شيء) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}العدد الاقصى للمتنافسين: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}انقل للاعلى STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}انقل الذكاء الاصطناعي المختار للاعلى @@ -3927,8 +3917,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}انقل STR_AI_CONFIG_AI :{SILVER} الذكاء الاصطناعي -STR_AI_CONFIG_CHANGE :{BLACK}اختر {STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :الذكاء الاصطناعي STR_AI_CONFIG_CHANGE_GAMESCRIPT :مخطوط اللعبة STR_AI_CONFIG_CONFIGURE :{BLACK} اعداد @@ -4346,6 +4334,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}لا ي STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... العربة تحطمت + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}لن تتوافر اى وسائل نقل على اﻹطلاق STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}لا تتوافر اى آليه نقل بعد diff --git a/src/lang/basque.txt b/src/lang/basque.txt index 292cdcc0a7..20bfd34c67 100644 --- a/src/lang/basque.txt +++ b/src/lang/basque.txt @@ -198,6 +198,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}hp STR_UNITS_POWER_METRIC :{COMMA}{NBSP}hp STR_UNITS_POWER_SI :{COMMA}{NBSP}kW + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -371,10 +372,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Irten # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Jokoaren aukerak STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Ezarpenak -STR_SETTINGS_MENU_SCRIPT_SETTINGS :IA/Jokoaren scriptaren ezaugarriak STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF ezarpenak STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Transparentzia ezarpenak STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Herri izenak erakutsita @@ -916,36 +916,6 @@ STR_GAME_OPTIONS_CURRENCY_CUSTOM :Pertsonalizatua STR_GAME_OPTIONS_CURRENCY_GEL :Lari Georgiarra (GEL) STR_GAME_OPTIONS_CURRENCY_IRR :Rial Iraniarra (IRR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Ezkerretik gidatu -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Eskuinetik gidatu - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Herrien izenak -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Herrien izenen estiloak aukeratu - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Ingelesa (Jatorrizkoa) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Frantsesak -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Alemaniarrak -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Ingelesa (Adizionala) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Latino-Amerikarra -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Inozoak -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Suediarrak -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Herbeheretakoak -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finlandiarrak -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Poloniarrak -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Eslovakiarrak -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norvegiarrak -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Hungariarrak -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Austriarrak -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Errumaniarrak -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Txekoak -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Suitzarrak -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Danierarrak -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turkiarrak -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italiarrak -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Katalanak - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Auto-gordea STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Aukeratu jokoa automatikoki gordetzeko denbora @@ -970,11 +940,6 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :besteak -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Interfaze tamaina - -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normala -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Tamaina doblea -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Tamaina laukoitza @@ -1022,8 +987,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Aurreik STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 libra (£) zure dibisan STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Dibisa pertsonalaren ezaugarriak aldatu -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Gehienezko arerio kopurua: {ORANGE}{COMMA} - STR_NONE :Ezer ez STR_FUNDING_ONLY :Finantzazioa bakarrik STR_MINIMAL :Gutxienekoa @@ -1073,6 +1036,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Klima epeleko paisaia +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Klima artikoko paisaia +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Klima tropikaleko paisaia +STR_CLIMATE_TOYLAND_LANDSCAPE :Jostailu munduko paisaia + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Oso laua STR_TERRAIN_TYPE_FLAT :Laua @@ -1387,6 +1356,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Hobetua STR_CONFIG_SETTING_ROAD_SIDE :Errepideko garraioak: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Gidatzeko aldea aukeratu +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Ezkerretik gidatu +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Eskuinetik gidatu + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Garaiera maparen norabidea: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Erlojuko orratzen kontrara @@ -1814,7 +1787,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Seinaletan auto STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Trenak seinaleetan buelta ematea baimendu, denbora luzez itxaroten ari badira ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Gomendatua) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Gomendatua) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Ezarpenaren balioa aldatu @@ -1854,7 +1827,6 @@ STR_INTRO_HIGHSCORE :{BLACK}Puntuazi STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Ezarpenak STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF-ren Ezarpenak STR_INTRO_ONLINE_CONTENT :{BLACK}Edukiak Online Kontsultatu -STR_INTRO_SCRIPT_SETTINGS :{BLACK}IA/Joko Scripten Ezarpenak STR_INTRO_QUIT :{BLACK}Irten STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Joko berria hasi. Krtl+klik mapa konfigurazioa desgaitzen du @@ -1874,7 +1846,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Puntuazi STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Ezarpenak erakutsi STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}NewGRF ezarpenak erakutsi STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Bilatu eduki berria eta eguneratua deskargatzeko -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}IA/Joko Scripten Ezarpenak STR_INTRO_TOOLTIP_QUIT :{BLACK}'OpenTTD'-tik Irten STR_INTRO_TRANSLATION :{BLACK}Itzultze honi {NUM} string falta zaio/zaizkio. Mesedez OpenTTD hobeago egiten lagundu itzultzaile bezala aritzen. Ikusi readme.txt xehetasunentzako. @@ -1901,12 +1872,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Data al STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Aurtengo urtea aldatu STR_CHEAT_SETUP_PROD :{LTBLUE}Ekoizpen balioak aldatzea baimendu: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Klima epeleko paisaia -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Klima artikoko paisaia -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Klima tropikaleko paisaia -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Jostailu munduko paisaia - # Livery window STR_LIVERY_GENERAL_TOOLTIP :{BLACK}Erakutsi kolore eskema orokorrak @@ -2749,16 +2714,41 @@ STR_MAPGEN_WORLD_GENERATION_CAPTION :{WHITE}Mundua s STR_MAPGEN_MAPSIZE :{BLACK}Maparen tamaina: STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Herri kopurua: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Herrien izenak +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Herrien izenen estiloak aukeratu STR_MAPGEN_DATE :{BLACK}Data: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Industria kopurua: STR_MAPGEN_LAND_GENERATOR :{BLACK}Paisaia sortzailea: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Lur mota: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Itsaso kopurua: +STR_MAPGEN_SEA_LEVEL :{BLACK}Itsaso kopurua: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Errekak: STR_MAPGEN_SMOOTHNESS :{BLACK}Leuntasuna: STR_MAPGEN_VARIETY :{BLACK}Barietateen distribuzioa: STR_MAPGEN_GENERATE :{WHITE}Sortu +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Ingelesa (Jatorrizkoa) +STR_MAPGEN_TOWN_NAME_FRENCH :Frantsesak +STR_MAPGEN_TOWN_NAME_GERMAN :Alemaniarrak +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Ingelesa (Adizionala) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Latino-Amerikarra +STR_MAPGEN_TOWN_NAME_SILLY :Inozoak +STR_MAPGEN_TOWN_NAME_SWEDISH :Suediarrak +STR_MAPGEN_TOWN_NAME_DUTCH :Herbeheretakoak +STR_MAPGEN_TOWN_NAME_FINNISH :Finlandiarrak +STR_MAPGEN_TOWN_NAME_POLISH :Poloniarrak +STR_MAPGEN_TOWN_NAME_SLOVAK :Eslovakiarrak +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norvegiarrak +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Hungariarrak +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Austriarrak +STR_MAPGEN_TOWN_NAME_ROMANIAN :Errumaniarrak +STR_MAPGEN_TOWN_NAME_CZECH :Txekoak +STR_MAPGEN_TOWN_NAME_SWISS :Suitzarrak +STR_MAPGEN_TOWN_NAME_DANISH :Danierarrak +STR_MAPGEN_TOWN_NAME_TURKISH :Turkiarrak +STR_MAPGEN_TOWN_NAME_ITALIAN :Italiarrak +STR_MAPGEN_TOWN_NAME_CATALAN :Katalanak + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Maparen ertzak: STR_MAPGEN_NORTHWEST :{BLACK}Ipar mendebaldea @@ -2886,6 +2876,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Aldez au STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Aurreko grafiko arruntera joan, pseudo/birkoloretu/grafiko tipoak desgaituz STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Orain aukeratutako grafikoaren aurkezpena. Alineazioa ez da kontua hartzen grafiko hau egiterakoan STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Sprite-a mugitu ingurunean, X eta Y-ren desplazamenduak aldatuz. Ctrl+Klik sprite-a zortzi unitatero mugitzeko + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Erlatiboa berezarri STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Momentuan dauden desplazamendu erlatiboak erreseteatu STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X desplazamendua: {NUM}, Y desplazamendua: {NUM} (Absolutua) @@ -3389,6 +3383,8 @@ STR_PURCHASE_INFO_ALL_BUT :Guztia {CARGO_L STR_PURCHASE_INFO_MAX_TE :{BLACK}Gehienezko trakzio indarra: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Irismena: {GOLD}{COMMA} lauki +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Trenak aukeratzeko zerrenda - Klik xehetasunak ikusteko. Ctrl+Klik ibilgailu motaren ezkutapenaren artean aukeratzeko STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Errepide ibilbideak aukeratzeko zerrenda - Klik xehetasunak ikusteko @@ -4000,12 +3996,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Abiarazi STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}IA/Joko Script Garbitzailearen lehioa bakarrik zerbitzariarentzako erabilgarria da # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}IA/Joko Script-aren Ezarpenak STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Hurrengo jokoan kargatuko den Joko Script-a STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}Hurrengo jokoan kargatuko diren IA-k STR_AI_CONFIG_HUMAN_PLAYER :Jokalaria STR_AI_CONFIG_RANDOM_AI :Ausazko IA STR_AI_CONFIG_NONE :(ezer ez) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Gehienezko arerio kopurua: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Gora Mugitu STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Auratutako IA zerrendan gora igo @@ -4015,8 +4011,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Aukeratu STR_AI_CONFIG_GAMESCRIPT :{SILVER}Jokoaren Script-a STR_AI_CONFIG_AI :{SILVER}IAk -STR_AI_CONFIG_CHANGE :{BLACK}Aukeratu {STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :IA STR_AI_CONFIG_CHANGE_GAMESCRIPT :Script jokoa STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Bestelako script bat kargatu @@ -4040,9 +4034,7 @@ STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Ez aldat # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametroak STR_AI_SETTINGS_CAPTION_AI :IA -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Jokoaren Script-ak STR_AI_SETTINGS_CLOSE :{BLACK}Itxi STR_AI_SETTINGS_RESET :{BLACK}Berrabiarazi STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4443,6 +4435,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Ezin da STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... garraioa suntsituta + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Ez da ibilgailu erabilgarririk egongo STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Aldatu zure NewGRF konfigurazioa STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Ez dago ibilgailu erabilgarririk oraindik diff --git a/src/lang/belarusian.txt b/src/lang/belarusian.txt index 8c7298b2c1..40ad7021ce 100644 --- a/src/lang/belarusian.txt +++ b/src/lang/belarusian.txt @@ -511,6 +511,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}к STR_UNITS_POWER_METRIC :{COMMA}{NBSP}к.с. STR_UNITS_POWER_SI :{COMMA}{NBSP}кВт + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}т STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}т STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}кг @@ -691,10 +692,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Выхад # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Наладкі гульні STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Наладкі -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Наладкі ШІ / скрыпту STR_SETTINGS_MENU_NEWGRF_SETTINGS :Наладкі NewGRF STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Наладкі празрыстасьці STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Паказваць назвы гарадоў @@ -1254,36 +1254,6 @@ STR_GAME_OPTIONS_CURRENCY_CNY :Кітайск STR_GAME_OPTIONS_CURRENCY_HKD :Ганконскі даляр (HKD) STR_GAME_OPTIONS_CURRENCY_INR :Індыйская рупія (INR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Езьдзіць леваруч -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Езьдзіць праваруч - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Назвы гарадоў -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}На якой мове будуць назвы населеных пунктаў - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Анґельскія (арыґінальныя) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Францускія -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Нямецкія -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Анґельскія (дадатковыя) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Лацінаамэрыканскія -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Анґельскія (жартоўныя) -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Швэдзкія -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Нідэрляндзкія -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Фінскія -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Польскія -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Славацкія -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Нарвэскія -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Вугорскія -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Аўстрыйскія -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Румынскія -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Чэскія -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Швайцарскія -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Дацкія -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Турэцкія -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Італьянскія -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Каталёнскія - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Аўтазахаваньне STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Інтэрвал паміж аўтаматычнымі захаваньнямі гульні @@ -1308,18 +1278,8 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :Iншае -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Памер элементаў інтэрфейсу -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Выберыце памер элементаў інтэрфейсу -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Звычайны -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Падвоены -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Пачацвяроны -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Памер шрыфта -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Абярыце памер шрыфта, выкарыстоўванага ў гульні - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Звычайны -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Падвоены STR_GAME_OPTIONS_REFRESH_RATE :{BLACK}Чашчыня абнаўлення экрана @@ -1367,8 +1327,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Узо STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 брыт. фунтаў (£) у вашай валюце STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Зьмяніць парамэтр уласнай валюты -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Максымальная колькасьць канкурэнтаў: {ORANGE}{COMMA} - STR_NONE :Няма STR_FUNDING_ONLY :Будаваць самому STR_MINIMAL :Мінімальнае @@ -1418,6 +1376,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :умераны ляндшафт +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :субарктычны ляндшафт +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :субтрапічны ляндшафт +STR_CLIMATE_TOYLAND_LANDSCAPE :цацачны ляндшафт + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Вельмі пляскатая STR_TERRAIN_TYPE_FLAT :Раўнінная @@ -1759,6 +1723,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Палепша STR_CONFIG_SETTING_ROAD_SIDE :Рух аўтатранспарту: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Выберыце бок дарогі, па якому рухаецца аўтатранспарт +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Езьдзіць леваруч +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Езьдзіць праваруч + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Кручэньне мапы вышыняў: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :супраць руху гадзіньнікавай стрэлкі @@ -2255,7 +2223,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Аўтамат STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Дазволіць цягнікам разварочвацца перад сыґналамі, калі яны чакаюць доўгі час. ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(рэкамэндуецца) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(рэкамэндуецца) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Зьмяніць значэньне @@ -2296,7 +2264,6 @@ STR_INTRO_HIGHSCORE :{BLACK}Табл STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Наладкі STR_INTRO_NEWGRF_SETTINGS :{BLACK}Наладкi NewGRF STR_INTRO_ONLINE_CONTENT :{BLACK}Праверыць анлайн-кантэнт -STR_INTRO_SCRIPT_SETTINGS :{BLACK}Наладкі ШІ / скрыпту STR_INTRO_QUIT :{BLACK}Выхад STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Пачаць новую гульню. Ctrl+клік прапускае этап наладак мапы @@ -2316,7 +2283,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Пака STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Акно наладак STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Паказаць наладкі NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Праверыць новы й абноўлены кантэнт, каб спампаваць -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Зьмяніць наладкі ШІ ды гульнёвага скрыпту STR_INTRO_TOOLTIP_QUIT :{BLACK}Выйсьці з OpenTTD STR_INTRO_BASESET :{BLACK}У абраным наборы базавай графікі адсутнічае {NUM} спрайт{P "" а аў}. Калі ласка, абнавіце набор графікі. @@ -2346,12 +2312,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Зьм STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Зьмяніць бягучы год STR_CHEAT_SETUP_PROD :{LTBLUE}Дазволіць зьмяненьне прадукцыйнасьці: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :умераны ляндшафт -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :субарктычны ляндшафт -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :субтрапічны ляндшафт -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :цацачны ляндшафт - # Livery window STR_LIVERY_CAPTION :{WHITE}Колеры кампаніі «{COMPANY}» @@ -3269,18 +3229,43 @@ STR_MAPGEN_MAPSIZE :{BLACK}Паме STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Выберыце памер памы ў клетках. Колькасьць даступных клетак будзе трохі меншай STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Колькасьць гарадоў: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Назвы гарадоў +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}На якой мове будуць назвы населеных пунктаў STR_MAPGEN_DATE :{BLACK}Дата: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Колькасьць прадпрыемстваў: STR_MAPGEN_SNOW_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Паменшыць плошчу пяшчанага пакрыцця на 10% STR_MAPGEN_LAND_GENERATOR :{BLACK}Ґенэратар ляндшафту: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Тып ляндшафту: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Колькасьць азёраў/мораў: +STR_MAPGEN_SEA_LEVEL :{BLACK}Колькасьць азёраў/мораў: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Колькасьць рэк: STR_MAPGEN_SMOOTHNESS :{BLACK}Гладкасьць: STR_MAPGEN_VARIETY :{BLACK}Разнастайнасьць ляндшафту: STR_MAPGEN_GENERATE :{WHITE}Стварыць +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Анґельскія (арыґінальныя) +STR_MAPGEN_TOWN_NAME_FRENCH :Францускія +STR_MAPGEN_TOWN_NAME_GERMAN :Нямецкія +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Анґельскія (дадатковыя) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Лацінаамэрыканскія +STR_MAPGEN_TOWN_NAME_SILLY :Анґельскія (жартоўныя) +STR_MAPGEN_TOWN_NAME_SWEDISH :Швэдзкія +STR_MAPGEN_TOWN_NAME_DUTCH :Нідэрляндзкія +STR_MAPGEN_TOWN_NAME_FINNISH :Фінскія +STR_MAPGEN_TOWN_NAME_POLISH :Польскія +STR_MAPGEN_TOWN_NAME_SLOVAK :Славацкія +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Нарвэскія +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Вугорскія +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Аўстрыйскія +STR_MAPGEN_TOWN_NAME_ROMANIAN :Румынскія +STR_MAPGEN_TOWN_NAME_CZECH :Чэскія +STR_MAPGEN_TOWN_NAME_SWISS :Швайцарскія +STR_MAPGEN_TOWN_NAME_DANISH :Дацкія +STR_MAPGEN_TOWN_NAME_TURKISH :Турэцкія +STR_MAPGEN_TOWN_NAME_ITALIAN :Італьянскія +STR_MAPGEN_TOWN_NAME_CATALAN :Каталёнскія + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Краі мапы: STR_MAPGEN_NORTHWEST :{BLACK}Паўночны захад @@ -3419,6 +3404,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Папя STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Перайсьці да папярэдняга звычайнага спрайта, прапускаючы змяняючыя колер, шрыфтавыя, псэўдаспрайты. Пераход з пачатку сьпісу да апошняга спрайта. STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Прадстаўленьне выбранага спрайта. Выраўноўваньне не ўлічваецца пры прарысоўцы гэтага спрайта. STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Рухайце спрайт, зьмяняючы зрушэньне па X і па Y. Ctrl+пстрычка, каб зрушыць спрайт на восем адзінак за раз + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Скід зрушэння STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Скінуць значэнні адноснага зрушэння STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}Зрушэнне X: {NUM}; зрушэнне Y: {NUM} (абсалютнае) @@ -3956,6 +3945,8 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Макс STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Далёкасьць: {GOLD}{COMMA} клет{P ка кi ак} STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Тып паветр. судна: {GOLD}{STRING} +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Сьпіс лакаматываў і вагонаў - пстрыкніце для атрыманьня інфармацыі. Ctrl+пстрычка схавае/пакажа ТС. STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Сьпіс аўтатранспарту - пстрыкніце для атрыманьня інфармацыі. Ctrl+пстрычка схавае/пакажа выбраны аўтамабіль. @@ -4616,12 +4607,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Адзі STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Вакно адладкі ШІ / скрыпту даступна толькі для сэрвэра # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Канфігурацыя ШІ / скрыпту STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Гульнёвы скрыпт, які будзе загружаны ў наступнай гульні STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}Модулі ШІ, якія будуць загружаны ў наступнай гульні STR_AI_CONFIG_HUMAN_PLAYER :Чалавек STR_AI_CONFIG_RANDOM_AI :Выпадковы ШI STR_AI_CONFIG_NONE :(няма) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Максымальная колькасьць канкурэнтаў: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Уверх STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Перамясьціць гэты модуль ШI ўверх па сьпісе @@ -4631,8 +4622,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Пера STR_AI_CONFIG_GAMESCRIPT :{SILVER}Гульнёвы скрыпт STR_AI_CONFIG_AI :{SILVER}ШI -STR_AI_CONFIG_CHANGE :{BLACK}Выбраць {STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :ШI STR_AI_CONFIG_CHANGE_GAMESCRIPT :Гульнёвы скрыпт STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Загрузіць іншы скрыпт @@ -4657,9 +4646,7 @@ STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Не з STR_SCREENSHOT_ZOOMIN_SCREENSHOT :{BLACK}Бачная вобласць у максімальным набліжэнні # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}Параметры {STRING} STR_AI_SETTINGS_CAPTION_AI :ШI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Гульнёвы скрыпт STR_AI_SETTINGS_CLOSE :{BLACK}Закрыць STR_AI_SETTINGS_RESET :{BLACK}Ськід STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -5067,6 +5054,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Не а STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... транспартны сродак зьнішчаны + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Усе транспартныя сродкі будуць недаступныя STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Зьмяніце канфігурацыю модуля NewGRF STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Няма даступных транспартных сродкаў diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index 59eb341e50..feeac8f9cf 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -201,6 +201,16 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}hp STR_UNITS_POWER_METRIC :{COMMA}{NBSP}cv STR_UNITS_POWER_SI :{COMMA}{NBSP}kW +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_SI :{DECIMAL}{NBSP}hp/Mg +STR_UNITS_POWER_METRIC_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_SI :{DECIMAL}{NBSP}hp/Mg +STR_UNITS_POWER_SI_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_SI :{DECIMAL}{NBSP}W/kg + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}T STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -227,8 +237,8 @@ STR_UNITS_HEIGHT_SI :{COMMA}{NBSP}m # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtro: -STR_LIST_FILTER_OSKTITLE :{BLACK}Digite o filtro de série -STR_LIST_FILTER_TOOLTIP :{BLACK}Digite uma palavra-chave para filtrar a lista +STR_LIST_FILTER_OSKTITLE :{BLACK}Insira uma ou mais palavras-chave para filtrar a lista +STR_LIST_FILTER_TOOLTIP :{BLACK}Insira uma ou mais palavras-chave para filtrar a lista STR_TOOLTIP_GROUP_ORDER :{BLACK}Selecionar ordem de agrupamento STR_TOOLTIP_SORT_ORDER :{BLACK}Selecione ordem de classificação (descendente/ascendente) @@ -379,7 +389,7 @@ STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Contruç STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Construção de trilho de bonde STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Plantar árvores. Shift alterna construção/exibição de preço estimado STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Colocar placa -STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Colocar objeto. Shift alterna construção/preço estimado +STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Colocar objeto. Ctrl seleciona a área na diagonal. Shift alterna construir/mostrar estimativa de custo # Scenario editor file menu ###length 7 @@ -392,10 +402,11 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Sair # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Opções do jogo STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Configurações -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Configurações de IA /Script do jogo +STR_SETTINGS_MENU_AI_SETTINGS :Definições de IA +STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :Definições de script do jogo STR_SETTINGS_MENU_NEWGRF_SETTINGS :Definições do NewGRF STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Opções de Transparência STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Nomes de cidades exibidos @@ -735,7 +746,7 @@ STR_SMALLMAP_TOOLTIP_SHOW_INDUSTRIES_ON_MAP :{BLACK}Exibir i STR_SMALLMAP_TOOLTIP_SHOW_LINK_STATS_ON_MAP :{BLACK}Exibir fluxo de carga no mapa STR_SMALLMAP_TOOLTIP_SHOW_TRANSPORT_ROUTES_ON :{BLACK}Exibir rotas de transporte no mapa STR_SMALLMAP_TOOLTIP_SHOW_VEGETATION_ON_MAP :{BLACK}Exibir vegetação no mapa -STR_SMALLMAP_TOOLTIP_SHOW_LAND_OWNERS_ON_MAP :{BLACK}Exibir proprietários de terreno no mapa +STR_SMALLMAP_TOOLTIP_SHOW_LAND_OWNERS_ON_MAP :{BLACK}Exibir proprietários de terrenos no mapa STR_SMALLMAP_TOOLTIP_INDUSTRY_SELECTION :{BLACK}Clique em um tipo de indústria para alternar sua exibição. Ctrl+Clique desabilita todos os tipos exceto a selecionada. Ctrl+Clique nela novamente para habilitar todos os tipos de indústrias STR_SMALLMAP_TOOLTIP_COMPANY_SELECTION :{BLACK}Clique em uma compania para alternar a exibição de suas propriedades. Ctrl+Clique desabilita todas as companias exceto a selecionada. Ctrl+Clique nela novamente para habilitar todas as companias STR_SMALLMAP_TOOLTIP_CARGO_SELECTION :{BLACK}Clique numa carga para alternar a exibição de sua propriedade. Ctrl+Clique desativa todas as cargas exceto a selecionada. Ctrl+Clique novamente para exibir todas @@ -966,36 +977,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Rúpia Indiana STR_GAME_OPTIONS_CURRENCY_IDR :Rupia Indonésia (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Ringgit Malaio (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Dirigem na esquerda -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Dirigem na direita - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Nome das cidades: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Selecionar o estilo dos nomes das cidades - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Inglês (Original) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Francês -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Alemão -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Inglês (Adicional) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Latino-Americano -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Idiota -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Sueco -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Holandês -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finlandês -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Polonês -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Eslovaco -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norueguês -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Húngaro -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Austríaco -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Romeno -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Checo -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Suiço -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Dinamarquês -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turco -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italiano -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Catalão - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Salvar automaticamente STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Selecionar o intervalo entre jogos salvos automaticos @@ -1026,23 +1007,21 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}A config STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Marque esta caixa para habilitar o v-sync na tela. Qualquer mudança nesta configuração só será aplicada após reiniciar o jogo. Só funciona com a aceleração de hardware habilitada -STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Motorista atual: {STRING} +STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Driver de vídeo atual: {STRING} -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Tamanho da interface -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Selecione o tamanho de elemento de interface a ser usado +STR_GAME_OPTIONS_GUI_SCALE_FRAME :{BLACK}Tamanho da interface +STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Arraste o controle deslizante para definir o tamanho do interface. Mantenha pressionada a tecla Ctrl para um ajuste contínuo +STR_GAME_OPTIONS_GUI_SCALE_AUTO :{BLACK}Detectar tamanho automaticamente +STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Marque esta caixa para detectar o tamanho da interface automaticamente -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(detecção automática) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Dobro -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Quádruplo +STR_GAME_OPTIONS_GUI_SCALE_BEVELS :{BLACK}Escalar de chanfros +STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :{BLACK}Marque esta caixa para dimensionar os chanfros por tamanho de interface -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Tamanho da fonte -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Selecione o tamanho da fonte da interface a ser usado - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(detecção automática) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Tamanho duplo -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Tamanho quádruplo +STR_GAME_OPTIONS_GUI_SCALE_1X :1x +STR_GAME_OPTIONS_GUI_SCALE_2X :2x +STR_GAME_OPTIONS_GUI_SCALE_3X :3x +STR_GAME_OPTIONS_GUI_SCALE_4X :4x +STR_GAME_OPTIONS_GUI_SCALE_5X :5x STR_GAME_OPTIONS_GRAPHICS :{BLACK}Gráficos @@ -1094,8 +1073,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Previs STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 Libras (£) na sua moeda STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Alterar o parâmetro de moeda personalizada -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Número máximo de concorrentes: {ORANGE}{COMMA} - STR_NONE :Nenhum STR_FUNDING_ONLY :Apenas financiamento STR_MINIMAL :Mínimo @@ -1145,6 +1122,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :terreno temperado +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :terreno subártico +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :terreno subtropical +STR_CLIMATE_TOYLAND_LANDSCAPE :terreno 'toyland' + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Muito Plano STR_TERRAIN_TYPE_FLAT :Plano @@ -1450,6 +1433,8 @@ STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Espessura da li STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :Mostrar o nome do NewGRF na janela de comprar veículos: {STRING} STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Adicione uma linha à janela de construção do veículo, mostrando de qual NewGRF o veículo selecionado vem. +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS :Mostrar as cargas que os veículos podem transportar nas janelas de listagem {STRING} +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS_HELPTEXT :Quando ativado, a carga transportável do veículo aparecerá acima dela nas listas de veículos STR_CONFIG_SETTING_LANDSCAPE :Terreno: {STRING} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :O terreno define a jogabilidade básica com diferentes cargas e requerimentos para o crescimento das cidades. NewGRF's e Scripts de Jogo permitem um controle mais fino @@ -1504,6 +1489,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Melhorado STR_CONFIG_SETTING_ROAD_SIDE :Automóveis: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Escolha a mão de direção +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Dirigem na esquerda +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Dirigem na direita + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Rotação do mapa topográfico: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Sentido Anti-Horário @@ -2038,7 +2027,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Reversão autom STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Permite trens reverterem sentido num sinal, se estiverem aguardando por muito tempo ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Recomendado) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Recomendado) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Alterar valor @@ -2081,7 +2070,8 @@ STR_INTRO_HIGHSCORE :{BLACK}Pontuaç STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Configurações STR_INTRO_NEWGRF_SETTINGS :{BLACK}Configurar NewGRF STR_INTRO_ONLINE_CONTENT :{BLACK}Checar conteúdo on-line -STR_INTRO_SCRIPT_SETTINGS :{BLACK}Configurações de IA / Script do jogo +STR_INTRO_AI_SETTINGS :{BLACK}Definições de IA +STR_INTRO_GAMESCRIPT_SETTINGS :{BLACK}Definições de Script do Jogo STR_INTRO_QUIT :{BLACK}Sair STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Iniciar um novo jogo. Ctrl+Clique para pular a configuração do mapa @@ -2101,7 +2091,8 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Exibe as STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Config. de exibição STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Exibir configs. dos NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Checar por conteúdo novo e atualizado para baixar -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Exibe configurações de IA e script do jogo +STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Mostrar definições de IA +STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Mostrar definições de Script do Jogo STR_INTRO_TOOLTIP_QUIT :{BLACK}Sair do 'OpenTTD' STR_INTRO_BASESET :{BLACK}Faltam {NUM} "sprite{P "" s}" no conjunto de gráficos base selecionado. Por favor verifique se há atualizações para ele. @@ -2133,12 +2124,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Alterar STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Mudar ano atual STR_CHEAT_SETUP_PROD :{LTBLUE}Ativar modificação de valores de produção: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :terreno temperado -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :terreno subártico -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :terreno subtropical -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :terreno 'toyland' - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Esquema de cores @@ -2498,13 +2483,13 @@ STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :aguardando atua STR_NETWORK_MESSAGE_CLIENT_LEAVING :saindo STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} entrou no jogo -STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {STRING} entrou no jogo (Client #{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} entrou na companhia #{2:NUM} +STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {0:STRING} entrou no jogo (Client #{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {0:STRING} entrou na empresa #{2:NUM} STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} está assistindo ao jogo -STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} abriu uma nova companhia (#{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} saiu do jogo ({2:STRING}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {0:STRING} iniciou uma nova empresa (#{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {0:STRING} saiu do jogo ({2:STRING}) STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} mudou seu nome para {STRING} -STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} deu {2:CURRENCY_LONG} a {1:STRING} +STR_NETWORK_MESSAGE_GIVE_MONEY :*** {0:STRING} deu {2:CURRENCY_LONG} a {1:STRING} STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}O servidor fechou a sessão STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}O servidor está reiniciando...{}Aguarde... STR_NETWORK_MESSAGE_KICKED :*** {STRING} foi kickado. Motivo: ({STRING}) @@ -2515,7 +2500,7 @@ STR_NETWORK_ERROR_COORDINATOR_ISOLATED :{WHITE}Seu serv STR_NETWORK_ERROR_COORDINATOR_ISOLATED_DETAIL :{WHITE}Outros jogadores não poderão se conectar ao seu servidor # Content downloading window -STR_CONTENT_TITLE :{WHITE}Baixando conteúdo +STR_CONTENT_TITLE :{WHITE}Download de conteúdo STR_CONTENT_TYPE_CAPTION :{BLACK}Tipo STR_CONTENT_TYPE_CAPTION_TOOLTIP :{BLACK}Tipo do conteúdo STR_CONTENT_NAME_CAPTION :{BLACK}Nome @@ -2537,7 +2522,7 @@ STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}Visitar STR_CONTENT_DOWNLOAD_CAPTION :{BLACK}Baixar STR_CONTENT_DOWNLOAD_CAPTION_TOOLTIP :{BLACK}Baixa o conteúdo selecionado STR_CONTENT_TOTAL_DOWNLOAD_SIZE :{SILVER}Tamanho total do download: {WHITE}{BYTES} -STR_CONTENT_DETAIL_TITLE :{SILVER}INFO DO CONT. +STR_CONTENT_DETAIL_TITLE :{SILVER}INFORMAÇÕES DO CONTEÚDO ###length 5 STR_CONTENT_DETAIL_SUBTITLE_UNSELECTED :{SILVER}Você não selecionou para ser baixado @@ -2619,6 +2604,9 @@ STR_LINKGRAPH_LEGEND_SATURATED :{TINY_FONT}{BLA STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLACK}sobrecarregado # Linkgraph tooltip +STR_LINKGRAPH_STATS_TOOLTIP :{BLACK}{CARGO_LONG} a ser transportado mensalmente de {STATION} para {STATION} ({COMMA}% da capacidade){STRING} +STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} para ser transportado de volta ({COMMA}% da capacidade) +STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}Tempo médio de viagem: {NUM}{NBSP}dia{P "" s} # Base for station construction window(s) STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Destacar cobertura @@ -2628,6 +2616,7 @@ STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP :{BLACK}Não des STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP :{BLACK}Destacar área de cobertura da construção proposta STR_STATION_BUILD_ACCEPTS_CARGO :{BLACK}Aceita: {GOLD}{CARGO_LIST} STR_STATION_BUILD_SUPPLIES_CARGO :{BLACK}Suprimentos: {GOLD}{CARGO_LIST} +STR_STATION_BUILD_INFRASTRUCTURE_COST :{BLACK}Custo de manutenção: {GOLD}{CURRENCY_SHORT}/ano # Join station window STR_JOIN_STATION_CAPTION :{WHITE}Unir estação @@ -2815,11 +2804,11 @@ STR_LANDSCAPING_TOOLBAR :{WHITE}Terreno STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}Baixar um canto do terreno. Arrastar abaixa o primeiro canto selecionado e nivela a área selecionada à altura do novo canto. CTRL seleciona a área diagonalmente. Shift alterna construção/preço estimado STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND :{BLACK} Elevar um canto do terreno. Arrastar eleva o primeiro canto selecionado e nivela a área selecionada à nova altura do canto. Ctrl seleciona a área diagonalmente. Shift alterna contrução/preço estimado STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Nivelar uma área do terreno à altura do primeiro canto selecionado. Ctrl seleciona uma área diagonalmente. Shift alterna contrução/preço estimado -STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Comprar terreno para uso futuro. Shift altera construção/preço estimado +STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Comprar terreno para uso futuro. Ctrl seleciona a área na diagonal. Shift alterna construir/mostrar estimativa de custo # Object construction window STR_OBJECT_BUILD_CAPTION :{WHITE}Seleção de Objeto -STR_OBJECT_BUILD_TOOLTIP :{BLACK}Selecione o objeto a ser construído. Shift alterna construção/preço estimado +STR_OBJECT_BUILD_TOOLTIP :{BLACK}Selecione o objeto para construir. Ctrl seleciona a área na diagonal. Shift alterna construir/mostrar estimativa de custo STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}Selecione uma categoria de objeto para construir STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}Pré-visualização do objeto STR_OBJECT_BUILD_SIZE :{BLACK}Tamanho: {GOLD}{NUM} x {NUM} quadrados @@ -2833,13 +2822,13 @@ STR_PLANT_TREE_TOOLTIP :{BLACK}Selecion STR_TREES_RANDOM_TYPE :{BLACK}Árvores de tipo aleatório STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Plantar árvores de tipo aleatório, Shift alterna entre construção/preço estimado STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Plantar Aleatoriamente -STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Planta árvores aleatoriamente pelo terreno +STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Plantar árvores aleatoriamente pelo terreno STR_TREES_MODE_NORMAL_BUTTON :{BLACK}Normal STR_TREES_MODE_NORMAL_TOOLTIP :{BLACK}Planta árvores isoladas ao arrastar pelo terreno. STR_TREES_MODE_FOREST_SM_BUTTON :{BLACK}Bosque -STR_TREES_MODE_FOREST_SM_TOOLTIP :{BLACK}Planta pequenas florestas ao arrastar pelo terreno. +STR_TREES_MODE_FOREST_SM_TOOLTIP :{BLACK}Plantar pequenas florestas ao arrastar sobre o terreno. STR_TREES_MODE_FOREST_LG_BUTTON :{BLACK}Floresta -STR_TREES_MODE_FOREST_LG_TOOLTIP :{BLACK}Planta florestas grandes ao arrastar pelo terreno. +STR_TREES_MODE_FOREST_LG_TOOLTIP :{BLACK}Plantar florestas grandes ao arrastar pelo terreno. # Land generation window (SE) STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}Gerar Terreno @@ -2863,6 +2852,7 @@ STR_FOUND_TOWN_RANDOM_TOWN_BUTTON :{BLACK}Cidade A STR_FOUND_TOWN_RANDOM_TOWN_TOOLTIP :{BLACK}Constrói cidade num local aleatório STR_FOUND_TOWN_MANY_RANDOM_TOWNS :{BLACK}Várias cidades aleatórias STR_FOUND_TOWN_RANDOM_TOWNS_TOOLTIP :{BLACK}Cobrir o mapa com cidades colocadas aleatoriamente +STR_FOUND_TOWN_EXPAND_ALL_TOWNS_TOOLTIP :{BLACK}Fazer com que todas as cidades cresçam ligeiramente STR_FOUND_TOWN_NAME_TITLE :{YELLOW}Nome da cidade: STR_FOUND_TOWN_NAME_EDITOR_TITLE :{BLACK}Coloque o nome da cidade @@ -3141,6 +3131,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Dimensõ STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Seleciona o tamanho do mapa em quadrados. O número de quadrados disponíveis será um pouco menor STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}No. de cidades: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Nome das cidades: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Selecionar o estilo dos nomes das cidades STR_MAPGEN_DATE :{BLACK}Data: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}No. de indústrias: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Pico mais alto: @@ -3156,11 +3148,40 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Diminuir STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Gerador de terra STR_MAPGEN_TERRAIN_TYPE :{BLACK}Tipo de terreno -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Nível do mar: +STR_MAPGEN_SEA_LEVEL :{BLACK}Nível do mar: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Rios: STR_MAPGEN_SMOOTHNESS :{BLACK}Regularidade STR_MAPGEN_VARIETY :{BLACK}Distribuição da variedade STR_MAPGEN_GENERATE :{WHITE}Gerar +STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}Definições de NewGRF +STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Mostrar definições de NewGRF +STR_MAPGEN_AI_SETTINGS :{BLACK}Definições de IA +STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Mostrar definições de IA +STR_MAPGEN_GS_SETTINGS :{BLACK}Definições de Script do Jogo +STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Mostrar definições de script do jogo + +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Inglês (Original) +STR_MAPGEN_TOWN_NAME_FRENCH :Francês +STR_MAPGEN_TOWN_NAME_GERMAN :Alemão +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Inglês (Adicional) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Latino-Americano +STR_MAPGEN_TOWN_NAME_SILLY :Idiota +STR_MAPGEN_TOWN_NAME_SWEDISH :Sueco +STR_MAPGEN_TOWN_NAME_DUTCH :Holandês +STR_MAPGEN_TOWN_NAME_FINNISH :Finlandês +STR_MAPGEN_TOWN_NAME_POLISH :Polonês +STR_MAPGEN_TOWN_NAME_SLOVAK :Eslovaco +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norueguês +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Húngaro +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Austríaco +STR_MAPGEN_TOWN_NAME_ROMANIAN :Romeno +STR_MAPGEN_TOWN_NAME_CZECH :Checo +STR_MAPGEN_TOWN_NAME_SWISS :Suiço +STR_MAPGEN_TOWN_NAME_DANISH :Dinamarquês +STR_MAPGEN_TOWN_NAME_TURKISH :Turco +STR_MAPGEN_TOWN_NAME_ITALIAN :Italiano +STR_MAPGEN_TOWN_NAME_CATALAN :Catalão # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Bordas do mapa: @@ -3306,6 +3327,13 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}"Sprite" STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Retorna ao "sprite" normal anterior, pulando quaisquer "sprites" falsos, recoloridos ou de fontes, e junta tudo do primeiro ao último STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Representação do "sprite" atualmente selecionado. O alinhamento é ignorado ao desenhar esse "sprite" STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Move o "sprite", alterando os offsets X e Y. Ctrl+Clique para mover o sprite 8 unidades por vez + +###length 2 +STR_SPRITE_ALIGNER_CENTRE_OFFSET :{BLACK}Deslocamento centralizado +STR_SPRITE_ALIGNER_CENTRE_SPRITE :{BLACK}Sprite centralizado + +STR_SPRITE_ALIGNER_CROSSHAIR :{BLACK}Mira + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Resetar relativo STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Reseta os offsets relativos atuais STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X offset: {NUM}, Y offset: {NUM} (Absoluto) @@ -3324,14 +3352,14 @@ STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Um erro STR_NEWGRF_ERROR_POPUP :{WHITE}Um erro NewGRF ocorreu:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} não irá funcionar com a versão do TTDPatch encontrada pelo OpenTTD STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} funciona na versão {STRING} de TTD -STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} é projetado para ser usado com {STRING} -STR_NEWGRF_ERROR_INVALID_PARAMETER :parâmetro inválido para {1:STRING}: parâmetro {STRING} ({NUM}) -STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} deve ser carregado antes de {STRING} -STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} deve ser carregado depois de {STRING} -STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} requer versão {STRING} ou maior do OpenTTD +STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} é projetado para ser usado com {2:STRING} +STR_NEWGRF_ERROR_INVALID_PARAMETER :Parâmetro inválido para {1:STRING}: parâmetro {2:STRING} ({3:NUM}) +STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} deve ser carregado antes de {2:STRING} +STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} deve ser carregado depois de {2:STRING} +STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} requer versão {STRING} ou superior do OpenTTD STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :o arquivo GRF foi designado para tradução STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Muitas NewGRFs estão carregadas -STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Carregar {1:STRING} como um NewGRF estático em conjunto com {STRING} pode causar desincronias +STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Carregar {1:STRING} como NewGRF estático com {2:STRING} pode causar dessincronizações STR_NEWGRF_ERROR_UNEXPECTED_SPRITE :"Sprite" inesperado (sprite {3:NUM}) STR_NEWGRF_ERROR_UNKNOWN_PROPERTY :Propriedade de Ação Desconhecida 0 {4:HEX} (sprite {3:NUM}) STR_NEWGRF_ERROR_INVALID_ID :Tentativa de uso de ID inválido (sprite {3:NUM}) @@ -3463,14 +3491,14 @@ STR_LOCAL_AUTHORITY_ACTION_EXCLUSIVE_TRANSPORT :Comprar exclusi STR_LOCAL_AUTHORITY_ACTION_BRIBE :Subornar a prefeitura ###length 8 -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{YELLOW}Iniciar uma pequena campanha publicitária local, para atrair mais passageiros e cargas para seus serviços de transporte.{}Fornece um aumento temporário na avaliação da estação em um pequeno raio ao redor do centro da cidade.{}Preço: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{YELLOW}Iniciar uma campanha publicitária média, para atrair mais passageiros e cargas para seus serviços de transporte.{}Fornece um aumento temporário na avaliação da estação em um raio médio ao redor do centro da cidade.{}Preço: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{YELLOW}Iniciar uma grande campanha publicitária, para atrair mais passageiros e cargas para seus serviços de transporte.{}Fornece um aumento temporário na avaliação da estação em um grande raio ao redor do centro da cidade.{}Preço: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{YELLOW}Financiar a reconstrução da malha rodoviária urbana.{}Causa engarrafamentos consideráveis ao tráfego por até 6 meses.{}Preço: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{YELLOW}Construir uma estátua em homenagem à sua empresa.{}Fornece um aumento permanente na avaliação da estação nesta cidade.{}Preço: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{YELLOW}Financiar a construção de edifícios comerciais novos na cidade.{}Fornece um aumento temporário do crescimento da cidade nesta cidade.{}Preço: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW}Comprar a exclusividade dos serviços durante 1 ano na cidade.{}A prefeitura da cidade não permitirá que passageiros e cargas usem as estações de seus concorrentes.{}Preço: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Subornar a prefeitura para aumentar a sua avaliação, correndo o risco de uma penalidade severa se apanhado.{}Preço: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{YELLOW}Iniciar uma pequena campanha publicitária local, para atrair mais passageiros e cargas para seus serviços de transporte.{}Fornece um aumento temporário na avaliação da estação em um pequeno raio ao redor do centro da cidade.{}Custo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{YELLOW}Iniciar uma campanha publicitária média, para atrair mais passageiros e cargas para seus serviços de transporte.{}Fornece um aumento temporário na avaliação da estação em um raio médio ao redor do centro da cidade.{}Custo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}Iniciar uma grande campanha publicitária, para atrair mais passageiros e cargas para seus serviços de transporte.{}Fornece um aumento temporário na avaliação da estação em um grande raio ao redor do centro da cidade{}{POP_COLOUR}Custo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{PUSH_COLOUR}{YELLOW}Financiar obras de reconstrução da malha rodoviária urbana.{}Causa engarrafamentos consideráveis ao tráfego por até 6 meses.{}{POP_COLOUR}Custo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Construir uma estátua em homenagem à sua empresa.{}Fornece um aumento permanente na classificação da estação nesta cidade..{}{POP_COLOUR}Custo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Financiar a construção de novos edifícios na cidade.{}Providencia um aumento temporário no crescimento desta cidade.{}{POP_COLOUR}Custo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}Comprar a exclusividade dos serviços durante 1 ano na cidade.{}A prefeitura da cidade não permitirá que passageiros e cargas utilizem as estações de seus concorrentes..{}{POP_COLOUR}Custo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Subornar a autoridade local para aumentar a sua avaliação, correndo o risco de uma penalidade severa se for pego.{}{POP_COLOUR}Custo: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}{COMPANY} Objetivos @@ -3643,15 +3671,18 @@ STR_FINANCES_SECTION_SHIP_REVENUE :{GOLD}Navios STR_FINANCES_SECTION_LOAN_INTEREST :{GOLD}Juros do Empréstimo STR_FINANCES_SECTION_OTHER :{GOLD}Outros +STR_FINANCES_TOTAL_CAPTION :{WHITE}Total STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} +STR_FINANCES_ZERO_INCOME :{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} -STR_FINANCES_NET_PROFIT :{WHITE}Lucro Líquido +STR_FINANCES_PROFIT :{WHITE}Lucro STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Balanço Bancário STR_FINANCES_OWN_FUNDS_TITLE :{WHITE}Fundos Próprios STR_FINANCES_LOAN_TITLE :{WHITE}Empréstimo STR_FINANCES_INTEREST_RATE :{WHITE}Juro do Empréstimo: {BLACK}{NUM}% STR_FINANCES_MAX_LOAN :{WHITE}Empréstimo Máximo: {BLACK}{CURRENCY_LONG} STR_FINANCES_TOTAL_CURRENCY :{BLACK}{CURRENCY_LONG} +STR_FINANCES_BANK_BALANCE :{WHITE}{CURRENCY_LONG} STR_FINANCES_BORROW_BUTTON :{BLACK}Pedir {CURRENCY_LONG} STR_FINANCES_BORROW_TOOLTIP :{BLACK}Pedir empréstimo. Ctrl+Clique pede o máximo possível STR_FINANCES_REPAY_BUTTON :{BLACK}Pagar {CURRENCY_LONG} @@ -3752,7 +3783,7 @@ STR_INDUSTRY_VIEW_PRODUCES_N_CARGO :{BLACK}Produz: STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :, {STRING}{STRING} STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Necessita: -STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{0:STRING}{BLACK}{3:STRING} STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} aguardando{STRING} STR_CONFIG_GAME_PRODUCTION :{WHITE}Modificar produção (múltiplo de 8, até 2040) @@ -3782,6 +3813,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Envia in STR_VEHICLE_LIST_REPLACE_VEHICLES :Substituir veículos STR_VEHICLE_LIST_SEND_FOR_SERVICING :Enviar para Manutenção STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Lucro anual: {CURRENCY_LONG} (último ano: {CURRENCY_LONG}) +STR_VEHICLE_LIST_CARGO :{TINY_FONT}{BLACK}[{CARGO_LIST}] +STR_VEHICLE_LIST_NAME_AND_CARGO :{TINY_FONT}{BLACK}{STRING} {STRING} STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Enviar para Depósito STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Enviar para Garagem @@ -3873,6 +3906,11 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Tração STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Alcance: {GOLD}{COMMA} quadrados STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Tipo de aeronave: {GOLD}{STRING} +###length 3 +STR_CARGO_TYPE_FILTER_ALL :Todos os tipos de carga +STR_CARGO_TYPE_FILTER_FREIGHT :Frete +STR_CARGO_TYPE_FILTER_NONE :Nenhum + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Lista de trens - clique num trem para informações. Cltr+Clique para alterar a visibilidade do tipo de trem STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Lista de automóveis - clique num automóvel para informações. Cltr+Clique para alterar a visibilidade do tipo de automóvel @@ -4041,7 +4079,7 @@ STR_ENGINE_PREVIEW_AIRCRAFT :aeronave STR_ENGINE_PREVIEW_SHIP :embarcação STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Preço: {CURRENCY_LONG} Peso: {WEIGHT_SHORT}{}Velocidade: {VELOCITY} Potência: {POWER}{}Custo de manutenção: {CURRENCY_LONG}/ano{}Capacidade: {CARGO_LONG} -STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Preço: {CURRENCY_LONG} Peso: {WEIGHT_SHORT}{}Vel.: {VELOCITY} Potência: {POWER} Tração Máx: {6:FORCE}{}Custo de manutenção: {4:CURRENCY_LONG}/yr{}Capacidade: {5:CARGO_LONG} +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Custo: {0:CURRENCY_LONG} Peso: {1:WEIGHT_SHORT}{}Velocidade: {2:VELOCITY} Potência: {3:POWER} Tração Máx: {6:FORCE}{}Custo de Operação: {4:CURRENCY_LONG}/ano{}Capacidade: {5:CARGO_LONG} STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Preço: {CURRENCY_LONG} Vel. Max.: {VELOCITY}{}Capacidade: {CARGO_LONG}{}Custo de manuteção: {CURRENCY_LONG}/ano STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Custo: {CURRENCY_LONG} Vel Máx.: {VELOCITY}{}Tipo de aeronave: {STRING}{}Capacidade: {CARGO_LONG}, {CARGO_LONG}{}Custo de oper.: {CURRENCY_LONG}/ano STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Custo: {CURRENCY_LONG} Vel Máx.: {VELOCITY}{}Tipo de aeronave: {STRING}{}Capacidade: {CARGO_LONG}{}Custo de oper.: {CURRENCY_LONG}/ano @@ -4200,11 +4238,12 @@ STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Peso: {L STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Peso: {LTBLUE}{WEIGHT_SHORT} {BLACK}Força: {LTBLUE}{POWER}{BLACK} Velocidade Max: {LTBLUE}{VELOCITY} {BLACK}Max. T.E.: {LTBLUE}{FORCE} STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Lucros desse ano: {LTBLUE}{CURRENCY_LONG} (ano passado: {CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Lucro deste ano: {LTBLUE}{CURRENCY_LONG} (último ano: {CURRENCY_LONG}) {BLACK}Performance min.: {LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Confiabilidade: {LTBLUE}{COMMA}% {BLACK}Quebras desde a última manutenção: {LTBLUE}{COMMA} STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Construído: {LTBLUE}{NUM}{BLACK} Valor: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_INFO_NO_CAPACITY :{BLACK}Capacidade: {LTBLUE}Nenhuma{STRING} -STR_VEHICLE_INFO_CAPACITY :{BLACK}Capacidade: {LTBLUE}{CARGO_LONG}{3:STRING} +STR_VEHICLE_INFO_CAPACITY :{BLACK}Capacidade: {LTBLUE}{0:CARGO_LONG}{3:STRING} STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Capacidade: {LTBLUE}{CARGO_LONG}{3:STRING} (x{4:NUM}) STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Capacidade: {LTBLUE}{CARGO_LONG}, {CARGO_LONG}{STRING} @@ -4471,7 +4510,7 @@ STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Este hor STR_TIMETABLE_STATUS_START_AT :{BLACK}Este horário começará em{STRING} STR_TIMETABLE_STARTING_DATE :{BLACK}Data de início -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Seleciona uma data como ponto de partida para esse horário. Ctrl+Clique define o ponto de partida desse horário, e distribui todos os veículos que compartilham essa ordem igualmente, baseados na sua ordem relativa, mesmo que a ordem esteja totalmente tabelada +STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Seleciona uma data como ponto de partida para esse horário. Ctrl+Clique define o ponto de partida desse horário e distribui todos os veículos que compartilham essa ordem igualmente, baseados na sua ordem relativa, mesmo que a ordem esteja totalmente tabelada STR_TIMETABLE_CHANGE_TIME :{BLACK}Mudar horário STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Mudar a quantidade de tempo que a ordem destacada deverá levar @@ -4480,7 +4519,7 @@ STR_TIMETABLE_CLEAR_TIME :{BLACK}Limpar H STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Limpar a quantidade de tempo para a ordem destacada STR_TIMETABLE_CHANGE_SPEED :{BLACK}Alterar Limite de Vel. -STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Altera a velocidade máxima de viagem para a ordem selecionada +STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Altera a velocidade máxima de viagem para a ordem selecionada. Ctrl+Clique define a velocidade para todas as ordens STR_TIMETABLE_CLEAR_SPEED :{BLACK}Limpa Limite de Vel. STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Limpar a velocidade máxima de viagem para a ordem selecionada @@ -4533,12 +4572,14 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Um dos s STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Depuração de I.A./Script do jogo só é acessível pelo servidor # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Configuração da I.A./Script do jogo +STR_AI_CONFIG_CAPTION_AI :{WHITE}Configuração de IA +STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Configuração de Script de Jogo STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}O script do jogo que será carregado no próximo jogo STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}IAs que serão carregadas no próximo jogo STR_AI_CONFIG_HUMAN_PLAYER :Jogador humano STR_AI_CONFIG_RANDOM_AI :IA aleatória STR_AI_CONFIG_NONE :{G=m}(nenhum) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Número máximo de concorrentes: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Subir STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Mover a IA selecionada para cima na lista @@ -4546,12 +4587,11 @@ STR_AI_CONFIG_MOVE_DOWN :{BLACK}Descer STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Mover a IA selecionada para baixo na lista STR_AI_CONFIG_GAMESCRIPT :{SILVER}Script do jogo +STR_AI_CONFIG_GAMESCRIPT_PARAM :{SILVER}Parâmetros STR_AI_CONFIG_AI :{G=f}{SILVER}IAs -STR_AI_CONFIG_CHANGE :{BLACK}Selecionar {STRING} -STR_AI_CONFIG_CHANGE_NONE : -STR_AI_CONFIG_CHANGE_AI :{G=f}IA -STR_AI_CONFIG_CHANGE_GAMESCRIPT :Script do jogo +STR_AI_CONFIG_CHANGE_AI :{BLACK}Selecionar IA +STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}Selecionar Script do Jogo STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Carregar outro script STR_AI_CONFIG_CONFIGURE :{BLACK}Configurar STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Configurar os parâmetros do Script @@ -4580,9 +4620,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Captura STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Captura de tela do minimapa # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parâmetros -STR_AI_SETTINGS_CAPTION_AI :{G=f}IA -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Script do jogo +STR_AI_SETTINGS_CAPTION_AI :{WHITE}Parâmetros de IA STR_AI_SETTINGS_CLOSE :{BLACK}Fechar STR_AI_SETTINGS_RESET :{BLACK}Resetar STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4592,11 +4630,11 @@ STR_AI_SETTINGS_START_DELAY :Número de dias # Textfile window STR_TEXTFILE_WRAP_TEXT :{WHITE}Quebra de linha STR_TEXTFILE_WRAP_TEXT_TOOLTIP :[BLACK}Quebra linhas automaticamente para que o texto caiba na janela -STR_TEXTFILE_VIEW_README :{BLACK}Ler o Leiame +STR_TEXTFILE_VIEW_README :{BLACK}Ver o leia-me STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Log de mudanças STR_TEXTFILE_VIEW_LICENCE :{BLACK}Licença ###length 3 -STR_TEXTFILE_README_CAPTION :{WHITE}{STRING} Leiame de {STRING} +STR_TEXTFILE_README_CAPTION :{WHITE}{STRING} Leia-me de {STRING} STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING} log de mudanças de {STRING} STR_TEXTFILE_LICENCE_CAPTION :{WHITE}{STRING} licença de {STRING} @@ -4905,7 +4943,7 @@ STR_ERROR_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Remova a STR_ERROR_CAN_T_START_AND_END_ON :{WHITE}Impossível iniciar e terminar no mesmo ponto STR_ERROR_BRIDGEHEADS_NOT_SAME_HEIGHT :{WHITE}Extremidades da ponte não estão no mesmo nível STR_ERROR_BRIDGE_TOO_LOW_FOR_TERRAIN :{WHITE}Ponte é muito baixa para o terreno -STR_ERROR_BRIDGE_TOO_HIGH_FOR_TERRAIN :{WHITE}A ponte está muito alta para esse terreno. +STR_ERROR_BRIDGE_TOO_HIGH_FOR_TERRAIN :{WHITE}A ponte está muito alta para este terreno. STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Inicio e fim devem estar alinhados STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... os extremos da ponte devem estar sobre a terra STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... ponte muito longa @@ -4927,6 +4965,7 @@ STR_ERROR_OBJECT_IN_THE_WAY :{WHITE}Objeto n STR_ERROR_COMPANY_HEADQUARTERS_IN :{WHITE}... sede de empresa no caminho STR_ERROR_CAN_T_PURCHASE_THIS_LAND :{WHITE}Impossível comprar esta área... STR_ERROR_YOU_ALREADY_OWN_IT :{WHITE}... já a possui! +STR_ERROR_BUILD_OBJECT_LIMIT_REACHED :{WHITE}... limite de construção de objetos atingido # Group related errors STR_ERROR_GROUP_CAN_T_CREATE :{WHITE}Impossível criar grupo... @@ -4999,6 +5038,8 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Impossí STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... veículo está destruído +STR_ERROR_CAN_T_CLONE_VEHICLE_LIST :{WHITE}... nem todos os veículos são idênticos + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Não haverá nenhum veículo disponível STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Altere sua configuração de NewGRF STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Não há veículos disponíveis ainda @@ -5025,6 +5066,8 @@ STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}Impossí STR_ERROR_CAN_T_COPY_SHARE_ORDER :{WHITE}... o veículo não pode chegar a todas as estações STR_ERROR_CAN_T_ADD_ORDER :{WHITE}... o veículo não chega àquela estação STR_ERROR_CAN_T_ADD_ORDER_SHARED :{WHITE}... um veículo com essa mesma ordem não chega àquela estação +STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST :{WHITE}... nem todos os veículos possuem as mesmas ordens +STR_ERROR_CAN_T_SHARE_ORDER_VEHICLE_LIST :{WHITE}... nem todos os veículos estão compartilhando ordens STR_ERROR_CAN_T_SHARE_ORDER_LIST :{WHITE}Impossível compartilhar a lista de ordens... STR_ERROR_CAN_T_STOP_SHARING_ORDER_LIST :{WHITE}Impossível compartilhar lista de ordens... diff --git a/src/lang/bulgarian.txt b/src/lang/bulgarian.txt index 4b2ff7044e..e9e2f0644b 100644 --- a/src/lang/bulgarian.txt +++ b/src/lang/bulgarian.txt @@ -200,6 +200,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA} к.с. STR_UNITS_POWER_METRIC :{COMMA} к.с. STR_UNITS_POWER_SI :{COMMA} kW + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}т STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA} т. STR_UNITS_WEIGHT_SHORT_SI :{COMMA} кг. @@ -375,10 +376,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Изход # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Игрови опции STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Настройки -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Настройка на ИИ програмите STR_SETTINGS_MENU_NEWGRF_SETTINGS :Newgrf настройки STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Настройки на прозрачност STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Показване имената на градовете @@ -924,36 +924,6 @@ STR_GAME_OPTIONS_CURRENCY_IRR :Ирански STR_GAME_OPTIONS_CURRENCY_NTD :Нов тайвански долар STR_GAME_OPTIONS_CURRENCY_HKD :Хонгконгски долар (HKD) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :ляво -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :дясно - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Имена на градовете -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Избор стила на имената на градовете - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :английски (оригинални) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :френски -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :германски -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :английски (допълнителни) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :латиноамерикански -STR_GAME_OPTIONS_TOWN_NAME_SILLY :глупави -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :шведски -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :холандски -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :финландски -STR_GAME_OPTIONS_TOWN_NAME_POLISH :полски -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :словашки -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :норвежки -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :унгарски -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :австрийски -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :румънски -STR_GAME_OPTIONS_TOWN_NAME_CZECH :чешки -STR_GAME_OPTIONS_TOWN_NAME_SWISS :швейцарски -STR_GAME_OPTIONS_TOWN_NAME_DANISH :датски -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :турски -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :италиански -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :каталонски - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Автозаписване STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Интервала между две автозаписваня @@ -978,12 +948,6 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :друго -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Интерфейс размер -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Изберете размера на интерфейс елемент за използване - -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Нормално -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Двукратно -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Четирикратно @@ -1032,8 +996,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Пре STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 лири(£) в твоята валута STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Промяна параметрите на парична единица -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Максимален брой конкуренти: {ORANGE}{COMMA} - STR_NONE :николко STR_FUNDING_ONLY :Единствено финансиране STR_MINIMAL :Минимален @@ -1083,6 +1045,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :умерен климат +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Арктичен климат +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Тропически климат +STR_CLIMATE_TOYLAND_LANDSCAPE :Земята на играчките + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :платовиден STR_TERRAIN_TYPE_FLAT :равнинен @@ -1411,6 +1379,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :подобре STR_CONFIG_SETTING_ROAD_SIDE :Пътни превозни средства: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Изберете страна шофиране +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :ляво +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :дясно + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Завъртане на картата: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Обратрно на часовниковата стрелка @@ -1858,7 +1830,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Автомат STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Позволява на влаковете да обръщат ако са чакали твърде дълго ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(препоръчва се) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(препоръчва се) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Промяна стойноста на настройка @@ -1898,7 +1870,6 @@ STR_INTRO_HIGHSCORE :{BLACK}Табл STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Настройки STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF настройки STR_INTRO_ONLINE_CONTENT :{BLACK}Провери онлайн съдържанието -STR_INTRO_SCRIPT_SETTINGS :{BLACK}ИИ/Игрови настройки STR_INTRO_QUIT :{BLACK}Изход STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Започни нова игра. Ctrl+Click пропуска конфигурацията на картата @@ -1918,7 +1889,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Пока STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Настройки на дисплея STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Покажи NewGRF настройки STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Провери за ново съдържание за сваляне -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Показва настройките на ИИ STR_INTRO_TOOLTIP_QUIT :{BLACK}Изход от 'OpenTTD' STR_INTRO_TRANSLATION :{BLACK}На този превод му липсват {NUM} string{P "" s}. Помогнете на OpenTTD като се запишете за преводач. Вижте readme.txt за повече информация. @@ -1947,12 +1917,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Про STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Промяна настоящата година STR_CHEAT_SETUP_PROD :{LTBLUE}Промяна на производствените стойности: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :умерен климат -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Арктичен климат -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Тропически климат -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Земята на играчките - # Livery window STR_LIVERY_GENERAL_TOOLTIP :{BLACK}Показване на общи цветови схеми @@ -2804,16 +2768,41 @@ STR_MAPGEN_MAPSIZE :{BLACK}Разм STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Изберете големината на картата в полета. Броя на наличните полета ще е малко по-малък. STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Брой градове: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Имена на градовете +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Избор стила на имената на градовете STR_MAPGEN_DATE :{BLACK}Дата: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Брой индустрии: STR_MAPGEN_LAND_GENERATOR :{BLACK}Земегенератор: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Тип на терен: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Морско ниво: +STR_MAPGEN_SEA_LEVEL :{BLACK}Морско ниво: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Реки: STR_MAPGEN_SMOOTHNESS :{BLACK}Полегатост: STR_MAPGEN_VARIETY :{BLACK}Разнообразност: STR_MAPGEN_GENERATE :{WHITE}Генериране +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :английски (оригинални) +STR_MAPGEN_TOWN_NAME_FRENCH :френски +STR_MAPGEN_TOWN_NAME_GERMAN :германски +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :английски (допълнителни) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :латиноамерикански +STR_MAPGEN_TOWN_NAME_SILLY :глупави +STR_MAPGEN_TOWN_NAME_SWEDISH :шведски +STR_MAPGEN_TOWN_NAME_DUTCH :холандски +STR_MAPGEN_TOWN_NAME_FINNISH :финландски +STR_MAPGEN_TOWN_NAME_POLISH :полски +STR_MAPGEN_TOWN_NAME_SLOVAK :словашки +STR_MAPGEN_TOWN_NAME_NORWEGIAN :норвежки +STR_MAPGEN_TOWN_NAME_HUNGARIAN :унгарски +STR_MAPGEN_TOWN_NAME_AUSTRIAN :австрийски +STR_MAPGEN_TOWN_NAME_ROMANIAN :румънски +STR_MAPGEN_TOWN_NAME_CZECH :чешки +STR_MAPGEN_TOWN_NAME_SWISS :швейцарски +STR_MAPGEN_TOWN_NAME_DANISH :датски +STR_MAPGEN_TOWN_NAME_TURKISH :турски +STR_MAPGEN_TOWN_NAME_ITALIAN :италиански +STR_MAPGEN_TOWN_NAME_CATALAN :каталонски + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Краищата на картата да са: STR_MAPGEN_NORTHWEST :{BLACK}Северозапад @@ -2948,6 +2937,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Пред STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Продължи към предишен нормален sprite, Пропускайки всички псевдо/прерисувани/текстови sprite и ги облечи в края STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Показване на избрания sprite. Подредбата се пренебрегва при рисуването му. STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Преместване на sprite, променяйки X и Y координатите + +###length 2 + + STR_SPRITE_ALIGNER_PICKER_BUTTON :{BLACK}Избери sprite STR_SPRITE_ALIGNER_PICKER_TOOLTIP :{BLACK}Избери sprite от целия екран @@ -3453,6 +3446,8 @@ STR_PURCHASE_INFO_ALL_BUT :Всичко о STR_PURCHASE_INFO_MAX_TE :{BLACK}Макс. теглеща сила: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Обхват: {GOLD}{COMMA} полета +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Списък с влакове - натисни върху влак за информация STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Списък с избор на МПС-та - натисни върху МПС за информация @@ -4080,12 +4075,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Един STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}ИИ Дебъг прозореца е на разположение само на сървъра # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}ИИ Настройки STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Иговия скрипт ще бъде зареден в следващата игра STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}ИИ-тата ще бъдат заредени в следващата игра STR_AI_CONFIG_HUMAN_PLAYER :Човешки играч STR_AI_CONFIG_RANDOM_AI :Случаен AI STR_AI_CONFIG_NONE :(нищо) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Максимален брой конкуренти: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Премести нагоре STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Премести маркирания AI нагоре в списъка @@ -4095,8 +4090,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Прем STR_AI_CONFIG_GAMESCRIPT :{SILVER}Игрови скрипт STR_AI_CONFIG_AI :{SILVER}AI-та -STR_AI_CONFIG_CHANGE :{BLACK}Избери {STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :AI STR_AI_CONFIG_CHANGE_GAMESCRIPT :Програмен език на играта STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Зареди друг скрипт @@ -4120,9 +4113,7 @@ STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Не п # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Параметри STR_AI_SETTINGS_CAPTION_AI :AI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Програмен език на играта STR_AI_SETTINGS_CLOSE :{BLACK}Затвори STR_AI_SETTINGS_RESET :{BLACK}Рестартиране STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4529,6 +4520,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Инте STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... машината е унищожена + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Никакви превозни средства няма да бъдат налични STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Промени своята NewGRF конфигурация STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Няма налични превозни средства все още diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index 041cbf70c8..c76a1580dc 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -201,6 +201,16 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}cv STR_UNITS_POWER_METRIC :{COMMA}{NBSP}cv STR_UNITS_POWER_SI :{COMMA}{NBSP}kW +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}CV/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}CV/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_SI :{DECIMAL}{NBSP}CV/Mg +STR_UNITS_POWER_METRIC_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}CV/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}CV/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_SI :{DECIMAL}{NBSP}CV/Mg +STR_UNITS_POWER_SI_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_SI :{DECIMAL}{NBSP}W/kg + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -392,10 +402,11 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Surt # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Opcions de la partida STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Configuració -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Paràmetres dels scripts d'IA/partida +STR_SETTINGS_MENU_AI_SETTINGS :Configuració de la IA +STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :Configuració de l'script de partida STR_SETTINGS_MENU_NEWGRF_SETTINGS :Extensions NewGRF STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Opcions de transparència STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Mostra els noms de les poblacions @@ -966,36 +977,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Rúpia índia ( STR_GAME_OPTIONS_CURRENCY_IDR :Rupia indonèsia (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Ringgit (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Conducció per l'esquerra -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Conducció per la dreta - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Estil dels noms de les poblacions: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Selecciona l'estil dels noms de poblacions - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Anglès -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Francès -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Alemany -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Anglès (addicional) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Llatinoamericà -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Graciós -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Suec -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Holandès -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finès -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Polonès -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Eslovac -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Noruec -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Hongarès -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Austríac -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Romanès -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Txec -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Suís -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Danès -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turc -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italià -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Català - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Desa automàticament STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Selecciona l'interval de desada automàtica de la partida @@ -1028,21 +1009,19 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Seleccio STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Controlador actual: {STRING} -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Mida de la interfície -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Escull la mida dels elements de la interfície +STR_GAME_OPTIONS_GUI_SCALE_FRAME :{BLACK}Mida de la interfície +STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Arrossegueu el botó lliscant per a triar la mida de la interfície. Mantingueu premut Ctrl per a un ajustament contigu. +STR_GAME_OPTIONS_GUI_SCALE_AUTO :{BLACK}Detecta la mida automàticament +STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Marqueu aquesta opció si voleu que s'ajusti la mida de la interfície automàticament. -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(detecta automàticament) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Doble -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Quàdruple +STR_GAME_OPTIONS_GUI_SCALE_BEVELS :{BLACK}Escala els bisells +STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :{BLACK}Marqueu aquesta opció si voleu que s'escalin els bisells segons la mida de la interfície. -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Mida de la lletra -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Seleccioneu la mida de les fonts de la interfície. - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(detecta automàticament) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Doble -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Quàdruple +STR_GAME_OPTIONS_GUI_SCALE_1X :x1 +STR_GAME_OPTIONS_GUI_SCALE_2X :x2 +STR_GAME_OPTIONS_GUI_SCALE_3X :x3 +STR_GAME_OPTIONS_GUI_SCALE_4X :x4 +STR_GAME_OPTIONS_GUI_SCALE_5X :x5 STR_GAME_OPTIONS_GRAPHICS :{BLACK}Gràfics @@ -1094,8 +1073,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Vista p STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10.000 lliures (£) en aquesta moneda STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Canvia el paràmetre de la moneda personalitzada -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Nombre màxim de competidors: {ORANGE}{COMMA} - STR_NONE :Cap STR_FUNDING_ONLY :Cap, excepte finançades STR_MINIMAL :Mínim @@ -1145,6 +1122,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Paisatge temperat +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Paisatge subàrtic +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Paisatge subtropical +STR_CLIMATE_TOYLAND_LANDSCAPE :Paisatge de joguines + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Molt pla STR_TERRAIN_TYPE_FLAT :Pla @@ -1450,6 +1433,8 @@ STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Gruix de la lí STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :Mostra el nom del NewGRF a la finestra de construcció de vehicles: {STRING} STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Afegeix una línia a la finestra de construcció de vehicles que mostri de quin NewGRF és el vehicle seleccionat. +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS :Mostra les càrregues que poden portar els vehicles a les finestres de llistes {STRING} +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS_HELPTEXT :Si s'activa, la càrrega transportable del vehicle apareixerà al damunt de les llistes dels vehicles. STR_CONFIG_SETTING_LANDSCAPE :Paisatge: {STRING} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :El tipus de paisatge defineix escenaris amb diferents tipus de càrrega i requisits per al creixement de les poblacions. Els NewGRF i l'script de partida poden modificar-ne l'aparença i el comportament. @@ -1504,6 +1489,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Millorat STR_CONFIG_SETTING_ROAD_SIDE :Automòbils: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Escollir el costat de conducció +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Conducció per l'esquerra +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Conducció per la dreta + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Rotació del mapa d'alçades: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Antihorari @@ -2038,7 +2027,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Canvi de sentit STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Permetre als trens girar en un senyal, si esperaven allà durant molt temps ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Recomanat) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Recomanat) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Canvia el valor de l'ajustament @@ -2081,7 +2070,8 @@ STR_INTRO_HIGHSCORE :{BLACK}Taula de STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Configuració STR_INTRO_NEWGRF_SETTINGS :{BLACK}Extensions NewGRF STR_INTRO_ONLINE_CONTENT :{BLACK}Contingut en línia -STR_INTRO_SCRIPT_SETTINGS :{BLACK}Paràmetres dels scripts d'IA/partida +STR_INTRO_AI_SETTINGS :{BLACK}Configuració de la IA +STR_INTRO_GAMESCRIPT_SETTINGS :{BLACK}Configuració de l'script de partida STR_INTRO_QUIT :{BLACK}Surt STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Comença una partida nova. Ctrl+Clic salta la configuració del mapa @@ -2101,7 +2091,8 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Mostra l STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Mostra la finestra de configuració STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Mostra la configuració de les extensions NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Comprova si hi ha continguts nous i actualitzats per a descarregar -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Mostra els paràmetres dels scripts d'IA/partida +STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Mostra les opcions d'IA +STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Mostra la configuració de l'script de partida STR_INTRO_TOOLTIP_QUIT :{BLACK}Surt de l'OpenTTD. STR_INTRO_BASESET :{WHITE}Al joc de gràfics base seleccionat li falten {NUM} sprite{P "" s}.{}Si us plau, comproveu si hi ha actualitzacions disponibles. @@ -2133,12 +2124,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Canvia STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Canvia l'any actual STR_CHEAT_SETUP_PROD :{LTBLUE}Activa la modificació dels valors de producció: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Paisatge temperat -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Paisatge subàrtic -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Paisatge subtropical -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Paisatge de joguines - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Esquema de colors nou @@ -2498,13 +2483,13 @@ STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :s'espera que s' STR_NETWORK_MESSAGE_CLIENT_LEAVING :deixant STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} s'ha unit a la partida -STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {STRING} s'ha unit a la partida (Client #{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} s'ha unit a la companyia #{2:NUM} +STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {0:STRING} s'ha unit a la partida (Client #{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {0:STRING} s'ha unit a la companyia #{2:NUM} STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} s'ha unit als espectadors -STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} ha començat una nova companyia (#{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} ha deixat la partida ({2:STRING}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {0:STRING} ha començat una nova companyia (#{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {0:STRING} ha deixat la partida ({2:STRING}) STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} ha canviat el seu nom a {STRING}. -STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} ha donat {2:CURRENCY_LONG} a {1:STRING}. +STR_NETWORK_MESSAGE_GIVE_MONEY :*** {0:STRING} ha donat {2:CURRENCY_LONG} a {1:STRING}. STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}El servidor ha tancat la sessió STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}El servidor està reiniciant...{}Espera un moment... STR_NETWORK_MESSAGE_KICKED :*** S'ha expulsat {STRING}. Motiu: {STRING} @@ -2631,6 +2616,7 @@ STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP :{BLACK}No marca STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP :{BLACK}Marcar l'àrea de cobertura del lloc proposat STR_STATION_BUILD_ACCEPTS_CARGO :{BLACK}Accepta: {GOLD}{CARGO_LIST} STR_STATION_BUILD_SUPPLIES_CARGO :{BLACK}Provisions: {GOLD}{CARGO_LIST} +STR_STATION_BUILD_INFRASTRUCTURE_COST :{BLACK}Cost de manteniment: {GOLD}{CURRENCY_SHORT}/any # Join station window STR_JOIN_STATION_CAPTION :{WHITE}Ajuntar estació @@ -3144,6 +3130,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Mida del STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Selecciona la mida del mapa en cel·les. El nombre de cel·les disponibles serà lleugerament més petit STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Nombre de poblacions: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Estil dels noms de les poblacions: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Selecciona l'estil dels noms de poblacions STR_MAPGEN_DATE :{BLACK}Data: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Nombre d'indústries: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Alçada del cim més alt: @@ -3159,11 +3147,40 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Redueix STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}{NBSP}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Generació de terrenys: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Tipus de terreny: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Nivell de mar: +STR_MAPGEN_SEA_LEVEL :{BLACK}Nivell de mar: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Quantitat de rius: STR_MAPGEN_SMOOTHNESS :{BLACK}Suavitat: STR_MAPGEN_VARIETY :{BLACK}Varietat: STR_MAPGEN_GENERATE :{WHITE}Genera +STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}Configuració del NewGRF +STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Mostra la configuració de NewGRF +STR_MAPGEN_AI_SETTINGS :{BLACK}Configuració d'IA +STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Mostra la configuració de la IA +STR_MAPGEN_GS_SETTINGS :{BLACK}Configuració de l'script de partida +STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Mostra la configuració de l'script de partida. + +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Anglès +STR_MAPGEN_TOWN_NAME_FRENCH :Francès +STR_MAPGEN_TOWN_NAME_GERMAN :Alemany +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Anglès (addicional) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Llatinoamericà +STR_MAPGEN_TOWN_NAME_SILLY :Graciós +STR_MAPGEN_TOWN_NAME_SWEDISH :Suec +STR_MAPGEN_TOWN_NAME_DUTCH :Holandès +STR_MAPGEN_TOWN_NAME_FINNISH :Finès +STR_MAPGEN_TOWN_NAME_POLISH :Polonès +STR_MAPGEN_TOWN_NAME_SLOVAK :Eslovac +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Noruec +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Hongarès +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Austríac +STR_MAPGEN_TOWN_NAME_ROMANIAN :Romanès +STR_MAPGEN_TOWN_NAME_CZECH :Txec +STR_MAPGEN_TOWN_NAME_SWISS :Suís +STR_MAPGEN_TOWN_NAME_DANISH :Danès +STR_MAPGEN_TOWN_NAME_TURKISH :Turc +STR_MAPGEN_TOWN_NAME_ITALIAN :Italià +STR_MAPGEN_TOWN_NAME_CATALAN :Català # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Vores del mapa: @@ -3309,6 +3326,11 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Sprite a STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Procedeix cap a l'sprite normal anterior, saltant qualsevol sprite pseudo/recolor/font i passant del primer sprite a l'últim STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Representació de l'sprite seleccionat actualment. L'alineació s'ignora quan es dibuixa aquest sprite STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Desplaça l'sprite un píxel en el sentit indicat. Amb Ctrl+Clic el desplaça 8 píxels. + +###length 2 +STR_SPRITE_ALIGNER_CENTRE_SPRITE :{BLACK}Sprite centrat + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Restableix relatius STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Restableix els desplaçaments relatius actuals STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}Desplaçament X: {NUM}, Desplaçament Y: {NUM} (Absolut) @@ -3326,15 +3348,15 @@ STR_NEWGRF_ERROR_MSG_FATAL :{RED}Fatal: {SI STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}S'ha produït un error fatal de NewGRF:{}{STRING} STR_NEWGRF_ERROR_POPUP :{WHITE}S'ha produït un error relacionat amb els NewGRF:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} no funcionarà amb la versió TTDPatch informada per l'OpenTTD -STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} és per la versió {STRING} de TTD -STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} està dissenyat per ser utilitzat amb {STRING} -STR_NEWGRF_ERROR_INVALID_PARAMETER :Paràmetre invàlid per {1:STRING}: paràmetre {STRING} ({NUM}) -STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} ha de ser carregat abans de {STRING} -STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} ha de ser carregat després de {STRING} -STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} necessita l'OpenTTD versió {STRING} o superior +STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} és per a la versió {2:STRING} del TTD +STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} està dissenyat per a fer-se servir amb {2:STRING} +STR_NEWGRF_ERROR_INVALID_PARAMETER :Paràmetre no vàlid per a {1:STRING}: paràmetre {2:STRING} ({3:NUM}) +STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} s'ha de carregar abans de {2:STRING} +STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} s'ha de carregar després de {2:STRING} +STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} necessita la versió {2:STRING} de l'OpenTTD o posterior STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :l'arxiu GRF dissenyat està pendent de traduir STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Hi ha massa arxius NewGRF carregats -STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Carregant {1:STRING} com a NewGRF estàtic amb {STRING} podria causar desincronitzacions +STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Si es carrega {1:STRING} com a NewGRF estàtic amb {2:STRING}, pot provocar desincronitzacions STR_NEWGRF_ERROR_UNEXPECTED_SPRITE :Sprite inesperat (sprite {3:NUM}) STR_NEWGRF_ERROR_UNKNOWN_PROPERTY :Propietat d'acció 0 desconeguda {4:HEX} (sprite {3:NUM}) STR_NEWGRF_ERROR_INVALID_ID :Intent d'utilitzar una ID invàlid (sprite {3:NUM}) @@ -3466,14 +3488,14 @@ STR_LOCAL_AUTHORITY_ACTION_EXCLUSIVE_TRANSPORT :Compra els dret STR_LOCAL_AUTHORITY_ACTION_BRIBE :Suborna les autoritats locals ###length 8 -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{YELLOW}Inicia una petita campanya de publicitat, per atraure més passatgers i càrregues als teus serveis de transport.{}Proporciona una millora temporal dels ratis de les estacions dins d'un radi petit al voltant del centre de la població.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{YELLOW}Inicia una mitjana campanya de publicitat, per atraure més passatgers i càrregues als teus serveis de transport.{}Proporciona una millora temporal dels ratis de les estacions dins un radi mitjà al voltant del centre de la població.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{YELLOW}Inicia una gran campanya de publicitat, per atraure més passatgers i càrregues als teus serveis de transport.{}Proporciona una millora temporal dels ratis de les estacions dins d'un radi gran al voltant del centre de la població.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{YELLOW}Finança la reconstrucció de la xarxa local de carrers. Dificulta notablement el trànsit durant 6 mesos.{}Causa molèsties considerables al trànsit de vehicles de carretera durant 6 mesos.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{YELLOW}Construeix una estàtua en honor a la teva companyia.{}Proporciona una millora permanent dels ratis d'estació de la població.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{YELLOW}Finança la construcció de nous edificis comercials a la població.{}Proporciona una millora temporal del creixement d'aquesta població.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW}Compra per 1 any els drets exclusius de transport en la població. L'autoritat local només permetrà utilitzar les instal·lacions de la teva companyia de transports als passatgers i les mercaderies.{}L'autoritat local no permetrà que els passatgers i càrregues locals usin les estacions dels oponents.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Suborna les autoritats locals per incrementar el teu rati, a risc de greus penalitzacions si et pesquen.{}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{YELLOW}Inicia una petita campanya de publicitat, per atraure més passatgers i càrregues als teus serveis de transport.{}Proporciona una millora temporal dels ratis de les estacions dins d'un radi petit al voltant del centre de la població.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{PUSH_COLOUR}{YELLOW}Inicia una mitjana campanya de publicitat, per atraure més passatgers i càrregues als teus serveis de transport.{}Proporciona una millora temporal dels ratis de les estacions dins un radi mitjà al voltant del centre de la població.{}{PUSH_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}Inicia una gran campanya de publicitat, per atraure més passatgers i càrregues als teus serveis de transport.{}Proporciona una millora temporal dels ratis de les estacions dins d'un radi gran al voltant del centre de la població.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{PUSH_COLOUR}{YELLOW}Finança la reconstrucció de la xarxa local de carrers. Dificulta notablement el trànsit durant 6 mesos.{}Causa molèsties considerables al trànsit de vehicles de carretera durant 6 mesos.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Construeix una estàtua en honor a la teva companyia.{}Proporciona una millora permanent dels ratis d'estació de la població.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Finança la construcció de nous edificis comercials a la població.{}Proporciona una millora temporal del creixement d'aquesta població.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}Compra per 1 any els drets exclusius de transport en la població. L'autoritat local només permetrà utilitzar les instal·lacions de la teva companyia de transports als passatgers i les mercaderies.{}L'autoritat local no permetrà que els passatgers i càrregues locals usin les estacions dels oponents.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Suborna les autoritats locals per incrementar el teu rati, a risc de greus penalitzacions si et pesquen.{}{POP_COLOUR}Cost: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}{COMPANY} Objectius @@ -3646,16 +3668,18 @@ STR_FINANCES_SECTION_SHIP_REVENUE :{GOLD}Vaixells STR_FINANCES_SECTION_LOAN_INTEREST :{GOLD}Interessos del préstec STR_FINANCES_SECTION_OTHER :{GOLD}Altres +STR_FINANCES_TOTAL_CAPTION :{WHITE}Total STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} STR_FINANCES_ZERO_INCOME :{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} -STR_FINANCES_NET_PROFIT :{WHITE}Benefici net +STR_FINANCES_PROFIT :{WHITE}Benefici STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Balanç bancari STR_FINANCES_OWN_FUNDS_TITLE :{WHITE}Fons propis STR_FINANCES_LOAN_TITLE :{WHITE}Préstec STR_FINANCES_INTEREST_RATE :{WHITE}Interès del préstec: {BLACK}{NUM}{NBSP}% STR_FINANCES_MAX_LOAN :{WHITE}Préstec màxim: {BLACK}{CURRENCY_LONG} STR_FINANCES_TOTAL_CURRENCY :{BLACK}{CURRENCY_LONG} +STR_FINANCES_BANK_BALANCE :{WHITE}{CURRENCY_LONG} STR_FINANCES_BORROW_BUTTON :{BLACK}Demana {CURRENCY_LONG} STR_FINANCES_BORROW_TOOLTIP :{BLACK}Augmenta l'import del préstec Ctrl+Clic per demanar tants diners com sigui possible STR_FINANCES_REPAY_BUTTON :{BLACK}Amortitza {CURRENCY_LONG} @@ -3756,7 +3780,7 @@ STR_INDUSTRY_VIEW_PRODUCES_N_CARGO :{BLACK}Produeix STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :, {STRING}{STRING} STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Necessita: -STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{0:STRING}{BLACK}{3:STRING} STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} esperant{STRING} STR_CONFIG_GAME_PRODUCTION :{WHITE}Canvia la producció (múltiple de 8, fins a 2040) @@ -3786,6 +3810,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Envia in STR_VEHICLE_LIST_REPLACE_VEHICLES :Substitueix vehicles STR_VEHICLE_LIST_SEND_FOR_SERVICING :Envia a fer revisió STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Benefici enguany: {CURRENCY_LONG} (darrer any: {CURRENCY_LONG}) +STR_VEHICLE_LIST_CARGO :{TINY_FONT}{BLACK}[{CARGO_LIST}] +STR_VEHICLE_LIST_NAME_AND_CARGO :{TINY_FONT}{BLACK}{STRING} {STRING} STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Envia a la cotxera STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Envia a la cotxera @@ -3877,6 +3903,11 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Esforç STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Abast: {GOLD}{COMMA} cel·les STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Tipus d'aeronau: {GOLD}{STRING} +###length 3 +STR_CARGO_TYPE_FILTER_ALL :Tots els tipus de càrrega +STR_CARGO_TYPE_FILTER_FREIGHT :Càrrega +STR_CARGO_TYPE_FILTER_NONE :Cap + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Llista de selecció de trens i vagons. Clica al vehicle per més informació. Ctrl+Click per a alternar entre mostrar/ocultar el vehicle ferroviari STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Llista de models de vehicles de carretera. Clica sobre el model per més informació. Amb Ctrl+Clic, commuta entre mostrar o ocultar el model. @@ -4045,7 +4076,7 @@ STR_ENGINE_PREVIEW_AIRCRAFT :{G=Masculin}avi STR_ENGINE_PREVIEW_SHIP :{G=Masculin}vaixell STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Cost: {CURRENCY_LONG} Pes: {WEIGHT_SHORT}{}Velocitat: {VELOCITY} Potència: {POWER}{}Cost de circulació: {CURRENCY_LONG}/any{}Capacitat: {CARGO_LONG} -STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Cost: {CURRENCY_LONG} Pes: {WEIGHT_SHORT}{}Velocitat: {VELOCITY} Potència: {POWER} Màx. E.T.: {6:FORCE}{}Cost d'utilització: {4:CURRENCY_LONG}/any{}Capacitat: {5:CARGO_LONG} +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Cost: {0:CURRENCY_LONG} Pes: {1:WEIGHT_SHORT}{}Velocitat: {2:VELOCITY} Potència: {3:POWER} Màx. E.T.: {6:FORCE}{}Cost d'utilització: {4:CURRENCY_LONG}/any{}Capacitat: {5:CARGO_LONG} STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Vel. Màx: {VELOCITY}{}Capacitat: {CARGO_LONG}{}Cost d'utilització: {CURRENCY_LONG}/any STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Velocitat màx.: {VELOCITY}{}Tipus d'aeronau: {STRING}{}Capacitat: {CARGO_LONG}, {CARGO_LONG}{}Cost de circulació: {CURRENCY_LONG} per any STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Velocitat màx.: {VELOCITY}{}Tipus d'aeronau: {STRING}{}Capacitat: {CARGO_LONG}{}Cost de circulació: {CURRENCY_LONG} per any @@ -4204,12 +4235,13 @@ STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Pes: {LT STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Pes: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potència: {LTBLUE}{POWER}{BLACK} Vel. màx: {LTBLUE}{VELOCITY} {BLACK}E.T. màx.: {LTBLUE}{FORCE} STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Benefici d'aquest any: {LTBLUE}{CURRENCY_LONG} (darrer any: {CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Benefici aquest any: {LTBLUE}{CURRENCY_LONG} (l'any passat: {CURRENCY_LONG}) {BLACK}Rendiment mínim: {LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Fiabilitat: {LTBLUE}{COMMA}% {BLACK}Avaries des de la darrera revisió: {LTBLUE}{COMMA} STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Fabricat: {LTBLUE}{NUM}{BLACK} Valor: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_INFO_NO_CAPACITY :{BLACK}Capacitat: {LTBLUE}Cap{STRING} -STR_VEHICLE_INFO_CAPACITY :{BLACK}Capacitat: {LTBLUE}{CARGO_LONG}{3:STRING} -STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Capacitat: {LTBLUE}{CARGO_LONG}{3:STRING} (x{4:NUM}) +STR_VEHICLE_INFO_CAPACITY :{BLACK}Capacitat: {LTBLUE}{0:CARGO_LONG}{3:STRING} +STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Capacitat: {LTBLUE}{0:CARGO_LONG}{3:STRING} (x{4:NUM}) STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Capacitat: {LTBLUE}{CARGO_LONG}, {CARGO_LONG}{STRING} STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Transferir crèdits: {LTBLUE}{CURRENCY_LONG} @@ -4537,12 +4569,14 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Un dels STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}La finestra de depuració dels scripts d'IA/partida només està disponible al servidor. # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Configuració dels scripts de les IA/partida +STR_AI_CONFIG_CAPTION_AI :{WHITE}Configuració de la IA +STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Configuració de l'script de partida STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Aquest és l'script que s'usarà a la propera partida. STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}Aquesta llista conté les IA que es carregaran a la propera partida. STR_AI_CONFIG_HUMAN_PLAYER :Jugador humà STR_AI_CONFIG_RANDOM_AI :IA aleatòria STR_AI_CONFIG_NONE :(cap) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Nombre màxim de competidors: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Mou amunt STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Desplaça la IA seleccionada una posició cap amunt @@ -4550,12 +4584,11 @@ STR_AI_CONFIG_MOVE_DOWN :{BLACK}Mou aval STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Desplaça la IA seleccionada una posició cap avall. STR_AI_CONFIG_GAMESCRIPT :{SILVER}Script de partida +STR_AI_CONFIG_GAMESCRIPT_PARAM :{SILVER}Paràmetres STR_AI_CONFIG_AI :{SILVER}IA -STR_AI_CONFIG_CHANGE :{BLACK}Selecciona {STRING} -STR_AI_CONFIG_CHANGE_NONE : -STR_AI_CONFIG_CHANGE_AI :una IA -STR_AI_CONFIG_CHANGE_GAMESCRIPT :un script de partida +STR_AI_CONFIG_CHANGE_AI :{BLACK}Trieu una IA +STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}Tria un script de partida STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Carrega un altre script STR_AI_CONFIG_CONFIGURE :{BLACK}Configura STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Configura els paràmetres de l'script @@ -4584,9 +4617,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Captura STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Captura de pantalla del minimapa # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}Paràmetres {STRING} -STR_AI_SETTINGS_CAPTION_AI :de la IA -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :de l'script de partida +STR_AI_SETTINGS_CAPTION_AI :{WHITE}Paràmetres de la IA STR_AI_SETTINGS_CLOSE :{BLACK}Tanca STR_AI_SETTINGS_RESET :{BLACK}Restableix STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -5004,6 +5035,8 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}No es po STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... vehicle està destruït +STR_ERROR_CAN_T_CLONE_VEHICLE_LIST :{WHITE}... no tots els vehicles són idèntics. + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}No hi haurà cap vehicle disponible STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Canvia la teva configuració dels NewGRF STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Encara no hi ha vehicles disponibles @@ -5030,6 +5063,8 @@ STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}Impossib STR_ERROR_CAN_T_COPY_SHARE_ORDER :{WHITE}... el vehicle no pot anar a totes les estacions STR_ERROR_CAN_T_ADD_ORDER :{WHITE}... el vehicle no pot anar a aquesta estació STR_ERROR_CAN_T_ADD_ORDER_SHARED :{WHITE}... un vehicle que comparteix aquesta ordre no pot anar a aquesta estació +STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST :{WHITE}... no tots els vehicles tenen les mateixes ordres. +STR_ERROR_CAN_T_SHARE_ORDER_VEHICLE_LIST :{WHITE}... no tots els vehicles comparteixen ordres. STR_ERROR_CAN_T_SHARE_ORDER_LIST :{WHITE}No es pot compartir la llista d'ordres... STR_ERROR_CAN_T_STOP_SHARING_ORDER_LIST :{WHITE}No es pot deixar de compartir la llista d'ordres... diff --git a/src/lang/chuvash.txt b/src/lang/chuvash.txt index 6fb89a8752..2ccafddfaf 100644 --- a/src/lang/chuvash.txt +++ b/src/lang/chuvash.txt @@ -163,6 +163,7 @@ STR_UNITS_POWER_SI :{COMMA}кВт + # Common window strings @@ -225,7 +226,7 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Вӗҫле # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Вӑййи майлаштару STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF майлаштару @@ -484,30 +485,6 @@ STR_NEWS_MESSAGE_CAPTION :{WHITE}Пӗлт ###length 42 STR_GAME_OPTIONS_CURRENCY_RUR :Вырӑсла тенкӗ (RUR) -###length 2 - - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Акӑлчан -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Францири -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Нимӗҫ -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Акӑлчан (Хушма) -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Акӑлчан (Кулӑшма) -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Шведла -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Голланд -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Финла -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Поляк -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Словак -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Венгрла -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Австри -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Рим -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Чехла -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Швеци -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Датчан -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Турккӑла -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Итали -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Катталун - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Хӑй управ # Autosave dropdown @@ -533,7 +510,6 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :расна - # Custom currency window @@ -544,7 +520,6 @@ STR_CURRENCY_SUFFIX :{LTBLUE}Суф STR_CURRENCY_PREVIEW :{LTBLUE}Малтанласа пӑхса тухни: {ORANGE}{CURRENCY_LONG} - STR_NONE :Ҫук STR_NUM_CUSTOM :Харпӑр хӑй STR_NUM_CUSTOM_NUMBER :Харпӑр хӑй ({NUM}) @@ -568,6 +543,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Виҫеллӗ климат +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Сивӗ климат +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Тропик климат +STR_CLIMATE_TOYLAND_LANDSCAPE :Вӑйӑ пахчи + ###length 7 ###length 4 @@ -696,6 +677,8 @@ STR_CONFIG_SETTING_TREE_PLACER_ORIGINAL :Чӑн ###length 2 +###length 2 + @@ -891,12 +874,6 @@ STR_ABANDON_GAME_CAPTION :{WHITE}Вӑйй # Cheat window STR_CHEAT_CHANGE_DATE :{LTBLUE}Тӳрлет кун: {ORANGE}{DATE_SHORT} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Виҫеллӗ климат -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Сивӗ климат -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Тропик климат -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Вӑйӑ пахчи - # Livery window @@ -1208,6 +1185,27 @@ STR_ABOUT_VERSION :{BLACK}OpenTTD STR_MAPGEN_MAPSIZE :{BLACK}Виҫа картти: STR_MAPGEN_BY :{BLACK}* +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Акӑлчан +STR_MAPGEN_TOWN_NAME_FRENCH :Францири +STR_MAPGEN_TOWN_NAME_GERMAN :Нимӗҫ +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Акӑлчан (Хушма) +STR_MAPGEN_TOWN_NAME_SILLY :Акӑлчан (Кулӑшма) +STR_MAPGEN_TOWN_NAME_SWEDISH :Шведла +STR_MAPGEN_TOWN_NAME_DUTCH :Голланд +STR_MAPGEN_TOWN_NAME_FINNISH :Финла +STR_MAPGEN_TOWN_NAME_POLISH :Поляк +STR_MAPGEN_TOWN_NAME_SLOVAK :Словак +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Венгрла +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Австри +STR_MAPGEN_TOWN_NAME_ROMANIAN :Рим +STR_MAPGEN_TOWN_NAME_CZECH :Чехла +STR_MAPGEN_TOWN_NAME_SWISS :Швеци +STR_MAPGEN_TOWN_NAME_DANISH :Датчан +STR_MAPGEN_TOWN_NAME_TURKISH :Турккӑла +STR_MAPGEN_TOWN_NAME_ITALIAN :Итали +STR_MAPGEN_TOWN_NAME_CATALAN :Катталун + # Strings for map borders at game generation @@ -1241,6 +1239,10 @@ STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_OBJECT :Объект # Sprite aligner window +###length 2 + + + # NewGRF (self) generated warnings/errors STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING} @@ -1380,6 +1382,8 @@ STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- Ҫу ###length VEHICLE_TYPES +###length 3 + ###length VEHICLE_TYPES ###length VEHICLE_TYPES @@ -1580,7 +1584,6 @@ STR_ORDER_GO_TO_STATION :{STRING} {STATI -STR_AI_CONFIG_CHANGE_NONE : # Available AIs window @@ -1696,6 +1699,7 @@ STR_ERROR_OBJECT_IN_THE_WAY :{WHITE}Ҫул + # Specific vehicle errors diff --git a/src/lang/croatian.txt b/src/lang/croatian.txt index d641ef2b65..13f129bb67 100644 --- a/src/lang/croatian.txt +++ b/src/lang/croatian.txt @@ -295,6 +295,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}KS STR_UNITS_POWER_METRIC :{COMMA}{NBSP}KS STR_UNITS_POWER_SI :{COMMA}{NBSP}kW + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -480,10 +481,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Izlaz # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Postavke igre STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Postavke -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Postavke UI-ja/Skripte igre STR_SETTINGS_MENU_NEWGRF_SETTINGS :Postavke za NewGRF STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Postavke prozirnosti STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Prikaži imena gradova @@ -1045,36 +1045,6 @@ STR_GAME_OPTIONS_CURRENCY_CNY :Kineski Renminb STR_GAME_OPTIONS_CURRENCY_HKD :Hongkonški Dolar (HKD) STR_GAME_OPTIONS_CURRENCY_INR :Indijska Rupija (INR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Vozi na lijevoj strani -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Vozi na desnoj strani - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Imena gradova: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Odaberi stil za imena gradova - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Engleski (original) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Francuski -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Njemački -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Engleski (dodatno) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Latinoamerički -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Blesavo -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Švedski -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Nizozemski -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finski -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Poljski -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slovački -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norveški -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Mađarski -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Austrijski -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Rumunjski -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Češki -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Švicarski -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Danski -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turski -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Talijanski -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Katalonski - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Automatsko spremanje STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Odaberi interval između automatskih spremanja igre @@ -1101,19 +1071,8 @@ STR_GAME_OPTIONS_RESOLUTION_ITEM :{NUM}x{NUM} STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Veličina sučelja -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Odaberite koju ćete veličinu elementa sučelja koristiti -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normalno -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Dvostruka veličina -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Četvorostruka veličina -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Veličina fonta -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Odaberite veličinu fonta za sučelje - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normalno -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Dvostruka veličina -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Četvorostruka veličina @@ -1160,8 +1119,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Prikaz: STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 funti (£) u vašoj valuti STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Promijeni parametre proizvoljne valute -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Najveći broj natjecatelja: {ORANGE}{COMMA} - STR_NONE :Ništa STR_FUNDING_ONLY :Samo financiranje STR_MINIMAL :Najmanje @@ -1211,6 +1168,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Blagi krajolik +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Subarktički krajolik +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Suptropski krajolik +STR_CLIMATE_TOYLAND_LANDSCAPE :Krajolik 'zemlja igračaka' + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Vrlo ravno STR_TERRAIN_TYPE_FLAT :Ravno @@ -1553,6 +1516,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Unaprijeđen STR_CONFIG_SETTING_ROAD_SIDE :Cestovna vozila: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Odaberite stranu vožnje +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Vozi na lijevoj strani +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Vozi na desnoj strani + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Rotacija visinske karte: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Obrnuto od smjera kazaljke na satu @@ -2055,7 +2022,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Automatsko okre STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Dozvoli vlakovima okretanje kod signala ako tamo čekaju duže vrijeme ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Preporučljivo) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Preporučljivo) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Promijeni vrijednost postavke @@ -2097,7 +2064,6 @@ STR_INTRO_HIGHSCORE :{BLACK}Tablica STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Postavke STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF Postavke STR_INTRO_ONLINE_CONTENT :{BLACK}Provjeri online sadržaj -STR_INTRO_SCRIPT_SETTINGS :{BLACK}Postavke UI-ja/Skripte igre STR_INTRO_QUIT :{BLACK}Izlaz STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Započni novu igru. Ctrl+klik preskače konfiguriranje karte @@ -2117,7 +2083,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Prikaži STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Prikaži postavke STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Prikaži postavke NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Provjeri novi i nadograđeni sadržaj za preuzimanje -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Prikaži postavke UI-ja/Skripte igre STR_INTRO_TOOLTIP_QUIT :{BLACK}Izzađi it 'OpenTTD'-a STR_INTRO_BASESET :{BLACK}Trenutno odabranom osnovnom grafičkom setu nedostaje {NUM} sprite{P "" a a}. Potražite nadogradnju grafičkog seta. @@ -2148,12 +2113,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Promije STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Promijeni tekuću godinu STR_CHEAT_SETUP_PROD :{LTBLUE}Omogući izmjeni produkcijskih vrijednosti: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Blagi krajolik -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Subarktički krajolik -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Suptropski krajolik -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Krajolik 'zemlja igračaka' - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} -Boja @@ -3084,6 +3043,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Veličin STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Odaberi veličinu mape u poljima. Broj dostupnih polja biti će malo manji STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Broj gradova: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Imena gradova: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Odaberi stil za imena gradova STR_MAPGEN_DATE :{BLACK}Datum: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Broj industrija: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Najviši vrh: @@ -3092,12 +3053,35 @@ STR_MAPGEN_SNOW_COVERAGE_DOWN :{BLACK}Smanji p STR_MAPGEN_DESERT_COVERAGE :{BLACK}Pustinjska pokrivenost: STR_MAPGEN_LAND_GENERATOR :{BLACK}Izrađivač zemljišta: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Vrsta terena: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Razina mora: +STR_MAPGEN_SEA_LEVEL :{BLACK}Razina mora: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Rijeke: STR_MAPGEN_SMOOTHNESS :{BLACK}Graduacija: STR_MAPGEN_VARIETY :{BLACK}Distribucija raznovrsnosti: STR_MAPGEN_GENERATE :{WHITE}Izradi +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Engleski (original) +STR_MAPGEN_TOWN_NAME_FRENCH :Francuski +STR_MAPGEN_TOWN_NAME_GERMAN :Njemački +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Engleski (dodatno) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Latinoamerički +STR_MAPGEN_TOWN_NAME_SILLY :Blesavo +STR_MAPGEN_TOWN_NAME_SWEDISH :Švedski +STR_MAPGEN_TOWN_NAME_DUTCH :Nizozemski +STR_MAPGEN_TOWN_NAME_FINNISH :Finski +STR_MAPGEN_TOWN_NAME_POLISH :Poljski +STR_MAPGEN_TOWN_NAME_SLOVAK :Slovački +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norveški +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Mađarski +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Austrijski +STR_MAPGEN_TOWN_NAME_ROMANIAN :Rumunjski +STR_MAPGEN_TOWN_NAME_CZECH :Češki +STR_MAPGEN_TOWN_NAME_SWISS :Švicarski +STR_MAPGEN_TOWN_NAME_DANISH :Danski +STR_MAPGEN_TOWN_NAME_TURKISH :Turski +STR_MAPGEN_TOWN_NAME_ITALIAN :Talijanski +STR_MAPGEN_TOWN_NAME_CATALAN :Katalonski + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Rubovi Karte: STR_MAPGEN_NORTHWEST :{BLACK}Sjeverozapad @@ -3240,6 +3224,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Prethodn STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Otiđi na prethodni normalni sprite, preskačući svaki pseudo/prebojani/font sprite i {BLACK}Otiđi na sljedeći normalni sprite, preskačući svaki pseudo/prebojani/font sprite i nakon dolaska na prvi prebaci na zadnjeg STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Prikaz trenutno odabranog spritea. Poravnjanje se ignorira kod crtanja ovog spritea. STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Pomakni sprite mijenjajući X i Y pomake. Ctrl+Click za micanje po 8 jedinica odjednom. + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Poništi relativne STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Poništi trenutne relativne pomake STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X pomak: {NUM}, Y pomak: {NUM} (Apsolutni) @@ -3789,6 +3777,8 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK} Najveć STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Domet: {GOLD}{COMMA} polja STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Vrsta zrakoplova: {GOLD}{STRING} +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Popis vlakova za odabir. Klikni na vozilo za informacije. Ctrl+klik za uključivanje ili isključivanje prikaza vrste vozila STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Popis cestovnih vozila za odabir. Klikni na vozilo za informacije. Ctrl+klik za uključivanje ili isključivanje prikaza vrste cestovnog vozila @@ -4440,12 +4430,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Jedna od STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Prozor za debugiranje UI-ja/Skripte igre je dopušten samo za poslužitelj # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Konfiguracija UI-ja/Skripte igre STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Skripta Igre koja će biti učitana u sljedećoj igri STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}UI-jevi koji će biti učitani u sljedećoj igri STR_AI_CONFIG_HUMAN_PLAYER :Ljudski igrač STR_AI_CONFIG_RANDOM_AI :Nasumična UI STR_AI_CONFIG_NONE :(nijedan) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Najveći broj natjecatelja: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Pomakni gore STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Pomakni odabrani UI gore na listi @@ -4455,8 +4445,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Pomakni STR_AI_CONFIG_GAMESCRIPT :{SILVER}Skripta Igre STR_AI_CONFIG_AI :{SILVER}UI-jevi -STR_AI_CONFIG_CHANGE :{BLACK}Odaberi {STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :UI STR_AI_CONFIG_CHANGE_GAMESCRIPT :Skripta Igre STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Učitaj drugu skriptu @@ -4487,9 +4475,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Slika vi STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Slika mini-mape # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametri STR_AI_SETTINGS_CAPTION_AI :UI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Skripta Igre STR_AI_SETTINGS_CLOSE :{BLACK}Zatvori STR_AI_SETTINGS_RESET :{BLACK}Resetiraj STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4903,6 +4889,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Nije mog STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... vozilo je uništeno + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Neće biti dostupno nijedno vozilo STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Promijenite konfiguraciju NewGRF-a STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Još nema dostupnih vozila diff --git a/src/lang/czech.txt b/src/lang/czech.txt index 87e80aba79..09fcdebcea 100644 --- a/src/lang/czech.txt +++ b/src/lang/czech.txt @@ -275,6 +275,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}hp STR_UNITS_POWER_METRIC :{COMMA}{NBSP}hp STR_UNITS_POWER_SI :{COMMA}{NBSP}kW + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -466,10 +467,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Ukončit # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Možnosti hry STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Nastavení -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Nastavení AI / hry STR_SETTINGS_MENU_NEWGRF_SETTINGS :Nastavení grafik STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Nastavení průhlednosti STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Zobrazení jmen měst @@ -1052,36 +1052,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Indická rupie STR_GAME_OPTIONS_CURRENCY_IDR :Indonéská rupie (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Malajsijský Ringgit (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Vlevo -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Vpravo - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Názvy měst -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Výběr stylu jmen měst - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Anglická (původní) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Francouzská -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Německá -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Anglická (další) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Latinskoamerická -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Anglická (legrační) -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Švédská -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Holandská -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finská -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Polská -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slovenská -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norská -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Maďarská -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Rakouská -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Rumunská -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Česká -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Švýcarská -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Dánská -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turecká -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italská -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Katalánská - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Automatické ukládání STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Volba intervalu mezi automatickým ukládáním hry @@ -1114,21 +1084,8 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Zaškrtn STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Aktuální ovladač: {STRING} -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Velikost rozhraní -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Zvolit velikost prvků uživatelského rozhraní -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(zjistit automaticky) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normální -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Dvojnásobná velikost -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Čtyřnásobná velikost -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Velikost písma -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Zvolit velikost písma - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(zjistit automaticky) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Běžné -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Dvojnásobná velikost -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Čtyřnásobná velikost STR_GAME_OPTIONS_GRAPHICS :{BLACK}Grafiky @@ -1180,8 +1137,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Náhled STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 liber (£) ve vlastní měně STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Změnit parametry vlastní měny -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Maximální počet protivníků: {ORANGE}{COMMA} - STR_NONE :žádný STR_FUNDING_ONLY :Pouze dotace STR_MINIMAL :Nejmenší @@ -1231,6 +1186,12 @@ STR_SUBSIDY_X2 :2x STR_SUBSIDY_X3 :3x STR_SUBSIDY_X4 :4x +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :krajina mírného pásma +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :subarktická krajina +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :subtropická kraina +STR_CLIMATE_TOYLAND_LANDSCAPE :Země hraček + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :velmi plochá STR_TERRAIN_TYPE_FLAT :plochá @@ -1590,6 +1551,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :vylepšený STR_CONFIG_SETTING_ROAD_SIDE :Silniční vozidla: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Zvol na jaké straně vozovky jezdí vozidla +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Vlevo +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Vpravo + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Otočení výškové mapy: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Doleva @@ -2124,7 +2089,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Automatické ot STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Povoluje vlakům otočit se na semaforech, pokud čekají příliš dlouho ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(doporučený) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(doporučený) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Změnit hodnotu nastavení @@ -2167,7 +2132,6 @@ STR_INTRO_HIGHSCORE :{BLACK}Nejlepš STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Nastavení STR_INTRO_NEWGRF_SETTINGS :{BLACK}Nastavení grafik STR_INTRO_ONLINE_CONTENT :{BLACK}Stahovat součásti -STR_INTRO_SCRIPT_SETTINGS :{BLACK}Nastavení AI / hry STR_INTRO_QUIT :{BLACK}Ukončit STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Hrát novou hru. Pomocí Ctrl přeskočíš nastavení mapy @@ -2187,7 +2151,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Zobrazit STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Nastavení zobrazení STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Ukázat nastavení NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Ukázat, jaký nový nebo upravený obsah se dá stáhnout -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Zobrazit nastavení AI a hry STR_INTRO_TOOLTIP_QUIT :{BLACK}Ukončit 'OpenTTD' STR_INTRO_BASESET :{BLACK}V aktuálně zvolené základní sadě grafiky chybí {NUM} sprit{P "" y ů}. Zkuste, prosím, vyhledat aktualizovanou základní sadu. @@ -2219,12 +2182,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Změnit STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Změnit rok STR_CHEAT_SETUP_PROD :{LTBLUE}Povolit změnu produkce průmyslu: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :krajina mírného pásma -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :subarktická krajina -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :subtropická kraina -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Země hraček - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - barevné schéma @@ -3233,6 +3190,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Velikost STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Vybrat velikost mapy ve čtvercích. Počet dostupných čtverců bude o neco nižší STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Množství měst: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Názvy měst +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Výběr stylu jmen měst STR_MAPGEN_DATE :{BLACK}Datum: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Množství průmyslu: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Nejvyšší vrchol: @@ -3248,12 +3207,35 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Zmenšit STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Generátor krajiny: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Typ krajiny: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Četnost jezer: +STR_MAPGEN_SEA_LEVEL :{BLACK}Četnost jezer: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Řeky: STR_MAPGEN_SMOOTHNESS :{BLACK}Členitost krajiny: STR_MAPGEN_VARIETY :{BLACK}Rozmanitost terénu: STR_MAPGEN_GENERATE :{WHITE}Vytvořit +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Anglická (původní) +STR_MAPGEN_TOWN_NAME_FRENCH :Francouzská +STR_MAPGEN_TOWN_NAME_GERMAN :Německá +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Anglická (další) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Latinskoamerická +STR_MAPGEN_TOWN_NAME_SILLY :Anglická (legrační) +STR_MAPGEN_TOWN_NAME_SWEDISH :Švédská +STR_MAPGEN_TOWN_NAME_DUTCH :Holandská +STR_MAPGEN_TOWN_NAME_FINNISH :Finská +STR_MAPGEN_TOWN_NAME_POLISH :Polská +STR_MAPGEN_TOWN_NAME_SLOVAK :Slovenská +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norská +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Maďarská +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Rakouská +STR_MAPGEN_TOWN_NAME_ROMANIAN :Rumunská +STR_MAPGEN_TOWN_NAME_CZECH :Česká +STR_MAPGEN_TOWN_NAME_SWISS :Švýcarská +STR_MAPGEN_TOWN_NAME_DANISH :Dánská +STR_MAPGEN_TOWN_NAME_TURKISH :Turecká +STR_MAPGEN_TOWN_NAME_ITALIAN :Italská +STR_MAPGEN_TOWN_NAME_CATALAN :Katalánská + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Okraje mapy: STR_MAPGEN_NORTHWEST :{BLACK}Severozápad @@ -3398,6 +3380,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Předcho STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Jít na předchozí normální sprite (s grafikou), přičemž se přeskakují pseudo-/barvící/znakové sprity a při dosažení začátku se jde na konec STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Zobrazení vybraného spritu. Posun se při jeho vykreslení neuvažoval STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Posouvání spritu změnou souřadnic X a Y. Ctrl+kliknutí posouvá o osm jednotek najednou. + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Resetovat STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Resetovat aktuání relativní posunutí STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}Posunutí v ose X: {NUM}, Posunutí v ose Y: {NUM} (Absolutní) @@ -3737,7 +3723,6 @@ STR_FINANCES_SECTION_OTHER :{GOLD}Další STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} -STR_FINANCES_NET_PROFIT :{WHITE}Čistý zisk STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Stav na účtu STR_FINANCES_OWN_FUNDS_TITLE :{WHITE}Vlastní Prostředky STR_FINANCES_LOAN_TITLE :{WHITE}Půjčka @@ -3965,6 +3950,8 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Max. ta STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Dosah: {GOLD}{COMMA} polí STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Typ letadla: {GOLD}{STRING} +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Seznam vlaků - pro informace klikni na vlak. Ctrl+kliknutí způsobí přepínání skrytí typů lokomotiv a vagónů. STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Seznam silničních vozidel - klikni na vozidlo pro informace. Ctrl+kliknutí způsobí přepínání skrytí typu silničního vozidla. @@ -4628,12 +4615,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Někter STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Okno na ladění AI / herních skriptů je dostupné pouze na serveru # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Nastavení AI / hry STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Herní skripty, které budou načteny v příští hře STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}AI, které budou načteny v příští hře STR_AI_CONFIG_HUMAN_PLAYER :Lidský hráč STR_AI_CONFIG_RANDOM_AI :Náhodná AI STR_AI_CONFIG_NONE :(žádný) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Maximální počet protivníků: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Přesunout nahoru STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Přesunout vybranou AI v seznamu výše @@ -4643,8 +4630,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Přesuno STR_AI_CONFIG_GAMESCRIPT :{SILVER}Herní skript STR_AI_CONFIG_AI :{SILVER}AI -STR_AI_CONFIG_CHANGE :{BLACK}Vybrat {STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :AI STR_AI_CONFIG_CHANGE_GAMESCRIPT :Herní skript STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Načíst další skript @@ -4675,9 +4660,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Snímek 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 -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :herní skript STR_AI_SETTINGS_CLOSE :{BLACK}Zavřít STR_AI_SETTINGS_RESET :{BLACK}Obnovit nastavení STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -5101,6 +5084,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Nelze zm STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... vozidlo bylo zničeno + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Žádná vozidla nejsou dostupná STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Zmeň nastavení NewGRF STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Zatím nejsou dostupná žádná vozidla diff --git a/src/lang/danish.txt b/src/lang/danish.txt index c22730b862..12e4df98f8 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -200,6 +200,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}hk STR_UNITS_POWER_METRIC :{COMMA}hk STR_UNITS_POWER_SI :{COMMA}kW + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}kg @@ -391,10 +392,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Afslut # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Opsætning STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Indstillinger -STR_SETTINGS_MENU_SCRIPT_SETTINGS :AI/spilscript-indstillinger STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF indstillinger STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Gennemsigtighedsvalg STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Bynavne vist @@ -965,36 +965,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Indisk rupi (IN STR_GAME_OPTIONS_CURRENCY_IDR :Indonesisk Rupiah (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Malaysisk Ringgit (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Kør i venstre side -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Kør i højre side - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Bynavne: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Vælg stil for bynavne - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Engelske -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Franske -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Tyske -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Engelske (ekstra) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Latin-Amerikanske -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Fjollede -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Svenske -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Hollandske -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finske -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Polske -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slovakiske -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norske -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Ungarske -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Østrigske -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Rumænske -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Tjekkiske -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Schweiziske -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Danske -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Tyrkiske -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italienske -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Catalanske - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Automatisk gemning STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Vælg interval imellem automatisk gemning @@ -1026,21 +996,8 @@ STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Afmærk dette felt for at v-synkronisere skærmen. Ændringer af indstillingen er først effektiv efter spillet er genstartet. Fungerer kun med hardware-acceleration aktiveret. -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}grænseflade størrelse -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Vælg den grænseflade størrelse du ønsker at benytte -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(auto-bestem) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Dobbelt størrelse -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Quad (4x) størrelse -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Skriftstørrelse -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Vælg skriftstørrelsen du ønsker i grænsefladen - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(auto-bestem) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Dobbelt størrelse -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Quad (4x) størrelse STR_GAME_OPTIONS_GRAPHICS :{BLACK}Grafik @@ -1092,8 +1049,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Eksempe STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 pund (£) i din valuta STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Skift brugerdefinerede møntfodsparametre -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Maksimalt antal modstandere: {ORANGE}{COMMA} - STR_NONE :Ingen STR_FUNDING_ONLY :Kun finansiering STR_MINIMAL :Minimal @@ -1143,6 +1098,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Tempereret klima +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Arktisk klima +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Tropisk klima +STR_CLIMATE_TOYLAND_LANDSCAPE :Legetøjsland + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Meget fladt STR_TERRAIN_TYPE_FLAT :Fladt @@ -1501,6 +1462,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Forbedret STR_CONFIG_SETTING_ROAD_SIDE :Vejkøretøjer: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Vælg køre side +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Kør i venstre side +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Kør i højre side + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Rotér højdekort: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Mod uret @@ -2029,7 +1994,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Vend automatisk STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Tillad tog at vende ved et signal, hvis det har ventet i lang tid ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Anbefalet) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Anbefalet) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Skift indstillingsværdi @@ -2072,7 +2037,6 @@ STR_INTRO_HIGHSCORE :{BLACK} Topresu STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Indstillinger STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF indstillinger STR_INTRO_ONLINE_CONTENT :{BLACK}Tjek Online Indhold -STR_INTRO_SCRIPT_SETTINGS :{BLACK}AI/Spilscript indstillinger STR_INTRO_QUIT :{BLACK}Afslut STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Start et nyt spil. Ctrl+Klik springer kortindstillingerne over. @@ -2092,7 +2056,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Hvis top STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Skærm indstillinger STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Vis NewGRF-indstillinger STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Tjek for nyt og opdateret indhold til download -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Vis computerspiller/spilscript indstillinger STR_INTRO_TOOLTIP_QUIT :{BLACK}Afslut 'OpenTTD' STR_INTRO_BASESET :{BLACK} Det aktuelt valgte base grafiksæt mangler {NUM} sprite {P "" s}. Se venligst efter opdateringer til basesættet. @@ -2124,12 +2087,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Ændre STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Skift år STR_CHEAT_SETUP_PROD :{LTBLUE}Aktiver modifikation af produktion: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Tempereret klima -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Arktisk klima -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Tropisk klima -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Legetøjsland - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Farvetema @@ -3132,6 +3089,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Kortstø STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Vælg kortets størrelse i fliser. Antallet af tilgængelige fliser vil være en anelse mindre STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Antal byer: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Bynavne: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Vælg stil for bynavne STR_MAPGEN_DATE :{BLACK}Dato: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Antal industrier: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Højeste bjergtop: @@ -3147,12 +3106,35 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Sænker STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Terrængenerator: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terræntype: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Havniveau +STR_MAPGEN_SEA_LEVEL :{BLACK}Havniveau STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Floder: STR_MAPGEN_SMOOTHNESS :{BLACK}Blødhed: STR_MAPGEN_VARIETY :{BLACK}Varietet af distributionen: STR_MAPGEN_GENERATE :{WHITE}Generer +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Engelske +STR_MAPGEN_TOWN_NAME_FRENCH :Franske +STR_MAPGEN_TOWN_NAME_GERMAN :Tyske +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Engelske (ekstra) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Latin-Amerikanske +STR_MAPGEN_TOWN_NAME_SILLY :Fjollede +STR_MAPGEN_TOWN_NAME_SWEDISH :Svenske +STR_MAPGEN_TOWN_NAME_DUTCH :Hollandske +STR_MAPGEN_TOWN_NAME_FINNISH :Finske +STR_MAPGEN_TOWN_NAME_POLISH :Polske +STR_MAPGEN_TOWN_NAME_SLOVAK :Slovakiske +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norske +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Ungarske +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Østrigske +STR_MAPGEN_TOWN_NAME_ROMANIAN :Rumænske +STR_MAPGEN_TOWN_NAME_CZECH :Tjekkiske +STR_MAPGEN_TOWN_NAME_SWISS :Schweiziske +STR_MAPGEN_TOWN_NAME_DANISH :Danske +STR_MAPGEN_TOWN_NAME_TURKISH :Tyrkiske +STR_MAPGEN_TOWN_NAME_ITALIAN :Italienske +STR_MAPGEN_TOWN_NAME_CATALAN :Catalanske + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Kortkanter: STR_MAPGEN_NORTHWEST :{BLACK}Nordvest @@ -3297,6 +3279,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Forrige STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Fortsæt til den forrige normal sprite, spring pseudo/omfarvning/font-sprites over og omløb fra starten til slutningen STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Repræsentation af den markerede sprite. Justeringen ignoreres når denne sprite tegnes. STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Flyt spriten rundt for at ændre X- og Y-forskydningen. Ctrl+Klik for at flytte spriten otte enheder af gangen + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Nulstil relativ STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Nulstil den nuværende relative forskydning STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X-forskydning: {NUM}, Y-forskydning: {NUM} (Absolut) @@ -3853,6 +3839,8 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Maks. tr STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Rækkevidde: {GOLD}{COMMA} felter STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Fly type: {GOLD}{STRING} +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Togvalgsliste - klik på et køretøj for mere information STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Liste over køretøjstyper - klik på køretøj for information @@ -4513,12 +4501,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}En af de STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Computerspiller/script-debugvindue er kun tilgængeligt for serveren # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Konfiguration af computerspiller/spilscript STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Spilscriptet der vil bliver indlæst i næste spil STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}AIer der vil bliver loaded i næste spil STR_AI_CONFIG_HUMAN_PLAYER :Menneskelig spiller STR_AI_CONFIG_RANDOM_AI :Tilfældig computerspiller STR_AI_CONFIG_NONE :(ingen) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Maksimalt antal modstandere: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Flyt op STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Flyt valgte computerspiller op i listen @@ -4528,8 +4516,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Flyt val STR_AI_CONFIG_GAMESCRIPT :{SILVER}Spilscript STR_AI_CONFIG_AI :{SILVER}KI'er -STR_AI_CONFIG_CHANGE :{BLACK}Vælg {STRING} -STR_AI_CONFIG_CHANGE_NONE :Ingen ændringer STR_AI_CONFIG_CHANGE_AI :AI STR_AI_CONFIG_CHANGE_GAMESCRIPT :Spilscript STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Indlæs et andet script @@ -4560,9 +4546,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Højdeko STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Minikort skærmbillede # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametre STR_AI_SETTINGS_CAPTION_AI :AI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Spilscript STR_AI_SETTINGS_CLOSE :{BLACK}Luk STR_AI_SETTINGS_RESET :{BLACK}Nulstil STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4979,6 +4963,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Kan ikke STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... fartøjet er ødelagt + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Ingen køretøjer vil være tilgængelige overhovedet STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Skift din NewGRF-konfiguration STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Ingen køretøjer er tilgængelige endnu diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index 917391e880..38d75a2a28 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -200,6 +200,16 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}pk STR_UNITS_POWER_METRIC :{COMMA}{NBSP}pk STR_UNITS_POWER_SI :{COMMA}{NBSP}kW +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}pk/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_SI :{DECIMAL}{NBSP}pk/Mg +STR_UNITS_POWER_METRIC_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}pk/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}pk/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_SI :{DECIMAL}{NBSP}pk/Mg +STR_UNITS_POWER_SI_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_SI :{DECIMAL}{NBSP}W/kg + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -391,10 +401,11 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Afsluiten # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Spelopties STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Instellingen -STR_SETTINGS_MENU_SCRIPT_SETTINGS :AI-/spelscriptinstellingen +STR_SETTINGS_MENU_AI_SETTINGS :AI-instellingen +STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :Spelscript-instellingen STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF-instellingen STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Doorzichtigheidsopties STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Plaatsnamen weergeven @@ -965,36 +976,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Indiase rupee ( STR_GAME_OPTIONS_CURRENCY_IDR :Indonesische roepia (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Maleisische Ringgit (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Links rijden -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Rechts rijden - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Plaatsnamen: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Stijl voor plaatsnamen kiezen - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Engels (Origineel) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Frans -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Duits -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Engels (Extra) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Latijns-Amerikaans -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Zot -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Zweeds -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Nederlands -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Fins -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Pools -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slowaaks -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Noors -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Hongaars -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Oostenrijks -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Roemeens -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Tsjechisch -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Zwitsers -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Deens -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turks -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italiaans -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Catalaans - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Automatisch opslaan STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Tijdsduur kiezen tussen automatisch opgeslagen spellen @@ -1027,21 +1008,19 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Selectee STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Huidige driver: {STRING} -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Formaat bedieningselementen -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Selecteer de grootte van bedieningselementen +STR_GAME_OPTIONS_GUI_SCALE_FRAME :{BLACK}Grootte gebruikersscherm +STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Sleep de schuif om de grootte van het gebruikersscherm in te stellen. Hou Ctrl ingedrukt voor geleidelijke aanpassing +STR_GAME_OPTIONS_GUI_SCALE_AUTO :{BLACK}Grootte automatisch detecteren +STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Vink dit vakje aan om de grootte van het gebruikersscherm automatisch te detecteren -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(automatische detectie) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normaal -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Dubbele grootte -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :4x Grootte +STR_GAME_OPTIONS_GUI_SCALE_BEVELS :{BLACK}Randen schalen +STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :{BLACK}Vink dit vakje aan om randen te schalen op grootte van gebruikersscherm -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Lettergrootte -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Selecteer de grootte van de letters - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(automatische detectie) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normaal -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Dubbele grootte -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Viervoudige grootte +STR_GAME_OPTIONS_GUI_SCALE_1X :1x +STR_GAME_OPTIONS_GUI_SCALE_2X :2x +STR_GAME_OPTIONS_GUI_SCALE_3X :3x +STR_GAME_OPTIONS_GUI_SCALE_4X :4x +STR_GAME_OPTIONS_GUI_SCALE_5X :5x STR_GAME_OPTIONS_GRAPHICS :{BLACK}Weergave @@ -1093,8 +1072,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Voorbee STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10.000 pond (£) in jouw munteenheid STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Aangepaste valutaparameters wijzigen -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Maximaal aantal tegenstanders: {ORANGE}{COMMA} - STR_NONE :Geen STR_FUNDING_ONLY :Alleen gefinancierd STR_MINIMAL :Minimaal @@ -1144,6 +1121,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Gematigd landschap +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Subarctisch landschap +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Subtropisch landschap +STR_CLIMATE_TOYLAND_LANDSCAPE :Speelgoedlandschap + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Zeer vlak STR_TERRAIN_TYPE_FLAT :Vlak @@ -1449,6 +1432,8 @@ STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Breedte van de 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_SHOW_CARGO_IN_LISTS :Mogelijke lading van voertuigen weergeven in lijstvensters {STRING} +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS_HELPTEXT :Wanneer ingeschakeld, verschijnt de mogelijke lading van het voertuig erboven in voertuiglijsten 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. @@ -1503,6 +1488,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Verbeterd STR_CONFIG_SETTING_ROAD_SIDE :Wegvoertuigen: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Rijzijde voor verkeer kiezen +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Links rijden +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Rechts rijden + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Draaiing van hoogtekaart: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Tegen de klok in @@ -2037,7 +2026,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Automatisch omd STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Treinen mogen keren bij een sein als ze hier lang staan wachten ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Aanbevolen) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Aanbevolen) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Instelwaarde wijzigen @@ -2080,7 +2069,8 @@ STR_INTRO_HIGHSCORE :{BLACK}Scoretab STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Instellingen STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF-instellingen STR_INTRO_ONLINE_CONTENT :{BLACK}Online inhoud zoeken -STR_INTRO_SCRIPT_SETTINGS :{BLACK}AI-/spelscriptinstellingen +STR_INTRO_AI_SETTINGS :{BLACK}AI-instellingen +STR_INTRO_GAMESCRIPT_SETTINGS :{BLACK}Spelscript-instellingen STR_INTRO_QUIT :{BLACK}Afsluiten STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Start een nieuw spel. Ctrl+klik slaat de kaartconfiguratie over @@ -2100,7 +2090,8 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Scoretab STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Scherminstellingen STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}NewGRF-instellingen weergeven STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Zoeken naar nieuwe en aangepaste inhoud om te downloaden -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}AI-/spelscriptinstellingen weergeven +STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}AI-instellingen weergeven +STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Spelscript-instellingen weergeven STR_INTRO_TOOLTIP_QUIT :{BLACK}'OpenTTD' afsluiten STR_INTRO_BASESET :{BLACK}De huidige gekozen set grafische elementen mist {NUM} sprite{P "" s}. Controleer of er updates zijn voor deze basisset. @@ -2132,12 +2123,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Datum w STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Huidig jaar wijzigen STR_CHEAT_SETUP_PROD :{LTBLUE}Productiewaarden aanpassen toestaan: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Gematigd landschap -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Subarctisch landschap -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Subtropisch landschap -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Speelgoedlandschap - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - kleurenschema @@ -2497,13 +2482,13 @@ STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :wacht op bijwer STR_NETWORK_MESSAGE_CLIENT_LEAVING :vertrekt STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} heeft zich bij het spel gevoegd -STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {STRING} heeft zich bij het spel gevoegd (Speler #{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} heeft zich gevoegd bij bedrijf nr. {2:NUM} +STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {0:STRING} heeft zich bij het spel gevoegd (Speler #{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {0:STRING} heeft zich gevoegd bij bedrijf nr. {2:NUM} STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} kijkt nu toe -STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} heeft een nieuw bedrijf opgericht (nr. {2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} heeft het spel verlaten ({2:STRING}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {0:STRING} heeft een nieuw bedrijf opgericht (nr. {2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {0:STRING} heeft het spel verlaten ({2:STRING}) STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} heeft diens naam gewijzigd in {STRING} -STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} gaf {2:CURRENCY_LONG} aan {1:STRING} +STR_NETWORK_MESSAGE_GIVE_MONEY :*** {0:STRING} gaf {2:CURRENCY_LONG} aan {1:STRING} STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}De server heeft de sessie gesloten STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}De server wordt opnieuw gestart...{}Wacht alstublieft... STR_NETWORK_MESSAGE_KICKED :*** {STRING} is eruit geschopt. Reden: ({STRING}) @@ -3144,6 +3129,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Kaartgro STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Selecteer het formaat van de kaart in tegels. Het aantal beschikbare tegels zal iets kleiner zijn STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Aantal steden: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Plaatsnamen: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Stijl voor plaatsnamen kiezen STR_MAPGEN_DATE :{BLACK}Datum: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Aantal industrieën: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Hoogste berg: @@ -3159,11 +3146,40 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Verklein STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Landgenerator: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terreintype: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Zeeniveau: +STR_MAPGEN_SEA_LEVEL :{BLACK}Zeeniveau: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Rivieren: STR_MAPGEN_SMOOTHNESS :{BLACK}Gladheid: STR_MAPGEN_VARIETY :{BLACK}Landschapsvariatie: STR_MAPGEN_GENERATE :{WHITE}Maken +STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF-instellingen +STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}NewGRF-instellingen weergeven +STR_MAPGEN_AI_SETTINGS :{BLACK}AI-instellingen +STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}AI-instellingen weergeven +STR_MAPGEN_GS_SETTINGS :{BLACK}Spelscript-instellingen +STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Spelscript-instellingen weergeven + +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Engels (Origineel) +STR_MAPGEN_TOWN_NAME_FRENCH :Frans +STR_MAPGEN_TOWN_NAME_GERMAN :Duits +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Engels (Extra) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Latijns-Amerikaans +STR_MAPGEN_TOWN_NAME_SILLY :Zot +STR_MAPGEN_TOWN_NAME_SWEDISH :Zweeds +STR_MAPGEN_TOWN_NAME_DUTCH :Nederlands +STR_MAPGEN_TOWN_NAME_FINNISH :Fins +STR_MAPGEN_TOWN_NAME_POLISH :Pools +STR_MAPGEN_TOWN_NAME_SLOVAK :Slowaaks +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Noors +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Hongaars +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Oostenrijks +STR_MAPGEN_TOWN_NAME_ROMANIAN :Roemeens +STR_MAPGEN_TOWN_NAME_CZECH :Tsjechisch +STR_MAPGEN_TOWN_NAME_SWISS :Zwitsers +STR_MAPGEN_TOWN_NAME_DANISH :Deens +STR_MAPGEN_TOWN_NAME_TURKISH :Turks +STR_MAPGEN_TOWN_NAME_ITALIAN :Italiaans +STR_MAPGEN_TOWN_NAME_CATALAN :Catalaans # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Kaartranden: @@ -3309,6 +3325,13 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Vorige s STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Doorgaan met de vorige normale sprite, alle pseudo-/herkleur-/lettertype-sprites overslaan; bij het einde terug naar het begin STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Voorbeeld van de huidige sprite. De uitlijning wordt genegeerd bij het weergeven van deze sprite. STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Sprite verplaatsen, dit verandert X en Y offsets. Ctr+klik om de sprite 8 eenheden per keer te verplaatsen. + +###length 2 +STR_SPRITE_ALIGNER_CENTRE_OFFSET :{BLACK}Op offset gecentreerd +STR_SPRITE_ALIGNER_CENTRE_SPRITE :{BLACK}Op sprite gecentreerd + +STR_SPRITE_ALIGNER_CROSSHAIR :{BLACK}Richtkruis + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Relatief herstellen STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Herstel de huidige relatieve offsets STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X-offset: {NUM}, Y-offset: {NUM} (absoluut) @@ -3326,15 +3349,15 @@ STR_NEWGRF_ERROR_MSG_FATAL :{RED}Fatale fou STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Een fatale NewGRF-fout is ontstaan:{}{STRING} STR_NEWGRF_ERROR_POPUP :{WHITE}Er is een NewGRF-fout opgetreden:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} werkt niet met de TTDPatch-versie die is opgegeven door OpenTTD -STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} is voor versie {STRING} van TTD -STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} is ontwikkeld voor {STRING} -STR_NEWGRF_ERROR_INVALID_PARAMETER :Ongeldige parameter voor {1:STRING}: parameter {STRING} ({NUM}) -STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} moet geladen zijn voor {STRING} -STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} moet geladen zijn na {STRING} -STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} heeft OpenTTD-versie {STRING} of beter nodig +STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} is voor versie {2:STRING} van TTD +STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} is ontwikkeld voor {2:STRING} +STR_NEWGRF_ERROR_INVALID_PARAMETER :Ongeldige parameter voor {1:STRING}: parameter {2:STRING} ({3:NUM}) +STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} moet geladen zijn voor {2:STRING} +STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} moet geladen zijn na {2:STRING} +STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} heeft OpenTTD-versie {2:STRING} of beter nodig STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :het GRF-bestand die het probeert te vertalen STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Er zijn te veel NewGRFs geladen -STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Laden van {1:STRING} als statische NewGRF met {STRING} kan desynchronisatiefouten (desyncs) veroorzaken +STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Laden van {1:STRING} als statische NewGRF met {2:STRING} kan desynchronisatiefouten (desyncs) veroorzaken STR_NEWGRF_ERROR_UNEXPECTED_SPRITE :Onverwachte sprite (sprite {3:NUM}) STR_NEWGRF_ERROR_UNKNOWN_PROPERTY :Onbekende Action 0-eigenschap {4:HEX} (sprite {3:NUM}) STR_NEWGRF_ERROR_INVALID_ID :Poging om ongeldige id te gebruiken (sprite {3:NUM}) @@ -3466,14 +3489,14 @@ STR_LOCAL_AUTHORITY_ACTION_EXCLUSIVE_TRANSPORT :Exclusieve tran STR_LOCAL_AUTHORITY_ACTION_BRIBE :Gemeentebestuur omkopen ###length 8 -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{YELLOW}Begin een kleine reclamecampagne om meer passagiers en vracht naar jouw transportdiensten te trekken.{}Zorgt voor een tijdelijk hogere stationswaardering in een klein gebied rondom het centrum.{}Kosten: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{YELLOW}Begin een middelgrote reclamecampagne om meer passagiers en vracht naar jouw transportdiensten te trekken.{}Zorgt voor een tijdelijk hogere stationswaardering in een middelgroot gebied rondom het centrum.{}Kosten: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{YELLOW}Begin een grote reclamecampagne om meer passagiers en vracht naar jouw transportdiensten te trekken.{}Zorgt voor een tijdelijk hogere stationswaardering in een groot gebied rondom het centrum.{}Kosten: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{YELLOW}Financier een reconstructie van het wegennetwerk.{}Veroorzaakt tot 6 maanden lang een aanzienlijke verstoring van het wegverkeer.{}Kosten: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{YELLOW}Een standbeeld bouwen ter ere van jouw bedrijf.{}Zorgt voor een blijvend hogere stationswaardering in deze stad.{}Kosten: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{YELLOW}De bouw van nieuwe gebouwen in de stad financieren.{}Zorgt voor een tijdelijk hogere groei van deze stad.{}Kosten: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW}1 jaar exclusieve transportrechten kopen in deze plaats.{}Het gemeentebestuur staat alleen passagiers en vracht toe bij jouw stations.{}Kosten: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Koop het plaatselijk gezag om om je reputatie te verhogen met het risico op een strenge sanctie wanneer je gepakt wordt.{}Kosten: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{YELLOW}Begin een kleine reclamecampagne om meer passagiers en vracht naar jouw transportdiensten te trekken.{}Zorgt voor een tijdelijk hogere stationswaardering in een klein gebied rondom het centrum.{}{POP_COLOUR}Kosten: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{PUSH_COLOUR}{YELLOW}Begin een middelgrote reclamecampagne om meer passagiers en vracht naar jouw transportdiensten te trekken.{}Zorgt voor een tijdelijk hogere stationswaardering in een middelgroot gebied rondom het centrum.{}{POP_COLOUR}Kosten: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}Begin een grote reclamecampagne om meer passagiers en vracht naar jouw transportdiensten te trekken.{}Zorgt voor een tijdelijk hogere stationswaardering in een groot gebied rondom het centrum.{}{POP_COLOUR}Kosten: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{PUSH_COLOUR}{YELLOW}Financier een reconstructie van het wegennetwerk.{}Veroorzaakt tot 6 maanden lang een aanzienlijke verstoring van het wegverkeer.{}{POP_COLOUR}Kosten: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Bouw een standbeeld ter ere van jouw bedrijf.{}Zorgt voor een blijvend hogere stationswaardering in deze stad.{}{POP_COLOUR}Kosten: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Financier de bouw van nieuwe gebouwen in de stad.{}Zorgt voor een tijdelijk hogere groei van deze stad.{}{POP_COLOUR}Kosten: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}1 jaar exclusieve transportrechten kopen in deze plaats.{}Het gemeentebestuur staat alleen passagiers en vracht toe bij jouw stations.{}{POP_COLOUR}Kosten: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Koop het plaatselijk gezag om om je reputatie te verhogen met het risico op een ernstige sanctie wanneer je gepakt wordt.{}{POP_COLOUR}Kosten: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}{COMPANY} Doelen @@ -3646,16 +3669,18 @@ STR_FINANCES_SECTION_SHIP_REVENUE :{GOLD}Schepen STR_FINANCES_SECTION_LOAN_INTEREST :{GOLD} Rente van lening STR_FINANCES_SECTION_OTHER :{GOLD}Overig +STR_FINANCES_TOTAL_CAPTION :{WHITE}Totaal STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} STR_FINANCES_ZERO_INCOME :{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} -STR_FINANCES_NET_PROFIT :{WHITE}Nettowinst +STR_FINANCES_PROFIT :{WHITE}Winst STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Banksaldo STR_FINANCES_OWN_FUNDS_TITLE :{WHITE}Eigen kapitaal STR_FINANCES_LOAN_TITLE :{WHITE}Lening STR_FINANCES_INTEREST_RATE :{WHITE}Rente op lening: {BLACK}{NUM}% STR_FINANCES_MAX_LOAN :{WHITE}Maximale lening: {BLACK}{CURRENCY_LONG} STR_FINANCES_TOTAL_CURRENCY :{BLACK}{CURRENCY_LONG} +STR_FINANCES_BANK_BALANCE :{WHITE}{CURRENCY_LONG} STR_FINANCES_BORROW_BUTTON :{BLACK}{CURRENCY_LONG} lenen STR_FINANCES_BORROW_TOOLTIP :{BLACK}Vergroot lening. Ctrl+klik om zoveel als mogelijk te lenen STR_FINANCES_REPAY_BUTTON :{BLACK}{CURRENCY_LONG} terugbetalen @@ -3756,7 +3781,7 @@ STR_INDUSTRY_VIEW_PRODUCES_N_CARGO :{BLACK}Producee STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :, {STRING}{STRING} STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Vereist: -STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{0:STRING}{BLACK}{3:STRING} STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} wachtend{STRING} STR_CONFIG_GAME_PRODUCTION :{WHITE}Productie wijzigen (veelvoud van 8, maximaal 2040) @@ -3786,6 +3811,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Stuur in STR_VEHICLE_LIST_REPLACE_VEHICLES :Vervang voertuigen STR_VEHICLE_LIST_SEND_FOR_SERVICING :Stuur voor onderhoud STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Winst dit jaar: {CURRENCY_LONG} (vorig jaar: {CURRENCY_LONG}) +STR_VEHICLE_LIST_CARGO :{TINY_FONT}{BLACK}[{CARGO_LIST}] +STR_VEHICLE_LIST_NAME_AND_CARGO :{TINY_FONT}{BLACK}{STRING} {STRING} STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Stuur naar depot STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Stuur naar garage @@ -3877,6 +3904,11 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Max. tre STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Bereik: {GOLD}{COMMA} tegels STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Vliegtuigtype: {GOLD}{STRING} +###length 3 +STR_CARGO_TYPE_FILTER_ALL :Alle soorten vracht +STR_CARGO_TYPE_FILTER_FREIGHT :Vracht +STR_CARGO_TYPE_FILTER_NONE :Geen + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Spoorvoertuigkeuzelijst. Klik op een spoorvoertuig voor informatie. Ctrl+klik voor spoorvoertuigtype weergeven-verbergen. STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Wegvoertuigkeuzelijst. Klik op wegvoertuig voor informatie. Ctrl+klik voor voertuigtype weergeven-verbergen. @@ -4045,7 +4077,7 @@ STR_ENGINE_PREVIEW_AIRCRAFT :vliegtuig STR_ENGINE_PREVIEW_SHIP :schip STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Kosten: {CURRENCY_LONG} Gewicht: {WEIGHT_SHORT}{}Snelheid: {VELOCITY} Kracht: {POWER}{}Lopende kosten: {CURRENCY_LONG}/jr{}Capaciteit: {CARGO_LONG} -STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Kosten: {CURRENCY_LONG} Gewicht: {WEIGHT_SHORT}{}Snelheid: {VELOCITY} Kracht: {POWER} Max. T.E.: {6:FORCE}{}Lopende kosten: {4:CURRENCY_LONG}/yr{}Capaciteit: {5:CARGO_LONG} +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Kosten: {0:CURRENCY_LONG} Gewicht: {1:WEIGHT_SHORT}{}Snelheid: {2:VELOCITY} Kracht: {3:POWER} Max. T.E.: {6:FORCE}{}Lopende kosten: {4:CURRENCY_LONG}/yr{}Capaciteit: {5:CARGO_LONG} STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Kosten: {CURRENCY_LONG} Max.snelheid: {VELOCITY}{}Capaciteit: {CARGO_LONG}{}Gebruikskosten: {CURRENCY_LONG}/jaar STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Kosten: {CURRENCY_LONG} Max.snelheid: {VELOCITY}{}Vliegtuigtype: {STRING}{}Capaciteit: {CARGO_LONG}, {CARGO_LONG}{}Gebruikskosten: {CURRENCY_LONG}/jaar STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Kosten: {CURRENCY_LONG} Max.snelheid: {VELOCITY}{}Vliegtuigtype: {STRING}{}Capaciteit: {CARGO_LONG}{}Gebruikskosten: {CURRENCY_LONG}/jaar @@ -4204,12 +4236,13 @@ STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Gewicht: STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Gewicht: {LTBLUE}{WEIGHT_SHORT} {BLACK}Vermogen: {LTBLUE}{POWER}{BLACK} Max.snelheid: {LTBLUE}{VELOCITY} {BLACK}Max. tr.kr.: {LTBLUE}{FORCE} STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Winst dit jaar: {LTBLUE}{CURRENCY_LONG} (vorig jaar: {CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Winst dit jaar: {LTBLUE}{CURRENCY_LONG} (vorig jaar: {CURRENCY_LONG}) {BLACK}Min. prestatie: {LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Betrouwbaarheid: {LTBLUE}{COMMA}% {BLACK}Aantal keren motorpech sinds laatste onderhoud: {LTBLUE}{COMMA} STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Gebouwd: {LTBLUE}{NUM}{BLACK} Waarde: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_INFO_NO_CAPACITY :{BLACK}Capaciteit: {LTBLUE}Geen{STRING} -STR_VEHICLE_INFO_CAPACITY :{BLACK}Capaciteit: {LTBLUE}{CARGO_LONG}{3:STRING} -STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Capaciteit: {LTBLUE}{CARGO_LONG}{3:STRING} (x{4:NUM}) +STR_VEHICLE_INFO_CAPACITY :{BLACK}Capaciteit: {LTBLUE}{0:CARGO_LONG}{3:STRING} +STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Capaciteit: {LTBLUE}{0:CARGO_LONG}{3:STRING} (x{4:NUM}) STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Capaciteit: {LTBLUE}{CARGO_LONG}, {CARGO_LONG}{STRING} STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Geldoverdracht: {LTBLUE}{CURRENCY_LONG} @@ -4517,7 +4550,7 @@ STR_AI_DEBUG :{WHITE}Probleem STR_AI_DEBUG_NAME_AND_VERSION :{BLACK}{STRING} (v{NUM}) STR_AI_DEBUG_NAME_TOOLTIP :{BLACK}Naam van het script STR_AI_DEBUG_SETTINGS :{BLACK}Instellingen -STR_AI_DEBUG_SETTINGS_TOOLTIP :{BLACK}Instellingen van script wijzigen +STR_AI_DEBUG_SETTINGS_TOOLTIP :{BLACK}Script-instellingen wijzigen STR_AI_DEBUG_RELOAD :{BLACK}Computerspeler opnieuw laden STR_AI_DEBUG_RELOAD_TOOLTIP :{BLACK}Computerspeler verwijderen, script opnieuw laden en computerspeler opnieuw starten STR_AI_DEBUG_BREAK_STR_ON_OFF_TOOLTIP :{BLACK}Afbreken in-uitschakelen als een AI-logbericht overeenstemt met de afbreektekst @@ -4537,12 +4570,14 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Eén van STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}AI-/spelscript-probleemvenster is alleen beschikbaar voor de server # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}AI-/spelscriptconfiguratie +STR_AI_CONFIG_CAPTION_AI :{WHITE}Configuratie AI +STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Configuratie spelscript STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Het spelscript dat in het volgende spel geladen wordt STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}De AI's die in het volgende spel geladen worden STR_AI_CONFIG_HUMAN_PLAYER :Menselijke speler STR_AI_CONFIG_RANDOM_AI :Willekeurige AI STR_AI_CONFIG_NONE :(geen) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Maximaal aantal tegenstanders: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Omhoog verplaatsen STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Geselecteerde AI omhoog verplaatsen in de lijst @@ -4550,12 +4585,11 @@ STR_AI_CONFIG_MOVE_DOWN :{BLACK}Omlaag v STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Geselecteerde AI naar omlaag verplaatsen in de lijst STR_AI_CONFIG_GAMESCRIPT :{SILVER}Spelscript +STR_AI_CONFIG_GAMESCRIPT_PARAM :{SILVER}Parameters STR_AI_CONFIG_AI :{SILVER}AI's -STR_AI_CONFIG_CHANGE :{BLACK}{STRING} selecteren -STR_AI_CONFIG_CHANGE_NONE : -STR_AI_CONFIG_CHANGE_AI :AI -STR_AI_CONFIG_CHANGE_GAMESCRIPT :Spelscript +STR_AI_CONFIG_CHANGE_AI :{BLACK}AI selecteren +STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}Spelscript selecteren STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Ander script laden STR_AI_CONFIG_CONFIGURE :{BLACK}Configureren STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}De parameters van het script configureren @@ -4584,9 +4618,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Schermaf STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Schermafbeelding van de minikaart # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameters -STR_AI_SETTINGS_CAPTION_AI :AI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Spelscript +STR_AI_SETTINGS_CAPTION_AI :{WHITE}AI-parameters STR_AI_SETTINGS_CLOSE :{BLACK}Sluiten STR_AI_SETTINGS_RESET :{BLACK}Terugstellen STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -5004,6 +5036,8 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Kan onde STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... voertuig is vernietigd +STR_ERROR_CAN_T_CLONE_VEHICLE_LIST :{WHITE}... niet alle voertuigen zijn identiek + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Er zullen geen voertuigen beschikbaar zijn STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Pas je NewGRF-configuratie aan STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Nog geen voertuigen beschikbaar @@ -5030,6 +5064,8 @@ STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}Kan gese STR_ERROR_CAN_T_COPY_SHARE_ORDER :{WHITE}... voertuig kan niet naar alle stations STR_ERROR_CAN_T_ADD_ORDER :{WHITE}... voertuig kan niet naar dat station STR_ERROR_CAN_T_ADD_ORDER_SHARED :{WHITE}... een voertuig die deze order deelt kan niet naar dat station +STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST :{WHITE}... niet alle voertuigen hebben dezelfde orders +STR_ERROR_CAN_T_SHARE_ORDER_VEHICLE_LIST :{WHITE}... niet alle voertuigen delen hun orders STR_ERROR_CAN_T_SHARE_ORDER_LIST :{WHITE}Kan orderlijst niet delen... STR_ERROR_CAN_T_STOP_SHARING_ORDER_LIST :{WHITE}Kan niet stoppen met delen van orderlijst... diff --git a/src/lang/english.txt b/src/lang/english.txt index 5db6fc4a12..fe06a7c03a 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -200,6 +200,16 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}hp STR_UNITS_POWER_METRIC :{COMMA}{NBSP}hp STR_UNITS_POWER_SI :{COMMA}{NBSP}kW +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_SI :{DECIMAL}{NBSP}hp/Mg +STR_UNITS_POWER_METRIC_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_SI :{DECIMAL}{NBSP}hp/Mg +STR_UNITS_POWER_SI_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_SI :{DECIMAL}{NBSP}W/kg + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -391,10 +401,11 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Exit # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Game options STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Settings -STR_SETTINGS_MENU_SCRIPT_SETTINGS :AI/Game script settings +STR_SETTINGS_MENU_AI_SETTINGS :AI settings +STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :Game script settings STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF settings STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Transparency options STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Town names displayed @@ -965,36 +976,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Indian Rupee (I STR_GAME_OPTIONS_CURRENCY_IDR :Indonesian Rupiah (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Malaysian Ringgit (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Drive on left -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Drive on right - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Town names: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Select style of town names - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :English (Original) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :French -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :German -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :English (Additional) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Latin-American -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Silly -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Swedish -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Dutch -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finnish -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Polish -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slovak -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norwegian -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Hungarian -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Austrian -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Romanian -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Czech -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Swiss -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Danish -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turkish -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italian -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Catalan - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Autosave STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Select interval between automatic game saves @@ -1027,21 +1008,19 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Check th STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Current driver: {RAW_STRING} -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Interface size -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Select the interface element size to use +STR_GAME_OPTIONS_GUI_SCALE_FRAME :{BLACK}Interface size +STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Drag slider to set interface size. Hold Ctrl for continuous adjustment +STR_GAME_OPTIONS_GUI_SCALE_AUTO :{BLACK}Auto-detect size +STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Check this box to detect interface size automatically -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(auto-detect) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Double size -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Quad size +STR_GAME_OPTIONS_GUI_SCALE_BEVELS :{BLACK}Scale bevels +STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :{BLACK}Check this box to scale bevels by interface size -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Font size -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Select the interface font size to use - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(auto-detect) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Double size -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Quad size +STR_GAME_OPTIONS_GUI_SCALE_1X :1x +STR_GAME_OPTIONS_GUI_SCALE_2X :2x +STR_GAME_OPTIONS_GUI_SCALE_3X :3x +STR_GAME_OPTIONS_GUI_SCALE_4X :4x +STR_GAME_OPTIONS_GUI_SCALE_5X :5x STR_GAME_OPTIONS_GRAPHICS :{BLACK}Graphics @@ -1093,8 +1072,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Preview STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 Pound (£) in your currency STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Change custom currency parameter -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Maximum no. competitors: {ORANGE}{COMMA} - STR_NONE :None STR_FUNDING_ONLY :Funding only STR_MINIMAL :Minimal @@ -1144,6 +1121,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Temperate landscape +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Sub-arctic landscape +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Sub-tropical landscape +STR_CLIMATE_TOYLAND_LANDSCAPE :Toyland landscape + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Very Flat STR_TERRAIN_TYPE_FLAT :Flat @@ -1449,6 +1432,8 @@ STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Width of the li 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_SHOW_CARGO_IN_LISTS :Show the cargoes the vehicles can carry in the list windows {STRING2} +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS_HELPTEXT :If enabled, the vehicle's transportable load will appear above it in the vehicle lists STR_CONFIG_SETTING_LANDSCAPE :Landscape: {STRING2} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Landscapes define basic gameplay scenarios with different cargoes and town growth requirements. NewGRF and Game Scripts allow finer control though @@ -1503,6 +1488,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Improved STR_CONFIG_SETTING_ROAD_SIDE :Road vehicles: {STRING2} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Choose the driving side +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Drive on left +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Drive on right + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Heightmap rotation: {STRING2} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Counter clockwise @@ -2037,7 +2026,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Automatic rever STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Allow trains to reverse on a signal, if they waited there a long time ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Recommended) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Recommended) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Change setting value @@ -2080,7 +2069,8 @@ STR_INTRO_HIGHSCORE :{BLACK}Highscor STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Settings STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF Settings STR_INTRO_ONLINE_CONTENT :{BLACK}Check Online Content -STR_INTRO_SCRIPT_SETTINGS :{BLACK}AI/Game Script Settings +STR_INTRO_AI_SETTINGS :{BLACK}AI Settings +STR_INTRO_GAMESCRIPT_SETTINGS :{BLACK}Game Script Settings STR_INTRO_QUIT :{BLACK}Exit STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Start a new game. Ctrl+Click skips map configuration @@ -2100,7 +2090,8 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Display STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Display settings STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Display NewGRF settings STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Check for new and updated content to download -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Display AI/Game script settings +STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Display AI settings +STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Display Game script settings STR_INTRO_TOOLTIP_QUIT :{BLACK}Exit 'OpenTTD' STR_INTRO_BASESET :{BLACK}The currently selected base graphics set is missing {NUM} sprite{P "" s}. Please check for updates for the baseset. @@ -2132,12 +2123,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Change STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Change current year STR_CHEAT_SETUP_PROD :{LTBLUE}Enable modifying production values: {ORANGE}{STRING1} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Temperate landscape -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Sub-arctic landscape -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Sub-tropical landscape -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Toyland landscape - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Colour Scheme @@ -2497,13 +2482,13 @@ STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :waiting for lin STR_NETWORK_MESSAGE_CLIENT_LEAVING :leaving STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {RAW_STRING} has joined the game -STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {RAW_STRING} has joined the game (Client #{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {RAW_STRING} has joined company #{2:NUM} +STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {0:RAW_STRING} has joined the game (Client #{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {0:RAW_STRING} has joined company #{2:NUM} STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {RAW_STRING} has joined spectators -STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {RAW_STRING} has started a new company (#{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {RAW_STRING} has left the game ({2:STRING}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {0:RAW_STRING} has started a new company (#{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {0:RAW_STRING} has left the game ({2:STRING}) STR_NETWORK_MESSAGE_NAME_CHANGE :*** {RAW_STRING} has changed their name to {RAW_STRING} -STR_NETWORK_MESSAGE_GIVE_MONEY :*** {RAW_STRING} gave {2:CURRENCY_LONG} to {1:RAW_STRING} +STR_NETWORK_MESSAGE_GIVE_MONEY :*** {0:RAW_STRING} gave {2:CURRENCY_LONG} to {1:RAW_STRING} 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}) @@ -2866,6 +2851,8 @@ STR_FOUND_TOWN_RANDOM_TOWN_BUTTON :{BLACK}Random T STR_FOUND_TOWN_RANDOM_TOWN_TOOLTIP :{BLACK}Found town in random location STR_FOUND_TOWN_MANY_RANDOM_TOWNS :{BLACK}Many random towns STR_FOUND_TOWN_RANDOM_TOWNS_TOOLTIP :{BLACK}Cover the map with randomly placed towns +STR_FOUND_TOWN_EXPAND_ALL_TOWNS :{BLACK}Expand all towns +STR_FOUND_TOWN_EXPAND_ALL_TOWNS_TOOLTIP :{BLACK}Make all towns grow slightly STR_FOUND_TOWN_NAME_TITLE :{YELLOW}Town name: STR_FOUND_TOWN_NAME_EDITOR_TITLE :{BLACK}Enter town name @@ -3144,6 +3131,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Map size STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Select the size of the map in tiles. The number of available tiles will be slightly smaller STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}No. of towns: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Town names: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Select style of town names STR_MAPGEN_DATE :{BLACK}Date: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}No. of industries: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Highest peak: @@ -3159,11 +3148,40 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Decrease STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Land generator: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terrain type: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Sea level: +STR_MAPGEN_SEA_LEVEL :{BLACK}Sea level: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Rivers: STR_MAPGEN_SMOOTHNESS :{BLACK}Smoothness: STR_MAPGEN_VARIETY :{BLACK}Variety distribution: STR_MAPGEN_GENERATE :{WHITE}Generate +STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF Settings +STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Display NewGRF settings +STR_MAPGEN_AI_SETTINGS :{BLACK}AI Settings +STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Display AI settings +STR_MAPGEN_GS_SETTINGS :{BLACK}Game Script Settings +STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Display game script settings + +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :English (Original) +STR_MAPGEN_TOWN_NAME_FRENCH :French +STR_MAPGEN_TOWN_NAME_GERMAN :German +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :English (Additional) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Latin-American +STR_MAPGEN_TOWN_NAME_SILLY :Silly +STR_MAPGEN_TOWN_NAME_SWEDISH :Swedish +STR_MAPGEN_TOWN_NAME_DUTCH :Dutch +STR_MAPGEN_TOWN_NAME_FINNISH :Finnish +STR_MAPGEN_TOWN_NAME_POLISH :Polish +STR_MAPGEN_TOWN_NAME_SLOVAK :Slovak +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norwegian +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Hungarian +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Austrian +STR_MAPGEN_TOWN_NAME_ROMANIAN :Romanian +STR_MAPGEN_TOWN_NAME_CZECH :Czech +STR_MAPGEN_TOWN_NAME_SWISS :Swiss +STR_MAPGEN_TOWN_NAME_DANISH :Danish +STR_MAPGEN_TOWN_NAME_TURKISH :Turkish +STR_MAPGEN_TOWN_NAME_ITALIAN :Italian +STR_MAPGEN_TOWN_NAME_CATALAN :Catalan # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Map edges: @@ -3309,6 +3327,13 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Previous STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Proceed to the previous normal sprite, skipping any pseudo/recolour/font sprites and wrapping around from the first sprite to the last STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Representation of the currently selected sprite. The alignment is ignored when drawing this sprite STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Move the sprite around, changing the X and Y offsets. Ctrl+Click to move the sprite eight units at a time + +###length 2 +STR_SPRITE_ALIGNER_CENTRE_OFFSET :{BLACK}Offset centred +STR_SPRITE_ALIGNER_CENTRE_SPRITE :{BLACK}Sprite centred + +STR_SPRITE_ALIGNER_CROSSHAIR :{BLACK}Crosshair + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Reset relative STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Reset the current relative offsets STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X offset: {NUM}, Y offset: {NUM} (Absolute) @@ -3326,15 +3351,15 @@ STR_NEWGRF_ERROR_MSG_FATAL :{RED}Fatal: {SI STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}A fatal NewGRF error has occurred: {}{STRING5} STR_NEWGRF_ERROR_POPUP :{WHITE}A NewGRF error has occurred: {}{STRING5} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:RAW_STRING} will not work with the TTDPatch version reported by OpenTTD -STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:RAW_STRING} is for the {RAW_STRING} version of TTD -STR_NEWGRF_ERROR_UNSET_SWITCH :{1:RAW_STRING} is designed to be used with {RAW_STRING} -STR_NEWGRF_ERROR_INVALID_PARAMETER :Invalid parameter for {1:RAW_STRING}: parameter {RAW_STRING} ({NUM}) -STR_NEWGRF_ERROR_LOAD_BEFORE :{1:RAW_STRING} must be loaded before {RAW_STRING} -STR_NEWGRF_ERROR_LOAD_AFTER :{1:RAW_STRING} must be loaded after {RAW_STRING} -STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:RAW_STRING} requires OpenTTD version {RAW_STRING} or better +STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:RAW_STRING} is for the {2:RAW_STRING} version of TTD +STR_NEWGRF_ERROR_UNSET_SWITCH :{1:RAW_STRING} is designed to be used with {2:RAW_STRING} +STR_NEWGRF_ERROR_INVALID_PARAMETER :Invalid parameter for {1:RAW_STRING}: parameter {2:RAW_STRING} ({3:NUM}) +STR_NEWGRF_ERROR_LOAD_BEFORE :{1:RAW_STRING} must be loaded before {2:RAW_STRING} +STR_NEWGRF_ERROR_LOAD_AFTER :{1:RAW_STRING} must be loaded after {2:RAW_STRING} +STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:RAW_STRING} requires OpenTTD version {2:RAW_STRING} or better STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :the GRF file it was designed to translate STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Too many NewGRFs are loaded -STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Loading {1:RAW_STRING} as static NewGRF with {RAW_STRING} could cause desyncs +STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Loading {1:RAW_STRING} as static NewGRF with {2:RAW_STRING} could cause desyncs STR_NEWGRF_ERROR_UNEXPECTED_SPRITE :Unexpected sprite (sprite {3:NUM}) STR_NEWGRF_ERROR_UNKNOWN_PROPERTY :Unknown Action 0 property {4:HEX} (sprite {3:NUM}) STR_NEWGRF_ERROR_INVALID_ID :Attempt to use invalid ID (sprite {3:NUM}) @@ -3466,14 +3491,14 @@ STR_LOCAL_AUTHORITY_ACTION_EXCLUSIVE_TRANSPORT :Buy exclusive t STR_LOCAL_AUTHORITY_ACTION_BRIBE :Bribe the local authority ###length 8 -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{YELLOW}Initiate a small local advertising campaign, to attract more passengers and cargo to your transport services.{}Provides a temporary boost to station rating in a small radius around the town centre.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{YELLOW}Initiate a medium local advertising campaign, to attract more passengers and cargo to your transport services.{}Provides a temporary boost to station rating in a medium radius around the town centre.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{YELLOW}Initiate a large local advertising campaign, to attract more passengers and cargo to your transport services.{}Provides a temporary boost to station rating in a large radius around the town centre.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{YELLOW}Fund the reconstruction of the urban road network.{}Causes considerable disruption to road traffic for up to 6 months.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{YELLOW}Build a statue in honour of your company.{}Provides a permanent boost to station rating in this town.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{YELLOW}Fund the construction of new buildings in the town.{}Provides a temporary boost to town growth in this town.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW}Buy 1 year's exclusive transport rights in town.{}Town authority will not allow passengers and cargo to use your competitors' stations.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Bribe the local authority to increase your rating, at the risk of a severe penalty if caught.{}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{YELLOW}Initiate a small local advertising campaign, to attract more passengers and cargo to your transport services.{}Provides a temporary boost to station rating in a small radius around the town centre.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{PUSH_COLOUR}{YELLOW}Initiate a medium local advertising campaign, to attract more passengers and cargo to your transport services.{}Provides a temporary boost to station rating in a medium radius around the town centre.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}Initiate a large local advertising campaign, to attract more passengers and cargo to your transport services.{}Provides a temporary boost to station rating in a large radius around the town centre.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{PUSH_COLOUR}{YELLOW}Fund the reconstruction of the urban road network.{}Causes considerable disruption to road traffic for up to 6 months.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Build a statue in honour of your company.{}Provides a permanent boost to station rating in this town.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Fund the construction of new buildings in the town.{}Provides a temporary boost to town growth in this town.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}Buy 1 year's exclusive transport rights in town.{}Town authority will not allow passengers and cargo to use your competitors' stations.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Bribe the local authority to increase your rating, at the risk of a severe penalty if caught.{}{POP_COLOUR}Cost: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}{COMPANY} Goals @@ -3646,16 +3671,18 @@ STR_FINANCES_SECTION_SHIP_REVENUE :{GOLD}Ships STR_FINANCES_SECTION_LOAN_INTEREST :{GOLD}Loan Interest STR_FINANCES_SECTION_OTHER :{GOLD}Other +STR_FINANCES_TOTAL_CAPTION :{WHITE}Total STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} STR_FINANCES_ZERO_INCOME :{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} -STR_FINANCES_NET_PROFIT :{WHITE}Net Profit +STR_FINANCES_PROFIT :{WHITE}Profit STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Bank Balance STR_FINANCES_OWN_FUNDS_TITLE :{WHITE}Own Funds STR_FINANCES_LOAN_TITLE :{WHITE}Loan STR_FINANCES_INTEREST_RATE :{WHITE}Loan Interest: {BLACK}{NUM}% STR_FINANCES_MAX_LOAN :{WHITE}Maximum Loan: {BLACK}{CURRENCY_LONG} STR_FINANCES_TOTAL_CURRENCY :{BLACK}{CURRENCY_LONG} +STR_FINANCES_BANK_BALANCE :{WHITE}{CURRENCY_LONG} STR_FINANCES_BORROW_BUTTON :{BLACK}Borrow {CURRENCY_LONG} STR_FINANCES_BORROW_TOOLTIP :{BLACK}Increase size of loan. Ctrl+Click borrows as much as possible STR_FINANCES_REPAY_BUTTON :{BLACK}Repay {CURRENCY_LONG} @@ -3756,7 +3783,7 @@ STR_INDUSTRY_VIEW_PRODUCES_N_CARGO :{BLACK}Produces STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :, {STRING}{RAW_STRING} STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Requires: -STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:RAW_STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{0:STRING}{BLACK}{3:RAW_STRING} STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} waiting{RAW_STRING} STR_CONFIG_GAME_PRODUCTION :{WHITE}Change production (multiple of 8, up to 2040) @@ -3786,6 +3813,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Send ins STR_VEHICLE_LIST_REPLACE_VEHICLES :Replace vehicles STR_VEHICLE_LIST_SEND_FOR_SERVICING :Send for Servicing STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Profit this year: {CURRENCY_LONG} (last year: {CURRENCY_LONG}) +STR_VEHICLE_LIST_CARGO :{TINY_FONT}{BLACK}[{CARGO_LIST}] +STR_VEHICLE_LIST_NAME_AND_CARGO :{TINY_FONT}{BLACK}{STRING1} {STRING1} STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Send to Depot STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Send to Depot @@ -3877,6 +3906,11 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Max. Tra STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Range: {GOLD}{COMMA} tiles STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Aircraft type: {GOLD}{STRING} +###length 3 +STR_CARGO_TYPE_FILTER_ALL :All cargo types +STR_CARGO_TYPE_FILTER_FREIGHT :Freight +STR_CARGO_TYPE_FILTER_NONE :None + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Train vehicle selection list. Click on vehicle for information. Ctrl+Click for toggling hiding of the vehicle type STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Road vehicle selection list. Click on vehicle for information. Ctrl+Click for toggling hiding of the vehicle type @@ -4045,7 +4079,7 @@ STR_ENGINE_PREVIEW_AIRCRAFT :aircraft STR_ENGINE_PREVIEW_SHIP :ship STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Cost: {CURRENCY_LONG} Weight: {WEIGHT_SHORT}{}Speed: {VELOCITY} Power: {POWER}{}Running Cost: {CURRENCY_LONG}/yr{}Capacity: {CARGO_LONG} -STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Cost: {CURRENCY_LONG} Weight: {WEIGHT_SHORT}{}Speed: {VELOCITY} Power: {POWER} Max. T.E.: {6:FORCE}{}Running Cost: {4:CURRENCY_LONG}/yr{}Capacity: {5:CARGO_LONG} +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Cost: {0:CURRENCY_LONG} Weight: {1:WEIGHT_SHORT}{}Speed: {2:VELOCITY} Power: {3:POWER} Max. T.E.: {6:FORCE}{}Running Cost: {4:CURRENCY_LONG}/yr{}Capacity: {5:CARGO_LONG} STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY}{}Capacity: {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY}{}Aircraft type: {STRING}{}Capacity: {CARGO_LONG}, {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY}{}Aircraft type: {STRING}{}Capacity: {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr @@ -4204,12 +4238,13 @@ STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Weight: STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Weight: {LTBLUE}{WEIGHT_SHORT} {BLACK}Power: {LTBLUE}{POWER}{BLACK} Max. speed: {LTBLUE}{VELOCITY} {BLACK}Max. T.E.: {LTBLUE}{FORCE} STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Profit this year: {LTBLUE}{CURRENCY_LONG} (last year: {CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Profit this year: {LTBLUE}{CURRENCY_LONG} (last year: {CURRENCY_LONG}) {BLACK}Min. performance: {LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Reliability: {LTBLUE}{COMMA}% {BLACK}Breakdowns since last service: {LTBLUE}{COMMA} STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Built: {LTBLUE}{NUM}{BLACK} Value: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_INFO_NO_CAPACITY :{BLACK}Capacity: {LTBLUE}None{STRING} -STR_VEHICLE_INFO_CAPACITY :{BLACK}Capacity: {LTBLUE}{CARGO_LONG}{3:STRING} -STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Capacity: {LTBLUE}{CARGO_LONG}{3:STRING} (x{4:NUM}) +STR_VEHICLE_INFO_CAPACITY :{BLACK}Capacity: {LTBLUE}{0:CARGO_LONG}{3:STRING} +STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Capacity: {LTBLUE}{0:CARGO_LONG}{3:STRING} (x{4:NUM}) STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Capacity: {LTBLUE}{CARGO_LONG}, {CARGO_LONG}{STRING} STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Transfer Credits: {LTBLUE}{CURRENCY_LONG} @@ -4478,22 +4513,22 @@ STR_TIMETABLE_STARTING_DATE :{BLACK}Start da STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Select a date as starting point of this timetable. Ctrl+Click distributes all vehicles sharing this order evenly from the given date based on their relative order, if the order is completely timetabled STR_TIMETABLE_CHANGE_TIME :{BLACK}Change Time -STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Change the amount of time that the highlighted order should take +STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Change the amount of time that the highlighted order should take. Ctrl+Click sets the time for all orders STR_TIMETABLE_CLEAR_TIME :{BLACK}Clear Time -STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Clear the amount of time for the highlighted order +STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Clear the amount of time for the highlighted order. Ctrl+Click clears the time for all orders STR_TIMETABLE_CHANGE_SPEED :{BLACK}Change Speed Limit -STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Change the maximum travel speed of the highlighted order +STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Change the maximum travel speed of the highlighted order. Ctrl+Click sets the speed for all orders STR_TIMETABLE_CLEAR_SPEED :{BLACK}Clear Speed Limit -STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Clear the maximum travel speed of the highlighted order +STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Clear the maximum travel speed of the highlighted order. Ctrl+Click clears the speed for all orders STR_TIMETABLE_RESET_LATENESS :{BLACK}Reset Late Counter STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Reset the lateness counter, so the vehicle will be on time STR_TIMETABLE_AUTOFILL :{BLACK}Autofill -STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Fill the timetable automatically with the values from the next journey (Ctrl+Click to try to keep waiting times) +STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Fill the timetable automatically with the values from the next journey. Ctrl+Click to try to keep waiting times STR_TIMETABLE_EXPECTED :{BLACK}Expected STR_TIMETABLE_SCHEDULED :{BLACK}Scheduled @@ -4537,12 +4572,14 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}One of t STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}AI/Game Script Debug window is only available for the server # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}AI/Game Script Configuration +STR_AI_CONFIG_CAPTION_AI :{WHITE}AI Configuration +STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Game Script Configuration STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}The Game Script that will be loaded in the next game STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}The AIs that will be loaded in the next game STR_AI_CONFIG_HUMAN_PLAYER :Human player STR_AI_CONFIG_RANDOM_AI :Random AI STR_AI_CONFIG_NONE :(none) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Maximum no. competitors: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Move Up STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Move selected AI up in the list @@ -4550,12 +4587,11 @@ STR_AI_CONFIG_MOVE_DOWN :{BLACK}Move Dow STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Move selected AI down in the list STR_AI_CONFIG_GAMESCRIPT :{SILVER}Game Script +STR_AI_CONFIG_GAMESCRIPT_PARAM :{SILVER}Parameters STR_AI_CONFIG_AI :{SILVER}AIs -STR_AI_CONFIG_CHANGE :{BLACK}Select {STRING} -STR_AI_CONFIG_CHANGE_NONE : -STR_AI_CONFIG_CHANGE_AI :AI -STR_AI_CONFIG_CHANGE_GAMESCRIPT :Game Script +STR_AI_CONFIG_CHANGE_AI :{BLACK}Select AI +STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}Select Game Script STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Load another script STR_AI_CONFIG_CONFIGURE :{BLACK}Configure STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Configure the parameters of the Script @@ -4584,9 +4620,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Heightma STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Minimap screenshot # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameters -STR_AI_SETTINGS_CAPTION_AI :AI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Game Script +STR_AI_SETTINGS_CAPTION_AI :{WHITE}AI Parameters STR_AI_SETTINGS_CLOSE :{BLACK}Close STR_AI_SETTINGS_RESET :{BLACK}Reset STR_AI_SETTINGS_SETTING :{RAW_STRING}: {ORANGE}{STRING1} @@ -4750,6 +4784,7 @@ STR_ERROR_TOO_MANY_INDUSTRIES :{WHITE}... too STR_ERROR_CAN_T_GENERATE_INDUSTRIES :{WHITE}Can't generate industries... STR_ERROR_CAN_T_BUILD_HERE :{WHITE}Can't build {STRING} here... STR_ERROR_CAN_T_CONSTRUCT_THIS_INDUSTRY :{WHITE}Can't construct this industry type here... +STR_ERROR_CAN_T_PROSPECT_INDUSTRY :{WHITE}Can't prospect industry... STR_ERROR_INDUSTRY_TOO_CLOSE :{WHITE}... too close to another industry STR_ERROR_MUST_FOUND_TOWN_FIRST :{WHITE}... must found town first STR_ERROR_ONLY_ONE_ALLOWED_PER_TOWN :{WHITE}... only one allowed per town @@ -4764,6 +4799,8 @@ STR_ERROR_FOREST_CAN_ONLY_BE_PLANTED :{WHITE}... fore STR_ERROR_CAN_ONLY_BE_BUILT_ABOVE_SNOW_LINE :{WHITE}... can only be built above the snow-line STR_ERROR_CAN_ONLY_BE_BUILT_BELOW_SNOW_LINE :{WHITE}... can only be built below the snow-line +STR_ERROR_PROSPECTING_WAS_UNLUCKY :{WHITE}The funding failed to prospect due to bad luck; try again +STR_ERROR_NO_SUITABLE_PLACES_FOR_PROSPECTING :{WHITE}There were no suitable places to prospect for this industry STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES :{WHITE}There were no suitable places for '{STRING}' industries STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES_EXPLANATION :{WHITE}Change the map generation parameters to get a better map @@ -5004,6 +5041,8 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Can't ch STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... vehicle is destroyed +STR_ERROR_CAN_T_CLONE_VEHICLE_LIST :{WHITE}... not all vehicles are identical + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}No vehicles will be available at all STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Change your NewGRF configuration STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}No vehicles are available yet @@ -5030,6 +5069,8 @@ STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}Can't sk STR_ERROR_CAN_T_COPY_SHARE_ORDER :{WHITE}... vehicle can't go to all stations STR_ERROR_CAN_T_ADD_ORDER :{WHITE}... vehicle can't go to that station STR_ERROR_CAN_T_ADD_ORDER_SHARED :{WHITE}... a vehicle sharing this order can't go to that station +STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST :{WHITE}... not all vehicles have the same orders +STR_ERROR_CAN_T_SHARE_ORDER_VEHICLE_LIST :{WHITE}... not all vehicles are sharing orders STR_ERROR_CAN_T_SHARE_ORDER_LIST :{WHITE}Can't share order list... STR_ERROR_CAN_T_STOP_SHARING_ORDER_LIST :{WHITE}Can't stop sharing order list... diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index 904fa45fc1..7d507fe401 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -200,6 +200,16 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}hp STR_UNITS_POWER_METRIC :{COMMA}{NBSP}hp STR_UNITS_POWER_SI :{COMMA}{NBSP}kW +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_SI :{DECIMAL}{NBSP}hp/Mg +STR_UNITS_POWER_METRIC_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_SI :{DECIMAL}{NBSP}hp/Mg +STR_UNITS_POWER_SI_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_SI :{DECIMAL}{NBSP}W/kg + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -391,10 +401,11 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Exit # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Game options STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Settings -STR_SETTINGS_MENU_SCRIPT_SETTINGS :AI/Game script settings +STR_SETTINGS_MENU_AI_SETTINGS :AI settings +STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :Game script settings STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF settings STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Transparency options STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Town names displayed @@ -965,36 +976,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Indian Rupee (I STR_GAME_OPTIONS_CURRENCY_IDR :Indonesian Rupiah (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Malaysian Ringgit (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Drive on left -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Drive on right - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Town names: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Select style of town names - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :English (Original) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :French -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :German -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :English (Additional) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Latin-American -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Silly -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Swedish -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Dutch -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finnish -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Polish -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slovak -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norwegian -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Hungarian -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Austrian -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Romanian -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Czech -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Swiss -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Danish -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turkish -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italian -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Catalan - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Autosave STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Select interval between automatic game saves @@ -1027,21 +1008,19 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Check th STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Current driver: {STRING} -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Interface size -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Select the interface element size to use +STR_GAME_OPTIONS_GUI_SCALE_FRAME :{BLACK}Interface size +STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Drag slider to set interface size. Hold Ctrl for continuous adjustment +STR_GAME_OPTIONS_GUI_SCALE_AUTO :{BLACK}Auto-detect size +STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Check this box to detect interface size automatically -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(auto-detect) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Double size -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Quad size +STR_GAME_OPTIONS_GUI_SCALE_BEVELS :{BLACK}Scale bevels +STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :{BLACK}Check this box to scale bevels by interface size -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Font size -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Select the interface font size to use - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(auto-detect) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Double size -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Quad size +STR_GAME_OPTIONS_GUI_SCALE_1X :1x +STR_GAME_OPTIONS_GUI_SCALE_2X :2x +STR_GAME_OPTIONS_GUI_SCALE_3X :3x +STR_GAME_OPTIONS_GUI_SCALE_4X :4x +STR_GAME_OPTIONS_GUI_SCALE_5X :5x STR_GAME_OPTIONS_GRAPHICS :{BLACK}Graphics @@ -1093,8 +1072,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Preview STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 Pound (£) in your currency STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Change custom currency parameter -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Maximum no. competitors: {ORANGE}{COMMA} - STR_NONE :None STR_FUNDING_ONLY :Funding only STR_MINIMAL :Minimal @@ -1144,6 +1121,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Temperate landscape +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Sub-arctic landscape +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Sub-tropical landscape +STR_CLIMATE_TOYLAND_LANDSCAPE :Toyland landscape + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Very Flat STR_TERRAIN_TYPE_FLAT :Flat @@ -1449,6 +1432,8 @@ STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Width of the li STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :Show the NewGRF's name in the build vehicle window: {STRING} 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_SHOW_CARGO_IN_LISTS :Show the cargoes the vehicles can carry in the list windows {STRING} +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS_HELPTEXT :If enabled, the vehicle's transportable load will appear above it in the vehicle lists STR_CONFIG_SETTING_LANDSCAPE :Landscape: {STRING} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Landscapes define basic gameplay scenarios with different cargoes and town growth requirements. NewGRF and Game Scripts allow finer control though @@ -1503,6 +1488,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Improved STR_CONFIG_SETTING_ROAD_SIDE :Road vehicles: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Choose the driving side +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Drive on left +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Drive on right + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Heightmap rotation: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Counter clockwise @@ -2037,7 +2026,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Automatic rever STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Allow trains to reverse on a signal, if they have waited there a long time ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Recommended) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Recommended) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Change setting value @@ -2080,7 +2069,8 @@ STR_INTRO_HIGHSCORE :{BLACK}Highscor STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Settings STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF Settings STR_INTRO_ONLINE_CONTENT :{BLACK}Check Online Content -STR_INTRO_SCRIPT_SETTINGS :{BLACK}AI/Game Script Settings +STR_INTRO_AI_SETTINGS :{BLACK}AI Settings +STR_INTRO_GAMESCRIPT_SETTINGS :{BLACK}Game Script Settings STR_INTRO_QUIT :{BLACK}Exit STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Start a new game. Ctrl+Click skips map configuration @@ -2100,7 +2090,8 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Display STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Display settings STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Display NewGRF settings STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Check for new and updated content to download -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Display AI/Game script settings +STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Display AI settings +STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Display Game script settings STR_INTRO_TOOLTIP_QUIT :{BLACK}Exit 'OpenTTD' STR_INTRO_BASESET :{BLACK}The currently selected base graphics set is missing {NUM} sprite{P "" s}. Please check for updates for the baseset. @@ -2132,12 +2123,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Change STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Change current year STR_CHEAT_SETUP_PROD :{LTBLUE}Enable modifying production values: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Temperate landscape -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Sub-arctic landscape -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Sub-tropical landscape -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Toyland landscape - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Colour Scheme @@ -2497,13 +2482,13 @@ STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :waiting for lin STR_NETWORK_MESSAGE_CLIENT_LEAVING :leaving STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} has joined the game -STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {STRING} has joined the game (Client #{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} has joined company #{2:NUM} +STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {0:STRING} has joined the game (Client #{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {0:STRING} has joined company #{2:NUM} STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} has joined spectators -STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} has started a new company (#{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} has left the game ({2:STRING}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {0:STRING} has started a new company (#{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {0:STRING} has left the game ({2:STRING}) STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} has changed their name to {STRING} -STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} gave {2:CURRENCY_LONG} to {1:STRING} +STR_NETWORK_MESSAGE_GIVE_MONEY :*** {0:STRING} gave {2:CURRENCY_LONG} to {1:STRING} 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 :*** {STRING} was kicked. Reason: ({STRING}) @@ -2866,6 +2851,8 @@ STR_FOUND_TOWN_RANDOM_TOWN_BUTTON :{BLACK}Random T STR_FOUND_TOWN_RANDOM_TOWN_TOOLTIP :{BLACK}Found town in random location STR_FOUND_TOWN_MANY_RANDOM_TOWNS :{BLACK}Many random towns STR_FOUND_TOWN_RANDOM_TOWNS_TOOLTIP :{BLACK}Cover the map with randomly placed towns +STR_FOUND_TOWN_EXPAND_ALL_TOWNS :{BLACK}Expand all towns +STR_FOUND_TOWN_EXPAND_ALL_TOWNS_TOOLTIP :{BLACK}Make all towns grow slightly STR_FOUND_TOWN_NAME_TITLE :{YELLOW}Town name: STR_FOUND_TOWN_NAME_EDITOR_TITLE :{BLACK}Enter town name @@ -3144,6 +3131,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Map size STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Select the size of the map in tiles. The number of available tiles will be slightly smaller STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}No. of towns: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Town names: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Select style of town names STR_MAPGEN_DATE :{BLACK}Date: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}No. of industries: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Highest peak: @@ -3159,11 +3148,40 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Decrease STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Land generator: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terrain type: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Sea level: +STR_MAPGEN_SEA_LEVEL :{BLACK}Sea level: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Rivers: STR_MAPGEN_SMOOTHNESS :{BLACK}Smoothness: STR_MAPGEN_VARIETY :{BLACK}Variety distribution: STR_MAPGEN_GENERATE :{WHITE}Generate +STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF Settings +STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Display NewGRF settings +STR_MAPGEN_AI_SETTINGS :{BLACK}AI Settings +STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Display AI settings +STR_MAPGEN_GS_SETTINGS :{BLACK}Game Script Settings +STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Display game script settings + +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :English (Original) +STR_MAPGEN_TOWN_NAME_FRENCH :French +STR_MAPGEN_TOWN_NAME_GERMAN :German +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :English (Additional) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Latin-American +STR_MAPGEN_TOWN_NAME_SILLY :Silly +STR_MAPGEN_TOWN_NAME_SWEDISH :Swedish +STR_MAPGEN_TOWN_NAME_DUTCH :Dutch +STR_MAPGEN_TOWN_NAME_FINNISH :Finnish +STR_MAPGEN_TOWN_NAME_POLISH :Polish +STR_MAPGEN_TOWN_NAME_SLOVAK :Slovak +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norwegian +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Hungarian +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Austrian +STR_MAPGEN_TOWN_NAME_ROMANIAN :Romanian +STR_MAPGEN_TOWN_NAME_CZECH :Czech +STR_MAPGEN_TOWN_NAME_SWISS :Swiss +STR_MAPGEN_TOWN_NAME_DANISH :Danish +STR_MAPGEN_TOWN_NAME_TURKISH :Turkish +STR_MAPGEN_TOWN_NAME_ITALIAN :Italian +STR_MAPGEN_TOWN_NAME_CATALAN :Catalan # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Map edges: @@ -3309,6 +3327,13 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Previous STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Proceed to the previous normal sprite, skipping any pseudo/recolour/font sprites and wrapping around at the begin STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Representation of the currently selected sprite. The alignment is ignored when drawing this sprite STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Move the sprite around, changing the X and Y offsets + +###length 2 +STR_SPRITE_ALIGNER_CENTRE_OFFSET :{BLACK}Offset centred +STR_SPRITE_ALIGNER_CENTRE_SPRITE :{BLACK}Sprite centred + +STR_SPRITE_ALIGNER_CROSSHAIR :{BLACK}Crosshair + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Reset relative STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Reset the current relative offsets STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X offset: {NUM}, Y offset: {NUM} (Absolute) @@ -3326,15 +3351,15 @@ STR_NEWGRF_ERROR_MSG_FATAL :{RED}Fatal: {SI STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}A fatal NewGRF error has occurred:{}{STRING} STR_NEWGRF_ERROR_POPUP :{WHITE}A NewGRF error has occurred:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} will not work with the TTDPatch version reported by OpenTTD -STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} is for the {STRING} version of TTD -STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} is designed to be used with {STRING} -STR_NEWGRF_ERROR_INVALID_PARAMETER :Invalid parameter for {1:STRING}: parameter {STRING} ({NUM}) -STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} must be loaded before {STRING} -STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} must be loaded after {STRING} -STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} requires OpenTTD version {STRING} or better +STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} is for the {2:STRING} version of TTD +STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} is designed to be used with {2:STRING} +STR_NEWGRF_ERROR_INVALID_PARAMETER :Invalid parameter for {1:STRING}: parameter {2:STRING} ({3:NUM}) +STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} must be loaded before {2:STRING} +STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} must be loaded after {2:STRING} +STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} requires OpenTTD version {2:STRING} or better STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :the GRF file it was designed to translate STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Too many NewGRFs are loaded -STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Loading {1:STRING} as static NewGRF with {STRING} could cause desyncs +STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Loading {1:STRING} as static NewGRF with {2:STRING} could cause desyncs STR_NEWGRF_ERROR_UNEXPECTED_SPRITE :Unexpected sprite (sptite{3:NUM}) STR_NEWGRF_ERROR_UNKNOWN_PROPERTY :Unknown Action 0 property {4:HEX} (sprite{3:NUM}) STR_NEWGRF_ERROR_INVALID_ID :Attempt to use invalid ID (sprite{3:NUM}) @@ -3466,14 +3491,14 @@ STR_LOCAL_AUTHORITY_ACTION_EXCLUSIVE_TRANSPORT :Buy exclusive t STR_LOCAL_AUTHORITY_ACTION_BRIBE :Bribe the local authority ###length 8 -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{YELLOW}Initiate a small local advertising campaign, to attract more passengers and cargo to your transport services.{}Provides a temporary boost to station rating in a small radius around the town centre.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{YELLOW}Initiate a medium local advertising campaign, to attract more passengers and cargo to your transport services.{}Provides a temporary boost to station rating in a medium radius around the town centre.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{YELLOW}Initiate a large local advertising campaign, to attract more passengers and cargo to your transport services.{}Provides a temporary boost to station rating in a large radius around the town centre.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{YELLOW}Fund the reconstruction of the urban road network.{}Causes considerable disruption to road traffic for up to 6 months.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{YELLOW}Build a statue in honour of your company.{}Provides a permanent boost to station rating in this town.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{YELLOW}Fund the construction of new buildings in the town.{}Provides a temporary boost to town growth in this town.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW}Buy 1 year's exclusive transport rights in town.{}Town authority will not allow passengers and cargo to use your competitors' stations.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Bribe the local authority to increase your rating, at the risk of a severe penalty if caught.{}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{YELLOW}Initiate a small local advertising campaign, to attract more passengers and cargo to your transport services.{}Provides a temporary boost to station rating in a small radius around the town centre.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{PUSH_COLOUR}{YELLOW}Initiate a medium local advertising campaign, to attract more passengers and cargo to your transport services.{}Provides a temporary boost to station rating in a medium radius around the town centre.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}Initiate a large local advertising campaign, to attract more passengers and cargo to your transport services.{}Provides a temporary boost to station rating in a large radius around the town centre.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{PUSH_COLOUR}{YELLOW}Fund the reconstruction of the urban road network.{}Causes considerable disruption to road traffic for up to 6 months.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Build a statue in honour of your company.{}Provides a permanent boost to station rating in this town.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Fund the construction of new buildings in the town.{}Provides a temporary boost to town growth in this town.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}Buy 1 year's exclusive transport rights in town.{}Town authority will not allow passengers and cargo to use your competitors' stations.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Bribe the local authority to increase your rating, at the risk of a severe penalty if caught.{}{POP_COLOUR}Cost: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}{COMPANY} Goals @@ -3646,16 +3671,18 @@ STR_FINANCES_SECTION_SHIP_REVENUE :{GOLD}Ships STR_FINANCES_SECTION_LOAN_INTEREST :{GOLD}Loan Interest STR_FINANCES_SECTION_OTHER :{GOLD}Other +STR_FINANCES_TOTAL_CAPTION :{WHITE}Total STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} STR_FINANCES_ZERO_INCOME :{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} -STR_FINANCES_NET_PROFIT :{WHITE}Net Profit +STR_FINANCES_PROFIT :{WHITE}Profit STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Bank Balance STR_FINANCES_OWN_FUNDS_TITLE :{WHITE}Own Funds STR_FINANCES_LOAN_TITLE :{WHITE}Loan STR_FINANCES_INTEREST_RATE :{WHITE}Loan Interest: {BLACK}{NUM}% STR_FINANCES_MAX_LOAN :{WHITE}Maximum Loan: {BLACK}{CURRENCY_LONG} STR_FINANCES_TOTAL_CURRENCY :{BLACK}{CURRENCY_LONG} +STR_FINANCES_BANK_BALANCE :{WHITE}{CURRENCY_LONG} STR_FINANCES_BORROW_BUTTON :{BLACK}Borrow {CURRENCY_LONG} STR_FINANCES_BORROW_TOOLTIP :{BLACK}Increase size of loan. Ctrl+Click borrows as much as possible STR_FINANCES_REPAY_BUTTON :{BLACK}Repay {CURRENCY_LONG} @@ -3756,7 +3783,7 @@ STR_INDUSTRY_VIEW_PRODUCES_N_CARGO :{BLACK}Produces STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :, {STRING}{STRING} STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Requires: -STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{0:STRING}{BLACK}{3:STRING} STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} waiting{STRING} STR_CONFIG_GAME_PRODUCTION :{WHITE}Change production (multiple of 8, up to 2040) @@ -3786,6 +3813,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Send ins STR_VEHICLE_LIST_REPLACE_VEHICLES :Replace vehicles STR_VEHICLE_LIST_SEND_FOR_SERVICING :Send for Servicing STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Profit this year: {CURRENCY_LONG} (last year: {CURRENCY_LONG}) +STR_VEHICLE_LIST_CARGO :{TINY_FONT}{BLACK}[{CARGO_LIST}] +STR_VEHICLE_LIST_NAME_AND_CARGO :{TINY_FONT}{BLACK}{STRING} {STRING} STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Send to Depot STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Send to Depot @@ -3877,6 +3906,11 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Max. Tra STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Range: {GOLD}{COMMA} tiles STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Aircraft type: {GOLD}{STRING} +###length 3 +STR_CARGO_TYPE_FILTER_ALL :All cargo types +STR_CARGO_TYPE_FILTER_FREIGHT :Freight +STR_CARGO_TYPE_FILTER_NONE :None + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Train vehicle selection list - click on vehicle for information STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Road vehicle selection list - click on vehicle for information @@ -4045,7 +4079,7 @@ STR_ENGINE_PREVIEW_AIRCRAFT :aircraft STR_ENGINE_PREVIEW_SHIP :ship STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Cost: {CURRENCY_LONG} Weight: {WEIGHT_SHORT}{}Speed: {VELOCITY} Power: {POWER}{}Running Cost: {CURRENCY_LONG}/yr{}Capacity: {CARGO_LONG} -STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Cost: {CURRENCY_LONG} Weight: {WEIGHT_SHORT}{}Speed: {VELOCITY} Power: {POWER} Max. T.E.: {6:FORCE}{}Running Cost: {4:CURRENCY_LONG}/yr{}Capacity: {5:CARGO_LONG} +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Cost: {0:CURRENCY_LONG} Weight: {1:WEIGHT_SHORT}{}Speed: {2:VELOCITY} Power: {3:POWER} Max. T.E.: {6:FORCE}{}Running Cost: {4:CURRENCY_LONG}/yr{}Capacity: {5:CARGO_LONG} STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY}{}Capacity: {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY}{}Aircraft type: {STRING}{}Capacity: {CARGO_LONG}, {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY}{}Aircraft type: {STRING}{}Capacity: {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr @@ -4204,12 +4238,13 @@ STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Weight: STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Weight: {LTBLUE}{WEIGHT_SHORT} {BLACK}Power: {LTBLUE}{POWER}{BLACK} Max. speed: {LTBLUE}{VELOCITY} {BLACK}Max. T.E.: {LTBLUE}{FORCE} STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Profit this year: {LTBLUE}{CURRENCY_LONG} (last year: {CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Profit this year: {LTBLUE}{CURRENCY_LONG} (last year: {CURRENCY_LONG}) {BLACK}Min. performance: {LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Reliability: {LTBLUE}{COMMA}% {BLACK}Breakdowns since last service: {LTBLUE}{COMMA} STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Built: {LTBLUE}{NUM}{BLACK} Value: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_INFO_NO_CAPACITY :{BLACK}Capacity: {LTBLUE}None{STRING} -STR_VEHICLE_INFO_CAPACITY :{BLACK}Capacity: {LTBLUE}{CARGO_LONG}{3:STRING} -STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Capacity: {LTBLUE}{CARGO_LONG}{3:STRING} (x{4:NUM}) +STR_VEHICLE_INFO_CAPACITY :{BLACK}Capacity: {LTBLUE}{0:CARGO_LONG}{3:STRING} +STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Capacity: {LTBLUE}{0:CARGO_LONG}{3:STRING} (x{4:NUM}) STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Capacity: {LTBLUE}{CARGO_LONG}, {CARGO_LONG}{STRING} STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Transfer Credits: {LTBLUE}{CURRENCY_LONG} @@ -4478,22 +4513,22 @@ STR_TIMETABLE_STARTING_DATE :{BLACK}Start da STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Select a date as starting point of this timetable. Ctrl+Click distributes all vehicles sharing this order evenly from the given date based on their relative order, if the order is completely timetabled STR_TIMETABLE_CHANGE_TIME :{BLACK}Change Time -STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Change the amount of time that the highlighted order should take +STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Change the amount of time that the highlighted order should take. Ctrl+Click sets the time for all orders STR_TIMETABLE_CLEAR_TIME :{BLACK}Clear Time -STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Clear the amount of time for the highlighted order +STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Clear the amount of time for the highlighted order. Ctrl+Click clears the time for all orders STR_TIMETABLE_CHANGE_SPEED :{BLACK}Change Speed Limit -STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Change the maximum travel speed of the highlighted order +STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Change the maximum travel speed of the highlighted order. Ctrl+Click sets the speed for all orders STR_TIMETABLE_CLEAR_SPEED :{BLACK}Clear Speed Limit -STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Clear the maximum travel speed of the highlighted order +STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Clear the maximum travel speed of the highlighted order. Ctrl+Click clears the speed for all orders STR_TIMETABLE_RESET_LATENESS :{BLACK}Reset Late Counter STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Reset the lateness counter, so the vehicle will be on time STR_TIMETABLE_AUTOFILL :{BLACK}Autofill -STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Fill the timetable automatically with the values from the next journey (Ctrl+Click to try to keep waiting times) +STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Fill the timetable automatically with the values from the next journey. Ctrl+Click to try to keep waiting times STR_TIMETABLE_EXPECTED :{BLACK}Expected STR_TIMETABLE_SCHEDULED :{BLACK}Scheduled @@ -4537,12 +4572,14 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}One of t STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}AI / GameScript Debug window is only available for the server # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}AI/Game Script Configuration +STR_AI_CONFIG_CAPTION_AI :{WHITE}AI Configuration +STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Game Script Configuration STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}The Game Script that will be loaded in the next game STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}The AIs that will be loaded in the next game STR_AI_CONFIG_HUMAN_PLAYER :Human player STR_AI_CONFIG_RANDOM_AI :Random AI STR_AI_CONFIG_NONE :(none) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Maximum no. competitors: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Move Up STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Move selected AI up in the list @@ -4550,12 +4587,11 @@ STR_AI_CONFIG_MOVE_DOWN :{BLACK}Move Dow STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Move selected AI down in the list STR_AI_CONFIG_GAMESCRIPT :{SILVER}Game Script +STR_AI_CONFIG_GAMESCRIPT_PARAM :{SILVER}Parameters STR_AI_CONFIG_AI :{SILVER}AIs -STR_AI_CONFIG_CHANGE :{BLACK}Select {STRING} -STR_AI_CONFIG_CHANGE_NONE : -STR_AI_CONFIG_CHANGE_AI :AI -STR_AI_CONFIG_CHANGE_GAMESCRIPT :Game Script +STR_AI_CONFIG_CHANGE_AI :{BLACK}Select AI +STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}Select Game Script STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Load another script STR_AI_CONFIG_CONFIGURE :{BLACK}Configure STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Configure the parameters of the Script @@ -4584,9 +4620,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Heightma STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Minimap screenshot # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameters -STR_AI_SETTINGS_CAPTION_AI :AI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Game Script +STR_AI_SETTINGS_CAPTION_AI :{WHITE}AI Parameters STR_AI_SETTINGS_CLOSE :{BLACK}Close STR_AI_SETTINGS_RESET :{BLACK}Reset STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4750,6 +4784,7 @@ STR_ERROR_TOO_MANY_INDUSTRIES :{WHITE}... too STR_ERROR_CAN_T_GENERATE_INDUSTRIES :{WHITE}Can't generate industries... STR_ERROR_CAN_T_BUILD_HERE :{WHITE}Can't build {STRING} here... STR_ERROR_CAN_T_CONSTRUCT_THIS_INDUSTRY :{WHITE}Can't construct this industry type here... +STR_ERROR_CAN_T_PROSPECT_INDUSTRY :{WHITE}Can't prospect industry... STR_ERROR_INDUSTRY_TOO_CLOSE :{WHITE}... too close to another industry STR_ERROR_MUST_FOUND_TOWN_FIRST :{WHITE}... must found town first STR_ERROR_ONLY_ONE_ALLOWED_PER_TOWN :{WHITE}... only one allowed per town @@ -4764,6 +4799,8 @@ STR_ERROR_FOREST_CAN_ONLY_BE_PLANTED :{WHITE}... fore STR_ERROR_CAN_ONLY_BE_BUILT_ABOVE_SNOW_LINE :{WHITE}... can only be built above the snow-line STR_ERROR_CAN_ONLY_BE_BUILT_BELOW_SNOW_LINE :{WHITE}... can only be built below the snow-line +STR_ERROR_PROSPECTING_WAS_UNLUCKY :{WHITE}The funding failed to prospect due to bad luck; try again +STR_ERROR_NO_SUITABLE_PLACES_FOR_PROSPECTING :{WHITE}There were no suitable places to prospect for this industry STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES :{WHITE}There were no suitable places for '{STRING}' industries STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES_EXPLANATION :{WHITE}Change the map generation parameters to get a better map @@ -5004,6 +5041,8 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Can't ch STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... vehicle is destroyed +STR_ERROR_CAN_T_CLONE_VEHICLE_LIST :{WHITE}... not all vehicles are identical + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}No vehicles will be available at all STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Change your NewGRF configuration STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}No vehicles are available yet @@ -5030,6 +5069,8 @@ STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}Can't sk STR_ERROR_CAN_T_COPY_SHARE_ORDER :{WHITE}... vehicle can't go to all stations STR_ERROR_CAN_T_ADD_ORDER :{WHITE}... vehicle can't go to that station STR_ERROR_CAN_T_ADD_ORDER_SHARED :{WHITE}... a vehicle sharing this order can't go to that station +STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST :{WHITE}... not all vehicles have the same orders +STR_ERROR_CAN_T_SHARE_ORDER_VEHICLE_LIST :{WHITE}... not all vehicles are sharing orders STR_ERROR_CAN_T_SHARE_ORDER_LIST :{WHITE}Can't share order list... STR_ERROR_CAN_T_STOP_SHARING_ORDER_LIST :{WHITE}Can't stop sharing order list... diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index 73c9629c33..c2a8e05229 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -200,6 +200,16 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}hp STR_UNITS_POWER_METRIC :{COMMA}{NBSP}hp STR_UNITS_POWER_SI :{COMMA}{NBSP}kW +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_SI :{DECIMAL}{NBSP}hp/Mg +STR_UNITS_POWER_METRIC_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_SI :{DECIMAL}{NBSP}hp/Mg +STR_UNITS_POWER_SI_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_SI :{DECIMAL}{NBSP}W/kg + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -391,10 +401,11 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Quit # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Game options STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Settings -STR_SETTINGS_MENU_SCRIPT_SETTINGS :AI/Game script settings +STR_SETTINGS_MENU_AI_SETTINGS :AI settings +STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :Game script settings STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF settings STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Transparency options STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Town names displayed @@ -965,36 +976,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Indian Rupee (I STR_GAME_OPTIONS_CURRENCY_IDR :Indonesian Rupiah (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Malaysian Ringgit (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Drive on left -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Drive on right - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Town names: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Select style of town names - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :English (Original) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :French -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :German -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :English (Additional) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Latin-American -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Silly -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Swedish -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Dutch -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finnish -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Polish -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slovak -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norwegian -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Hungarian -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Austrian -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Romanian -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Czech -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Swiss -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Danish -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turkish -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italian -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Catalan - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Autosave STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Select interval between automatic game saves @@ -1027,21 +1008,19 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Check th STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Current driver: {STRING} -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Interface size -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Select the interface element size to use +STR_GAME_OPTIONS_GUI_SCALE_FRAME :{BLACK}Interface size +STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Drag slider to set interface size. Hold Ctrl for continuous adjustment +STR_GAME_OPTIONS_GUI_SCALE_AUTO :{BLACK}Auto-detect size +STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Check this box to detect interface size automatically -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(auto-detect) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Double size -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Quad size +STR_GAME_OPTIONS_GUI_SCALE_BEVELS :{BLACK}Scale bevels +STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :{BLACK}Check this box to scale bevels by interface size -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Font size -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Select the interface font size to use - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(auto-detect) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Double size -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Quad size +STR_GAME_OPTIONS_GUI_SCALE_1X :1x +STR_GAME_OPTIONS_GUI_SCALE_2X :2x +STR_GAME_OPTIONS_GUI_SCALE_3X :3x +STR_GAME_OPTIONS_GUI_SCALE_4X :4x +STR_GAME_OPTIONS_GUI_SCALE_5X :5x STR_GAME_OPTIONS_GRAPHICS :{BLACK}Graphics @@ -1093,8 +1072,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Preview STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 Pound (£) in your currency STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Change custom currency parameter -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Maximum no. competitors: {ORANGE}{COMMA} - STR_NONE :None STR_FUNDING_ONLY :Funding only STR_MINIMAL :Minimal @@ -1144,6 +1121,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Temperate landscape +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Sub-arctic landscape +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Sub-tropical landscape +STR_CLIMATE_TOYLAND_LANDSCAPE :Toyland landscape + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Very Flat STR_TERRAIN_TYPE_FLAT :Flat @@ -1449,6 +1432,8 @@ STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Width of the li STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :Show the NewGRF's name in the build vehicle window: {STRING} 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_SHOW_CARGO_IN_LISTS :Show the cargos the vehicles can carry in the list windows {STRING} +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS_HELPTEXT :If enabled, the vehicle's transportable load will appear above it in the vehicle lists 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 @@ -1503,6 +1488,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Improved STR_CONFIG_SETTING_ROAD_SIDE :Road vehicles: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Choose the driving side +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Drive on left +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Drive on right + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Heightmap rotation: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Counter-clockwise @@ -1537,7 +1526,7 @@ STR_CONFIG_SETTING_LINKGRAPH_COLOURS_GREEN_TO_BLUE :Green to blue STR_CONFIG_SETTING_LINKGRAPH_COLOURS_GREY_TO_RED :Gray to red STR_CONFIG_SETTING_LINKGRAPH_COLOURS_GREYSCALE :Grayscale -STR_CONFIG_SETTING_SCROLLMODE :Viewport scroll behaviour: {STRING} +STR_CONFIG_SETTING_SCROLLMODE :Viewport scroll behavior: {STRING} STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Behavior when scrolling the map ###length 4 STR_CONFIG_SETTING_SCROLLMODE_DEFAULT :Move viewport with RMB, mouse position locked @@ -2037,7 +2026,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Automatic rever STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Allow trains to reverse on a signal, if they waited there a long time ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Recommended) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Recommended) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Change setting value @@ -2080,7 +2069,8 @@ STR_INTRO_HIGHSCORE :{BLACK}Highscor STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Settings STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF Settings STR_INTRO_ONLINE_CONTENT :{BLACK}Check Online Content -STR_INTRO_SCRIPT_SETTINGS :{BLACK}AI/Game Script Settings +STR_INTRO_AI_SETTINGS :{BLACK}AI Settings +STR_INTRO_GAMESCRIPT_SETTINGS :{BLACK}Game Script Settings STR_INTRO_QUIT :{BLACK}Quit STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Start a new game. Ctrl+Click skips map configuration @@ -2100,7 +2090,8 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Display STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Display settings STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Display NewGRF settings STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Check for new and updated content to download -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Display AI/Game script settings +STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Display AI settings +STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Display Game script settings STR_INTRO_TOOLTIP_QUIT :{BLACK}Quit 'OpenTTD' STR_INTRO_BASESET :{BLACK}The currently selected base graphics set is missing {NUM} sprite{P "" s}. Please check for updates for the baseset. @@ -2132,12 +2123,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Change STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Change current year STR_CHEAT_SETUP_PROD :{LTBLUE}Enable modifying production values: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Temperate landscape -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Sub-arctic landscape -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Sub-tropical landscape -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Toyland landscape - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Color Scheme @@ -2497,13 +2482,13 @@ STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :waiting for lin STR_NETWORK_MESSAGE_CLIENT_LEAVING :leaving STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} has joined the game -STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {STRING} has joined the game (Client #{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} has joined company #{2:NUM} +STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {0:STRING} has joined the game (Client #{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {0:STRING} has joined company #{2:NUM} STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} has joined spectators -STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} has started a new company (#{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} has left the game ({2:STRING}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {0:STRING} has started a new company (#{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {0:STRING} has left the game ({2:STRING}) STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} has changed their name to {STRING} -STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} gave {2:CURRENCY_LONG} to {1:STRING} +STR_NETWORK_MESSAGE_GIVE_MONEY :*** {0:STRING} gave {2:CURRENCY_LONG} to {1:STRING} 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 :*** {STRING} was kicked. Reason: ({STRING}) @@ -2866,6 +2851,8 @@ STR_FOUND_TOWN_RANDOM_TOWN_BUTTON :{BLACK}Random T STR_FOUND_TOWN_RANDOM_TOWN_TOOLTIP :{BLACK}Found town in random location STR_FOUND_TOWN_MANY_RANDOM_TOWNS :{BLACK}Many random towns STR_FOUND_TOWN_RANDOM_TOWNS_TOOLTIP :{BLACK}Cover the map with randomly placed towns +STR_FOUND_TOWN_EXPAND_ALL_TOWNS :{BLACK}Expand all towns +STR_FOUND_TOWN_EXPAND_ALL_TOWNS_TOOLTIP :{BLACK}Make all towns grow slightly STR_FOUND_TOWN_NAME_TITLE :{YELLOW}Town name: STR_FOUND_TOWN_NAME_EDITOR_TITLE :{BLACK}Enter town name @@ -3144,6 +3131,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Map size STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Select the size of the map in tiles. The number of available tiles will be slightly smaller STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}No. of towns: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Town names: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Select style of town names STR_MAPGEN_DATE :{BLACK}Date: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}No. of industries: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Highest peak: @@ -3159,11 +3148,40 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Decrease STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Land generator: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terrain type: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Sea level: +STR_MAPGEN_SEA_LEVEL :{BLACK}Sea level: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Rivers: STR_MAPGEN_SMOOTHNESS :{BLACK}Smoothness: STR_MAPGEN_VARIETY :{BLACK}Variety distribution: STR_MAPGEN_GENERATE :{WHITE}Generate +STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF Settings +STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Display NewGRF settings +STR_MAPGEN_AI_SETTINGS :{BLACK}AI Settings +STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Display AI settings +STR_MAPGEN_GS_SETTINGS :{BLACK}Game Script Settings +STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Display game script settings + +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :English (Original) +STR_MAPGEN_TOWN_NAME_FRENCH :French +STR_MAPGEN_TOWN_NAME_GERMAN :German +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :English (Additional) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Latin-American +STR_MAPGEN_TOWN_NAME_SILLY :Silly +STR_MAPGEN_TOWN_NAME_SWEDISH :Swedish +STR_MAPGEN_TOWN_NAME_DUTCH :Dutch +STR_MAPGEN_TOWN_NAME_FINNISH :Finnish +STR_MAPGEN_TOWN_NAME_POLISH :Polish +STR_MAPGEN_TOWN_NAME_SLOVAK :Slovak +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norwegian +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Hungarian +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Austrian +STR_MAPGEN_TOWN_NAME_ROMANIAN :Romanian +STR_MAPGEN_TOWN_NAME_CZECH :Czech +STR_MAPGEN_TOWN_NAME_SWISS :Swiss +STR_MAPGEN_TOWN_NAME_DANISH :Danish +STR_MAPGEN_TOWN_NAME_TURKISH :Turkish +STR_MAPGEN_TOWN_NAME_ITALIAN :Italian +STR_MAPGEN_TOWN_NAME_CATALAN :Catalan # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Map edges: @@ -3309,6 +3327,13 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Previous STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Proceed to the previous normal sprite, skipping any pseudo/recolor/font sprites and wrapping around from the first sprite to the last STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Representation of the currently selected sprite. The alignment is ignored when drawing this sprite STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Move the sprite around, changing the X and Y offsets. Ctrl+Click to move the sprite eight units at a time + +###length 2 +STR_SPRITE_ALIGNER_CENTRE_OFFSET :{BLACK}Offset centered +STR_SPRITE_ALIGNER_CENTRE_SPRITE :{BLACK}Sprite centered + +STR_SPRITE_ALIGNER_CROSSHAIR :{BLACK}Crosshair + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Reset relative STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Reset the current relative offsets STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X offset: {NUM}, Y offset: {NUM} (Absolute) @@ -3326,15 +3351,15 @@ STR_NEWGRF_ERROR_MSG_FATAL :{RED}Fatal: {SI STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}A fatal NewGRF error has occurred:{}{STRING} STR_NEWGRF_ERROR_POPUP :{WHITE}A NewGRF error has occurred:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} will not work with the TTDPatch version reported by OpenTTD -STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} is for the {STRING} version of TTD -STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} is designed to be used with {STRING} -STR_NEWGRF_ERROR_INVALID_PARAMETER :Invalid parameter for {1:STRING}: parameter {STRING} ({NUM}) -STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} must be loaded before {STRING} -STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} must be loaded after {STRING} -STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} requires OpenTTD version {STRING} or better +STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} is for the {2:STRING} version of TTD +STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} is designed to be used with {2:STRING} +STR_NEWGRF_ERROR_INVALID_PARAMETER :Invalid parameter for {1:STRING}: parameter {2:STRING} ({3:NUM}) +STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} must be loaded before {2:STRING} +STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} must be loaded after {2:STRING} +STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} requires OpenTTD version {2:STRING} or better STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :the GRF file it was designed to translate STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Too many NewGRFs are loaded -STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Loading {1:STRING} as static NewGRF with {STRING} could cause desyncs +STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Loading {1:STRING} as static NewGRF with {2:STRING} could cause desyncs STR_NEWGRF_ERROR_UNEXPECTED_SPRITE :Unexpected sprite (sprite {3:NUM}) STR_NEWGRF_ERROR_UNKNOWN_PROPERTY :Unknown Action 0 property {4:HEX} (sprite {3:NUM}) STR_NEWGRF_ERROR_INVALID_ID :Attempt to use invalid ID (sprite {3:NUM}) @@ -3466,14 +3491,14 @@ STR_LOCAL_AUTHORITY_ACTION_EXCLUSIVE_TRANSPORT :Buy exclusive t STR_LOCAL_AUTHORITY_ACTION_BRIBE :Bribe the local authority ###length 8 -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{YELLOW}Initiate a small local advertising campaign, to attract more passengers and cargo to your transport services.{}Provides a temporary boost to station rating in a small radius around the town center.{}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{YELLOW}Initiate a small local advertising campaign, to attract more passengers and cargo to your transport services.{}Provides a temporary boost to station rating in a small radius around the town center.{}{POP_COLOUR}Cost: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{YELLOW}Initiate a medium local advertising campaign, to attract more passengers and cargo to your transport services.{}Provides a temporary boost to station rating in a medium radius around the town center.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{YELLOW}Initiate a large local advertising campaign, to attract more passengers and cargo to your transport services.{}Provides a temporary boost to station rating in a large radius around the town center.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{YELLOW}Fund the reconstruction of the urban road network.{}Causes considerable disruption to road traffic for up to 6 months.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{YELLOW}Build a statue in honor of your company.{}Provides a permanent boost to station rating in this town.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{YELLOW}Fund the construction of new buildings in the town.{}Provides a temporary boost to town growth in this town.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW}Buy 1 year's exclusive transport rights in town.{}Town authority will not allow passengers and cargo to use your competitors' stations.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Bribe the local authority to increase your rating, at the risk of a severe penalty if caught.{}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}Initiate a large local advertising campaign, to attract more passengers and cargo to your transport services.{}Provides a temporary boost to station rating in a large radius around the town center.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{PUSH_COLOUR}{YELLOW}Fund the reconstruction of the urban road network.{}Causes considerable disruption to road traffic for up to 6 months.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Build a statue in honor of your company.{}Provides a permanent boost to station rating in this town.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Fund the construction of new buildings in the town.{}Provides a temporary boost to town growth in this town.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}Buy 1 year's exclusive transport rights in town.{}Town authority will not allow passengers and cargo to use your competitors' stations.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Bribe the local authority to increase your rating, at the risk of a severe penalty if caught.{}{POP_COLOUR}Cost: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}{COMPANY} Goals @@ -3646,16 +3671,18 @@ STR_FINANCES_SECTION_SHIP_REVENUE :{GOLD}Ships STR_FINANCES_SECTION_LOAN_INTEREST :{GOLD}Loan Interest STR_FINANCES_SECTION_OTHER :{GOLD}Other +STR_FINANCES_TOTAL_CAPTION :{WHITE}Total STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} STR_FINANCES_ZERO_INCOME :{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} -STR_FINANCES_NET_PROFIT :{WHITE}Net Profit +STR_FINANCES_PROFIT :{WHITE}Profit STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Bank Balance STR_FINANCES_OWN_FUNDS_TITLE :{WHITE}Own Funds STR_FINANCES_LOAN_TITLE :{WHITE}Loan STR_FINANCES_INTEREST_RATE :{WHITE}Loan Interest: {BLACK}{NUM}% STR_FINANCES_MAX_LOAN :{WHITE}Maximum Loan: {BLACK}{CURRENCY_LONG} STR_FINANCES_TOTAL_CURRENCY :{BLACK}{CURRENCY_LONG} +STR_FINANCES_BANK_BALANCE :{WHITE}{CURRENCY_LONG} STR_FINANCES_BORROW_BUTTON :{BLACK}Borrow {CURRENCY_LONG} STR_FINANCES_BORROW_TOOLTIP :{BLACK}Increase size of loan. Ctrl+Click borrows as much as possible STR_FINANCES_REPAY_BUTTON :{BLACK}Repay {CURRENCY_LONG} @@ -3756,7 +3783,7 @@ STR_INDUSTRY_VIEW_PRODUCES_N_CARGO :{BLACK}Produces STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :, {STRING}{STRING} STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Requires: -STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{0:STRING}{BLACK}{3:STRING} STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} waiting{STRING} STR_CONFIG_GAME_PRODUCTION :{WHITE}Change production (multiple of 8, up to 2040) @@ -3786,6 +3813,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Send ins STR_VEHICLE_LIST_REPLACE_VEHICLES :Replace vehicles STR_VEHICLE_LIST_SEND_FOR_SERVICING :Send for Maintenance STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Profit this year: {CURRENCY_LONG} (last year: {CURRENCY_LONG}) +STR_VEHICLE_LIST_CARGO :{TINY_FONT}{BLACK}[{CARGO_LIST}] +STR_VEHICLE_LIST_NAME_AND_CARGO :{TINY_FONT}{BLACK}{STRING} {STRING} STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Send to Depot STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Send to Depot @@ -3877,6 +3906,11 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Max. Tra STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Range: {GOLD}{COMMA} tiles STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Aircraft type: {GOLD}{STRING} +###length 3 +STR_CARGO_TYPE_FILTER_ALL :All cargo types +STR_CARGO_TYPE_FILTER_FREIGHT :Freight +STR_CARGO_TYPE_FILTER_NONE :None + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Train vehicle selection list. Click on vehicle for information. Ctrl+Click to toggle hiding of the vehicle type STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Road vehicle selection list. Click on vehicle for information. Ctrl+Click to toggle hiding of the vehicle type @@ -4045,7 +4079,7 @@ STR_ENGINE_PREVIEW_AIRCRAFT :aircraft STR_ENGINE_PREVIEW_SHIP :ship STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Cost: {CURRENCY_LONG} Weight: {WEIGHT_SHORT}{}Speed: {VELOCITY} Power: {POWER}{}Running Cost: {CURRENCY_LONG}/yr{}Capacity: {CARGO_LONG} -STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Cost: {CURRENCY_LONG} Weight: {WEIGHT_SHORT}{}Speed: {VELOCITY} Power: {POWER} Max. T.E.: {6:FORCE}{}Running Cost: {4:CURRENCY_LONG}/yr{}Capacity: {5:CARGO_LONG} +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Cost: {0:CURRENCY_LONG} Weight: {1:WEIGHT_SHORT}{}Speed: {2:VELOCITY} Power: {3:POWER} Max. T.E.: {6:FORCE}{}Running Cost: {4:CURRENCY_LONG}/yr{}Capacity: {5:CARGO_LONG} STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY}{}Capacity: {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY}{}Aircraft type: {STRING}{}Capacity: {CARGO_LONG}, {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY}{}Aircraft type: {STRING}{}Capacity: {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr @@ -4204,12 +4238,13 @@ STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Weight: STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Weight: {LTBLUE}{WEIGHT_SHORT} {BLACK}Power: {LTBLUE}{POWER}{BLACK} Max. speed: {LTBLUE}{VELOCITY} {BLACK}Max. T.E.: {LTBLUE}{FORCE} STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Profit this year: {LTBLUE}{CURRENCY_LONG} (last year: {CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Profit this year: {LTBLUE}{CURRENCY_LONG} (last year: {CURRENCY_LONG}) {BLACK}Min. performance: {LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Reliability: {LTBLUE}{COMMA}% {BLACK}Breakdowns since last maintenance: {LTBLUE}{COMMA} STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Built: {LTBLUE}{NUM}{BLACK} Value: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_INFO_NO_CAPACITY :{BLACK}Capacity: {LTBLUE}None{STRING} -STR_VEHICLE_INFO_CAPACITY :{BLACK}Capacity: {LTBLUE}{CARGO_LONG}{3:STRING} -STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Capacity: {LTBLUE}{CARGO_LONG}{3:STRING} (x{4:NUM}) +STR_VEHICLE_INFO_CAPACITY :{BLACK}Capacity: {LTBLUE}{0:CARGO_LONG}{3:STRING} +STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Capacity: {LTBLUE}{0:CARGO_LONG}{3:STRING} (x{4:NUM}) STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Capacity: {LTBLUE}{CARGO_LONG}, {CARGO_LONG}{STRING} STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Transfer Credits: {LTBLUE}{CURRENCY_LONG} @@ -4478,22 +4513,22 @@ STR_TIMETABLE_STARTING_DATE :{BLACK}Start Da STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Select a date as starting point of this timetable. Ctrl+Click distributes all vehicles sharing this order evenly from the given date based on their relative order, if the order is completely timetabled STR_TIMETABLE_CHANGE_TIME :{BLACK}Change Time -STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Change the amount of time that the highlighted order should take +STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Change the amount of time that the highlighted order should take. Ctrl+Click sets the time for all orders STR_TIMETABLE_CLEAR_TIME :{BLACK}Clear Time -STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Clear the amount of time for the highlighted order +STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Clear the amount of time for the highlighted order. Ctrl+Click clears the time for all orders STR_TIMETABLE_CHANGE_SPEED :{BLACK}Change Speed Limit -STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Change the maximum travel speed of the highlighted order +STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Change the maximum travel speed of the highlighted order. Ctrl+Click sets the speed for all orders STR_TIMETABLE_CLEAR_SPEED :{BLACK}Clear Speed Limit -STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Clear the maximum travel speed of the highlighted order +STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Clear the maximum travel speed of the highlighted order. Ctrl+Click clears the speed for all orders STR_TIMETABLE_RESET_LATENESS :{BLACK}Reset Late Counter STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Reset the lateness counter, so the vehicle will be on time STR_TIMETABLE_AUTOFILL :{BLACK}Autofill -STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Fill the timetable automatically with the values from the next journey (Ctrl+Click to try to keep waiting times) +STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Fill the timetable automatically with the values from the next journey. Ctrl+Click to try to keep waiting times STR_TIMETABLE_EXPECTED :{BLACK}Expected STR_TIMETABLE_SCHEDULED :{BLACK}Scheduled @@ -4537,12 +4572,14 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}One of t STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}AI/Game Script Debug window is only available for the server # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}AI/Game Script Configuration +STR_AI_CONFIG_CAPTION_AI :{WHITE}AI Configuration +STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Game Script Configuration STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}The Game Script that will be loaded in the next game STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}The AIs that will be loaded in the next game STR_AI_CONFIG_HUMAN_PLAYER :Human player STR_AI_CONFIG_RANDOM_AI :Random AI STR_AI_CONFIG_NONE :(none) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Maximum no. competitors: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Move Up STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Move selected AI up in the list @@ -4550,12 +4587,11 @@ STR_AI_CONFIG_MOVE_DOWN :{BLACK}Move Dow STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Move selected AI down in the list STR_AI_CONFIG_GAMESCRIPT :{SILVER}Game Script +STR_AI_CONFIG_GAMESCRIPT_PARAM :{SILVER}Parameters STR_AI_CONFIG_AI :{SILVER}AIs -STR_AI_CONFIG_CHANGE :{BLACK}Select {STRING} -STR_AI_CONFIG_CHANGE_NONE : -STR_AI_CONFIG_CHANGE_AI :AI -STR_AI_CONFIG_CHANGE_GAMESCRIPT :Game Script +STR_AI_CONFIG_CHANGE_AI :{BLACK}Select AI +STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}Select Game Script STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Load another script STR_AI_CONFIG_CONFIGURE :{BLACK}Configure STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Configure the parameters of the Script @@ -4584,9 +4620,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Heightma STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Minimap screenshot # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameters -STR_AI_SETTINGS_CAPTION_AI :AI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Game Script +STR_AI_SETTINGS_CAPTION_AI :{WHITE}AI Parameters STR_AI_SETTINGS_CLOSE :{BLACK}Close STR_AI_SETTINGS_RESET :{BLACK}Reset STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4750,6 +4784,7 @@ STR_ERROR_TOO_MANY_INDUSTRIES :{WHITE}... too STR_ERROR_CAN_T_GENERATE_INDUSTRIES :{WHITE}Can't generate industries... STR_ERROR_CAN_T_BUILD_HERE :{WHITE}Can't build {STRING} here... STR_ERROR_CAN_T_CONSTRUCT_THIS_INDUSTRY :{WHITE}Can't construct this industry type here... +STR_ERROR_CAN_T_PROSPECT_INDUSTRY :{WHITE}Can't prospect industry... STR_ERROR_INDUSTRY_TOO_CLOSE :{WHITE}... too close to another industry STR_ERROR_MUST_FOUND_TOWN_FIRST :{WHITE}... must found town first STR_ERROR_ONLY_ONE_ALLOWED_PER_TOWN :{WHITE}... only one allowed per town @@ -4764,6 +4799,8 @@ STR_ERROR_FOREST_CAN_ONLY_BE_PLANTED :{WHITE}... fore STR_ERROR_CAN_ONLY_BE_BUILT_ABOVE_SNOW_LINE :{WHITE}... can only be built above the snow-line STR_ERROR_CAN_ONLY_BE_BUILT_BELOW_SNOW_LINE :{WHITE}... can only be built below the snow-line +STR_ERROR_PROSPECTING_WAS_UNLUCKY :{WHITE}The funding failed to prospect due to bad luck; try again +STR_ERROR_NO_SUITABLE_PLACES_FOR_PROSPECTING :{WHITE}There were no suitable places to prospect for this industry STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES :{WHITE}There were no suitable places for '{STRING}' industries STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES_EXPLANATION :{WHITE}Change the map generation parameters to get a better map @@ -5004,6 +5041,8 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Can't ch STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... vehicle is destroyed +STR_ERROR_CAN_T_CLONE_VEHICLE_LIST :{WHITE}... not all vehicles are identical + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}No vehicles will be available at all STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Change your NewGRF configuration STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}No vehicles are available yet @@ -5030,6 +5069,8 @@ STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}Can't sk STR_ERROR_CAN_T_COPY_SHARE_ORDER :{WHITE}... vehicle can't go to all stations STR_ERROR_CAN_T_ADD_ORDER :{WHITE}... vehicle can't go to that station STR_ERROR_CAN_T_ADD_ORDER_SHARED :{WHITE}... a vehicle sharing this order can't go to that station +STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST :{WHITE}... not all vehicles have the same orders +STR_ERROR_CAN_T_SHARE_ORDER_VEHICLE_LIST :{WHITE}... not all vehicles are sharing orders STR_ERROR_CAN_T_SHARE_ORDER_LIST :{WHITE}Can't share order list... STR_ERROR_CAN_T_STOP_SHARING_ORDER_LIST :{WHITE}Can't stop sharing order list... diff --git a/src/lang/esperanto.txt b/src/lang/esperanto.txt index 4ef2385e62..073d15250e 100644 --- a/src/lang/esperanto.txt +++ b/src/lang/esperanto.txt @@ -198,6 +198,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}ĉ STR_UNITS_POWER_METRIC :{COMMA}{NBSP}ĉp STR_UNITS_POWER_SI :{COMMA}{NBSP}kW + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -368,10 +369,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Forlasi # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Ludaj opcioj STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Agordoj -STR_SETTINGS_MENU_SCRIPT_SETTINGS :AI/Ludo skripto agordoj STR_SETTINGS_MENU_NEWGRF_SETTINGS :Agordoj de NewGRF STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Ebloj por travidebleco STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Urbonomoj montriĝas @@ -908,36 +908,6 @@ STR_GAME_OPTIONS_CURRENCY_CUSTOM :Alia... STR_GAME_OPTIONS_CURRENCY_GEL :Kartvela Lario (GEL) STR_GAME_OPTIONS_CURRENCY_IRR :Irana Rialo (IRR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Veturu maldekstre -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Veturu dekstre - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Urbonomoj -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Elektu stilon de urbonomoj - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Angle (Originale) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :France -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Germane -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Angle (Aldone) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Latin-Amerike -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Angle (Stulte) -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Svede -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Nederlande -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finne -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Pole -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slovake -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norvege -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Hungare -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Aŭstrie -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Rumane -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Ĉeĥe -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Svise -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Dane -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turke -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Itale -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Katalune - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Aŭtomata konservado STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Elektu intervalon inter aŭtomataj konservadoj de la ludo @@ -962,11 +932,6 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :alia -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Interfacgrandeco - -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normala -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Duobla grandeco -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Kvaroble grandeco @@ -1011,8 +976,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Antaŭv STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 pundo (£) en via valuto STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Ŝanĝi parametron por alia monunuo -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Maksimumo da konkurantoj: {ORANGE}{COMMA} - STR_NONE :Neniom STR_FUNDING_ONLY :Funduso sola STR_MINIMAL :Malgrandeto @@ -1062,6 +1025,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Modera landaspekto +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Arktikeca landaspekto +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Tropikeca landaspekto +STR_CLIMATE_TOYLAND_LANDSCAPE :Ludolandaspekto + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Tre Ebene STR_TERRAIN_TYPE_FLAT :Ebene @@ -1286,6 +1255,10 @@ STR_CONFIG_SETTING_TREE_PLACER_ORIGINAL :Originale STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Plibonigita +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Veturu maldekstre +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Veturu dekstre + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Altecmapa turniĝo: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Maldekstrume @@ -1577,7 +1550,7 @@ STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS :Padtrovilo por STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Aŭtomata dorsflankante ĉe signaloj: {STRING} ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Rekomendite) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Rekomendite) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Ŝanĝu agord-valoron @@ -1645,12 +1618,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Ŝanĝu STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Ŝanĝu nunan jaron STR_CHEAT_SETUP_PROD :{LTBLUE}Ebligu ŝanĝi produktvalorojn: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Modera landaspekto -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Arktikeca landaspekto -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Tropikeca landaspekto -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Ludolandaspekto - # Livery window STR_LIVERY_GENERAL_TOOLTIP :{BLACK}Montru ĝeneralajn kolorskemojn @@ -2420,16 +2387,41 @@ STR_MAPGEN_MAPSIZE :{BLACK}Mapgrand STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Selektu la grandeco de la mapo en azuleĥoj. La nombro de disponeblaj azuleĥoj estos iom pli malgranda STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Kiom da urboj: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Urbonomoj +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Elektu stilon de urbonomoj STR_MAPGEN_DATE :{BLACK}Dato: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Kiom da industrioj: STR_MAPGEN_LAND_GENERATOR :{BLACK}Landgenerilo: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terentipo: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Marnivelo: +STR_MAPGEN_SEA_LEVEL :{BLACK}Marnivelo: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Riveroj: STR_MAPGEN_SMOOTHNESS :{BLACK}Reguleco: STR_MAPGEN_VARIETY :{BLACK}Diverseca distribuo: STR_MAPGEN_GENERATE :{WHITE}Generu +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Angle (Originale) +STR_MAPGEN_TOWN_NAME_FRENCH :France +STR_MAPGEN_TOWN_NAME_GERMAN :Germane +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Angle (Aldone) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Latin-Amerike +STR_MAPGEN_TOWN_NAME_SILLY :Angle (Stulte) +STR_MAPGEN_TOWN_NAME_SWEDISH :Svede +STR_MAPGEN_TOWN_NAME_DUTCH :Nederlande +STR_MAPGEN_TOWN_NAME_FINNISH :Finne +STR_MAPGEN_TOWN_NAME_POLISH :Pole +STR_MAPGEN_TOWN_NAME_SLOVAK :Slovake +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norvege +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Hungare +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Aŭstrie +STR_MAPGEN_TOWN_NAME_ROMANIAN :Rumane +STR_MAPGEN_TOWN_NAME_CZECH :Ĉeĥe +STR_MAPGEN_TOWN_NAME_SWISS :Svise +STR_MAPGEN_TOWN_NAME_DANISH :Dane +STR_MAPGEN_TOWN_NAME_TURKISH :Turke +STR_MAPGEN_TOWN_NAME_ITALIAN :Itale +STR_MAPGEN_TOWN_NAME_CATALAN :Katalune + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Maprandoj: STR_MAPGEN_NORTHWEST :{BLACK}Nordokcidenta @@ -2547,6 +2539,10 @@ STR_SPRITE_ALIGNER_NEXT_BUTTON :{BLACK}Sekvanta STR_SPRITE_ALIGNER_GOTO_BUTTON :{BLACK}Iru al bildeto STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Antaŭa bildeto STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Movadi la bildeton, ŝanĝante la X kaj Y distancojn. Stir-klako por movi la bildeton je 8 unuoj samtempe + +###length 2 + + STR_SPRITE_ALIGNER_PICKER_BUTTON :{BLACK}Elektu bildeto STR_SPRITE_ALIGNER_PICKER_TOOLTIP :{BLACK}Elektu bildeton ie el la ekrano @@ -2940,6 +2936,8 @@ STR_PURCHASE_INFO_ALL_TYPES :Ĉiaj ŝarĝoj STR_PURCHASE_INFO_ALL_BUT :Ĉio krom {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}Maksimuma Tiro: {GOLD}{FORCE} +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Trajnveturila elektolisto - alklaku veturilon por informoj STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Stratveturilelektan liston - alklaku veturilon por informoj @@ -3519,10 +3517,10 @@ STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}Vidu for # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}AI/Ludo Skripto Agordo STR_AI_CONFIG_HUMAN_PLAYER :Homa ludanto STR_AI_CONFIG_RANDOM_AI :Hazarda AI STR_AI_CONFIG_NONE :(neniu) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Maksimumo da konkurantoj: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Movi supren STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Movi elektitan AI-on supren en la listo @@ -3531,7 +3529,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Movi ele STR_AI_CONFIG_AI :{SILVER}AIj -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CONFIGURE :{BLACK}Agordi STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Agordi parametroj de la skripto @@ -3549,7 +3546,6 @@ STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Ne ŝan # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametroj STR_AI_SETTINGS_CAPTION_AI :AI STR_AI_SETTINGS_CLOSE :{BLACK}Fermi STR_AI_SETTINGS_RESET :{BLACK}Reŝargo @@ -3948,6 +3944,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Ne povas STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... veturilo estas detrua + # Specific vehicle errors STR_ERROR_CAN_T_MAKE_TRAIN_PASS_SIGNAL :{WHITE}Ne povas igi trajnon transiri signalon je danĝero... STR_ERROR_CAN_T_REVERSE_DIRECTION_TRAIN :{WHITE}Ne povas inversigi direkton de trajno... diff --git a/src/lang/estonian.txt b/src/lang/estonian.txt index 49639728c7..95b40dbfcf 100644 --- a/src/lang/estonian.txt +++ b/src/lang/estonian.txt @@ -257,6 +257,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}hj STR_UNITS_POWER_METRIC :{COMMA}hj STR_UNITS_POWER_SI :{COMMA}kW + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}kg @@ -446,10 +447,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Välju # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Mängu seadistus STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Seaded -STR_SETTINGS_MENU_SCRIPT_SETTINGS :AI/GameScripti seaded STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF-i seadistus STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Läbipaistvuse seadistus STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Näidatavad asustuste nimed @@ -1014,36 +1014,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :India ruupia (I STR_GAME_OPTIONS_CURRENCY_IDR :Indoneesia ruupia (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Malaisia ringit (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Vasakpoolne liiklus -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Parempoolne liiklus - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Asulanimed: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Vali asulanimede stiil - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Inglise (algne) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Prantsusmaa -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Saksamaa -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Inglise (täiendatud) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Ladina-Ameerika -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Tobedad -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Rootsi -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Hollandi -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Soome -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Poola -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slovakkia -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norra -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Ungari -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Austria -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Rumeenia -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Tšehhi -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Šveitsi -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Taani -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Türgi -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Itaalia -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Katalaani - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Salvestusvälp STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Vali salvestamise välp @@ -1075,21 +1045,8 @@ STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Märgi, et ekraani v-sync sisse lülitada. Seade kohaldub alles pärast mängu taaskäivitust. Töötab vaid, kui riistvarakiirendus on peal -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Liidese suurus -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Vali kasutatav liideseelementide suurus -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(automaattuvastus) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Tavaline -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Topeltsuurus -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Neljakordne suurus -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Kirja suurus -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Vali kasutatav liideseelementide suurus - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(automaattuvastus) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Tavaline -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Topeltsuurus -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Neljakordne suurus STR_GAME_OPTIONS_GRAPHICS :{BLACK}Graafika @@ -1141,8 +1098,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Eelvaad STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 naela (£) sinu valuutas STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Muuda personaalse valuuta parameetreid -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Vastaseid kuni: {ORANGE}{COMMA} - STR_NONE :Pole STR_FUNDING_ONLY :Ainult rahastatud STR_MINIMAL :Vähene @@ -1192,6 +1147,12 @@ STR_SUBSIDY_X2 :2x STR_SUBSIDY_X3 :3x STR_SUBSIDY_X4 :4x +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Parasvöötme maastik +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Lähisarktiline maastik +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Troopiline maastik +STR_CLIMATE_TOYLAND_LANDSCAPE :Mänguasjamaa + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Väga tasane STR_TERRAIN_TYPE_FLAT :Tasane @@ -1546,6 +1507,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Täiustatud STR_CONFIG_SETTING_ROAD_SIDE :Sõidukid: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Vali liikluse suund +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Vasakpoolne liiklus +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Parempoolne liiklus + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Kõrguskaardi pööre: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Vastupäeva @@ -2062,7 +2027,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Automaatne taga STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Luba rongidel ümber pöörata kui nad on pikka aega foori taga oodanud ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(soovitatud) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(soovitatud) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Määra seade väärtus @@ -2105,7 +2070,6 @@ STR_INTRO_HIGHSCORE :{BLACK}Edetabel STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Seaded STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF-i seadistus STR_INTRO_ONLINE_CONTENT :{BLACK}Aineste allalaadimine -STR_INTRO_SCRIPT_SETTINGS :{BLACK}AI/GameScripti seaded STR_INTRO_QUIT :{BLACK}Välju STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Alusta uut mängu. Ctrl+klõps jätab kaardi seadistamise vahele @@ -2125,7 +2089,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Ava edet STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Ava seaded STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Ava NewGRF-i seadistamine STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Otsi allalaadimiseks uusi ja uuendatud aineseid -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Ava AI/GameScripti seaded STR_INTRO_TOOLTIP_QUIT :{BLACK}Välju 'OpenTTD'st STR_INTRO_BASESET :{BLACK}Hetkel valitud lähtegraafikakogust puudub {NUM} sprite{P "" 'i}. Kontrolli, kas lähtekogule on uuendusi. @@ -2157,12 +2120,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Muuda k STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Muuda jooksvat aastaarvu STR_CHEAT_SETUP_PROD :{LTBLUE}Tootmisväärtuste muutmine: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Parasvöötme maastik -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Lähisarktiline maastik -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Troopiline maastik -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Mänguasjamaa - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Värvivalik @@ -3137,6 +3094,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Kaardi m STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Määrab kaardi mõõtmed ruutudes. Ruute, mida saab kasutada, on pisut vähem STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Asustuste arv: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Asulanimed: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Vali asulanimede stiil STR_MAPGEN_DATE :{BLACK}Algus: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Tööstustihedus: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Kõrgpunkt: @@ -3152,12 +3111,35 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Vähenda STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Maatekituse meetod: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Maapinna tüüp: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Merepinna tase: +STR_MAPGEN_SEA_LEVEL :{BLACK}Merepinna tase: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Jõgesid: STR_MAPGEN_SMOOTHNESS :{BLACK}Laugus: STR_MAPGEN_VARIETY :{BLACK}Iseärasuste jaotus: STR_MAPGEN_GENERATE :{WHITE}Tekita +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Inglise (algne) +STR_MAPGEN_TOWN_NAME_FRENCH :Prantsusmaa +STR_MAPGEN_TOWN_NAME_GERMAN :Saksamaa +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Inglise (täiendatud) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Ladina-Ameerika +STR_MAPGEN_TOWN_NAME_SILLY :Tobedad +STR_MAPGEN_TOWN_NAME_SWEDISH :Rootsi +STR_MAPGEN_TOWN_NAME_DUTCH :Hollandi +STR_MAPGEN_TOWN_NAME_FINNISH :Soome +STR_MAPGEN_TOWN_NAME_POLISH :Poola +STR_MAPGEN_TOWN_NAME_SLOVAK :Slovakkia +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norra +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Ungari +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Austria +STR_MAPGEN_TOWN_NAME_ROMANIAN :Rumeenia +STR_MAPGEN_TOWN_NAME_CZECH :Tšehhi +STR_MAPGEN_TOWN_NAME_SWISS :Šveitsi +STR_MAPGEN_TOWN_NAME_DANISH :Taani +STR_MAPGEN_TOWN_NAME_TURKISH :Türgi +STR_MAPGEN_TOWN_NAME_ITALIAN :Itaalia +STR_MAPGEN_TOWN_NAME_CATALAN :Katalaani + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Kaardi ääred: STR_MAPGEN_NORTHWEST :{BLACK}Loe @@ -3302,6 +3284,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Eelmine STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Proceed to the previous normal sprite, skipping any pseudo/recolour/font sprites and wrapping around at the begin STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Representation of the currently selected sprite. The alignment is ignored when drawing this sprite STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Liiguta spraiti, muutes X ja Y tasakaalu. Ctrl+klõps, et liigutada kaheksa ühiku võrra korraga + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Lähtesta suhteline STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Lähtesta praegused suhtelised kõrvalekalded STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X kõrvalekalle: {NUM}, Y kõrvalekalle: {NUM} (Absoluutne) @@ -3858,6 +3844,8 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Suurim v STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Tegevusradius: {GOLD}{COMMA} ruutu STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Õhusõiduki liik: {GOLD}{STRING} +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Nimekiri raudteesõidukitest - andmete saamiseks klõpsa raudteesõidukile STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Mootorsõidukite nimekiri - andmete saamiseks klõpsa sõidukile @@ -4512,12 +4500,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Üks skr STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}AI/GameScripti debugimise akent saab kasutada ainult serveris # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}AI/Game Script seadistus STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Järgmises mängus laaditav GameScript STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}AI-d järgmises mängus STR_AI_CONFIG_HUMAN_PLAYER :Inimene STR_AI_CONFIG_RANDOM_AI :Suvaline AI STR_AI_CONFIG_NONE :(mitte ühtegi) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Vastaseid kuni: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Tõsta STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Tõsta valitud AI loendis kõrgemale @@ -4527,8 +4515,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Langeta STR_AI_CONFIG_GAMESCRIPT :{SILVER}GameScript STR_AI_CONFIG_AI :{SILVER}AI-d -STR_AI_CONFIG_CHANGE :{BLACK}{STRING.g} valimine -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :AI STR_AI_CONFIG_CHANGE_GAMESCRIPT :GameScript STR_AI_CONFIG_CHANGE_GAMESCRIPT.g :GameScripti @@ -4560,9 +4546,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Kõrgusk STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Pisikaardi ekraanipilt # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} parameetrid STR_AI_SETTINGS_CAPTION_AI :AI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :GameScript STR_AI_SETTINGS_CLOSE :{BLACK}Sulge STR_AI_SETTINGS_RESET :{BLACK}Nulli STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4979,6 +4963,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Hooldusv STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... sõiduk hävitatud + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Ühtegi sõidukit ei ole saadaval STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Muuda NewGRF-i seadistust STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Sõidukeid ei ole veel saadaval diff --git a/src/lang/faroese.txt b/src/lang/faroese.txt index 972fde61e5..0ecaaf0446 100644 --- a/src/lang/faroese.txt +++ b/src/lang/faroese.txt @@ -198,6 +198,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}hp STR_UNITS_POWER_METRIC :{COMMA}hp STR_UNITS_POWER_SI :{COMMA}kW + STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}kg @@ -354,9 +355,8 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Gevst # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Spæl møguleikar -STR_SETTINGS_MENU_SCRIPT_SETTINGS :AI/Spæl script innstillingar STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF innstillingar STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Gjøgnumskygnis møguleikar STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Bygdarnøvn víst @@ -896,36 +896,6 @@ STR_GAME_OPTIONS_CURRENCY_CUSTOM :Sjálvgjørt... STR_GAME_OPTIONS_CURRENCY_GEL :Georgiskur Lari STR_GAME_OPTIONS_CURRENCY_IRR :Iranskur Rial -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Vinstrakoyring -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Høgrakoyring - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Bygdar nøvn -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Áset slag av bygdar nøvnum - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Ensk (Upprunalig) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Fronsk -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Týsk -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Ensk (Meiri) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Latin-Amerikonsk -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Fjákut -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Svensk -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Niðurlendsk -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finsk -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Polsk -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slovakisk -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norsk -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Ungarsk -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Eysturrísk -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Rumensk -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Tjekkisk -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Sveisisk -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Donsk -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turkisk -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italiensk -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Katalanisk - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Sjálvgoymsla STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Vel títtleika av sjálvgoymslu @@ -955,7 +925,6 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :annað - STR_GAME_OPTIONS_BASE_GRF :{BLACK}Base grafikk sett STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Vel ta base grafikk setti tú vil brúka STR_GAME_OPTIONS_BASE_GRF_STATUS :{RED}{NUM} vantandi/oyðiløgd fíl{P a ir} @@ -998,8 +967,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Undanv STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 Pund (£) í tínum gjaldsoyra STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Broyt parametur í sjálvgjørda gjaldsoyranum -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Hægsta tali av kappingarneytum: {ORANGE}{COMMA} - STR_NONE :Einki STR_FUNDING_ONLY :Fíggjing einans STR_MINIMAL :Minst @@ -1049,6 +1016,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Lýtt landslag +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Undir-arktiskt landslag +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Undir-tropiskt landslag +STR_CLIMATE_TOYLAND_LANDSCAPE :Leikuland landslag + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Sera flatt STR_TERRAIN_TYPE_FLAT :Flatt @@ -1355,6 +1328,10 @@ STR_CONFIG_SETTING_TREE_PLACER_ORIGINAL :Upprunalig STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Betra +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Vinstrakoyring +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Høgrakoyring + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Hæddarkort snarðing: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Í móti klokkunu @@ -1732,7 +1709,7 @@ STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS :Leiðbeinari fy STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS_HELPTEXT :Leið beinari at nýta fyri skip ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Viðmældur) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Viðmældur) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Broyt ásetings virði @@ -1761,7 +1738,6 @@ STR_INTRO_GAME_OPTIONS :{BLACK}Spæli m STR_INTRO_HIGHSCORE :{BLACK}Hástigs yvirlit STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF innstillingar STR_INTRO_ONLINE_CONTENT :{BLACK}Kanna online tilfar -STR_INTRO_SCRIPT_SETTINGS :{BLACK}AI/Spæli script innstillingar STR_INTRO_QUIT :{BLACK}Gevst STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Byrja eitt nýtt spæl. Ctrl+trýst leypur um uppseting av korti @@ -1780,7 +1756,6 @@ STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Vís sp STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Vís hástigs yvirlit STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Vís NewGRF innstillingar STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Kanna um nýtt og betra tilfar er klárt at heinta niður -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Vís AI/Spæli script innstillingar STR_INTRO_TOOLTIP_QUIT :{BLACK}Gevst at spæla 'OpenTTD' STR_INTRO_TRANSLATION :{BLACK}Hesi umseting vantar {NUM} str{P ong eingir}. Vinarliga hjálp til við at gera OpenTTD betri, tekna teg sum umsetara. Sí readme.txt viðvíkjandi smálutum. @@ -1807,12 +1782,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Broyt d STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Broyt núverðandi ár STR_CHEAT_SETUP_PROD :{LTBLUE}Gilda broytingar av framleiðslu virðum: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Lýtt landslag -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Undir-arktiskt landslag -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Undir-tropiskt landslag -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Leikuland landslag - # Livery window STR_LIVERY_GENERAL_TOOLTIP :{BLACK}Vís vanligu lit samansetingarnar @@ -2575,16 +2544,41 @@ STR_MAPGEN_MAPSIZE :{BLACK}Stødd STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Vel stødd av korti í puntum. Talið av tøkum puntum verur eitt sindur minni STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Nr. av bygdum: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Bygdar nøvn +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Áset slag av bygdar nøvnum STR_MAPGEN_DATE :{BLACK}Dato: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Nr. av ídnaðum: STR_MAPGEN_LAND_GENERATOR :{BLACK}Lendis framleiðari: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Slag av lendi: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Sjóvarmáli: +STR_MAPGEN_SEA_LEVEL :{BLACK}Sjóvarmáli: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Løkar: STR_MAPGEN_SMOOTHNESS :{BLACK}Mjúkleiki: STR_MAPGEN_VARIETY :{BLACK}Fjølbroytnis útluting: STR_MAPGEN_GENERATE :{WHITE}Framleið +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Ensk (Upprunalig) +STR_MAPGEN_TOWN_NAME_FRENCH :Fronsk +STR_MAPGEN_TOWN_NAME_GERMAN :Týsk +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Ensk (Meiri) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Latin-Amerikonsk +STR_MAPGEN_TOWN_NAME_SILLY :Fjákut +STR_MAPGEN_TOWN_NAME_SWEDISH :Svensk +STR_MAPGEN_TOWN_NAME_DUTCH :Niðurlendsk +STR_MAPGEN_TOWN_NAME_FINNISH :Finsk +STR_MAPGEN_TOWN_NAME_POLISH :Polsk +STR_MAPGEN_TOWN_NAME_SLOVAK :Slovakisk +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norsk +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Ungarsk +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Eysturrísk +STR_MAPGEN_TOWN_NAME_ROMANIAN :Rumensk +STR_MAPGEN_TOWN_NAME_CZECH :Tjekkisk +STR_MAPGEN_TOWN_NAME_SWISS :Sveisisk +STR_MAPGEN_TOWN_NAME_DANISH :Donsk +STR_MAPGEN_TOWN_NAME_TURKISH :Turkisk +STR_MAPGEN_TOWN_NAME_ITALIAN :Italiensk +STR_MAPGEN_TOWN_NAME_CATALAN :Katalanisk + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Kort eggir: STR_MAPGEN_NORTHWEST :{BLACK}Útnyrðingur @@ -2703,6 +2697,10 @@ STR_NEWGRF_INSPECT_QUERY_CAPTION :{WHITE}NewGRF v STR_SPRITE_ALIGNER_CAPTION :{WHITE}Aligning sprite {COMMA} ({STRING}) STR_SPRITE_ALIGNER_NEXT_BUTTON :{BLACK}Next sprite +###length 2 + + + # NewGRF (self) generated warnings/errors STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING} @@ -3123,6 +3121,8 @@ STR_PURCHASE_INFO_ALL_BUT :Alt uttan {CARG STR_PURCHASE_INFO_MAX_TE :{BLACK}Maks. Dráttar ómak: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Vídd: {GOLD}{COMMA} puntar +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Tok úrvals yvirlit - trýst á eitt flutningstól fyri kunning STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Akfar úrvals yvirlit - trýst á eitt akfar fyri kunning @@ -3649,12 +3649,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Eitt av STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}AI/Game script debug gluggi er einans tøkur fyri servaran # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}AI/Spæli script innstillingar STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Spæli scripti sum verður heinta í næsta spæli STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}AI sum verða heintaði í næsta spæli STR_AI_CONFIG_HUMAN_PLAYER :Menniskja spælari STR_AI_CONFIG_RANDOM_AI :Tilvildarligt AI STR_AI_CONFIG_NONE :(einki) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Hægsta tali av kappingarneytum: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Flyt upp STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Flyt valda AI upp í listanum @@ -3664,8 +3664,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Flyt val STR_AI_CONFIG_GAMESCRIPT :{SILVER}Spæli script STR_AI_CONFIG_AI :{SILVER}AI -STR_AI_CONFIG_CHANGE :{BLACK}Vel {STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :AI STR_AI_CONFIG_CHANGE_GAMESCRIPT :Spæli script STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Heinta eitt annað script @@ -3689,9 +3687,7 @@ STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Ikki bro # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametur STR_AI_SETTINGS_CAPTION_AI :AI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Spæl Script STR_AI_SETTINGS_CLOSE :{BLACK}Lat aftur STR_AI_SETTINGS_RESET :{BLACK}Endurstilla STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4091,6 +4087,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Kann ikk STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... akfar smildra sundur + # Specific vehicle errors STR_ERROR_CAN_T_MAKE_TRAIN_PASS_SIGNAL :{WHITE}Kann ikki fáa tok at fara framvið jarnbreytatekin tá vandi er... STR_ERROR_CAN_T_REVERSE_DIRECTION_TRAIN :{WHITE}Kann ikki venda toki vi... diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index c80d543f4e..48d3cdfc1a 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -200,6 +200,16 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}hv STR_UNITS_POWER_METRIC :{COMMA}{NBSP}hv STR_UNITS_POWER_SI :{COMMA}{NBSP}kW +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}hv/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}hv/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_SI :{DECIMAL}{NBSP}hv/Mg +STR_UNITS_POWER_METRIC_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}hv/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}hv/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_SI :{DECIMAL}{NBSP}hv/Mg +STR_UNITS_POWER_SI_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_SI :{DECIMAL}{NBSP}W/kg + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -225,9 +235,9 @@ STR_UNITS_HEIGHT_METRIC :{COMMA}{NBSP}m STR_UNITS_HEIGHT_SI :{COMMA}{NBSP}m # Common window strings -STR_LIST_FILTER_TITLE :{BLACK}Suodatinteksti: -STR_LIST_FILTER_OSKTITLE :{BLACK}Syötä suodatinteksti -STR_LIST_FILTER_TOOLTIP :{BLACK}Syötä avainsana suodattaaksesi listan +STR_LIST_FILTER_TITLE :{BLACK}Suodatin: +STR_LIST_FILTER_OSKTITLE :{BLACK}Syötä yksi tai useampi avainsana listan suodattamiseksi +STR_LIST_FILTER_TOOLTIP :{BLACK}Syötä yksi tai useampi avainsana listan suodattamiseksi STR_TOOLTIP_GROUP_ORDER :{BLACK}Valitse ryhmittelytapa STR_TOOLTIP_SORT_ORDER :{BLACK}Valitse järjestys (laskeva/nouseva) @@ -378,7 +388,7 @@ STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Tienrake STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Raitiotien rakentaminen STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Istuta puita. Shift vaihtaa istutustilan ja kustannusarvion välillä STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Sijoita kyltti -STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Sijoita objekti. Shift vaihtaa rakennustilan ja kustannusarvion välillä +STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Sijoita objekti. Ctrl valitsee alueen vinottain. Shift vaihtaa rakennustilan ja kustannusarvion välillä # Scenario editor file menu ###length 7 @@ -391,10 +401,11 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Lopeta # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Pelin valinnat STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Asetukset -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Tekoälyn/peliskriptin asetukset +STR_SETTINGS_MENU_AI_SETTINGS :Tekoälyasetukset +STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :Peliskriptiasetukset STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF-asetukset STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Läpinäkyvyysasetukset STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Kuntien nimet näkyvissä @@ -498,8 +509,8 @@ STR_ABOUT_MENU_SCREENSHOT :Kuvakaappaus STR_ABOUT_MENU_SHOW_FRAMERATE :Näytä kuvataajuus STR_ABOUT_MENU_ABOUT_OPENTTD :Tietoja OpenTTD:stä STR_ABOUT_MENU_SPRITE_ALIGNER :Sprite-kohdistaja -STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Reunat päälle/pois -STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Likaisten ruutujen värjäys päälle/pois +STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Rajakehikot päälle/pois +STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Likaisten lohkojen värjäys päälle/pois # Place in highscore window ###length 15 @@ -669,7 +680,7 @@ STR_MUSIC_TRACK_NONE :{TINY_FONT}{DKG STR_MUSIC_TRACK_DIGIT :{TINY_FONT}{DKGREEN}{ZEROFILL_NUM} STR_MUSIC_TITLE_NONE :{TINY_FONT}{DKGREEN}------ STR_MUSIC_TITLE_NOMUSIC :{TINY_FONT}{DKGREEN}Musiikkia ei ole saatavilla -STR_MUSIC_TITLE_NAME :{TINY_FONT}{DKGREEN}"{STRING}" +STR_MUSIC_TITLE_NAME :{TINY_FONT}{DKGREEN}”{STRING}” STR_MUSIC_TRACK :{TINY_FONT}{BLACK}Raita STR_MUSIC_XTITLE :{TINY_FONT}{BLACK}Nimi STR_MUSIC_SHUFFLE :{TINY_FONT}{BLACK}Sekoita @@ -690,7 +701,7 @@ STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Näytä # Playlist window STR_PLAYLIST_MUSIC_SELECTION_SETNAME :{WHITE}Soittolista – ”{STRING}” -STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" +STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} ”{STRING}” STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Raita STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Soittolista – ”{STRING}” STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}Tyhjennä @@ -965,36 +976,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Intian rupia (I STR_GAME_OPTIONS_CURRENCY_IDR :Indonesian rupia (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Malesian ringgit (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Vasemmanpuolinen liikenne -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Oikeanpuolinen liikenne - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Kuntien nimet: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Valitse kuntien nimien tyyli - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Englantilainen -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Ranskalainen -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Saksalainen -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Englantilainen 2 -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Latinalaisamerikkalainen -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Hassu -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Ruotsalainen -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Hollantilainen -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Suomalainen -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Puolalainen -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slovakialainen -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norjalainen -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Unkarilainen -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Itävaltalainen -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Romanialainen -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Tšekkiläinen -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Sveitsiläinen -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Tanskalainen -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turkkilainen -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italialainen -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Katalonialainen - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Automaattitallennus STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Valitse aikaväli automaattisille pelitallennuksille @@ -1027,21 +1008,19 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Valitse STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Nykyinen ajuri: {STRING} -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Käyttöliittymän koko -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Valitse käyttöliittymäelementtien koko +STR_GAME_OPTIONS_GUI_SCALE_FRAME :{BLACK}Käyttöliittymän koko +STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Vedä liukusäädintä asettaaksesi käyttöliittymän koon. Pidä Ctrl-näppäintä painettuna säätääksesi portaattomasti +STR_GAME_OPTIONS_GUI_SCALE_AUTO :{BLACK}Tunnista koko automaattisesti +STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Valitse tämä ruutu käyttöliittymän koon tunnistamiseksi automaattisesti -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(tunnista automaattisesti) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Tavallinen -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Kaksinkertainen -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Nelinkertainen +STR_GAME_OPTIONS_GUI_SCALE_BEVELS :{BLACK}Skaalaa viisteet +STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :{BLACK}Valitse tämä ruutu reunusten skaalaamiseksi käyttöliittymän koon mukaan -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Kirjasinkoko -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Valitse käyttöliittymän kirjasinkoko - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(tunnista automaattisesti) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normaali -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Kaksinkertainen koko -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Nelinkertainen koko +STR_GAME_OPTIONS_GUI_SCALE_1X :1× +STR_GAME_OPTIONS_GUI_SCALE_2X :2× +STR_GAME_OPTIONS_GUI_SCALE_3X :3× +STR_GAME_OPTIONS_GUI_SCALE_4X :4× +STR_GAME_OPTIONS_GUI_SCALE_5X :5× STR_GAME_OPTIONS_GRAPHICS :{BLACK}Grafiikka @@ -1093,8 +1072,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Esikats STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10 000 puntaa (£) valuutassasi STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Vaihda oman valuutan parametria. -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Vastustajien enimmäismäärä: {ORANGE}{COMMA} - STR_NONE :Ei mitään STR_FUNDING_ONLY :Vain rahoitetut STR_MINIMAL :Minimi @@ -1144,6 +1121,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :lauhkea maasto +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :pohjoinen maasto +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :subtrooppinen maasto +STR_CLIMATE_TOYLAND_LANDSCAPE :Lelumaan maasto + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Hyvin tasainen STR_TERRAIN_TYPE_FLAT :Tasainen @@ -1163,7 +1146,7 @@ STR_WARNING_NO_SUITABLE_AI :{WHITE}Ei sovel # Settings tree window STR_CONFIG_SETTING_TREE_CAPTION :{WHITE}Asetukset -STR_CONFIG_SETTING_FILTER_TITLE :{BLACK}Suodatinteksti: +STR_CONFIG_SETTING_FILTER_TITLE :{BLACK}Suodatin: STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}Avaa kaikki STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Sulje kaikki STR_CONFIG_SETTING_RESET_ALL :{BLACK}Palauta oletukset @@ -1288,10 +1271,10 @@ STR_CONFIG_SETTING_SMOKE_AMOUNT :Kulkuneuvon sav STR_CONFIG_SETTING_SMOKE_AMOUNT_HELPTEXT :Määrittää kuinka paljon savua tai kipinöitä kulkuneuvot saavat aikaan STR_CONFIG_SETTING_TRAIN_ACCELERATION_MODEL :Junien kiihdytysmalli: {STRING} -STR_CONFIG_SETTING_TRAIN_ACCELERATION_MODEL_HELPTEXT :Valitsee junien käyttämän fysiikkamallin. "Alkuperäinen" malli hidastaa junia mäissä tasapuolisesti. "Realistinen" malli hidastaa junia mäissä ja mutkissa junan ominaisuuksista riippuen +STR_CONFIG_SETTING_TRAIN_ACCELERATION_MODEL_HELPTEXT :Valitsee junien kiihtyvyyden fysiikkamallin. ”Alkuperäisessä” mallissa mäet vaikuttavat kaikkiin juniin samalla tavalla. ”Realistinen” malli hidastaa junia mäissä ja kaarteissa riippuen kokoonpanon ominaisuuksista, kuten pituudesta ja vetovoimasta STR_CONFIG_SETTING_ROAD_VEHICLE_ACCELERATION_MODEL :Ajoneuvojen kiihdytysmalli: {STRING} -STR_CONFIG_SETTING_ROAD_VEHICLE_ACCELERATION_MODEL_HELPTEXT :Valitsee ajoneuvojen käyttämän fysiikkamallin. "Alkuperäinen" malli hidastaa ajoneuvoja mäissä tasapuolisesta. "Realistinen" malli hidastaa ajoneuvoja mäissä niiden ominaisuuksista riippuen +STR_CONFIG_SETTING_ROAD_VEHICLE_ACCELERATION_MODEL_HELPTEXT :Valitsee ajoneuvojen kiihtyvyyden fysiikkamallin. ”Alkuperäisessä” mallissa mäet vaikuttavat kaikkiin ajoneuvoihin samalla tavalla. ”Realistinen” malli ottaa huomioon ajoneuvon ominaisuudet, kuten esimerkiksi vetovoiman STR_CONFIG_SETTING_TRAIN_SLOPE_STEEPNESS :Mäkien jyrkkyys junille: {STRING} STR_CONFIG_SETTING_TRAIN_SLOPE_STEEPNESS_HELPTEXT :Mäkien jyrkkyys junille. Korkeammat arvot tekevät mäkien nousemisesta vaikeampaa @@ -1345,7 +1328,7 @@ STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Uudet käskyt o STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Normaalisti kulkuneuvo pysähtyy jokaisella läpikulkemallaan asemalla. Mikäli tämä asetus on käytössä kulkuneuvot eivät pysähdy ajaessaan asemien läpi. Huomioi, että tämä asetus määrittää oletusarvoisen toiminnon uusille kulkuneuvoille. Asetusta voidaan muuttaa erikseen kunkin kulkuneuvon kohdalla STR_CONFIG_SETTING_STOP_LOCATION :Uudet junien käskyt pysäyttävät junan aseman {STRING} -STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Paikka, johon juna pysähtyy oletuksena asemalla. ”Alkuun” tarkoittaa, että junan viimeinen vaunu pysähtyy laiturin alkuun; ”keskelle” tarkoittaa junan pysähtymistä keskelle laituria; ja ”loppuun” tarkoittaa, että veturi pysähtyy laiturin päähän. Huomaa, että tämä asetus määrittää vain oletusarvon uusille määräyksille. Yksittäisten määräysten kohdalla käyttäytymistä voi muuttaa tästä asetuksesta huolimatta +STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Paikka, johon juna pysähtyy oletuksena asemalla. ”Alkuun” tarkoittaa, että junan viimeinen vaunu pysähtyy laiturin alkuun; ”keskelle” tarkoittaa junan pysähtymistä keskelle laituria; ja ”loppuun” tarkoittaa, että veturi pysähtyy laiturin päähän. Huomaa, että tämä asetus määrittää vain oletusarvon uusille käskyille. Yksittäisten käskyjen kohdalla käyttäytymistä voi muuttaa tästä asetuksesta huolimatta ###length 3 STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :alkuun STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :keskelle @@ -1407,7 +1390,7 @@ STR_CONFIG_SETTING_WARN_LOST_VEHICLE :Varoita, jos ku STR_CONFIG_SETTING_WARN_LOST_VEHICLE_HELPTEXT :Lähetä viesti, jos kulkuneuvo ei löydä reittiä määränpäähänsä STR_CONFIG_SETTING_ORDER_REVIEW :Tarkista kulkuneuvojen pysähdykset: {STRING} -STR_CONFIG_SETTING_ORDER_REVIEW_HELPTEXT :Mikäli käytössä, kulkuneuvojen määräykset tarkistetaan väliajoin ja havaituista ongelmista ilmoitetaan uutisviestillä +STR_CONFIG_SETTING_ORDER_REVIEW_HELPTEXT :Mikäli käytössä, kulkuneuvojen käskyjä tarkastetaan väliajoin, ja havaituista ongelmista ilmoitetaan uutisviestillä ###length 3 STR_CONFIG_SETTING_ORDER_REVIEW_OFF :Ei STR_CONFIG_SETTING_ORDER_REVIEW_EXDEPOT :Kyllä, mutta ei pysäytetyille @@ -1449,6 +1432,8 @@ STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Viivan leveys k 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_SHOW_CARGO_IN_LISTS :Näytä kulkuneuvojen kuljetettavissa olevat rahdit listaikkunoissa {STRING} +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS_HELPTEXT :Mikäli käytössä, kuljetettavissa oleva rahti näytetään kulkuneuvolistoissa kulkuneuvon yllä 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. @@ -1503,6 +1488,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Parannettu STR_CONFIG_SETTING_ROAD_SIDE :Ajoneuvot: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Valitse ajokaista +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Vasemmanpuolinen liikenne +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Oikeanpuolinen liikenne + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Korkeuskartan pyöritys:{STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Vastapäivään @@ -1909,9 +1898,9 @@ STR_CONFIG_SETTING_ZOOM_LVL_OUT_8X :8x STR_CONFIG_SETTING_SPRITE_ZOOM_MIN :Korkein käytettävä sprite-resoluutio: {STRING} STR_CONFIG_SETTING_SPRITE_ZOOM_MIN_HELPTEXT :Rajoita suurinta spriteille käytettävää resoluutiota. Resoluution rajoittaminen estää korkean tarkkuuden grafiikoiden käyttämisen vaikka niitä olisi saatavilla. Tämä voi auttaa pitämään pelin ulkoasun yhtenäisenä käytettäessä sekaisin GRF-tiedostoja, joista osalla on ja osalla ei ole korkean tarkkuuden grafiikoita. ###length 3 -STR_CONFIG_SETTING_SPRITE_ZOOM_LVL_MIN :4x -STR_CONFIG_SETTING_SPRITE_ZOOM_LVL_IN_2X :2x -STR_CONFIG_SETTING_SPRITE_ZOOM_LVL_NORMAL :1x +STR_CONFIG_SETTING_SPRITE_ZOOM_LVL_MIN :4× +STR_CONFIG_SETTING_SPRITE_ZOOM_LVL_IN_2X :2× +STR_CONFIG_SETTING_SPRITE_ZOOM_LVL_NORMAL :1× STR_CONFIG_SETTING_TOWN_GROWTH :Kuntien kasvunopeus: {STRING} STR_CONFIG_SETTING_TOWN_GROWTH_HELPTEXT :Kunnan kasvunopeus @@ -2037,7 +2026,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Automaattinen k STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Sallii junien kääntymisen opastimen edessä pitkän odotusajan jälkeen ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Suositeltu) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Suositeltu) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Muuta asetusarvo @@ -2059,7 +2048,7 @@ STR_CONFIG_ERROR_INVALID_BASE_GRAPHICS_NOT_FOUND :{WHITE}... ohit STR_CONFIG_ERROR_INVALID_BASE_SOUNDS_NOT_FOUND :{WHITE}... ohitetaan äänipaketti ”{STRING}”: ei löydetty STR_CONFIG_ERROR_INVALID_BASE_MUSIC_NOT_FOUND :{WHITE}... ohitetaan musiikkipaketti ”{STRING}”: ei löydetty STR_CONFIG_ERROR_OUT_OF_MEMORY :{WHITE}Muisti lopussa -STR_CONFIG_ERROR_SPRITECACHE_TOO_BIG :{WHITE}{BYTES} sprite-välimuistin varaaminen epäonnistui. Sprite-välimuistin kooksi valittiin {BYTES}. Tämä heikentää OpenTTD:n suorituskykyä. Vähentääksesi muistivaatimuksia voit kokeilla poistaa käytöstä 32bpp-grafiikat ja/tai lähennystasoja +STR_CONFIG_ERROR_SPRITECACHE_TOO_BIG :{WHITE}{BYTES} sprite-välimuistin varaaminen epäonnistui. Sprite-välimuistin kooksi valittiin {BYTES}. Tämä heikentää OpenTTD:n suorituskykyä. Vähentääksesi muistivaatimuksia voit kokeilla poistaa käytöstä 32 bpp -grafiikat ja/tai lähennystasoja # Video initalization errors STR_VIDEO_DRIVER_ERROR :{WHITE}Virhe näyttöasetuksissa… @@ -2080,7 +2069,8 @@ STR_INTRO_HIGHSCORE :{BLACK}Pistetau STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Asetukset STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF-asetukset STR_INTRO_ONLINE_CONTENT :{BLACK}Tarkista online-sisältö -STR_INTRO_SCRIPT_SETTINGS :{BLACK}Tekoälyn/peliskriptin asetukset +STR_INTRO_AI_SETTINGS :{BLACK}Tekoälyasetukset +STR_INTRO_GAMESCRIPT_SETTINGS :{BLACK}Peliskriptiasetukset STR_INTRO_QUIT :{BLACK}Sulje STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Aloita uusi peli. Ctrl+napsautus ohittaa kartan asetusten valinnan. @@ -2100,7 +2090,8 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Näytä STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Näytä asetukset STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Näytä NewGRF-asetukset STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Tarkista uutta ja päivitettyä sisältöä ladattavaksi -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Näytä tekoäly/peliskriptiasetukset +STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Näytä tekoälyasetukset +STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Näytä peliskriptiasetukset STR_INTRO_TOOLTIP_QUIT :{BLACK}Lopeta OpenTTD STR_INTRO_BASESET :{BLACK}Valitusta perusgrafiikkapaketista puuttuu {NUM} sprite{P "" ä}. Tarkista, onko sille päivityksiä. @@ -2132,12 +2123,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Muuta p STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Muuta nykyistä vuotta STR_CHEAT_SETUP_PROD :{LTBLUE}Salli tuotantomäärien muuttaminen: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :lauhkea maasto -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :pohjoinen maasto -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :subtrooppinen maasto -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Lelumaan maasto - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY}: Väriteema @@ -2497,13 +2482,13 @@ STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :odotetaan yhtey STR_NETWORK_MESSAGE_CLIENT_LEAVING :poistutaan STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} on liittynyt peliin -STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {STRING} liittyi peliin (asiakas nro {2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} on liittynyt yhtiöön nro {2:NUM} +STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {0:STRING} liittyi peliin (asiakas nro{NBSP}{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {0:STRING} on liittynyt yhtiöön nro {2:NUM} STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} on liittynyt katselijoihin -STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} on aloittanut uuden yhtiön (nro {2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} on poistunut pelistä ({2:STRING}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {0:STRING} on aloittanut uuden yhtiön (nro{NBSP}{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {0:STRING} on poistunut pelistä ({2:STRING}) STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} on muuttanut nimekseen {STRING} -STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} antoi {2:CURRENCY_LONG} yhtiölle {1:STRING} +STR_NETWORK_MESSAGE_GIVE_MONEY :*** {0:STRING} antoi {2:CURRENCY_LONG} yhtiölle {1:STRING} STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}Palvelin sulki istunnon STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Palvelin käynnistyy uudelleen...{}Odota, ole hyvä... STR_NETWORK_MESSAGE_KICKED :{STRING} potkaistiin ulos. Syy: ({STRING}) @@ -2555,7 +2540,7 @@ STR_CONTENT_DETAIL_FILESIZE :{SILVER}Latauks STR_CONTENT_DETAIL_SELECTED_BECAUSE_OF :{SILVER}Valittu seuraavan takia: {WHITE}{STRING} STR_CONTENT_DETAIL_DEPENDENCIES :{SILVER}Vaatimukset: {WHITE}{STRING} STR_CONTENT_DETAIL_TAGS :{SILVER}Avainsanat: {WHITE}{STRING} -STR_CONTENT_NO_ZLIB :{WHITE}OpenTTD on käännetty ilman "zlib"-tukea... +STR_CONTENT_NO_ZLIB :{WHITE}OpenTTD on käännetty ilman ”zlib”-tukea… STR_CONTENT_NO_ZLIB_SUB :{WHITE}... sisällön lataus ei ole mahdollista! # Order of these is important! @@ -2618,6 +2603,9 @@ STR_LINKGRAPH_LEGEND_SATURATED :{TINY_FONT}{BLA STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLACK}kuormittunut # Linkgraph tooltip +STR_LINKGRAPH_STATS_TOOLTIP :{BLACK}{CARGO_LONG} kuljetettavana kuukausittain asemalta {STATION} asemalle {STATION} ({COMMA}%{NBSP} kapasiteetista){STRING} +STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} kuljetettavana takaisin ({COMMA}{NBSP}% kapasiteetista) +STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}Keskimääräinen matka-aika: {NUM}{NBSP}vrk # Base for station construction window(s) STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Vaikutusalueen korostus @@ -2627,6 +2615,7 @@ STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP :{BLACK}Älä ko STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP :{BLACK}Korosta ehdotetun tontin vaikutusalue STR_STATION_BUILD_ACCEPTS_CARGO :{BLACK}Vastaanottaa: {GOLD}{CARGO_LIST} STR_STATION_BUILD_SUPPLIES_CARGO :{BLACK}Tuottaa: {GOLD}{CARGO_LIST} +STR_STATION_BUILD_INFRASTRUCTURE_COST :{BLACK}Maintenance cost: {GOLD}{CURRENCY_SHORT}/v # Join station window STR_JOIN_STATION_CAPTION :{WHITE}Liitä asema @@ -2691,13 +2680,13 @@ STR_BUILD_SIGNAL_TOGGLE_ADVANCED_SIGNAL_TOOLTIP :{BLACK}Edistyne STR_BUILD_SIGNAL_SEMAPHORE_NORM_TOOLTIP :{BLACK}Suojastusopastin (siipiopastin){}Kaikkein alkeellisin opastin, joka sallii vain yhden junan samalla osuudella kerrallaan STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TOOLTIP :{BLACK}Tulo-opastin (siipiopastin){}Näyttää vihreää aina, kun yksi tai useampi seuraavista poistumisopastimista näyttää vihreää. Muutoin se näyttää punaista STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP :{BLACK}Poistumisopastin (siipiopastin){}Käyttäytyy samalla tavalla kuin suojastusopastin, mutta on välttämätön oikean valon näyttämiseen tulo- ja yhdistelmäopastimissa -STR_BUILD_SIGNAL_SEMAPHORE_COMBO_TOOLTIP :{BLACK}Yhdistelmäopastin (siipiopastin){}Yhdistelmäopastin toimii yhtä aikaa tulo- ja poistumisopastimena. Tämän avulla on mahdollista luoda suuria "opastinpuita" +STR_BUILD_SIGNAL_SEMAPHORE_COMBO_TOOLTIP :{BLACK}Yhdistelmäopastin (siipiopastin){}Yhdistelmäopastin toimii yhtä aikaa tulo- ja poistumisopastimena. Tämän avulla on mahdollista luoda suuria ”opastinpuita” STR_BUILD_SIGNAL_SEMAPHORE_PBS_TOOLTIP :{BLACK}Reittiopastin (siipiopastin){}Reittiopastin varmistaa junille turvallisen reitin ja siten mahdollistaa useampien junien yhtäaikaisen liikenteen moniraiteisissa risteyksissä. Tavalliset reittiopastimet voi ohittaa takakautta STR_BUILD_SIGNAL_SEMAPHORE_PBS_OWAY_TOOLTIP :{BLACK}Yksisuuntainen reittiopastin (siipiopastin){}Reittiopastin varmistaa junille turvallisen reitin ja siten mahdollistaa useampien junien yhtäaikaisen liikenteen moniraiteisissa risteyksissä. Yksisuuntaisia opastimia ei voi ohittaa takakautta STR_BUILD_SIGNAL_ELECTRIC_NORM_TOOLTIP :{BLACK}Suojastusopastin (valo-opastin){}Kaikkein alkeellisin opastin, joka sallii vain yhden junan osuudella kerrallaan STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TOOLTIP :{BLACK}Tulo-opastin (valo-opastin){}Näyttää vihreää aina, kun yksi tai useampi seuraavista poistumisopastimista näyttää vihreää. Muutoin se näyttää punaista STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}Poistumisopastin (valo-opastin){}Käyttäytyy samalla tavalla kuin suojastusopastin, mutta on välttämätön oikean valon näyttämiseen tulo- ja yhdistelmäopastimissa -STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}Yhdistelmäopastin (valo-opastin){}Yhdistelmäopastin toimii yhtä aikaa tulo- ja poistumisopastimena. Tämän avulla on mahdollista luoda suuria "opastinpuita" +STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}Yhdistelmäopastin (valo-opastin){}Yhdistelmäopastin toimii yhtä aikaa tulo- ja poistumisopastimena. Tämän avulla on mahdollista luoda suuria ”opastinpuita” STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP :{BLACK}Reittiopastin (valo-opastin){}Reittiopastin varmistaa junille turvallisen reitin ja siten mahdollistaa useampien junien yhtäaikaisen liikenteen moniraiteisissa risteyksissä. Tavalliset reittiopastimet voi ohittaa takakautta STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP :{BLACK}Yksisuuntainen reittiopastin (valo-opastin){}Reittiopastin varmistaa junille turvallisen reitin ja siten mahdollistaa useampien junien yhtäaikaisen liikenteen moniraiteisissa risteyksissä. Yksisuuntaisia opastimia ei voi ohittaa takakautta STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Opastinten muuntaminen{}Kun tämä on valittu, olemassaolevan opastimen napsauttaminen muuntaa sen valituntyyppiseksi ja -muotoiseksi. Ctrl+napsautus vaihtaa nykyistä opastimen muotoa. Vaihto+napsautus näyttää muuntamisen kustannusarvion. @@ -2814,11 +2803,11 @@ STR_LANDSCAPING_TOOLBAR :{WHITE}Maastonm STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}Laske ruudun kulmaa. Vetäminen laskee ensimmäistä valittua kulmaa ja tasoittaa valitun alueen kulman korkeudelle. Ctrl valitsee alueen vinottain. Shift vaihtaa muokkaustilan ja kustannusarvion välillä STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND :{BLACK}Nosta ruudun kulmaa. Vetäminen nostaa ensimmäistä valittua kulmaa ja tasoittaa valitun alueen kulman korkeudelle. Ctrl valitsee alueen vinottain. Shift vaihtaa muokkaustilan ja kustannusarvion välillä STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Tasoita maata ensimmäisen valitun kulman korkeudelle. Ctrl valitsee alueen vinottain. Shift vaihtaa muokkaustilan ja kustannusarvion välillä -STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Osta maata tulevaa käyttöä varten. Shift vaihtaa ostotilan ja kustannusarvion välillä +STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Osta maata tulevaa käyttöä varten. Ctrl valitsee alueen vinottain. Shift vaihtaa ostotilan ja kustannusarvion välillä # Object construction window STR_OBJECT_BUILD_CAPTION :{WHITE}Objektin valinta -STR_OBJECT_BUILD_TOOLTIP :{BLACK}Valitse rakennettava objekti. Shift vaihtaa rakennustilan ja kustannusarvion välillä +STR_OBJECT_BUILD_TOOLTIP :{BLACK}Valitse rakennettava objekti. Ctrl valitsee alueen vinottain. Shift vaihtaa rakennustilan ja kustannusarvion välillä STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}Valitse rakennettavan objektin luokka STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}Objektin esikatselu STR_OBJECT_BUILD_SIZE :{BLACK}Koko: {GOLD}{NUM}×{NUM} ruutua @@ -2862,6 +2851,8 @@ STR_FOUND_TOWN_RANDOM_TOWN_BUTTON :{BLACK}Satunnai STR_FOUND_TOWN_RANDOM_TOWN_TOOLTIP :{BLACK}Perusta kunta satunnaiseen paikkaan STR_FOUND_TOWN_MANY_RANDOM_TOWNS :{BLACK}Monta satunnaista kuntaa STR_FOUND_TOWN_RANDOM_TOWNS_TOOLTIP :{BLACK}Täytä kartta satunnaisesti sijoitetuilla kunnilla +STR_FOUND_TOWN_EXPAND_ALL_TOWNS :{BLACK}Laajenna kaikkia kuntia +STR_FOUND_TOWN_EXPAND_ALL_TOWNS_TOOLTIP :{BLACK}Kasvata kaikkia kuntia hieman STR_FOUND_TOWN_NAME_TITLE :{YELLOW}Kunnan nimi: STR_FOUND_TOWN_NAME_EDITOR_TITLE :{BLACK}Syötä kunnan nimi @@ -3126,7 +3117,7 @@ STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Tietoja STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}Tietoja ei ole saatavilla STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING} STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: {WHITE}{STRING} -STR_SAVELOAD_FILTER_TITLE :{BLACK}Suodatinteksti: +STR_SAVELOAD_FILTER_TITLE :{BLACK}Suodatin: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Tiedosto on jo olemassa STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Haluatko varmasti korvata olemassaolevan tiedoston? STR_SAVELOAD_DIRECTORY :{STRING} (hakemisto) @@ -3140,6 +3131,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Kartan k STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Valitse kartan koko ruutuina. Saatavilla olevien ruutujen määrä on hieman alhaisempi STR_MAPGEN_BY :{BLACK}× STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Kuntien määrä: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Kuntien nimet: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Valitse kuntien nimien tyyli STR_MAPGEN_DATE :{BLACK}Päivämäärä: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Teollisuuden määrä: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Korkein huippu: @@ -3155,11 +3148,40 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Vähenn STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}{NBSP}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Maastogeneraattori: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Maaston tyyppi: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Merenpinta: +STR_MAPGEN_SEA_LEVEL :{BLACK}Merenpinta: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Joet: STR_MAPGEN_SMOOTHNESS :{BLACK}Tasaisuus: STR_MAPGEN_VARIETY :{BLACK}Vaihtelu: STR_MAPGEN_GENERATE :{WHITE}Generoi +STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF-asetukset +STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Näytä NewGRF-asetukset +STR_MAPGEN_AI_SETTINGS :{BLACK}Tekoälyasetukset +STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Näytä tekoälyasetukset +STR_MAPGEN_GS_SETTINGS :{BLACK}Peliskriptiasetukset +STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Näytä peliskriptiasetukset + +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Englantilainen +STR_MAPGEN_TOWN_NAME_FRENCH :Ranskalainen +STR_MAPGEN_TOWN_NAME_GERMAN :Saksalainen +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Englantilainen 2 +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Latinalaisamerikkalainen +STR_MAPGEN_TOWN_NAME_SILLY :Hassu +STR_MAPGEN_TOWN_NAME_SWEDISH :Ruotsalainen +STR_MAPGEN_TOWN_NAME_DUTCH :Hollantilainen +STR_MAPGEN_TOWN_NAME_FINNISH :Suomalainen +STR_MAPGEN_TOWN_NAME_POLISH :Puolalainen +STR_MAPGEN_TOWN_NAME_SLOVAK :Slovakialainen +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norjalainen +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Unkarilainen +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Itävaltalainen +STR_MAPGEN_TOWN_NAME_ROMANIAN :Romanialainen +STR_MAPGEN_TOWN_NAME_CZECH :Tšekkiläinen +STR_MAPGEN_TOWN_NAME_SWISS :Sveitsiläinen +STR_MAPGEN_TOWN_NAME_DANISH :Tanskalainen +STR_MAPGEN_TOWN_NAME_TURKISH :Turkkilainen +STR_MAPGEN_TOWN_NAME_ITALIAN :Italialainen +STR_MAPGEN_TOWN_NAME_CATALAN :Katalonialainen # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Kartan reunat: @@ -3218,7 +3240,7 @@ STR_NEWGRF_SETTINGS_INFO_TITLE :{WHITE}Tarkat N STR_NEWGRF_SETTINGS_ACTIVE_LIST :{WHITE}Käytössä olevat NewGRF-tiedostot STR_NEWGRF_SETTINGS_INACTIVE_LIST :{WHITE}Pois käytöstä olevat NewGRF-tiedostot STR_NEWGRF_SETTINGS_SELECT_PRESET :{ORANGE}Valitse valmislista: -STR_NEWGRF_FILTER_TITLE :{ORANGE}Suodatinteksti: +STR_NEWGRF_FILTER_TITLE :{ORANGE}Suodatin: STR_NEWGRF_SETTINGS_PRESET_LIST_TOOLTIP :{BLACK}Lataa valittu valmislista STR_NEWGRF_SETTINGS_PRESET_SAVE :{BLACK}Tallenna valmislistaksi STR_NEWGRF_SETTINGS_PRESET_SAVE_TOOLTIP :{BLACK}Tallenna nykyinen lista valmislistaksi @@ -3298,17 +3320,24 @@ STR_NEWGRF_INSPECT_QUERY_CAPTION :{WHITE}NewGRF m # Sprite aligner window STR_SPRITE_ALIGNER_CAPTION :{WHITE}Kohdistetaan spriteä {COMMA} ({STRING}) STR_SPRITE_ALIGNER_NEXT_BUTTON :{BLACK}Seuraava sprite -STR_SPRITE_ALIGNER_NEXT_TOOLTIP :{BLACK}Mene seuraavaan tavalliseen spriteen ja hyppää yli pseudo-/uudelleenväritetyt/fontti- spritet ja mene alkuun kun päästään viimeiseen +STR_SPRITE_ALIGNER_NEXT_TOOLTIP :{BLACK}Siirry seuraavaan tavalliseen spriteen; mahdolliset pseudo-, uudelleenväritys- ja fonttispritet ohitetaan; viimeisen spriten jälkeen siirrytään ensimmäiseen STR_SPRITE_ALIGNER_GOTO_BUTTON :{BLACK}Mene spriteen -STR_SPRITE_ALIGNER_GOTO_TOOLTIP :{BLACK}Mene valittuun spriteen. Jos sprite ei ole tavallinen, jatka seuraavaan tavalliseen spriteen -STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Edelinen sprite +STR_SPRITE_ALIGNER_GOTO_TOOLTIP :{BLACK}Siirry valittuun spriteen. Jos sprite ei ole tavallinen, jatka seuraavaan tavalliseen spriteen +STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Edellinen sprite STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Jatka edelliseen tavalliseen spriteen ja hyppää yli kaikki pseudo-/uudelleenväritetyt/fontti- spritet ja mene loppuun kun päästään ensimmäiseen -STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Valitun spriten näyttö. Sijaintia ei huomioida spriteä piirrettäessä +STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Valitun spriten esitys. Siirrosta ei huomioida tätä spriteä piirrettäessä STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Liikuta spriteä ympäriinsä, muuttaen X- ja Y-sijainteja. Ctrl+napsautus siirtää spriteä kahdeksan yksikköä kerralla. + +###length 2 +STR_SPRITE_ALIGNER_CENTRE_OFFSET :{BLACK}Siirros keskitetty +STR_SPRITE_ALIGNER_CENTRE_SPRITE :{BLACK}Sprite keskitetty + +STR_SPRITE_ALIGNER_CROSSHAIR :{BLACK}Hiusristikko + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Nollaa suhteelliset -STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Nollaa suhteelliset erotukset -STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X-erotus: {NUM}, Y-erotus: {NUM} (absoluuttinen) -STR_SPRITE_ALIGNER_OFFSETS_REL :{BLACK}X-erotus: {NUM}, Y-erotus: {NUM} (suhteellinen) +STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Nollaa tämänhetkiset suhteelliset siirrokset +STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X-siirros: {NUM}, Y-siirros: {NUM} (absoluuttinen) +STR_SPRITE_ALIGNER_OFFSETS_REL :{BLACK}X-siirros: {NUM}, Y-siirros: {NUM} (suhteellinen) STR_SPRITE_ALIGNER_PICKER_BUTTON :{BLACK}Valitse sprite STR_SPRITE_ALIGNER_PICKER_TOOLTIP :{BLACK}Valitse sprite ruudulta @@ -3322,15 +3351,15 @@ STR_NEWGRF_ERROR_MSG_FATAL :{RED}Virhe: {SI STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Vakava NewGRF-virhe on tapahtunut:{}{STRING} STR_NEWGRF_ERROR_POPUP :{WHITE}NewGRF-virhe on tapahtunut:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} ei toimi OpenTTD:n ilmoittaman TTDPatch-version kanssa -STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} on TTD:n {STRING}-versiota varten -STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} ja {STRING} on suunniteltu toimimaan yhdessä -STR_NEWGRF_ERROR_INVALID_PARAMETER :Virheellinen parametri: {1:STRING}: {STRING} ({NUM}) -STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} tulee ladata ennen kuin {STRING} -STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} tulee ladata {STRING} jälkeen -STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} vaatii OpenTTD:n version {STRING} tai uudemman +STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} on TTD:n {2:STRING}-versiota varten +STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} on suunniteltu toimimaan lisäosan {2:STRING} kanssa +STR_NEWGRF_ERROR_INVALID_PARAMETER :Virheellinen parametri lisäosalle {1:STRING}: {2:STRING} ({3:NUM}) +STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} on ladattava ennen kuin {2:STRING} voidaan ladata +STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} tulee ladata lisäosan {2:STRING} jälkeen +STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} vaatii OpenTTD:n version {2:STRING} tai uudemman STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :GRF-tiedosto, jonka se muuntaa STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Liian monta NewGRF:ää on ladattu -STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :NewGRF:n {1:STRING} lataaminen staattisena NewGRF:nä {STRING}:n kanssa saattaa aiheuttaa nykimistä +STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Lisäosan {1:STRING} lataaminen staattisena NewGRF:nä lisäosan {2:STRING} kanssa voi johtaa tahdistusvirheisiin STR_NEWGRF_ERROR_UNEXPECTED_SPRITE :Odottamaton sprite (sprite {3:NUM}) STR_NEWGRF_ERROR_UNKNOWN_PROPERTY :Tuntematon Action 0-ominaisuus {4:HEX} (sprite {3:NUM}) STR_NEWGRF_ERROR_INVALID_ID :Yritys käyttää virheellistä ID:tä (sprite {3:NUM}) @@ -3341,7 +3370,7 @@ STR_NEWGRF_ERROR_GRM_FAILED :Pyydetyt GRF-re STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{2:STRING} poisti käytöstä NewGRF:n {1:STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Virheellinen/tuntematon spriten asettelumuoto (sprite {3:NUM}) STR_NEWGRF_ERROR_LIST_PROPERTY_TOO_LONG :Liian monta elementtiä ominaisuusarvolistassa (sprite {3:NUM}, ominaisuus {4:HEX}) -STR_NEWGRF_ERROR_INDPROD_CALLBACK :Virhe teollisuuden tuotannon takaisinkutsussa (sprite {3:NUM}, "{2:STRING}") +STR_NEWGRF_ERROR_INDPROD_CALLBACK :Virheellinen teollisuuslaitoksen tuotannon takaisinkutsu (sprite {3:NUM}, ”{2:STRING}”) # NewGRF related 'general' warnings STR_NEWGRF_POPUP_CAUTION_CAPTION :{WHITE}Varoitus! @@ -3462,14 +3491,14 @@ STR_LOCAL_AUTHORITY_ACTION_EXCLUSIVE_TRANSPORT :Osta yksinoikeu STR_LOCAL_AUTHORITY_ACTION_BRIBE :Lahjo viranomaisia ###length 8 -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{YELLOW}Käynnistä pieni mainoskampanja hoikutellaksesi lisää matkustajia ja rahtia kuljetuspalveluihisi.{}Tämä kasvattaa tilapäisesti asemien arvioita pienellä säteellä kunnan keskustan ympärillä.{}Kustannus: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{YELLOW}Käynnistä keskikokoinen mainoskampanja houkutellaksesi lisää matkustajia ja rahtia kuljetuspalveluihisi.{}Tämä kasvattaa tilapäisesti asemien arvioita keskikokoisella säteellä kunnan keskustan ympärillä.{}Kustannus: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{YELLOW}Käynnistä suuri mainoskampanja hoikutellaksesi lisää matkustajia ja rahtia kuljetuspalveluihisi.{}Tämä kasvattaa tilapäisesti asemien arvioita suurella säteellä kunnan keskustan ympärillä.{}Kustannus: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{YELLOW}Rahoita tieverkon uudelleenrakentamista.{}Aiheuttaa huomattavaa häiriötä tieliikenteessä jopa kuuden kuukauden ajan.{}Kustannus: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{YELLOW}Rakenna patsas yhtiösi kunniaksi.{}Parantaa asemien arvioita pysyvästi tässä kunnassa.{}Kustannus: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{YELLOW}Rahoita uusien liikerakennusten rakentamista kunnassa.{}Tämä kiihdyttää tämän kunnan kasvua tilapäisesti.{}Kustannus: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW}Osta vuoden yksinoikeudet kunnan liikennöintiin.{}Tällöin paikallisviranomaiset eivät salli matkustajien ja rahdin käyttää kilpailijoittesi asemia.{}Kustannus: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Lahjo viranomaisia lisätäksesi arviotasi; rangaistus voi olla kuitenkin suuri, jos jäät kiinni.{}Kustannus: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{YELLOW}Käynnistä pieni mainoskampanja houkutellaksesi lisää matkustajia ja rahtia kuljetuspalveluihisi.{}Tämä kasvattaa tilapäisesti asemien arvioita pienellä säteellä kunnan keskustan ympärillä.{}{POP_COLOUR}Kustannus: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{PUSH_COLOUR}{YELLOW}Käynnistä keskikokoinen mainoskampanja houkutellaksesi lisää matkustajia ja rahtia kuljetuspalveluihisi.{}Tämä kasvattaa tilapäisesti asemien arvioita keskikokoisella säteellä kunnan keskustan ympärillä.{}{POP_COLOUR}Kustannus: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}Käynnistä suuri mainoskampanja hoikutellaksesi lisää matkustajia ja rahtia kuljetuspalveluihisi.{}Tämä kasvattaa tilapäisesti asemien arvioita suurella säteellä kunnan keskustan ympärillä.{}{POP_COLOUR}Kustannus: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{PUSH_COLOUR}{YELLOW}Rahoita tieverkon uudelleenrakentamista.{}Aiheuttaa huomattavaa häiriötä tieliikenteessä jopa kuuden kuukauden ajan.{}{POP_COLOUR}Kustannus: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Rakenna patsas yhtiösi kunniaksi.{}Parantaa asemien arvioita pysyvästi tässä kunnassa.{}{POP_COLOUR}Kustannus: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Rahoita uusien rakennusten rakentamista kunnassa.{}Tämä kiihdyttää tämän kunnan kasvua tilapäisesti.{}{POP_COLOUR}Kustannus: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}Osta vuodeksi yksinoikeudet kunnan liikennöintiin.{}Tällöin paikallisviranomaiset eivät salli matkustajien ja rahdin käyttää kilpailijoittesi asemia.{}{POP_COLOUR}Kustannus: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Lahjo viranomaisia lisätäksesi arviotasi; rangaistus voi kuitenkin olla ankara, jos jäät kiinni.{}{POP_COLOUR}Kustannus: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}{COMPANY} Tavoitteet @@ -3642,15 +3671,18 @@ STR_FINANCES_SECTION_SHIP_REVENUE :{GOLD}Laivat STR_FINANCES_SECTION_LOAN_INTEREST :{GOLD}Lainan korko STR_FINANCES_SECTION_OTHER :{GOLD}Muut +STR_FINANCES_TOTAL_CAPTION :{WHITE}Yhteensä STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} +STR_FINANCES_ZERO_INCOME :{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} -STR_FINANCES_NET_PROFIT :{WHITE}Puhdas voitto +STR_FINANCES_PROFIT :{WHITE}Tuotto STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Tilin saldo STR_FINANCES_OWN_FUNDS_TITLE :{WHITE}Omat varat STR_FINANCES_LOAN_TITLE :{WHITE}Laina STR_FINANCES_INTEREST_RATE :{WHITE}Lainan korko: {BLACK}{NUM}{NBSP}% STR_FINANCES_MAX_LOAN :{WHITE}Laina enintään: {BLACK}{CURRENCY_LONG} STR_FINANCES_TOTAL_CURRENCY :{BLACK}{CURRENCY_LONG} +STR_FINANCES_BANK_BALANCE :{WHITE}{CURRENCY_LONG} STR_FINANCES_BORROW_BUTTON :{BLACK}Nosta lainaa {CURRENCY_LONG} STR_FINANCES_BORROW_TOOLTIP :{BLACK}Ota lisää lainaa. Ctrl+napsautus nostaa lainaa niin paljon kuin mahdollista. STR_FINANCES_REPAY_BUTTON :{BLACK}Lyhennä lainaa {CURRENCY_LONG} @@ -3751,7 +3783,7 @@ STR_INDUSTRY_VIEW_PRODUCES_N_CARGO :{BLACK}Tuottaa: STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :, {STRING}{STRING} STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Tarvitsee: -STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{0:STRING}{BLACK}{3:STRING} STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} odottamassa{STRING} STR_CONFIG_GAME_PRODUCTION :{WHITE}Muokkaa tuotantoa (8:n kerroin, 2040:een asti) @@ -3781,6 +3813,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Ohjaa ka STR_VEHICLE_LIST_REPLACE_VEHICLES :Korvaa kulkuneuvoja STR_VEHICLE_LIST_SEND_FOR_SERVICING :Lähetä huoltoon STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Tuotto tänä vuonna: {CURRENCY_LONG} (viime vuonna: {CURRENCY_LONG}) +STR_VEHICLE_LIST_CARGO :{TINY_FONT}{BLACK}[{CARGO_LIST}] +STR_VEHICLE_LIST_NAME_AND_CARGO :{TINY_FONT}{BLACK}{STRING} {STRING} STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Lähetä varikolle STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Lähetä varikolle @@ -3868,10 +3902,15 @@ STR_PURCHASE_INFO_ALL_TYPES :Kaikki rahtityy STR_PURCHASE_INFO_NONE :Ei mitään STR_PURCHASE_INFO_ENGINES_ONLY :Vain veturit STR_PURCHASE_INFO_ALL_BUT :Kaikki paitsi {CARGO_LIST} -STR_PURCHASE_INFO_MAX_TE :{BLACK}Suurin vetovoima: {GOLD}{FORCE} +STR_PURCHASE_INFO_MAX_TE :{BLACK}Maksimivetovoima: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Toimintasäde: {GOLD}{COMMA} ruutua STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Ilma-alustyyppi: {GOLD}{STRING} +###length 3 +STR_CARGO_TYPE_FILTER_ALL :Kaikki rahtityypit +STR_CARGO_TYPE_FILTER_FREIGHT :Rahti +STR_CARGO_TYPE_FILTER_NONE :Ei mikään + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Raideliikennevälineiden valintaluettelo. Napsauta kulkuneuvoa saadaksesi lisää tietoa. Ctrl+napsautus näyttää tai piilottaa kulkuneuvon tyypin. STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Ajoneuvojen valintaluettelo. Napsauta ajoneuvoa saadaksesi lisää tietoja. Ctrl+napsautus näyttää tai piilottaa ajoneuvon tyypin. @@ -3950,7 +3989,7 @@ STR_DEPOT_VEHICLE_TOOLTIP_CHAIN :{BLACK}{NUM} ku STR_DEPOT_VEHICLE_TOOLTIP_CARGO :{}{CARGO_LONG} ({CARGO_SHORT}) ###length VEHICLE_TYPES -STR_DEPOT_TRAIN_LIST_TOOLTIP :{BLACK}Junat - vedä kulkuneuvoa vasemmalla hiiren painikkella lisätäksesi/poistaaksesi junasta, oikealla painikkeella lisätietoja. Pidä pohjassa Ctrl-näppäintä toteuttaaksesi molemmat toiminnot seuraavaan ketjuun +STR_DEPOT_TRAIN_LIST_TOOLTIP :{BLACK}Junat – vedä kulkuneuvoa vasemmalla hiiren painikkella lisätäksesi/poistaaksesi junasta, oikealla painikkeella lisätietoja. Pidä pohjassa Ctrl-näppäintä toteuttaaksesi molemmat toiminnot seuraavaan ketjuun STR_DEPOT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Ajoneuvot – napsauta ajoneuvoa oikealla hiiren painikkeella saadaksesi tietoja STR_DEPOT_SHIP_LIST_TOOLTIP :{BLACK}Laivat – napsauta laivaa oikealla hiiren painikkeella saadaksesi tietoja. STR_DEPOT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Lentokoneet – napsauta lentokonetta oikealla hiiren painikkeella saadaksesi tietoja @@ -4040,12 +4079,12 @@ STR_ENGINE_PREVIEW_AIRCRAFT :ilma-alus STR_ENGINE_PREVIEW_SHIP :laiva 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}{}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 +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Hinta: {0:CURRENCY_LONG} Paino: {1:WEIGHT_SHORT}{}Nopeus: {2:VELOCITY} Teho: {3:POWER} Maksimivetovoima: {6:FORCE}{}Käyttökustannukset: {4:CURRENCY_LONG}/yr{}Kapasiteetti: {5:CARGO_LONG} +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Hinta: {CURRENCY_LONG} Huippunopeus: {VELOCITY}{}Kapasiteetti: {CARGO_LONG}{}Käyttökustannukset: {CURRENCY_LONG}/v +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Hinta: {CURRENCY_LONG} Huippunopeus: {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} Huippunopeus: {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} Huippunopeus: {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} Huippunopeus: {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} @@ -4195,16 +4234,17 @@ STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} vu STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Huippunopeus: {LTBLUE}{VELOCITY} 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} +STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Paino: {LTBLUE}{WEIGHT_SHORT} {BLACK}Teho: {LTBLUE}{POWER}{BLACK} Huippunopeus: {LTBLUE}{VELOCITY} +STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Paino: {LTBLUE}{WEIGHT_SHORT} {BLACK}Teho: {LTBLUE}{POWER}{BLACK} Huippunopeus: {LTBLUE}{VELOCITY} {BLACK}Maksimivetovoima: {LTBLUE}{FORCE} STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Tuotto tänä vuonna: {LTBLUE}{CURRENCY_LONG} (viime vuonna: {CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Tuotto tänä vuonna: {LTBLUE}{CURRENCY_LONG} (viime vuonna: {CURRENCY_LONG}) {BLACK}Vähimmäissuorituskyky: {LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Luotettavuus: {LTBLUE}{COMMA}{NBSP}% {BLACK}Hajoamiset viime huollon jälkeen: {LTBLUE}{COMMA} STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Rakennettu: {LTBLUE}{NUM}{BLACK} Arvo: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_INFO_NO_CAPACITY :{BLACK}Kapasiteetti: {LTBLUE}-{STRING} -STR_VEHICLE_INFO_CAPACITY :{BLACK}Kapasiteetti: {LTBLUE}{CARGO_LONG}{3:STRING} -STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Kapasiteetti: {LTBLUE}{CARGO_LONG}{3:STRING} (x{4:NUM}) +STR_VEHICLE_INFO_CAPACITY :{BLACK}Kapasiteetti: {LTBLUE}{0:CARGO_LONG}{3:STRING} +STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Kapasiteetti: {LTBLUE}{0:CARGO_LONG}{3:STRING} (×{4:NUM}) STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Kapasiteetti: {LTBLUE}{CARGO_LONG}, {CARGO_LONG}{STRING} STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Siirron arvo: {LTBLUE}{CURRENCY_LONG} @@ -4473,22 +4513,22 @@ STR_TIMETABLE_STARTING_DATE :{BLACK}Aloitusp STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Valitse päivämäärä aikataulun aloitusajankohdaksi. Ctrl+napsautus levittää kaikki tämän käskyjoukon jakavat kulkuneuvot tasaisesti niiden keskinäisen järjestyksen mukaan, mikäli käskyjoukko on kokonaan aikataulutettu STR_TIMETABLE_CHANGE_TIME :{BLACK}Muuta aikaa -STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Aseta kuinka kauan käskyn tulisi kestää +STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Muuta aikaa, jonka valitun käskyn tulisi kestää. Ctrl+napsautus asettaa keston kaikille käskyille STR_TIMETABLE_CLEAR_TIME :{BLACK}Nollaa aika -STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Nollaa tämän rivin aika +STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Nollaa valitun käskyn keston. Ctrl+napsautus nollaa kaikkien käskyjen kestot STR_TIMETABLE_CHANGE_SPEED :{BLACK}Muuta nopeusrajoitusta -STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Muuta valitun määräyksen suurinta sallittua nopeutta +STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Muuta suurinta sallittua nopeutta valitulle käskylle. Ctrl+napsautus asettaa nopeusrajoituksen kaikille käskyille STR_TIMETABLE_CLEAR_SPEED :{BLACK}Tyhjennä nopeusrajoitus -STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Tyhjennä valitun määräyksen suurin sallittu nopeus +STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Poista suurin sallittu nopeus valitulta käskyltä. Ctrl+napsautus poistaa kaikkien käskyjen nopeusrajoitukset STR_TIMETABLE_RESET_LATENESS :{BLACK}Nollaa myöhästymislaskuri STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Nollaa myöhästymislaskuri, jotta vaunu olisi taas aikataulussa STR_TIMETABLE_AUTOFILL :{BLACK}Automaattinen -STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Täytä aikataulu automaattisesti seuraavan matkan arvoilla (Ctrl+napsautus: yritä säilyttää odotusajat) +STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Täytä aikataulu automaattisesti seuraavan matkan arvoilla. Ctrl+napsautus: yritä säilyttää odotusajat STR_TIMETABLE_EXPECTED :{BLACK}Odotettu STR_TIMETABLE_SCHEDULED :{BLACK}Aikataulu @@ -4532,12 +4572,14 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Yksi kä STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Tekoälyn/peliskriptin virheenjäljitysikkuna on vain palvelimen käytettävissä # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Tekoälyn/peliskriptin määritteet +STR_AI_CONFIG_CAPTION_AI :{WHITE}Tekoälyasetukset +STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Peliskriptiasetukset STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Seuraavassa pelissä ladattava peliskripti STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}Seuraavassa pelissä ladattavat tekoälyt STR_AI_CONFIG_HUMAN_PLAYER :Ihmispelaaja STR_AI_CONFIG_RANDOM_AI :Sattumanvarainen tekoäly STR_AI_CONFIG_NONE :(ei mitään) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Vastustajien enimmäismäärä: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Siirrä ylöspäin STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Siirrä valittua tekoälyä ylöspäin listalla @@ -4545,12 +4587,11 @@ STR_AI_CONFIG_MOVE_DOWN :{BLACK}Siirrä STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Siirrä valittua tekoälyä alaspäin listalla STR_AI_CONFIG_GAMESCRIPT :{SILVER}Peliskripti +STR_AI_CONFIG_GAMESCRIPT_PARAM :{SILVER}Parametrit STR_AI_CONFIG_AI :{SILVER}Tekoälyt -STR_AI_CONFIG_CHANGE :{BLACK}Valitse {STRING} -STR_AI_CONFIG_CHANGE_NONE : -STR_AI_CONFIG_CHANGE_AI :Tekoäly -STR_AI_CONFIG_CHANGE_GAMESCRIPT :Peliskripti +STR_AI_CONFIG_CHANGE_AI :{BLACK}Valitse tekoäly +STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}Valitse peliskripti STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Lataa toinen skripti STR_AI_CONFIG_CONFIGURE :{BLACK}Määritä STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Määritä skriptin parametrit @@ -4579,9 +4620,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Korkeusk STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Pienoiskartan kuvakaappaus # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametrit -STR_AI_SETTINGS_CAPTION_AI :Tekoäly -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Peliskripti +STR_AI_SETTINGS_CAPTION_AI :{WHITE}Tekoälyn parametrit STR_AI_SETTINGS_CLOSE :{BLACK}Sulje STR_AI_SETTINGS_RESET :{BLACK}Palauta STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4745,6 +4784,7 @@ STR_ERROR_TOO_MANY_INDUSTRIES :{WHITE}... liik STR_ERROR_CAN_T_GENERATE_INDUSTRIES :{WHITE}Teollisuuslaitoksia ei voi luoda... STR_ERROR_CAN_T_BUILD_HERE :{WHITE}{STRING}: tähän ei voi rakentaa... STR_ERROR_CAN_T_CONSTRUCT_THIS_INDUSTRY :{WHITE}Teollisuustyyppiä ei voi rakentaa tähän... +STR_ERROR_CAN_T_PROSPECT_INDUSTRY :{WHITE}Ei voida koekaivaa… STR_ERROR_INDUSTRY_TOO_CLOSE :{WHITE}... liian lähellä toista teollisuuslaitosta STR_ERROR_MUST_FOUND_TOWN_FIRST :{WHITE}... kunta pitää perustaa ensin STR_ERROR_ONLY_ONE_ALLOWED_PER_TOWN :{WHITE}... vain yksi on sallittu kuntaa kohden @@ -4759,6 +4799,8 @@ STR_ERROR_FOREST_CAN_ONLY_BE_PLANTED :{WHITE}... mets STR_ERROR_CAN_ONLY_BE_BUILT_ABOVE_SNOW_LINE :{WHITE}... voidaan rakentaa vain lumirajan yläpuolelle STR_ERROR_CAN_ONLY_BE_BUILT_BELOW_SNOW_LINE :{WHITE}... voidaan rakentaa vain lumirajan alapuolelle +STR_ERROR_PROSPECTING_WAS_UNLUCKY :{WHITE}Rahoittamasi koekaivaus epäonnistui; yritä uudelleen +STR_ERROR_NO_SUITABLE_PLACES_FOR_PROSPECTING :{WHITE}Ei ollut sopivia paikkoja tämän teollisuuslaitoksen koekaivauksille STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES :{WHITE}Ei ollut sopivia paikkoja ”{STRING}”-teollisuuslaitoksille STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES_EXPLANATION :{WHITE}Muuta kartan parametreja saadaksesi paremman kartan @@ -4926,6 +4968,7 @@ STR_ERROR_OBJECT_IN_THE_WAY :{WHITE}Objekti STR_ERROR_COMPANY_HEADQUARTERS_IN :{WHITE}... yhtiön päärakennus on tiellä. STR_ERROR_CAN_T_PURCHASE_THIS_LAND :{WHITE}Maa-aluetta ei voi hankkia... STR_ERROR_YOU_ALREADY_OWN_IT :{WHITE}... omistat sen jo! +STR_ERROR_BUILD_OBJECT_LIMIT_REACHED :{WHITE}… objektien rakentamisen raja saavutettu # Group related errors STR_ERROR_GROUP_CAN_T_CREATE :{WHITE}Ei voi luoda ryhmää. @@ -4998,6 +5041,8 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Huoltov STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... kulkuneuvo on tuhoutunut +STR_ERROR_CAN_T_CLONE_VEHICLE_LIST :{WHITE}… kaikki kulkuneuvot eivät ole identtisiä + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Yhtään kulkuneuvoa ei ole saatavilla STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Muuta NewGRF-asetuksiasi STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Kulkuneuvoja ei ole vielä saatavilla @@ -5024,6 +5069,8 @@ STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}Tähän STR_ERROR_CAN_T_COPY_SHARE_ORDER :{WHITE}... kulkuneuvo ei pääse kaikille asemille STR_ERROR_CAN_T_ADD_ORDER :{WHITE}... kulkuneuvo ei pääse tälle asemalle STR_ERROR_CAN_T_ADD_ORDER_SHARED :{WHITE}... kulkuneuvo, jonka kanssa käskyt on jaettu, ei pääse tälle asemalle +STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST :{WHITE}… kaikkien kulkuneuvojen käskyt eivät ole samat +STR_ERROR_CAN_T_SHARE_ORDER_VEHICLE_LIST :{WHITE}… kaikki kulkuneuvot eivät jaa käskyjä STR_ERROR_CAN_T_SHARE_ORDER_LIST :{WHITE}Käskyjä ei voida jakaa... STR_ERROR_CAN_T_STOP_SHARING_ORDER_LIST :{WHITE}Käskyjen jakamista ei voida lopettaa... diff --git a/src/lang/french.txt b/src/lang/french.txt index ede1a339a3..bef83e71d3 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -201,6 +201,16 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}hp STR_UNITS_POWER_METRIC :{COMMA}{NBSP}ch STR_UNITS_POWER_SI :{COMMA}{NBSP}kW +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_SI :{DECIMAL}{NBSP}hp/Mg +STR_UNITS_POWER_METRIC_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_SI :{DECIMAL}{NBSP}hp/Mg +STR_UNITS_POWER_SI_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_SI :{DECIMAL}{NBSP}W/kg + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{G=f}{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{G=f}{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -392,10 +402,11 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Quitter # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Options du Jeu STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Paramètres -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Configuration des scripts +STR_SETTINGS_MENU_AI_SETTINGS :Configuration des IAs +STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :Configuration du script de jeu STR_SETTINGS_MENU_NEWGRF_SETTINGS :Paramètres NewGRF STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Options de transparence STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Afficher le nom des villes @@ -966,36 +977,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Roupie indienne STR_GAME_OPTIONS_CURRENCY_IDR :Roupie indonésienne (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Malaysian Ringgit (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Conduite à gauche -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Conduite à droite - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Nom des villes{NBSP}: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Sélectionner la nationalité des noms des villes - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Anglais (originaux) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Français -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Allemands -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Anglais (additionnels) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Latino-américains -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Drôles -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Suédois -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Hollandais -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finlandais -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Polonais -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slovaques -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norvégiens -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Hongrois -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Autrichiens -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Roumains -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Tchèques -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Suisses -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Danois -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turcs -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italiens -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Catalans - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Sauvegarde automatique STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Sélectionner l'intervalle de temps entre les sauvegardes automatiques @@ -1028,21 +1009,19 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Cochez c STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Pilote actif{NBSP}: {STRING} -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Taille d'interface -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Choisir la taille d'élément d'interface à utiliser +STR_GAME_OPTIONS_GUI_SCALE_FRAME :Taille de l'interface +STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Faites glisser la souris pour définir la taille de l'interface. Maintenir Ctrl pour un réglage en continu +STR_GAME_OPTIONS_GUI_SCALE_AUTO :détection automatique de la taille +STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Cochez cette case pour détecter automatiquement la taille de l'interface -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(auto-détection) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Taille double -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Taille quadruple +STR_GAME_OPTIONS_GUI_SCALE_BEVELS :{BLACK}Mettre à l’échelle les bordures +STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :{BLACK}Cochez cette case pour mettre les bordures à l'échelle avec la taille de l'interface -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Taille de police -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Choisir la taille de police d'interface à utiliser - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(auto-détection) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Taille double -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Taille quadruple +STR_GAME_OPTIONS_GUI_SCALE_1X :1x +STR_GAME_OPTIONS_GUI_SCALE_2X :2x +STR_GAME_OPTIONS_GUI_SCALE_3X :3x +STR_GAME_OPTIONS_GUI_SCALE_4X :4x +STR_GAME_OPTIONS_GUI_SCALE_5X :x5 STR_GAME_OPTIONS_GRAPHICS :{BLACK} Graphiques @@ -1094,8 +1073,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Prévis STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10{NBSP}000 livres (£) dans cette devise STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Changer les paramètres de la devise personnalisée -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Nombre maximal de concurrents{NBSP}: {ORANGE}{COMMA} - STR_NONE :Aucune STR_FUNDING_ONLY :Financement uniquement STR_MINIMAL :Minimal @@ -1145,6 +1122,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Environnement «{NBSP}Tempéré{NBSP}» +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Environnement «{NBSP}Arctique{NBSP}» +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Environnement «{NBSP}Tropical{NBSP}» +STR_CLIMATE_TOYLAND_LANDSCAPE :Environnement «{NBSP}Monde des jouets{NBSP}» + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Très plat STR_TERRAIN_TYPE_FLAT :Plat @@ -1504,6 +1487,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Amélioré STR_CONFIG_SETTING_ROAD_SIDE :Véhicules routiers{NBSP}: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Choisir le côté de circulation +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Conduite à gauche +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Conduite à droite + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Rotation de la carte d'altitude{NBSP}: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Anti-horaire @@ -2038,7 +2025,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Demi-tour autom STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Autoriser les trains a faire demi-tour à un signal, si ils attendent depuis un long moment ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(recommandé) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(recommandé) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Changer la valeur du paramètre @@ -2081,7 +2068,8 @@ STR_INTRO_HIGHSCORE :{BLACK}Meilleur STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Paramètres STR_INTRO_NEWGRF_SETTINGS :{BLACK}Paramètres NewGRF STR_INTRO_ONLINE_CONTENT :{BLACK}Vérifier le contenu en ligne -STR_INTRO_SCRIPT_SETTINGS :{BLACK}Paramètres des IA/script jeu +STR_INTRO_AI_SETTINGS :{BLACK}Configuration des IAs +STR_INTRO_GAMESCRIPT_SETTINGS :{BLACK}Configuration du script de jeu STR_INTRO_QUIT :{BLACK}Quitter STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Démarrer une nouvelle partie. Ctrl-clic pour passer outre la configuration du terrain. @@ -2101,7 +2089,8 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Afficher STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Afficher les paramètres STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Afficher la configuration des NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Vérifier les contenus nouveaux ou mis à jour téléchargeables -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Afficher la configuration des scripts +STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Afficher la configuration des IAs +STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Afficher la configuration du script de jeu STR_INTRO_TOOLTIP_QUIT :{BLACK}Quitter OpenTTD STR_INTRO_BASESET :{BLACK}{NUM} sprite{P "" s} manque{P "" "nt"} dans les graphiques de base actuellement sélectionnés. Veuillez vérifier les mises à jours pour les graphiques de base. @@ -2133,12 +2122,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Changer STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Modifier l'année courante STR_CHEAT_SETUP_PROD :{LTBLUE}Permettre la modification des valeurs de production{NBSP}: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Environnement «{NBSP}Tempéré{NBSP}» -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Environnement «{NBSP}Arctique{NBSP}» -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Environnement «{NBSP}Tropical{NBSP}» -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Environnement «{NBSP}Monde des jouets{NBSP}» - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Couleur @@ -2498,13 +2481,13 @@ STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :en attente du r STR_NETWORK_MESSAGE_CLIENT_LEAVING :départ STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} a rejoint la partie -STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {STRING} a rejoint la partie (Client n°{NBSP}{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} a rejoint la compagnie n°{NBSP}{2:NUM} +STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {0:STRING} a rejoint la partie (Client n°{NBSP}{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {0:STRING} a rejoint la compagnie n°{NBSP}{2:NUM} STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} a rejoint les spectateurs -STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} a lancé une nouvelle compagnie (n°{NBSP}{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} a quitté la partie ({2:STRING}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {0:STRING} a lancé une nouvelle compagnie (n°{NBSP}{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {0:STRING} a quitté la partie ({2:STRING}) STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} a changé son nom en {STRING} -STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} a donné {2:CURRENCY_LONG} à {1:STRING} +STR_NETWORK_MESSAGE_GIVE_MONEY :*** {0:STRING} a donné {2:CURRENCY_LONG} à {1:STRING} STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}Le serveur a fermé la session STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Le serveur redémarre...{}Veuillez patienter... STR_NETWORK_MESSAGE_KICKED :*** {STRING} a été exclu. Raison{NBSP}: ({STRING}) @@ -2619,6 +2602,8 @@ STR_LINKGRAPH_LEGEND_SATURATED :{TINY_FONT}{BLA STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLACK}surchargé # Linkgraph tooltip +STR_LINKGRAPH_STATS_TOOLTIP :{BLACK}{CARGO_LONG} à transporter par mois de {STATION} à {STATION} ({COMMA}% de la capacité){STRING} +STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} à transporter en retour ({COMMA}% de la capacité) STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}Temps de trajet moyen{NBSP}: {NUM}{NBSP}jour{P "" s} # Base for station construction window(s) @@ -3143,6 +3128,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Taille d STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Définir la taille de la carte en cases. Le nombre de cases utilisables sera légèrement plus petit STR_MAPGEN_BY :{BLACK}{NBSP}× STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Nb. de villes{NBSP}: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Nom des villes{NBSP}: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Sélectionner la nationalité des noms des villes STR_MAPGEN_DATE :{BLACK}Date{NBSP}: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Nb. d'industries{NBSP}: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Sommet le plus élevé: @@ -3158,11 +3145,40 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Diminuer STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Générateur{NBSP}: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Type de terrain{NBSP}: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Niveau de la mer{NBSP}: +STR_MAPGEN_SEA_LEVEL :{BLACK}Niveau de la mer{NBSP}: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Nb. de rivières{NBSP}: STR_MAPGEN_SMOOTHNESS :{BLACK}Lissage{NBSP}: STR_MAPGEN_VARIETY :{BLACK}Variété de distribution{NBSP}: STR_MAPGEN_GENERATE :{WHITE}Créer +STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}Paramètres NewGRF +STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Afficher la configuration des NewGRF +STR_MAPGEN_AI_SETTINGS :{BLACK}Paramètres des IAs +STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Afficher la configuration des IAs +STR_MAPGEN_GS_SETTINGS :{BLACK}Configuration du script de jeu +STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Afficher la configuration du script de jeu + +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Anglais (originaux) +STR_MAPGEN_TOWN_NAME_FRENCH :Français +STR_MAPGEN_TOWN_NAME_GERMAN :Allemands +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Anglais (additionnels) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Latino-américains +STR_MAPGEN_TOWN_NAME_SILLY :Drôles +STR_MAPGEN_TOWN_NAME_SWEDISH :Suédois +STR_MAPGEN_TOWN_NAME_DUTCH :Hollandais +STR_MAPGEN_TOWN_NAME_FINNISH :Finlandais +STR_MAPGEN_TOWN_NAME_POLISH :Polonais +STR_MAPGEN_TOWN_NAME_SLOVAK :Slovaques +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norvégiens +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Hongrois +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Autrichiens +STR_MAPGEN_TOWN_NAME_ROMANIAN :Roumains +STR_MAPGEN_TOWN_NAME_CZECH :Tchèques +STR_MAPGEN_TOWN_NAME_SWISS :Suisses +STR_MAPGEN_TOWN_NAME_DANISH :Danois +STR_MAPGEN_TOWN_NAME_TURKISH :Turcs +STR_MAPGEN_TOWN_NAME_ITALIAN :Italiens +STR_MAPGEN_TOWN_NAME_CATALAN :Catalans # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Bords de la carte{NBSP}: @@ -3308,6 +3324,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Sprite p STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Se rendre au précédent sprite normal, en ignorant les pseudo-sprites et les sprites de recoloration et de police, et en bouclant du premier vers le dernier STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Representation du sprite actuellement séléctionné. L'alignement est ignoré lors de l'affichage de ce sprite STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Déplacer le sprite, en modifiant les décalages X et Y. Ctrl-clic pour déplacer le sprite de 8 unités à la fois. + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Réinitialiser les relatifs STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Réinitialiser les décalages relatifs courants STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}Décalage X{NBSP}: {NUM}, décalage Y{NBSP}: {NUM} (Absolu) @@ -3325,15 +3345,15 @@ STR_NEWGRF_ERROR_MSG_FATAL :{RED}Erreur fat STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Une erreur NewGRF fatale est survenue{NBSP}:{}{STRING} STR_NEWGRF_ERROR_POPUP :{WHITE}Une erreur NewGRF est survenue{NBSP}:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} ne fonctionnera pas avec la version de TTDPatch rapportée par OpenTTD -STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} est conçu pour la version {STRING} de TTD -STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} est conçu pour être utilisé avec {STRING} -STR_NEWGRF_ERROR_INVALID_PARAMETER :Paramètre invalide pour {1:STRING}{NBSP}: paramètre {STRING} ({NUM}) -STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} doit être chargé avant {STRING} -STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} doit être chargé après {STRING} -STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} nécessite OpenTTD version {STRING} ou supérieure +STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} est conçu pour la version {2:STRING} de TTD +STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} est conçu pour être utilisé avec {2:STRING} +STR_NEWGRF_ERROR_INVALID_PARAMETER :Paramètre invalide pour {1:STRING}{NBSP}: paramètre {2:STRING} ({3:NUM}) +STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} doit être chargé avant {2:STRING} +STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} doit être chargé après {2:STRING} +STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} nécessite OpenTTD version {2:STRING} ou supérieure STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :le fichier GRF qu'il doit traduire STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Trop de NewGRFs sont chargés -STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Charger {1:STRING} comme NewGRF statique avec {STRING} peut provoquer des erreurs de synchronisation +STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Charger {1:STRING} comme NewGRF statique avec {2:STRING} peut provoquer des erreurs de synchronisation STR_NEWGRF_ERROR_UNEXPECTED_SPRITE :Sprite inattendu (sprite {3:NUM}) STR_NEWGRF_ERROR_UNKNOWN_PROPERTY :Action 0 avec propriété inconnue {4:HEX} (sprite {3:NUM}) STR_NEWGRF_ERROR_INVALID_ID :Tentative d'utilisation d'un identifiant invalide (sprite {3:NUM}) @@ -3465,14 +3485,14 @@ STR_LOCAL_AUTHORITY_ACTION_EXCLUSIVE_TRANSPORT :Acheter les dro STR_LOCAL_AUTHORITY_ACTION_BRIBE :Corrompre la municipalité ###length 8 -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{YELLOW}Lancez une petite campagne de publicité locale pour attirer plus de passagers et de marchandises vers vos services de transport.{} Augmente temporairement le classement des gares dans un petit rayon autour du centre-ville.{}Coût: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{YELLOW}Lancer une campagne de publicité moyenne, pour attirer plus de voyageurs et de marchandises sur vos lignes.{}Augmente temporairement le classement de vos gares dans un rayon moyen autour du centre-ville.{}Coût:{CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{YELLOW}Lancer une grande campagne de publicité, pour attirer plus de voyageurs et de marchandises sur vos lignes.{}Augmente temporairement le classement des gares dans un rayon important autour du centre-ville.{}Coût: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{YELLOW}Financer la reconstruction du réseau routier local. Provoque de nombreux problèmes de trafic routier pendant 6 mois.{}Coût: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{YELLOW}Construire une statue en l'honneur de votre compagnie.{}Augmente en permanence le classement de vos stations dans cette ville.{}Coût:{CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{YELLOW}Financer la construction de nouveaux immeubles commerciaux.{}Stimule temporairement la croissance dans cette ville.{}Coût:{CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW}Achetez les droits de transport exclusifs d'un an pour la ville.{} La municipalité n'autorisera pas les passagers et les marchandises à utiliser les gares de vos concurrents.{} Coût: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Corrompre la municipalité pour améliorer votre réputation. Risque de pénalisation si le pot-de-vin est dévoilé.{}Coût{NBSP}: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{YELLOW}Lancez une petite campagne de publicité locale pour attirer plus de passagers et de marchandises vers vos services de transport.{}Fournit une amélioration temporaire de la note des gares dans un petit rayon autour du centre-ville.{}{POP_COLOUR}Coût{NBSP}: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{PUSH_COLOUR}{YELLOW}Lancer une campagne de publicité moyenne, pour attirer plus de voyageurs et de marchandises sur vos lignes.{}Augmente temporairement le classement de vos gares dans un rayon moyen autour du centre-ville.{}{POP_COLOUR}Coût{NBSP}:{CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}Lancer une grande campagne de publicité, pour attirer plus de voyageurs et de marchandises sur vos lignes.{}Augmente temporairement le classement des gares dans un rayon important autour du centre-ville.{}{POP_COLOUR}Coût{NBSP}: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{PUSH_COLOUR}{YELLOW}Financer la reconstruction du réseau routier.{}Provoque une perturbation considérable du trafic pendant 6 mois au maximum.{}{POP_COLOUR}Coût : {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Construire une statue en l'honneur de votre compagnie.{}Augmente en permanence le classement de vos stations dans cette ville.{}{POP_COLOUR}Coût{NBSP}:{CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Financer la construction de nouveaux immeubles commerciaux.{}Stimule temporairement la croissance dans cette ville.{}{POP_COLOUR}Coût{NBSP}:{CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}Achetez les droits de transport exclusifs d'un an pour la ville.{} La municipalité n'autorisera pas les passagers et les marchandises à utiliser les gares de vos concurrents.{}{POP_COLOUR}Coût{NBSP}: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Corrompre la municipalité pour améliorer votre réputation. Risque de pénalisation si le pot-de-vin est dévoilé.{}{POP_COLOUR}Coût{NBSP}: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}Objectifs de {COMPANY} @@ -3645,16 +3665,18 @@ STR_FINANCES_SECTION_SHIP_REVENUE :{GOLD}Navires STR_FINANCES_SECTION_LOAN_INTEREST :{GOLD}Intérêts du prêt STR_FINANCES_SECTION_OTHER :{GOLD}Autres +STR_FINANCES_TOTAL_CAPTION :{WHITE}Total STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} STR_FINANCES_ZERO_INCOME :{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} -STR_FINANCES_NET_PROFIT :{WHITE}Bénéfice net +STR_FINANCES_PROFIT :{WHITE}Profit STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Solde bancaire STR_FINANCES_OWN_FUNDS_TITLE :{WHITE}Fonds propres STR_FINANCES_LOAN_TITLE :{WHITE}Emprunt STR_FINANCES_INTEREST_RATE :{WHITE}Taux d'intérêt de l'emprunt{NBSP}: {BLACK}{NUM}% STR_FINANCES_MAX_LOAN :{WHITE}Emprunt maximum{NBSP}: {BLACK}{CURRENCY_LONG} STR_FINANCES_TOTAL_CURRENCY :{BLACK}{CURRENCY_LONG} +STR_FINANCES_BANK_BALANCE :{WHITE}{CURRENCY_LONG} STR_FINANCES_BORROW_BUTTON :{BLACK}Emprunter {CURRENCY_LONG} STR_FINANCES_BORROW_TOOLTIP :{BLACK}Augmenter l'emprunt. Ctrl-clic pour emprunter autant que possible. STR_FINANCES_REPAY_BUTTON :{BLACK}Rembourser {CURRENCY_LONG} @@ -3755,7 +3777,7 @@ STR_INDUSTRY_VIEW_PRODUCES_N_CARGO :{BLACK}Produit{ STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :, {STRING}{STRING} STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Nécessite{NBSP}: -STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{0:STRING}{BLACK}{3:STRING} STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}{NBSP}: {CARGO_SHORT} en attente{STRING} STR_CONFIG_GAME_PRODUCTION :{WHITE}Changer la production (multiple de 8, max. 2040) @@ -3876,6 +3898,11 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Effort d STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Rayon d'action{NBSP}: {GOLD}{COMMA}{NBSP}cases STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Type d'aéronef{NBSP}: {GOLD}{STRING} +###length 3 +STR_CARGO_TYPE_FILTER_ALL :Tous les types de cargaison +STR_CARGO_TYPE_FILTER_FREIGHT :Fret +STR_CARGO_TYPE_FILTER_NONE :Aucun + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Choix du véhicule. Cliquer sur un véhicule pour obtenir des informations. Ctrl-clic pour basculer le masquage du type de véhicule STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Choix du véhicule routier. Cliquer sur un véhicule pour obtenir des informations. Ctrl-clic pour basculer le masquage du type de véhicule @@ -4044,7 +4071,7 @@ STR_ENGINE_PREVIEW_AIRCRAFT :{G=m2}aéronef STR_ENGINE_PREVIEW_SHIP :{G=m}navire STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Prix{NBSP}: {CURRENCY_LONG} − Poids{NBSP}: {WEIGHT_SHORT}{}Vitesse{NBSP}: {VELOCITY} − Puissance{NBSP}: {POWER}{}Coûts d'entretien{NBSP}: {CURRENCY_LONG}/an{}Capacité{NBSP}: {CARGO_LONG} -STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Prix{NBSP}: {CURRENCY_LONG} − Poids{NBSP}: {WEIGHT_SHORT}{}Vitesse{NBSP}: {VELOCITY} − Puissance{NBSP}: {POWER}{}Effort de traction max.{NBSP}: {6:FORCE}{}Coûts d'entretien{NBSP}: {4:CURRENCY_LONG}/an{}Capacité{NBSP}: {5:CARGO_LONG} +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Prix{NBSP}: {0:CURRENCY_LONG} − Poids{NBSP}: {1:WEIGHT_SHORT}{}Vitesse{NBSP}: {2:VELOCITY} − Puissance{NBSP}: {3:POWER}{}Effort de traction max.{NBSP}: {6:FORCE}{}Coûts d'entretien{NBSP}: {4:CURRENCY_LONG}/an{}Capacité{NBSP}: {5:CARGO_LONG} STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Prix{NBSP}: {CURRENCY_LONG} − Vitesse max.{NBSP}: {VELOCITY}{}Capacité{NBSP}: {CARGO_LONG}{}Coûts d'entretien{NBSP}: {CURRENCY_LONG}/an STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Prix{NBSP}: {CURRENCY_LONG} - Vitesse max.{NBSP}: {VELOCITY}{}Type d'aéronef{NBSP}: {STRING}{}Capacité{NBSP}: {CARGO_LONG}, {CARGO_LONG}{}Coûts d'entretien{NBSP}: {CURRENCY_LONG}/an STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Prix{NBSP}: {CURRENCY_LONG} - Vitesse max.{NBSP}: {VELOCITY}{}Type d'aéronef{NBSP}: {STRING}{}Capacité{NBSP}: {CARGO_LONG}{}Coûts d'entretien{NBSP}: {CURRENCY_LONG}/an @@ -4203,12 +4230,13 @@ STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Poids{NB STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Poids{NBSP}: {LTBLUE}{WEIGHT_SHORT}{BLACK} − Puissance{NBSP}: {LTBLUE}{POWER}{BLACK} − Vitesse max.{NBSP}: {LTBLUE}{VELOCITY}{BLACK} − E.T. max.{NBSP}: {LTBLUE}{FORCE} STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Profit cette année{NBSP}: {LTBLUE}{CURRENCY_LONG} (année précédente{NBSP}: {CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Profit cette année{NBSP}: {LTBLUE}{CURRENCY_LONG} (année précédente{NBSP}: {CURRENCY_LONG}) {BLACK}Performance min.{NBSP}: {LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Fiabilité{NBSP}: {LTBLUE}{COMMA}{NBSP}%{BLACK} − Pannes depuis le dernier entretien{NBSP}: {LTBLUE}{COMMA} STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE}{BLACK} − Construit en{NBSP}: {LTBLUE}{NUM}{BLACK} − Valeur{NBSP}: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_INFO_NO_CAPACITY :{BLACK}Capacité{NBSP}: {LTBLUE}Aucune{STRING} -STR_VEHICLE_INFO_CAPACITY :{BLACK}Capacité{NBSP}: {LTBLUE}{CARGO_LONG}{3:STRING} -STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Capacité{NBSP}: {LTBLUE}{CARGO_LONG}{3:STRING} (x{4:NUM}) +STR_VEHICLE_INFO_CAPACITY :{BLACK}Capacité{NBSP}: {LTBLUE}{0:CARGO_LONG}{3:STRING} +STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Capacité{NBSP}: {LTBLUE}{0:CARGO_LONG}{3:STRING} (x{4:NUM}) STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Capacité{NBSP}: {LTBLUE}{CARGO_LONG}, {CARGO_LONG}{STRING} STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Crédits de transfert{NBSP}: {LTBLUE}{CURRENCY_LONG} @@ -4529,19 +4557,21 @@ STR_AI_DEBUG_CONTINUE :{BLACK}Continue STR_AI_DEBUG_CONTINUE_TOOLTIP :{BLACK}Reprendre la partie et continuer l'IA STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}Afficher la sortie de débogage de cette IA STR_AI_GAME_SCRIPT :{BLACK}Script de jeu -STR_AI_GAME_SCRIPT_TOOLTIP :{BLACK}Examiner le journal des scripts de jeu +STR_AI_GAME_SCRIPT_TOOLTIP :{BLACK}Examiner le journal du script de jeu STR_ERROR_AI_NO_AI_FOUND :Aucune IA n'a été trouvée.{}Cette IA est factice et ne fera rien.{}Vous pouvez télécharger diverses IA via le système de «{NBSP}Contenu en ligne{NBSP}». STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}L'un des scripts a rencontré un problème. Merci de rapporter ceci à l'auteur du script avec une capture d'écran de la fenêtre de débogage de scripts. STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}La fenêtre de débogage de scripts n'est disponible que pour le serveur # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Configuration d'IA et de scripts de jeu +STR_AI_CONFIG_CAPTION_AI :{WHITE}Configuration d'IA +STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Configuration du script de jeu STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Le script de jeu qui sera chargé dans la prochaine partie STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}Les IAs qui seront chargées dans la prochaine partie STR_AI_CONFIG_HUMAN_PLAYER :Joueur humain STR_AI_CONFIG_RANDOM_AI :IA aléatoire STR_AI_CONFIG_NONE :(aucun) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Nombre maximal de concurrents{NBSP}: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Déplacer vers le haut STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Déplacer l'IA sélectionnée vers le haut @@ -4549,12 +4579,11 @@ STR_AI_CONFIG_MOVE_DOWN :{BLACK}Déplace STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Déplacer l'IA sélectionnée vers le bas STR_AI_CONFIG_GAMESCRIPT :{SILVER}Script de jeu +STR_AI_CONFIG_GAMESCRIPT_PARAM :{SILVER}Paramètres STR_AI_CONFIG_AI :{SILVER}IA -STR_AI_CONFIG_CHANGE :{BLACK}Sélectionner {STRING} -STR_AI_CONFIG_CHANGE_NONE : -STR_AI_CONFIG_CHANGE_AI :IA -STR_AI_CONFIG_CHANGE_GAMESCRIPT :Script de jeu +STR_AI_CONFIG_CHANGE_AI :{BLACK}Sélectionner une IA +STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}Sélectionner le script de jeu STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Charger un autre script STR_AI_CONFIG_CONFIGURE :{BLACK}Configurer STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Configurer les paramètres du script @@ -4583,9 +4612,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Capture 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 -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Script de jeu +STR_AI_SETTINGS_CAPTION_AI :{WHITE}Paramètres de l'IA STR_AI_SETTINGS_CLOSE :{BLACK}Fermer STR_AI_SETTINGS_RESET :{BLACK}Réinitialiser STR_AI_SETTINGS_SETTING :{STRING}{NBSP}: {ORANGE}{STRING} @@ -5003,6 +5030,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Impossib STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... véhicule détruit + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Aucun véhicule ne sera disponible STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Modifier votre configuration NewGRF STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Il n'y a pas encore de véhicules disponibles diff --git a/src/lang/frisian.txt b/src/lang/frisian.txt index 22af6e082a..43ec39d3b7 100644 --- a/src/lang/frisian.txt +++ b/src/lang/frisian.txt @@ -197,6 +197,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}hp STR_UNITS_POWER_METRIC :{COMMA}{NBSP}hp STR_UNITS_POWER_SI :{COMMA}{NBSP}kW + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -375,10 +376,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Ofslute # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Spulopsjes STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Ynstellings -STR_SETTINGS_MENU_SCRIPT_SETTINGS :AI/Spulskriptynstellings STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF-ynstellings STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Trochsichtigensopsjes STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Stêdsnammen sjen litte @@ -941,36 +941,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Yndyske rupee ( STR_GAME_OPTIONS_CURRENCY_IDR :Yndonezyske Roepia (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Maleizyske Ringgit (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Lofts ride -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Rjochts ride - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Stêdnammen -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Selektearje nammestyl - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Ingelsk (Orizjineel) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Frânsk -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Dútsk -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Ingelsk (Ekstra) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Latynsk-Amerikaansk -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Ût mâlens -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Sweedsk -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Nederlânsk -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finsk -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Poalsk -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slowaaks -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Noorsk -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Hongaarsk -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Eastenryksk -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Roemeensk -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Tsjechysk -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Switsersk -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Deensk -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turksk -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italjaansk -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Katalaansk - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Automatysk opslaan STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Selektearje de interval foar automatysk opslaan @@ -996,19 +966,8 @@ STR_GAME_OPTIONS_RESOLUTION_ITEM :{NUM}x{NUM} -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Interfacegrutte -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(automatysk) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normaal -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Dûbele grutte -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Fjouwerdûbele grutte -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Lettergrutte - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(automatysk) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normaal -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Dûbele grutte -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Fjouwerdûbele grutte STR_GAME_OPTIONS_REFRESH_RATE :{BLACK}Byldferfaskingssnelheid @@ -1056,8 +1015,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Foarbyl STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 Pûn (£) yn jo faluta STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Feroarje opsje fan oanpaste faluta -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Maksimum oantal tsjinstanners: {ORANGE}{COMMA} - STR_NONE :Gjin STR_FUNDING_ONLY :Allinnich finansierje STR_MINIMAL :Minimaal @@ -1107,6 +1064,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Gêrs lânskip +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Snie lânskip +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Sub-tropysk lânskip +STR_CLIMATE_TOYLAND_LANDSCAPE :Boartersguodlânskip + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Hiel Sljocht STR_TERRAIN_TYPE_FLAT :Sljocht @@ -1439,6 +1402,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Ferbettere STR_CONFIG_SETTING_ROAD_SIDE :Weinen: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Kies riidkant +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Lofts ride +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Rjochts ride + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Hichtekaartrotaasje: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Tsjin de klok yn @@ -1879,7 +1846,7 @@ STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS_HELPTEXT :Pathfinder te b STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Omkeare fan treinen by seinen: {STRING} ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Recommended) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Recommended) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Feroarje wearde @@ -1908,7 +1875,6 @@ STR_INTRO_HIGHSCORE :{BLACK}Topskore STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Ynstellings STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF ynstellings STR_INTRO_ONLINE_CONTENT :{BLACK}Sikje online ynhâld -STR_INTRO_SCRIPT_SETTINGS :{BLACK}AI/Spulskriptynstellings STR_INTRO_QUIT :{BLACK}Ôfslute STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Begjin in nei spul. Ctrl + klik slaat kaartynstelling oer @@ -1928,7 +1894,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Topskore STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Ynstellings sjen litte STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Lit NewGRF ynstellings sjen STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Strún ynternet ôf om nije ynhâld del te heljen -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}AI/Spulskriptynstellings sjen litte STR_INTRO_TOOLTIP_QUIT :{BLACK}Slút 'OpenTTD' ôf @@ -1956,12 +1921,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Veroarj STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Wizigje dit jier STR_CHEAT_SETUP_PROD :{LTBLUE}Stea oanpassen fan produksje ta: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Gêrs lânskip -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Snie lânskip -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Sub-tropysk lânskip -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Boartersguodlânskip - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Kleurenskema @@ -2726,17 +2685,42 @@ STR_MAPGEN_MAPSIZE :{BLACK}Lângrut STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Selektearje de grutte fan de kaart yn tegels. It tal beskikbere tegels sil leger lizze. STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Oantal stêden: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Stêdnammen +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Selektearje nammestyl STR_MAPGEN_DATE :{BLACK}Datum: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Oantal yndustrien: STR_MAPGEN_SNOW_COVERAGE :{BLACK}Snie-oerflak: STR_MAPGEN_LAND_GENERATOR :{BLACK}Lângenerator: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terreintype: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Seenivo: +STR_MAPGEN_SEA_LEVEL :{BLACK}Seenivo: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Rivieren: STR_MAPGEN_SMOOTHNESS :{BLACK}Sljochtens: STR_MAPGEN_VARIETY :{BLACK}Lânskipsfariaasje: STR_MAPGEN_GENERATE :{WHITE}Generearje +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Ingelsk (Orizjineel) +STR_MAPGEN_TOWN_NAME_FRENCH :Frânsk +STR_MAPGEN_TOWN_NAME_GERMAN :Dútsk +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Ingelsk (Ekstra) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Latynsk-Amerikaansk +STR_MAPGEN_TOWN_NAME_SILLY :Ût mâlens +STR_MAPGEN_TOWN_NAME_SWEDISH :Sweedsk +STR_MAPGEN_TOWN_NAME_DUTCH :Nederlânsk +STR_MAPGEN_TOWN_NAME_FINNISH :Finsk +STR_MAPGEN_TOWN_NAME_POLISH :Poalsk +STR_MAPGEN_TOWN_NAME_SLOVAK :Slowaaks +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Noorsk +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Hongaarsk +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Eastenryksk +STR_MAPGEN_TOWN_NAME_ROMANIAN :Roemeensk +STR_MAPGEN_TOWN_NAME_CZECH :Tsjechysk +STR_MAPGEN_TOWN_NAME_SWISS :Switsersk +STR_MAPGEN_TOWN_NAME_DANISH :Deensk +STR_MAPGEN_TOWN_NAME_TURKISH :Turksk +STR_MAPGEN_TOWN_NAME_ITALIAN :Italjaansk +STR_MAPGEN_TOWN_NAME_CATALAN :Katalaansk + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Kaartrânen: STR_MAPGEN_NORTHWEST :{BLACK}Noardwest @@ -2873,6 +2857,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Foarig f STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Gean tebek nei de foarige ôfbylding, sla pseudo/werkleure/lettertype ôfbyldings oer en begjin wer oernei at it begjin berikke is STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Represintaasje fan de no selektearre ôfbylding. Dizze wurdt net rjochte by it tekenjen STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Ferweech de ôfbylding, feroarje de X en Y útslach + +###length 2 + + STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X útslach: {NUM}, Y útslach: {NUM} (Absolút) STR_SPRITE_ALIGNER_OFFSETS_REL :{BLACK}X útslach: {NUM}, Y útslach: {NUM} (Relatyf) STR_SPRITE_ALIGNER_PICKER_BUTTON :{BLACK}Kies ôfbylding @@ -3351,6 +3339,8 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Maks. L STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Berik: {GOLD}{COMMA} flakken STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Fleantúch type: {GOLD}{STRING} +###length 3 + ###length VEHICLE_TYPES ###length VEHICLE_TYPES @@ -3858,12 +3848,12 @@ STR_ERROR_AI_NO_AI_FOUND :Gjin geskikte k STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}AI/Spulskript debugskerm is allinich beskikber foar de server # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}AI/Spulskript konfiguraasje STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}It spulskript dat yn it folgjende spul laden sil wurde STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}AIs dy't yn it folgjende spul laden sille wurde STR_AI_CONFIG_HUMAN_PLAYER :Minslike spiler STR_AI_CONFIG_RANDOM_AI :Samar in AI STR_AI_CONFIG_NONE :(gjin) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Maksimum oantal tsjinstanners: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Pleats heger STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Set selektearre AI boppenoan de list @@ -3872,8 +3862,6 @@ STR_AI_CONFIG_MOVE_DOWN :{BLACK}Pleats l STR_AI_CONFIG_GAMESCRIPT :{SILVER}Spulskript STR_AI_CONFIG_AI :{SILVER}AIs -STR_AI_CONFIG_CHANGE :{BLACK}Selektear {STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :AI STR_AI_CONFIG_CHANGE_GAMESCRIPT :Spulskript STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}in oar script lade @@ -3897,9 +3885,7 @@ STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Skript n # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameters STR_AI_SETTINGS_CAPTION_AI :AI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Spulskript STR_AI_SETTINGS_CLOSE :{BLACK}Slúte STR_AI_SETTINGS_RESET :{BLACK}Weromsette STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4283,6 +4269,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Kin tiid STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... wein verneatige + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Hielendal gjin fiertugen talitten STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Feroarje jo NewGRF-konfiguraasje STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Der binne noch gjin fiertugen beskikber diff --git a/src/lang/gaelic.txt b/src/lang/gaelic.txt index 317e94ee24..153c187799 100644 --- a/src/lang/gaelic.txt +++ b/src/lang/gaelic.txt @@ -385,6 +385,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}hp STR_UNITS_POWER_METRIC :{COMMA}{NBSP}hp STR_UNITS_POWER_SI :{COMMA}{NBSP}kW + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -562,10 +563,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Fàg an-seo # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Roghainnean a' gheama STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Roghainnean -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Roghainnean IF/sgriobt geama STR_SETTINGS_MENU_NEWGRF_SETTINGS :Roghainnean NewGRF STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Roghainnean trìd-shoilleireachd STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Ainmean nam bailtean gan sealltainn @@ -1129,36 +1129,6 @@ STR_GAME_OPTIONS_CURRENCY_CUSTOM :Gnàthaichte... STR_GAME_OPTIONS_CURRENCY_GEL :Lari Cairtbheileach (GEL) STR_GAME_OPTIONS_CURRENCY_IRR :Rial Iorànach (IRR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Draibheadh air an taobh chlì -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Draibheadh air an taobh deas - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Ainmean bhailtean -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Tagh stoidhle aig ainmean nam bailtean - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Beurla (Tùsail) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Frangach -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Gearmailteach -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Beurla (a bharrachd) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Aimeireaga Laidinneach -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Gòrach -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Suaineach -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Duitseach -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Fionnlannach -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Pòlannach -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slòbhacach -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Nirribheach -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Ungaireach -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Ostaireach -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Romàineach -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Seiceach -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Eilbheiseach -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Danmhairgeach -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turcach -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Eadailteach -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Catalanach - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Fèin-shàbhaladh STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Tagh dè cho tric ’s a thèid an geama fèin-shàbhaladh @@ -1183,12 +1153,6 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :Gnàthaichte -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Meud na h-eadar-aghaidh -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Tagh am meud airson rud san eadar-aghaidh - -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Àbhaisteach -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Dà uiread a mheud -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Ceithir uiread a mheud @@ -1237,8 +1201,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Ro-shea STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 not (£) san airgeadra agad STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Atharraich paramadair an airgeadra ghnàthaichte -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Àireamh as motha dhe cho-fharpaisich: {ORANGE}{COMMA} - STR_NONE :Chan eil gin STR_FUNDING_ONLY :Le maoineachadh a-mhàin STR_MINIMAL :As lugha @@ -1288,6 +1250,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Cruth-tìre measarra +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Cruth-tìre fo-artach +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Cruth-tìre fo-thropaigeach +STR_CLIMATE_TOYLAND_LANDSCAPE :Cruth-tìre nan dèideag + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Glè rèidh STR_TERRAIN_TYPE_FLAT :Rèidh @@ -1623,6 +1591,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Leasaichte STR_CONFIG_SETTING_ROAD_SIDE :Carbadan-rathaid: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Tagh an taobh air an draibhear +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Draibheadh air an taobh chlì +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Draibheadh air an taobh deas + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Cuairteachadh a' mhapa-àirde: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Tuathal @@ -2100,7 +2072,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Taobh contrarra STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Faodaidh trèanaichean tilleadh aig comharra nuair a bhios iad air feitheamh ann ùine fada ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(molta) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(molta) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Atharraich luach na roghainn @@ -2141,7 +2113,6 @@ STR_INTRO_HIGHSCORE :{BLACK}Clàr na STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Roghainnean STR_INTRO_NEWGRF_SETTINGS :{BLACK}Roghainnean NewGRF STR_INTRO_ONLINE_CONTENT :{BLACK}Susbaint air loidhne -STR_INTRO_SCRIPT_SETTINGS :{BLACK}Roghainnean sgriobt IF/Geama STR_INTRO_QUIT :{BLACK}Fàg an-seo STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Tòisich geama ùr. Ctrl+Briogadh gus leum thairis air rèiteachadh a mhapa @@ -2161,7 +2132,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Seall cl STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Roghainnean an t-seallaidh STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Seall na roghainnean NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Thoir sùil airson susbainte ùire no air a h-ùrachadh ri luchdadh a-nuas -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Seall roghainnean sgriobt IF/geama STR_INTRO_TOOLTIP_QUIT :{BLACK}Fàg “OpenTTD" STR_INTRO_BASESET :{BLACK}Tha {NUM} {P sprìd sprìd sprìdean sprìd} a dhìth air an t-seata grafaigeachd bhunasach a thagh thu. Thoir sùil airson ùrachaidhean an t-seata bhunasaich. @@ -2191,12 +2161,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Atharra STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Atharraich am bliadhna an-dràsta STR_CHEAT_SETUP_PROD :{LTBLUE}Cuir an comas atharrachadh air luachan saothrachaidh: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Cruth-tìre measarra -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Cruth-tìre fo-artach -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Cruth-tìre fo-thropaigeach -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Cruth-tìre nan dèideag - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Sgeama nan dath @@ -3100,16 +3064,41 @@ STR_MAPGEN_MAPSIZE :{BLACK}Meud a' STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Tagh co mheud leacan a bhios sa mhapa. Bidh an àireamh dhe leacan ri làimh beagan nas lugha STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Bailtean: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Ainmean bhailtean +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Tagh stoidhle aig ainmean nam bailtean STR_MAPGEN_DATE :{BLACK}Ceann-latha: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Gnìomhachasan: STR_MAPGEN_LAND_GENERATOR :{BLACK}Gineadair crutha-thìre: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Seòrsa a' chrutha-thìre: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Àirde na mara: +STR_MAPGEN_SEA_LEVEL :{BLACK}Àirde na mara: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Aibhnichean: STR_MAPGEN_SMOOTHNESS :{BLACK}Dè cho rèidh: STR_MAPGEN_VARIETY :{BLACK}Sgaoileadh caochlaidh: STR_MAPGEN_GENERATE :{WHITE}Gin am mapa +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Beurla (Tùsail) +STR_MAPGEN_TOWN_NAME_FRENCH :Frangach +STR_MAPGEN_TOWN_NAME_GERMAN :Gearmailteach +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Beurla (a bharrachd) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Aimeireaga Laidinneach +STR_MAPGEN_TOWN_NAME_SILLY :Gòrach +STR_MAPGEN_TOWN_NAME_SWEDISH :Suaineach +STR_MAPGEN_TOWN_NAME_DUTCH :Duitseach +STR_MAPGEN_TOWN_NAME_FINNISH :Fionnlannach +STR_MAPGEN_TOWN_NAME_POLISH :Pòlannach +STR_MAPGEN_TOWN_NAME_SLOVAK :Slòbhacach +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Nirribheach +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Ungaireach +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Ostaireach +STR_MAPGEN_TOWN_NAME_ROMANIAN :Romàineach +STR_MAPGEN_TOWN_NAME_CZECH :Seiceach +STR_MAPGEN_TOWN_NAME_SWISS :Eilbheiseach +STR_MAPGEN_TOWN_NAME_DANISH :Danmhairgeach +STR_MAPGEN_TOWN_NAME_TURKISH :Turcach +STR_MAPGEN_TOWN_NAME_ITALIAN :Eadailteach +STR_MAPGEN_TOWN_NAME_CATALAN :Catalanach + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Oirean a' mhapa: STR_MAPGEN_NORTHWEST :{BLACK}Iar-thuath @@ -3249,6 +3238,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}An sprit STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Lean air adhart dhan sprite àbhaisteach roimhe, a' gearradh leum thairis air sprites mas fhìor/ath-dhathaidh/crutha-chlò is a' pasgadh aig an toiseach gun sprite mu dheireadh STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Riochdachadh air an sprite a thagh thu an-dràsta. Thèid an co-thaobhadh a chur dhan dàrna taobh nuair a thèid an sprite a tharraing STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Gluais an sprite mu thimcheall, ag atharrachadh nam frith-àireamhan aig X is Y + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Ath-shuidhich na frith-àireamhean dàimheach STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Ath-shuidhich na frith-àireamhean dàimheach làithreach STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}frith-àireamh X: {NUM}, frith-àireamh Y: {NUM} (absaloideach) @@ -3768,6 +3761,8 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Spàirn STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Astar: {GOLD}{COMMA} {P leac leac leacan leac} STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Seòrsa a' charbaid-adhair: {GOLD}{STRING} +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Liosta airson carbadan-rèile a thaghadh. Briog air carbad airson fiosrachaidh. Ctrl+briog gus toglachadh an tèid seòrsa a’ charbaid fhalach gus nach tèid STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Liosta airson carbadan-rathaid a thaghadh. Briog air carbad airson fiosrachaidh. Ctrl+briog gus toglachadh an tèid seòrsa a’ charbaid fhalach gus nach tèid @@ -4397,12 +4392,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Thuislic STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Chan eil an uinneag dì-bhugaidh aig an IF/sgriobt geama ri làimh ach airson an fhrithealaiche # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Rèiteachadh an IF/sgriobt geama STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}An sgriobt geama a thèid a luchdadh leis an ath-gheama STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}Na IF a thèid a luchdadh leis an ath-gheama STR_AI_CONFIG_HUMAN_PLAYER :Cluicheadair daonna STR_AI_CONFIG_RANDOM_AI :IF air thuaiream STR_AI_CONFIG_NONE :(gun IF) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Àireamh as motha dhe cho-fharpaisich: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Gluais suas STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Gluais an IF a thagh thu suas air an liosta @@ -4412,8 +4407,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Gluais a STR_AI_CONFIG_GAMESCRIPT :{SILVER}Sgriobt geama STR_AI_CONFIG_AI :{SILVER}IFan -STR_AI_CONFIG_CHANGE :{BLACK}Tagh {STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :IF STR_AI_CONFIG_CHANGE_GAMESCRIPT :Sgriobt geama STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Luchdaich sgriobt eile @@ -4437,9 +4430,7 @@ STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Na athar # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}Paramadairean aig {STRING} STR_AI_SETTINGS_CAPTION_AI :IF -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Sgriobt geama STR_AI_SETTINGS_CLOSE :{BLACK}Dùin STR_AI_SETTINGS_RESET :{BLACK}Ath-shuidhich STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4845,6 +4836,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Cha ghab STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... chaidh an carbad a mhilleadh + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Cha bhi carbad sam bith ri làimh STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Atharraich an rèiteachadh NewGRF agad STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Chan eil carbad ri fhaighinn fhathast diff --git a/src/lang/galician.txt b/src/lang/galician.txt index 72eeed2545..b7a365456e 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -201,6 +201,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}cv STR_UNITS_POWER_METRIC :{COMMA}cv STR_UNITS_POWER_SI :{COMMA}kW + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}kg @@ -392,10 +393,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Saír # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Opcións do xogo STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Opcións -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Configuración da IA/scripts STR_SETTINGS_MENU_NEWGRF_SETTINGS :Configuración NewGRF STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Opcións de transparencia STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Amosar nomes de cidades @@ -966,36 +966,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Rupia India (IN STR_GAME_OPTIONS_CURRENCY_IDR :Rupia Indonesia (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Ringgit malaio(MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Conducir pola esquerda -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Conducir pola dereita - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Nomes das localidades: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Selecciona o estilo dos nomes das cidades - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Inglés (Orixinal) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Francés -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Alemán -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Inglés (Adicional) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Latino-Americano -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Parvo -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Sueco -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Neerlandés -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finés -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Polaco -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Eslovaco -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Noruegués -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Húngaro -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Austríaco -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Rumano -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Checo -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Suízo -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Danés -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turco -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italiano -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Catalán - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Autogravado STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Selecciona o intervalo entre autogravados @@ -1028,21 +998,8 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Marca es STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Controlador actual: {STRING} -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Tamaño da interface -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Seleciona o tamaño de elementos da interface a usar -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(auto-detectar) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Dobre tamaño -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Tamaño do cadro -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Tamaño da letra -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Escoller o tamaño de fonte da interfaz - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(auto-detectar) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Tamaño doble -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Tamaño do cadro STR_GAME_OPTIONS_GRAPHICS :{BLACK}Gráficos @@ -1094,8 +1051,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Vista p STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 Libras esterlinas (£) na túa moeda STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Cambiar o parámetro de moeda personalizada -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Nº máximo de opoñentes: {ORANGE}{COMMA} - STR_NONE :Ningún STR_FUNDING_ONLY :Só fundadas STR_MINIMAL :Mínimo @@ -1145,6 +1100,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Paisaxe temperada +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Paisaxe subártica +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Paisaxe subtropical +STR_CLIMATE_TOYLAND_LANDSCAPE :Paisaxe xoguetelandia + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Moi chan STR_TERRAIN_TYPE_FLAT :Chan @@ -1504,6 +1465,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Mellorado STR_CONFIG_SETTING_ROAD_SIDE :Vehículos rodados: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Escolle o senso de circulación +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Conducir pola esquerda +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Conducir pola dereita + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Rotación do mapa de alturas: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Antihorario @@ -2038,7 +2003,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Cambio de senti STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Permite aos trens cambiar de sentido nun sinal, se agardaron durante moito tempo ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Recomendado) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Recomendado) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Cambia-lo valor @@ -2081,7 +2046,6 @@ STR_INTRO_HIGHSCORE :{BLACK}Táboa d STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Opcións STR_INTRO_NEWGRF_SETTINGS :{BLACK}Configuración NewGRF STR_INTRO_ONLINE_CONTENT :{BLACK}Comprobar contido online -STR_INTRO_SCRIPT_SETTINGS :{BLACK}Configuración dos scripts de IA STR_INTRO_QUIT :{BLACK}Saír STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Comezar unha nova partida. Ctrl+Click para saltarse a configuración do mapa @@ -2101,7 +2065,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Mostrar STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Opcións de visualización STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Mostra-la configuración de NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Buscar contidos novos e actualizados para descargar -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Motra-la configuración dos scripts de IA STR_INTRO_TOOLTIP_QUIT :{BLACK}Saír de 'OpenTTD' STR_INTRO_BASESET :{BLACK}A base gráfica seleccionada actualmente está perdendo {NUM} sprite{P "" s}. Por favor comproba se hai actualizacións para o conxunto base. @@ -2133,12 +2096,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Cambiar STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Cambiar o ano actual STR_CHEAT_SETUP_PROD :{LTBLUE}Permitir a modificación dos valores de producción: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Paisaxe temperada -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Paisaxe subártica -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Paisaxe subtropical -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Paisaxe xoguetelandia - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Novo esquema de cor @@ -3141,6 +3098,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Tamaño STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK} Selecciona o tamaño do mapa en cadros. O número de cadros dispoñíbeis será sensiblemente menor STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Nº de cidades: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Nomes das localidades: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Selecciona o estilo dos nomes das cidades STR_MAPGEN_DATE :{BLACK}Data: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Nº de industrias: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Maior pico: @@ -3156,12 +3115,35 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Disminu STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Xerador de terreo: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Tipo de terreo: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Nivel do mar: +STR_MAPGEN_SEA_LEVEL :{BLACK}Nivel do mar: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Ríos: STR_MAPGEN_SMOOTHNESS :{BLACK}Suavidade: STR_MAPGEN_VARIETY :{BLACK}Variedade: STR_MAPGEN_GENERATE :{WHITE}Xerar +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Inglés (Orixinal) +STR_MAPGEN_TOWN_NAME_FRENCH :Francés +STR_MAPGEN_TOWN_NAME_GERMAN :Alemán +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Inglés (Adicional) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Latino-Americano +STR_MAPGEN_TOWN_NAME_SILLY :Parvo +STR_MAPGEN_TOWN_NAME_SWEDISH :Sueco +STR_MAPGEN_TOWN_NAME_DUTCH :Neerlandés +STR_MAPGEN_TOWN_NAME_FINNISH :Finés +STR_MAPGEN_TOWN_NAME_POLISH :Polaco +STR_MAPGEN_TOWN_NAME_SLOVAK :Eslovaco +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Noruegués +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Húngaro +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Austríaco +STR_MAPGEN_TOWN_NAME_ROMANIAN :Rumano +STR_MAPGEN_TOWN_NAME_CZECH :Checo +STR_MAPGEN_TOWN_NAME_SWISS :Suízo +STR_MAPGEN_TOWN_NAME_DANISH :Danés +STR_MAPGEN_TOWN_NAME_TURKISH :Turco +STR_MAPGEN_TOWN_NAME_ITALIAN :Italiano +STR_MAPGEN_TOWN_NAME_CATALAN :Catalán + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Bordes do mapa: STR_MAPGEN_NORTHWEST :{BLACK}Noroeste @@ -3306,6 +3288,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Sprite a STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Ir ao sprite anterior, ignorando pseudosprites, sprites recoloreados e sprites de fonte, e volvendo a empezar ao chegar ao inicio STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Representación do sprite seleccionado. A aliñación ignórase ao debuxar este sprite STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Move-lo sprite, cambiando os valores de X e Y. Ctrl+Click para movelo sprite oito unidades de golpe. + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :Reinicio relativo STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Restablecer a compensación actual STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}Compensación eixo X: {NUM}, Compensación eixo Y: {NUM} (Absoluta) @@ -3645,7 +3631,6 @@ STR_FINANCES_SECTION_OTHER :{GOLD}Outros STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} -STR_FINANCES_NET_PROFIT :{WHITE}Beneficio neto STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Balance bancario STR_FINANCES_OWN_FUNDS_TITLE :{WHITE}Fondos propios STR_FINANCES_LOAN_TITLE :{WHITE}Préstamo @@ -3873,6 +3858,8 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Esforzo STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Autonomía: {GOLD}{COMMA} cadros STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Tipo de aeronave: {GOLD}{STRING} +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Lista de selección de vehículos ferroviarios - pincha nun vehículo para obter información STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Lista de selección de vehículos de estrada - pincha nun vehículo para obter información @@ -4533,12 +4520,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Fallou u STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}A fiestra de Depuración de IA só está dispoñíbel para o servidor # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Configuración IA / scripts do xogo STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}O script de xogo que se cargará na próxima partida STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}As IAs que serán cargadas na próxima partida STR_AI_CONFIG_HUMAN_PLAYER :Xogador humano STR_AI_CONFIG_RANDOM_AI :IA aleatoria STR_AI_CONFIG_NONE :(ningunha) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Nº máximo de opoñentes: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Subir STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Mover a IA seleccionada cara arriba na lista @@ -4548,8 +4535,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Mover a STR_AI_CONFIG_GAMESCRIPT :{SILVER} Script do xogo STR_AI_CONFIG_AI :{SILVER}IAs -STR_AI_CONFIG_CHANGE :{BLACK}Seleccionar{STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :IA STR_AI_CONFIG_CHANGE_GAMESCRIPT :Script do xogo STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Cargar outro script @@ -4580,9 +4565,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Captura STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Captura de pantalla do minimapa # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parámetros STR_AI_SETTINGS_CAPTION_AI :IA -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Script do xogo STR_AI_SETTINGS_CLOSE :{BLACK}Pechar STR_AI_SETTINGS_RESET :{BLACK}Restablecer STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4999,6 +4982,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Non se p STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... o vehículo está destruído + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Non haberá vehículos dispoñibles STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Cambia a túa configuración NewGRF STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Aínda non hai vehículos dispoñíbeis diff --git a/src/lang/german.txt b/src/lang/german.txt index e364d86898..04258fc181 100644 --- a/src/lang/german.txt +++ b/src/lang/german.txt @@ -201,6 +201,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}PS STR_UNITS_POWER_METRIC :{COMMA}{NBSP}PS STR_UNITS_POWER_SI :{COMMA}{NBSP}kW + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -392,10 +393,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Beenden # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Spieleinstellungen STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Einstellungen -STR_SETTINGS_MENU_SCRIPT_SETTINGS :KI- / Skripteinstellungen STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF-Einstellungen STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Transparenzeinstellungen STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Städtenamen anzeigen @@ -966,36 +966,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Indische Rupie STR_GAME_OPTIONS_CURRENCY_IDR :Indonesische Rupiah (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Malaysische Ringgit (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Linksverkehr -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Rechtsverkehr - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Städtenamen: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Wähle die Sprache für die Städtenamen aus - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Englisch -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Französisch -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Deutsch -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Englisch (Zusätzlich) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Lateinamerikanisch -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Verrückt -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Schwedisch -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Niederländisch -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finnisch -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Polnisch -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slowakisch -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norwegisch -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Ungarisch -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Österreichisch -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Rumänisch -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Tschechisch -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Schweizerisch -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Dänisch -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Türkisch -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italienisch -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Katalanisch - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Autosicherung STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Abstand zwischen den automatischen Spielesicherungen wählen @@ -1028,21 +998,8 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Dieses K STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Aktueller Treiber: {STRING} -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Größe der Bedienelemente -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Wähle die Größe der Bedienelemente -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(automatisch erkennen) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Doppelt -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Vierfach -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Schriftgröße -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Die Schriftgröße der Spieloberfläche auswählen - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(automatisch erkennen) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Doppelt -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Vierfach STR_GAME_OPTIONS_GRAPHICS :{BLACK}Grafik @@ -1094,8 +1051,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Vorscha STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 Pfund (£) in der eigenen Währung STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Parameter für eigene Währung ändern -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Max. Mitbewerber-Zahl: {ORANGE}{COMMA} - STR_NONE :Keine STR_FUNDING_ONLY :Nur durch Spieler STR_MINIMAL :Minimal @@ -1145,6 +1100,12 @@ STR_SUBSIDY_X2 :×2 STR_SUBSIDY_X3 :×3 STR_SUBSIDY_X4 :×4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Gemäßigt +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Subarktisch +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Subtropisch +STR_CLIMATE_TOYLAND_LANDSCAPE :Spielzeugland + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Sehr flach STR_TERRAIN_TYPE_FLAT :Flach @@ -1504,6 +1465,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Verbessert STR_CONFIG_SETTING_ROAD_SIDE :Straßenfahrzeuge: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Die Seite des Straßenverkehrs auswählen +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Linksverkehr +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Rechtsverkehr + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Drehung der Reliefkarte: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Nach links @@ -2038,7 +2003,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Automatisches U STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Erlaube Zügen, an Signalen umzudrehen, wenn sie dort zu lange gewartet haben ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(empfohlen) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(empfohlen) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Wert der Einstellung ändern @@ -2081,7 +2046,6 @@ STR_INTRO_HIGHSCORE :{BLACK}Bestenli STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Einstellungen STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF-Einstellungen STR_INTRO_ONLINE_CONTENT :{BLACK}Erweiterungen herunterladen -STR_INTRO_SCRIPT_SETTINGS :{BLACK}KI- / Skripteinstellungen STR_INTRO_QUIT :{BLACK}Beenden STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Ein neues Spiel beginnen. Strg+Klick überspringt Karteneinstellungen @@ -2101,7 +2065,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Zeige di STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Einstellungen anzeigen STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}NewGRF-Einstellungen anzeigen und/oder ändern STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Prüfe, ob neue oder aktualisierte Erweiterungen zum Herunterladen bereitstehen -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Zeige KI- und Skripteinstellungen STR_INTRO_TOOLTIP_QUIT :{BLACK}OpenTTD beenden STR_INTRO_BASESET :{BLACK}Den momentan ausgewählten Basisgrafiken fehl{P 0 "t" "en"} {NUM} Sprite{P 0 "" "s"}. Bitte überprüfen, ob es Updates für die Basisgrafiken gibt. @@ -2133,12 +2096,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Ändere STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Ändert das Spieljahr STR_CHEAT_SETUP_PROD :{LTBLUE}Erlaube manuelles Ändern der Produktionsleistungen: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Gemäßigt -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Subarktisch -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Subtropisch -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Spielzeugland - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} – Farbschema @@ -2498,13 +2455,13 @@ STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :Warten auf Neub STR_NETWORK_MESSAGE_CLIENT_LEAVING :geht STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} ist dem Spiel beigetreten -STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {STRING} ist dem Spiel beigetreten (Teilnehmer #{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} ist der Firma #{2:NUM} beigetreten +STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {0:STRING} ist dem Spiel beigetreten (Teilnehmer #{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {0:STRING} ist der Firma #{2:NUM} beigetreten STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} ist den Zuschauern beigetreten -STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} hat eine neue Firma gegründet (#{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} hat das Spiel verlassen ({2:STRING}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {0:STRING} hat eine neue Firma gegründet (#{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {0:STRING} hat das Spiel verlassen ({2:STRING}) STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} hat den eigenen Namen zu {STRING} geändert -STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} gab {2:CURRENCY_LONG} an {1:STRING} +STR_NETWORK_MESSAGE_GIVE_MONEY :*** {0:STRING} gab {2:CURRENCY_LONG} an {1:STRING} STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}Der Server hat das Spiel beendet STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Der Server startet neu...{}Bitte warten... STR_NETWORK_MESSAGE_KICKED :*** {STRING} wurde vom Server hinausgeworfen. Grund: ({STRING}) @@ -3145,6 +3102,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Spielfel STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Die Größe des Spielfelds auswählen. Die tatsächlich verfügbare Anzahl Felder wird geringfügig kleiner sein STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Städteanzahl: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Städtenamen: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Wähle die Sprache für die Städtenamen aus STR_MAPGEN_DATE :{BLACK}Datum: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Industriedichte: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Höchster Gipfel: @@ -3160,12 +3119,35 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Wüstenb STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Landgenerator: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Landschaftstyp: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Gewässermenge: +STR_MAPGEN_SEA_LEVEL :{BLACK}Gewässermenge: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Flüsse: STR_MAPGEN_SMOOTHNESS :{BLACK}Gleichmäßigkeit: STR_MAPGEN_VARIETY :{BLACK}Größe der Geländeformen: STR_MAPGEN_GENERATE :{WHITE}Erzeugen +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Englisch +STR_MAPGEN_TOWN_NAME_FRENCH :Französisch +STR_MAPGEN_TOWN_NAME_GERMAN :Deutsch +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Englisch (Zusätzlich) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Lateinamerikanisch +STR_MAPGEN_TOWN_NAME_SILLY :Verrückt +STR_MAPGEN_TOWN_NAME_SWEDISH :Schwedisch +STR_MAPGEN_TOWN_NAME_DUTCH :Niederländisch +STR_MAPGEN_TOWN_NAME_FINNISH :Finnisch +STR_MAPGEN_TOWN_NAME_POLISH :Polnisch +STR_MAPGEN_TOWN_NAME_SLOVAK :Slowakisch +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norwegisch +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Ungarisch +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Österreichisch +STR_MAPGEN_TOWN_NAME_ROMANIAN :Rumänisch +STR_MAPGEN_TOWN_NAME_CZECH :Tschechisch +STR_MAPGEN_TOWN_NAME_SWISS :Schweizerisch +STR_MAPGEN_TOWN_NAME_DANISH :Dänisch +STR_MAPGEN_TOWN_NAME_TURKISH :Türkisch +STR_MAPGEN_TOWN_NAME_ITALIAN :Italienisch +STR_MAPGEN_TOWN_NAME_CATALAN :Katalanisch + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Spielfeldränder: STR_MAPGEN_NORTHWEST :{BLACK}Nordwesten @@ -3310,6 +3292,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Vorherig STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Gehe zum vorherigen normalen Sprite und überspringe alle Pseudo-, Recolour- und Schriftsprites (springt ggf. vom letzten bis zum ersten Sprite) STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Darstellung des aktuellen Sprites. Die Ausrichtung wird beim Zeichnen des Sprites ignoriert STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Bewege die Sprites und ändere dadurch die X- und Y-Offsets. Strg+Klick um die Sprites 8 Blöcke weit zu bewegen. + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Setze zurück STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Setze die aktuellen relativen Versätze zurück STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X-Versatz: {NUM}, Y-Versatz: {NUM} (Absolut) @@ -3327,15 +3313,15 @@ STR_NEWGRF_ERROR_MSG_FATAL :{RED}Schwerer F STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Ein schwerer NewGRF-Fehler ist aufgetreten:{}{STRING} STR_NEWGRF_ERROR_POPUP :{WHITE}Ein NewGRF-Fehler ist aufgetreten:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} funktioniert nicht im Zusammenhang mit der von OpenTTD ermittelten TTDPatch-Version -STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} ist für die {STRING}-Version von TTD -STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} ist für die Nutzung mit {STRING} vorgesehen -STR_NEWGRF_ERROR_INVALID_PARAMETER :Falscher Parameter für {1:STRING}: Parameter {STRING} ({NUM}) -STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} muss vor {STRING} geladen werden -STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} muss nach {STRING} geladen werden -STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} Benötigt OpenTTD-Version {STRING} oder höher +STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} ist für die {2:STRING}-Version von TTD +STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} ist für die Nutzung mit {2:STRING} vorgesehen +STR_NEWGRF_ERROR_INVALID_PARAMETER :Ungültiger Parameter für {1:STRING}: Parameter {2:STRING} ({3:NUM}) +STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} muss vor {2:STRING} geladen werden +STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} muss nach {2:STRING} geladen werden +STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} benötigt OpenTTD-Version {2:STRING} oder höher STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :der NewGRF-Datei, die es übersetzen soll, STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Zu viele NewGRFs geladen -STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Das Laden von {1:STRING} als statisches NewGRF mit {STRING} könnte Synchronisationsfehler hervorrufen +STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Das Laden von {1:STRING} als statisches NewGRF mit {2:STRING} könnte Synchronisationsfehler hervorrufen STR_NEWGRF_ERROR_UNEXPECTED_SPRITE :Unerwartetes Sprite (Sprite {3:NUM}) STR_NEWGRF_ERROR_UNKNOWN_PROPERTY :Unbekannte Action-0-Eigenschaft {4:HEX} (Sprite {3:NUM}) STR_NEWGRF_ERROR_INVALID_ID :Zugriff auf eine ungültige ID (Sprite {3:NUM}) @@ -3650,7 +3636,6 @@ STR_FINANCES_SECTION_OTHER :{GOLD}Sonstiges STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} STR_FINANCES_ZERO_INCOME :{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} -STR_FINANCES_NET_PROFIT :{WHITE}Reingewinn STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Kontostand STR_FINANCES_OWN_FUNDS_TITLE :{WHITE}Eigenes Kapital STR_FINANCES_LOAN_TITLE :{WHITE}Kredit @@ -3757,7 +3742,7 @@ STR_INDUSTRY_VIEW_PRODUCES_N_CARGO :{BLACK}Produzie STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :, {STRING}{STRING} STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Benötigt: -STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{0:STRING}{BLACK}{3:STRING} STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} wartend{STRING} STR_CONFIG_GAME_PRODUCTION :{WHITE}Produktion ändern (Vielfache von 8, maximal 2040) @@ -3878,6 +3863,8 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Max. Zug STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Reichweite: {GOLD}{COMMA} Felder STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Flugzeugtyp: {GOLD}{STRING} +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Schienenfahrzeugsliste. Einzelheiten durch Anklicken des Fahrzeuges. Strg+Klick schaltet um zwischen Verstecken und Zeigen des Fahrzeugtyps STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Straßenfahrzeugsliste. Für Einzelheiten auf ein Fahrzeug klicken. Strg+Klick schaltet um zwischen Verstecken und Zeigen des Fahrzeugtyps @@ -4046,7 +4033,7 @@ STR_ENGINE_PREVIEW_AIRCRAFT :{G=n}Flugzeug STR_ENGINE_PREVIEW_SHIP :{G=n}Schiff STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Kosten: {CURRENCY_LONG} Gewicht: {WEIGHT_SHORT}{}Geschwindigk.: {VELOCITY} Leistung: {POWER}{}Betriebskosten: {CURRENCY_LONG} pro Jahr{}Kapazität: {CARGO_LONG} -STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Preis: {CURRENCY_LONG} Gewicht: {WEIGHT_SHORT}{}Max. Geschwindigkeit: {VELOCITY} Leistung: {POWER} Max. Zugkraft: {6:FORCE}{}Betriebskosten: {4:CURRENCY_LONG}/Jahr{}Kapazität: {5:CARGO_LONG} +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Preis: {0:CURRENCY_LONG} Gewicht: {1:WEIGHT_SHORT}{}Max. Geschwindigkeit: {2:VELOCITY} Leistung: {3:POWER} Max. Zugkraft: {6:FORCE}{}Betriebskosten: {4:CURRENCY_LONG}/Jahr{}Kapazität: {5:CARGO_LONG} STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Preis: {CURRENCY_LONG} Höchstgeschw.: {VELOCITY}{}Kapazität: {CARGO_LONG}{}Betriebskosten: {CURRENCY_LONG}/Jahr STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Kosten: {CURRENCY_LONG} Max. Geschw.: {VELOCITY}{}Flugzeugtyp: {STRING}{}Kapazität: {CARGO_LONG}, {CARGO_LONG}{}Betriebskosten: {CURRENCY_LONG}/Jahr STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Kosten: {CURRENCY_LONG} Max. Geschw.: {VELOCITY}{}Flugzeugtyp: {STRING}{}Kapazität: {CARGO_LONG}{}Betriebskosten: {CURRENCY_LONG}/Jahr @@ -4209,8 +4196,8 @@ STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Zuverlä STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Gebaut: {LTBLUE}{NUM}{BLACK} Wert: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_INFO_NO_CAPACITY :{BLACK}Kapazität: {LTBLUE}Keine{STRING} -STR_VEHICLE_INFO_CAPACITY :{BLACK}Kapazität: {LTBLUE}{CARGO_LONG}{3:STRING} -STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Kapazität: {LTBLUE}{CARGO_LONG}{3:STRING} (x{4:NUM}) +STR_VEHICLE_INFO_CAPACITY :{BLACK}Kapazität: {LTBLUE}{0:CARGO_LONG}{3:STRING} +STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Kapazität: {LTBLUE}{0:CARGO_LONG}{3:STRING} (x{4:NUM}) STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Kapazität: {LTBLUE}{CARGO_LONG}, {CARGO_LONG}{STRING} STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Transfer-Einnahmen: {LTBLUE}{CURRENCY_LONG} @@ -4538,12 +4525,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Eine der STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Debugfenster für KI oder Skripte ist nur auf dem Server verfügbar # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}KI / Skripte einstellen STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Das Skript, das im nächsten Spiel geladen wird STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}Die KIs, die im nächsten Spiel geladen werden STR_AI_CONFIG_HUMAN_PLAYER :Menschlicher Spieler STR_AI_CONFIG_RANDOM_AI :Zufällige KI STR_AI_CONFIG_NONE :- +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Max. Mitbewerber-Zahl: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Nach oben verschieben STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Die ausgewählte KI in der Liste nach oben verschieben @@ -4553,8 +4540,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Die ausg STR_AI_CONFIG_GAMESCRIPT :{SILVER}Skript STR_AI_CONFIG_AI :{SILVER}KIs -STR_AI_CONFIG_CHANGE :{BLACK}Wähle {STRING} aus -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :KI STR_AI_CONFIG_CHANGE_GAMESCRIPT :Skript STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Lade ein anderes Skript @@ -4585,9 +4570,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Reliefka STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Übersichtskartenscreenshot # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameter STR_AI_SETTINGS_CAPTION_AI :KI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Skript STR_AI_SETTINGS_CLOSE :{BLACK}Schließen STR_AI_SETTINGS_RESET :{BLACK}Zurücksetzen STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -5005,6 +4988,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Das Wart STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... Fahrzeug ist zerstört + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Es sind keine Fahrzeuge verfügbar! STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Bitte die NewGRF-Einstellungen ändern, damit Fahrzeuge früher verfügbar sind STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Noch keine Fahrzeuge verfügbar diff --git a/src/lang/greek.txt b/src/lang/greek.txt index 857d54b14e..6cb846a341 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -261,6 +261,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}hp STR_UNITS_POWER_METRIC :{COMMA}{NBSP}hp STR_UNITS_POWER_SI :{COMMA}{NBSP}kW + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}τ. STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}τ. STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -452,10 +453,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Έξοδος # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Επιλογές παιχνιδιού STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Ρυθμίσεις -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Ρυθμίσεις ΑΙ και Δέσμης Ενεργειών STR_SETTINGS_MENU_NEWGRF_SETTINGS :Ρυθμίσεις NewGRF STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Επιλογές διαφάνειας STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Εμφάνιση ονομάτων πόλεων @@ -1072,36 +1072,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Ρουπία Ι STR_GAME_OPTIONS_CURRENCY_IDR :Ινδονησιακή Ρουπία (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Ρινγκίτ Μαλαισίας (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Οδηγούν από αριστερά -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Οδηγούν από δεξιά - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Ονόματα πόλεων: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Επιλογή στυλ ονομάτων πόλεων - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Αγγλικά (Αυθεντικά) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Γαλλικά -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Γερμανικά -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Αγγλικά (Πρόσθετα) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Λατινοαμερικάνικα -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Αστεία -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Σουηδικά -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Ολλανδικά -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Φινλανδικά -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Πολωνικά -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Σλοβάκικα -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Νορβηγικά -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Ουγγρικά -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Αυστριακά -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Ρουμάνικα -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Τσέχικα -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Ελβετικά -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Δανέζικα -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Τούρκικα -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Ιταλικά -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Καταλανικά - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Αυτόματη αποθήκευση STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Επιλογή διάκενου ανάμεσα στις αυτόματες αποθηκεύσεις @@ -1133,21 +1103,8 @@ STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Τσεκάρετε αυτό το κουτί για να ενεργοποιήσετε το v-sync στην οθόνη. Η αλλαγή αυτή θα εφαρμοστεί μετά από επανεκκίνηση του παιχνιδιού. Λειτουργεί μόνο με ενεργοποιημένη την επιτάχυνση υλικού -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Μέγεθος διεπαφής -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Επιλέξτε το μέγεθος στοιχείου διεπαφής -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(αυτόματη ανίχνευση) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Κανονικό -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Διπλό μέγεθος -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Τετραπλό μέγεθος -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Μέγεθος γραμματοσειράς -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Επιλέξτε το μέγεθος της γραμματοσειράς διεπαφής - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(αυτόματη ανίχνευση) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Κανονικό -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Διπλό μέγεθος -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Τετραπλό μέγεθος STR_GAME_OPTIONS_GRAPHICS :{BLACK}Γραφικά @@ -1199,8 +1156,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Προ STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 λίρες (£) στο νόμισμά σας STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Αλλαγή παραμέτρων προσαρμοσμένου νομίσματος -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Μέγιστος αρ. ανταγωνιστών: {ORANGE}{COMMA} - STR_NONE :Κανένα STR_FUNDING_ONLY :Χρηματοδότηση μονο STR_MINIMAL :Ελάχιστο @@ -1250,6 +1205,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Εύκρατο τοπίο +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Πολικό τοπίο +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Υποτροπικό τοπίο +STR_CLIMATE_TOYLAND_LANDSCAPE :Τοπίο παιχνιδότοπου + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Πολύ Επίπεδο STR_TERRAIN_TYPE_FLAT :Επίπεδο @@ -1608,6 +1569,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Βελτιωμ STR_CONFIG_SETTING_ROAD_SIDE :Οχήματα δρόμου: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Επιλέξτε την πλευρά οδήγησης +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Οδηγούν από αριστερά +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Οδηγούν από δεξιά + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Περιστροφή χάρτη υψομετρίας: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Αριστερόστροφη @@ -2136,7 +2101,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Αυτόματ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Επιτρέπεται στα τρένα να αντιστραφούν σε σήμα, εάν περιμένουν εκεί για πολύ ώρα ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Συνίσταται) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Συνίσταται) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Αλλαγή τιμής ρύθμισης @@ -2179,7 +2144,6 @@ STR_INTRO_HIGHSCORE :{BLACK}Πίνα STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Ρυθμίσεις STR_INTRO_NEWGRF_SETTINGS :{BLACK}Ρυθμίσεις NewGRF STR_INTRO_ONLINE_CONTENT :{BLACK}Διαδικτυακό Περιεχόμενο -STR_INTRO_SCRIPT_SETTINGS :{BLACK}Ρυθμίσεις AI και Δέσμης Ενεργειών STR_INTRO_QUIT :{BLACK}Έξοδος STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Έναρξη νέου παιχνιδιού. Με Ctrl+Κλικ παρακάμπτεται η ρύθμιση του χάρτη @@ -2199,7 +2163,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Εμφά STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Ρυθμίσεις οθόνης STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Εμφάνιση ρυθμίσεων NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Έλεγχος για νέο και ανανεωμένο περιεχόμενο για λήψη -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Εμφάνιση ρυθμίσεων για AI και της δέσμης ενεργειών του παιχνιδιού STR_INTRO_TOOLTIP_QUIT :{BLACK}Έξοδος από το «OpenTTD» STR_INTRO_BASESET :{BLACK}Λείπουν {NUM} sprite{P "" s} από το επιλεγμένο βασικό σετ γραφικών. Παρακαλούμε ελέγξτε για ενημερώσεις του βασικού σετ. @@ -2231,12 +2194,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Αλλ STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Αλλαγή τρέχοντος έτους STR_CHEAT_SETUP_PROD :{LTBLUE}Ενεργοποίηση δυνατότητας αλλαγής τιμών παραγωγής: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Εύκρατο τοπίο -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Πολικό τοπίο -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Υποτροπικό τοπίο -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Τοπίο παιχνιδότοπου - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Νέος Χρωματισμός @@ -3239,6 +3196,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Διάσ STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Επιλέξτε το μέγεθος του χάρτη σε τετραγωνίδια. Ο αριθμός των τετραγωνίδιων διαθέσιμα για κτίσιμο θα είναι λίγο χαμηλότερος STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Αριθμός πόλεων: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Ονόματα πόλεων: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Επιλογή στυλ ονομάτων πόλεων STR_MAPGEN_DATE :{BLACK}Ημερομηνία: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Αριθμός βιομηχανιών: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Υψηλότερη κορυφή: @@ -3254,12 +3213,35 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Μείω STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Δημιουργός εδάφους: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Τύπος εδάφους: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Επίπεδο θάλασσας: +STR_MAPGEN_SEA_LEVEL :{BLACK}Επίπεδο θάλασσας: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Ποτάμια: STR_MAPGEN_SMOOTHNESS :{BLACK}Ομαλότητα: STR_MAPGEN_VARIETY :{BLACK}Διανομή ποικιλομορφίας: STR_MAPGEN_GENERATE :{WHITE}Δημιουργία +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Αγγλικά (Αυθεντικά) +STR_MAPGEN_TOWN_NAME_FRENCH :Γαλλικά +STR_MAPGEN_TOWN_NAME_GERMAN :Γερμανικά +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Αγγλικά (Πρόσθετα) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Λατινοαμερικάνικα +STR_MAPGEN_TOWN_NAME_SILLY :Αστεία +STR_MAPGEN_TOWN_NAME_SWEDISH :Σουηδικά +STR_MAPGEN_TOWN_NAME_DUTCH :Ολλανδικά +STR_MAPGEN_TOWN_NAME_FINNISH :Φινλανδικά +STR_MAPGEN_TOWN_NAME_POLISH :Πολωνικά +STR_MAPGEN_TOWN_NAME_SLOVAK :Σλοβάκικα +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Νορβηγικά +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Ουγγρικά +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Αυστριακά +STR_MAPGEN_TOWN_NAME_ROMANIAN :Ρουμάνικα +STR_MAPGEN_TOWN_NAME_CZECH :Τσέχικα +STR_MAPGEN_TOWN_NAME_SWISS :Ελβετικά +STR_MAPGEN_TOWN_NAME_DANISH :Δανέζικα +STR_MAPGEN_TOWN_NAME_TURKISH :Τούρκικα +STR_MAPGEN_TOWN_NAME_ITALIAN :Ιταλικά +STR_MAPGEN_TOWN_NAME_CATALAN :Καταλανικά + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Άκρες χάρτη: STR_MAPGEN_NORTHWEST :{BLACK}Βορειοδυτικά @@ -3404,6 +3386,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Προη STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Προχώρησε στο προηγούμενο κανονικό sprite, προσπερνώντας οποιαδήποτε ψευδό/επαναχρωματιζόμενα/γραμματοσειράς sprites και ξαναεκτέλεσε τη διαδικασία από το πρώτο sprite ως το τελεταίο STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Επανεμφάνιση του επιλεγμένου sprite. Η ευθυγράμμιση αγνοείται όταν γίνεται η σχεδίαση του sprite STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Μετακίνηση του sprite τριγύρω, αλλάζοντας τα στίγματα Χ και Υ. Ctrl+Κλικ για να μετακινήσετε το sprite μονάδες τη φορά. + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Επαναφορά σχετικού STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Επαναφορά των τρεχούμενων σχετικών στιγμάτων STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}Στίγμα X: {NUM}, Στίγμα Y: {NUM} (Απόλυτο) @@ -3960,6 +3946,8 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Μέγ. STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Εύρος: {GOLD}{COMMA} τετραγωνίδια STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Τύπος αεροσκάφους: {GOLD}{STRING} +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Λίστα επιλογής βαγονιού τρένου. Πατήστε σε ένα βαγόνι για πληροφορίες. Ctrl+Click για εμφάνιση/απόκρυψη του τύπου βαγονιού STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Λίστα επιλογής οχήματος δρόμου. Πατήστε σε ένα όχημα για πληροφορίες. Ctrl+Click για εμφάνιση/απόκρυψη του τύπου οχήματος @@ -4626,12 +4614,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Μια STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Το παράθυρο αποσφαλμάτωσης ΑΙ και δέσμης ενεργειών είναι διαθέσιμο μόνο για τον διακομιστή # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Ρύθμιση ΑΙ και Δέσμης Ενεργειών STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Η Δέσμη Ενεργειών παιχνιδιού που θα φορτωθεί στο επόμενο παιχνίδι STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}Οι AIs που θα φορτωθούν στο επόμενο παιχνίδι STR_AI_CONFIG_HUMAN_PLAYER :Ανθρώπινος παίκτης STR_AI_CONFIG_RANDOM_AI :Τυχαία AI STR_AI_CONFIG_NONE :{G=f}(καμία) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Μέγιστος αρ. ανταγωνιστών: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Μετακίνηση Πάνω STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Μετακίνηση της επιλεγμένης AI πάνω στη λίστα @@ -4641,8 +4629,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Μετα STR_AI_CONFIG_GAMESCRIPT :{SILVER}Δέσμη Ενεργειών STR_AI_CONFIG_AI :{SILVER}AI -STR_AI_CONFIG_CHANGE :{BLACK}Επιλογή {STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :ΑΙ STR_AI_CONFIG_CHANGE_GAMESCRIPT :Δέσμη Ενεργειών STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Φόρτωση άλλης δέσμης ενεργειών @@ -4673,9 +4659,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Στιγ STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Στιγμιότυπο μίνι χάρτη # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Παράμετροι STR_AI_SETTINGS_CAPTION_AI :AI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Δέσμη Ενεργειών STR_AI_SETTINGS_CLOSE :{BLACK}Κλείσιμο STR_AI_SETTINGS_RESET :{BLACK}Επαναφορά STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -5092,6 +5076,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Δεν STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... το όχημα καταστράφηκε + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Δεν θα είναι κανένα όχημα διαθέσιμο STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Αλλάξτε τις ρύθμισεις NewGRF σας STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Κανένα όχημα δεν είναι διαθέσιμο ακόμη diff --git a/src/lang/hebrew.txt b/src/lang/hebrew.txt index a0b8ab9448..7d33493bdb 100644 --- a/src/lang/hebrew.txt +++ b/src/lang/hebrew.txt @@ -211,6 +211,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}כ"ס STR_UNITS_POWER_METRIC :{COMMA}כ"ס STR_UNITS_POWER_SI :{COMMA}קילו וואט + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}ט' STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}ט' STR_UNITS_WEIGHT_SHORT_SI :{COMMA}ק"ג @@ -388,10 +389,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :יציאה # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :אפשרויות המשחק STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :הגדרות -STR_SETTINGS_MENU_SCRIPT_SETTINGS :הגדרות סקריפטים של משחק/שחקני מחשב STR_SETTINGS_MENU_NEWGRF_SETTINGS :הגדרות GRF חדש STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :אפשרויות שקיפות STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :שמות ערים @@ -943,36 +943,6 @@ STR_GAME_OPTIONS_CURRENCY_GEL :לארי גאו STR_GAME_OPTIONS_CURRENCY_IRR :ריאל איראני (IRR) STR_GAME_OPTIONS_CURRENCY_RUB :רובל רוסי (RUB) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :סע בצד שמאל -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :סע בצד ימין - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}שמות הערים -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}בחר סגנון של שמות הערים - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :אנגלית -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :צרפתית -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :גרמנית -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :אנגלית -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :אמריקאי-לטיני -STR_GAME_OPTIONS_TOWN_NAME_SILLY :מצחיק -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :שוודית -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :הולנדית -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :פינית -STR_GAME_OPTIONS_TOWN_NAME_POLISH :פולנית -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :סלובקית -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :נורבגית -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :הונגרית -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :אוסטרית -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :רומנית -STR_GAME_OPTIONS_TOWN_NAME_CZECH :צ'כית -STR_GAME_OPTIONS_TOWN_NAME_SWISS :שווצרית -STR_GAME_OPTIONS_TOWN_NAME_DANISH :דנית -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :טורקית -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :איטלקית -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :רומאית - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}שמירה אוטומטית STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}בחר פרק זמן בין שמירות אוטומטיות @@ -997,12 +967,6 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :אחר -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}גודל ממשק -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}בחר את ממשק גודל העצם לשימוש - -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :רגיל -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :גודל כפול -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :גודל מרובע @@ -1051,8 +1015,6 @@ STR_CURRENCY_PREVIEW :{ORANGE}{CURREN STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 ליש"ט (£) במטבע שלך STR_CURRENCY_CHANGE_PARAMETER :{BLACK}שנה פרמטר עבור מטבע מותאם אישית -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{ORANGE}{COMMA}{LTBLUE} : מספר מתחרים מירבי - STR_NONE :ללא STR_FUNDING_ONLY :מימון בלבד STR_MINIMAL :מזערי @@ -1102,6 +1064,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :אקלים ממוזג +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :אקלים קר +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :אקלים טרופי +STR_CLIMATE_TOYLAND_LANDSCAPE :ארץ הצעצועים + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :שטוח ביותר STR_TERRAIN_TYPE_FLAT :שטוח @@ -1435,6 +1403,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :משופר STR_CONFIG_SETTING_ROAD_SIDE :כלי רכב: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :בחר את צד הנסיעה +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :סע בצד שמאל +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :סע בצד ימין + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :סיבוב מפת גבהים: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :נגד כיוון השעון @@ -1915,7 +1887,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :החלפת כי STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :אפשר לרכבות להחליף כיוון ברמזור, אם הן חיכו שם זמן ממושך ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(מומלץ) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(מומלץ) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}שנה ערך @@ -1956,7 +1928,6 @@ STR_INTRO_HIGHSCORE :{BLACK}טבלת STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}הגדרות STR_INTRO_NEWGRF_SETTINGS :{BLACK}(NewGRF)הגדרות שדרוג גראפי STR_INTRO_ONLINE_CONTENT :{BLACK} בדוק תוכן מקוון -STR_INTRO_SCRIPT_SETTINGS :{BLACK}הגדרות סקריפטים של משחק/שחקני מחשב STR_INTRO_QUIT :{BLACK}יציאה STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}התחל משחק חדש. Ctrl+לחיצה מדלג על תצורת מפה @@ -1976,7 +1947,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}הצג STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}הצגת הגדרות STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}הצג הגדרות שדרוג גראפי STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK} חפש תוכן חדש/מעודכן להורדה -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK} הצג הגדרות סקריפטים של משחק/שחקני מחשב STR_INTRO_TOOLTIP_QUIT :{BLACK}צא מ-'OpenTTD' STR_INTRO_BASESET :{BLACK}חסרים {NUM} ספרייט עבור גרפיקות הבסיס שנבחרו. אנא בדוק עדכונים לערכה זו. @@ -2006,12 +1976,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}שנה STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}שנה את השנה הנוכחית STR_CHEAT_SETUP_PROD :{LTBLUE}אפשר שינוי ערכי התפוקה: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :אקלים ממוזג -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :אקלים קר -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :אקלים טרופי -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :ארץ הצעצועים - # Livery window STR_LIVERY_GENERAL_TOOLTIP :{BLACK}הצג הגדרות צבע כלליות @@ -2884,16 +2848,41 @@ STR_MAPGEN_MAPSIZE :{BLACK}:גוד STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}בחר את גודל המפה במשבצות. מספר המשבצות הזמינות תהיה קצת קטנה יותר. STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK} :מספר העיירות +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}שמות הערים +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}בחר סגנון של שמות הערים STR_MAPGEN_DATE :{BLACK} :תאריך STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK} :מספר התעשיות STR_MAPGEN_LAND_GENERATOR :{BLACK} :מחולל פני שטח STR_MAPGEN_TERRAIN_TYPE :{BLACK} :סוג הקרקע -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK} :כמות ימים/אגמים +STR_MAPGEN_SEA_LEVEL :{BLACK} :כמות ימים/אגמים STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}נהרות: STR_MAPGEN_SMOOTHNESS :{BLACK} :חלקלקות STR_MAPGEN_VARIETY :{BLACK}הפצה מגוונת: STR_MAPGEN_GENERATE :{WHITE}יצירת קרקע +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :אנגלית +STR_MAPGEN_TOWN_NAME_FRENCH :צרפתית +STR_MAPGEN_TOWN_NAME_GERMAN :גרמנית +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :אנגלית +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :אמריקאי-לטיני +STR_MAPGEN_TOWN_NAME_SILLY :מצחיק +STR_MAPGEN_TOWN_NAME_SWEDISH :שוודית +STR_MAPGEN_TOWN_NAME_DUTCH :הולנדית +STR_MAPGEN_TOWN_NAME_FINNISH :פינית +STR_MAPGEN_TOWN_NAME_POLISH :פולנית +STR_MAPGEN_TOWN_NAME_SLOVAK :סלובקית +STR_MAPGEN_TOWN_NAME_NORWEGIAN :נורבגית +STR_MAPGEN_TOWN_NAME_HUNGARIAN :הונגרית +STR_MAPGEN_TOWN_NAME_AUSTRIAN :אוסטרית +STR_MAPGEN_TOWN_NAME_ROMANIAN :רומנית +STR_MAPGEN_TOWN_NAME_CZECH :צ'כית +STR_MAPGEN_TOWN_NAME_SWISS :שווצרית +STR_MAPGEN_TOWN_NAME_DANISH :דנית +STR_MAPGEN_TOWN_NAME_TURKISH :טורקית +STR_MAPGEN_TOWN_NAME_ITALIAN :איטלקית +STR_MAPGEN_TOWN_NAME_CATALAN :רומאית + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK} :שולי המפה STR_MAPGEN_NORTHWEST :{BLACK}צפון-מערב @@ -3029,6 +3018,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}הספר STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}עבור לספרייט הקודם, כאשר נדלג על כל הספרייטים המיוחדים ונחזור מתחילת הרשימה לסופה STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}הייצוג של הספרייט הנבחר. בעת ציור הספרייט, נתעלם מהיישור שלו STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}הזז את הספרייט, תוך שינוי ההיסט של צירי ה-X וה-Y. לחץ עם ctrl כדי להזיז את הספרייט שמונה יחידות בבת אחת + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}איפוס יחסית STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}איפוס ההיסטים היחסיים הנוכחיים STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}היסט X: {NUM}, היסט Y: {NUM} (מוחלט) @@ -3546,6 +3539,8 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}כוח STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}טווח: {GOLD}{COMMA} משבצות STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}סוג כלי טיס: {GOLD}{STRING} +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK} בחירת קרונות - לחץ על קרון לקבלת מידע STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}רשימת כלי הרכב - בחר כלי רכב למידע @@ -4176,12 +4171,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}אחד STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}חלון הדה-באג זמין רק עבור השרת # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}הגדרות משחק/בינה מלאכותית STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}סקריפט המשחק אשר יטען במשחק הבא STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}שחקני המחשב אשר יטענו במשחק הבא STR_AI_CONFIG_HUMAN_PLAYER :שחקן אנושי STR_AI_CONFIG_RANDOM_AI :בינה מלאכותית אקראית STR_AI_CONFIG_NONE :(ללא) +STR_AI_CONFIG_MAX_COMPETITORS :{ORANGE}{COMMA}{LTBLUE} : מספר מתחרים מירבי STR_AI_CONFIG_MOVE_UP :{BLACK}הזז מעלה STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}הזז את ה-AI הנבחר מעלה ברשימה @@ -4191,8 +4186,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}הזז STR_AI_CONFIG_GAMESCRIPT :{SILVER}סקריפט משחק STR_AI_CONFIG_AI :{SILVER}שחקני מחשב -STR_AI_CONFIG_CHANGE :{BLACK}בחר {STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :שחקן מחשב STR_AI_CONFIG_CHANGE_GAMESCRIPT :סקריפט משחק STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}טען סקריפט נוסף @@ -4216,9 +4209,7 @@ STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}אל ת # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} פרמטרים STR_AI_SETTINGS_CAPTION_AI :שחקן מחשב -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :סקריפט משחק STR_AI_SETTINGS_CLOSE :{BLACK}סגור STR_AI_SETTINGS_RESET :{BLACK}אתחל STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4624,6 +4615,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}לא נ STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... הרכב נהרס + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}כלי תחבורה לא יהיו זמינים STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}שנה הגדרות NewGRF STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}כלי תחבורה עדיין לא זמינים diff --git a/src/lang/hindi.txt b/src/lang/hindi.txt index d444beeafb..b2f124e3b2 100644 --- a/src/lang/hindi.txt +++ b/src/lang/hindi.txt @@ -72,6 +72,7 @@ STR_UNITS_POWER_METRIC :{COMMA}{NBSP}hp + # Common window strings @@ -115,7 +116,7 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :निकास # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :समायोजन STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED :पथ-संकेतों के नाम दिखायें STR_SETTINGS_MENU_TRANSPARENT_SIGNS :पारदर्शी संकेत @@ -274,16 +275,6 @@ STR_GAME_OPTIONS_CURRENCY_FIM :फिनलै STR_GAME_OPTIONS_CURRENCY_ISK :आइसलैंडिक क्रोना (ISK) STR_GAME_OPTIONS_CURRENCY_HKD :हाँग काँग डॉलर (एचकेडी) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :दाईं ओर वाहन चलाएँ - - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :फ़्रेंच -STR_GAME_OPTIONS_TOWN_NAME_POLISH :पोलिश -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :तुर्की -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :इटैलियन - # Autosave dropdown ###length 5 @@ -297,8 +288,6 @@ STR_GAME_OPTIONS_LANGUAGE_PERCENTAGE :{STRING} ({NUM} -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :सामान्य - @@ -316,7 +305,6 @@ STR_CURRENCY_DECREASE_EXCHANGE_RATE_TOOLTIP :{BLACK}एक - STR_VARIETY_MEDIUM :मध्यम ###length 5 @@ -330,6 +318,8 @@ STR_AI_SPEED_SLOW :धीमा ###length 4 +###length 4 + ###length 7 ###length 4 @@ -448,6 +438,9 @@ STR_CONFIG_SETTING_ORDER_REVIEW_OFF :नहीं ###length 3 +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :दाईं ओर वाहन चलाएँ + ###length 2 ###length 2 @@ -636,8 +629,6 @@ STR_ABANDON_SCENARIO_QUERY :{YELLOW}क् # Cheat window -###length 4 - # Livery window STR_LIVERY_TRAIN_TOOLTIP :{BLACK} ट्रेन रंग योजनाएं दिखाएं @@ -848,6 +839,12 @@ STR_FRAMETIME_CAPTION_GL_ECONOMY :माल प # World generation +###length 21 +STR_MAPGEN_TOWN_NAME_FRENCH :फ़्रेंच +STR_MAPGEN_TOWN_NAME_POLISH :पोलिश +STR_MAPGEN_TOWN_NAME_TURKISH :तुर्की +STR_MAPGEN_TOWN_NAME_ITALIAN :इटैलियन + # Strings for map borders at game generation STR_MAPGEN_BORDER_WATER :{BLACK}जल STR_MAPGEN_BORDER_RANDOM :{BLACK}यादृच्छिक @@ -878,6 +875,10 @@ STR_NEWGRF_SETTINGS_PALETTE_DEFAULT :मूल (D) # Sprite aligner window +###length 2 + + + # NewGRF (self) generated warnings/errors STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING} @@ -1036,6 +1037,8 @@ STR_BUY_VEHICLE_TRAIN_ALL_CAPTION :नई ट् STR_PURCHASE_INFO_COST_WEIGHT :{BLACK}मूल्य : {GOLD}{CURRENCY_LONG}{BLACK} भार : {GOLD}{WEIGHT_SHORT} STR_PURCHASE_INFO_WEIGHT_CWEIGHT :{BLACK}भार : {GOLD}{WEIGHT_SHORT} ({WEIGHT_SHORT}) +###length 3 + ###length VEHICLE_TYPES ###length VEHICLE_TYPES @@ -1249,7 +1252,6 @@ STR_AI_DEBUG_NAME_AND_VERSION :{BLACK}{STRING} -STR_AI_CONFIG_CHANGE_NONE : # Available AIs window @@ -1372,6 +1374,7 @@ STR_ERROR_CAN_T_SELL_TRAIN :{WHITE}रे + # Specific vehicle errors diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index a69ee72603..1dcc3f0665 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -263,6 +263,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}LE STR_UNITS_POWER_METRIC :{COMMA}{NBSP}LE STR_UNITS_POWER_SI :{COMMA}{NBSP}kW + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -289,7 +290,7 @@ STR_UNITS_HEIGHT_SI :{COMMA}{NBSP}m # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Szűrő kifejezés: -STR_LIST_FILTER_OSKTITLE :{BLACK}Kulcsszó megadása a szűréshez +STR_LIST_FILTER_OSKTITLE :{BLACK}Egy vagy több kulcsszó megadása a szűréshez STR_LIST_FILTER_TOOLTIP :{BLACK}Írj ide egy kulcsszót ami alapján szűrni szeretnéd a listát STR_TOOLTIP_GROUP_ORDER :{BLACK}Csoportosítási szempont kiválasztása @@ -441,7 +442,7 @@ STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Út ép STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Villamospálya építése STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Faültetés. Shift lenyomásával megmutatja a becsült építési költséget STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Felirat lerakása -STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Objektum elhelyezése. Shift lenyomásával megmutatja a várható költséget +STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Objektum építése. Ctrl lenyomásával átlós terület jelölhető ki. Shift lenyomásával megmutatja a becsült építési költséget. # Scenario editor file menu ###length 7 @@ -454,10 +455,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Kilépés # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Alapbeállítások STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Beállítások -STR_SETTINGS_MENU_SCRIPT_SETTINGS :MI / Játékszkript beállítások STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF beállítások STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Átlátszósági beállítások STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Városnevek mutatása @@ -1029,36 +1029,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Indiai Rúpia ( STR_GAME_OPTIONS_CURRENCY_IDR :Indonéz rúpia (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Maláj ringgit (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Balra hajtás -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Jobbra hajtás - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Városnevek: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}A városnevek stílusának kiválasztása - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Angol (Eredeti) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Francia -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Német -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Angol (További) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Latin-amerikai -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Komolytalan -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Svéd -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Holland -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finn -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Lengyel -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Szlovák -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norvég -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Magyar -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Osztrák -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Romániai -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Cseh -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Svájci -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Dán -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Török -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Olasz -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Katalán - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Automatikus mentés STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Az automatikus mentések közötti időtartam kiválasztása @@ -1091,21 +1061,8 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Jelöld STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Jelenlegi meghajtó: {STRING} -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Felület mérete -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Használni kívánt felületméret kiválasztása -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(automatikus) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normál -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Dupla méret -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Négyszeres méret -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Betűméret -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Használni kívánt betűméret kiválasztása - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(automatikus) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normál -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Dupla méret -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Négyszeres méret STR_GAME_OPTIONS_GRAPHICS :{BLACK}Grafika @@ -1157,8 +1114,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Előné STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 Font (£) a pénznemedben STR_CURRENCY_CHANGE_PARAMETER :{BLACK}A saját pénznem paramétereinek megváltoztatása -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Ellenfelek száma legfeljebb: {ORANGE}{COMMA} - STR_NONE :Semmi STR_FUNDING_ONLY :Csak finanszírozás STR_MINIMAL :Minimális @@ -1208,6 +1163,12 @@ STR_SUBSIDY_X2 :2x STR_SUBSIDY_X3 :3x STR_SUBSIDY_X4 :4x +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Mérsékelt táj +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Szubarktikus táj +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Szubtrópusi táj +STR_CLIMATE_TOYLAND_LANDSCAPE :Játékvilág táj + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Nagyon sík STR_TERRAIN_TYPE_FLAT :Sík @@ -1567,6 +1528,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Javított STR_CONFIG_SETTING_ROAD_SIDE :Közúti járművek: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Melyik oldalon közlekedjenek a közúti járművek +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Balra hajtás +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Jobbra hajtás + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Magasságtérkép forgatása: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Órairánnyal szemben @@ -2101,7 +2066,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Automatikus meg STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :A vonatok automatikus megfordításának engedélyezése, ha azok túl hosszú ideje várakoznak egy jelző előtt ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Ajánlott) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Ajánlott) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Válassz beállítási értéket @@ -2144,7 +2109,6 @@ STR_INTRO_HIGHSCORE :{BLACK}Rekord t STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Beállítások STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF beállítások STR_INTRO_ONLINE_CONTENT :{BLACK}Letölthető tartalmak -STR_INTRO_SCRIPT_SETTINGS :{BLACK}MI / Játékszkript beállítások STR_INTRO_QUIT :{BLACK}Kilépés STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Új játék kezdése. Ctrl+kattintással átugorhatod a térkép beállításokat @@ -2164,7 +2128,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Rekord t STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}A beállítások megjelenítése STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}NewGRF beállítások megjelenítése STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Új és frissített tartalmak megtekintése és letöltése -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}MI és játékszkript beállítások megjelenítése STR_INTRO_TOOLTIP_QUIT :{BLACK}Kilépés az OpenTTD-ből STR_INTRO_BASESET :{BLACK}A jelenleg kiválasztott grafikus alapcsomagból {NUM} sprite hiányzik. Frissítsd a grafikus alapcsomagot! @@ -2196,12 +2159,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Dátum STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Aktuális év megváltoztatása STR_CHEAT_SETUP_PROD :{LTBLUE}A nyersanyagüzemek termelése változtatható: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Mérsékelt táj -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Szubarktikus táj -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Szubtrópusi táj -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Játékvilág táj - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} színsémája @@ -2561,11 +2518,11 @@ STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :várakozás a k STR_NETWORK_MESSAGE_CLIENT_LEAVING :kilépés STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} csatlakozott a játékhoz -STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {STRING} csatlakozott a játékhoz ({2:NUM}. számú kliens) -STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} csatlakozott a(z) {2:NUM}. számú vállalathoz +STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {0:STRING} csatlakozott a játékhoz ({2:NUM}. számú kliens) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {0:STRING} csatlakozott a(z) {2:NUM}. számú vállalathoz STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} csatlakozott a megfigyelőkhöz -STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} új vállalatot alapított (#{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} kilépett a játékból ({2:STRING}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {0:STRING} új vállalatot alapított (#{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {0:STRING} kilépett a játékból ({2:STRING}) STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} nevet változtatott. Új neve: {STRING} STR_NETWORK_MESSAGE_GIVE_MONEY :*** {0:STRING} a következő összeget utalta {1:STRING} részére: {2:CURRENCY_LONG} STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}A szerver leállította a játékot @@ -2682,6 +2639,9 @@ STR_LINKGRAPH_LEGEND_SATURATED :{TINY_FONT}{BLA STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLACK}túlterhelt # Linkgraph tooltip +STR_LINKGRAPH_STATS_TOOLTIP :{BLACK}{CARGO_LONG} elszállítva havonta innen: {STATION} ide: {STATION} ({COMMA}% elszállítva){STRING} +STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} visszaszállításra ({COMMA}% elszállítva) +STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}Átlagos utazási idő: {NUM}{NBSP}nap{P "" s} # Base for station construction window(s) STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Lefedett terület mutatása: @@ -2691,6 +2651,7 @@ STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP :{BLACK}Az állo STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP :{BLACK}Az állomással lefedett terület mutatása (vonzáskörzet) STR_STATION_BUILD_ACCEPTS_CARGO :{BLACK}Elfogad:{GOLD}{CARGO_LIST} STR_STATION_BUILD_SUPPLIES_CARGO :{BLACK}Termel: {GOLD}{CARGO_LIST} +STR_STATION_BUILD_INFRASTRUCTURE_COST :{BLACK}Javítás költsége: {GOLD}{CURRENCY_SHORT}/év # Join station window STR_JOIN_STATION_CAPTION :{WHITE}Állomás egyesítése @@ -2878,11 +2839,11 @@ STR_LANDSCAPING_TOOLBAR :{WHITE}Tájrend STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}Egy pont lesüllyesztése. Húzással az első kiválasztott sarkot lesüllyeszti, majd a kiválasztott területet vele egy szintbe hozza. Ctrl lenyomásával átlós terület jelölhető ki. Shift lenyomásával megmutatja a terepsüllyesztés várható építési költségét STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND :{BLACK}Egy sarokpont megemelése. Húzással az első kiválasztott sarkot megemeli, majd a kiválasztott területet vele egy szintbe hozza. Ctrl lenyomásával átlós terület jelölhető ki. Shift lenyomásával megmutatja a terepemelés várható építési költségét STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Talaj a kijelölt sarokpont szintjére hozása. Ctrl lenyomásával átlós terület jelölhető ki. Shift lenyomásával megmutatja az átalakítás várható költségét -STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Földterület megvétele későbbi használatra. Shift lenyomásával megmutatja a várható költséget +STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Földterület megvétele későbbi használatra. Ctrl lenyomásával átlós terület jelölhető ki. Shift lenyomásával megmutatja a várható költséget # Object construction window STR_OBJECT_BUILD_CAPTION :{WHITE}Objektum kiválasztása -STR_OBJECT_BUILD_TOOLTIP :{BLACK}Építendő objektum kiválasztása. Shift lenyomásával megmutatja a várható költséget +STR_OBJECT_BUILD_TOOLTIP :{BLACK}Építendő objektum kiválasztása. Ctrl lenyomásával átlós terület jelölhető ki. Shift lenyomásával megmutatja a becsült költséget STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}Építendő objektum típusának kiválasztása STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}Objektum előnézete STR_OBJECT_BUILD_SIZE :{BLACK}Méret: {GOLD}{NUM} x {NUM} mező @@ -3204,6 +3165,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Térkép STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Válaszd ki a térkép méretét. Az elérhető mezők száma egy kicsit kevesebb lesz STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Várossűrűség: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Városnevek: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}A városnevek stílusának kiválasztása STR_MAPGEN_DATE :{BLACK}Dátum: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Gazd. épületek száma: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Legmagasabb pont: @@ -3219,12 +3182,35 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}A sivata STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Térkép generátor: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Tereptípus: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Tengerszint: +STR_MAPGEN_SEA_LEVEL :{BLACK}Tengerszint: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Folyók: STR_MAPGEN_SMOOTHNESS :{BLACK}Simaság: STR_MAPGEN_VARIETY :{BLACK}Változatosság eloszlása: STR_MAPGEN_GENERATE :{WHITE}Generál +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Angol (Eredeti) +STR_MAPGEN_TOWN_NAME_FRENCH :Francia +STR_MAPGEN_TOWN_NAME_GERMAN :Német +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Angol (További) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Latin-amerikai +STR_MAPGEN_TOWN_NAME_SILLY :Komolytalan +STR_MAPGEN_TOWN_NAME_SWEDISH :Svéd +STR_MAPGEN_TOWN_NAME_DUTCH :Holland +STR_MAPGEN_TOWN_NAME_FINNISH :Finn +STR_MAPGEN_TOWN_NAME_POLISH :Lengyel +STR_MAPGEN_TOWN_NAME_SLOVAK :Szlovák +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norvég +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Magyar +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Osztrák +STR_MAPGEN_TOWN_NAME_ROMANIAN :Romániai +STR_MAPGEN_TOWN_NAME_CZECH :Cseh +STR_MAPGEN_TOWN_NAME_SWISS :Svájci +STR_MAPGEN_TOWN_NAME_DANISH :Dán +STR_MAPGEN_TOWN_NAME_TURKISH :Török +STR_MAPGEN_TOWN_NAME_ITALIAN :Olasz +STR_MAPGEN_TOWN_NAME_CATALAN :Katalán + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Térkép határai: STR_MAPGEN_NORTHWEST :{BLACK}Északnyugat @@ -3282,7 +3268,7 @@ STR_NEWGRF_SETTINGS_INFO_TITLE :{WHITE}Részlet STR_NEWGRF_SETTINGS_ACTIVE_LIST :{WHITE}Aktív NewGRF fájlok STR_NEWGRF_SETTINGS_INACTIVE_LIST :{WHITE}Inaktív NewGRF fájlok STR_NEWGRF_SETTINGS_SELECT_PRESET :{ORANGE}Lista kiválasztása: -STR_NEWGRF_FILTER_TITLE :{ORANGE}Szűrendő kifejezés: +STR_NEWGRF_FILTER_TITLE :{ORANGE}Szűrő kifejezés: STR_NEWGRF_SETTINGS_PRESET_LIST_TOOLTIP :{BLACK}Kiválasztott lista betöltése STR_NEWGRF_SETTINGS_PRESET_SAVE :{BLACK}Lista mentése STR_NEWGRF_SETTINGS_PRESET_SAVE_TOOLTIP :{BLACK}A kiválasztott elemek listába mentése @@ -3369,6 +3355,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Előző STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Továbbhaladás az előző normál spritera, kihagyva bármilyen ál/átszínező/betű spriteokat, az elején folytatva az utolsóval STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}A jelenleg kiválasztott sprite ábrázolása. Az elhelyezkedés kikapcsolt sprite-rajzolás közben STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Sprite elmozdítása, módosítva az X és Y offszeteket. Ctrl+kattintással a spriteot nyolc egységgel mozgatja + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Eltolás visszaállítása STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}A jelenlegi relatív eltolás visszaállítása STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X eltolás: {NUM}, Y eltolás: {NUM} (Abszolút) @@ -3386,15 +3376,15 @@ STR_NEWGRF_ERROR_MSG_FATAL :{RED}Végzetes STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Egy végzetes NewGRF hiba történt:{}{STRING} STR_NEWGRF_ERROR_POPUP :{WHITE}NewGRF hiba történt:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} nem fog működni az OpenTTD által jelentett TTDPatch verzióval -STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} a TTD {STRING} verziójához van -STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} úgy lett tervezve, hogy együtt lesz használva ezzel: {STRING} -STR_NEWGRF_ERROR_INVALID_PARAMETER :Hibás paraméterérték ehhez: {1:STRING}: paraméter {STRING} ({NUM}) -STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} muszáj, hogy betöltődjön ezelőtt: {STRING} -STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} muszáj, hogy ezután töltődjön be: {STRING} -STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} csak a {STRING} vagy újabb verziójú OpenTTD-vel működik +STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} a TTD {2:STRING} verziójához van +STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} úgy lett tervezve, hogy együtt lesz használva ezzel: {2:STRING} +STR_NEWGRF_ERROR_INVALID_PARAMETER :Hibás paraméterérték ehhez: {1:STRING}: paraméter {2:STRING} ({NUM}) +STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} muszáj, hogy betöltődjön ezelőtt: {2:STRING} +STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} muszáj, hogy ezután töltődjön be: {2:STRING} +STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} csak a {2:STRING} vagy újabb verziójú OpenTTD-vel működik STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :az adott GRF fájl célja egy másik lefordítása STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Túl sok NewGRF van betöltve -STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :{1:STRING} betöltése mint statikus NewGRF {STRING} mellett ütközést okozhat +STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :{1:STRING} betöltése mint statikus NewGRF {2:STRING} mellett ütközést okozhat STR_NEWGRF_ERROR_UNEXPECTED_SPRITE :Váratlan sprite (sprite {3:NUM}) STR_NEWGRF_ERROR_UNKNOWN_PROPERTY :Ismeretlen Action 0 tulajdonság {4:HEX} (sprite {3:NUM}) STR_NEWGRF_ERROR_INVALID_ID :Érvénytelen ID használat (sprite {3:NUM}) @@ -3707,8 +3697,8 @@ STR_FINANCES_SECTION_LOAN_INTEREST :{GOLD}Kölcsön STR_FINANCES_SECTION_OTHER :{GOLD}Egyéb STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} +STR_FINANCES_ZERO_INCOME :{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} -STR_FINANCES_NET_PROFIT :{WHITE}Nettó Profit STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Banki egyenleg STR_FINANCES_OWN_FUNDS_TITLE :{WHITE}Saját források STR_FINANCES_LOAN_TITLE :{WHITE}Kölcsön @@ -3815,7 +3805,7 @@ STR_INDUSTRY_VIEW_PRODUCES_N_CARGO :{BLACK}Termel: STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :, {STRING}{STRING} STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Elfogad: -STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{0:STRING}{BLACK}{3:STRING} STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} várakozik{STRING} STR_CONFIG_GAME_PRODUCTION :{WHITE}Termelés megváltoztatása (8 többszörösei 2040-ig) @@ -3936,6 +3926,8 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Maximál STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Hatótávolság: {GOLD}{COMMA} mező STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Típus: {GOLD}{STRING} +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Vasúti jármű kiválasztása - kattints egy járműre az adataihoz. Ctrl+kattintással a járműtípus elrejthető/felfedhető STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Közúti jármű kiválasztása - kattints egy járműre az adataihoz. Ctrl+kattintással a járműtípus elrejthető/felfedhető @@ -4104,7 +4096,7 @@ STR_ENGINE_PREVIEW_AIRCRAFT :repülőgép STR_ENGINE_PREVIEW_SHIP :hajó STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Ár: {CURRENCY_LONG} Súly: {WEIGHT_SHORT}{}Sebesség: {VELOCITY} Teljesítmény: {POWER}{}Üzemeltetés: {CURRENCY_LONG}/év{}Kapacitás: {CARGO_LONG} -STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Ár: {CURRENCY_LONG} Súly: {WEIGHT_SHORT}{}Sebesség: {VELOCITY} Teljesítmény: {POWER} Maximális vonóerő: {6:FORCE}{}Üzemeltetés: {4:CURRENCY_LONG}/év{}Kapacitás: {5:CARGO_LONG} +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Ár: {0:CURRENCY_LONG} Súly: {1:WEIGHT_SHORT}{}Sebesség: {2:VELOCITY} Teljesítmény: {3:POWER} Maximális vonóerő: {6:FORCE}{}Üzemeltetés: {4:CURRENCY_LONG}/év{}Kapacitás: {5:CARGO_LONG} STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Ár: {CURRENCY_LONG} Végsebesség: {VELOCITY}{}Kapacitás: {CARGO_LONG}{}Üzemeltetés: {CURRENCY_LONG}/év STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Ár: {CURRENCY_LONG} Sebesség: {VELOCITY}{}Típus: {STRING}{}Kapacitás: {CARGO_LONG}, {CARGO_LONG}{}Üzemeltetés: {CURRENCY_LONG}/év STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Ár: {CURRENCY_LONG} Sebesség: {VELOCITY}{}Típus: {STRING}{}Kapacitás: {CARGO_LONG}{}Üzemeltetés: {CURRENCY_LONG}/év @@ -4267,8 +4259,8 @@ STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Megbízh STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Vásárlás éve: {LTBLUE}{NUM}{BLACK} Érték: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_INFO_NO_CAPACITY :{BLACK}Kapacitás: {LTBLUE}Nincs{STRING} -STR_VEHICLE_INFO_CAPACITY :{BLACK}Kapacitás: {LTBLUE}{CARGO_LONG}{3:STRING} -STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Kapacitás: {LTBLUE}{CARGO_LONG}{3:STRING} (x{4:NUM}) +STR_VEHICLE_INFO_CAPACITY :{BLACK}Kapacitás: {LTBLUE}{0:CARGO_LONG}{3:STRING} +STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Kapacitás: {LTBLUE}{0:CARGO_LONG}{3:STRING} (x{4:NUM}) STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Kapacitás: {LTBLUE}{CARGO_LONG}, {CARGO_LONG}{STRING} STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Szállítási díj: {LTBLUE}{CURRENCY_LONG} @@ -4596,12 +4588,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Az egyik STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Az MI / Játékszkript nyomkövetés ablak csak a szerver számára elérhető # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}MI / Játékszkript beállítások STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}A következő játékban betöltődő játékszkript STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}A következő játékban betöltődő MI-k STR_AI_CONFIG_HUMAN_PLAYER :Játékos STR_AI_CONFIG_RANDOM_AI :Véletlenszerűen választott MI STR_AI_CONFIG_NONE :(nincs) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Ellenfelek száma legfeljebb: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Mozgatás Fel STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Kiválasztott MI mozgatása felfelé a listában @@ -4611,8 +4603,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Kiválas STR_AI_CONFIG_GAMESCRIPT :{SILVER}Játékszkript STR_AI_CONFIG_AI :{SILVER}MI-k -STR_AI_CONFIG_CHANGE :{BLACK}{STRING} kiválasztása -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :MI STR_AI_CONFIG_CHANGE_GAMESCRIPT :Játékszkript STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Másik szkript betöltése @@ -4643,9 +4633,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Magassá STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Minitérkép mentése # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Paraméterek STR_AI_SETTINGS_CAPTION_AI :MI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Játékszkript STR_AI_SETTINGS_CLOSE :{BLACK}Bezárás STR_AI_SETTINGS_RESET :{BLACK}Visszaállítás STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4990,6 +4978,7 @@ STR_ERROR_OBJECT_IN_THE_WAY :{WHITE}Objektum STR_ERROR_COMPANY_HEADQUARTERS_IN :{WHITE}... vállalat székháza van az útban STR_ERROR_CAN_T_PURCHASE_THIS_LAND :{WHITE}Nem veheted meg ezt a földterületet... STR_ERROR_YOU_ALREADY_OWN_IT :{WHITE}... már a tiéd! +STR_ERROR_BUILD_OBJECT_LIMIT_REACHED :{WHITE}... objektum építési limit elérve # Group related errors STR_ERROR_GROUP_CAN_T_CREATE :{WHITE}Csoport létrehozás sikertelen... @@ -5062,6 +5051,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Nem vál STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... jármű megsemmisült + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Egyáltalán nincsenek elérhető járművek STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Változtasd meg a NewGRF konfigurációdat! STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Még nincsenek elérhető járművek diff --git a/src/lang/icelandic.txt b/src/lang/icelandic.txt index 135c5a5cfe..b98ee8b049 100644 --- a/src/lang/icelandic.txt +++ b/src/lang/icelandic.txt @@ -198,6 +198,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}hö. STR_UNITS_POWER_METRIC :{COMMA}hö. STR_UNITS_POWER_SI :{COMMA}kW + STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}tonn STR_UNITS_WEIGHT_SHORT_SI :{COMMA}kg @@ -354,9 +355,8 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Hætta # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Stillingar -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Gervigreind/leikjaforskrift STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF stillingar STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Gegnsæisstillingar STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Bæjanöfn sýnd @@ -895,36 +895,6 @@ STR_GAME_OPTIONS_CURRENCY_CUSTOM :Sérsniðinn... STR_GAME_OPTIONS_CURRENCY_GEL :Lari (Gel) STR_GAME_OPTIONS_CURRENCY_IRR :Íranskt ríal (IRR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Vinstristefna -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Hægristefna - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Bæjanöfn -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Tungumál bæjarnafna - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Ensk (Upphafleg) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Frönsk -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Þýsk -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Ensk (Aukaleg) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Rómönsk-Amerísk -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Fáránleg -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Sænsk -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Hollensk -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finnsk -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Pólsk -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slóvakísk -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norsk -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Ungversk -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Austurrísk -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Rúmensk -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Tékknesk -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Svissnesk -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Dönsk -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Tyrknesk -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Ítölsk -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Katalónsk - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Sjálfvirk vistun STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Tíðni sjálfvirkra vistana @@ -954,7 +924,6 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :annað - STR_GAME_OPTIONS_BASE_GRF :{BLACK}Grunngrafík STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Nota grunngrafíkina STR_GAME_OPTIONS_BASE_GRF_STATUS :{RED}{NUM} týnd{P "" ar} eða ónýt{P "" ar} skrá{P "" r} @@ -997,8 +966,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Dæmi: STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10.000 pund (£) í þessum gjaldmiðli STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Breyta sérsniðnum gjaldmiðli -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Hámarksfjöldi keppinauta: {ORANGE}{COMMA} - STR_NONE :Engin STR_FUNDING_ONLY :Með fjármögnun STR_MINIMAL :Lágmark @@ -1048,6 +1015,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Temprað landslag +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Heimskautalandslag +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Miðjarðarlandslag +STR_CLIMATE_TOYLAND_LANDSCAPE :Leikfangalandslag + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Mjög slétt STR_TERRAIN_TYPE_FLAT :Slétt @@ -1354,6 +1327,10 @@ STR_CONFIG_SETTING_TREE_PLACER_ORIGINAL :Venjulega STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Nýstárlega +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Vinstristefna +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Hægristefna + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Snúningur hæðakorts: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Rangsælis @@ -1759,7 +1736,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Snúa járnbrau STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Leyfa járnbrautarlestum að snúa við á umferðarmerkjum ef þau hafa beðið þar í langan tíma ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Ráðlegt) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Ráðlegt) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Breyta gildi stillingar @@ -1799,7 +1776,6 @@ STR_INTRO_GAME_OPTIONS :{BLACK}Stilling STR_INTRO_HIGHSCORE :{BLACK}Stigatafla STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF Stillingar STR_INTRO_ONLINE_CONTENT :{BLACK}Ná í viðbætur af netinu -STR_INTRO_SCRIPT_SETTINGS :{BLACK}GG/forskriftar stillingar STR_INTRO_QUIT :{BLACK}Hætta STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Hefja nýjan leik. Ctrl+smella sleppir kortastillingum @@ -1818,7 +1794,6 @@ STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Stilla O STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Birta stigatöflu STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Sýna NewGRF stillingar STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Skoða viðbætur sem hægt er að ná í af netinu -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Birta stillingar fyrir gervigreind/forskrift STR_INTRO_TOOLTIP_QUIT :{BLACK}Hætta í OpenTTD STR_INTRO_TRANSLATION :{BLACK}Það vantar {NUM} þýðing{P u ar} í þetta tungumál. Vinsamlegast hjálpaðu við að gera OpenTTD betra með því að skrá þig sem þýðanda. Nánari upplýsingar í readme.txt. @@ -1845,12 +1820,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Breyta STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Breyta um ár STR_CHEAT_SETUP_PROD :{LTBLUE}Leyfa breytingar á verðmæti framleiðslu: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Temprað landslag -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Heimskautalandslag -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Miðjarðarlandslag -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Leikfangalandslag - # Livery window STR_LIVERY_GENERAL_TOOLTIP :{BLACK}Grunnlitur fyrirtækis @@ -2683,16 +2652,41 @@ STR_MAPGEN_MAPSIZE :{BLACK}Kortast STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Veldu stærð kortsins í reitum. Fjöldi reita verða aðeins færri STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Fjöldi bæja: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Bæjanöfn +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Tungumál bæjarnafna STR_MAPGEN_DATE :{BLACK}Dags.: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Fjöldi iðnaða: STR_MAPGEN_LAND_GENERATOR :{BLACK}Landmyndun: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Gerð lands: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Magn sjávar: +STR_MAPGEN_SEA_LEVEL :{BLACK}Magn sjávar: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Ár: STR_MAPGEN_SMOOTHNESS :{BLACK}Sléttleiki lands: STR_MAPGEN_VARIETY :{BLACK}Fjölbreytileikadreifing: STR_MAPGEN_GENERATE :{WHITE}Mynda land +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Ensk (Upphafleg) +STR_MAPGEN_TOWN_NAME_FRENCH :Frönsk +STR_MAPGEN_TOWN_NAME_GERMAN :Þýsk +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Ensk (Aukaleg) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Rómönsk-Amerísk +STR_MAPGEN_TOWN_NAME_SILLY :Fáránleg +STR_MAPGEN_TOWN_NAME_SWEDISH :Sænsk +STR_MAPGEN_TOWN_NAME_DUTCH :Hollensk +STR_MAPGEN_TOWN_NAME_FINNISH :Finnsk +STR_MAPGEN_TOWN_NAME_POLISH :Pólsk +STR_MAPGEN_TOWN_NAME_SLOVAK :Slóvakísk +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norsk +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Ungversk +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Austurrísk +STR_MAPGEN_TOWN_NAME_ROMANIAN :Rúmensk +STR_MAPGEN_TOWN_NAME_CZECH :Tékknesk +STR_MAPGEN_TOWN_NAME_SWISS :Svissnesk +STR_MAPGEN_TOWN_NAME_DANISH :Dönsk +STR_MAPGEN_TOWN_NAME_TURKISH :Tyrknesk +STR_MAPGEN_TOWN_NAME_ITALIAN :Ítölsk +STR_MAPGEN_TOWN_NAME_CATALAN :Katalónsk + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Hliðar korts: STR_MAPGEN_NORTHWEST :{BLACK}Norðvestur @@ -2818,6 +2812,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Fyrri hr STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Fara á fyrri venjulegu hreyfimynd, sleppir gervi/endurlitun/letur hreyfimyndum og fer aftast í listen þegar upphafi er náð. STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Framsetning á valinni hreyfimynd. Samstillingu er sleppt við teikningu á þessari hreyfimynd. STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Færðu hreyfimyndina, breytir X og Y hliðrun + +###length 2 + + STR_SPRITE_ALIGNER_PICKER_BUTTON :{BLACK}Veldu hreyfimynd STR_SPRITE_ALIGNER_PICKER_TOOLTIP :{BLACK}Veldu hreyfimynd hvaðan sem er af skjánum @@ -3282,6 +3280,8 @@ STR_PURCHASE_INFO_ALL_BUT :Allt nema {CARG STR_PURCHASE_INFO_MAX_TE :{BLACK}Hámarks togkrafur: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Drægni: {GOLD}{COMMA} reitir +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Lestarlisti - smelltu á farartæki fyrir meiri upplýsingar STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Bifreiðalisti - ýttu á bifreið fyrir nánari upplýsingar @@ -3883,12 +3883,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Ein af f STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Aflúsunargluggi gervigreindar/forskriftar er aðeins aðgengilegur á þjóni # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Stilling gervigreindar/forskriftar STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Forskriftin sem verður hlaðin í næsta leik STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}Gervigreindin sem verður hlaðin í næsta leik STR_AI_CONFIG_HUMAN_PLAYER :Mennskur leikmaður STR_AI_CONFIG_RANDOM_AI :Gervigreind af handahófi STR_AI_CONFIG_NONE :(engin) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Hámarksfjöldi keppinauta: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Færa upp STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Færa valda gerfigreind upp listann @@ -3898,8 +3898,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Færa va STR_AI_CONFIG_GAMESCRIPT :{SILVER}Forskrift STR_AI_CONFIG_AI :{SILVER}Gervigreindir -STR_AI_CONFIG_CHANGE :{BLACK}Veldu {STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :gervigreind STR_AI_CONFIG_CHANGE_GAMESCRIPT :Forskrift STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Hlaða annarri forskrift @@ -3923,9 +3921,7 @@ STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Hætta v # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} breytur STR_AI_SETTINGS_CAPTION_AI :Gervigreindar -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Leikja forskriftar STR_AI_SETTINGS_CLOSE :{BLACK}Loka STR_AI_SETTINGS_RESET :{BLACK}Frumstilla STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4324,6 +4320,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Get ekki STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... ökutæki er eyðilagt + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Engin farartæki verða í boði STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Breyta NewGRF stillingunum þínum diff --git a/src/lang/ido.txt b/src/lang/ido.txt index 6e6053e23e..090010e89e 100644 --- a/src/lang/ido.txt +++ b/src/lang/ido.txt @@ -196,6 +196,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}kp STR_UNITS_POWER_METRIC :{COMMA}kp STR_UNITS_POWER_SI :{COMMA}kW + STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}kg @@ -286,7 +287,7 @@ STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Pozez ob STR_SCENEDIT_FILE_MENU_SEPARATOR : # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_FULL_DETAIL :Plene detaloza STR_SETTINGS_MENU_TRANSPARENT_BUILDINGS :Diafana konstrukturi @@ -472,11 +473,6 @@ STR_GAME_OPTIONS_CAPTION :{WHITE}Ludo Sel ###length 42 -###length 2 - - -###length 21 - # Autosave dropdown ###length 5 @@ -497,7 +493,6 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :altra - # Custom currency window @@ -505,7 +500,6 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :altra - STR_NUM_LOW :Basa STR_NUM_NORMAL :Normala STR_NUM_HIGH :Alta @@ -536,6 +530,8 @@ STR_SEA_LEVEL_CUSTOM_PERCENTAGE :Kustumigita ({N ###length 4 +###length 4 + ###length 7 ###length 4 @@ -650,6 +646,8 @@ STR_CONFIG_SETTING_PLANE_CRASHES_NORMAL :normala ###length 2 +###length 2 + @@ -820,8 +818,6 @@ STR_QUIT_NO :{BLACK}Ne # Cheat window -###length 4 - # Livery window @@ -1031,6 +1027,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NovaGRF # World generation STR_MAPGEN_BY :{BLACK}* +###length 21 + # Strings for map borders at game generation @@ -1065,6 +1063,10 @@ STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_RAIL_TYPE :Fervoyo-tipo # Sprite aligner window +###length 2 + + + # NewGRF (self) generated warnings/errors STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING} @@ -1228,6 +1230,8 @@ STR_GROUP_DEFAULT_AIRCRAFTS :Negrupigita aer ###length VEHICLE_TYPES +###length 3 + ###length VEHICLE_TYPES ###length VEHICLE_TYPES @@ -1442,7 +1446,6 @@ STR_AI_DEBUG_NAME_AND_VERSION :{BLACK}{STRING} -STR_AI_CONFIG_CHANGE_NONE : # Available AIs window @@ -1570,6 +1573,7 @@ STR_ERROR_TOO_MANY_VEHICLES_IN_GAME :{WHITE}Tro mult + # Specific vehicle errors diff --git a/src/lang/indonesian.txt b/src/lang/indonesian.txt index 86161e125d..51c210251b 100644 --- a/src/lang/indonesian.txt +++ b/src/lang/indonesian.txt @@ -200,6 +200,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}dk STR_UNITS_POWER_METRIC :{COMMA}{NBSP}dk STR_UNITS_POWER_SI :{COMMA}{NBSP}kW + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -391,10 +392,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Keluar # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Pengaturan permainan STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Pengaturan -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Pengaturan AI / Skrip Permainan STR_SETTINGS_MENU_NEWGRF_SETTINGS :Pengaturan NewGRF STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Pengaturan Transparansi STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Nama kota ditampilkan @@ -965,36 +965,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :India Rupee (IN STR_GAME_OPTIONS_CURRENCY_IDR :Rupiah Indonesia (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Ringgit Malaysia (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Berkendara di lajur kiri -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Berkendara di lajur kanan - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Nama kota: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Pilih model nama kota - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Inggris (Orisinil) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Perancis -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Jerman -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Inggris (Tambahan) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Amerika-Latin -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Lucu -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Swedia -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Belanda -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finlandia -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Polandia -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slovakia -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norwegia -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Hungaria -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Austria -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Romania -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Ceko -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Swiss -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Denmark -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turki -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italia -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Catalan - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Simpan Otomatis STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Pilih selang waktu permainan otomatis disimpan @@ -1027,21 +997,8 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Centang STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Pengendali piranti: {STRING} -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Ukuran antarmuka -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Pilih ukuran elemen antarmuka yang akan digunakan -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(deteksi-otomatis) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Kali dua -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Kali empat -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Ukuran font -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Pilih ukuran font antarmuka yang akan digunakan - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(deteksi-otomatis) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Kali dua -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :4 kali STR_GAME_OPTIONS_GRAPHICS :{BLACK}Grafik @@ -1093,8 +1050,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Contoh: STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 Pound (£) pada mata uang Anda STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Ubah sendiri parameter mata uang -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Jumlah pesaing maksimal: {ORANGE}{COMMA} - STR_NONE :Tidak ada STR_FUNDING_ONLY :Hanya pendanaan STR_MINIMAL :Minimal @@ -1144,6 +1099,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Lanskap 'Sedang' +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Lansekap 'Sub Arktik' +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Lansekap 'Sub Tropis' +STR_CLIMATE_TOYLAND_LANDSCAPE :Lansekap 'Taman Bermain' + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Sangat Datar STR_TERRAIN_TYPE_FLAT :Datar @@ -1503,6 +1464,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Telah ditingkat STR_CONFIG_SETTING_ROAD_SIDE :Kendaraan jalan raya: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Memilih sisi mengemudi +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Berkendara di lajur kiri +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Berkendara di lajur kanan + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Perputaran peta Heightmap: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Melawan arah jam @@ -2037,7 +2002,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Berputar otomat STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Perbolehkan kereta berputar di sinyal, jika telah menunggu lama ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Recommended) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Recommended) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Ganti nilai tetapan @@ -2080,7 +2045,6 @@ STR_INTRO_HIGHSCORE :{BLACK}Tabel Ni STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Pengaturan STR_INTRO_NEWGRF_SETTINGS :{BLACK}Pengaturan NewGRF STR_INTRO_ONLINE_CONTENT :{BLACK}Cari Konten Daring -STR_INTRO_SCRIPT_SETTINGS :{BLACK}Pengaturan Skrip AI/Permainan STR_INTRO_QUIT :{BLACK}Keluar STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Mulai permainan baru. Ctrl-Klik melewatkan konfigurasi peta @@ -2100,7 +2064,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Tampilka STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Tampilkan pengaturan STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Tampilkan pengaturan NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Cari konten baru dan pembaruan untuk diunduh -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Tampilkan pengaturan permainan dan AI STR_INTRO_TOOLTIP_QUIT :{BLACK}Keluar OpenTTD STR_INTRO_BASESET :{BLACK}Kumpulan grafik dasar yang dipilih saat ini hilang {NUM} sprite {P ..}. Silakan periksa pembaruan untuk baseset. @@ -2132,12 +2095,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Ganti t STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Ubah tahun sekarang STR_CHEAT_SETUP_PROD :{LTBLUE}Aktifkan modifikasi nilai produksi: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Lanskap 'Sedang' -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Lansekap 'Sub Arktik' -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Lansekap 'Sub Tropis' -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Lansekap 'Taman Bermain' - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Skema Warna @@ -3140,6 +3097,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Ukuran P STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Pilih ukuran peta dalam petak. Jumlah dari petak yang tersedia akan sedikit lebih kecil STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Jumlah Kota: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Nama kota: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Pilih model nama kota STR_MAPGEN_DATE :{BLACK}Tgl: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Jumlah industri: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Puncak tertinggi: @@ -3155,12 +3114,35 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Kurangi STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Algoritma pulau: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Jenis dataran: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Area perairan: +STR_MAPGEN_SEA_LEVEL :{BLACK}Area perairan: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Sungai: STR_MAPGEN_SMOOTHNESS :{BLACK}Kehalusan: STR_MAPGEN_VARIETY :{BLACK}Macam penyebaran: STR_MAPGEN_GENERATE :{WHITE}Buat Peta +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Inggris (Orisinil) +STR_MAPGEN_TOWN_NAME_FRENCH :Perancis +STR_MAPGEN_TOWN_NAME_GERMAN :Jerman +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Inggris (Tambahan) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Amerika-Latin +STR_MAPGEN_TOWN_NAME_SILLY :Lucu +STR_MAPGEN_TOWN_NAME_SWEDISH :Swedia +STR_MAPGEN_TOWN_NAME_DUTCH :Belanda +STR_MAPGEN_TOWN_NAME_FINNISH :Finlandia +STR_MAPGEN_TOWN_NAME_POLISH :Polandia +STR_MAPGEN_TOWN_NAME_SLOVAK :Slovakia +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norwegia +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Hungaria +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Austria +STR_MAPGEN_TOWN_NAME_ROMANIAN :Romania +STR_MAPGEN_TOWN_NAME_CZECH :Ceko +STR_MAPGEN_TOWN_NAME_SWISS :Swiss +STR_MAPGEN_TOWN_NAME_DANISH :Denmark +STR_MAPGEN_TOWN_NAME_TURKISH :Turki +STR_MAPGEN_TOWN_NAME_ITALIAN :Italia +STR_MAPGEN_TOWN_NAME_CATALAN :Catalan + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Jenis Tepi Peta: STR_MAPGEN_NORTHWEST :{BLACK}Barat Laut @@ -3305,6 +3287,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Sprite s STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Lanjutkan ke sprite normal sebelumnya, lewati sembarang sprite bayangan/warna ulang/huruf dan pembungkus saat mulai STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Mewakili sprite yang sedang dipilih. Penjajaran diabaikan ketika sprite ini digambar STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Pindahkan sprite, mengubah offset X dan Y + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Reset relatif STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Reset offset relatif saat ini STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X offset: {NUM}, Y offset: {NUM} (Absolute) @@ -3644,7 +3630,6 @@ STR_FINANCES_SECTION_OTHER :{GOLD}Lainnya STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} -STR_FINANCES_NET_PROFIT :{WHITE}Laba bersih STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Saldo Bank STR_FINANCES_OWN_FUNDS_TITLE :{WHITE}Dana Pribadi STR_FINANCES_LOAN_TITLE :{WHITE}Pinjaman @@ -3872,6 +3857,8 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Traksi M STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Jangkauan: {GOLD}{COMMA} kotak STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Jenis pesawat: {GOLD}{STRING} +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Daftar pilihan kereta - klik pada kereta untuk menampilkan informasi STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Daftar pilihan kendaraan - klik pada kendaraan untuk menampilkan informasi @@ -4532,12 +4519,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Salah sa STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Jendela "Debug" skrip AI hanya tersedia untuk server # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Konfigurasi AI STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Skrip Permainan yang akan di jalankan di permainan berikutnya STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}AI yg akan dijalankan pada permainan berikutnya STR_AI_CONFIG_HUMAN_PLAYER :Pemain Manusia STR_AI_CONFIG_RANDOM_AI :AI Acak STR_AI_CONFIG_NONE :(tidak ada) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Jumlah pesaing maksimal: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Naikkan STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Naikkan AI terpilih dalam daftar @@ -4547,8 +4534,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Turunkan STR_AI_CONFIG_GAMESCRIPT :{SILVER}Skrip Permainan STR_AI_CONFIG_AI :{SILVER}AI -STR_AI_CONFIG_CHANGE :{BLACK}Pilih {STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :AI STR_AI_CONFIG_CHANGE_GAMESCRIPT :Skrip Permainan STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Muat skrip yang lain @@ -4579,9 +4564,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Tangkapa STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Tangkapan layar minimap # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameter STR_AI_SETTINGS_CAPTION_AI :AI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Skrip Permainan STR_AI_SETTINGS_CLOSE :{BLACK}Tutup STR_AI_SETTINGS_RESET :{BLACK}Reset STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4998,6 +4981,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Tidak da STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... kendaraan hancur + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Tak satupun kendaraan tersedia STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Tukarkan konfigurasi NewGRF anda STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Belum ada kendaraan yang tersedia saat ini diff --git a/src/lang/irish.txt b/src/lang/irish.txt index 017773040a..3a97809b0d 100644 --- a/src/lang/irish.txt +++ b/src/lang/irish.txt @@ -200,6 +200,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}hp STR_UNITS_POWER_METRIC :{COMMA}hp STR_UNITS_POWER_SI :{COMMA}{NBSP}kW + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}kg @@ -391,10 +392,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Scoir # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Roghanna an chluiche STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Socruithe -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Socruithe AI/Scripteanna cluiche STR_SETTINGS_MENU_NEWGRF_SETTINGS :Socruithe NewGRF STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Roghanna trédhearcachta STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Taispeántar ainmneacha bailte @@ -965,36 +965,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Rúipí na hInd STR_GAME_OPTIONS_CURRENCY_IDR :Rupiah na hIndinéise (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Ringgit na Malaeisia (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Tiomáin ar chlé -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Tiomáin ar dheis - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Ainmneacha na mbailte: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Roghnaigh stíl d'ainmneacha na mbailte - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Béarla (Bunaidh) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Fraincis -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Gearmáinis -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Béarla (Breise) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Meiriceá Laidineach -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Áiféiseach -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Sualainnis -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Ollainnis -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Fionlainnis -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Polainnis -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slováicis -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Ioruais -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Ungárach -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Ostarach -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Rómánach -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Seiceach -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Eilvéiseach -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Danmhargach -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turcach -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Iodálach -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Catalónach - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Uathshábháil STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Roghnaigh eatramh idir uathshábhálacha an chluiche @@ -1026,21 +996,8 @@ STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Cuir tic sa bhosca seo chun v-shioncronú (v-sync) a úsáid ar an scáileán. Má athraítear an socrú seo, ní chuirfear i bhfeidhm é ach tar éis an cluiche a atosú. Ní oibríonn seo ach amháin má tá luasghéarú crua-earraí cumasaithe -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Méid an chomhéadain -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Roghnaigh méid na heiliminte comhéadain a úsáidfear -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(uath-aimsiú) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Gnáth -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Méid dúbailte -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Méid 4x -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Méid na clófhoirne -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Roghnaigh méid na clófhoirne don chomhéadan a úsáidfear - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(uath-aimsiú) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Gnáthmhéid -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Méid dúbailte -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :4x STR_GAME_OPTIONS_GRAPHICS :{BLACK}Grafaicí @@ -1092,8 +1049,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Réamha STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 Punt (£) i d'airgeadra STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Athraigh paraiméadar d'airgeadra saincheaptha -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Uaslíon na n-iomaitheoirí: {ORANGE}{COMMA} - STR_NONE :Ceann ar bith STR_FUNDING_ONLY :Maoiniú amháin STR_MINIMAL :Íosmhéid @@ -1143,6 +1098,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Tírdhreach measartha +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Tírdhreach fo-artach +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Tírdhreach fo-theochriosach +STR_CLIMATE_TOYLAND_LANDSCAPE :Tírdhreach thír na mbréagán + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :An-réidh STR_TERRAIN_TYPE_FLAT :Réidh @@ -1499,6 +1460,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Feabhsaithe STR_CONFIG_SETTING_ROAD_SIDE :Feithiclí bóthair: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Roghnaigh taobh na tiomána +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Tiomáin ar chlé +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Tiomáin ar dheis + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Rothlú an mhapa airde: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Tuathal @@ -2022,7 +1987,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Aisiompú uatho STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Ceadaigh do thraenacha aisiompú ag comhartha, más rud é go raibh siad ag fanacht ann píosa fada ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Molta) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Molta) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Athraigh luach an tsocraithe @@ -2065,7 +2030,6 @@ STR_INTRO_HIGHSCORE :{BLACK}Tábla n STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Socruithe STR_INTRO_NEWGRF_SETTINGS :{BLACK}Socruithe NewGRF STR_INTRO_ONLINE_CONTENT :{BLACK}Seiceáil Inneachar Ar Líne -STR_INTRO_SCRIPT_SETTINGS :{BLACK}Socruithe AI/Script Cluiche STR_INTRO_QUIT :{BLACK}Scoir STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Tosaigh cluiche nua. Scipeáltar cumrú an léarscáil le Ctrl+Cliceáil @@ -2085,7 +2049,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Taispeá STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Socruithe taispeána STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Taispeáin socruithe NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Seiceáil le haghaidh inneachar nua agus nuashonruithe le híoslódáil -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Taispeáin socruithe AI/Script cluiche STR_INTRO_TOOLTIP_QUIT :{BLACK}Téigh amach as 'OpenTTD' STR_INTRO_BASESET :{BLACK}Tá {NUM} sprít in easnamh sa bhuntacar grafaicí. Seiceáil an bhfuil nuashonruithe ar fáil don bhuntacar. @@ -2117,12 +2080,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Athraig STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Athraigh an bhliain reatha STR_CHEAT_SETUP_PROD :{LTBLUE}Cumasaigh luachanna táirgeachta a athrú: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Tírdhreach measartha -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Tírdhreach fo-artach -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Tírdhreach fo-theochriosach -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Tírdhreach thír na mbréagán - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Scéim Dathanna @@ -3123,6 +3080,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Méid na STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Roghnaigh an méid de na léarscáile i tíleanna. Beidh líon na tíleanna ar fáil a bheith beagán níos lú STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Líon na mbailte: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Ainmneacha na mbailte: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Roghnaigh stíl d'ainmneacha na mbailte STR_MAPGEN_DATE :{BLACK}Dáta: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Líon na dtionscal: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}An beann is airde: @@ -3138,12 +3097,35 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Laghdaig STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Talamh a chruthú: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Cineál tír-raoin: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Leibhéal na farraige: +STR_MAPGEN_SEA_LEVEL :{BLACK}Leibhéal na farraige: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Aibhneacha: STR_MAPGEN_SMOOTHNESS :{BLACK}Míne: STR_MAPGEN_VARIETY :{BLACK}Éagsúlacht: STR_MAPGEN_GENERATE :{WHITE}Cruthaigh +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Béarla (Bunaidh) +STR_MAPGEN_TOWN_NAME_FRENCH :Fraincis +STR_MAPGEN_TOWN_NAME_GERMAN :Gearmáinis +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Béarla (Breise) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Meiriceá Laidineach +STR_MAPGEN_TOWN_NAME_SILLY :Áiféiseach +STR_MAPGEN_TOWN_NAME_SWEDISH :Sualainnis +STR_MAPGEN_TOWN_NAME_DUTCH :Ollainnis +STR_MAPGEN_TOWN_NAME_FINNISH :Fionlainnis +STR_MAPGEN_TOWN_NAME_POLISH :Polainnis +STR_MAPGEN_TOWN_NAME_SLOVAK :Slováicis +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Ioruais +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Ungárach +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Ostarach +STR_MAPGEN_TOWN_NAME_ROMANIAN :Rómánach +STR_MAPGEN_TOWN_NAME_CZECH :Seiceach +STR_MAPGEN_TOWN_NAME_SWISS :Eilvéiseach +STR_MAPGEN_TOWN_NAME_DANISH :Danmhargach +STR_MAPGEN_TOWN_NAME_TURKISH :Turcach +STR_MAPGEN_TOWN_NAME_ITALIAN :Iodálach +STR_MAPGEN_TOWN_NAME_CATALAN :Catalónach + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Taobhanna na léarscáile: STR_MAPGEN_NORTHWEST :{BLACK}Iarthuaisceart @@ -3288,6 +3270,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Sprite r STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Téigh ar aghaigh chuig an gnáth-sprite roimhe, ag scipeáil thar aon bhréag-sprite nó sprite athdathaithe/clófhoirne agus ag timfhilleadh ag an tús STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Léiriú den sprite atá roghnaithe faoi láthair. Déantar neamhaird den ailíniú agus an sprite seo á tharraingt STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Bog an sprid timpeall, ag athrú an seach-chur X agus Y. Ctrl+Cliceáil chun an sprid a bhogadh ocht n-aonad ag an am céanna + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Athshocraigh coibhneasta STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Athshocraigh na seach-chuir choibhneasta reatha STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}Seach-chur X: {NUM}, Seach-chur Y: {NUM} (Dearbh-shuíomh) @@ -3843,6 +3829,8 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Iarracht STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Raon: {GOLD}{COMMA} tíl STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Cineál aerárthaigh: {GOLD}{STRING} +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Liosta chun feithicil traenach a roghnú - cliceáil ar fheithicil le faisnéis a fháil STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Liosta chun feithicil bóthair a roghnú - cliceáil ar fheithicil le faisnéis a fháil @@ -4503,12 +4491,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Thuairte STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Níl an fhuinneog Dífhabhtú AI ar fáil ach don fhreastalaí amháin # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Cumrú AI STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}An Script Cluiche a lódálfar sa chéad chluiche eile STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}Na AInna a lódálfar sa chéad chluiche eile STR_AI_CONFIG_HUMAN_PLAYER :Imreoir Daonna STR_AI_CONFIG_RANDOM_AI :AI Randamach STR_AI_CONFIG_NONE :(ceann ar bith) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Uaslíon na n-iomaitheoirí: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Bog Suas STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Bog an AI roghnaithe suas an liosta @@ -4518,8 +4506,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Bog an A STR_AI_CONFIG_GAMESCRIPT :{SILVER}Script Cluiche STR_AI_CONFIG_AI :{SILVER}AInna -STR_AI_CONFIG_CHANGE :{BLACK}Roghnaigh {STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :AI STR_AI_CONFIG_CHANGE_GAMESCRIPT :Script Cluiche STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Lódáil script eile @@ -4550,9 +4536,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Seat sc STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Seat scáileáin den mhion-léarscáil # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}Paraiméadair {STRING} STR_AI_SETTINGS_CAPTION_AI :AI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Script an Chluiche STR_AI_SETTINGS_CLOSE :{BLACK}Dún STR_AI_SETTINGS_RESET :{BLACK}Athshocraigh STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4969,6 +4953,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Ní féi STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... tá an fheithicil scriosta + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Ní bheidh aon fheithicil ar fáil ar chor ar bith STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Athraigh do chumraíocht NewGRF STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Níl aon fheithicil ar fáil fós diff --git a/src/lang/italian.txt b/src/lang/italian.txt index a9e432ddf5..28654db736 100644 --- a/src/lang/italian.txt +++ b/src/lang/italian.txt @@ -202,6 +202,16 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}hp STR_UNITS_POWER_METRIC :{COMMA}{NBSP}hp STR_UNITS_POWER_SI :{COMMA}{NBSP}kW +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_SI :{DECIMAL}{NBSP}hp/Mg +STR_UNITS_POWER_METRIC_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_SI :{DECIMAL}{NBSP}hp/Mg +STR_UNITS_POWER_SI_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_SI :{DECIMAL}{NBSP}W/kg + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -380,7 +390,7 @@ STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Costruzi STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Costruzione tranvie STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Pianta alberi. MAIUSC alterna fra costruzione e stima dei costi STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Posiziona cartello -STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Posiziona oggetto. MAIUSC alterna fra costruzione e stima dei costi +STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Posizionare l'oggetto. Ctrl seleziona l'area in diagonale. Maiuscole alterna la costruzione/visualizzazione della stima dei costi. # Scenario editor file menu ###length 7 @@ -393,10 +403,11 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Esci # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Opzioni gioco STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Impostazioni -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Impostazioni IA e Script +STR_SETTINGS_MENU_AI_SETTINGS :Impostazioni IA +STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :Impostazioni script di gioco STR_SETTINGS_MENU_NEWGRF_SETTINGS :Impostazioni NewGRF STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Opzioni trasparenza STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Mostra nomi città @@ -967,36 +978,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Rupia indiana ( STR_GAME_OPTIONS_CURRENCY_IDR :Rupia indonesiana (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Ringgit malaysiano (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Guida a sinistra -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Guida a destra - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Nomi città: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Seleziona lo stile per i nomi delle città - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Inglesi (originali) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Francesi -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Tedeschi -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Inglesi (aggiuntivi) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Latino-americani -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Sciocchi -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Svedesi -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Olandesi -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finlandesi -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Polacchi -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slovacchi -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norvegesi -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Ungheresi -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Austriaci -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Rumeni -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Cechi -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Svizzeri -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Danesi -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turchi -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italiani -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Catalani - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Salvataggi automatici STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Seleziona l'intervallo fra i salvataggi automatici della partita @@ -1029,21 +1010,19 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Selezion STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Driver attuale: {STRING} -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Dimensione interfaccia -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Seleziona la dimensione deglie elementi dell'interfaccia grafica +STR_GAME_OPTIONS_GUI_SCALE_FRAME :{BLACK}Dimensione dell'interfaccia +STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Trascinare il cursore per impostare le dimensioni dell'interfaccia. Tenere premuto Ctrl per una regolazione permanente +STR_GAME_OPTIONS_GUI_SCALE_AUTO :{BLACK}Rileva automaticamente le dimensioni +STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Seleziona questa casella per rilevare automaticamente le dimensioni dell'interfaccia -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(rileva automaticamente) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normale -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Doppia -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Quadrupla +STR_GAME_OPTIONS_GUI_SCALE_BEVELS :{BLACK}Scala smussature +STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :{BLACK}Seleziona questa casella per ridimensionare le smussature in base alle dimensioni dell'interfaccia -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Dimensione caratteri -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Seleziona la dimensione dei caratteri dell'interfaccia - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(rileva automaticamente) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normale -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Doppia -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Quadrupla +STR_GAME_OPTIONS_GUI_SCALE_1X :1x +STR_GAME_OPTIONS_GUI_SCALE_2X :2x +STR_GAME_OPTIONS_GUI_SCALE_3X :3x +STR_GAME_OPTIONS_GUI_SCALE_4X :4x +STR_GAME_OPTIONS_GUI_SCALE_5X :5x STR_GAME_OPTIONS_GRAPHICS :{BLACK}Grafica @@ -1095,8 +1074,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Antepri STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}L'equivalente di 10.000 Sterline (£) nella valuta STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Cambia i parametri della valuta personalizzata -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Numero massimo di avversari: {ORANGE}{COMMA} - STR_NONE :Nessuno STR_FUNDING_ONLY :Solo finanziate STR_MINIMAL :Minimo @@ -1158,6 +1135,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Paesaggio "temperato" +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Paesaggio "subartico" +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Paesaggio "subtropicale" +STR_CLIMATE_TOYLAND_LANDSCAPE :Paesaggio 'città dei giocattoli' + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Molto pianeggiante STR_TERRAIN_TYPE_FLAT :Pianeggiante @@ -1484,6 +1467,8 @@ STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Larghezza delle 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 :Viene aggiunta una riga di testo alla finestra di costruzione dei veicoli, che specifica da quale NewGRF proviene il veicolo selezionato. +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS :Mostrare i carichi che i veicoli possono trasportare nella finestra dell'elenco veicoli. {STRING} +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS_HELPTEXT :Se abilitato, il carico trasportabile dal veicolo apparirà sopra di esso nell'elenco dei veicoli della compagnia. STR_CONFIG_SETTING_LANDSCAPE :Paesaggio: {STRING} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :I paesaggi definiscono scenari predefiniti di gioco. Differiscono per i carichi disponibili e per i requisiti di crescita delle città. Tuttavia NewGRF e Script offrono possibilità di controllo più fine su questi aspetti. @@ -1538,6 +1523,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Migliorato STR_CONFIG_SETTING_ROAD_SIDE :Automezzi: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Seleziona il lato di guida. +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Guida a sinistra +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Guida a destra + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Rotazione heightmap: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Antioraria @@ -2072,7 +2061,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Inversione auto STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Consente ai treni di invertire la marcia dopo aver atteso a lungo a un segnale. ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(raccomandato) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(raccomandato) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Cambia impostazione @@ -2115,7 +2104,8 @@ STR_INTRO_HIGHSCORE :{BLACK}Punteggi STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Impostazioni STR_INTRO_NEWGRF_SETTINGS :{BLACK}Impostazioni NewGRF STR_INTRO_ONLINE_CONTENT :{BLACK}Contenuti online -STR_INTRO_SCRIPT_SETTINGS :{BLACK}Impostazioni IA e Script +STR_INTRO_AI_SETTINGS :{BLACK}Impostazioni IA +STR_INTRO_GAMESCRIPT_SETTINGS :{BLACK}Impostazioni script di gioco STR_INTRO_QUIT :{BLACK}Esci STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Inizia una nuova partita. CTRL salta la configurazione della mappa. @@ -2135,7 +2125,8 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Mostra l STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Mostra le impostazioni STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Mostra le impostazioni NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Controlla la disponibilità di contenuti nuovi o aggiornati da scaricare -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Mostra le impostazioni delle IA e degli Script +STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Mostra impostazioni IA +STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Visualizza le impostazioni dello script di gioco STR_INTRO_TOOLTIP_QUIT :{BLACK}Esci da OpenTTD STR_INTRO_BASESET :{BLACK}Nel pacchetto grafico di base attualmente selezionato mancano {NUM} sprite. È consigliabile controllare gli aggiornamenti del pacchetto. @@ -2167,12 +2158,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Cambia STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Cambia l'anno corrente STR_CHEAT_SETUP_PROD :{LTBLUE}Permetti la modifica dei valori di produzione: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Paesaggio "temperato" -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Paesaggio "subartico" -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Paesaggio "subtropicale" -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Paesaggio 'città dei giocattoli' - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Schema colori @@ -2532,13 +2517,13 @@ STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :in attesa di ag STR_NETWORK_MESSAGE_CLIENT_LEAVING :abbandono della partita STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} è entrato nella partita -STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {STRING} è entrato nella partita (Client #{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} ha iniziato a controllare la compagnia #{2:NUM} +STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {0:STRING} è entrato nella partita (Client #{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {0:STRING} è entrato a far parte della compagnia #{2:NUM} STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} è diventato spettatore -STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} ha avviato una nuova compagnia (#{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} ha abbandonato la partita ({2:STRING}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {0:STRING} ha fondato una nuova compagnia (#{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {0:STRING} ha abbandonato la partita ({2:STRING}) STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} ha cambiato il loro nome in {STRING} -STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} ha dato {2:CURRENCY_LONG} a {1:STRING} +STR_NETWORK_MESSAGE_GIVE_MONEY :*** {0:STRING} ha dato {2:CURRENCY_LONG} a {1:STRING} STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}Il server ha chiuso la sessione STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Il server si sta riavviando...{}Attendere prego... STR_NETWORK_MESSAGE_KICKED :*** {STRING} è stato espulso. Motivo: ({STRING}) @@ -2655,6 +2640,9 @@ STR_LINKGRAPH_LEGEND_SATURATED :{TINY_FONT}{BLA STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLACK}sovraccarica # Linkgraph tooltip +STR_LINKGRAPH_STATS_TOOLTIP :{BLACK}{CARGO_LONG} da trasportare al mese da {STATION} a {STATION} ({COMMA}% di capacità){STRING} +STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} da trasportare indietro ({COMMA}% di capacità) +STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}tempo medio di percorrenza: {NUM}{NBSP}giorn{P "o" i} # Base for station construction window(s) STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Evidenzia area coperta @@ -2664,6 +2652,7 @@ STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP :{BLACK}Non evid STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP :{BLACK}Evidenzia l'area di copertura del sito proposto STR_STATION_BUILD_ACCEPTS_CARGO :{BLACK}Accetta: {GOLD}{CARGO_LIST} STR_STATION_BUILD_SUPPLIES_CARGO :{BLACK}Fornisce: {GOLD}{CARGO_LIST} +STR_STATION_BUILD_INFRASTRUCTURE_COST :{BLACK}Costi di manutenzione: {GOLD}{CURRENCY_SHORT}/anno # Join station window STR_JOIN_STATION_CAPTION :{WHITE}Unisci stazione @@ -2855,11 +2844,11 @@ STR_LANDSCAPING_TOOLBAR :{WHITE}Modellaz STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}Abbassa un angolo di terreno. Trascinando, l'area selezionata viene livellata alla nuova quota del primo angolo. CTRL seleziona l'area diagonalmente. MAIUSC alterna fra costruzione e stima dei costi STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND :{BLACK}Alza un angolo di terreno. Trascinando, l'area selezionata viene livellata alla nuova quota del primo angolo. CTRL seleziona l'area diagonalmente. MAIUSC alterna fra costruzione e stima dei costi STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Livella un'area di terreno alla quota del primo angolo selezionato. CTRL seleziona l'area diagonalmente. MAIUSC alterna fra costruzione e stima dei costi -STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Acquista terreno per usi futuri. MAIUSC alterna fra costruzione e stima dei costi +STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Acquista terreno per usi futuri. Ctrl seleziona l'area in diagonale. MAIUSC alterna la costruzione/visualizzazione della stima dei costi. # Object construction window STR_OBJECT_BUILD_CAPTION :{WHITE}Selezione oggetto -STR_OBJECT_BUILD_TOOLTIP :{BLACK}Seleziona l'oggetto da costruire. MAIUSC alterna fra costruzione e stima dei costi +STR_OBJECT_BUILD_TOOLTIP :{BLACK}Seleziona l'oggetto da costruire. Ctrl seleziona l'area in diagonale. MAIUSC alterna la costruzione/visualizzazione della stima dei costi STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}Seleziona la classe dell'oggetto da costruire STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}Anteprima dell'oggetto STR_OBJECT_BUILD_SIZE :{BLACK}Dimensione: {GOLD}{NUM} x {NUM} caselle @@ -2903,6 +2892,8 @@ STR_FOUND_TOWN_RANDOM_TOWN_BUTTON :{BLACK}Città c STR_FOUND_TOWN_RANDOM_TOWN_TOOLTIP :{BLACK}Fonda una città in una posizione casuale STR_FOUND_TOWN_MANY_RANDOM_TOWNS :{BLACK}Alcune città casuali STR_FOUND_TOWN_RANDOM_TOWNS_TOOLTIP :{BLACK}Copre la mappa con città posizionate casualmente +STR_FOUND_TOWN_EXPAND_ALL_TOWNS :{BLACK}Espandi tutte le città +STR_FOUND_TOWN_EXPAND_ALL_TOWNS_TOOLTIP :{BLACK}Fa crescere leggermente tutte le città STR_FOUND_TOWN_NAME_TITLE :{YELLOW}Nome città: STR_FOUND_TOWN_NAME_EDITOR_TITLE :{BLACK}Inserire il nome della città @@ -3181,6 +3172,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Area map STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Seleziona l'area della mappa espressa in caselle. Il numero effettivo di caselle disponibili sarà leggermente inferiore STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Numero città: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Nomi città: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Seleziona lo stile per i nomi delle città STR_MAPGEN_DATE :{BLACK}Data: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Numero industrie: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Picco massimo: @@ -3196,11 +3189,40 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Diminuis STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Generatore: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Tipo di terreno: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Livello di mare: +STR_MAPGEN_SEA_LEVEL :{BLACK}Livello di mare: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Fiumi: STR_MAPGEN_SMOOTHNESS :{BLACK}Levigatezza: STR_MAPGEN_VARIETY :{BLACK}Varietà del terreno: STR_MAPGEN_GENERATE :{WHITE}Genera +STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}Impostazioni NewGRF +STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Mostra impostazioni NewGRF +STR_MAPGEN_AI_SETTINGS :{BLACK}Impostazioni IA +STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Mostra impostazioni IA +STR_MAPGEN_GS_SETTINGS :{BLACK}Impostazioni script di gioco +STR_MAPGEN_GS_SETTINGS_TOOLTIP :BLACK}Visualizza le impostazioni dello script di gioco + +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Inglesi (originali) +STR_MAPGEN_TOWN_NAME_FRENCH :Francesi +STR_MAPGEN_TOWN_NAME_GERMAN :Tedeschi +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Inglesi (aggiuntivi) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Latino-americani +STR_MAPGEN_TOWN_NAME_SILLY :Sciocchi +STR_MAPGEN_TOWN_NAME_SWEDISH :Svedesi +STR_MAPGEN_TOWN_NAME_DUTCH :Olandesi +STR_MAPGEN_TOWN_NAME_FINNISH :Finlandesi +STR_MAPGEN_TOWN_NAME_POLISH :Polacchi +STR_MAPGEN_TOWN_NAME_SLOVAK :Slovacchi +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norvegesi +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Ungheresi +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Austriaci +STR_MAPGEN_TOWN_NAME_ROMANIAN :Rumeni +STR_MAPGEN_TOWN_NAME_CZECH :Cechi +STR_MAPGEN_TOWN_NAME_SWISS :Svizzeri +STR_MAPGEN_TOWN_NAME_DANISH :Danesi +STR_MAPGEN_TOWN_NAME_TURKISH :Turchi +STR_MAPGEN_TOWN_NAME_ITALIAN :Italiani +STR_MAPGEN_TOWN_NAME_CATALAN :Catalani # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Bordi della mappa: @@ -3346,6 +3368,13 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Preceden STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Procede al precedente sprite normale, saltanto qualsiasi sprite speciale, di ricoloramento o carattere e tornando all'ultimo se viene raggiunto il primo della lista STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Rappresentazione dello sprite corrente. L'allineamento viene ignorato in questa casella. STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Sposta lo sprite, cambiando gli spiazzamenti X e Y. CTRL+clic sposta lo sprite di otto unità alla volta + +###length 2 +STR_SPRITE_ALIGNER_CENTRE_OFFSET :{BLACK}Spiazzamento del centro +STR_SPRITE_ALIGNER_CENTRE_SPRITE :{BLACK}Sprite centrato + +STR_SPRITE_ALIGNER_CROSSHAIR :{BLACK}Mirino + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Reimposta posizione relativa STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Reimposta gli spiazzamenti relativi attuali STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}Posizione X: {NUM}, Y: {NUM} (assoluto) @@ -3363,15 +3392,15 @@ STR_NEWGRF_ERROR_MSG_FATAL :{RED}Errore irr STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Si è verificato un errore irreversibile nel NewGRF:{}{STRING} STR_NEWGRF_ERROR_POPUP :{WHITE}Si è verificato un errore in un NewGRF:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} non funziona con la versione di TTDPatch riferita da OpenTTD -STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} è per la versione {STRING} di TTD -STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} è progettato per essere usato con {STRING} -STR_NEWGRF_ERROR_INVALID_PARAMETER :Parametro non valido per {1:STRING}: parametro {STRING} ({NUM}) -STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} deve essere caricato prima di {STRING} -STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} deve essere caricato dopo {STRING} -STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} richiede OpenTTD versione {STRING} o superiore +STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} è per la versione {2:STRING} di TTD +STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} è progettato per essere usato con {2:STRING} +STR_NEWGRF_ERROR_INVALID_PARAMETER :Parametro non valido per {1:STRING}: parametro {2:STRING} ({3:NUM}) +STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} deve essere caricato prima di {2:STRING} +STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} deve essere caricato dopo {2:STRING} +STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} richiede la versione {2:STRING} o superiore di OpenTTD STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :il file GRF che era progettato per tradurre STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Troppi NewGRF caricati -STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Caricare {1:STRING} come NewGRF statico insieme a {STRING} può causare errori di sincronizzazione +STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Caricare {1:STRING} come NewGRF statico insieme a {2:STRING} può causare errori di sincronizzazione STR_NEWGRF_ERROR_UNEXPECTED_SPRITE :Sprite inatteso (sprite {3:NUM}) STR_NEWGRF_ERROR_UNKNOWN_PROPERTY :Proprietà {4:HEX} sconosciuta per l'azione 0 (sprite {3:NUM}) STR_NEWGRF_ERROR_INVALID_ID :Tentativo di utilizzare un ID non valido (sprite {3:NUM}) @@ -3503,14 +3532,14 @@ STR_LOCAL_AUTHORITY_ACTION_EXCLUSIVE_TRANSPORT :Acquista esclus STR_LOCAL_AUTHORITY_ACTION_BRIBE :Corrompi l'autorità locale ###length 8 -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{YELLOW}Inizia una piccola campagna pubblicitaria, per attirare più passeggeri e merci ai servizi di trasporto della compagnia.{}Fornisce un aumento temporaneo della valutazione delle stazioni in un piccolo raggio dal centro della città.{}Costo: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{YELLOW}Inizia una campagna pubblicitaria moderata, per attirare più passeggeri e merci ai servizi di trasporto della compagnia.{}Fornisce un aumento temporaneo della valutazione delle stazioni in un moderato raggio dal centro della città.{}Costo: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{YELLOW}Inizia una grande campagna pubblicitaria locale, per attirare più passeggeri e merci ai servizi di trasporto della compagnia.{}Fornisce un aumento temporaneo della valutazione delle stazioni in un grande raggio dal centro della città.{}Costo: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{YELLOW}Finanzia la ricostruzione della rete stradale cittadina.{}Causa un considerevole disagio al traffico stradale per 6 mesi.{}Costo: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{YELLOW}Costruisci una statua in onore della compagnia.{}Fornisce un aumento permanente della valutazione delle stazioni in questa città.{}Costo: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{YELLOW}Finanzia la costruzione di nuovi edifici nella città.{}Fornisce un aumento temporaneo della crescita della città.{}Costo: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW}Acquista un anno di diritti di trasporto esclusivi in città. L'autorità cittadina non permetterà a passeggeri e merci di usare le stazioni dei tuoi avversari.{}Costo: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Corrompi l'autorità locale per aumentare la tua valutazione, con il rischio di una severa multa se scoperto.{}Costo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{YELLOW}Iniziate una piccola campagna pubblicitaria locale per attirare più passeggeri e merci sui vostri servizi di trasporto..{}Fornisce un incremento temporane alla valutazione delle stazioni in un piccolo raggio intorno al centro città..{}{POP_COLOUR}Costo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{PUSH_COLOUR}{YELLOW}Avvia una campagna pubblicitaria a livello locale per attirare un maggior numero di passeggeri e merci sui vostri servizi di trasporto..{}Fornisce un incremento temporaneo alla valutazione delle stazioni in un raggio medio intorno al centro città..{}{POP_COLOUR}Costo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}Avvia una vasta campagna pubblicitaria locale, per attirare più passeggeri e merci sui vostri servizi di trasporto.{}Fornisce un incremento temporaneo alla valutazione delle stazioni in un ampio raggio intorno al centro città..{}{POP_COLOUR}Costo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{PUSH_COLOUR}{YELLOW}Finanziare la ricostruzione della rete stradale urbana.{}Provoca notevoli disagi al traffico stradale per un periodo fino a 6 mesi.{}{POP_COLOUR}Costo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Costruite una statua in onore della vostra compagnia.{}Fornisce un aumento permanente della valutazione della stazione in questa città..{}{POP_COLOUR}Costo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Finanziare la costruzione di nuovi edifici in città.{}Fornisce un incremento temporaneo alla crescita di questa città.{}{POP_COLOUR}Costo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}Acquistate 1 anno di diritti esclusivi di trasporto in città..{}Le autorità cittadine non permetteranno a passeggeri e merci di utilizzare le stazioni dei vostri concorrenti..{}{POP_COLOUR}Costo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Corrompere l'autorità locale per aumentare la valutazione, con il rischio di una severa sanzione se si viene scoperti.{}{POP_COLOUR}Costo: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}Obiettivi della {COMPANY} @@ -3683,16 +3712,18 @@ STR_FINANCES_SECTION_SHIP_REVENUE :{GOLD}Navi STR_FINANCES_SECTION_LOAN_INTEREST :{GOLD}Int. sul prestito STR_FINANCES_SECTION_OTHER :{GOLD}Altro +STR_FINANCES_TOTAL_CAPTION :{WHITE}Totale STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} STR_FINANCES_ZERO_INCOME :{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} -STR_FINANCES_NET_PROFIT :{WHITE}Profitto netto +STR_FINANCES_PROFIT :{WHITE}Profitto STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Saldo bancario STR_FINANCES_OWN_FUNDS_TITLE :{WHITE}Capitale netto STR_FINANCES_LOAN_TITLE :{WHITE}Prestito STR_FINANCES_INTEREST_RATE :{WHITE}Interesse sul prestito: {BLACK}{NUM}% STR_FINANCES_MAX_LOAN :{WHITE}Prestito massimo: {BLACK}{CURRENCY_LONG} STR_FINANCES_TOTAL_CURRENCY :{BLACK}{CURRENCY_LONG} +STR_FINANCES_BANK_BALANCE :{WHITE}{CURRENCY_LONG} STR_FINANCES_BORROW_BUTTON :{BLACK}Chiedi in prestito {CURRENCY_LONG} STR_FINANCES_BORROW_TOOLTIP :{BLACK}Aumenta l'ammontare del prestito, CTRL+clic chiede in prestito il più possibile STR_FINANCES_REPAY_BUTTON :{BLACK}Ripaga {CURRENCY_LONG} @@ -3793,7 +3824,7 @@ STR_INDUSTRY_VIEW_PRODUCES_N_CARGO :{BLACK}Produce: STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :, {STRING}{STRING} STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Richiede: -STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{0:STRING}{BLACK}{3:STRING} STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} in attesa{STRING} STR_CONFIG_GAME_PRODUCTION :{WHITE}Cambia produzione (multiplo di 8, fino a 2040) @@ -3823,6 +3854,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Invia is STR_VEHICLE_LIST_REPLACE_VEHICLES :Rimpiazza veicoli STR_VEHICLE_LIST_SEND_FOR_SERVICING :Manutenzione STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Profitto quest'anno: {CURRENCY_LONG} (anno scorso: {CURRENCY_LONG}) +STR_VEHICLE_LIST_CARGO :{TINY_FONT}{BLACK}[{CARGO_LIST}] +STR_VEHICLE_LIST_NAME_AND_CARGO :{TINY_FONT}{BLACK}{STRING} {STRING} STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Manda al deposito STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Manda al deposito @@ -3865,7 +3898,7 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Rimuovi tutti i STR_GROUP_RENAME_CAPTION :{BLACK}Rinomina un gruppo -STR_GROUP_PROFIT_THIS_YEAR :Profitto di quest'anno: +STR_GROUP_PROFIT_THIS_YEAR :Profitto anno corrente: STR_GROUP_PROFIT_LAST_YEAR :Profitto dell'anno scorso: STR_GROUP_OCCUPANCY :Utilizzo corrente: STR_GROUP_OCCUPANCY_VALUE :{NUM}% @@ -3914,6 +3947,11 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Sforzo d STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Autonomia: {GOLD}{COMMA} casell{P a e} STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Tipo di aeromobile: {GOLD}{STRING} +###length 3 +STR_CARGO_TYPE_FILTER_ALL :Tutti i tipi di carico +STR_CARGO_TYPE_FILTER_FREIGHT :Merci +STR_CARGO_TYPE_FILTER_NONE :Nessun carico + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Elenco di selezione dei veicoli ferroviari - fare clic su un veicolo per informazioni. CTRL+clic mostra/nasconde il tipo di veicolo STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Elenco selezione automezzi - fare clic su un veicolo per informazioni. CTRL+clic mostra/nasconde il tipo di automezzo @@ -4082,7 +4120,7 @@ STR_ENGINE_PREVIEW_AIRCRAFT :{G=m}aeromobile STR_ENGINE_PREVIEW_SHIP :{G=f}nave STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Costo: {CURRENCY_LONG} Peso: {WEIGHT_SHORT}{}Velocità: {VELOCITY} Potenza: {POWER}{}Costo di esercizio: {CURRENCY_LONG}/anno{}Capacità: {CARGO_LONG} -STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Costo: {CURRENCY_LONG} Peso: {WEIGHT_SHORT}{}Velocità: {VELOCITY} Potenza: {POWER} S.T. max.: {6:FORCE}{}Costo di esercizio: {4:CURRENCY_LONG}/anno{}Capacità: {5:CARGO_LONG} +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Costo: {0:CURRENCY_LONG} Peso: {1:WEIGHT_SHORT}{}Velocità: {2:VELOCITY} Potenza: {3:POWER} S.T. Max.: {6:FORCE}{}Costo di esercizio: {4:CURRENCY_LONG}/anno{}Capacità: {5:CARGO_LONG} STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Costo: {CURRENCY_LONG} Velocità max.: {VELOCITY}{}Capacità: {CARGO_LONG}{}Costo di esercizio: {CURRENCY_LONG}/anno STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Costo: {CURRENCY_LONG} Velocità max.: {VELOCITY}{}Tipo aeromobile: {STRING}{}Capacità: {CARGO_LONG}, {CARGO_LONG}{}Costo di esercizio: {CURRENCY_LONG}/anno STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Costo: {CURRENCY_LONG} Velocità max.: {VELOCITY}{}Tipo aeromobile: {STRING}{}Capacità: {CARGO_LONG}{}Costo di esercizio: {CURRENCY_LONG}/anno @@ -4240,13 +4278,14 @@ STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}elocità STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Peso: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potenza: {LTBLUE}{POWER}{BLACK} Velocità max.: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Peso: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potenza: {LTBLUE}{POWER}{BLACK} Velocità max.: {LTBLUE}{VELOCITY} {BLACK}S.T. max.: {LTBLUE}{FORCE} -STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Profitto quest'anno: {LTBLUE}{CURRENCY_LONG} (anno scorso: {CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Profitto anno corrente: {LTBLUE}{CURRENCY_LONG} (anno scorso: {CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Profitti anno corrente: {LTBLUE}{CURRENCY_LONG} (anno scorso: {CURRENCY_LONG}) {BLACK}Prestazione minima: {LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Affidabilità: {LTBLUE}{COMMA}% {BLACK}Guasti dall'ultima manutenzione: {LTBLUE}{COMMA} STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Costruito nel: {LTBLUE}{NUM}{BLACK} Valore: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_INFO_NO_CAPACITY :{BLACK}Capacità: {LTBLUE}Nessuna{STRING} -STR_VEHICLE_INFO_CAPACITY :{BLACK}Capacità: {LTBLUE}{CARGO_LONG}{3:STRING} -STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Capacità: {LTBLUE}{CARGO_LONG}{3:STRING} (x{4:NUM}) +STR_VEHICLE_INFO_CAPACITY :{BLACK}Capacità: {LTBLUE}{0:CARGO_LONG}{3:STRING} +STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Capacità: {LTBLUE}{0:CARGO_LONG}{3:STRING} (x{4:NUM}) STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Capacità: {LTBLUE}{CARGO_LONG}, {CARGO_LONG}{STRING} STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Crediti di trasferimento: {LTBLUE}{CURRENCY_LONG} @@ -4515,22 +4554,22 @@ STR_TIMETABLE_STARTING_DATE :{BLACK}Data ini STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Seleziona una data come punto di partenza della tabella oraria. Ctrl+click distribuisce tutti i veicoli che condividono questo ordine in modo uniforme dalla data indicata in base al loro ordine relativo, se l'ordine è completamente programmato. STR_TIMETABLE_CHANGE_TIME :{BLACK}Cambia tempo -STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Cambia la quantità di tempo che dovrebbe essere impiegata per l'ordine selezionato +STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Cambia la quantità di tempo che dovrebbe essere impiegata per l'ordine selezionato. CTRL+clic imposta il tempo di tutti gli ordini STR_TIMETABLE_CLEAR_TIME :{BLACK}Elimina tempo -STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Elimina l'impostazione della quantità di tempo per l'ordine selezionato +STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Elimina l'impostazione della quantità di tempo per l'ordine selezionato. CTRL+clic la rimuove da tutti gli ordini STR_TIMETABLE_CHANGE_SPEED :{BLACK}Cambia limite di velocità -STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Cambia l'impostazione del limite di velocità per l'ordine selezionato +STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Cambia l'impostazione del limite di velocità per l'ordine selezionato. CTRL+clic lo imposta per tutti gli ordini STR_TIMETABLE_CLEAR_SPEED :{BLACK}Elimina limite di velocità -STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Elimina l'impostazione del limite di velocità per l'ordine selezionato +STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Elimina l'impostazione del limite di velocità per l'ordine selezionato. CTRL+clic rimuove la velocità da tutti gli ordini STR_TIMETABLE_RESET_LATENESS :{BLACK}Azzera ritardo STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Azzera il contatore del ritardo, in modo che il veicolo sia considerato in orario STR_TIMETABLE_AUTOFILL :{BLACK}Auto -STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Riempie automaticamente la tabella oraria con i tempi del prossimo viaggio (CTRL+clic per cercare di mantenere i tempi di attesa) +STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Riempie automaticamente la tabella oraria con i tempi del prossimo viaggio. CTRL+clic per cercare di mantenere i tempi di attesa STR_TIMETABLE_EXPECTED :{BLACK}Orari attesi STR_TIMETABLE_SCHEDULED :{BLACK}Orari programmati @@ -4574,12 +4613,14 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Uno degl STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}La finestra di debug IA/Script è disponibile soltanto per il server # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Configurazione IA e Script +STR_AI_CONFIG_CAPTION_AI :{WHITE}Configurazione IA +STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Configurazione script di gioco STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Lista degli Script che saranno caricati nella prossima partita STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}Lista delle IA che saranno caricate nella prossima partita STR_AI_CONFIG_HUMAN_PLAYER :Giocatore umano STR_AI_CONFIG_RANDOM_AI :IA casuale STR_AI_CONFIG_NONE :(nessuno) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Numero massimo di avversari: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Sposta su STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Sposta l'IA selezionata più in alto nell'elenco @@ -4587,12 +4628,11 @@ STR_AI_CONFIG_MOVE_DOWN :{BLACK}Sposta g STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Sposta l'IA selezionata più in basso nell'elenco STR_AI_CONFIG_GAMESCRIPT :{SILVER}Script +STR_AI_CONFIG_GAMESCRIPT_PARAM :{SILVER}Parametri STR_AI_CONFIG_AI :{SILVER}IA -STR_AI_CONFIG_CHANGE :{BLACK}Seleziona {STRING} -STR_AI_CONFIG_CHANGE_NONE : -STR_AI_CONFIG_CHANGE_AI :IA -STR_AI_CONFIG_CHANGE_GAMESCRIPT :Script +STR_AI_CONFIG_CHANGE_AI :{BLACK}Seleziona IA +STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}Seleziona lo script di gioco STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Carica un altro script STR_AI_CONFIG_CONFIGURE :{BLACK}Configura STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Configura i parametri dello script @@ -4621,9 +4661,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Screensh STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Screenshot della minimappa # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}Parametri {STRING} -STR_AI_SETTINGS_CAPTION_AI :AI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Script +STR_AI_SETTINGS_CAPTION_AI :{WHITE}Parametri IA STR_AI_SETTINGS_CLOSE :{BLACK}Chiudi STR_AI_SETTINGS_RESET :{BLACK}Reimposta STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4787,6 +4825,7 @@ STR_ERROR_TOO_MANY_INDUSTRIES :{WHITE}... trop STR_ERROR_CAN_T_GENERATE_INDUSTRIES :{WHITE}Impossibile generare industrie... STR_ERROR_CAN_T_BUILD_HERE :{WHITE}Impossibile costruire {STRING} qui... STR_ERROR_CAN_T_CONSTRUCT_THIS_INDUSTRY :{WHITE}Impossibile costruire l'industria qui... +STR_ERROR_CAN_T_PROSPECT_INDUSTRY :{WHITE}Non si può eseguire la prospezione... STR_ERROR_INDUSTRY_TOO_CLOSE :{WHITE}... troppo vicina ad un'altra industria STR_ERROR_MUST_FOUND_TOWN_FIRST :{WHITE}... bisogna fondare una città prima STR_ERROR_ONLY_ONE_ALLOWED_PER_TOWN :{WHITE}... ne è ammessa solo una per città @@ -4801,6 +4840,8 @@ STR_ERROR_FOREST_CAN_ONLY_BE_PLANTED :{WHITE}... una STR_ERROR_CAN_ONLY_BE_BUILT_ABOVE_SNOW_LINE :{WHITE}... può essere costruita solo al di sopra della linea delle nevi perenni STR_ERROR_CAN_ONLY_BE_BUILT_BELOW_SNOW_LINE :{WHITE}... può essere costruita solo al di sotto della linea delle nevi perenni +STR_ERROR_PROSPECTING_WAS_UNLUCKY :{WHITE}Nonostante il finanziamento la prospezione è fallita per sfortunate circostanze; riprova +STR_ERROR_NO_SUITABLE_PLACES_FOR_PROSPECTING :{WHITE}Non c'erano luoghi adatti per la prospezione di questa industria STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES :{WHITE}Nessun luogo adatto per le industrie '{STRING}' STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES_EXPLANATION :{WHITE}Modificare i parametri di generazione delle mappa in modo da ottenerne una migliore @@ -4968,6 +5009,7 @@ STR_ERROR_OBJECT_IN_THE_WAY :{WHITE}Oggetto STR_ERROR_COMPANY_HEADQUARTERS_IN :{WHITE}... sede della compagnia di mezzo STR_ERROR_CAN_T_PURCHASE_THIS_LAND :{WHITE}Impossibile acquistare quest'area di terreno... STR_ERROR_YOU_ALREADY_OWN_IT :{WHITE}... già posseduto! +STR_ERROR_BUILD_OBJECT_LIMIT_REACHED :{WHITE}... limite di costruzione dell'oggetto raggiunto # Group related errors STR_ERROR_GROUP_CAN_T_CREATE :{WHITE}Impossibile creare il gruppo... @@ -5040,6 +5082,8 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Impossib STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... il veicolo è distrutto +STR_ERROR_CAN_T_CLONE_VEHICLE_LIST :{WHITE}... non tutti i veicoli sono identici + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Non sarà disponibile alcun veicolo STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Cambiare i NewGRF configurati STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Non sono ancora disponibili veicoli @@ -5066,6 +5110,8 @@ STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}Impossib STR_ERROR_CAN_T_COPY_SHARE_ORDER :{WHITE}... il veicolo non può utilizzare tutte le stazioni STR_ERROR_CAN_T_ADD_ORDER :{WHITE}... il veicolo non può utilizzare questa stazione STR_ERROR_CAN_T_ADD_ORDER_SHARED :{WHITE}... un veicolo che condivide l'ordine non può utilizzare questa stazione +STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST :{WHITE}... non tutti i veicoli hanno gli stessi ordini +STR_ERROR_CAN_T_SHARE_ORDER_VEHICLE_LIST :{WHITE}... non tutti i veicoli condividono gli ordini STR_ERROR_CAN_T_SHARE_ORDER_LIST :{WHITE}Impossibile condividere la lista degli ordini... STR_ERROR_CAN_T_STOP_SHARING_ORDER_LIST :{WHITE}Impossibile terminare la condivisione degli ordini... diff --git a/src/lang/japanese.txt b/src/lang/japanese.txt index 1f378b63e4..4919630252 100644 --- a/src/lang/japanese.txt +++ b/src/lang/japanese.txt @@ -200,6 +200,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}英馬 STR_UNITS_POWER_METRIC :{COMMA}仏馬力 STR_UNITS_POWER_SI :{COMMA}kW + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}t. STR_UNITS_WEIGHT_SHORT_SI :{COMMA}kg @@ -391,10 +392,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR :――――― STR_SCENEDIT_FILE_MENU_QUIT :OpenTTDを終了 # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :ゲームオプション設定 STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :設定 -STR_SETTINGS_MENU_SCRIPT_SETTINGS :AI/ゲームスクリプト設定 STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRFの設定 STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :透過表示設定 STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :街名を表示 @@ -965,36 +965,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :インド・ル STR_GAME_OPTIONS_CURRENCY_IDR :インドネシア・ルピア(IDR) STR_GAME_OPTIONS_CURRENCY_MYR :マレーシア・リンギット(MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :左側通行 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :右側通行 - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}街の名前: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}街名のスタイルを選択します - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :イギリス -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :フランス -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :ドイツ -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :イギリス(追加) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :ラテンアメリカ -STR_GAME_OPTIONS_TOWN_NAME_SILLY :無邪気の国 -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :スウェーデン -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :オランダ -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :フィンランド -STR_GAME_OPTIONS_TOWN_NAME_POLISH :ポーランド -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :スロバキア -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :ノルウェー -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :ハンガリー -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :オーストリア -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :ルーマニア -STR_GAME_OPTIONS_TOWN_NAME_CZECH :チェコ -STR_GAME_OPTIONS_TOWN_NAME_SWISS :スイス -STR_GAME_OPTIONS_TOWN_NAME_DANISH :デンマーク -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :トルコ -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :イタリア -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :カタラン - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}オートセーブ STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}自動保存の間隔を選択します @@ -1026,21 +996,8 @@ STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK} 垂直 STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}ここをチェックして垂直同期を有効にします。設定はゲームを再起動した後に適用されます。ハードウェアアクセラレーションが有効な環境でしか機能しません。 -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}インターフェイスのサイズ -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}インターフェイス上の単位サイズを指定します -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(自動検出) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :ノーマル -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :2倍 -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :4倍 -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}フォントサイズ -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}使用するインターフェースのフォントサイズを選択します - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(自動検出) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :ノーマル -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :ダブルサイズ -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :4倍 STR_GAME_OPTIONS_GRAPHICS :{BLACK}グラフィクス @@ -1092,8 +1049,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}プレ STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}}£10,000(英ポンド)に対する為替レートを設定します STR_CURRENCY_CHANGE_PARAMETER :{BLACK}カスタム通貨の設定を変更 -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}最大競争会社数: {ORANGE}{COMMA} - STR_NONE :なし STR_FUNDING_ONLY :出資のみ STR_MINIMAL :最小 @@ -1143,6 +1098,12 @@ STR_SUBSIDY_X2 :×2 STR_SUBSIDY_X3 :×3 STR_SUBSIDY_X4 :×4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :温帯 +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :亜寒帯 +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :亜熱帯 +STR_CLIMATE_TOYLAND_LANDSCAPE :おもちゃの国 + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :特に平地 STR_TERRAIN_TYPE_FLAT :平地 @@ -1501,6 +1462,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :改良版 STR_CONFIG_SETTING_ROAD_SIDE :車両: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :左側/右側通行を設定します +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :左側通行 +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :右側通行 + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :ハイトマップの回転方向: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :反時計回り @@ -2029,7 +1994,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :信号待ちで STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :列車が信号で長く待たされた場合、進路を反転することを許可します ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF{BLUE}(おすすめ) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF{BLUE}(おすすめ) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}設定を変更します @@ -2072,7 +2037,6 @@ STR_INTRO_HIGHSCORE :{BLACK}ハイ STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}設定 STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRFの設定 STR_INTRO_ONLINE_CONTENT :{BLACK}オンラインコンテンツの確認 -STR_INTRO_SCRIPT_SETTINGS :{BLACK}AI/ゲームスクリプトの設定 STR_INTRO_QUIT :{BLACK}終了 STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}新規ゲームを開始します。Ctrl+クリックで地形生成設定をスキップします @@ -2092,7 +2056,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}ハイ STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}設定を表示 STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}NewGRFの有効/無効化、各パラメータの設定ができます STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}公式オンラインコンテンツのデータベースからデータの確認・追加・更新ができます -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}AI/ゲームスクリプトの設定を行います STR_INTRO_TOOLTIP_QUIT :{BLACK}OpenTTD を終了します STR_INTRO_BASESET :現在選択されているグラフィックのベースセットは {NUM} つのスプライトが欠けています。ベースセットの更新を確認してみてください。 @@ -2124,12 +2087,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}日付 STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}現在日時を変更 STR_CHEAT_SETUP_PROD :{LTBLUE}生産量変更: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :温帯 -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :亜寒帯 -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :亜熱帯 -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :おもちゃの国 - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - 配色 @@ -3132,6 +3089,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}地図 STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}生成する地図のサイズです。実際にはこのサイズより少し小さくなります STR_MAPGEN_BY :{BLACK}× STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}街数: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}街の名前: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}街名のスタイルを選択します STR_MAPGEN_DATE :{BLACK}日付: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}産業数: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}最高峰: @@ -3147,12 +3106,35 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}砂漠 STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}地形作成: STR_MAPGEN_TERRAIN_TYPE :{BLACK}地形種類: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}海水位: +STR_MAPGEN_SEA_LEVEL :{BLACK}海水位: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}河川: STR_MAPGEN_SMOOTHNESS :{BLACK}地形のなだらかさ: STR_MAPGEN_VARIETY :{BLACK}地形の地域性: STR_MAPGEN_GENERATE :{WHITE}作成 +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :イギリス +STR_MAPGEN_TOWN_NAME_FRENCH :フランス +STR_MAPGEN_TOWN_NAME_GERMAN :ドイツ +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :イギリス(追加) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :ラテンアメリカ +STR_MAPGEN_TOWN_NAME_SILLY :無邪気の国 +STR_MAPGEN_TOWN_NAME_SWEDISH :スウェーデン +STR_MAPGEN_TOWN_NAME_DUTCH :オランダ +STR_MAPGEN_TOWN_NAME_FINNISH :フィンランド +STR_MAPGEN_TOWN_NAME_POLISH :ポーランド +STR_MAPGEN_TOWN_NAME_SLOVAK :スロバキア +STR_MAPGEN_TOWN_NAME_NORWEGIAN :ノルウェー +STR_MAPGEN_TOWN_NAME_HUNGARIAN :ハンガリー +STR_MAPGEN_TOWN_NAME_AUSTRIAN :オーストリア +STR_MAPGEN_TOWN_NAME_ROMANIAN :ルーマニア +STR_MAPGEN_TOWN_NAME_CZECH :チェコ +STR_MAPGEN_TOWN_NAME_SWISS :スイス +STR_MAPGEN_TOWN_NAME_DANISH :デンマーク +STR_MAPGEN_TOWN_NAME_TURKISH :トルコ +STR_MAPGEN_TOWN_NAME_ITALIAN :イタリア +STR_MAPGEN_TOWN_NAME_CATALAN :カタラン + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}地図端: STR_MAPGEN_NORTHWEST :{BLACK}北西 @@ -3297,6 +3279,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}前の STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}前のノーマルスプライトに戻ります。始端と終端は連続しているものとみなし、疑似/リカラー/フォントスプライトはスキップします STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}現在選択されているスプライトの代表絵を示します。この配列はスプライトを描画するときには無視されます STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}X・Yオフセットを変更し、スプライトを移動します + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK} 相対値リセット STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK} 現在の相対オフセットをリセットします。 STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}Xオフセット : {NUM},Yオフセット : {NUM} (絶対値) @@ -3853,6 +3839,8 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}最大 STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}航続距離: {GOLD}{COMMA} タイル STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}航空機の機種: {GOLD}{STRING} +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}列車リスト - 個々の情報を見るには列車をクリックします。Ctrl+クリックでその列車種の表示/非表示を切り替えます STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}車両リスト - 個々の情報を見るには車両をクリックします。Ctrl+クリックでその車両種の表示/非表示を切り替えます @@ -4513,12 +4501,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}実行 STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}AI/ゲームスクリプトのデバッグウインドウはサーバーでのみ使用できます # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}AIの設定 STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}このゲームスクリプトは次のゲーム開始時からロードされます STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}}このAIは次のゲーム開始時からロードされます STR_AI_CONFIG_HUMAN_PLAYER :人間のプレーヤー STR_AI_CONFIG_RANDOM_AI :ランダムなAI STR_AI_CONFIG_NONE :(なし) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}最大競争会社数: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}上に移動 STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}選択したAIの順位を上げる @@ -4528,8 +4516,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}選択 STR_AI_CONFIG_GAMESCRIPT :{SILVER}ゲームスクリプト STR_AI_CONFIG_AI :{SILVER}AI -STR_AI_CONFIG_CHANGE :{BLACK}{STRING}を選択 -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :AI STR_AI_CONFIG_CHANGE_GAMESCRIPT :ゲームスクリプト STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}他のスクリプトをロードします @@ -4560,9 +4546,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}ハイ STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}ミニマップのスクリーンショット # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} パラメータ STR_AI_SETTINGS_CAPTION_AI :AI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :ゲームスクリプト STR_AI_SETTINGS_CLOSE :{BLACK}閉じる STR_AI_SETTINGS_RESET :{BLACK}リセット STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4979,6 +4963,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}点検 STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}輸送機器が破壊されます + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}利用できる輸送機器が全くなくなります STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}NewGRFの設定を変更してください STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}利用可能な輸送機器がありません diff --git a/src/lang/korean.txt b/src/lang/korean.txt index 2ac46f9816..a6dea06c95 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -201,6 +201,16 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}마력 STR_UNITS_POWER_METRIC :{COMMA}마력 STR_UNITS_POWER_SI :{COMMA}kW +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_IMPERIAL :{DECIMAL}마력/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_METRIC :{DECIMAL}마력/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_SI :{DECIMAL}마력/Mg +STR_UNITS_POWER_METRIC_TO_WEIGHT_IMPERIAL :{DECIMAL}마력/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_METRIC :{DECIMAL}마력/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_SI :{DECIMAL}마력/Mg +STR_UNITS_POWER_SI_TO_WEIGHT_IMPERIAL :{DECIMAL}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_METRIC :{DECIMAL}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_SI :{DECIMAL}W/kg + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}kg @@ -392,10 +402,11 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :게임 종료 # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :게임 기본 설정 STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :설정 -STR_SETTINGS_MENU_SCRIPT_SETTINGS :인공지능/게임 스크립트 설정 +STR_SETTINGS_MENU_AI_SETTINGS :인공지능 설정 +STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :게임 스크립트 설정 STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF 설정 STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :투명 설정 STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :도시 이름을 표시함 @@ -966,36 +977,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :인도 루피 ( STR_GAME_OPTIONS_CURRENCY_IDR :인도네시아 루피아 (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :말레이시아 링깃 (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :좌측통행 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :우측통행 - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}도시 이름: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}도시 이름 스타일을 선택하세요 - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :영국 식 (기본) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :프랑스 식 -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :독일 식 -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :영국 식 (추가) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :라틴아메리카 식 -STR_GAME_OPTIONS_TOWN_NAME_SILLY :바보같은 도시 이름 -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :스웨덴 식 -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :네덜란드 식 -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :핀란드 식 -STR_GAME_OPTIONS_TOWN_NAME_POLISH :폴란드 식 -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :슬로바키아 식 -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :노르웨이 식 -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :헝가리 식 -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :오스트리아 식 -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :루마니아 식 -STR_GAME_OPTIONS_TOWN_NAME_CZECH :체코 식 -STR_GAME_OPTIONS_TOWN_NAME_SWISS :스위스 식 -STR_GAME_OPTIONS_TOWN_NAME_DANISH :덴마크 식 -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :터키 식 -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :이탈리아 식 -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :카탈로니아 식 - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}자동 저장 STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}게임 자동 저장 간격을 선택 @@ -1028,21 +1009,19 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}화면 STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}현재 드라이버: {STRING} -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}인터페이스 크기 -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}인터페이스의 크기를 선택합니다. +STR_GAME_OPTIONS_GUI_SCALE_FRAME :{BLACK}인터페이스 크기 +STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}인터페이스 크기를 설정하려면 슬라이더를 드래그하세요. CTRL 키를 누르고 있으면 미세 조정이 가능합니다 +STR_GAME_OPTIONS_GUI_SCALE_AUTO :{BLACK}크기 자동 탐지 +STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}인터페이스 크기를 자동으로 탐지하려면 이 박스에 체크하세요 -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(자동 탐지) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :기본 크기 -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :2배 크기 -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :4배 크기 +STR_GAME_OPTIONS_GUI_SCALE_BEVELS :{BLACK}크기 조절 +STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :{BLACK}인터페이스 크기를 슬라이더로 조절하려면 이 박스에 체크하세요 -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}글씨 크기 -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}인터페이스에서 사용할 글씨 크기를 선택하세요 - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(자동 탐지) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :기본 크기 -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :2배 크기 -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :4배 크기 +STR_GAME_OPTIONS_GUI_SCALE_1X :1x +STR_GAME_OPTIONS_GUI_SCALE_2X :2x +STR_GAME_OPTIONS_GUI_SCALE_3X :3x +STR_GAME_OPTIONS_GUI_SCALE_4X :4x +STR_GAME_OPTIONS_GUI_SCALE_5X :5x STR_GAME_OPTIONS_GRAPHICS :{BLACK}그래픽 @@ -1094,8 +1073,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}미리 STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 파운드(£)에 해당하는 사용자 화폐 단위입니다 STR_CURRENCY_CHANGE_PARAMETER :{BLACK}사용자 화폐 변수 변경 -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}최대 경쟁자수: {ORANGE}{COMMA} - STR_NONE :없음 STR_FUNDING_ONLY :투자만 가능 STR_MINIMAL :최소 @@ -1145,6 +1122,12 @@ STR_SUBSIDY_X2 :2배 지급 STR_SUBSIDY_X3 :3배 지급 STR_SUBSIDY_X4 :4배 지급 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :온대 기후 +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :아한대 기후 +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :아열대 기후 +STR_CLIMATE_TOYLAND_LANDSCAPE :장난감나라 + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :매우 평탄함 STR_TERRAIN_TYPE_FLAT :평탄함 @@ -1232,7 +1215,7 @@ STR_CONFIG_SETTING_RUNNING_COSTS :유지비: {STR STR_CONFIG_SETTING_RUNNING_COSTS_HELPTEXT :차량과 기반시설의 유지비 수준을 설정하십시오 STR_CONFIG_SETTING_CONSTRUCTION_SPEED :건설 속도: {STRING} -STR_CONFIG_SETTING_CONSTRUCTION_SPEED_HELPTEXT :인공지능의 건설 행동량을 제한하여 건설 속도를 조절할 수 있습니다. +STR_CONFIG_SETTING_CONSTRUCTION_SPEED_HELPTEXT :인공지능의 건설 행동량을 제한하여 건설 속도를 조절할 수 있습니다 STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS :차량 고장 빈도수: {STRING} STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT :점검을 제대로 받지 않은 차량이 얼마나 자주 고장나도록 할지를 조절하십시오. @@ -1270,7 +1253,7 @@ STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT_AUTO :(자동) STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN :{WHITE}이 값을 지도 높이 최댓값으로 설정할 수 없습니다. 이 값보다 고도가 높은 산이 최소 한 개 이상 존재합니다. STR_CONFIG_SETTING_AUTOSLOPE :건물, 트랙 등의 하부 지형 편집 허용: {STRING} -STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :건물이나 도로/선로 등을 제거하지 않고도 하부의 지형을 편집할 수 있게 허용합니다. +STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :건물이나 도로/선로 등을 제거하지 않고도 하부의 지형을 편집할 수 있게 허용합니다 STR_CONFIG_SETTING_CATCHMENT :더 현실적인 역세권 지정: {STRING} STR_CONFIG_SETTING_CATCHMENT_HELPTEXT :역과 공항의 종류에 따라 다른 크기의 역세권을 가지도록 만듭니다. @@ -1361,19 +1344,19 @@ STR_CONFIG_SETTING_AUTOSCROLL_MAIN_VIEWPORT :주 게임 화 STR_CONFIG_SETTING_AUTOSCROLL_EVERY_VIEWPORT :모든 화면에서 STR_CONFIG_SETTING_BRIBE :지역 당국에 뇌물을 주는 행위 허용: {STRING} -STR_CONFIG_SETTING_BRIBE_HELPTEXT :회사가 지역 도시 당국에 뇌물을 주는 것을 허용합니다. 뇌물 행위가 적발되는 경우, 회사는 해당 도시에서 6개월간 아무 행동도 할 수 없습니다. +STR_CONFIG_SETTING_BRIBE_HELPTEXT :회사가 지역 도시 당국에 뇌물을 주는 것을 허용합니다. 뇌물 행위가 적발되는 경우, 회사는 해당 도시에서 6개월간 아무 행동도 할 수 없습니다 STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :독점 운송권 구입 허용: {STRING} -STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :한 회사가 어떤 도시의 독점수송권을 구매하면, 그 도시에 있는 상대편의 역에서는 그 해 동안 (승객을 포함한) 그 어떠한 화물도 받을 수 없습니다. +STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :한 회사가 어떤 도시의 독점수송권을 구매하면, 그 도시에 있는 상대편의 역에서는 그 해 동안 (승객을 포함한) 그 어떠한 화물도 받을 수 없습니다 STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS :도시 상업 건물 건설에 투자하는 것을 허용: {STRING} -STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT :회사가 도시가 새로운 건물에 투자할 수 있도록 자금을 주는 것을 허용합니다. +STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT :회사가 도시가 새로운 건물에 투자할 수 있도록 자금을 주는 것을 허용합니다 STR_CONFIG_SETTING_ALLOW_FUND_ROAD :도시 도로 보수공사 시행을 허용: {STRING} -STR_CONFIG_SETTING_ALLOW_FUND_ROAD_HELPTEXT :도로 기반의 수송 체계를 갖추고 있는 다른 회사를 방해하기 위해 해당 도시가 도로 재건축을 시작하도록 회사가 도시에 돈을 지불하는 행위를 허용합니다. +STR_CONFIG_SETTING_ALLOW_FUND_ROAD_HELPTEXT :도로 기반의 수송 체계를 갖추고 있는 다른 회사를 방해하기 위해 해당 도시가 도로 재건축을 시작하도록 회사가 도시에 돈을 지불하는 행위를 허용합니다 STR_CONFIG_SETTING_ALLOW_GIVE_MONEY :다른 회사에게 돈을 송금하는 것을 허용: {STRING} -STR_CONFIG_SETTING_ALLOW_GIVE_MONEY_HELPTEXT :멀티 플레이 모드에서 회사 사이에 돈을 보내는 것을 허용합니다. +STR_CONFIG_SETTING_ALLOW_GIVE_MONEY_HELPTEXT :멀티 플레이 모드에서 회사 사이에 돈을 보내는 것을 허용합니다 STR_CONFIG_SETTING_FREIGHT_TRAINS :화물 무게가중치 (무거운 열차를 구현할 때 사용): {STRING}배 STR_CONFIG_SETTING_FREIGHT_TRAINS_HELPTEXT :열차가 싣고 있는 화물이 열차 속력에 미치는 영향에 대해 설정합니다. 값을 높게 설정하면 화물을 수송하는데 더 큰 힘이 필요합니다. (특히 언덕을 오를 때 심해집니다) @@ -1399,7 +1382,7 @@ STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE :기반시설 STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :이 설정을 켜면, 기반시설 유지비가 발생합니다. 유지비는 교통망의 규모에 비례하며 대형 회사는 소형 회사보다 많은 유지비가 들어갑니다. STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR :시작시 회사 색상: {STRING} -STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_HELPTEXT :새 회사에서 사용할 색상을 선택합니다. +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_HELPTEXT :새 회사에서 사용할 색상을 선택합니다 STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :옛날 공항을 사라지지 않고 계속 만들 수 있게 함: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :이 설정을 켜면, 소형 공항을 포함한 모든 공항 종류를 도입 이후에 계속 사용할 수 있게 됩니다. @@ -1421,7 +1404,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :옛날 차량 STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :이 설정을 켜면, 오래된 차량 모델을 포함하여 모든 차량 모델을 도입 이후에 계속 사용할 수 있게 됩니다. STR_CONFIG_SETTING_AUTORENEW_VEHICLE :차량이 낡으면 차량을 자동으로 교체: {STRING} -STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :이 설정을 켜면, 제한 수명에 다다른 차량이 교체 조건을 만족할 경우 자동으로 차량을 교체할 수 있게 됩니다. +STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :이 설정을 켜면, 제한 수명에 다다른 차량이 교체 조건을 만족할 경우 자동으로 차량을 교체할 수 있게 됩니다 STR_CONFIG_SETTING_AUTORENEW_MONTHS :차량이 최대 수명의 {STRING}이면 자동 교체 STR_CONFIG_SETTING_AUTORENEW_MONTHS_HELPTEXT :자동 교체가 필요한 차량의 상대적인 연령을 설정합니다. @@ -1430,7 +1413,7 @@ STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_BEFORE :{COMMA}개월 STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_AFTER :{COMMA}개월 후 STR_CONFIG_SETTING_AUTORENEW_MONEY :자동 교체를 위해 최소한으로 갖고 있어야 할 자금: {STRING} -STR_CONFIG_SETTING_AUTORENEW_MONEY_HELPTEXT :차량을 자동 교체하기 위해 최소한으로 있어야 하는 자금의 양을 설정합니다. +STR_CONFIG_SETTING_AUTORENEW_MONEY_HELPTEXT :차량을 자동 교체하기 위해 최소한으로 있어야 하는 자금의 양을 설정합니다 STR_CONFIG_SETTING_ERRMSG_DURATION :오류 메시지 표시: {STRING} STR_CONFIG_SETTING_ERRMSG_DURATION_HELPTEXT :오류 메시지를 표시할 시간을 설정합니다. 일부 (중요한) 오류 메시지는 이 시간이 지나도 자동으로 사라지지 않고 수동으로 꺼야할 수도 있음을 알아두십시오. @@ -1450,6 +1433,8 @@ 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_SHOW_CARGO_IN_LISTS :차량 목록 창에서 차량이 실을 수 있는 화물 표시: {STRING} +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS_HELPTEXT :이 설정을 켜면, 차량 목록 상단에 차량이 실을 수 있는 화물을 표시합니다 STR_CONFIG_SETTING_LANDSCAPE :지형: {STRING} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :지형에 따라 화물과 도시 성장 요구 조건이 다른 게임 플레이 시나리오가 만들어집니다. NewGRF과 게임 스크립트를 통해 세밀한 조절이 가능합니다. @@ -1477,7 +1462,7 @@ STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :아한대 기 STR_CONFIG_SETTING_SNOW_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_DESERT_COVERAGE :사막 비율: {STRING} -STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :아열대 기후에서 사막 지역의 양을 대략적으로 조절할 수 있습니다. 사막은 산업시설 생성에도 영향을 미칩니다. 지도를 생성할 때에만 사용하는 설정입니다. +STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :아열대 기후에서 사막 지역의 양을 대략적으로 조절할 수 있습니다. 사막은 산업시설 생성에도 영향을 미칩니다. 지도를 생성할 때에만 사용하는 설정입니다 STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :지형의 거친 정도: {STRING} @@ -1504,6 +1489,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :향상됨 STR_CONFIG_SETTING_ROAD_SIDE :자동차 통행 방향: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :통행 방향을 선택합니다 +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :좌측통행 +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :우측통행 + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :높이맵 회전: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :반시계방향 @@ -1601,7 +1590,7 @@ STR_CONFIG_SETTING_AUTOSAVE :자동 저장: STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :게임을 자동으로 저장할 간격을 선택하세요 STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :저장 파일 이름으로 {STRING} 날짜 형식을 사용 -STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :게임 저장 파일 이름에 사용할 날짜 형식을 선택합니다. +STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :게임 저장 파일 이름에 사용할 날짜 형식을 선택합니다 ###length 3 STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_LONG :긴 (2012년 1월 1일) STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_SHORT :짧은 (2012.01.01) @@ -1619,7 +1608,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_ADVANCED_VEHICLE_LISTS_HELPTEXT :고급화된 차량 목록의 사용 여부를 설정합니다. +STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :고급 차량 목록 사용 여부를 설정합니다 STR_CONFIG_SETTING_LOADING_INDICATORS :적재율 표시: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :적재나 하차하는 차량 위에 적재/하차율을 표시할지 말지를 선택합니다. @@ -1634,7 +1623,7 @@ STR_CONFIG_SETTING_QUICKGOTO :빠른 행선 STR_CONFIG_SETTING_QUICKGOTO_HELPTEXT :경로 창을 열면 자동으로 '행선지' 버튼을 선택하여 곧바로 행선지를 지정할 수 있도록 합니다. STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE :철도 형식 기본값 설정 (게임 시작/불러온 후): {STRING} -STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_HELPTEXT :게임을 새로 시작하거나 불러온 뒤에 사용할 철도의 종류를 선택합니다. '처음 사용 가능한 것'은 가장 오래된 철도 종류를 선택하고, '최신 기술의 철도'는 가장 최신에 나온 철도 종류를 선택하며 '가장 많이 사용한 것'은 현재 가장 많이 사용한 철도 종류를 선택합니다. +STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_HELPTEXT :게임을 새로 시작하거나 불러온 뒤에 사용할 철도의 종류를 선택합니다. '처음 사용 가능한 것'은 가장 오래된 철도 종류를 선택하고, '최신 기술의 철도'는 가장 최신에 나온 철도 종류를 선택하며 '가장 많이 사용한 것'은 현재 가장 많이 사용한 철도 종류를 선택합니다 ###length 3 STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_FIRST :처음 사용 가능한 것 STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_LAST :가장 최근에 개발된 철도 @@ -1692,26 +1681,26 @@ STR_CONFIG_SETTING_MAX_SHIPS :회사당 최 STR_CONFIG_SETTING_MAX_SHIPS_HELPTEXT :한 회사가 소유할 수 있는 선박의 최대 수를 제한합니다. STR_CONFIG_SETTING_AI_BUILDS_TRAINS :컴퓨터의 철도 사용을 허가하지 않음: {STRING} -STR_CONFIG_SETTING_AI_BUILDS_TRAINS_HELPTEXT :이 설정을 켜면, 컴퓨터 플레이어가 철도를 사용할 수 없게 됩니다. +STR_CONFIG_SETTING_AI_BUILDS_TRAINS_HELPTEXT :이 설정을 켜면, 컴퓨터 플레이어가 철도를 사용할 수 없게 됩니다 STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES :컴퓨터의 자동차/전차 사용을 허가하지 않음: {STRING} -STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES_HELPTEXT :이 설정을 켜면, 컴퓨터 플레이어가 자동차나 전차를 사용할 수 없게 됩니다. +STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES_HELPTEXT :이 설정을 켜면, 컴퓨터 플레이어가 자동차나 전차를 사용할 수 없게 됩니다 STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT :컴퓨터의 항공기 사용을 허가하지 않음: {STRING} -STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT_HELPTEXT :이 설정을 켜면, 컴퓨터 플레이어가 항공기를 사용할 수 없게 됩니다. +STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT_HELPTEXT :이 설정을 켜면, 컴퓨터 플레이어가 항공기를 사용할 수 없게 됩니다 STR_CONFIG_SETTING_AI_BUILDS_SHIPS :컴퓨터의 선박 사용을 허가하지 않음: {STRING} -STR_CONFIG_SETTING_AI_BUILDS_SHIPS_HELPTEXT :이 설정을 켜면, 컴퓨터 플레이어가 선박을 사용할 수 없게 됩니다. +STR_CONFIG_SETTING_AI_BUILDS_SHIPS_HELPTEXT :이 설정을 켜면, 컴퓨터 플레이어가 선박을 사용할 수 없게 됩니다 STR_CONFIG_SETTING_AI_PROFILE :기본 설정 난이도: {STRING} -STR_CONFIG_SETTING_AI_PROFILE_HELPTEXT :무작위 인공지능이 사용할 난이도 설정이나, 인공지능 또는 게임 스크립트를 추가할 때의 난이도 초기값을 고르십시오. +STR_CONFIG_SETTING_AI_PROFILE_HELPTEXT :무작위 인공지능이 사용할 난이도 설정이나 인공지능 또는 게임 스크립트를 추가할 때 사용할 난이도 초기값을 고르십시오 ###length 3 STR_CONFIG_SETTING_AI_PROFILE_EASY :쉬움 STR_CONFIG_SETTING_AI_PROFILE_MEDIUM :중간 STR_CONFIG_SETTING_AI_PROFILE_HARD :어려움 STR_CONFIG_SETTING_AI_IN_MULTIPLAYER :멀티 플레이에서 컴퓨터 플레이어의 참여 허용: {STRING} -STR_CONFIG_SETTING_AI_IN_MULTIPLAYER_HELPTEXT :멀티 플레이 게임에서 인공지능 컴퓨터 플레이어가 참여하는 것을 허용합니다. +STR_CONFIG_SETTING_AI_IN_MULTIPLAYER_HELPTEXT :멀티 플레이 게임에서 인공지능 컴퓨터 플레이어가 참여하는 것을 허용합니다 STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES :게임 스크립트가 중지되기 직전에 계산할 수 있는 최대 횟수: {STRING} STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES_HELPTEXT :게임 스크립트가 한 단계에서 계산할 수 있는 최대 계산 횟수를 설정합니다. @@ -1741,7 +1730,7 @@ STR_CONFIG_SETTING_WAGONSPEEDLIMITS :화물차 속 STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :이 설정을 켜면, 화물차의 속력 제한값에 따라 열차의 최대 속력을 제한합니다. STR_CONFIG_SETTING_DISABLE_ELRAILS :전기 철도를 사용하지 않음: {STRING} -STR_CONFIG_SETTING_DISABLE_ELRAILS_HELPTEXT :이 설정을 켜면, 전기 기관차가 일반 철도에서도 달릴 수 있도록 만듭니다. +STR_CONFIG_SETTING_DISABLE_ELRAILS_HELPTEXT :이 설정을 켜면, 전기 기관차가 일반 철도에서도 달릴 수 있도록 만듭니다 STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OWN :내 회사의 첫 차량 도착: {STRING} STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OWN_HELPTEXT :나의 새 역사에 처음으로 차량이 도착하면 메시지로 알려줍니다 @@ -1796,7 +1785,7 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_SUMMARY :상태 표시 STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :전체 메시지로 알림 STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :컬러로 된 뉴스가 시작되는 해: {STRING}년 -STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :신문이 컬러로 나오게 되는 연도를 설정합니다. 이 연도 이전까지는 신문이 흑백으로 나옵니다. +STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :신문이 컬러로 나오게 되는 연도를 설정합니다. 이 연도 이전까지는 신문이 흑백으로 나옵니다 STR_CONFIG_SETTING_STARTING_YEAR :시작 연도: {STRING} STR_CONFIG_SETTING_ENDING_YEAR :게임 종료 연도: {STRING} @@ -1813,7 +1802,7 @@ STR_CONFIG_SETTING_ECONOMY_TYPE_SMOOTH :부드러움 STR_CONFIG_SETTING_ECONOMY_TYPE_FROZEN :멈춤 STR_CONFIG_SETTING_ALLOW_SHARES :다른 회사의 지분을 사는 것을 허용: {STRING} -STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :이 설정을 켜면, 회사의 지분을 거래할 수 있게 됩니다. 회사의 지분을 거래하려면 해당 회사가 어느 정도 오래되어야 합니다. +STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :이 설정을 켜면, 회사의 지분을 거래할 수 있게 됩니다. 회사의 지분을 거래하려면 해당 회사가 어느 정도 오래되어야 합니다 STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :지분 거래를 허용할 최소 회사 나이: {STRING}년 STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES_HELPTEXT :지분을 사고 팔기 위해 필요한 회사의 최소 나이를 설정합니다. @@ -1822,7 +1811,7 @@ STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :환승시 벌 STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :더 많은 수익을 내기 위해, 수송 관계상 중간 구간에게 주어진 수익의 비율을 설정합니다. STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :신호기를 드래그로 설치하는 경우: {STRING} -STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :신호기를 드래그할 때, 다음 장애물(신호기, 분기점 등)을 만날 때까지 신호기가 설치될 간격을 설정합니다. +STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :신호기를 드래그할 때, 다음 장애물(신호기, 분기점 등)을 만날 때까지 신호기가 설치될 간격을 설정합니다 STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA}칸 간격으로 설치 STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :드래그할 때, 신호기 사이의 거리를 계속 고정: {STRING} STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :신호기를 CTRL+드래그 하여 설치할 때의 행동을 선택합니다. 이 설정을 끄면, 신호기가 없는 긴 폐색을 만들지 않기 위해 터널이나 다리 주변에 먼저 신호기가 설치될 것입니다. 이 설정을 켜면, 신호기는 터널/다리와 상관없이 매 n개의 칸마다 설치될 것입니다. @@ -1854,7 +1843,7 @@ STR_CONFIG_SETTING_TOWN_LAYOUT_RANDOM :무작위 STR_CONFIG_SETTING_ALLOW_TOWN_ROADS :도시 스스로 도로를 건설하는 것을 허용: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :도시가 성장하기 위해 도로를 건설할 수 있도록 허용합니다. 도시 당국이 스스로 도로를 만들지 못하도록 하려면 이 설정을 끄십시오. STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :도시가 회사 소유의 선로에 건널목을 만드는 것을 허용: {STRING} -STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :도시가 회사 소유의 선로에 건널목을 건설할 수 있도록 허용합니다. +STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :도시가 회사 소유의 선로에 건널목을 건설할 수 있도록 허용합니다 STR_CONFIG_SETTING_NOISE_LEVEL :도시가 공항에서 나오는 소음을 제한하도록 함: {STRING} STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :이 설정을 끄면, 한 도시에는 공항을 2개까지 지을 수 있습니다. 이 설정을 켜면, 한 도시에 지을 수 있는 공항의 수는 도시가 허용 가능한 소음 기준에 따라 달라집니다. 소음 기준은 도시 인구, 공항의 크기와 거리에 따라 다릅니다. @@ -1929,7 +1918,7 @@ STR_CONFIG_SETTING_LARGER_TOWNS_VALUE :{COMMA}개 중 ###setting-zero-is-special STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :없음 STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :초기 대도시 크기 비율: 일반 도시보다 {STRING}배 크게 시작 -STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :게임을 시작했을 때 일반 도시에 대한 대도시의 평균 크기를 설정합니다. +STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :게임을 시작했을 때 일반 도시에 대한 대도시의 평균 크기를 설정합니다 STR_CONFIG_SETTING_LINKGRAPH_INTERVAL :분배 상태를 매 {STRING}일 마다 갱신 STR_CONFIG_SETTING_LINKGRAPH_INTERVAL_HELPTEXT :다음 연결 상태를 재계산하기까지의 시간입니다. 한 번의 재계산할 때마다 그래프의 한 요소를 위한 계획을 계산합니다. 이는 이 설정의 X값에 따라 모든 그래프가 매 X일마다 갱신되는 것이 아니라는 것을 뜻합니다. 일부 요소만 재계산된다는 뜻입니다. 값이 작으면 작을 수록 CPU가 계산해야 할 횟수가 늘어납니다. 값을 크게 설정할 수록 화물 분배 상태가 새롭게 지정되는 데 더 오랜 시간이 걸립니다. @@ -2038,15 +2027,15 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :신호기 앞 STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :열차가 신호기 앞에서 너무 오래 기다리면 뒤로 되돌아갈 수 있도록 허용합니다. ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(권장) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(권장) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}설정값 변경 # Config errors STR_CONFIG_ERROR :{WHITE}설정 파일에서 오류 발생 STR_CONFIG_ERROR_ARRAY :{WHITE}... 배열 '{STRING}'에서 오류 발생 -STR_CONFIG_ERROR_INVALID_VALUE :{WHITE}... '{1:STRING}'에 잘못된 값('{0:STRING}')이 지정되었습니다. -STR_CONFIG_ERROR_TRAILING_CHARACTERS :{WHITE}... '{STRING}' 설정의 끝에 후행 문자가 있습니다. +STR_CONFIG_ERROR_INVALID_VALUE :{WHITE}... '{1:STRING}'에 잘못된 값('{0:STRING}')이 지정되었습니다 +STR_CONFIG_ERROR_TRAILING_CHARACTERS :{WHITE}... '{STRING}' 설정의 끝에 후행 문자가 있습니다 STR_CONFIG_ERROR_DUPLICATE_GRFID :{WHITE}... '{STRING}' NewGRF를 무시합니다: '{STRING}'{G 1 "과" "와"} GRF ID가 겹침 STR_CONFIG_ERROR_INVALID_GRF :{WHITE}... 유효하지 않은 '{STRING}' NewGRF를 무시합니다: {STRING} STR_CONFIG_ERROR_INVALID_GRF_NOT_FOUND :찾을 수 없음 @@ -2056,9 +2045,9 @@ STR_CONFIG_ERROR_INVALID_GRF_INCOMPATIBLE :현재 OpenTTD STR_CONFIG_ERROR_INVALID_GRF_UNKNOWN :알 수 없음 STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_LEVEL :{WHITE}... 압축 레벨 '{STRING}' : 유효하지 않습니다 STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_ALGORITHM :{WHITE}... '{STRING}' 형식으로 게임을 저장할 수 없습니다. '{STRING}' 형식으로 변환합니다 -STR_CONFIG_ERROR_INVALID_BASE_GRAPHICS_NOT_FOUND :{WHITE}... 기본 그래픽 세트({STRING})가 무시되었습니다: 파일을 찾을 수 없습니다. -STR_CONFIG_ERROR_INVALID_BASE_SOUNDS_NOT_FOUND :{WHITE}... 기본 효과음 세트({STRING})가 무시되었습니다: 파일을 찾을 수 없습니다. -STR_CONFIG_ERROR_INVALID_BASE_MUSIC_NOT_FOUND :{WHITE}... 기본 배경음 세트({STRING})가 무시되었습니다: 파일을 찾을 수 없습니다. +STR_CONFIG_ERROR_INVALID_BASE_GRAPHICS_NOT_FOUND :{WHITE}... 기본 그래픽 세트({STRING})가 무시되었습니다: 파일을 찾을 수 없습니다 +STR_CONFIG_ERROR_INVALID_BASE_SOUNDS_NOT_FOUND :{WHITE}... 기본 효과음 세트({STRING})가 무시되었습니다: 파일을 찾을 수 없습니다 +STR_CONFIG_ERROR_INVALID_BASE_MUSIC_NOT_FOUND :{WHITE}... 기본 배경음 세트({STRING})가 무시되었습니다: 파일을 찾을 수 없습니다 STR_CONFIG_ERROR_OUT_OF_MEMORY :{WHITE}메모리 초과 STR_CONFIG_ERROR_SPRITECACHE_TOO_BIG :{WHITE}{BYTES}의 스프라이트 캐시 할당에 실패하였습니다. 스프라이트 캐시 용량이 {BYTES}로 감소합니다. 이는 OpenTTD의 성능을 저하시킬 것입니다. 메모리 요구사항을 낮추려면 32bpp를 비활성화하거나 화면 확대 설정을 기본값에 가깝게 조절하십시오. @@ -2081,12 +2070,13 @@ STR_INTRO_HIGHSCORE :{BLACK}고득 STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}설정 STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF 설정 STR_INTRO_ONLINE_CONTENT :{BLACK}온라인 콘텐츠 다운로드 -STR_INTRO_SCRIPT_SETTINGS :{BLACK}인공지능/게임 스크립트 설정 +STR_INTRO_AI_SETTINGS :{BLACK}인공지능 설정 +STR_INTRO_GAMESCRIPT_SETTINGS :{BLACK}게임 스크립트 설정 STR_INTRO_QUIT :{BLACK}종료 -STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}새 게임을 시작합니다.{}CTRL+클릭하시면 지도 설정을 건너뛰고 바로 시작합니다. -STR_INTRO_TOOLTIP_LOAD_GAME :{BLACK}저장한 게임을 불러옵니다. -STR_INTRO_TOOLTIP_PLAY_HEIGHTMAP :{BLACK}높이맵을 지형으로 사용하여, 새로운 게임을 시작합니다. +STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}새 게임을 시작합니다.{}CTRL+클릭하시면 지도 설정을 건너뛰고 바로 시작합니다 +STR_INTRO_TOOLTIP_LOAD_GAME :{BLACK}저장한 게임을 불러옵니다 +STR_INTRO_TOOLTIP_PLAY_HEIGHTMAP :{BLACK}높이맵을 지형으로 사용하여, 새로운 게임을 시작합니다 STR_INTRO_TOOLTIP_PLAY_SCENARIO :{BLACK}사용자 시나리오로 새 게임을 시작합니다 STR_INTRO_TOOLTIP_SCENARIO_EDITOR :{BLACK}사용자 게임/시나리오를 만듭니다 STR_INTRO_TOOLTIP_MULTIPLAYER :{BLACK}멀티 플레이 게임을 시작합니다 @@ -2096,12 +2086,13 @@ STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE :{BLACK}아한 STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE :{BLACK}아열대 기후 선택 STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}장난감나라 선택 -STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}게임 기본 설정 창을 보여줍니다. -STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}고득점 순위표를 보여줍니다. -STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}설정 창을 엽니다. -STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}NewGRF 설정 창을 엽니다. -STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}새로 나왔거나 업데이트된 콘텐츠를 체크하여 다운로드합니다. -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}인공지능/게임 스크립트 설정창을 엽니다. +STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}게임 기본 설정 창을 보여줍니다 +STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}고득점 순위표를 보여줍니다 +STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}설정 창을 엽니다 +STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}NewGRF 설정 창을 엽니다 +STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}새로 나왔거나 업데이트된 콘텐츠를 체크하여 다운로드합니다 +STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}인공지능 설정 창을 엽니다 +STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}게임 스크립트 설정 창을 엽니다 STR_INTRO_TOOLTIP_QUIT :{BLACK}'OpenTTD'를 종료합니다. STR_INTRO_BASESET :{BLACK}현재 선택된 기본 그래픽 세트에는 {NUM}개의 스프라이트가 빠져있습니다. 기본 세트를 업데이트하세요. @@ -2120,7 +2111,7 @@ STR_ABANDON_SCENARIO_QUERY :{YELLOW}정말 # Cheat window STR_CHEATS :{WHITE}치트 -STR_CHEATS_TOOLTIP :{BLACK}체크박스의 체크 표시는 이전에 이 치트를 사용했는지 여부를 나타냅니다. +STR_CHEATS_TOOLTIP :{BLACK}체크박스의 체크 표시는 이전에 이 치트를 사용했는지 여부를 나타냅니다 STR_CHEATS_NOTE :{BLACK}참고: 치트 사용 여부는 저장 파일에 기록될 것입니다 STR_CHEAT_MONEY :{LTBLUE}재정을 {CURRENCY_LONG} 만큼 증가 STR_CHEAT_CHANGE_COMPANY :{LTBLUE}다음 회사로 플레이: {ORANGE}{COMMA} @@ -2128,17 +2119,11 @@ STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}마법 STR_CHEAT_CROSSINGTUNNELS :{LTBLUE}터널 교차 허용: {ORANGE}{STRING} STR_CHEAT_NO_JETCRASH :{LTBLUE}대형 항공기가 소형 공항에서 (자주) 충돌하지 않게 함: {ORANGE}{STRING} STR_CHEAT_EDIT_MAX_HL :{LTBLUE}최대 지형 고도값 수정: {ORANGE}{NUM} -STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT :{WHITE}최대 지형 높이값을 수정합니다. +STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT :{WHITE}최대 지형 높이값을 수정합니다 STR_CHEAT_CHANGE_DATE :{LTBLUE}날짜 변경: {ORANGE}{DATE_SHORT} STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}현재의 연도를 변경 STR_CHEAT_SETUP_PROD :{LTBLUE}1차 산업시설 생산량 조절 허용: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :온대 기후 -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :아한대 기후 -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :아열대 기후 -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :장난감나라 - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - 색상 @@ -2147,9 +2132,9 @@ STR_LIVERY_TRAIN_TOOLTIP :{BLACK}열차 STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}차량 색상 선택 STR_LIVERY_SHIP_TOOLTIP :{BLACK}선박 색상 선택 STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}항공기 색상 선택 -STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}선택한 색상을 1차 색상으로 선택합니다. CTRL+클릭하면 모든 항목에 적용됩니다. -STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}선택한 색상을 2차 색상으로 선택합니다. CTRL+클릭하면 모든 항목에 적용됩니다. -STR_LIVERY_PANEL_TOOLTIP :{BLACK}색상 조합을 바꾸려면 선택하세요. 2개 이상 선택하려면 CTRL+클릭하세요. 네모를 클릭하여 체크하면 해당 색상 조합을 사용하게 됩니다. +STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}선택한 색상을 1차 색상으로 선택합니다. CTRL+클릭하면 모든 항목에 적용됩니다 +STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}선택한 색상을 2차 색상으로 선택합니다. CTRL+클릭하면 모든 항목에 적용됩니다 +STR_LIVERY_PANEL_TOOLTIP :{BLACK}색상 조합을 바꾸려면 선택하세요. 2개 이상 선택하려면 CTRL+클릭하세요. 네모를 클릭하여 체크하면 해당 색상 조합을 사용하게 됩니다 ###length 23 STR_LIVERY_DEFAULT :기본 색상 @@ -2498,11 +2483,11 @@ STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :연결 상태 STR_NETWORK_MESSAGE_CLIENT_LEAVING :게임 종료 STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} 님이 입장하셨습니다 -STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {STRING} 님이 입장하셨습니다 ({2:NUM}번 접속자) -STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} 님이 {2:NUM}번 회사에 참여하셨습니다 +STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {0:STRING} 님이 입장하셨습니다 ({2:NUM}번 접속자) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {0:STRING} 님이 {2:NUM}번 회사에 참여하셨습니다 STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} 님이 관전을 시작하셨습니다 -STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} 님이 새로운 회사({2:NUM}번)를 창설하셨습니다 -STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} 님이 퇴장하셨습니다 (사유: {2:STRING}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {0:STRING} 님이 새로운 회사({2:NUM}번)를 창설하셨습니다 +STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {0:STRING} 님이 퇴장하셨습니다 (사유: {2:STRING}) STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} 님이 이름을 {STRING}(으)로 바꾸었습니다 STR_NETWORK_MESSAGE_GIVE_MONEY :*** {0:STRING} 님이 {1:STRING}에게 {2:CURRENCY_LONG}만큼의 돈을 보내셨습니다 STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}서버가 게임을 종료하였습니다 @@ -2867,6 +2852,8 @@ STR_FOUND_TOWN_RANDOM_TOWN_BUTTON :{BLACK}무작 STR_FOUND_TOWN_RANDOM_TOWN_TOOLTIP :{BLACK}무작위 위치에 도시를 건설합니다 STR_FOUND_TOWN_MANY_RANDOM_TOWNS :{BLACK}무작위로 여러 도시 건설 STR_FOUND_TOWN_RANDOM_TOWNS_TOOLTIP :{BLACK}무작위로 도시를 건설합니다 +STR_FOUND_TOWN_EXPAND_ALL_TOWNS :{BLACK}모든 도시 확장 +STR_FOUND_TOWN_EXPAND_ALL_TOWNS_TOOLTIP :{BLACK}모든 도시를 조금씩 확장시킵니다 STR_FOUND_TOWN_NAME_TITLE :{YELLOW}도시 이름: STR_FOUND_TOWN_NAME_EDITOR_TITLE :{BLACK}도시 이름 입력 @@ -3145,6 +3132,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}지도 STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}지도의 크기를 칸 수 기준으로 선택하세요. 사용 가능한 지도의 칸 수는 설정한 값보다 조금 작을 것입니다 STR_MAPGEN_BY :{BLACK}x STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}도시의 수: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}도시 이름: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}도시 이름 스타일을 선택하세요 STR_MAPGEN_DATE :{BLACK}날짜: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}산업시설 수: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}가장 높은 지점의 높이: @@ -3160,11 +3149,40 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}사막 STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}지형 만들기: STR_MAPGEN_TERRAIN_TYPE :{BLACK}지형 종류: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}해수면: +STR_MAPGEN_SEA_LEVEL :{BLACK}해수면: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}강: STR_MAPGEN_SMOOTHNESS :{BLACK}지표면을 깎는 방식: STR_MAPGEN_VARIETY :{BLACK}산세 험준도: STR_MAPGEN_GENERATE :{WHITE}만들기 +STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF 설정 +STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}NewGRF 설정 창을 엽니다 +STR_MAPGEN_AI_SETTINGS :{BLACK}인공지능 설정 +STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}인공지능 설정 창을 엽니다 +STR_MAPGEN_GS_SETTINGS :{BLACK}게임 스크립트 설정 +STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}게임 스크립트 설정 창을 엽니다 + +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :영국 식 (기본) +STR_MAPGEN_TOWN_NAME_FRENCH :프랑스 식 +STR_MAPGEN_TOWN_NAME_GERMAN :독일 식 +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :영국 식 (추가) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :라틴아메리카 식 +STR_MAPGEN_TOWN_NAME_SILLY :바보같은 도시 이름 +STR_MAPGEN_TOWN_NAME_SWEDISH :스웨덴 식 +STR_MAPGEN_TOWN_NAME_DUTCH :네덜란드 식 +STR_MAPGEN_TOWN_NAME_FINNISH :핀란드 식 +STR_MAPGEN_TOWN_NAME_POLISH :폴란드 식 +STR_MAPGEN_TOWN_NAME_SLOVAK :슬로바키아 식 +STR_MAPGEN_TOWN_NAME_NORWEGIAN :노르웨이 식 +STR_MAPGEN_TOWN_NAME_HUNGARIAN :헝가리 식 +STR_MAPGEN_TOWN_NAME_AUSTRIAN :오스트리아 식 +STR_MAPGEN_TOWN_NAME_ROMANIAN :루마니아 식 +STR_MAPGEN_TOWN_NAME_CZECH :체코 식 +STR_MAPGEN_TOWN_NAME_SWISS :스위스 식 +STR_MAPGEN_TOWN_NAME_DANISH :덴마크 식 +STR_MAPGEN_TOWN_NAME_TURKISH :터키 식 +STR_MAPGEN_TOWN_NAME_ITALIAN :이탈리아 식 +STR_MAPGEN_TOWN_NAME_CATALAN :카탈로니아 식 # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}지도 가장자리: @@ -3310,6 +3328,13 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}이전 STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}(유사/재색상/글씨 스프라이트를 제외한) 이전 보통 스프라이트로 이동하고, 첫 번째 스프라이트에 다다르면 마지막으로 돌아갑니다. STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}현재 선택된 스프라이트를 표현합니다. 이 스프라이트를 표현할 때, 정렬 상태는 무시하고 표현합니다. STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}X축이나 Y축 방향으로 스프라이트를 이동시킵니다. CTRL+클릭하면 한 번에 8씩 이동시킬 수 있습니다 + +###length 2 +STR_SPRITE_ALIGNER_CENTRE_OFFSET :{BLACK}오프셋 가운데 정렬 +STR_SPRITE_ALIGNER_CENTRE_SPRITE :{BLACK}스프라이트 가운데 정렬 + +STR_SPRITE_ALIGNER_CROSSHAIR :{BLACK}십자선 + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}상대값 초기화 STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}현재 상대값 좌표를 초기화 STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X 좌표: {NUM}, Y 좌표: {NUM} (절댓값) @@ -3327,12 +3352,12 @@ STR_NEWGRF_ERROR_MSG_FATAL :{RED}치명적 STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}치명적인 NewGRF 오류가 발생했습니다:{}{STRING} STR_NEWGRF_ERROR_POPUP :{WHITE}NewGRF 관련 오류가 발생했습니다:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING}{G 1 "은" "는"} OpenTTD에서 보고된 TTDPatch 버전에서 작동하지 않을 것입니다 -STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING}{G 1 "은" "는"} {STRING} 버전의 TTD를 위한 것입니다 -STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING}{G 1 "은" "는"} {STRING}{G 1 "와" "과"} 같이 사용해야 합니다 -STR_NEWGRF_ERROR_INVALID_PARAMETER :{1:STRING}의 매개 변숫값이 유효하지 않습니다: {STRING}번 변수 ({NUM}) -STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING}{G 1 "은" "는"} 반드시 {STRING} 앞에 불러와야 합니다 -STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING}{G 1 "은" "는"} 반드시 {STRING} 뒤에 불러와야 합니다 -STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING}{G 1 "은" "는"} OpenTTD {STRING} 버전이나 그 이상이 필요합니다 +STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING}{G 1 "은" "는"} {2:STRING} 버전의 TTD를 위한 것입니다 +STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING}{G 1 "은" "는"} {2:STRING}{G 1 "와" "과"} 같이 사용해야 합니다 +STR_NEWGRF_ERROR_INVALID_PARAMETER :{1:STRING}의 매개 변숫값이 잘못되었습니다: {2:STRING}번 변수 ({3:NUM}) +STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING}{G 1 "은" "는"} 반드시 {2:STRING}보다 앞에 불러와야 합니다 +STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING}{G 1 "은" "는"} 반드시 {2:STRING}보다 뒤에 불러와야 합니다 +STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING}{G 1 "은" "는"} OpenTTD {2:STRING} 버전이나 그 이상이 필요합니다 STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :GRF 파일이 번역을 위해 만들어졌습니다 STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :NewGRF가 너무 많습니다 STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :{2:STRING}{G 2 "을" "를"} 포함한 정적 NewGRF {1:STRING}{G 1 "을" "를"} 불러오는 것은 비동기화를 일으킬 수 있습니다 @@ -3373,7 +3398,7 @@ STR_NEWGRF_BROKEN :{WHITE}'{0:STRI STR_NEWGRF_BROKEN_POWERED_WAGON :{WHITE}차고지 안에 있지 않은 '{1:ENGINE}' 동력 차량의 상태가 바뀌었습니다 STR_NEWGRF_BROKEN_VEHICLE_LENGTH :{WHITE}'{1:ENGINE}'{G 1 "이" "가"} 차고지 안에 있지 않으면 차량 길이가 바뀝니다 STR_NEWGRF_BROKEN_CAPACITY :{WHITE}차량이 기지 안에 있지 않거나 개조가 불가능한 상태에서 '{1:ENGINE}'의 수송량이 변경되었습니다 -STR_BROKEN_VEHICLE_LENGTH :{WHITE}'{1:COMPANY}'에 속한 열차 '{0:VEHICLE}'의 길이가 잘못된 값을 가지고 있습니다. NewGRF에 의한 문제로 보입니다. 게임이 비동기화 또는 충돌을 일으킬 수 있습니다. +STR_BROKEN_VEHICLE_LENGTH :{WHITE}'{1:COMPANY}'에 속한 열차 '{0:VEHICLE}'의 길이가 잘못된 값을 가지고 있습니다. NewGRF에 의한 문제로 보입니다. 게임이 비동기화 또는 충돌을 일으킬 수 있습니다 STR_NEWGRF_BUGGY :{WHITE}NewGRF '{STRING}'에서 잘못된 정보를 제공하고 있습니다 STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}{1:ENGINE}(을)를 만들기 이전과 이후의 화물/개조 정보가 현재의 구매 목록과 다릅니다. 이 경우 자동 교체시 열차 개조에 실패할 수도 있습니다 @@ -3467,14 +3492,14 @@ STR_LOCAL_AUTHORITY_ACTION_EXCLUSIVE_TRANSPORT :수송 권한 STR_LOCAL_AUTHORITY_ACTION_BRIBE :지역 당국에게 뇌물 주기 ###length 8 -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{YELLOW}더 많은 승객과 화물을 유치하기 위해 소규모의 광고 캠페인을 시작합니다.{}도시 중심 주위의 좁은 반경 안에 있는 역 등급을 일시적으로 올려줍니다.{}가격: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{YELLOW}더 많은 승객과 화물을 유치하기 위해 중간 규모의 광고 캠페인을 시작합니다.{}도시 중심 주위의 적당한 반경 안에 있는 역 등급을 일시적으로 올려줍니다.{}가격: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{YELLOW}더 많은 승객과 화물을 유치하기 위해 대규모의 광고 캠페인을 시작합니다.{}도시 중심 주위의 넓은 반경 안에 있는 역 등급을 일시적으로 올려줍니다.{}가격: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{YELLOW}도시 도로망 보수공사를 시행합니다.{}앞으로 6개월간 극심한 도로 혼잡을 일으킵니다.{}가격: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{YELLOW}당신의 회사를 대표하는 '명예의 동상'을 건설합니다.{}이 도시에 있는 역 등급을 영구적으로 올려줍니다.{}가격: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{YELLOW}도시 상업 건물의 건설에 투자합니다.{}도시의 성장을 일시적으로 빠르게 만들어줍니다.{}가격: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW}1년 간 수송 권한 독점권을 구입합니다.{}도시 당국은 오직 당신 회사의 역에만 승객과 화물을 실을 것입니다.{}가격: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}성취도를 올리기 위해 처벌을 감수하고 지역 당국에 뇌물을 줍니다.{}가격: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{YELLOW}더 많은 승객과 화물을 유치하기 위해 소규모의 광고 캠페인을 시작합니다.{}도시 중심 주위의 좁은 반경 안에 있는 역 등급을 일시적으로 올려줍니다.{}{POP_COLOUR}가격: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{PUSH_COLOUR}{YELLOW}더 많은 승객과 화물을 유치하기 위해 중간 규모의 광고 캠페인을 시작합니다.{}도시 중심 주위의 적당한 반경 안에 있는 역 등급을 일시적으로 올려줍니다.{}{POP_COLOUR}가격: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}더 많은 승객과 화물을 유치하기 위해 대규모의 광고 캠페인을 시작합니다.{}도시 중심 주위의 넓은 반경 안에 있는 역 등급을 일시적으로 올려줍니다.{}{POP_COLOUR}가격: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{PUSH_COLOUR}{YELLOW}도시 도로망 보수공사를 시행합니다.{}앞으로 6개월간 극심한 도로 혼잡을 일으킵니다.{}{POP_COLOUR}가격: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}당신의 회사를 대표하는 '명예의 동상'을 건설합니다.{}이 도시에 있는 역 등급을 영구적으로 올려줍니다.{}{POP_COLOUR}가격: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}도시 상업 건물의 건설에 투자합니다.{}도시의 성장을 일시적으로 빠르게 만들어줍니다.{}{POP_COLOUR}가격: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}1년 간 수송 권한 독점권을 구입합니다.{}도시 당국은 오직 당신 회사의 역에만 승객과 화물을 실을 것입니다.{}{POP_COLOUR}가격: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}성취도를 올리기 위해 처벌을 감수하고 지역 당국에 뇌물을 줍니다.{}{POP_COLOUR}가격: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}{COMPANY} 목표 @@ -3647,16 +3672,18 @@ STR_FINANCES_SECTION_SHIP_REVENUE :{GOLD}선박 STR_FINANCES_SECTION_LOAN_INTEREST :{GOLD}이자 STR_FINANCES_SECTION_OTHER :{GOLD}기타 +STR_FINANCES_TOTAL_CAPTION :{WHITE}종합 STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} STR_FINANCES_ZERO_INCOME :{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} -STR_FINANCES_NET_PROFIT :{WHITE}순이익 +STR_FINANCES_PROFIT :{WHITE}이익 STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}현 보유 금액 STR_FINANCES_OWN_FUNDS_TITLE :{WHITE}보유 자금 STR_FINANCES_LOAN_TITLE :{WHITE}대출 STR_FINANCES_INTEREST_RATE :{WHITE}대출 금리: {BLACK}{NUM}% STR_FINANCES_MAX_LOAN :{WHITE}최대 대출: {BLACK}{CURRENCY_LONG} STR_FINANCES_TOTAL_CURRENCY :{BLACK}{CURRENCY_LONG} +STR_FINANCES_BANK_BALANCE :{WHITE}{CURRENCY_LONG} STR_FINANCES_BORROW_BUTTON :{BLACK}{CURRENCY_LONG} 빌리기 STR_FINANCES_BORROW_TOOLTIP :{BLACK}돈을 빌립니다. CTRL+클릭하면 빌릴 수 있는 만큼 빌립니다 STR_FINANCES_REPAY_BUTTON :{BLACK}{CURRENCY_LONG} 갚기 @@ -3757,7 +3784,7 @@ STR_INDUSTRY_VIEW_PRODUCES_N_CARGO :{BLACK}생산 STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :, {STRING}{STRING} STR_INDUSTRY_VIEW_REQUIRES :{BLACK}받는 화물: -STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{0:STRING}{BLACK}{3:STRING} STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} 대기 중{STRING} STR_CONFIG_GAME_PRODUCTION :{WHITE}생산량 변경 (8의 배수, 최대 2040) @@ -3787,6 +3814,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}이 목 STR_VEHICLE_LIST_REPLACE_VEHICLES :차량 교체 STR_VEHICLE_LIST_SEND_FOR_SERVICING :점검하러 보내기 STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}올해 이익: {CURRENCY_LONG} (작년: {CURRENCY_LONG}) +STR_VEHICLE_LIST_CARGO :{TINY_FONT}{BLACK}[{CARGO_LIST}] +STR_VEHICLE_LIST_NAME_AND_CARGO :{TINY_FONT}{BLACK}{STRING} {STRING} STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :차량기지로 보내기 STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :차고지로 보내기 @@ -3878,6 +3907,11 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}최고 STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}항속거리: {GOLD}{COMMA}칸 STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}항공기 종류: {GOLD}{STRING} +###length 3 +STR_CARGO_TYPE_FILTER_ALL :모든 화물 종류 +STR_CARGO_TYPE_FILTER_FREIGHT :무게 +STR_CARGO_TYPE_FILTER_NONE :없음 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}열차 차량 구매 목록입니다. 차량의 정보를 보려면 클릭하세요. CTRL+클릭하면 해당 차량을 숨김/표시 처리할 수 있습니다 STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}차량 구매 목록입니다. 차량의 정보를 보려면 클릭하세요. CTRL+클릭하면 해당 차량을 숨김/표시 처리할 수 있습니다 @@ -4046,7 +4080,7 @@ STR_ENGINE_PREVIEW_AIRCRAFT :{G=f}항공기 STR_ENGINE_PREVIEW_SHIP :{G=m}선박 STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}가격: {CURRENCY_LONG} 무게: {WEIGHT_SHORT}{}속력: {VELOCITY} 힘: {POWER}{}유지비: {CURRENCY_LONG}/년{}수송량: {CARGO_LONG} -STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}가격: {CURRENCY_LONG} 무게: {WEIGHT_SHORT}{}속력: {VELOCITY} 힘: {POWER} 최대 견인력: {6:FORCE}{}유지비: {4:CURRENCY_LONG}/년{}수송량: {5:CARGO_LONG} +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}가격: {0:CURRENCY_LONG} 무게: {1:WEIGHT_SHORT}{}속력: {2:VELOCITY} 힘: {3:POWER} 최대 견인력: {6:FORCE}{}유지비: {4:CURRENCY_LONG}/년{}수송량: {5:CARGO_LONG} STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}가격: {CURRENCY_LONG} 최고 속력: {VELOCITY}{}수송량: {CARGO_LONG}{}유지비: {CURRENCY_LONG}/년 STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}가격: {CURRENCY_LONG} 최고 속력: {VELOCITY}{}항공기 종류: {STRING}{}수송량: {CARGO_LONG}, {CARGO_LONG}{}유지비: {CURRENCY_LONG}/년 STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}가격: {CURRENCY_LONG} 최고 속력: {VELOCITY}{}항공기 종류: {STRING}{}수송량: {CARGO_LONG}{}유지비: {CURRENCY_LONG}/년 @@ -4205,12 +4239,13 @@ STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}무게: STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}무게: {LTBLUE}{WEIGHT_SHORT} {BLACK}힘: {LTBLUE}{POWER}{BLACK} 최고 속력: {LTBLUE}{VELOCITY} {BLACK}최고 견인력: {LTBLUE}{FORCE} STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}올해 이익: {LTBLUE}{CURRENCY_LONG} (작년: {CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}올해 이익: {LTBLUE}{CURRENCY_LONG} (작년: {CURRENCY_LONG}) {BLACK}최소 성취도: {LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}신뢰도: {LTBLUE}{COMMA}% {BLACK}최근 점검 이후 고장 횟수: {LTBLUE}{COMMA} STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}생산: {LTBLUE}{NUM}{BLACK} 가격: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_INFO_NO_CAPACITY :{BLACK}수송량: {LTBLUE}없음{STRING} -STR_VEHICLE_INFO_CAPACITY :{BLACK}수송량: {LTBLUE}{CARGO_LONG}{3:STRING} -STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}수송량: {LTBLUE}{CARGO_LONG}{3:STRING} (x{4:NUM}) +STR_VEHICLE_INFO_CAPACITY :{BLACK}수송량: {LTBLUE}{0:CARGO_LONG}{3:STRING} +STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}수송량: {LTBLUE}{0:CARGO_LONG}{3:STRING} (x{4:NUM}) STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}수송량: {LTBLUE}{CARGO_LONG}, {CARGO_LONG}{STRING} STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}환승 수익: {LTBLUE}{CURRENCY_LONG} @@ -4479,22 +4514,22 @@ STR_TIMETABLE_STARTING_DATE :{BLACK}시작 STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}이 시간표의 시작 날짜를 선택하세요. CTRL+클릭하면, 시간표가 모두 작성되어 있다는 가정 하에, 주어진 경로를 기반으로 설정한 날짜부터 이 경로를 공유하는 모든 차량을 균등하게 출발시킵니다 STR_TIMETABLE_CHANGE_TIME :{BLACK}시간값 변경 -STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}선택한 경로에서 소요되는 시간 값을 변경합니다 +STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}선택한 경로에서 소요되는 시간 값을 변경합니다. CTRL+클릭하면 모든 경로에 그 시간 값을 설정합니다 STR_TIMETABLE_CLEAR_TIME :{BLACK}시간값 초기화 -STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}선택한 경로에서 소요되는 시간 값을 초기화합니다 +STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}선택한 경로에서 소요되는 시간 값을 초기화합니다. CTRL+클릭하면 모든 경로의 시간을 초기화합니다 STR_TIMETABLE_CHANGE_SPEED :{BLACK}속력 제한 -STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}선택한 경로의 최대 여행 속력을 제한합니다 +STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}선택한 경로의 최대 여행 속력을 제한합니다. CTRL+클릭하면 모든 경로에 그 속력 값을 설정합니다 STR_TIMETABLE_CLEAR_SPEED :{BLACK}속력 제한값 초기화 -STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}선택한 경로의 최대 여행 속력 제한값을 초기화합니다 +STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}선택한 경로의 최대 여행 속력 제한값을 초기화합니다. CTRL+클릭하면 모든 경로의 속력을 초기화합니다 STR_TIMETABLE_RESET_LATENESS :{BLACK}지연 시간 초기화 STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}이 차량의 지연 시간값을 초기화하여, 정시운행 상태로 바꿉니다 STR_TIMETABLE_AUTOFILL :{BLACK}자동 시간 설정 -STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}다음 운행시 자동으로 값을 얻어 시간표를 완성합니다 (역에 머무르는 시간값을 유지하려면 CTRL+클릭하십시오) +STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}다음 운행시 자동으로 값을 얻어 시간표를 완성합니다. 역에 머무르는 시간값을 유지하려면 CTRL+클릭하세요 STR_TIMETABLE_EXPECTED :{BLACK}예정일 기준 STR_TIMETABLE_SCHEDULED :{BLACK}예정 소요시간 기준 @@ -4529,7 +4564,7 @@ STR_AI_DEBUG_MATCH_CASE :{BLACK}대소 STR_AI_DEBUG_MATCH_CASE_TOOLTIP :{BLACK}인공지능 기록 메시지에서 중단 문구를 검색할 때 대소문자를 구분할지 여부를 선택합니다 STR_AI_DEBUG_CONTINUE :{BLACK}계속 STR_AI_DEBUG_CONTINUE_TOOLTIP :{BLACK}중단된 인공지능의 연산을 재개합니다 -STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}이 인공지능에서 출력된 기록 메시지를 보여줍니다. +STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}이 인공지능에서 출력된 기록 메시지를 보여줍니다 STR_AI_GAME_SCRIPT :{BLACK}게임 스크립트 STR_AI_GAME_SCRIPT_TOOLTIP :{BLACK}게임 스크립트 기록 체크 @@ -4538,12 +4573,14 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}작동 STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}인공지능/게임 스크립트 디버그창은 오직 서버만 사용 가능합니다 # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}인공지능 / 게임 스크립트 설정 +STR_AI_CONFIG_CAPTION_AI :{WHITE}인공지능 설정 +STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}게임 스크립트 설정 STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}다음에 게임을 시작할 때 이 게임 스크립트를 불러올 것입니다 STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}다음에 게임을 시작할 때 이 인공지능을 불러올 것입니다 STR_AI_CONFIG_HUMAN_PLAYER :사용자 플레이어 STR_AI_CONFIG_RANDOM_AI :무작위 인공지능 STR_AI_CONFIG_NONE :(없음) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}최대 경쟁자수: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}위로 이동 STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}목록에서 선택한 인공지능의 순서를 한 칸 위로 옮깁니다 @@ -4551,13 +4588,12 @@ STR_AI_CONFIG_MOVE_DOWN :{BLACK}아래 STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}목록에서 선택한 인공지능의 순서를 한 칸 아래로 옮깁니다 STR_AI_CONFIG_GAMESCRIPT :{SILVER}게임 스크립트 +STR_AI_CONFIG_GAMESCRIPT_PARAM :{SILVER}매개 변수 STR_AI_CONFIG_AI :{SILVER}인공지능 -STR_AI_CONFIG_CHANGE :{BLACK}{STRING} 선택하기 -STR_AI_CONFIG_CHANGE_NONE : -STR_AI_CONFIG_CHANGE_AI :인공지능 -STR_AI_CONFIG_CHANGE_GAMESCRIPT :게임 스크립트 -STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}다른 스크립트 불러오기 +STR_AI_CONFIG_CHANGE_AI :{BLACK}인공지능을 선택하세요 +STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}게임 스크립트 선택 +STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}다른 게임 스크립트를 불러옵니다 STR_AI_CONFIG_CONFIGURE :{BLACK}설정 STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}인공지능의 매개 변수를 설정합니다 @@ -4585,9 +4621,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}높이 STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}미니맵 스크린 샷 # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} 매개 변수 -STR_AI_SETTINGS_CAPTION_AI :인공지능 -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :게임 스크립트 +STR_AI_SETTINGS_CAPTION_AI :{WHITE}인공지능 매개 변수 STR_AI_SETTINGS_CLOSE :{BLACK}닫기 STR_AI_SETTINGS_RESET :{BLACK}초기화 STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4751,6 +4785,7 @@ STR_ERROR_TOO_MANY_INDUSTRIES :{WHITE}... 산 STR_ERROR_CAN_T_GENERATE_INDUSTRIES :{WHITE}산업시설을 생성할 수 없습니다... STR_ERROR_CAN_T_BUILD_HERE :{WHITE}여기에 {STRING}{G 0 "을" "를"} 건설할 수 없습니다... STR_ERROR_CAN_T_CONSTRUCT_THIS_INDUSTRY :{WHITE}여기에 산업시설을 건설할 수 없습니다... +STR_ERROR_CAN_T_PROSPECT_INDUSTRY :{WHITE}산업시설에 투자할 수 없습니다... STR_ERROR_INDUSTRY_TOO_CLOSE :{WHITE}... 다른 산업시설과 너무 가깝습니다 STR_ERROR_MUST_FOUND_TOWN_FIRST :{WHITE}... 도시를 먼저 만들어야 합니다 STR_ERROR_ONLY_ONE_ALLOWED_PER_TOWN :{WHITE}... 한 도시에 하나만 지을 수 있습니다 @@ -4765,6 +4800,8 @@ STR_ERROR_FOREST_CAN_ONLY_BE_PLANTED :{WHITE}... 숲 STR_ERROR_CAN_ONLY_BE_BUILT_ABOVE_SNOW_LINE :{WHITE}... 만년설 고도 위에만 지을 수 있습니다 STR_ERROR_CAN_ONLY_BE_BUILT_BELOW_SNOW_LINE :{WHITE}... 만년설 고도 아래에만 지을 수 있습니다 +STR_ERROR_PROSPECTING_WAS_UNLUCKY :{WHITE}운이 나빠 투자에 실패했습니다. 다시 시도해주세요. +STR_ERROR_NO_SUITABLE_PLACES_FOR_PROSPECTING :{WHITE}이 산업시설을 투자하기에 적합한 장소가 없습니다 STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES :{WHITE}적당한 장소가 없어 '{STRING}'{G 0 "이" "가"} 지어지지 않았습니다 STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES_EXPLANATION :{WHITE}더 나은 지도가 생성되도록 설정 값을 변경해보십시오 @@ -5005,6 +5042,8 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}점검 STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... 차량이 파괴되었습니다 +STR_ERROR_CAN_T_CLONE_VEHICLE_LIST :{WHITE}... 동일한 구성이 아닌 차량이 있습니다 + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}사용할 수 있는 차량이 모두 없어질 것입니다 STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}NewGRF 설정을 변경하십시오 STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}사용할 수 있는 차량이 하나도 없습니다 @@ -5031,6 +5070,8 @@ STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}선택 STR_ERROR_CAN_T_COPY_SHARE_ORDER :{WHITE}... 차량이 모든 정거장에 갈 수 없습니다 STR_ERROR_CAN_T_ADD_ORDER :{WHITE}... 차량이 그 정거장에 갈 수 없습니다 STR_ERROR_CAN_T_ADD_ORDER_SHARED :{WHITE}... 경로를 공유하고 있는 차량이 그 정거장에 갈 수 없습니다 +STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST :{WHITE}... 같은 경로를 가지고 있지 않은 차량이 하나 이상 있습니다 +STR_ERROR_CAN_T_SHARE_ORDER_VEHICLE_LIST :{WHITE}... 경로를 공유하지 않은 차량이 하나 이상 있습니다 STR_ERROR_CAN_T_SHARE_ORDER_LIST :{WHITE}경로를 공유할 수 없습니다... STR_ERROR_CAN_T_STOP_SHARING_ORDER_LIST :{WHITE}경로 공유를 중단할 수 없습니다... diff --git a/src/lang/latin.txt b/src/lang/latin.txt index b457008dba..07a823ad98 100644 --- a/src/lang/latin.txt +++ b/src/lang/latin.txt @@ -387,6 +387,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}hp STR_UNITS_POWER_METRIC :{COMMA}{NBSP}hp STR_UNITS_POWER_SI :{COMMA}{NBSP}kW + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -564,10 +565,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Exire # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Ludi optiones STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Electiones -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Optiones IA/Ludi scriptorum STR_SETTINGS_MENU_NEWGRF_SETTINGS :Optiones NewGRF STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Optiones perluciditatis STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Nomina oppidorum spectabilia @@ -1121,36 +1121,6 @@ STR_GAME_OPTIONS_CURRENCY_GEL :Lari Georgiana STR_GAME_OPTIONS_CURRENCY_IRR :Regalis Iranica (IRR) STR_GAME_OPTIONS_CURRENCY_RUB :Novus Rubelus Russicus (RUB) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Gubernantur sinistro -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Gubernantur dextro - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Nomina oppidorum -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Eligere oppidorum nomina - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Anglica (Primigenia) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Francogallica -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Theodisca -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Anglica (Additicia) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Americae Latinae -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Ridicula -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Suecica -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Batavica -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finnica -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Polonica -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slovaca -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norvegica -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Hungarica -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Austriaca -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Romanica -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Cecha -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Helvetica -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Danica -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turcica -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italiana -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Catalana - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Servare automatice STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Eligere crebritatem automatice ludum servandi @@ -1175,19 +1145,8 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :alia -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Magnitudo interfaciei -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Eligere magnitudinem interfaciei adhibendam -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Simplex -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Duplex -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Quadruplex -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Magnitudo Litterarum -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Eligere magnitudinem litterarum adhibendam - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Simplex -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Duplex -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Quadruplex @@ -1234,8 +1193,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Praevis STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}Copia nummi tui quae aequa est 10000 Librae Britannicae (£) STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Mutare parametrum nummi proprii -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Numerus competitorum maximus: {ORANGE}{COMMA} - STR_NONE :Nullae STR_FUNDING_ONLY :Modo conditu STR_MINIMAL :Minimus @@ -1285,6 +1242,12 @@ STR_SUBSIDY_X2 :Duplex STR_SUBSIDY_X3 :Triplex STR_SUBSIDY_X4 :Quadruplex +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Terra temperata +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Terra subarctica +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Terra subtropica +STR_CLIMATE_TOYLAND_LANDSCAPE :Terra ludicrorum + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Planissimus STR_TERRAIN_TYPE_FLAT :Planus @@ -1621,6 +1584,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Melior STR_CONFIG_SETTING_ROAD_SIDE :Vehicula viaria: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Eligere latus viae gubernandi +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Gubernantur sinistro +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Gubernantur dextro + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Rotatio tabulae altitudinum: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Sinistrorsus @@ -2107,7 +2074,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Reversio automa STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Sinere tramina reverti apud signale, si illic valde morati sunt ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Commendatum) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Commendatum) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Mutare valorem optionis @@ -2148,7 +2115,6 @@ STR_INTRO_HIGHSCORE :{BLACK}Album Pu STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Electiones STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF Optiones STR_INTRO_ONLINE_CONTENT :{BLACK}Inspicere Inventarium Interretiale -STR_INTRO_SCRIPT_SETTINGS :{BLACK}IA/Ludi Scriptorum Optiones STR_INTRO_QUIT :{BLACK}Exire STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Incipere novum ludum. Ctrl+Preme ut configuratio tabulae omittatur @@ -2168,7 +2134,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Monstrar STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Monstrare electiones STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Monstrare optiones NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Inspicere inventarium Interretiale in quo res sicut NewGRF, scaenaria, musica, etc. sunt -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Monstrare optiones IA/Ludi scriptorum STR_INTRO_TOOLTIP_QUIT :{BLACK}Exire OpenTTD STR_INTRO_BASESET :{BLACK}Hoc fundamento graphico desunt spiritus {NUM}. Quaere novam editionem huius fundamenti. @@ -2198,12 +2163,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Mutare STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Mutare annum currentem STR_CHEAT_SETUP_PROD :{LTBLUE}Sinere mutare productiones industriarum: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Terra temperata -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Terra subarctica -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Terra subtropica -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Terra ludicrorum - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} Schema Coloris @@ -3073,16 +3032,41 @@ STR_MAPGEN_MAPSIZE :{BLACK}Tabulae STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Eligere magnitudinem tegularum tabulae geographicae. Tegulae parabiles fere minores erunt STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Numerus oppidorum: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Nomina oppidorum +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Eligere oppidorum nomina STR_MAPGEN_DATE :{BLACK}Dies: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Numerus industriarum: STR_MAPGEN_LAND_GENERATOR :{BLACK}Generatrum terrae: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Typus terrae: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Magnitudo maris: +STR_MAPGEN_SEA_LEVEL :{BLACK}Magnitudo maris: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Numerus fluviorum: STR_MAPGEN_SMOOTHNESS :{BLACK}Lenitas: STR_MAPGEN_VARIETY :{BLACK}Partitio Varietatis: STR_MAPGEN_GENERATE :{WHITE}Creare +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Anglica (Primigenia) +STR_MAPGEN_TOWN_NAME_FRENCH :Francogallica +STR_MAPGEN_TOWN_NAME_GERMAN :Theodisca +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Anglica (Additicia) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Americae Latinae +STR_MAPGEN_TOWN_NAME_SILLY :Ridicula +STR_MAPGEN_TOWN_NAME_SWEDISH :Suecica +STR_MAPGEN_TOWN_NAME_DUTCH :Batavica +STR_MAPGEN_TOWN_NAME_FINNISH :Finnica +STR_MAPGEN_TOWN_NAME_POLISH :Polonica +STR_MAPGEN_TOWN_NAME_SLOVAK :Slovaca +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norvegica +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Hungarica +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Austriaca +STR_MAPGEN_TOWN_NAME_ROMANIAN :Romanica +STR_MAPGEN_TOWN_NAME_CZECH :Cecha +STR_MAPGEN_TOWN_NAME_SWISS :Helvetica +STR_MAPGEN_TOWN_NAME_DANISH :Danica +STR_MAPGEN_TOWN_NAME_TURKISH :Turcica +STR_MAPGEN_TOWN_NAME_ITALIAN :Italiana +STR_MAPGEN_TOWN_NAME_CATALAN :Catalana + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Fines tabulae: STR_MAPGEN_NORTHWEST :{BLACK}Corus @@ -3223,6 +3207,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Spiritum STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Ire ad spiritum naturalem priorem et, termino contacto, ad ultimum revertere STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Imago spiritus electi. Directio neglegitur cum hic spiritus pingitur STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Movere spiritum mutatione X et Y incrementa. Ctrl+Preme ut spiritus octoni incrementa moveatur + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Reponere relativas STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Reponere positiones relativas STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}Positio X: {NUM}, Positio Y: {NUM} (Absolutae) @@ -3755,6 +3743,8 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Vis Trac STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Max. distantia volatus: {GOLD}{COMMA} tegulas STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Typus aeroplani: {GOLD}{STRING} +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Index electionis vehiculorum ferriviariorum. Preme in vehiculum ut plura indicia monstrentur. Ctrl+Preme ut typus vehiculi celetur STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Index electionis vehiculorum viariorum. Preme in vehiculum ut plura indicia monstrentur. Ctrl+Preme ut typus vehiculi celetur @@ -4395,12 +4385,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Unum cur STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Fenestra Emendationis IA/Ludi Scripti tantum servatro licet uti # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Configuratio IA/Ludi Scriptum STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Ludi Scriptum quod imponet ludo proximo STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}IA quae imponet ludo proximo STR_AI_CONFIG_HUMAN_PLAYER :Lusor humanus STR_AI_CONFIG_RANDOM_AI :IA Fortuita STR_AI_CONFIG_NONE :(nullum) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Numerus competitorum maximus: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Sursum Movere STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Movere IA electam sursum in indice @@ -4410,8 +4400,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Movere I STR_AI_CONFIG_GAMESCRIPT :{SILVER}Ludi Scriptum STR_AI_CONFIG_AI :{SILVER}AI -STR_AI_CONFIG_CHANGE :{BLACK}Eligere {STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :IA STR_AI_CONFIG_CHANGE_GAMESCRIPT :Scriptum STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Legere aliud ludi scriptum @@ -4435,9 +4423,7 @@ STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Non scri # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametra STR_AI_SETTINGS_CAPTION_AI :IA -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Ludi Scripti STR_AI_SETTINGS_CLOSE :{BLACK}Claudere STR_AI_SETTINGS_RESET :{BLACK}Revertere STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4843,6 +4829,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Non lice STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... vehiculum est destructum! + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Nulla vehicula omnino parabilia erunt STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Muta configurationem NewGRF tuam STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Nulla vehicula adhuc parabilia sunt diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt index 29d8846151..31191ebf5b 100644 --- a/src/lang/latvian.txt +++ b/src/lang/latvian.txt @@ -202,6 +202,11 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}ZS STR_UNITS_POWER_METRIC :{COMMA}{NBSP}ZS STR_UNITS_POWER_SI :{COMMA}{NBSP}kW +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_SI :{DECIMAL}{NBSP}zs/Mg +STR_UNITS_POWER_METRIC_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}zs/l +STR_UNITS_POWER_SI_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}kW/l +STR_UNITS_POWER_SI_TO_WEIGHT_SI :{DECIMAL}{NBSP}W/kg + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -393,10 +398,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Iziet # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Spēles opcijas STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Iestatījumi -STR_SETTINGS_MENU_SCRIPT_SETTINGS :MI/spēles skriptu iestatījumi STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF iestatījumi STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Caurspīdības opcijas STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Rādīt pilsētu nosaukumus @@ -967,36 +971,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Indijas rūpija STR_GAME_OPTIONS_CURRENCY_IDR :Indonēzijas rūpija (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Malaizijas Ringits (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Brauc pa kreiso pusi -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Brauc pa labo pusi - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Pilsētu nosaukumi: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Pilsētu nosaukumu stila izvēle - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Angļu (sākotnējie) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Franču -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Vācu -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Angļu (papildu) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Latīņamerikāņu -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Muļķīgie -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Zviedru -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Holandiešu -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Somu -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Poļu -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slovāku -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norvēģu -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Ungāru -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Austriešu -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Rumāņu -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Čehu -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Šveiciešu -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Dāņu -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turku -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Itāļu -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Katalāņu - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Automātiskā saglabāšana STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Izvēlēties spēles automātiskās saglabāšanas starplaikus @@ -1029,21 +1003,13 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Atzīmē STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Esošais vadītājs: {STRING} -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Lietotāja saskarnes lielums -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Lietotāja saskarnes elementu lieluma izvēle +STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Velciet slīdni, lai iestatītu interfeisa izmēru. Turiet nospiestu taustiņu Ctrl, lai veiktu nepārtrauktu regulēšanu +STR_GAME_OPTIONS_GUI_SCALE_AUTO :{BLACK}Automātiski noteikt izmēru -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(automātiski noteikt) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Parasts -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Divkāršs -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Četrkāršs -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Fonta izmērs -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Izvēlieties saskarnes fonta izmēru - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(automātiski noteikt) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normāls -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Divkāršs izmērs -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Četrkāršs izmērs +STR_GAME_OPTIONS_GUI_SCALE_2X :2x +STR_GAME_OPTIONS_GUI_SCALE_3X :3x +STR_GAME_OPTIONS_GUI_SCALE_5X :5x STR_GAME_OPTIONS_GRAPHICS :{BLACK}Grafika @@ -1095,8 +1061,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Priekš STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 mārciņas (£) jūsu valūtā STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Mainīt pielāgotās valūtas rādītāju -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Maksimālais sāncenšu daudzums: {ORANGE}{COMMA} - STR_NONE :Nav STR_FUNDING_ONLY :Tikai līdzekļu piešķiršana STR_MINIMAL :Minimāls @@ -1146,6 +1110,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Mērena klimata ainava +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Subarktikas klimata ainava +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Subtropu klimata ainava +STR_CLIMATE_TOYLAND_LANDSCAPE :Rotaļlietu zemes ainava + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Ļoti līdzens STR_TERRAIN_TYPE_FLAT :Līdzens @@ -1505,6 +1475,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Uzlabotais STR_CONFIG_SETTING_ROAD_SIDE :Autotransporta līdzekļi: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Izvēlieties braukšanas pusi +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Brauc pa kreiso pusi +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Brauc pa labo pusi + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Augstumu kartes pagriešana: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Pret pulksteņa rādītāja virzienu @@ -2041,7 +2015,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Automātiska ap STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Atļauj vilcieniem apgriezties pie signālierīcēm, ja tie te ir gaidījuši ilgu laiku ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(ieteicamais) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(ieteicamais) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Mainīt iestatījuma vērtību @@ -2084,7 +2058,8 @@ STR_INTRO_HIGHSCORE :{BLACK}Sasniegu STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Iestatījumi STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF iestatījumi STR_INTRO_ONLINE_CONTENT :{BLACK}Pārbaudīt tiešsaistes saturu -STR_INTRO_SCRIPT_SETTINGS :{BLACK}MI/spēles skriptu iestatījumi +STR_INTRO_AI_SETTINGS :{BLACK}AI Iestatījumi +STR_INTRO_GAMESCRIPT_SETTINGS :{BLACK}Spēles Skripta Iestatījumi STR_INTRO_QUIT :{BLACK}Iziet STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Sākt jaunu spēli. Ctrl+klikšķis izlaiž kartes konfigurēšanu @@ -2104,7 +2079,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Rādīt STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Displeja iestatījumi STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Rādīt NewGRF iestatījumus STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Pārbaudīt vai lejupielādei nav pieejams jauns un atjaunināts saturs -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Rādīt MI un spēles skriptu iestatījumus STR_INTRO_TOOLTIP_QUIT :{BLACK}Iziet no 'OpenTTD' STR_INTRO_BASESET :{BLACK}Pašlaik izvēlētajai bāzes grafikas kopai trūkst {NUM} sprait{P s i u}. Lūdzu, pārbaudiet, vai bāzes kopai ir atjauninājumi. @@ -2136,12 +2110,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Nomain STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Mainīt pašreizējo gadu STR_CHEAT_SETUP_PROD :{LTBLUE}Ieslēgt ražojumu vērtības maiņu: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Mērena klimata ainava -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Subarktikas klimata ainava -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Subtropu klimata ainava -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Rotaļlietu zemes ainava - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - krāsu shēma @@ -2622,6 +2590,8 @@ STR_LINKGRAPH_LEGEND_SATURATED :{TINY_FONT}{BLA STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLACK}pārslogots # Linkgraph tooltip +STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} jātransportē atpakaļ ({COMMA}% no pārvadājuma) +STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}Vidējais ceļojuma laiks: {NUM}{NBSP}dienas # Base for station construction window(s) STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Pārklājuma iezīmēšana @@ -3145,6 +3115,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Kartes i STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Izvēlieties kartes izmēru, izteikts lauciņos. Pieejamo lauciņu skaits var būt nedaudz mazāks STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Pilsētu daudzums: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Pilsētu nosaukumi: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Pilsētu nosaukumu stila izvēle STR_MAPGEN_DATE :{BLACK}Datums: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Ražotņu daudzums: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Augstākā virsotne: @@ -3160,12 +3132,35 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Samazin STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Zemes radītājs: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Apvidus reljefs: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Jūras līmenis: +STR_MAPGEN_SEA_LEVEL :{BLACK}Jūras līmenis: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Upes: STR_MAPGEN_SMOOTHNESS :{BLACK}Gludums: STR_MAPGEN_VARIETY :{BLACK}Dažādības sadalījums: STR_MAPGEN_GENERATE :{WHITE}Radīt +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Angļu (sākotnējie) +STR_MAPGEN_TOWN_NAME_FRENCH :Franču +STR_MAPGEN_TOWN_NAME_GERMAN :Vācu +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Angļu (papildu) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Latīņamerikāņu +STR_MAPGEN_TOWN_NAME_SILLY :Muļķīgie +STR_MAPGEN_TOWN_NAME_SWEDISH :Zviedru +STR_MAPGEN_TOWN_NAME_DUTCH :Holandiešu +STR_MAPGEN_TOWN_NAME_FINNISH :Somu +STR_MAPGEN_TOWN_NAME_POLISH :Poļu +STR_MAPGEN_TOWN_NAME_SLOVAK :Slovāku +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norvēģu +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Ungāru +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Austriešu +STR_MAPGEN_TOWN_NAME_ROMANIAN :Rumāņu +STR_MAPGEN_TOWN_NAME_CZECH :Čehu +STR_MAPGEN_TOWN_NAME_SWISS :Šveiciešu +STR_MAPGEN_TOWN_NAME_DANISH :Dāņu +STR_MAPGEN_TOWN_NAME_TURKISH :Turku +STR_MAPGEN_TOWN_NAME_ITALIAN :Itāļu +STR_MAPGEN_TOWN_NAME_CATALAN :Katalāņu + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Kartes malas: STR_MAPGEN_NORTHWEST :{BLACK}Ziemeļrietumi @@ -3310,6 +3305,11 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Iepriek STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Iet pie iepriekšējā parastā gariņa, izlaižot visus pseido/pārkrāsotos/fonta gariņus STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Atlasītā gariņa attēlojums. To attēlojot, izkārtojums netiek ievērots STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Pārvietot gariņu, lai mainītu X un Y vērtības. Ctrl+klikšķis, lai vienā piegājienā pārvietotu gariņu par astoņām vienībām + +###length 2 +STR_SPRITE_ALIGNER_CENTRE_SPRITE :{BLACK}Spraits centrēts + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Atiestatīt relatīvi STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Pāriestatīt paršreizējo relatīvo nobīdi STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X nobīde: {NUM}, Y nobīde: {NUM} (absolūta) @@ -3653,14 +3653,16 @@ STR_FINANCES_SECTION_LOAN_INTEREST :{GOLD}Aizdevuma STR_FINANCES_SECTION_OTHER :{GOLD}Citi STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} +STR_FINANCES_ZERO_INCOME :{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} -STR_FINANCES_NET_PROFIT :{WHITE}Tīrā peļņa +STR_FINANCES_PROFIT :{WHITE}Peļņa STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Bankas bilance STR_FINANCES_OWN_FUNDS_TITLE :{WHITE}Pašu līdzekļi STR_FINANCES_LOAN_TITLE :{WHITE}Aizdevums STR_FINANCES_INTEREST_RATE :{WHITE}Aizdevuma procenti: {BLACK}{NUM}% STR_FINANCES_MAX_LOAN :{WHITE}Maksimālais aizdevums: {BLACK}{CURRENCY_LONG} STR_FINANCES_TOTAL_CURRENCY :{BLACK}{CURRENCY_LONG} +STR_FINANCES_BANK_BALANCE :{WHITE}{CURRENCY_LONG} STR_FINANCES_BORROW_BUTTON :{BLACK}Aizņemties {CURRENCY_LONG} STR_FINANCES_BORROW_TOOLTIP :{BLACK}Palielināt aizdevuma apmēru. Ctrl+klikšķis lai aizņemtos cik daudz vien iespējams STR_FINANCES_REPAY_BUTTON :{BLACK}Atmaksāt {CURRENCY_LONG} @@ -3792,6 +3794,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Sūtīt STR_VEHICLE_LIST_REPLACE_VEHICLES :Nomainīt transportlīdzekļus STR_VEHICLE_LIST_SEND_FOR_SERVICING :Sūtīt uz apkopi STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Peļņa šogad: {CURRENCY_LONG} (pērn: {CURRENCY_LONG}) +STR_VEHICLE_LIST_CARGO :{TINY_FONT}{BLACK}[{CARGO_LIST}] +STR_VEHICLE_LIST_NAME_AND_CARGO :{TINY_FONT}{BLACK}{STRING} {STRING} STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Sūtīt uz depo STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Sūtīt uz depo @@ -3883,6 +3887,8 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Maksimā STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Apgabas: {GOLD}{COMMA} lauciņi STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Lidaparāta veids: {GOLD}{STRING} +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Vilciena vagonu atlasīšanas saraksts - klikšķināt uz transportlīdzekļa, lai iegūtu informāciju STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Autotransporta atlasīšanas saraksts - klikšķināt uz transportlīdzekļa, lai iegūtu informāciju @@ -4543,12 +4549,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Viens no STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}MI/spēles skriptu atkļūdošanas logs ir pieejams tikai serverim # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}MI/spēles skriptu konfigurācija STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Spēles skripts, kas tiks ielādēts nākamajā spēlē STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}MI, kas tiks ielādēts nākamajā spēlē STR_AI_CONFIG_HUMAN_PLAYER :Spēlētājs (cilvēks) STR_AI_CONFIG_RANDOM_AI :Nejaušs MI STR_AI_CONFIG_NONE :(nav) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Maksimālais sāncenšu daudzums: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Pacelt uz augšu STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Pacelt izvēlētos MI sarakstā uz augšu @@ -4556,10 +4562,9 @@ STR_AI_CONFIG_MOVE_DOWN :{BLACK}Nolaist STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Nolaist izvēlētos MI sarakstā uz leju STR_AI_CONFIG_GAMESCRIPT :{SILVER}Spēles skripti +STR_AI_CONFIG_GAMESCRIPT_PARAM :{SILVER}Parametri STR_AI_CONFIG_AI :{SILVER}MI -STR_AI_CONFIG_CHANGE :{BLACK}Izvēlēties {STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :MI STR_AI_CONFIG_CHANGE_GAMESCRIPT :Spēles skripts STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Ielādēt citu skriptu @@ -4590,9 +4595,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Augstumk STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Minikartes ekrānuzņēmums # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} parametri STR_AI_SETTINGS_CAPTION_AI :MI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Spēles skripts STR_AI_SETTINGS_CLOSE :{BLACK}Aizvērt STR_AI_SETTINGS_RESET :{BLACK}Atiestatīt STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4937,6 +4940,7 @@ STR_ERROR_OBJECT_IN_THE_WAY :{WHITE}Traucēj STR_ERROR_COMPANY_HEADQUARTERS_IN :{WHITE}... traucē uzņēmuma birojs STR_ERROR_CAN_T_PURCHASE_THIS_LAND :{WHITE}Nevar nopirkt šo zemes platību... STR_ERROR_YOU_ALREADY_OWN_IT :{WHITE}... tā jums jau pieder! +STR_ERROR_BUILD_OBJECT_LIMIT_REACHED :{WHITE}... sasniegts objektu būvniecības limits # Group related errors STR_ERROR_GROUP_CAN_T_CREATE :{WHITE}Nevar izveidot grupu... @@ -5009,6 +5013,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Nevar ma STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... transportlīdzeklis ir iznīcināts + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Vispār nebūs pieejami transporta līdzekļi STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Mainiet jūsu NewGRF konfogurāciju STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Transportlīdzekļi vēl nav pieejami diff --git a/src/lang/lithuanian.txt b/src/lang/lithuanian.txt index 6dca3fc2b0..1e4b97552c 100644 --- a/src/lang/lithuanian.txt +++ b/src/lang/lithuanian.txt @@ -395,6 +395,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}AG STR_UNITS_POWER_METRIC :{COMMA}{NBSP}AG STR_UNITS_POWER_SI :{COMMA}{NBSP}kW + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -584,10 +585,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Išeiti # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Pagrindinės nuostatos STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Išplėstinės nuostatos -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Dirbtinio intelekto nuostatos STR_SETTINGS_MENU_NEWGRF_SETTINGS :Plėtinių nuostatos STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Skaidrumo nuostatos STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Miestų pavadinimai @@ -1167,36 +1167,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Indijos rupijos STR_GAME_OPTIONS_CURRENCY_IDR :Indonezijos rupijos (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Malaizijos ringitai (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Kairiąja puse -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Dešiniąja puse - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Miestų pavadinimai: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Pasirink miestų pavadinimų tipą - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Anglų (Oginalus) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Prancūzų -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Vokiečių -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Anglų (Papildomas) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Lotynų-Amerikos -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Kvaili -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Švedų -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Olandų -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Suomių -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Lenkų -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slovakų -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norvegų -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Vengrų -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Austrų -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Rumunų -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Čekų -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Šveicarų -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Danų -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turkiški -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italų -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Katalonų - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Automatinis išsaugojimas STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Pasirink, kaip dažnai išsaugoti žaidimą @@ -1227,21 +1197,8 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Kad pake STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}Vertikalioji sinchronizacija (VSync) -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Sąsajos elementų dydis -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Pasirinkite vartotojo sąsajos elementų santykinį dydį -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(aptikti automatiškai) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normalus -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Dvigubas -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Keturgubas -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Šrifto dydis -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Pasirinkite vartotojo sąsajos šrifto dydį - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(aptikti automatiškai) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normalus -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Dvigubas -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Keturgubas STR_GAME_OPTIONS_GRAPHICS :{BLACK}Grafika @@ -1293,8 +1250,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Perži STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 svarų (£) jūsų valiuta STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Keisti pasirinktos valiutos nustatymus -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Didžiausias priešininkų skaičius: {ORANGE}{COMMA} - STR_NONE :Nėra STR_FUNDING_ONLY :Tik finansavimas STR_MINIMAL :Mažiausias @@ -1344,6 +1299,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Normalus klimatas +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Sub-arktinis klimatas +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Sub-tropinis klimatas +STR_CLIMATE_TOYLAND_LANDSCAPE :'Žaislinis' klimatas + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Tik lygumos STR_TERRAIN_TYPE_FLAT :Lygumos @@ -1699,6 +1660,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Naujasis STR_CONFIG_SETTING_ROAD_SIDE :Automobilių eismas: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Eismo pusė +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Kairiąja puse +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Dešiniąja puse + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Aukščių žemėlapio pasukimas: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Prieš laikrodžio rodyklę @@ -2239,7 +2204,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Apsisukimas pri STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Leisti traukiniams apsisukti ir bandyti važiuoti priešinga kryptimi, jei ties šviesoforu jiems tenka laukti pernelyg ilgai ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Rekomenduojama) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Rekomenduojama) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Keisti reikšmes @@ -2282,7 +2247,6 @@ STR_INTRO_HIGHSCORE :{BLACK}Nugalėt STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Išplėstinės nuostatos STR_INTRO_NEWGRF_SETTINGS :{BLACK}Plėtiniai STR_INTRO_ONLINE_CONTENT :{BLACK}Interneto turinys -STR_INTRO_SCRIPT_SETTINGS :{BLACK}Dirbtinio intelekto nuostatos STR_INTRO_QUIT :{BLACK}Išeiti STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Pradėti naują žaidimą. Spragtelėjus laikant nuspaustą Ctrl klavišą, naujas žemėlapis bus sugeneruotas nedelsiant ir nieko nebeklausiant @@ -2302,7 +2266,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Rodyti n STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Rodyti išplėstines nuostatas STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Rodyti parsisiųstus plėtinius ir jų nuostatas STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Tikrinti, ar nėra naujų plėtinių arba atnaujinimų jau atsisiųstiems plėtiniams -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Rodyti dirbtinio intelekto nuostatas STR_INTRO_TOOLTIP_QUIT :{BLACK}Išeiti iš „OpenTTD“ žaidimo STR_INTRO_BASESET :{BLACK}Šiuo metu pasirinktame grafikos rinkinyje trūksta {NUM} sprukl{P io ių ių}. Patikrinkite, ar nėra naujinių. @@ -2334,12 +2297,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Pakeist STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Pakeisti dabartinius metus STR_CHEAT_SETUP_PROD :{LTBLUE}Leisti keisti produkcijos vertes: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Normalus klimatas -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Sub-arktinis klimatas -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Sub-tropinis klimatas -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :'Žaislinis' klimatas - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Kompanijos spalvos @@ -3288,6 +3245,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Žemėla STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Pasirinkite žemėlapio dydį langeliais. Prieinamų langelių skaičius bus šiek tiek mažesnis. STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Miestų kiekis: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Miestų pavadinimai: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Pasirink miestų pavadinimų tipą STR_MAPGEN_DATE :{BLACK}Pradžios data: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Pramonės įmonių kiekis: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Didžiausias aukštis @@ -3303,12 +3262,35 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Sumažin STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Generavimo algoritmas: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Vietovės tipas: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Jūros lygis: +STR_MAPGEN_SEA_LEVEL :{BLACK}Jūros lygis: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Upių kiekis: STR_MAPGEN_SMOOTHNESS :{BLACK}Jautrumas: STR_MAPGEN_VARIETY :{BLACK}Įvairovės paskirstymas: STR_MAPGEN_GENERATE :{WHITE}Sukurti +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Anglų (Oginalus) +STR_MAPGEN_TOWN_NAME_FRENCH :Prancūzų +STR_MAPGEN_TOWN_NAME_GERMAN :Vokiečių +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Anglų (Papildomas) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Lotynų-Amerikos +STR_MAPGEN_TOWN_NAME_SILLY :Kvaili +STR_MAPGEN_TOWN_NAME_SWEDISH :Švedų +STR_MAPGEN_TOWN_NAME_DUTCH :Olandų +STR_MAPGEN_TOWN_NAME_FINNISH :Suomių +STR_MAPGEN_TOWN_NAME_POLISH :Lenkų +STR_MAPGEN_TOWN_NAME_SLOVAK :Slovakų +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norvegų +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Vengrų +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Austrų +STR_MAPGEN_TOWN_NAME_ROMANIAN :Rumunų +STR_MAPGEN_TOWN_NAME_CZECH :Čekų +STR_MAPGEN_TOWN_NAME_SWISS :Šveicarų +STR_MAPGEN_TOWN_NAME_DANISH :Danų +STR_MAPGEN_TOWN_NAME_TURKISH :Turkiški +STR_MAPGEN_TOWN_NAME_ITALIAN :Italų +STR_MAPGEN_TOWN_NAME_CATALAN :Katalonų + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Žemėlapio kraštai: STR_MAPGEN_NORTHWEST :{BLACK}Šiaurės vakarai @@ -3453,6 +3435,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Ankstesn STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Įkelti ankstesnį spruklį STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Pasirinkto spruklio atvaizdas, nekreipiant dėmesio į lygiavimą STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Paslinkti spruklį, keičiant X ir Y poslinkius. Spragtelėjus laikant nuspaustą Ctrl klavišą, spruklys bus slenkamas po aštuonis vienetus + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Atkurti STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Atkurti numatytuosius santykinius poslinkius STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X poslinkis: {NUM}, Y poslinkis: {NUM} (Absoliutus) @@ -4008,6 +3994,8 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Didž. t STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Nuotolis: {GOLD}{COMMA} langeliai STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Tipas: {GOLD}{STRING} +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Lokomotyvų ir vagonų sąrašas. Spragtelėjus bus parodyta platesnė informacija. Spragtelėjus laikant nuspaustą Ctrl klavišą, lokomotyvas ar vagonas bus slepiamas/rodomas sąraše STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Automobilių sąrašas. Spragtelėjus bus parodyta platesnė informacija. Spragtelėjus laikant nuspaustą Ctrl klavišą, automobilis bus slepiamas/rodomas sąraše @@ -4721,12 +4709,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Vienas i STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}DI / GameScript derinimo langas yra pasiekiamas tik iš serverio # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}DI / Žaidimo Nustatymai STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Žaidimo skriptas bus įkeltas sekančiame žaidime STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}DI'ai bus įkelti sekančiame žaidime STR_AI_CONFIG_HUMAN_PLAYER :Žaidėjas Žmogus STR_AI_CONFIG_RANDOM_AI :Atsitiktinis DI STR_AI_CONFIG_NONE :(tuščia) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Didžiausias priešininkų skaičius: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Perkelti aukščiau STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Perkelti pasirinktą DI aukščiau @@ -4736,8 +4724,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Perkelti STR_AI_CONFIG_GAMESCRIPT :{SILVER}Žaidimo skriptas STR_AI_CONFIG_AI :{SILVER}DI'ai -STR_AI_CONFIG_CHANGE :{BLACK}Pasirinkti {STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :DI STR_AI_CONFIG_CHANGE_GAMESCRIPT :Žaidimo skriptas STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Užkrauti kitą skriptą @@ -4768,9 +4754,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Teminio STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Mini žemėlapio kopija # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametrai STR_AI_SETTINGS_CAPTION_AI :DI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Žaidimo skriptas STR_AI_SETTINGS_CLOSE :{BLACK}Uždaryti STR_AI_SETTINGS_RESET :{BLACK}Atstatyti STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -5187,6 +5171,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Aptarnav STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... automobilis sunaikintas + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Nebus įmanoma įsigyti jokių transporto priemonių STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Pakeiskite plėtinių nuostatas STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Kol kas negalima įsigyti jokių transporto priemonių diff --git a/src/lang/luxembourgish.txt b/src/lang/luxembourgish.txt index d9210eb1d1..bcf6aef446 100644 --- a/src/lang/luxembourgish.txt +++ b/src/lang/luxembourgish.txt @@ -200,6 +200,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}bh STR_UNITS_POWER_METRIC :{COMMA}{NBSP}ps STR_UNITS_POWER_SI :{COMMA}{NBSP}kW + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -391,10 +392,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Eraus # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Spilloptiounen STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Astellungen -STR_SETTINGS_MENU_SCRIPT_SETTINGS :KI / Spill-Script Astellungen STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF Astellungen STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Transparenz Optiounen STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Stiednimm uweisen @@ -965,36 +965,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Indiesch Rupee STR_GAME_OPTIONS_CURRENCY_IDR :Indonesesch Rupiah (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Malaysesche Ringgit (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Lénks fueren -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Riets fueren - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Stiednimm: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Stil vun de Stiednimm wielen - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Englesch (Original) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Franséisch -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Däitsch -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Englesch (Erweidert) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Lateinamerikanesch -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Blöd -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Schwedesch -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Holländesch -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finnesch -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Polnesch -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slovakesch -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norwegesch -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Ungaresch -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Éisträichesch -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Rumänesch -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Tschechesch -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Schwäitzer -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Dänesch -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Türkesch -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italienesch -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Katalanesch - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Autospäicheren STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Wiel den Intervall aus fir d'Autospäicherung @@ -1026,21 +996,8 @@ STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Wiel des Optioun fir de V-Sync unzeman. Des gëtt eréit no engem Neistart benotzt. Funktionéiert nëmmen wann Hardwarebeschleunigung un ass -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Interfacegréisst -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Wiel d'Gréisst déi fir den Interface soll benotzt ginn -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(auto-Detekt.) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Duebel -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Véierfach -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Schrëftgréisst -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Wiel d'Interface-Schrëftgréisst aus - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(auto-Detekt.) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Duebel Gréisst -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Véierfach STR_GAME_OPTIONS_GRAPHICS :{BLACK}Graphik @@ -1092,8 +1049,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Prouf: STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 Pond (£) an denger Währung STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Änner Währungsparameter -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Maximal Unzuel vu Géigner: {ORANGE}{COMMA} - STR_NONE :Keng STR_FUNDING_ONLY :Nëmmen finanzéiren STR_MINIMAL :Minimal @@ -1143,6 +1098,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Gemässegt Klima Landschaft +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Sub-Arktesch Landschaft +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Sub-Tropesch Landschaft +STR_CLIMATE_TOYLAND_LANDSCAPE :Spillsaacheland Landschaft + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Ganz Flaach STR_TERRAIN_TYPE_FLAT :Flaach @@ -1501,6 +1462,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Verbessert STR_CONFIG_SETTING_ROAD_SIDE :Stroossegefierer: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Wiel d'Säit op där gefuer gëtt +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Lénks fueren +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Riets fueren + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Héichtenkaartrotatioun: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Géint d'Auer @@ -2027,7 +1992,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Automatescht Em STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Erlab Zich bei engem Signal emzedréinen, wann se eng laang Zäit geward hunn ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(recommandéiert) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(recommandéiert) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Astellung änneren @@ -2070,7 +2035,6 @@ STR_INTRO_HIGHSCORE :{BLACK}Beschtel STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Astellungen STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF Astellungen STR_INTRO_ONLINE_CONTENT :{BLACK}Check Online Inhalt -STR_INTRO_SCRIPT_SETTINGS :{BLACK}KI / Spill-Script Astellungen STR_INTRO_QUIT :{BLACK}Eraus STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Start en neit Spill. Ctrl+Klick iwwerspréngt Kaartenkonfiguratioun @@ -2090,7 +2054,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Beschtel STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Displayastellungen STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}NewGRF Astellungen uweisen STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Check op neien Inhalt kann downgeload gin -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Weis KI an Spill-Script-Astellungen STR_INTRO_TOOLTIP_QUIT :{BLACK}Aus 'OpenTTD' eraus goen STR_INTRO_BASESET :{BLACK}Dem grad ausgewielte Basis Grafikset fehlen {NUM} Sprite{P "" s}. W.e.g. no Updates fir dëse Set sichen. @@ -2122,12 +2085,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Datum STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Änner dat aktuellt Joer STR_CHEAT_SETUP_PROD :{LTBLUE}Erlaabt d'ännere vun de Produktiounswäerter: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Gemässegt Klima Landschaft -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Sub-Arktesch Landschaft -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Sub-Tropesch Landschaft -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Spillsaacheland Landschaft - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Neie Faarfschema @@ -3128,6 +3085,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Kaartegr STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Wiel d'Gréisst vun der Kaart a Felder. D'Unzuel vu benotzbare Felder wäert e bësse méi kleng sinn STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Unz. Dierfer: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Stiednimm: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Stil vun de Stiednimm wielen STR_MAPGEN_DATE :{BLACK}Datum: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Unz. Industrien: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Héchste Punkt: @@ -3143,12 +3102,35 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Wüstenu STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Landgenerator: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terrain Typ: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Mieresspigel: +STR_MAPGEN_SEA_LEVEL :{BLACK}Mieresspigel: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Flëss: STR_MAPGEN_SMOOTHNESS :{BLACK}Mëllt: STR_MAPGEN_VARIETY :{BLACK}Vielfaltverdeelung: STR_MAPGEN_GENERATE :{WHITE}Generéiren +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Englesch (Original) +STR_MAPGEN_TOWN_NAME_FRENCH :Franséisch +STR_MAPGEN_TOWN_NAME_GERMAN :Däitsch +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Englesch (Erweidert) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Lateinamerikanesch +STR_MAPGEN_TOWN_NAME_SILLY :Blöd +STR_MAPGEN_TOWN_NAME_SWEDISH :Schwedesch +STR_MAPGEN_TOWN_NAME_DUTCH :Holländesch +STR_MAPGEN_TOWN_NAME_FINNISH :Finnesch +STR_MAPGEN_TOWN_NAME_POLISH :Polnesch +STR_MAPGEN_TOWN_NAME_SLOVAK :Slovakesch +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norwegesch +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Ungaresch +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Éisträichesch +STR_MAPGEN_TOWN_NAME_ROMANIAN :Rumänesch +STR_MAPGEN_TOWN_NAME_CZECH :Tschechesch +STR_MAPGEN_TOWN_NAME_SWISS :Schwäitzer +STR_MAPGEN_TOWN_NAME_DANISH :Dänesch +STR_MAPGEN_TOWN_NAME_TURKISH :Türkesch +STR_MAPGEN_TOWN_NAME_ITALIAN :Italienesch +STR_MAPGEN_TOWN_NAME_CATALAN :Katalanesch + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Kaarteränner: STR_MAPGEN_NORTHWEST :{BLACK}Nordwest @@ -3293,6 +3275,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Viregt S STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Géi weider op déi nächst normal Sprite, iwwersprang all pseudo/recolour/font Sprite an sprang zréck op den Ufank no der leschter. STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Representatioun vun der grad gewielter Sprite. Den Alignement gëtt ignoréiert wann d'Sprite gezun gëtt STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Beweg Sprite, X an Y offsets enneren sech. Ctrl+Klick fir de Sprite8 Eenheete matenen ze bewegen. + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Relativ zerécksetzen STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Momentan relativ Offsets zerécksetzen STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X-Offset: {NUM}, Y-Offset: {NUM} (Absolut) @@ -3849,6 +3835,8 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Max. Zé STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Distanz: {GOLD}{COMMA} Felder STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Fliger Typ: {GOLD}{STRING} +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Zuchlëscht - klick op en Zuch fir Informatiounen. Ctrl+Klick fir tëscht dem Verstoppen hin an hier ze sprangen STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Stroossegefierlëscht - klick op en Gefier fir Informatiounen. Ctrl+Klick fir tëscht dem Verstoppen hin an hier ze sprangen @@ -4509,12 +4497,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}En Scrip STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}KI / Spill-Script Debugfënster ass nëmmen fir Serveren verfügbar # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}KI /Spill-Script Konfiguratioun STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}D'Spill-Script dat am nächsten Spill geluede gëtt STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}D'KIën déi am nächsten Spill geluede ginn STR_AI_CONFIG_HUMAN_PLAYER :Mënschleche Spiller STR_AI_CONFIG_RANDOM_AI :Zoufälleg KI STR_AI_CONFIG_NONE :(keng) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Maximal Unzuel vu Géigner: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Eropsetzen STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Gewielte KI an der Lëscht no uewen setzen @@ -4524,8 +4512,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Gewielte STR_AI_CONFIG_GAMESCRIPT :{SILVER}Spill-Script STR_AI_CONFIG_AI :{SILVER}KIën -STR_AI_CONFIG_CHANGE :{BLACK}Wiel {STRING} aus -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :KI STR_AI_CONFIG_CHANGE_GAMESCRIPT :Spill-Script STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Lued en aneren Script @@ -4556,9 +4542,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Héichte STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Minimap-Screenshot # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameter STR_AI_SETTINGS_CAPTION_AI :KI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Spill-Script STR_AI_SETTINGS_CLOSE :{BLACK}Zoumaachen STR_AI_SETTINGS_RESET :{BLACK}Reset STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4975,6 +4959,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}De Servi STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... Gefier ass zerstéiert + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Keng Gefierer verfügbar STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Änner d'NewGRF Konfiguratioun STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Nach keng Gefierer verfügbar diff --git a/src/lang/macedonian.txt b/src/lang/macedonian.txt index 587c193974..ec794d034b 100644 --- a/src/lang/macedonian.txt +++ b/src/lang/macedonian.txt @@ -197,6 +197,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}кс STR_UNITS_POWER_METRIC :{COMMA}кс STR_UNITS_POWER_SI :{COMMA}kW + STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}kg @@ -352,9 +353,8 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Напушти # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :игра опции -STR_SETTINGS_MENU_SCRIPT_SETTINGS :АИ / игри поставувања STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF подесувања STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :транспарентност опции STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Место имиња прикажани @@ -792,11 +792,6 @@ STR_GAME_OPTIONS_CAPTION :{WHITE}Опци ###length 42 -###length 2 - - -###length 21 - # Autosave dropdown ###length 5 @@ -817,7 +812,6 @@ STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_1_MONTH :Секој ме - # Custom currency window @@ -825,7 +819,6 @@ STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_1_MONTH :Секој ме - STR_NUM_CUSTOM_NUMBER :Прилагодено ({NUM}) @@ -841,6 +834,8 @@ STR_SEA_LEVEL_CUSTOM_PERCENTAGE :Прилаго ###length 4 +###length 4 + ###length 7 ###length 4 @@ -959,6 +954,8 @@ STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Дебелин ###length 2 +###length 2 + @@ -1160,11 +1157,9 @@ STR_INTRO_SCENARIO_EDITOR :{BLACK}Сцен STR_INTRO_MULTIPLAYER :{BLACK}Повеќе играчи STR_INTRO_GAME_OPTIONS :{BLACK}Опции на Играта -STR_INTRO_SCRIPT_SETTINGS :{BLACK}АИ / Играта Подесувања -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Покажи АИ и игра поставувања # Quit window @@ -1178,8 +1173,6 @@ STR_ABANDON_GAME_QUERY :{YELLOW}Дал # Cheat window -###length 4 - # Livery window @@ -1448,6 +1441,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}Нов STR_MAPGEN_MAPSIZE :{BLACK}Големина на мапа: STR_MAPGEN_BY :{BLACK}* +###length 21 + # Strings for map borders at game generation @@ -1498,6 +1493,10 @@ STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_OBJECT :Објекто # Sprite aligner window +###length 2 + + + # NewGRF (self) generated warnings/errors STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING} @@ -1694,6 +1693,8 @@ STR_BUY_VEHICLE_AIRCRAFT_CAPTION :Нов авио STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Опсег: {GOLD}{COMMA} плочки +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Листа за селекција од авиони - кликни на авионот за информации @@ -1948,7 +1949,6 @@ STR_AI_CONFIG_NONE :(никој) STR_AI_CONFIG_GAMESCRIPT :{SILVER}GameScript STR_AI_CONFIG_AI :{SILVER}ЗИС -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :АИ STR_AI_CONFIG_CHANGE_GAMESCRIPT :GameScript @@ -1961,7 +1961,6 @@ STR_AI_LIST_CAPTION_GAMESCRIPT :GameScripts # AI Parameters STR_AI_SETTINGS_CAPTION_AI :АИ -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :GameScript STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} STR_AI_SETTINGS_START_DELAY :Број на денови за да започнете оваа Пи по претходниот (се дава или зема): {ORANGE}{STRING} @@ -2118,6 +2117,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Не м STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... возилото е уништено + # Specific vehicle errors diff --git a/src/lang/malay.txt b/src/lang/malay.txt index 48b7e2542b..43c69df7a2 100644 --- a/src/lang/malay.txt +++ b/src/lang/malay.txt @@ -197,6 +197,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}kk STR_UNITS_POWER_METRIC :{COMMA}kk STR_UNITS_POWER_SI :{COMMA}kW + STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}kg @@ -357,10 +358,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Keluar # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Pilihan permainan STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Tetapan -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Al/Tetapan skrip permainan STR_SETTINGS_MENU_NEWGRF_SETTINGS :Tetapan NewGRF STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Pilihan Ketelusan STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Paparkan nama bandar @@ -899,36 +899,6 @@ STR_GAME_OPTIONS_CURRENCY_ZAR :South African R STR_GAME_OPTIONS_CURRENCY_CUSTOM :Sesuaikan... STR_GAME_OPTIONS_CURRENCY_GEL :Georgian Lari (GEL) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Memandu di sebelah kiri -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Memandu di sebelah kanan - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Nama bandar -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Pilih tema untuk nama bandar - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Inggeris (Asal) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Peranchis -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Jerman -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Inggeris (Tambahan) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Amerika Latin -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Mengarut -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Swedish -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Dutch -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finnish -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Polish -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slovak -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norwegian -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Hungarian -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Austrian -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Romanian -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Czech -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Swiss -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Danish -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turkish -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italian -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Catalan - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Simpanan automatik STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Pilih tempoh untuk simpanan permainan automatik @@ -953,12 +923,6 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :lain -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Saiz Antaramuka -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Sila pilih saiz elemen antara muka untuk digunakan - -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Biasa -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Saiz berganda -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Saiz kuad @@ -1007,8 +971,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Previu: STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}Mata wang anda berbanding 10000 Pound (£) STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Tukar parameter matawang pilihan diri -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Jumlah maksimum pesaing: {ORANGE}{COMMA} - STR_NONE :Tiada STR_FUNDING_ONLY :Melalui pembiayaan sahaja STR_MINIMAL :Minimum @@ -1058,6 +1020,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Lanskap temperate +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Lanskap subartik +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Lanskap subtropik +STR_CLIMATE_TOYLAND_LANDSCAPE :Lanskap alam permainan + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Sangat Rata STR_TERRAIN_TYPE_FLAT :Rata @@ -1341,6 +1309,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Diperbaiki STR_CONFIG_SETTING_ROAD_SIDE :Kenderaan: {STRING} +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Memandu di sebelah kiri +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Memandu di sebelah kanan + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Putaran heightmap: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Lawan jam @@ -1658,7 +1630,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Berundur secara STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Benarkan keretapi berundur di lampu isyarat, jika ia menuggu lama ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Disyorkan) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Disyorkan) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Tukar nilai tetapan @@ -1697,7 +1669,6 @@ STR_INTRO_HIGHSCORE :{BLACK}Carta ma STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Tetapan STR_INTRO_NEWGRF_SETTINGS :{BLACK}Tetapan NewGRF STR_INTRO_ONLINE_CONTENT :{BLACK}Periksa Kandungan Atas Talian -STR_INTRO_SCRIPT_SETTINGS :{BLACK}Al/Tetapan Skrip Permainan STR_INTRO_QUIT :{BLACK}Keluar STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Mulakan permainan baru. Ctrl+Klik akan melangkaui konfigurasi peta @@ -1717,7 +1688,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Paparan STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Pamerkan pilihan STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Paparkan tetapan NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Periksa kandungan baru atau yang telah dikemaskini untuk dimuat turun -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Paparan Al/Tetapan Skrip Permainan STR_INTRO_TOOLTIP_QUIT :{BLACK}Keluar 'OpenTTD' STR_INTRO_TRANSLATION :{BLACK}Terjemahan ini kekurangan {NUM} string. Sila bantu menjadikan OpenTTD lebih baik dengan mendaftar sebagai penterjemah. Lihat readme.txt untuk maklumat. @@ -1746,12 +1716,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Tukar t STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Tukar tahun semasa STR_CHEAT_SETUP_PROD :{LTBLUE}Bolehkan pengubahsuaian nilai-nilai pengeluaran: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Lanskap temperate -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Lanskap subartik -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Lanskap subtropik -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Lanskap alam permainan - # Livery window STR_LIVERY_GENERAL_TOOLTIP :{BLACK}Tunjukkan skim warna am @@ -2583,16 +2547,41 @@ STR_MAPGEN_MAPSIZE :{BLACK}Saiz pet STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Pilih saiz peta dalam petak. Nombor petak bersesuaian akan lebih kecil sedikit STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Jumlah bandar: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Nama bandar +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Pilih tema untuk nama bandar STR_MAPGEN_DATE :{BLACK}Tarikh: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Jumlah industri: STR_MAPGEN_LAND_GENERATOR :{BLACK}Janaan tanah: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Jenis rupa bumi: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Paras laut: +STR_MAPGEN_SEA_LEVEL :{BLACK}Paras laut: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Sungai: STR_MAPGEN_SMOOTHNESS :{BLACK}Kelicinan: STR_MAPGEN_VARIETY :{BLACK}Pembahagian variasi: STR_MAPGEN_GENERATE :{WHITE}Janakan +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Inggeris (Asal) +STR_MAPGEN_TOWN_NAME_FRENCH :Peranchis +STR_MAPGEN_TOWN_NAME_GERMAN :Jerman +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Inggeris (Tambahan) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Amerika Latin +STR_MAPGEN_TOWN_NAME_SILLY :Mengarut +STR_MAPGEN_TOWN_NAME_SWEDISH :Swedish +STR_MAPGEN_TOWN_NAME_DUTCH :Dutch +STR_MAPGEN_TOWN_NAME_FINNISH :Finnish +STR_MAPGEN_TOWN_NAME_POLISH :Polish +STR_MAPGEN_TOWN_NAME_SLOVAK :Slovak +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norwegian +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Hungarian +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Austrian +STR_MAPGEN_TOWN_NAME_ROMANIAN :Romanian +STR_MAPGEN_TOWN_NAME_CZECH :Czech +STR_MAPGEN_TOWN_NAME_SWISS :Swiss +STR_MAPGEN_TOWN_NAME_DANISH :Danish +STR_MAPGEN_TOWN_NAME_TURKISH :Turkish +STR_MAPGEN_TOWN_NAME_ITALIAN :Italian +STR_MAPGEN_TOWN_NAME_CATALAN :Catalan + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Hujung peta: STR_MAPGEN_NORTHWEST :{BLACK}Barat laut @@ -2723,6 +2712,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Peperi s STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Teruskan ke peperi dahulu yang biasa, melangkau sebarang peperi pseudo/warna kembali/fon dan memusing balik semula STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Perwakilan peperi yang terpilih. Penjajaran tidak diendahkan apabila sedang melukiskan peperi. STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Alihkan "sprite" ke lokasi lain lantas mengubah ofset X dan Y. "Ctrl+Click" untuk ubah lokasi "sprite" lapan unit pada satu-satu masa + +###length 2 + + STR_SPRITE_ALIGNER_PICKER_BUTTON :{BLACK}Pilih peperi STR_SPRITE_ALIGNER_PICKER_TOOLTIP :{BLACK}Pilih peperi di mana-mana sahaja dari skrin @@ -3190,6 +3183,8 @@ STR_PURCHASE_INFO_ALL_BUT :Semua kecuali { STR_PURCHASE_INFO_MAX_TE :{BLACK}Usaha Penarikan Maks.: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Jarak: {GOLD}{COMMA} petak +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Senarai pilihan keretapi - Klik atas kenderaan untuk maklumat STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Senarai pilihan kenderaan jalanraya - klik atas kenderaan untuk maklumat @@ -3798,12 +3793,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Salah sa STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Tetingkap Kepintaran Tiruan / SkripPermainan Nyahpepijat hanya tersedia bagi pelayan # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Konfigurasi Kepintaran Tiruan / Permainan STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}SkripPermainan yang akan dimuatkan pada permainan seterusnya STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}Kepintaran Tiruan yang akan dimuatkan pada permainan seterusnya STR_AI_CONFIG_HUMAN_PLAYER :Pemain manusia STR_AI_CONFIG_RANDOM_AI :Kepintaran Tiruan rawak STR_AI_CONFIG_NONE :(tiada) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Jumlah maksimum pesaing: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Pindah ke Atas STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Pindah Kepintaran Tiruan yang dipilih di dalam senarai ke atas @@ -3813,8 +3808,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Pindah K STR_AI_CONFIG_GAMESCRIPT :{SILVER}SkripPermainan STR_AI_CONFIG_AI :{SILVER}KepintaranTiruan -STR_AI_CONFIG_CHANGE :{BLACK}Pilih {STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :Kepintaran Tiruan STR_AI_CONFIG_CHANGE_GAMESCRIPT :SkripPermainan STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Muat skrip yang lain @@ -3838,9 +3831,7 @@ STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Jangan u # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameter STR_AI_SETTINGS_CAPTION_AI :AI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :SkripPermainan STR_AI_SETTINGS_CLOSE :{BLACK}Tutup STR_AI_SETTINGS_RESET :{BLACK}Semula STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4236,6 +4227,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Tidak bo STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... kenderaan sudah musnah + STR_ERROR_NO_VEHICLES_AVAILABLE_YET_EXPLANATION :{WHITE}Mulakan permainan baru selepas {DATE_SHORT} atau gunakan NewGRF yang digunakan kenderaan terdahulu # Specific vehicle errors diff --git a/src/lang/maltese.txt b/src/lang/maltese.txt index 4b8a2ae1eb..ed8cca15f1 100644 --- a/src/lang/maltese.txt +++ b/src/lang/maltese.txt @@ -150,6 +150,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}hp STR_UNITS_POWER_METRIC :{COMMA}hp STR_UNITS_POWER_SI :{COMMA}kW + STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}kg @@ -265,7 +266,7 @@ STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Ibni ind STR_SCENEDIT_FILE_MENU_SEPARATOR : # Settings menu -###length 14 +###length 15 # File menu ###length 5 @@ -405,11 +406,6 @@ STR_NEWS_VEHICLE_IS_LOST :{WHITE}{VEHICLE ###length 42 -###length 2 - - -###length 21 - # Autosave dropdown ###length 5 @@ -430,7 +426,6 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :oħrajn - # Custom currency window @@ -440,7 +435,6 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :oħrajn - ###length 5 ###length 6 @@ -451,6 +445,8 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :oħrajn ###length 4 +###length 4 + ###length 7 ###length 4 @@ -580,6 +576,8 @@ STR_CONFIG_SETTING_WARN_LOST_VEHICLE :Avza jekk jinti ###length 2 +###length 2 + @@ -746,8 +744,6 @@ STR_INTRO_CAPTION :{WHITE}OpenTTD # Cheat window STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Ibdel is-sena -###length 4 - # Livery window @@ -935,6 +931,8 @@ STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}Aghzel i # World generation STR_MAPGEN_BY :{BLACK}* +###length 21 + # Strings for map borders at game generation @@ -967,6 +965,10 @@ STR_NEWGRF_SETTINGS_INCOMPATIBLE :{RED}Ma jaqblux # Sprite aligner window +###length 2 + + + # NewGRF (self) generated warnings/errors STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING} @@ -1102,6 +1104,8 @@ STR_FINANCES_POSITIVE_INCOME :{BLACK}+{CURREN ###length VEHICLE_TYPES +###length 3 + ###length VEHICLE_TYPES ###length VEHICLE_TYPES @@ -1313,7 +1317,6 @@ STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Исчи -STR_AI_CONFIG_CHANGE_NONE : # Available AIs window @@ -1438,6 +1441,7 @@ STR_ERROR_TOO_MANY_VEHICLES_IN_GAME :{WHITE}Hemm wis + # Specific vehicle errors STR_ERROR_CAN_T_REVERSE_DIRECTION_TRAIN :{WHITE}Ma tistax tbiddel id-direzzjoni tal-ferrovija... diff --git a/src/lang/marathi.txt b/src/lang/marathi.txt index 74a71475be..baa5dfc766 100644 --- a/src/lang/marathi.txt +++ b/src/lang/marathi.txt @@ -196,6 +196,7 @@ STR_UNITS_VELOCITY_SI :{COMMA} m/s STR_UNITS_POWER_IMPERIAL :{COMMA}hp STR_UNITS_POWER_METRIC :{COMMA}hp + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}ट STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}ट STR_UNITS_WEIGHT_SHORT_SI :{COMMA} किलो @@ -346,9 +347,8 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :बंद करा # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :खेळाचे पर्याय -STR_SETTINGS_MENU_SCRIPT_SETTINGS :ए.आय. / गेम स्क्रिप्ट सेटिंग्ज STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF पर्याय STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :पारदर्शकता पर्याय STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :शहरांची नावे दाखवा @@ -724,27 +724,6 @@ STR_GAME_OPTIONS_CURRENCY_SEK :स्वीड STR_GAME_OPTIONS_CURRENCY_TRY :तुर्की लिरा (TRY) STR_GAME_OPTIONS_CURRENCY_SKK :स्लोवाक कोरुना (SKK) -###length 2 - - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :फ्रेंच -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :जर्मन -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :स्वीडीश -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :डच -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :फिन्निश -STR_GAME_OPTIONS_TOWN_NAME_POLISH :पोलिश -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :स्लोवाक -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :नोर्वेगीअन -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :हंगेरियन -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :ओस्त्रिअन -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :रोमेनिअन -STR_GAME_OPTIONS_TOWN_NAME_CZECH :झेख -STR_GAME_OPTIONS_TOWN_NAME_SWISS :स्विस -STR_GAME_OPTIONS_TOWN_NAME_DANISH :डेनिष -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :तुर्की -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :ईटेलिअन - # Autosave dropdown ###length 5 @@ -770,7 +749,6 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :अन्य - # Custom currency window @@ -780,7 +758,6 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :अन्य - ###length 5 ###length 6 @@ -795,6 +772,8 @@ STR_SUBSIDY_X2 :x२ STR_SUBSIDY_X3 :x३ STR_SUBSIDY_X4 :x४ +###length 4 + ###length 7 ###length 4 @@ -911,6 +890,8 @@ STR_CONFIG_SETTING_WARN_LOST_VEHICLE : वाहन ###length 2 +###length 2 + @@ -1076,8 +1057,6 @@ STR_INTRO_CAPTION :{WHITE}ओप # Cheat window STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}चालू वर्ष बदला -###length 4 - # Livery window @@ -1328,6 +1307,24 @@ STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA} STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_DATE :{BLACK}तिथी: +###length 21 +STR_MAPGEN_TOWN_NAME_FRENCH :फ्रेंच +STR_MAPGEN_TOWN_NAME_GERMAN :जर्मन +STR_MAPGEN_TOWN_NAME_SWEDISH :स्वीडीश +STR_MAPGEN_TOWN_NAME_DUTCH :डच +STR_MAPGEN_TOWN_NAME_FINNISH :फिन्निश +STR_MAPGEN_TOWN_NAME_POLISH :पोलिश +STR_MAPGEN_TOWN_NAME_SLOVAK :स्लोवाक +STR_MAPGEN_TOWN_NAME_NORWEGIAN :नोर्वेगीअन +STR_MAPGEN_TOWN_NAME_HUNGARIAN :हंगेरियन +STR_MAPGEN_TOWN_NAME_AUSTRIAN :ओस्त्रिअन +STR_MAPGEN_TOWN_NAME_ROMANIAN :रोमेनिअन +STR_MAPGEN_TOWN_NAME_CZECH :झेख +STR_MAPGEN_TOWN_NAME_SWISS :स्विस +STR_MAPGEN_TOWN_NAME_DANISH :डेनिष +STR_MAPGEN_TOWN_NAME_TURKISH :तुर्की +STR_MAPGEN_TOWN_NAME_ITALIAN :ईटेलिअन + # Strings for map borders at game generation STR_MAPGEN_BORDER_WATER :{BLACK}पाणी @@ -1359,6 +1356,10 @@ STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_OBJECT :वस्तू # Sprite aligner window +###length 2 + + + # NewGRF (self) generated warnings/errors STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING} @@ -1537,6 +1538,8 @@ STR_PURCHASE_INFO_COST :{BLACK}कि STR_PURCHASE_INFO_WEIGHT_CWEIGHT :{BLACK}वजन: {GOLD}{WEIGHT_SHORT} ({WEIGHT_SHORT}) STR_PURCHASE_INFO_COST_SPEED :{BLACK}किंमत: {GOLD}{CURRENCY_LONG}{BLACK} गती: {GOLD}{VELOCITY} +###length 3 + ###length VEHICLE_TYPES ###length VEHICLE_TYPES @@ -1743,7 +1746,6 @@ STR_TIMETABLE_CHANGE_TIME :{BLACK}वे -STR_AI_CONFIG_CHANGE_NONE : # Available AIs window @@ -1865,6 +1867,7 @@ STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}पू + # Specific vehicle errors diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index dd303310e3..56963b41de 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -202,6 +202,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}hk STR_UNITS_POWER_METRIC :{COMMA}{NBSP}hk STR_UNITS_POWER_SI :{COMMA}{NBSP}kW + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -393,10 +394,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Avslutt # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Spillinnstillinger STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Innstillinger -STR_SETTINGS_MENU_SCRIPT_SETTINGS :AI-/Spillskript-innstillinger STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF-innstillinger STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Instillinger for gjennomsiktighet STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Vis bynavn @@ -967,36 +967,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Indisk rupi (IN STR_GAME_OPTIONS_CURRENCY_IDR :Indonesisk Rupi (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Malaysisk Ringgit (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Venstrekjøring -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Høyrekjøring - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Bynavn: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Velg nasjonalitet på bynavn - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Engelsk (Original) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Fransk -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Tysk -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Engelsk (utvidet) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Latinamerikansk -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Tåpelige -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Svensk -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Nederlandsk -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finsk -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Polsk -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slovakisk -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norsk -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Ungarsk -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Østeriske -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Rumensk -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Tsjekkisk -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Sveitsisk -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Dansk -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Tyrkisk -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italiensk -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Katalansk - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Automatisk lagring STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Velg intervall for automatisk lagring @@ -1028,21 +998,8 @@ STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Merk av i denne boksen for å v-synkronisere skjermen. Endring av innstillinger krever omstart av spillet. Fungerer bare med maskinvareakselerasjon aktivert -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Grensesnitt-størrelse -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Velg grensesnitt-størrelsen som skal benyttes -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(finn automatisk) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :2 ganger størrelse -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :4 ganger størrelse -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Skriftstørrelse -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Velg skriftstørrelse for grensesnitt - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(finn automatisk) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Dobbel størrelse -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Firedobbel størrelse STR_GAME_OPTIONS_GRAPHICS :{BLACK}Grafikk @@ -1094,8 +1051,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Forhån STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 pund (£) i din valuta STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Endre egendefinert valutaparameter -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Maks antall motstandere: {ORANGE}{COMMA} - STR_NONE :Ingen STR_FUNDING_ONLY :Kun finansiering STR_MINIMAL :Minimal @@ -1145,6 +1100,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Temperert landskap +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Subarktisk landskap +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Subtropisk landskap +STR_CLIMATE_TOYLAND_LANDSCAPE :Leketøylandskap + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Veldig flatt STR_TERRAIN_TYPE_FLAT :Flatt @@ -1504,6 +1465,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Forbedret STR_CONFIG_SETTING_ROAD_SIDE :Veikjøretøy: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Velg kjøre-siden +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Venstrekjøring +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Høyrekjøring + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Høydekartrotering: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Mot klokka @@ -2032,7 +1997,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Automatisk reve STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :La tog reversere ved signaler om de har ventet der lenge ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Anbefalt) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Anbefalt) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Endre verdi @@ -2075,7 +2040,6 @@ STR_INTRO_HIGHSCORE :{BLACK}Tavle me STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Innstillinger STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF-innstillinger STR_INTRO_ONLINE_CONTENT :{BLACK}Se etter innhold på nettet -STR_INTRO_SCRIPT_SETTINGS :{BLACK}AI/Spillskript-innstillinger STR_INTRO_QUIT :{BLACK}Avslutt STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Start et nytt spill. Ctrl+klikk hopper over kartkonfigurering @@ -2095,7 +2059,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Vise tav STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Vis innstillinger STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Vis NewGRF-instillinger STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Se etter nytt og oppdatert innhold for nedlasting -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Vis AI/Spillskript-innstillinger STR_INTRO_TOOLTIP_QUIT :{BLACK}Avslutt 'OpenTTD' STR_INTRO_BASESET :{BLACK}Det valgte innebygde grafikksettet mangler {NUM} sprite{P "" r}. Se etter oppdateringer for settet. @@ -2127,12 +2090,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Endre d STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Endre nåværende år STR_CHEAT_SETUP_PROD :{LTBLUE}Tillat endring av produksjonsmengder: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Temperert landskap -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Subarktisk landskap -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Subtropisk landskap -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Leketøylandskap - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Firmafarge @@ -3136,6 +3093,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Kartstø STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Velg størrelsen på kartet i ruter. Antall tilgjengelige ruter vil være litt mindre STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Antall byer: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Bynavn: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Velg nasjonalitet på bynavn STR_MAPGEN_DATE :{BLACK}Dato: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Antall industrier: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Høyeste fjelltopp: @@ -3151,12 +3110,35 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Reduser STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Landskapsgenerator STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terrengtype: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Havnivå: +STR_MAPGEN_SEA_LEVEL :{BLACK}Havnivå: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Elver: STR_MAPGEN_SMOOTHNESS :{BLACK}Jevnhet: STR_MAPGEN_VARIETY :{BLACK}Variasjonsspredning: STR_MAPGEN_GENERATE :{WHITE}Generer +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Engelsk (Original) +STR_MAPGEN_TOWN_NAME_FRENCH :Fransk +STR_MAPGEN_TOWN_NAME_GERMAN :Tysk +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Engelsk (utvidet) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Latinamerikansk +STR_MAPGEN_TOWN_NAME_SILLY :Tåpelige +STR_MAPGEN_TOWN_NAME_SWEDISH :Svensk +STR_MAPGEN_TOWN_NAME_DUTCH :Nederlandsk +STR_MAPGEN_TOWN_NAME_FINNISH :Finsk +STR_MAPGEN_TOWN_NAME_POLISH :Polsk +STR_MAPGEN_TOWN_NAME_SLOVAK :Slovakisk +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norsk +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Ungarsk +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Østeriske +STR_MAPGEN_TOWN_NAME_ROMANIAN :Rumensk +STR_MAPGEN_TOWN_NAME_CZECH :Tsjekkisk +STR_MAPGEN_TOWN_NAME_SWISS :Sveitsisk +STR_MAPGEN_TOWN_NAME_DANISH :Dansk +STR_MAPGEN_TOWN_NAME_TURKISH :Tyrkisk +STR_MAPGEN_TOWN_NAME_ITALIAN :Italiensk +STR_MAPGEN_TOWN_NAME_CATALAN :Katalansk + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Kartkanter: STR_MAPGEN_NORTHWEST :{BLACK}Nordvest @@ -3301,6 +3283,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Forrige STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Fortsett til forrige normale sprite og hopp over enhver pseudo-/omfargings-/skrifttype- sprite, samt start om ved begynnelsen STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Forhåndsvisning av valgt sprite. Innrettingen ignoreres når spriten tegnes STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Flytt på ikonet for å endre X- og Y-forskyvningene. Ctrl+klikk for å flytte ikonet åtte enheter om gangen + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Tilbakestill relativt STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Nullstill de nåværende relative forskyvningene STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X forskyvning: {NUM}, Y forskyvning: {NUM} (Absolutt) @@ -3857,6 +3843,8 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Maks tre STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Rekkevidde: {GOLD}{COMMA} ruter STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Flytype: {GOLD}{STRING} +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Liste over tog/vogner - klikk på tog/vogn for mer informasjon. Ctrl+klikk for å skjule/vise denne typen STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Liste over kjøretøy - klikk på kjøretøy for mer informasjon. Ctrl+klikk for å skjule/vise kjøretøytypen @@ -4517,12 +4505,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Et skrip STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}AI/Spillskript-feilsøkingsvindu er kun tilgjengelig for tjeneren # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}AI/Spillskript-konfigurasjon STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Spillskriptet som vil bli lastet i neste spill STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}AI-ene som vil bli lastet i neste spill STR_AI_CONFIG_HUMAN_PLAYER :Menneskelig spiller STR_AI_CONFIG_RANDOM_AI :Tilfeldig AI STR_AI_CONFIG_NONE :(ingen) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Maks antall motstandere: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Flytt opp STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Flytt valgte AI oppover i listen @@ -4532,9 +4520,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Flytt va STR_AI_CONFIG_GAMESCRIPT :{SILVER}Spillskript STR_AI_CONFIG_AI :{SILVER}AI-er -STR_AI_CONFIG_CHANGE :{BLACK}Velg {STRING} -STR_AI_CONFIG_CHANGE_NONE : -STR_AI_CONFIG_CHANGE_NONE.small :AI STR_AI_CONFIG_CHANGE_AI :AI STR_AI_CONFIG_CHANGE_GAMESCRIPT :Spillskript STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Last enda et skript @@ -4565,9 +4550,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Høydeka STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Oversiktskart skjermbilde # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametre STR_AI_SETTINGS_CAPTION_AI :AI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Spillskript STR_AI_SETTINGS_CLOSE :{BLACK}Lukk STR_AI_SETTINGS_RESET :{BLACK}Tilbakestill STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4984,6 +4967,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Kan ikke STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}...{NBSP}kjøretøy er ødelagt + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Ingen kjøretøyer vil være tilgjengelig i det hele tatt STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Endre din NewGRF konfigurasjon STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Ingen kjøretøyer er tilgjengelig ennå diff --git a/src/lang/norwegian_nynorsk.txt b/src/lang/norwegian_nynorsk.txt index 39c587450c..77eb48b734 100644 --- a/src/lang/norwegian_nynorsk.txt +++ b/src/lang/norwegian_nynorsk.txt @@ -199,6 +199,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA} hk STR_UNITS_POWER_METRIC :{COMMA} hk STR_UNITS_POWER_SI :{COMMA} kW + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA} t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA} t STR_UNITS_WEIGHT_SHORT_SI :{COMMA} kg @@ -376,10 +377,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Avslutt # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Spelinstillingar STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Innstillinger -STR_SETTINGS_MENU_SCRIPT_SETTINGS :AI- / Spelscript-innstillingar STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF-innstillingar STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Gjennomsiktigheitsinnstillingar STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Syne bynamn @@ -926,36 +926,6 @@ STR_GAME_OPTIONS_CURRENCY_CUSTOM :Eigendefinert.. STR_GAME_OPTIONS_CURRENCY_GEL :Georgiske Lari (GEL) STR_GAME_OPTIONS_CURRENCY_IRR :Iranske Rial (IRR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Venstrekøyring -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Høgrekøyring - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Namn på byar -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Vel nasjonalitet på bynamn - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Engelsk -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Fransk -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Tysk -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Engelsk (utvidet) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Latinamerikansk -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Tåpelige -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Svensk -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Nederlandsk -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finsk -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Polsk -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slovakisk -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norsk -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Ungarsk -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Østerriksk -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Rumensk -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Tsjekkisk -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Sveitsisk -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Dansk -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Tyrkisk -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italiensk -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Katalansk - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Automatisk lagring STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Vel intervall for automatisk lagring @@ -980,12 +950,6 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :anna -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Grensesnittstorleik -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Vel storleik å bruke på grensesnittet - -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Dobbel størrelse -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Firedobbel størrelse @@ -1034,8 +998,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Eksempe STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 pund (£) i din valuta STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Byt eigendefinert valutaparameter -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Maks. antal konkurrentar: {ORANGE}{COMMA} - STR_NONE :Ingen STR_FUNDING_ONLY :Kun finansiering STR_MINIMAL :Minimal @@ -1085,6 +1047,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Temperert landskap +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :subarktisk landskap +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :subtropisk landskap +STR_CLIMATE_TOYLAND_LANDSCAPE :"Leikeland"-landskap + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Særs flatt STR_TERRAIN_TYPE_FLAT :Flatt @@ -1392,6 +1360,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Forbetra STR_CONFIG_SETTING_ROAD_SIDE :Veg-køyrety: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Vel køyreside +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Venstrekøyring +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Høgrekøyring + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Høgdekartrotering: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Mot klokka @@ -1816,7 +1788,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Automatisk reve STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :La tog snu ved signal, når dei har venta lengje ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Anbefalt) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Anbefalt) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Byt innstillingsverdi @@ -1857,7 +1829,6 @@ STR_INTRO_HIGHSCORE :{BLACK}Poengtav STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Innstillinger STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF-innstillingar STR_INTRO_ONLINE_CONTENT :{BLACK}Sjå etter innhald på nett -STR_INTRO_SCRIPT_SETTINGS :{BLACK}AI- / Spelscriptinnstillingar STR_INTRO_QUIT :{BLACK}Avslutt STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Start eit nytt spel. CTRL+klikk hoppar over kartkonfigurasjon @@ -1877,7 +1848,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Syn poen STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Skjerminnstillingar STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Syne NewGRF-instillingar STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Sjå etter nytt og oppdatert innhald som kan lastas ned -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Vis AI- og spelscriptinnstillingar STR_INTRO_TOOLTIP_QUIT :{BLACK}Avslutt 'OpenTTD' STR_INTRO_TRANSLATION :{BLACK}Denne nynorsk-omsettinga manglar {NUM} tekst{P "" ar}. Du må gjerne verte med i omsettingsgruppa for å hjelpe til å gjere OpenTTD betre. Sjå readme.txt for detaljar. @@ -1906,12 +1876,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Byt dat STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Byt noverande år STR_CHEAT_SETUP_PROD :{LTBLUE}Tillet endring av produksjonsmengder: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Temperert landskap -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :subarktisk landskap -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :subtropisk landskap -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :"Leikeland"-landskap - # Livery window STR_LIVERY_GENERAL_TOOLTIP :{BLACK}Syne generelle fargetema @@ -2753,16 +2717,41 @@ STR_MAPGEN_MAPSIZE :{BLACK}Kartstor STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Vel storleik på kartet, i ruter. Talet på tilgjengelege ruter vert smått mindre STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Antal byar: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Namn på byar +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Vel nasjonalitet på bynamn STR_MAPGEN_DATE :{BLACK}Dato: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Antal industriar: STR_MAPGEN_LAND_GENERATOR :{BLACK}Landskapsgenerator: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terrengtype -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Havflate: +STR_MAPGEN_SEA_LEVEL :{BLACK}Havflate: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Elver: STR_MAPGEN_SMOOTHNESS :{BLACK}Glattleik: STR_MAPGEN_VARIETY :{BLACK}Variasjonsdistrubusjon: STR_MAPGEN_GENERATE :{WHITE}Generer +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Engelsk +STR_MAPGEN_TOWN_NAME_FRENCH :Fransk +STR_MAPGEN_TOWN_NAME_GERMAN :Tysk +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Engelsk (utvidet) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Latinamerikansk +STR_MAPGEN_TOWN_NAME_SILLY :Tåpelige +STR_MAPGEN_TOWN_NAME_SWEDISH :Svensk +STR_MAPGEN_TOWN_NAME_DUTCH :Nederlandsk +STR_MAPGEN_TOWN_NAME_FINNISH :Finsk +STR_MAPGEN_TOWN_NAME_POLISH :Polsk +STR_MAPGEN_TOWN_NAME_SLOVAK :Slovakisk +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norsk +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Ungarsk +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Østerriksk +STR_MAPGEN_TOWN_NAME_ROMANIAN :Rumensk +STR_MAPGEN_TOWN_NAME_CZECH :Tsjekkisk +STR_MAPGEN_TOWN_NAME_SWISS :Sveitsisk +STR_MAPGEN_TOWN_NAME_DANISH :Dansk +STR_MAPGEN_TOWN_NAME_TURKISH :Tyrkisk +STR_MAPGEN_TOWN_NAME_ITALIAN :Italiensk +STR_MAPGEN_TOWN_NAME_CATALAN :Katalansk + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Kartkantar STR_MAPGEN_NORTHWEST :{BLACK}Nordvest @@ -2898,6 +2887,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Førre s STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Fortsett til neste normale sprite og hopp over einhver pseudo-/omfargings-/skrifttype- sprite, samt start om ved byrjinga STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Førehandsvisning av valgt sprite. Innrettinga ignorerast når spriten tegnes STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Flytt spriten rundt omkring, for å endre X- og Y-forskyvningene + +###length 2 + + STR_SPRITE_ALIGNER_PICKER_BUTTON :{BLACK}Vel sprite STR_SPRITE_ALIGNER_PICKER_TOOLTIP :{BLACK}Vel ein sprite frå eit vilkårleg sted på skjermen @@ -3402,6 +3395,8 @@ STR_PURCHASE_INFO_ALL_BUT :Alt utanom {CAR STR_PURCHASE_INFO_MAX_TE :{BLACK}Maks. trekkraft: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Rekkevidde: {GOLD}{COMMA} ruter +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Tog-/vognliste - klikk på tog/vogn for meir informasjon STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Køyretøyliste - klikk på køyretøy for meir informasjon @@ -4021,12 +4016,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Ein AI h STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}AI- / Spelscript-feilsøkingvindauget er kun tilgjengeleg for tenaren # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}AI- / Spelkonfigurasjonar STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Spelscriptet som blir lasta i neste spel STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}AIane som blir lasta i neste spel STR_AI_CONFIG_HUMAN_PLAYER :Menneskeleg spelar STR_AI_CONFIG_RANDOM_AI :Tilfeldig AI STR_AI_CONFIG_NONE :(ingen) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Maks. antal konkurrentar: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Flytt oppover STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Flytt valt AI oppover lista @@ -4036,8 +4031,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Flytt va STR_AI_CONFIG_GAMESCRIPT :{SILVER}Spelscript STR_AI_CONFIG_AI :{SILVER}AIar -STR_AI_CONFIG_CHANGE :{BLACK}Vel {STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :AI STR_AI_CONFIG_CHANGE_GAMESCRIPT :Spelscript STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Last eit anna script @@ -4061,9 +4054,7 @@ STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Ikkje en # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameter STR_AI_SETTINGS_CAPTION_AI :AI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Spelscript STR_AI_SETTINGS_CLOSE :{BLACK}Lukk STR_AI_SETTINGS_RESET :{BLACK}Tilbakestill STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4469,6 +4460,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Kan ikkj STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... køyretøy er øydelagd + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Ingen køyretøy vert tilgjengelege STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Byt NewGRF-innstillingar STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Det finst ikkje nokon køyretøy enno diff --git a/src/lang/persian.txt b/src/lang/persian.txt index d872505335..4473e85513 100644 --- a/src/lang/persian.txt +++ b/src/lang/persian.txt @@ -197,6 +197,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}ا STR_UNITS_POWER_METRIC :{COMMA}{NBSP}اسب بخار STR_UNITS_POWER_SI :{COMMA}{NBSP}کیلووات + STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}تن STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}کیلوگرم @@ -366,9 +367,8 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :خروج # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :تنظیمات بازی -STR_SETTINGS_MENU_SCRIPT_SETTINGS :هوش مصنوعی / تنظیمات بازی STR_SETTINGS_MENU_NEWGRF_SETTINGS :تنظیمات NewGRF STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :گزینه های شفافیت STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :نام شهرها نشان داده شود @@ -916,36 +916,6 @@ STR_GAME_OPTIONS_CURRENCY_CUSTOM :دلخواه... STR_GAME_OPTIONS_CURRENCY_GEL :لیره گرجستان (GEL) STR_GAME_OPTIONS_CURRENCY_IRR :ریال ایران (IRR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :چپ فرمان -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :راست فرمان - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK} نام شهرها -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}انتخاب نوع نام شهرها - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :انگلیسی (اصلی) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :فرانسوی -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :آلمانی -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :انگلیسی (اضافه) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :آمریکای لاتین -STR_GAME_OPTIONS_TOWN_NAME_SILLY :سیلی -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :سوئدی -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :هلندی -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :فنلاند -STR_GAME_OPTIONS_TOWN_NAME_POLISH :لهستان -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :اسلواکی -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :نروژی -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :مجاری -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :اتریشی -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :رومانیایی -STR_GAME_OPTIONS_TOWN_NAME_CZECH :چکی -STR_GAME_OPTIONS_TOWN_NAME_SWISS :سوییسی -STR_GAME_OPTIONS_TOWN_NAME_DANISH :دانمارکی -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :ترکیه ای -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :ایتالیایی -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :کاتالانی - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK} ذخیره اتوماتیک STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK} انتخاب فاصله زمانی بین ذخیره کردن های اتوماتیک @@ -971,8 +941,6 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :دیگر -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :دو برابر - @@ -1020,8 +988,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}پیش STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}۱۰۰۰۰ پوند (£) به واحد پول شما می شود STR_CURRENCY_CHANGE_PARAMETER :{BLACK}تغییر دلخواه پارامترهای واحد پول -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}حد اکثر تعداد رقبا :{ORANGE}{COMMA} - STR_NONE :هیچکدام STR_FUNDING_ONLY :فقط سرمایه گذاری STR_MINIMAL :کمینه @@ -1071,6 +1037,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :آب و هوای معتدل +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :آب و هوای قطبی +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :آب و هوای استوایی +STR_CLIMATE_TOYLAND_LANDSCAPE :دنیای اسباب بازی ها + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :بسیار یکدست STR_TERRAIN_TYPE_FLAT :یکدست @@ -1316,6 +1288,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :بهبودیا STR_CONFIG_SETTING_ROAD_SIDE :خودروهای جاده ای: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :انتخاب جهت رانندگی +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :چپ فرمان +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :راست فرمان + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :جهت چرخش نقشه بلندی: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :پادساعت‌گرد @@ -1628,7 +1604,7 @@ STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS :مسیریاب STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :برگشت خودکار با رسیدن به نشانه ها: {STRING} ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(توصیه می گردد) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(توصیه می گردد) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}تغییر مقدار @@ -1662,7 +1638,6 @@ STR_INTRO_MULTIPLAYER :{BLACK}بازی STR_INTRO_GAME_OPTIONS :{BLACK}تنضیمات بازی STR_INTRO_NEWGRF_SETTINGS :{BLACK}تنظیمات NewGRF STR_INTRO_ONLINE_CONTENT :{BLACK}چک کردن محتوی آنلاین -STR_INTRO_SCRIPT_SETTINGS :{BLACK} تنظیمات هوش مصنوعی / اسکریپت STR_INTRO_QUIT :{BLACK}خروج STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}شروع بازی جدید. Ctrl+Click پیش تنظیمات نقشه را رد و از تنظیمات گذشته استفاده می کند. @@ -1681,7 +1656,6 @@ STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}نشان STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}نمایش جدول بالاترین امتیازات STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}نمایش تنظیمات NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}بررسی وجود مجموعه ها و به روز رسانی های جدید در اینترنت -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}نمایش تنظیمات هوش مصنوعی و اسکریپت های بازی STR_INTRO_TOOLTIP_QUIT :{BLACK} خروج از 'OpenTTD' STR_INTRO_TRANSLATION :{BLACK}این ترجمه {NUM} رشته{P ی های}ترجمه نشده دارد. با ثبت نام کردن به عنوان مترجم ما را در بهتر سازی OpenTTD یاری نمایید. فایل readme.txt را برای جزییات بیشتر بخوانید. @@ -1709,12 +1683,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}تغی STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}تغییر سال جاری STR_CHEAT_SETUP_PROD :{LTBLUE}قابلیت تغییر سطح تولید صنایع: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :آب و هوای معتدل -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :آب و هوای قطبی -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :آب و هوای استوایی -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :دنیای اسباب بازی ها - # Livery window STR_LIVERY_GENERAL_TOOLTIP :{BLACK}نمایش طرح رنگهای اصلی @@ -2548,16 +2516,41 @@ STR_MAPGEN_WORLD_GENERATION_CAPTION :{WHITE}ساخت STR_MAPGEN_MAPSIZE :{BLACK}اندازه نقشه: STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}تعداد شهرها: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK} نام شهرها +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}انتخاب نوع نام شهرها STR_MAPGEN_DATE :{BLACK}تاریخ: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}تعداد صنایع: STR_MAPGEN_LAND_GENERATOR :{BLACK}سازنده زمین: STR_MAPGEN_TERRAIN_TYPE :{BLACK}نوع پستی/بلندی: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}سطح دریا: +STR_MAPGEN_SEA_LEVEL :{BLACK}سطح دریا: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}رودخانه ها: STR_MAPGEN_SMOOTHNESS :{BLACK}همواری: STR_MAPGEN_VARIETY :{BLACK}توزیع انواع: STR_MAPGEN_GENERATE :{WHITE}بساز +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :انگلیسی (اصلی) +STR_MAPGEN_TOWN_NAME_FRENCH :فرانسوی +STR_MAPGEN_TOWN_NAME_GERMAN :آلمانی +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :انگلیسی (اضافه) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :آمریکای لاتین +STR_MAPGEN_TOWN_NAME_SILLY :سیلی +STR_MAPGEN_TOWN_NAME_SWEDISH :سوئدی +STR_MAPGEN_TOWN_NAME_DUTCH :هلندی +STR_MAPGEN_TOWN_NAME_FINNISH :فنلاند +STR_MAPGEN_TOWN_NAME_POLISH :لهستان +STR_MAPGEN_TOWN_NAME_SLOVAK :اسلواکی +STR_MAPGEN_TOWN_NAME_NORWEGIAN :نروژی +STR_MAPGEN_TOWN_NAME_HUNGARIAN :مجاری +STR_MAPGEN_TOWN_NAME_AUSTRIAN :اتریشی +STR_MAPGEN_TOWN_NAME_ROMANIAN :رومانیایی +STR_MAPGEN_TOWN_NAME_CZECH :چکی +STR_MAPGEN_TOWN_NAME_SWISS :سوییسی +STR_MAPGEN_TOWN_NAME_DANISH :دانمارکی +STR_MAPGEN_TOWN_NAME_TURKISH :ترکیه ای +STR_MAPGEN_TOWN_NAME_ITALIAN :ایتالیایی +STR_MAPGEN_TOWN_NAME_CATALAN :کاتالانی + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}لبه های نقشه: STR_MAPGEN_NORTHWEST :{BLACK}شمال غربی @@ -2693,6 +2686,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}تصوی STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}نمایش تصویر عادی قبلی، بدون انجام دادن هر گونه تغییرات STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}نمایش تصویر انتخاب شده. تغییر مکان تصویر در زمان بارگزاری اعمال نمی شود STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}تغییر مکان تصویر، تغییر مقدار اضافه شونده به X و Y + +###length 2 + + STR_SPRITE_ALIGNER_PICKER_BUTTON :{BLACK}برداشتن تصویر STR_SPRITE_ALIGNER_PICKER_TOOLTIP :{BLACK}برداشتن یک تصویر از یک نقطه از صفحه نمایش @@ -3090,6 +3087,8 @@ STR_PURCHASE_INFO_SPEED_CANAL :{BLACK}سرعت STR_PURCHASE_INFO_REFITTABLE :(قابل تعمیر) STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}برد: {GOLD}{COMMA} قطعه +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}لیست انتخاب قطار - برای اطلاعات بیشتر روی وسیله کلیک کنید. برای مخفی یا پدیدار کردن انواع قطار کنترل+کلیک کنید STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}لیست انتخاب کشتی - برای اطلاعات بیشتر روی کشتی کلیک کنید. برای مخفی یا دوباره پدیدار کردن نوع کشتی ها، کنترل+کلیک کنید @@ -3443,12 +3442,12 @@ STR_AI_GAME_SCRIPT_TOOLTIP :{BLACK}دیدن STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}پنجره رفع اشکال کد فقط برای سرور قابل دسترس است # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}تنظیمات هوش مصنوعی / بازی STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}کد بازی که در بازی بعدی بارگذاری می شود STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}هوش مصنوعی که در بازی بعدی بارگذاری می شود STR_AI_CONFIG_HUMAN_PLAYER :بازیکن آدمیزاد STR_AI_CONFIG_RANDOM_AI :انتخاب هوش مصنوعی به صورت اتفاقی STR_AI_CONFIG_NONE :(هیچکدام) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}حد اکثر تعداد رقبا :{ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :حرکت به بالا STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}حرکت دادن AI انتخاب شده به سمت بالا در لیست @@ -3458,8 +3457,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}حرکت STR_AI_CONFIG_GAMESCRIPT :{SILVER}کدبازی STR_AI_CONFIG_AI :{SILVER}هوشهای مصنوعی -STR_AI_CONFIG_CHANGE :{BLACK}انتخاب {STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :هوش مصنوعی(AI) STR_AI_CONFIG_CHANGE_GAMESCRIPT :کد بازی STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}بارگزاری کد دیگر @@ -3482,9 +3479,7 @@ STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}کد ر # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} پارامترها STR_AI_SETTINGS_CAPTION_AI :هوش مصنوعی(AI) -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :کد بازی STR_AI_SETTINGS_CLOSE :{BLACK}بستن STR_AI_SETTINGS_RESET :{BLACK}بازنشاندن STR_AI_SETTINGS_START_DELAY :تعداد روزهایی که این بازیگر هوش مصنوعی پس از بازیگر هوش مصنوعی قبلی قبل از اتصال صبر می کند(کم و بیش): {ORANGE}{STRING} @@ -3766,6 +3761,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}امکا STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... وسیله نقلیه منهدم شد + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}بطور کلی هیچ خودرویی در دسترس نخواهد بود STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}تنظیمات مربوط به NewGRF را تغییر دهید STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}هنوز خودرویی در دسترس نیست diff --git a/src/lang/polish.txt b/src/lang/polish.txt index 8ef4fbbe61..60cf7fada5 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -575,10 +575,20 @@ STR_UNITS_VELOCITY_METRIC :{COMMA}{NBSP}km STR_UNITS_VELOCITY_SI :{COMMA}{NBSP}m/s STR_UNITS_VELOCITY_GAMEUNITS :{DECIMAL}{NBSP}p{P ole ola ól}/dzień -STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}KM +STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}hp STR_UNITS_POWER_METRIC :{COMMA}{NBSP}KM STR_UNITS_POWER_SI :{COMMA}{NBSP}kW +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_SI :{DECIMAL}{NBSP}hp/Mg +STR_UNITS_POWER_METRIC_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}KM/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}KM/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_SI :{DECIMAL}{NBSP}KM/Mg +STR_UNITS_POWER_SI_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_SI :{DECIMAL}{NBSP}W/kg + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -770,10 +780,11 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Wyjście # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Opcje gry STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Ustawienia -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Ustawienia SI / Game Script +STR_SETTINGS_MENU_AI_SETTINGS :Ustawienia SI +STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :Ustawienia Game Script STR_SETTINGS_MENU_NEWGRF_SETTINGS :Ustawienia NewGRF STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Opcje przeźroczystości STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Wyświetlanie nazw miast @@ -1345,36 +1356,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Rupia Indyjska STR_GAME_OPTIONS_CURRENCY_IDR :Rupia Indonezyjska (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Ringgit malezyjski (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Jazda po lewej -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Jazda po prawej - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Nazwy miast: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Wybierz styl nazw miast - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Angielskie (Oryginalne) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Francuskie -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Niemieckie -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Angielskie (Rozszerzone) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Południowoamerykańskie -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Śmieszne (Angielskie) -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Szwedzkie -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Holenderskie -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Fińskie -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Polskie -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Słowackie -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norweskie -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Węgierskie -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Austriackie -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Rumuńskie -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Czeskie -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Szwajcarskie -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Duńskie -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Tureckie -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Włoskie -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Katalońskie - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Autozapis STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Częstotliwość automatycznego zapisu stanu gry @@ -1391,7 +1372,7 @@ STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :{BLACK}Wybierz STR_GAME_OPTIONS_LANGUAGE_PERCENTAGE :{STRING} (ukończono {NUM}%) STR_GAME_OPTIONS_FULLSCREEN :{BLACK}Pełny ekran -STR_GAME_OPTIONS_FULLSCREEN_TOOLTIP :{BLACK}Zaznacz, jeśli chcesz grać w OpenTTD w trybie pełnoekranowym +STR_GAME_OPTIONS_FULLSCREEN_TOOLTIP :{BLACK}Zaznacz to pole, jeśli chcesz grać w OpenTTD w trybie pełnoekranowym STR_GAME_OPTIONS_RESOLUTION :{BLACK}Rozdzielczość ekranu STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}Wybierz rozdzielczość ekranu @@ -1407,21 +1388,19 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Zaznacz STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Bieżący sterownik: {STRING} -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Rozmiar interfejsu -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Wybierz rozmiar elementów interfejsu +STR_GAME_OPTIONS_GUI_SCALE_FRAME :{BLACK}Rozmiar interfejsu +STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Przeciągnij suwak, aby ustawić rozmiar interfejsu. Przytrzymaj Ctrl, aby uzyskać płynną regulację +STR_GAME_OPTIONS_GUI_SCALE_AUTO :{BLACK}Wykryj rozmiar automatycznie +STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Zaznacz to pole, aby rozmiar interfejsu był wykrywany automatycznie -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(wykryj automatycznie) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normalny -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Podwójny -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Poczwórny +STR_GAME_OPTIONS_GUI_SCALE_BEVELS :{BLACK}Skaluj fazy krawędzi +STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :{BLACK}Zaznacz to pole, aby skalować fazy krawędzi zgodnie z rozmiarem interfejsu -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Wielkość czcionki -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Wybierz wielkość czcionki interfejsu - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(wykryj automatycznie) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normalna -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Podwójna -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Poczwórna +STR_GAME_OPTIONS_GUI_SCALE_1X :1x +STR_GAME_OPTIONS_GUI_SCALE_2X :2x +STR_GAME_OPTIONS_GUI_SCALE_3X :3x +STR_GAME_OPTIONS_GUI_SCALE_4X :4x +STR_GAME_OPTIONS_GUI_SCALE_5X :5x STR_GAME_OPTIONS_GRAPHICS :{BLACK}Grafika @@ -1473,8 +1452,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Podglą STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 funtów (£) w twojej walucie STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Zmień parametr własnej waluty -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Maksymalna liczba przeciwników: {ORANGE}{COMMA} - STR_NONE :Brak STR_FUNDING_ONLY :Tylko sponsorowanie STR_MINIMAL :Minimum @@ -1524,6 +1501,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Klimat umiarkowany +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Klimat arktyczny +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Klimat tropikalny +STR_CLIMATE_TOYLAND_LANDSCAPE :Krajobraz zabawkowy + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Bardzo płaski STR_TERRAIN_TYPE_FLAT :Płaski @@ -1829,6 +1812,8 @@ STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Grubość linii STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :Pokaż nazwę NewGRF-a w oknie budowy pojazdu: {STRING} STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Dodaj wiersz do okna budowy pojazdów, pokazujący z którego NewGRF-a wybrany pojazd pochodzi. +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS :Pokaż w oknach list jakie ładunki mogą być przewożone przez pojazdy: {STRING} +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS_HELPTEXT :Jeśli włączone, ładunek możliwy do przewiezienia przez pojazd będzie wyświetlany nad nim na listach pojazdów. STR_CONFIG_SETTING_LANDSCAPE :Krajobraz: {STRING} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Krajobrazy określają podstawowe scenariusze gry, które różnią się przedsiębiorstwami, ładunkiem i wymogami dla rozwoju miast. Pliki NewGRF i skrypty umożliwiają dokładniejszą kontrolę warunków rozgrywki @@ -1883,6 +1868,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Ulepszony STR_CONFIG_SETTING_ROAD_SIDE :Pojazdy drogowe: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Wybierz stronę, po której będą jeździć samochody +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Jazda po lewej +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Jazda po prawej + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Obrót mapy wysokości: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Przeciwnie do wsk. zegara @@ -2092,7 +2081,7 @@ STR_CONFIG_SETTING_AI_PROFILE_HARD :Trudny STR_CONFIG_SETTING_AI_IN_MULTIPLAYER :Pozwól na SI w grze wieloosobowej: {STRING} STR_CONFIG_SETTING_AI_IN_MULTIPLAYER_HELPTEXT :Pozwól komputerowym graczom SI na udział w grach dla wielu graczy -STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES :ilość #opcodes przed uśpieniem skryptu: {STRING} +STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES :Liczba wysyłanych kodów instrukcji przed zawieszeniem skryptów: {STRING} STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES_HELPTEXT :Maksymalna liczba kroków obliczeniowych, jakie skrypt może zrobić w jednej kolejce STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY :Maksymalne zużycie pamięci na skrypt: {STRING} STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_HELPTEXT :Ilość pamięci jaką może zużywać pojedynczy skrypt zanim zostanie przymusowo zakończony. Może wymagać zwiększenia dla większych map. @@ -2351,7 +2340,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Jednostka mocy STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :Kiedy moc pojazdu jest pokazywana w interfejsie użytkownika, wyświetl ją w wybranych jednostkach ###length 3 STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_IMPERIAL :Imperialne (hp) -STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_METRIC :Metryczne (hp) +STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_METRIC :Metryczne (KM) STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_SI :SI (kW) STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT :Jednostki wagi: {STRING} @@ -2417,7 +2406,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Automatycznie z STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Pozwól pociągom zawracać przed semaforem, jeśli czekają tam bardzo długo ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Zalecane) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Zalecane) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Zmiana wartości @@ -2460,28 +2449,30 @@ STR_INTRO_HIGHSCORE :{BLACK}Tabela w STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Ustawienia STR_INTRO_NEWGRF_SETTINGS :{BLACK}Ustawienia NewGRF STR_INTRO_ONLINE_CONTENT :{BLACK}Sprawdź dodatki online -STR_INTRO_SCRIPT_SETTINGS :{BLACK}Ustawienia SI/Game Script +STR_INTRO_AI_SETTINGS :{BLACK}Ustawienia SI +STR_INTRO_GAMESCRIPT_SETTINGS :{BLACK}Ustawienia Game Script STR_INTRO_QUIT :{BLACK}Wyjście STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Rozpocznij nową grę. Ctrl+klik pomija konfigurowanie mapy STR_INTRO_TOOLTIP_LOAD_GAME :{BLACK}Wczytaj zapisaną grę STR_INTRO_TOOLTIP_PLAY_HEIGHTMAP :{BLACK}Rozpocznij nowa grę używając mapy wysokości jako krajobrazu -STR_INTRO_TOOLTIP_PLAY_SCENARIO :{BLACK}Rozpocznij grę używając własnego scenariusza +STR_INTRO_TOOLTIP_PLAY_SCENARIO :{BLACK}Rozpocznij nową grę, używając przygotowanego scenariusza STR_INTRO_TOOLTIP_SCENARIO_EDITOR :{BLACK}Stwórz własny świat/scenariusz STR_INTRO_TOOLTIP_MULTIPLAYER :{BLACK}Rozpocznij grę wieloosobową -STR_INTRO_TOOLTIP_TEMPERATE :{BLACK}Wybierz krajobraz 'umiarkowany' -STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE :{BLACK}Wybierz krajobraz 'arktyczny' -STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE :{BLACK}Wybierz krajobraz 'tropikalny' -STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Wybierz krajobraz 'zabawkowy' +STR_INTRO_TOOLTIP_TEMPERATE :{BLACK}Wybierz krajobraz „umiarkowany” +STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE :{BLACK}Wybierz krajobraz „arktyczny” +STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE :{BLACK}Wybierz krajobraz „tropikalny” +STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Wybierz krajobraz „zabawkowy” STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Wyświetl opcje gry STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Wyświetl tabelę wyników STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Wyświetl ustawienia gry STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Wyświetl ustawienia NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Poszukaj nowych lub zaktualizowanych dodatków do pobrania -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Pokaż ustawienia SI / Game Script -STR_INTRO_TOOLTIP_QUIT :{BLACK}Wyjdź z 'OpenTTD' +STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Wyświetl ustawienia SI +STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Wyświetl ustawienia Game Script +STR_INTRO_TOOLTIP_QUIT :{BLACK}Wyjdź z „OpenTTD” STR_INTRO_BASESET :{BLACK}Aktualnie używany podstawowy zestaw graficzny nie posiada {NUM} wymagan{P ego ych ych} sprite{P 'u 'ów 'ów}. Proszę poszukać aktualizacji dla zestawu podstawowego. STR_INTRO_TRANSLATION :{BLACK}Tej wersji językowej brakuje jeszcze {NUM} wpis{P "" y ów}. Możesz pomóc ulepszyć nam OpenTTD rejestrując się jako tłumacz. Szczegóły znajdziesz w pliku readme.txt. @@ -2512,12 +2503,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Zmień STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Zmień obecny rok STR_CHEAT_SETUP_PROD :{LTBLUE}Włącz modyfikowanie wielkości produkcji przedsiębiorstw: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Klimat umiarkowany -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Klimat arktyczny -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Klimat tropikalny -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Krajobraz zabawkowy - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Schemat kolorów @@ -2877,13 +2862,13 @@ STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :oczekiwanie na STR_NETWORK_MESSAGE_CLIENT_LEAVING :opuszczanie STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} dołączył do gry. -STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {STRING} dołączył do gry (Klient #{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} dołączył do firmy #{2:NUM} +STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {0:STRING} dołączył do gry (Klient #{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {0:STRING} dołączył do firmy #{2:NUM} STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} dołączył do obserwatorów -STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} założył nową firmę (#{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} opuścił grę ({2:STRING}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {0:STRING} założył nową firmę (#{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {0:STRING} opuścił grę ({2:STRING}) STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} zmienił swoją nazwę na {STRING} -STR_NETWORK_MESSAGE_GIVE_MONEY :*** Firma {STRING} przekazała firmie {1:STRING} {2:CURRENCY_LONG} +STR_NETWORK_MESSAGE_GIVE_MONEY :*** Firma {0:STRING} przekazała firmie {1:STRING} {2:CURRENCY_LONG} STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}Serwer zamknął sesję STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Restart serwera...{}Proszę czekać... STR_NETWORK_MESSAGE_KICKED :*** {STRING} został wyrzucony. Powód: ({STRING}) @@ -3524,6 +3509,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Rozmiar STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Wybierz rozmiar mapy w kwadratach. Liczba dostępnych kwadratów będzie nieco mniejsza STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Liczba miast: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Nazwy miast: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Wybierz styl nazw miast STR_MAPGEN_DATE :{BLACK}Data: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Liczba przedsiębiorstw: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Najwyższy szczyt: @@ -3539,11 +3526,40 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Zmniejsz STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Generator terenu: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Typ terenu: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Poziom wody: +STR_MAPGEN_SEA_LEVEL :{BLACK}Poziom wody: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Liczba rzek: STR_MAPGEN_SMOOTHNESS :{BLACK}Gładkość: STR_MAPGEN_VARIETY :{BLACK}Różnorodność: STR_MAPGEN_GENERATE :{WHITE}Stwórz +STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}Ustawienia NewGRF +STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Wyświetl ustawienia NewGRF +STR_MAPGEN_AI_SETTINGS :{BLACK}Ustawienia SI +STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Wyświetl ustawienia SI +STR_MAPGEN_GS_SETTINGS :{BLACK}Ustawienia Game Script +STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Wyświetl ustawienia Game Script + +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Angielskie (Oryginalne) +STR_MAPGEN_TOWN_NAME_FRENCH :Francuskie +STR_MAPGEN_TOWN_NAME_GERMAN :Niemieckie +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Angielskie (Rozszerzone) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Południowoamerykańskie +STR_MAPGEN_TOWN_NAME_SILLY :Śmieszne (Angielskie) +STR_MAPGEN_TOWN_NAME_SWEDISH :Szwedzkie +STR_MAPGEN_TOWN_NAME_DUTCH :Holenderskie +STR_MAPGEN_TOWN_NAME_FINNISH :Fińskie +STR_MAPGEN_TOWN_NAME_POLISH :Polskie +STR_MAPGEN_TOWN_NAME_SLOVAK :Słowackie +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norweskie +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Węgierskie +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Austriackie +STR_MAPGEN_TOWN_NAME_ROMANIAN :Rumuńskie +STR_MAPGEN_TOWN_NAME_CZECH :Czeskie +STR_MAPGEN_TOWN_NAME_SWISS :Szwajcarskie +STR_MAPGEN_TOWN_NAME_DANISH :Duńskie +STR_MAPGEN_TOWN_NAME_TURKISH :Tureckie +STR_MAPGEN_TOWN_NAME_ITALIAN :Włoskie +STR_MAPGEN_TOWN_NAME_CATALAN :Katalońskie # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Krańce mapy: @@ -3689,6 +3705,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Poprzedn STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Idź do poprzedniego normalnego obrazka, pomijając jakiekolwiek pseudo/kolorowe/znakowe obrazki i zawijaj je od pierwszego do ostatniego STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Przedstawienie wybranego orbazka. Dostosowanie jest ignorowane podczas rysowania tego obrazka STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Poruszaj obrazkiem, zmieniając przesunięcia X i Y. Ctrl+klik aby przesunąć o 8 jednostek na raz. + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Resetuj zależność STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Resetuj aktualne offsety zależne STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X offset: {NUM}, Y offset: {NUM} (Całkowity) @@ -3706,15 +3726,15 @@ STR_NEWGRF_ERROR_MSG_FATAL :{RED}Błąd kry STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Wystąpił błąd krytyczny NewGRF:{}{STRING} STR_NEWGRF_ERROR_POPUP :{WHITE}Wystąpił błąd NewGRF:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} nie zadziała z wersją TTDPatcha zgłoszoną przez OpenTTD -STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} jest przeznaczony dla TTD wersji {STRING} -STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} jest zaprojektowany do użycia z {STRING} -STR_NEWGRF_ERROR_INVALID_PARAMETER :Niewłaściwy parametr dla {1:STRING}: parametr {STRING} ({NUM}) -STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} musi być wczytany przed {STRING} -STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} musi być wczytany po {STRING} -STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} wymaga OpenTTD w wersji {STRING} lub nowszej +STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} jest przeznaczony dla TTD w wersji {2:STRING} +STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} jest zaprojektowany do użycia z {2:STRING} +STR_NEWGRF_ERROR_INVALID_PARAMETER :Niewłaściwy parametr dla {1:STRING}: parametr {2:STRING} ({3:NUM}) +STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} musi być wczytany przed {2:STRING} +STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} musi być wczytany po {2:STRING} +STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} wymaga OpenTTD w wersji {2:STRING} lub nowszej STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :pliku GRF który miał być tłumaczony STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Wczytano zbyt wiele NewGRF -STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Ładowanie {1:STRING} jako statyczne NewGRF z {STRING} może spowodować desynchronizacje +STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Ładowanie {1:STRING} jako statyczne NewGRF z {2:STRING} może spowodować desynchronizacje STR_NEWGRF_ERROR_UNEXPECTED_SPRITE :Nieoczekiwany sprite (sprite {3:NUM}) STR_NEWGRF_ERROR_UNKNOWN_PROPERTY :Nieznana wartość Action 0 {4:HEX} (sprite {3:NUM}) STR_NEWGRF_ERROR_INVALID_ID :Próba użycia niepoprawnego ID (sprite {3:NUM}) @@ -3846,14 +3866,14 @@ STR_LOCAL_AUTHORITY_ACTION_EXCLUSIVE_TRANSPORT :Kup wyłączno STR_LOCAL_AUTHORITY_ACTION_BRIBE :Daj łapówkę lokalnym władzom ###length 8 -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{YELLOW}Rozpocznij małą kampanię reklamową aby zachęcić trochę pasażerów i fabryk do korzystania z Twoich usług transportowych.{}Zapewnia tymczasowy wzrost oceny stacji w małym promieniu wokół centrum miasta.{}Koszt: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{YELLOW}Rozpocznij średnią kampanię reklamową, aby zachęcić więcej pasażerów i fabryk do korzystania z Twoich usług transportowych.{}Zapewnia tymczasowy wzrost oceny stacji w średnim promieniu wokół centrum miasta.{}Koszt: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{YELLOW}Rozpocznij dużą kampanię reklamową aby zachęcić mnóstwo pasażerów i fabryk do korzystania z Twoich usług transportowych.{}Zapewnia tymczasowy wzrost oceny stacji w dużym promieniu wokół centrum miasta.{}Koszt: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{YELLOW}Ufunduj remont sieci dróg.{}Spowoduje to zakłócenia w ruchu ulicznym do 6 miesięcy.{}Koszt: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{YELLOW}Zbuduj pomnik dla uczczenia twojej firmy.{}Trwale podniesie to ocenę twoich stacji w pobliżu tego miasta.{}Koszt: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{YELLOW}Ufunduj nowe budynki komercyjne w mieście.{}Daje jednorazowy impuls do szybszego wzrostu miasta.{}Koszt: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW}Kup roczną wyłączność na prawa transportowe w mieście.{} Lokalne władze nie pozwolą pasażerom ani przedsiębiorstwom korzystać z usług innych firm.{}Koszt: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Daj łapówkę lokalnym władzom. Powiększ swoją ocenę, ryzykując poważne kary w razie złapania.{}Koszt: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{YELLOW}Rozpocznij małą lokalną kampanię reklamową, aby przyciągnąć więcej pasażerów i ładunków do twoich usług transportowych.{}Zapewnia tymczasowe zwiększenie oceny stacji w małym promieniu wokół centrum miasta.{}{POP_COLOUR}Koszt: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{PUSH_COLOUR}{YELLOW}Rozpocznij średnią lokalną kampanię reklamową, aby przyciągnąć więcej pasażerów i ładunków do twoich usług transportowych.{}Zapewnia tymczasowe zwiększenie oceny stacji w umiarkowanym promieniu wokół centrum miasta.{}{POP_COLOUR}Koszt: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}Rozpocznij dużą lokalną kampanię reklamową, aby przyciągnąć więcej pasażerów i ładunków do twoich usług transportowych.{}Zapewnia tymczasowe zwiększenie oceny stacji w dużym promieniu wokół centrum miasta.{}{POP_COLOUR}Koszt: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{PUSH_COLOUR}{YELLOW}Ufunduj remont sieci dróg.{}Spowoduje to zakłócenia w ruchu ulicznym do 6 miesięcy.{}{POP_COLOUR}Koszt: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Zbuduj statuę dla uczczenia swojej firmy.{}Trwale podniesie to ocenę twoich stacji w pobliżu tego miasta.{}{POP_COLOUR}Koszt: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Ufunduj nowe budynki w mieście.{}Zapewnia tymczasowe przyspieszenie rozwoju tego miasta.{}{POP_COLOUR}Koszt: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}Kup roczną wyłączność na prawa transportowe w mieście.{}Lokalne władze nie pozwolą pasażerom ani przedsiębiorstwom korzystać z usług innych firm.{}{POP_COLOUR}Koszt: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Przekup lokalne władze, aby zwiększyć swoją ocenę, ryzykując surową karę w przypadku przyłapania.{}{POP_COLOUR}Koszt: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}Cele firmy {COMPANY} @@ -4026,16 +4046,18 @@ STR_FINANCES_SECTION_SHIP_REVENUE :{GOLD}Statki STR_FINANCES_SECTION_LOAN_INTEREST :{GOLD}Odsetki od pożyczki STR_FINANCES_SECTION_OTHER :{GOLD}Inne +STR_FINANCES_TOTAL_CAPTION :{WHITE}Łącznie STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} STR_FINANCES_ZERO_INCOME :{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} -STR_FINANCES_NET_PROFIT :{WHITE}Zysk netto +STR_FINANCES_PROFIT :{WHITE}Zysk STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Bilans bankowy STR_FINANCES_OWN_FUNDS_TITLE :{WHITE}Środki własne STR_FINANCES_LOAN_TITLE :{WHITE}Pożyczka STR_FINANCES_INTEREST_RATE :{WHITE}Oprocentowanie pożyczki: {BLACK}{NUM}% STR_FINANCES_MAX_LOAN :{WHITE}Maksymalna pożyczka: {BLACK}{CURRENCY_LONG} STR_FINANCES_TOTAL_CURRENCY :{BLACK}{CURRENCY_LONG} +STR_FINANCES_BANK_BALANCE :{WHITE}{CURRENCY_LONG} STR_FINANCES_BORROW_BUTTON :{BLACK}Pożyczka {CURRENCY_LONG} STR_FINANCES_BORROW_TOOLTIP :{BLACK}Zwiększ wielkość pożyczki. Ctrl+klik pożycza największą możliwą kwotę STR_FINANCES_REPAY_BUTTON :{BLACK}Zwrot {CURRENCY_LONG} @@ -4120,7 +4142,7 @@ STR_INDUSTRY_DIRECTORY_ITEM_PRODMORE :{ORANGE}{INDUST STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Nazwy przedsiębiorstw - kliknij na nazwę przedsiębiorstwa, aby wyśrodkować na nim widok główny. Ctrl+klik otwiera nowy podgląd na lokalizację przedsiębiorstwa STR_INDUSTRY_DIRECTORY_ACCEPTED_CARGO_FILTER :{BLACK}Akceptowany ładunek: {SILVER}{STRING} STR_INDUSTRY_DIRECTORY_PRODUCED_CARGO_FILTER :{BLACK}Produkowany ładunek: {SILVER}{STRING} -STR_INDUSTRY_DIRECTORY_FILTER_ALL_TYPES :Wszystkie typy ładunku +STR_INDUSTRY_DIRECTORY_FILTER_ALL_TYPES :Wszystkie typy ładunków STR_INDUSTRY_DIRECTORY_FILTER_NONE :Żadne # Industry view @@ -4136,7 +4158,7 @@ STR_INDUSTRY_VIEW_PRODUCES_N_CARGO :{BLACK}Wytwarza STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :, {STRING}{STRING} STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Potrzebuje: -STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{0:STRING}{BLACK}{3:STRING} STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} oczekuje{STRING} STR_CONFIG_GAME_PRODUCTION :{WHITE}Zmiana produkcji (wielokrotność 8, do 2040) @@ -4166,6 +4188,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Wyślij STR_VEHICLE_LIST_REPLACE_VEHICLES :Zastąp pojazdy STR_VEHICLE_LIST_SEND_FOR_SERVICING :Wyślij do serwisu STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Zysk w tym roku: {CURRENCY_LONG} (ostatni rok: {CURRENCY_LONG}) +STR_VEHICLE_LIST_CARGO :{TINY_FONT}{BLACK}[{CARGO_LIST}] +STR_VEHICLE_LIST_NAME_AND_CARGO :{TINY_FONT}{BLACK}{STRING} {STRING} STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Wyślij do warsztatów STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Wyślij do zajezdni @@ -4249,7 +4273,7 @@ STR_PURCHASE_INFO_COST_REFIT_SPEED :{BLACK}Koszt: { STR_PURCHASE_INFO_AIRCRAFT_CAPACITY :{BLACK}Ładowność: {GOLD}{CARGO_LONG}, {CARGO_LONG} STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT :{BLACK}Moc: {GOLD}+{POWER}{BLACK} Masa: {GOLD}+{WEIGHT_SHORT} STR_PURCHASE_INFO_REFITTABLE_TO :{BLACK}Można przystosować do: {GOLD}{STRING} -STR_PURCHASE_INFO_ALL_TYPES :wszystkie typy ładunków +STR_PURCHASE_INFO_ALL_TYPES :Wszystkie typy ładunków STR_PURCHASE_INFO_NONE :Żadne STR_PURCHASE_INFO_ENGINES_ONLY :Tylko lokomotywy STR_PURCHASE_INFO_ALL_BUT :wszystko oprócz {CARGO_LIST} @@ -4257,6 +4281,11 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Maks. si STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Zasięg: {GOLD}{COMMA} pól STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Typ samolotu: {GOLD}{STRING} +###length 3 +STR_CARGO_TYPE_FILTER_ALL :Wszystkie typy ładunków +STR_CARGO_TYPE_FILTER_FREIGHT :Fracht +STR_CARGO_TYPE_FILTER_NONE :Żaden + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Lista wyboru pociągów - kliknij na pojazd, aby uzyskać informacje. Ctrl+klik przełącza ukrywanie typu pojazdu STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Lista wyboru pojazdów drogowych - kliknij na pojazd, aby uzyskać więcej informacji. Ctrl+klik przełącza ukrywanie typu pojazdu @@ -4431,7 +4460,7 @@ STR_ENGINE_PREVIEW_SHIP :{G=m}statek STR_ENGINE_PREVIEW_SHIP.b :statek STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Koszt: {CURRENCY_LONG} Masa: {WEIGHT_SHORT}{}Prędkość: {VELOCITY} Moc: {POWER}{}Koszt utrzymania: {CURRENCY_LONG}/rok{}Ładowność: {CARGO_LONG} -STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Koszt: {CURRENCY_LONG} Masa: {WEIGHT_SHORT}{}Prędkość: {VELOCITY} Moc: {POWER} Maksymalna siła pociągowa: {6:FORCE}{}Koszt utrzymania: {4:CURRENCY_LONG}/rok{}Ładowność: {5:CARGO_LONG} +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Koszt: {0:CURRENCY_LONG} Masa: {1:WEIGHT_SHORT}{}Prędkość: {2:VELOCITY} Moc: {3:POWER} Maks. siła pociągowa: {6:FORCE}{}Koszt utrzymania: {4:CURRENCY_LONG}/rok{}Ładowność: {5:CARGO_LONG} STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Koszt: {CURRENCY_LONG} Prędkość maksymalna: {VELOCITY}{}Ładowność: {CARGO_LONG}{}Koszt utrzymania: {CURRENCY_LONG}/rok STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Koszt: {CURRENCY_LONG} Max. prędkość: {VELOCITY}{}Typ samolotu: {STRING}{}Ładowność: {CARGO_LONG}, {CARGO_LONG}{}Koszt utrzymania: {CURRENCY_LONG}/rok STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Koszt: {CURRENCY_LONG} Max. prędkość: {VELOCITY}{}Typ samolotu: {STRING}{}Ładowność: {CARGO_LONG}{}Koszt utrzymania: {CURRENCY_LONG}/rok @@ -4589,13 +4618,14 @@ STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Max. pr STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Masa: {LTBLUE}{WEIGHT_SHORT} {BLACK}Moc: {LTBLUE}{POWER}{BLACK} Prędkość maksymalna: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Masa: {LTBLUE}{WEIGHT_SHORT} {BLACK}Moc: {LTBLUE}{POWER}{BLACK} Prędkość maksymalna: {LTBLUE}{VELOCITY} {BLACK}Maksymalna siła pociągowa: {LTBLUE}{FORCE} -STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Zysk w tym roku: {LTBLUE}{CURRENCY_LONG} (w zeszłym roku: {CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Zysk w tym roku: {LTBLUE}{CURRENCY_LONG} (ostatni rok: {CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Zysk w tym roku: {LTBLUE}{CURRENCY_LONG} (ostatni rok: {CURRENCY_LONG}) {BLACK}Min. wydajność: {LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Niezawodność: {LTBLUE}{COMMA}% {BLACK}Awarie od ostatniego serwisowania: {LTBLUE}{COMMA} STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Zakupiony: {LTBLUE}{NUM}{BLACK} Wartość: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_INFO_NO_CAPACITY :{BLACK}Ładowność: {LTBLUE}żadna{STRING} -STR_VEHICLE_INFO_CAPACITY :{BLACK}Ładowność: {LTBLUE}{CARGO_LONG}{3:STRING} -STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Ładowność: {LTBLUE}{CARGO_LONG}{3:STRING} (x{4:NUM}) +STR_VEHICLE_INFO_CAPACITY :{BLACK}Ładowność: {LTBLUE}{0:CARGO_LONG}{3:STRING} +STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Ładowność: {LTBLUE}{0:CARGO_LONG}{3:STRING} (x{4:NUM}) STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Ładowność: {LTBLUE}{CARGO_LONG}, {CARGO_LONG}{STRING} STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Wartość ładunku: {LTBLUE}{CURRENCY_LONG} @@ -4923,12 +4953,14 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Jeden z STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Okno debugowania SI / Game Script jest dostępne tylko na serwerze # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Konfiguracja SI / Game Script +STR_AI_CONFIG_CAPTION_AI :{WHITE}Konfiguracja SI +STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Konfiguracja Game Script STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Game Script, który zostanie załadowany podczas kolejnej gry STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}SI, które zostaną załadowane podczas kolejnej gry STR_AI_CONFIG_HUMAN_PLAYER :Ludzki gracz STR_AI_CONFIG_RANDOM_AI :Losowe SI STR_AI_CONFIG_NONE :(brak) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Maksymalna liczba przeciwników: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Przesuń w górę STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Przesuń wybraną SI w górę listy @@ -4936,19 +4968,18 @@ STR_AI_CONFIG_MOVE_DOWN :{BLACK}Przesuń STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Przesuń wybraną SI w dół listy STR_AI_CONFIG_GAMESCRIPT :{SILVER}Game Script +STR_AI_CONFIG_GAMESCRIPT_PARAM :{SILVER}Parametry STR_AI_CONFIG_AI :{SILVER}SI -STR_AI_CONFIG_CHANGE :{BLACK}Wybierz {STRING} -STR_AI_CONFIG_CHANGE_NONE : -STR_AI_CONFIG_CHANGE_AI :SI -STR_AI_CONFIG_CHANGE_GAMESCRIPT :Game Script +STR_AI_CONFIG_CHANGE_AI :{BLACK}Wybierz SI +STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}Wybierz Game Script STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Wczytaj kolejny skrypt STR_AI_CONFIG_CONFIGURE :{BLACK}Konfiguruj STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Konfiguruj parametry skryptu # Available AIs window STR_AI_LIST_CAPTION :{WHITE}Dostępne {STRING} -STR_AI_LIST_CAPTION_AI :Gracze SI +STR_AI_LIST_CAPTION_AI :SI STR_AI_LIST_CAPTION_GAMESCRIPT :Game Scripty STR_AI_LIST_TOOLTIP :{BLACK}Kliknij, aby wybrać skrypt @@ -4970,9 +5001,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Zrzut ek STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Zrzut ekranu minimapy # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametry -STR_AI_SETTINGS_CAPTION_AI :SI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Game Script +STR_AI_SETTINGS_CAPTION_AI :{WHITE}Parametry SI STR_AI_SETTINGS_CLOSE :{BLACK}Zamknij STR_AI_SETTINGS_RESET :{BLACK}Resetuj STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -5390,6 +5419,8 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Nie moż STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... pojazd jest zniszczony +STR_ERROR_CAN_T_CLONE_VEHICLE_LIST :{WHITE}... nie wszystkie pojazdy są takie same + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Żadne pojazdy nie będą dostępne STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Zmień konfigurację swoich NewGRF-ów STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Obecnie żaden pojazd nie jest dostępny @@ -5416,6 +5447,8 @@ STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}Nie moż STR_ERROR_CAN_T_COPY_SHARE_ORDER :{WHITE}... pojazd nie może jechać do wszystkich stacji STR_ERROR_CAN_T_ADD_ORDER :{WHITE}... pojazd nie może jechać do tej stacji STR_ERROR_CAN_T_ADD_ORDER_SHARED :{WHITE}... pojazd dzielący ten rozkaz nie może jechać do tej stacji +STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST :{WHITE}... nie wszystkie pojazdy mają takie same polecenia +STR_ERROR_CAN_T_SHARE_ORDER_VEHICLE_LIST :{WHITE}... nie wszystkie pojazdy współdzielą polecenia STR_ERROR_CAN_T_SHARE_ORDER_LIST :{WHITE}Nie można współdzielić listy poleceń... STR_ERROR_CAN_T_STOP_SHARING_ORDER_LIST :{WHITE}Nie można zaprzestać współdzielenia listy poleceń... diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 0e02ac4219..abf79ec1e9 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -201,6 +201,16 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}cv STR_UNITS_POWER_METRIC :{COMMA}cv STR_UNITS_POWER_SI :{COMMA}kW +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_SI :{DECIMAL}{NBSP}hp/Mg +STR_UNITS_POWER_METRIC_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_SI :{DECIMAL}{NBSP}hp/Mg +STR_UNITS_POWER_SI_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_SI :{DECIMAL}{NBSP}W/kg + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}kg @@ -258,10 +268,10 @@ STR_SHOW_HIDDEN_ENGINES_VEHICLE_SHIP :{BLACK}Mostrar STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT :{BLACK}Mostrar escondido ###length VEHICLE_TYPES -STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN_TOOLTIP :{BLACK}Ao activar este botão, os veículos ferroviários ocultos também serão exibidos -STR_SHOW_HIDDEN_ENGINES_VEHICLE_ROAD_VEHICLE_TOOLTIP :{BLACK}Ao activar este botão, os veículos rodoviários ocultos também serão exibidos -STR_SHOW_HIDDEN_ENGINES_VEHICLE_SHIP_TOOLTIP :{BLACK}Ao activar este botão, os navios ocultos também serão exibidos -STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}Ao activar este botão, os aviões ocultos também serão exibidos +STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN_TOOLTIP :{BLACK}Ao ativar este botão, os veículos ferroviários ocultos também serão exibidos +STR_SHOW_HIDDEN_ENGINES_VEHICLE_ROAD_VEHICLE_TOOLTIP :{BLACK}Ao ativar este botão, os veículos rodoviários ocultos também serão exibidos +STR_SHOW_HIDDEN_ENGINES_VEHICLE_SHIP_TOOLTIP :{BLACK}Ao ativar este botão, os navios ocultos também serão exibidos +STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}Ao ativar este botão, os aviões ocultos também serão exibidos # Query window STR_BUTTON_DEFAULT :{BLACK}Padrão @@ -308,7 +318,7 @@ STR_SORT_BY_RATING_MIN :Menor carga STR_SORT_BY_ENGINE_ID :EngineID (ordem clássica) STR_SORT_BY_COST :Custo STR_SORT_BY_POWER :Potência -STR_SORT_BY_TRACTIVE_EFFORT :Força de Tracção +STR_SORT_BY_TRACTIVE_EFFORT :Esforço de tração STR_SORT_BY_INTRO_DATE :Data de Introdução STR_SORT_BY_RUNNING_COST :Custo de circulação STR_SORT_BY_POWER_VS_RUNNING_COST :Potência/Custo de circulação @@ -392,10 +402,11 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Sair # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Opções do Jogo STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Definições -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Definições de IA / Scripts de Jogo +STR_SETTINGS_MENU_AI_SETTINGS :Definições de IA +STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :Definições de script de jogo STR_SETTINGS_MENU_NEWGRF_SETTINGS :Definições NewGRF STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Opções de Transparência STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Mostrar nomes de localidades @@ -598,8 +609,8 @@ STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Valor da STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Tarifas por carga STR_GRAPH_CARGO_PAYMENT_RATES_X_LABEL :{TINY_FONT}{BLACK}Dias em trânsito STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}Pagamento por entregar 10 unidades (ou 10 000 litros) de carga numa distância de 20 quadrados -STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLACK}Activar tudo -STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}Desactivar tudo +STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLACK}Ativar tudo +STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}Desativar tudo STR_GRAPH_CARGO_TOOLTIP_ENABLE_ALL :{BLACK}Mostrar todas as cargas no gráfico de tarifas por carga STR_GRAPH_CARGO_TOOLTIP_DISABLE_ALL :{BLACK}Não mostrar carga no gráfico de tarifas por carga STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO :{BLACK}Mostrar/ocultar gráfico para o tipo de carga @@ -776,8 +787,8 @@ STR_SMALLMAP_INDUSTRY :{TINY_FONT}{STR STR_SMALLMAP_LINKSTATS :{TINY_FONT}{STRING} STR_SMALLMAP_COMPANY :{TINY_FONT}{COMPANY} STR_SMALLMAP_TOWN :{TINY_FONT}{WHITE}{TOWN} -STR_SMALLMAP_DISABLE_ALL :{BLACK}Desactivar tudo -STR_SMALLMAP_ENABLE_ALL :{BLACK}Activar tudo +STR_SMALLMAP_DISABLE_ALL :{BLACK}Desativar tudo +STR_SMALLMAP_ENABLE_ALL :{BLACK}Ativar tudo STR_SMALLMAP_SHOW_HEIGHT :{BLACK}Mostrar altura STR_SMALLMAP_TOOLTIP_DISABLE_ALL_INDUSTRIES :{BLACK}Não mostrar indústrias no mapa STR_SMALLMAP_TOOLTIP_ENABLE_ALL_INDUSTRIES :{BLACK}Mostrar todas as indústrias no mapa @@ -966,42 +977,12 @@ STR_GAME_OPTIONS_CURRENCY_INR :Rupia Indiana ( STR_GAME_OPTIONS_CURRENCY_IDR :Rupia Indonésia (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Ringgit da Malásia (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Circular pela esquerda -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Circular pela direita - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Nomes das localidades: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Seleccionar o estilo dos nomes das localidades - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Inglês -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Francês -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Alemão -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Inglês (Adicional) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Latino-Americano -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Absurdo -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Sueco -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Holandês -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finlandês -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Polaco -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Eslovaco -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norueguês -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Húngaro -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Austríaco -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Romeno -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Checo -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Suíço -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Dinamarquês -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turco -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italiano -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Catalão - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Guardar automaticamente STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Seleccionar o intervalo para guardar automático # Autosave dropdown ###length 5 -STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_OFF :Desactivado +STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_OFF :Desativado STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_1_MONTH :Cada mês STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_3_MONTHS :Cada 3 meses STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_6_MONTHS :Cada 6 meses @@ -1028,21 +1009,19 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Marque e STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}"Driver" atual: {STRING} -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Tamanho interface -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Seleccionar tamanho do elemento de interface a usar +STR_GAME_OPTIONS_GUI_SCALE_FRAME :{BLACK}Tamanho do interface +STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Arraste o controle deslizante para definir o tamanho do interface. Mantenha pressionada a tecla Ctrl para um ajuste contínuo +STR_GAME_OPTIONS_GUI_SCALE_AUTO :{BLACK}Auto-detetar o tamanho +STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Marque esta caixa para detetar automaticamente o tamanho do interface -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(auto-detetar) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Dobro do tamanho -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Quádruplo do tamanho +STR_GAME_OPTIONS_GUI_SCALE_BEVELS :{BLACK}Escalar chanfros +STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :{BLACK}Marque esta caixa para dimensionar os chanfros por tamanho de interface -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Tamanho da fonte -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Seleccionar tamanho da fonte de interface a usar - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(auto-detetar) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Dobro do tamanho -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Quádruplo do tamanho +STR_GAME_OPTIONS_GUI_SCALE_1X :1x +STR_GAME_OPTIONS_GUI_SCALE_2X :2x +STR_GAME_OPTIONS_GUI_SCALE_3X :3x +STR_GAME_OPTIONS_GUI_SCALE_4X :4x +STR_GAME_OPTIONS_GUI_SCALE_5X :5x STR_GAME_OPTIONS_GRAPHICS :{BLACK}Gráficos @@ -1094,8 +1073,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Pré-vi STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 Libras (£) na sua moeda STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Mudar parâmetro de moeda modificada -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Número máximo de oponentes: {ORANGE}{COMMA} - STR_NONE :Nenhum STR_FUNDING_ONLY :Financiamento apenas STR_MINIMAL :Mínimo @@ -1145,6 +1122,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Terreno temperado +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Terreno subárctico +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Terreno subtropical +STR_CLIMATE_TOYLAND_LANDSCAPE :Terreno terra dos brinquedos + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Muito Plano STR_TERRAIN_TYPE_FLAT :Plano @@ -1205,7 +1188,7 @@ STR_CONFIG_SETTING_CATEGORY_AND_TYPE_HIDES :{BLACK}Mostrar ###length 3 STR_CONFIG_SETTING_OFF :Desligado STR_CONFIG_SETTING_ON :Ligado -STR_CONFIG_SETTING_DISABLED :Desactivado +STR_CONFIG_SETTING_DISABLED :Desativado ###length 3 STR_CONFIG_SETTING_COMPANIES_OFF :Desligado @@ -1226,7 +1209,7 @@ STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Valor máximo d STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Quantia máxima que uma companhia pode pedir (sem ter em conta a inflação) STR_CONFIG_SETTING_INTEREST_RATE :Taxa de juro: {STRING} -STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Taxa de juro do empréstimo; também controla a inflacção, se activo +STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Taxa de juro do empréstimo; também controla a inflação, se ativo STR_CONFIG_SETTING_RUNNING_COSTS :Custos operacionais: {STRING} STR_CONFIG_SETTING_RUNNING_COSTS_HELPTEXT :Configurar nível de manutenção e custos operacionais de veículos e infraestrutura @@ -1251,13 +1234,13 @@ STR_CONFIG_SETTING_CONSTRUCTION_COSTS :Custos de const STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Configurar o nível de construção e custos de compra STR_CONFIG_SETTING_RECESSIONS :Recessões: {STRING} -STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :Se activo, podem ocorrer recessões em intervalos de poucos anos. Durante uma recessão a produção em geral é mais baixa (volta aos níveis anteriores quando termina) +STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :Se ativo, podem ocorrer recessões em intervalos de poucos anos. Durante uma recessão a produção em geral é mais baixa (volta aos níveis anteriores quando termina) STR_CONFIG_SETTING_TRAIN_REVERSING :Desabilitar inversão de combóios nas estações: {STRING} -STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT :Quando activo, os combóios não podem inverter marcha em estações não-terminais, mesmo se existir um caminho mais curto para o destino seguinte com inversão +STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT :Quando ativo, os comboios não podem inverter marcha em estações não-terminais, mesmo se existir um caminho mais curto para o próximo destino ao inverter STR_CONFIG_SETTING_DISASTERS :Desastres: {STRING} -STR_CONFIG_SETTING_DISASTERS_HELPTEXT :Activa desastres que podem ocasionalmente bloquear ou destruir veículos ou infraestruturas +STR_CONFIG_SETTING_DISASTERS_HELPTEXT :Ativa desastres que podem ocasionalmente bloquear ou destruir veículos ou infraestruturas STR_CONFIG_SETTING_CITY_APPROVAL :Atitude da autoridade local: {STRING} STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT :Escolha de que forma o ruído e dano ambiental causado pelas empresas afeta o rating da povoação e futuras ações de construção nessa povoação @@ -1276,7 +1259,7 @@ STR_CONFIG_SETTING_CATCHMENT :Dimensionamento STR_CONFIG_SETTING_CATCHMENT_HELPTEXT :Haver diferentes áreas de cobertura para diferentes tipos de estações e aeroportos STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES :Estações da companhia podem servir industrias equipadas com estações neutras: {STRING} -STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES_HELPTEXT :Quando activo, industrias com estações incluídas (com as Petrolíferas) podem ser servidas por estações da companhia construídas nas redondezas. Quando inactivo, estas industrias só podem ser servidas pela sua própria estação. Qualquer estação da companhia não poderá servir a industria, nem a estação incluída poder servir outra entidade senão a própria industria +STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES_HELPTEXT :Quando ativo, industrias com estações incluídas (com as Petrolíferas) podem ser servidas por estações da companhia construídas nas redondezas. Quando inativo, estas industrias só podem ser servidas pela sua própria estação. Qualquer estação da companhia não poderá servir a industria, nem a estação incluída pode servir outra entidade senão a própria industria STR_CONFIG_SETTING_EXTRADYNAMITE :Permite remover mais estradas, pontes e túneis detidos pela cidade: {STRING} STR_CONFIG_SETTING_EXTRADYNAMITE_HELPTEXT :Facilitar a remoçar de edifícios e infraestruturas detidas pela localidade @@ -1289,10 +1272,10 @@ STR_CONFIG_SETTING_SMOKE_AMOUNT :Quantidade de f STR_CONFIG_SETTING_SMOKE_AMOUNT_HELPTEXT :Assignar quanto fumo ou quantas faíscas são emitidas pelos veículos STR_CONFIG_SETTING_TRAIN_ACCELERATION_MODEL :Modelo de aceleração de comboios: {STRING} -STR_CONFIG_SETTING_TRAIN_ACCELERATION_MODEL_HELPTEXT :Escolha o modelo de física para a aceleração de comboios. O modelo "original" penalisa as inclinações para todos os veículos. O modelo "realista" penalisa as curvas e inclinações tendo em conta várias propriedades do objecto, como o tamanho e esforço tractivo +STR_CONFIG_SETTING_TRAIN_ACCELERATION_MODEL_HELPTEXT :Escolha o modelo de física para a aceleração de comboios. O modelo "original" penaliza as inclinações para todos os veículos. O modelo "realista" penaliza as curvas e inclinações tendo em conta várias propriedades do comboio, tais como o comprimento e o esforço de tração STR_CONFIG_SETTING_ROAD_VEHICLE_ACCELERATION_MODEL :Tipo de aceleração dos veículos rodoviários: {STRING} -STR_CONFIG_SETTING_ROAD_VEHICLE_ACCELERATION_MODEL_HELPTEXT :Escolha o modelo de física para a aceleração de veículos de estrada. O modelo "original" penalisa as inclinações para todos os veículos. O modelo "realista" penalisa as curvas e inclinações tendo em conta várias propriedades do motor, como o esforço tractivo +STR_CONFIG_SETTING_ROAD_VEHICLE_ACCELERATION_MODEL_HELPTEXT :Escolha o modelo de física para a aceleração de veículos de estrada. O modelo "original" penaliza as inclinações para todos os veículos. O modelo "realista" penaliza as curvas e inclinações tendo em conta várias propriedades do motor, tais como o esforço de tração STR_CONFIG_SETTING_TRAIN_SLOPE_STEEPNESS :Ângulo de inclinação para comboios: {STRING} STR_CONFIG_SETTING_TRAIN_SLOPE_STEEPNESS_HELPTEXT :Ângulo de inclinação de um quadrado para um comboio. Valores mais elevados tornam a subida mais difícil @@ -1320,11 +1303,11 @@ STR_CONFIG_SETTING_MAX_TUNNEL_LENGTH :Tamanho máximo STR_CONFIG_SETTING_MAX_TUNNEL_LENGTH_HELPTEXT :Tamanho máximo para construção de túneis STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD :Método de financiamento de indústrias primárias: {STRING} -STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_HELPTEXT :Método de financiar uma indústria primária. 'nenhum' significa que não é possível financiar nenhuma, 'prospecção' significa que é possível financiar, mas a construção é feita num local arbitrário no mapa e até pode falhar, 'como as outras' significa que as indústrias de matérias primas podem ser construídas em qualquer sítio pelas empresas, como se fossem indústrias de processamento +STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_HELPTEXT :Método de financiar uma indústria primária. 'nenhum' significa que não é possível financiar nenhuma; 'em prospeção' significa que é possível financiar, mas a construção é feita num local aleatório no mapa e pode até falhar; 'como as outras' significa que as indústrias de matérias primas podem ser construídas em qualquer local escolhido pelas empresas, como se fossem indústrias de processamento ###length 3 STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_NONE :Nenhum STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_NORMAL :Como as outras -STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_PROSPECTING :Prospecção +STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_PROSPECTING :Em prospeção STR_CONFIG_SETTING_INDUSTRY_PLATFORM :Área plana à volta das industrias: {STRING} STR_CONFIG_SETTING_INDUSTRY_PLATFORM_HELPTEXT :Quantidade de terreno plano á volta de uma industria. Isto garante que terreno vazio esteja disponível para construir linhas, etc @@ -1353,7 +1336,7 @@ STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :no meio STR_CONFIG_SETTING_STOP_LOCATION_FAR_END :no extremo longe STR_CONFIG_SETTING_AUTOSCROLL :Deslocar janela quando o rato está na borda do mapa: {STRING} -STR_CONFIG_SETTING_AUTOSCROLL_HELPTEXT :Quando activo, os visualizadores começam a deslocar-se logo que o rato esteja no extremo da janela +STR_CONFIG_SETTING_AUTOSCROLL_HELPTEXT :Quando ativo, os visualizadores começam a deslocar-se logo que o rato esteja no extremo da janela ###length 4 STR_CONFIG_SETTING_AUTOSCROLL_DISABLED :Desligado STR_CONFIG_SETTING_AUTOSCROLL_MAIN_VIEWPORT_FULLSCREEN :Visualizador principal, só ecrã cheio @@ -1376,7 +1359,7 @@ STR_CONFIG_SETTING_ALLOW_GIVE_MONEY :Permite enviar STR_CONFIG_SETTING_ALLOW_GIVE_MONEY_HELPTEXT :Permite transferências de dinheiro entre empresas em modo multi-jogador STR_CONFIG_SETTING_FREIGHT_TRAINS :Multiplicador de peso para simular comboios pesados: {STRING} -STR_CONFIG_SETTING_FREIGHT_TRAINS_HELPTEXT :Define o impacto de carregar mercadoria nos combóios. Um valor superior torna o carregamento de meradoria mais exigente para os combóios, especialmente em terreno inclinado +STR_CONFIG_SETTING_FREIGHT_TRAINS_HELPTEXT :Define o impacto de carregar mercadoria nos comboios. Um valor elevado torna o transporte de mercadorias mais exigente para os comboios, especialmente em terreno inclinado STR_CONFIG_SETTING_PLANE_SPEED :Fator de velocidade de avião: {STRING} STR_CONFIG_SETTING_PLANE_SPEED_HELPTEXT :Set the relative speed of planes compared to other vehicle types, to reduce the amount of income of transport by aircraft @@ -1396,13 +1379,13 @@ STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD_HELPTEXT :Permite constru STR_CONFIG_SETTING_DYNAMIC_ENGINES_EXISTING_VEHICLES :{WHITE}Não é possível mudar quando já existem veículos. STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE :Manutenção de infraestruturas: {STRING} -STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :Quando activo, as infraestruturas têm custos de manutenção. O custo cresce mais do que proporcionalmente com o tamanho da rede e com isso afecta mais as companhias maiores comparado com as mais pequeneas +STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :Quando ativo, as infraestruturas têm custos de manutenção. O custo cresce mais do que proporcionalmente com o tamanho da rede e com isso afeta mais as companhias maiores comparando com as mais pequenas STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR :Côr de inicio da empresa: {STRING} STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_HELPTEXT :Escolher côr de inicio da empresa STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :Aeroportos nunca expiram: {STRING} -STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :Activar esta preferência torna cada tipo de aeroporto disponível para sempre após a sua introdução +STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :Ativar esta preferência torna cada tipo de aeroporto disponível para sempre após a sua introdução STR_CONFIG_SETTING_WARN_LOST_VEHICLE :Avisar se o veículo está perdido: {STRING} STR_CONFIG_SETTING_WARN_LOST_VEHICLE_HELPTEXT :Mostrar mensagens sobre veículos que não conseguem encontrar o caminho para o seu próximo destino. @@ -1415,13 +1398,13 @@ STR_CONFIG_SETTING_ORDER_REVIEW_EXDEPOT :Sim, mas exclui STR_CONFIG_SETTING_ORDER_REVIEW_ON :De todos os veículos STR_CONFIG_SETTING_WARN_INCOME_LESS :Avisar se o lucro de um veiculo for negativo: {STRING} -STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Quando activo, uma notícia é enviada quando um veículo não deu lucro durante um ano +STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Quando ativo, uma notícia é enviada quando um veículo não deu lucro durante um ano STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Veículos nunca expiram: {STRING} -STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Quando activo, todos os modelos de veículos permanecerão disponíveis para sempre após a sua introdução +STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Quando ativo, todos os modelos de veículos permanecerão disponíveis para sempre após a sua introdução STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Auto-renovação de veículos quando ficam velhos: {STRING} -STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Quando activo, um veículo a chegar ao fim de vida é automaticamente substituído quando as condições de renovação estão reunidas +STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Quando ativo, um veículo a chegar ao fim de vida é automaticamente substituído quando as condições de renovação estão reunidas STR_CONFIG_SETTING_AUTORENEW_MONTHS :Renovar automaticamente quando um veículo chega a {STRING} a idade máxima STR_CONFIG_SETTING_AUTORENEW_MONTHS_HELPTEXT :Idade relativa a partir da qual um veículo deva ser indicado para auto-renovação @@ -1450,6 +1433,8 @@ STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Largura da linh STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :Exibir o nome do "NewGRF" na janela de compra de veículos: {STRING} STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Adiciona uma linha à janela de compra de veículos, mostrando a qual "NewGRF" pertence o veículo selecionado. +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS :Mostrar as cargas que os veículos podem transportar nas janelas de listagem {STRING} +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS_HELPTEXT :Quando ativo, a carga transportável do veículo aparecerá acima nas listas de veículos STR_CONFIG_SETTING_LANDSCAPE :Cenário: {STRING} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Os climas definem a jogabilidade base dos cenários com diferentes cargas e requisitos de crescimento das localidades. Os "NewGRF" e "Scripts" de Jogo permitem um controlo mais preciso. @@ -1504,6 +1489,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Melhorada STR_CONFIG_SETTING_ROAD_SIDE :Veículos rodoviários: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Escolher o lado de condução +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Circular pela esquerda +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Circular pela direita + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Rotação mapa de alt.: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Sentido anti-horário @@ -1547,7 +1536,7 @@ STR_CONFIG_SETTING_SCROLLMODE_RMB :Mover mapa com STR_CONFIG_SETTING_SCROLLMODE_LMB :Mover mapa com Botão Esquerdo Rato STR_CONFIG_SETTING_SMOOTH_SCROLLING :Suavizar deslocamento da navegação no mapa: {STRING} -STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Controla como a vista principal navega para uma posição específica ao clicar no mapa pequeno ou ao dar um comando para navegar para um objecto específico no mapa. Se activo, a vista principal navega suavemente, se inactivo a vista salta directamente para o destino. +STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Controla como a vista principal navega para uma posição específica ao clicar no mapa pequeno ou ao dar um comando para navegar para um objeto específico no mapa. Se ativo, a vista principal navega suavemente, se inativo a vista salta diretamente para o destino. STR_CONFIG_SETTING_MEASURE_TOOLTIP :Mostrar medidas nas várias ferramentas de construção: {STRING} STR_CONFIG_SETTING_MEASURE_TOOLTIP_HELPTEXT :Mostrar distâncias em quadrados e diferenças de altura enquanto arrasta o rato durante tarefas de construção @@ -1566,7 +1555,7 @@ STR_CONFIG_SETTING_SCROLLWHEEL_MULTIPLIER :Velocidade da r STR_CONFIG_SETTING_SCROLLWHEEL_MULTIPLIER_HELPTEXT :Controlo de sensibilidade da roda de rolagem do rato STR_CONFIG_SETTING_SCROLLWHEEL_SCROLLING :Função da roda do rato: {STRING} -STR_CONFIG_SETTING_SCROLLWHEEL_SCROLLING_HELPTEXT :Activar navegação com rodas de scroll bidimensional +STR_CONFIG_SETTING_SCROLLWHEEL_SCROLLING_HELPTEXT :Ativar "scroll" com rodas de rato bidimensionais ###length 3 STR_CONFIG_SETTING_SCROLLWHEEL_ZOOM :Ampliar mapa STR_CONFIG_SETTING_SCROLLWHEEL_SCROLL :Percorrer mapa @@ -1575,7 +1564,7 @@ STR_CONFIG_SETTING_SCROLLWHEEL_OFF :Desligado STR_CONFIG_SETTING_OSK_ACTIVATION :Teclado no ecrã: {STRING} STR_CONFIG_SETTING_OSK_ACTIVATION_HELPTEXT :Selecione o método de abertura de teclado virtual para escrita de texto em caixas, usando apenas o cursor. Esta opção destina-se principalmente para equipamentos pequenos sem teclado físico. ###length 4 -STR_CONFIG_SETTING_OSK_ACTIVATION_DISABLED :Desactivado +STR_CONFIG_SETTING_OSK_ACTIVATION_DISABLED :Desativado STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Duplo clique STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Clique simples (quando em foco) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Clique (imediatamente) @@ -1595,7 +1584,7 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL : + clique STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Desligado STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Fechar janelas ao fazer clique direito: {STRING} -STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Fecha uma janela ao fazer clique direito dentro dela. Desactiva os textos de ajuda ao fazer clique direito! +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Fecha uma janela ao fazer clique direito dentro dela. Desativa os textos de ajuda ao fazer clique direito! STR_CONFIG_SETTING_AUTOSAVE :Guardar automaticamente: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Seleccione o intervalo entre gravações automáticas @@ -1608,7 +1597,7 @@ STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_SHORT :curto (31-12-20 STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_ISO :ISO (2008-12-31) STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME :Pausa automática ao iniciar um novo jogo: {STRING} -STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME_HELPTEXT :Quando activo, o jogo ficará em pausa automaticamente num novo jogo, permitindo o estudo ao pormenor do mapa +STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME_HELPTEXT :Quando ativo, o jogo ficará em pausa automaticamente num novo jogo, permitindo o estudo ao pormenor do mapa STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL :Durante pausa permitir: {STRING} STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_HELPTEXT :Seleccionar que acções podem ser feitas enquanto o jogo está em pausa @@ -1619,7 +1608,7 @@ STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_NON_LANDSCAPING :Todas expecto a STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_ACTIONS :Todas as acções STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS :Usar a lista avançada de veículos: {STRING} -STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Activar a utilização de listas avançadas de veículos para o agrupamento de veículos +STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Ativar a utilização de listas avançadas de veículos para o agrupamento de veículos STR_CONFIG_SETTING_LOADING_INDICATORS :Usar indicadores de carga: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Seleccionar se os indicadores de carga são mostrados acima de veículos em carga ou descarga @@ -1643,7 +1632,7 @@ STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_MOST_USED :Mais utilizado STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION :Mostrar caminho de ferro reservado: {STRING} STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION_HELPTEXT :Dar cores diferentes aos carris reservados para ajudar a detectar problemas com combóios que recusam entrar em bloqueios baseados em caminhos -STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS :Deixar ferramentas de construção activas depois de usadas: {STRING} +STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS :Deixar ferramentas de construção ativas depois de usadas: {STRING} STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS_HELPTEXT :Manter as ferramentas de construção de pontes, túneis, etc. abertas após uso STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS :Remover automaticamente os sinais durante a construção de vias férreas: {STRING} @@ -1691,20 +1680,20 @@ STR_CONFIG_SETTING_MAX_AIRCRAFT_HELPTEXT :Número máximo STR_CONFIG_SETTING_MAX_SHIPS :Máximo de navios por empresa: {STRING} STR_CONFIG_SETTING_MAX_SHIPS_HELPTEXT :Número máximo de navios que uma companhia pode ter -STR_CONFIG_SETTING_AI_BUILDS_TRAINS :Desactivar comboios para o computador: {STRING} -STR_CONFIG_SETTING_AI_BUILDS_TRAINS_HELPTEXT :Activar esta preferência impossibilita a criação de comboios por jogadores controlados pelo computador +STR_CONFIG_SETTING_AI_BUILDS_TRAINS :Desativar comboios para o computador: {STRING} +STR_CONFIG_SETTING_AI_BUILDS_TRAINS_HELPTEXT :Ativar esta preferência impossibilita a criação de comboios por jogadores controlados pelo computador -STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES :Desactivar veículos rodoviários para o computador: {STRING} -STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES_HELPTEXT :Activar esta preferência impossibilita a construção de veículos de estrada por um jogador controlado pelo computador +STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES :Desativar veículos rodoviários para o computador: {STRING} +STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES_HELPTEXT :Ativar esta preferência impossibilita a construção de veículos de estrada por um jogador controlado pelo computador -STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT :Desactivar aeronaves para o computador: {STRING} -STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT_HELPTEXT :Activar esta preferência impossibilita a construção de aeronaves por um jogador controlado pelo computador +STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT :Desativar aeronaves para o computador: {STRING} +STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT_HELPTEXT :Ativar esta preferência impossibilita a construção de aeronaves por um jogador controlado pelo computador -STR_CONFIG_SETTING_AI_BUILDS_SHIPS :Desactivar navios para o computador: {STRING} -STR_CONFIG_SETTING_AI_BUILDS_SHIPS_HELPTEXT :Activar esta preferência impossibilita a construção de navios por um jogador controlado pelo computador +STR_CONFIG_SETTING_AI_BUILDS_SHIPS :Desativar navios para o computador: {STRING} +STR_CONFIG_SETTING_AI_BUILDS_SHIPS_HELPTEXT :Ativar esta preferência impossibilita a construção de navios por um jogador controlado pelo computador STR_CONFIG_SETTING_AI_PROFILE :Perfil de preferências por omissão: {STRING} -STR_CONFIG_SETTING_AI_PROFILE_HELPTEXT :Escolher o perfil de preferências a usar para AIs aleatórias ou para valores iniciais ao adicionar uma nova AI ou Script de Jogo +STR_CONFIG_SETTING_AI_PROFILE_HELPTEXT :Escolher o perfil de preferências a usar para IAs aleatórias ou para valores iniciais ao adicionar uma nova IA ou Script de Jogo ###length 3 STR_CONFIG_SETTING_AI_PROFILE_EASY :Fácil STR_CONFIG_SETTING_AI_PROFILE_MEDIUM :Média @@ -1720,7 +1709,7 @@ STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_HELPTEXT :Definir o volum STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_VALUE :{COMMA} MiB STR_CONFIG_SETTING_SERVINT_ISPERCENT :Os intervalos de serviço são em percentagem: {STRING} -STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :Escolher se a manutenção de veículos é activada pelo tempo passado deste a última manutenção, ou pela fiabilidade abaixo de uma certa percentagem da fiabilidade máxima +STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :Escolher se a manutenção de veículos é ativada pelo tempo decorrido deste a última manutenção, ou pela fiabilidade abaixo de uma certa percentagem da fiabilidade máxima STR_CONFIG_SETTING_SERVINT_TRAINS :Intervalo de serviço para comboios por omissão: {STRING} STR_CONFIG_SETTING_SERVINT_TRAINS_HELPTEXT :Definir o intervalo de manutenção por omissão para novos veículos sobre carris, se não for configurado um intervalo de manutenção explícito para o veículo @@ -1738,10 +1727,10 @@ STR_CONFIG_SETTING_NOSERVICE :Não fazer manu STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Quando ativo, os veículos não farão manutenção se não puderem avariar STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Ativar limites de velocidade para vagões: {STRING} -STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Quando activo, usar também os limites de velocidade das carruagens para decidir a velocidade máxima de um comboio +STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Quando ativo, aplica também os limites de velocidade dos vagões para decidir a velocidade máxima do comboio -STR_CONFIG_SETTING_DISABLE_ELRAILS :Desactivar carris electrificados: {STRING} -STR_CONFIG_SETTING_DISABLE_ELRAILS_HELPTEXT :Activar esta preferência desactiva o requisito de electrificar carris para que composições eléctricas os possam utilizar +STR_CONFIG_SETTING_DISABLE_ELRAILS :Desativar carris eletrificados: {STRING} +STR_CONFIG_SETTING_DISABLE_ELRAILS_HELPTEXT :Ativar esta preferência desativa o requisito de eletrificar carris para que composições elétricas os possam utilizar STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OWN :Chegada do primeiro veículo à estação do jogador: {STRING} STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OWN_HELPTEXT :Mostrar um jornal na chegada do primeiro veículo a uma estação nova do jogador @@ -1813,7 +1802,7 @@ STR_CONFIG_SETTING_ECONOMY_TYPE_SMOOTH :Suave STR_CONFIG_SETTING_ECONOMY_TYPE_FROZEN :Congelada STR_CONFIG_SETTING_ALLOW_SHARES :Permite comprar acções de outras empresas: {STRING} -STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Quando activo, permite a compra e venda de acções de companhias. As acções apenas estarão disponíveis quando a companhia atinge uma determinada idade. +STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Quando ativo, permite a compra e venda de ações de companhias. As ações apenas estarão disponíveis quando a companhia atinge uma determinada idade. STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Idade mínima da empresa para negociar ações: {STRING} STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES_HELPTEXT :Definir a idade mínima de uma companhia a partir da qual outros jogadores poderão comprar ou vender ações da mesma. @@ -1825,7 +1814,7 @@ STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :Ao arrastar, co STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Define a distância a que os sinais serão construídos num carril até ao próximo obstáculo (sinal, junção), se os sinais são arrastados STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} quadrado{P 0 "" s} STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :Ao arrastar, manter distância fixa entre sinais: {STRING} -STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Seleccionar o comportamento da colocação de sinais ao usar Ctrl+arrasto. Se desactivado, sinais são colocados à volta de túneis ou pontes para evitar longos trajectos sem sinais. Se activo, sinais são colocados a cada N mosaicos, facilitando o alinhamento de sinais em linhas paralelas +STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Selecionar o comportamento da colocação de sinais ao usar Ctrl+arrasto. Se desativado, os sinais são colocados à volta de túneis ou pontes para evitar longos trajetos sem sinais. Se ativo, os sinais são colocados a cada N mosaicos, facilitando o alinhamento de sinais em linhas paralelas STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Usar automaticamente sinais clássicos antes de: {STRING} STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Configurar o ano em que sinais eléctricos podem ser usados para os carris. Antes deste ano, sinais não-eléctricos serão usados (que têm a mesma funcionalidade, mas aspecto diferente) @@ -1852,15 +1841,15 @@ STR_CONFIG_SETTING_TOWN_LAYOUT_3X3_GRID :grelha 3x3 STR_CONFIG_SETTING_TOWN_LAYOUT_RANDOM :Aleatório STR_CONFIG_SETTING_ALLOW_TOWN_ROADS :As localidades têm permissão para construir estradas: {STRING} -STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Permite às localidades a construção de estradas para crescimento. Desactivar para não permitir às autoridades a construção de estradas +STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Permite às localidades a construção de estradas para crescimento. Desativar para prevenir a construção de estradas pelas autoridades locais. STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Localidades podem construir passagens de nível: {STRING} -STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Activar esta preferência permite às localidades construir cruzamentos nivelados +STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Ativar esta preferência permite às localidades construir cruzamentos nivelados STR_CONFIG_SETTING_NOISE_LEVEL :Permitir que a localidade controle o nível de ruído dos aeroportos: {STRING} -STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Com esta preferência desactivada, podem haver dois aeroportos em cada localidade. Com esta preferência activa, o número de aeroportos numa localidade é limitado pela aceitação do ruído na mesma, que depende da população, do tamanho do aeroporto e da sua distância +STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Com esta preferência desativada, podem haver dois aeroportos em cada localidade. Com esta preferência ativa, o número de aeroportos numa localidade é limitado pela aceitação do ruído na mesma, que depende da população, do tamanho do aeroporto e da sua distância STR_CONFIG_SETTING_TOWN_FOUNDING :Fundar localidades no jogo: {STRING} -STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Activar esta preferência permite aos jogadores fundar novas povoações no jogo +STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Ativar esta preferência permite aos jogadores fundar novas povoações no jogo ###length 3 STR_CONFIG_SETTING_TOWN_FOUNDING_FORBIDDEN :Proibido STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED :Permitido @@ -2038,7 +2027,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Inversão autom STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Permitir que os comboios invertam o sentido de marcha nos sinais, caso estejam à espera muito tempo ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Recomendado) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Recomendado) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Alterar valor @@ -2079,9 +2068,10 @@ STR_INTRO_MULTIPLAYER :{BLACK}Multi-jo STR_INTRO_GAME_OPTIONS :{BLACK}Opções de jogo STR_INTRO_HIGHSCORE :{BLACK}Tabela de classificações STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Definições -STR_INTRO_NEWGRF_SETTINGS :{BLACK}Definições NewGRF +STR_INTRO_NEWGRF_SETTINGS :{BLACK}Definições de NewGRF STR_INTRO_ONLINE_CONTENT :{BLACK}Verificar conteúdo online -STR_INTRO_SCRIPT_SETTINGS :{BLACK}Definições de IA/Script de jogo +STR_INTRO_AI_SETTINGS :{BLACK}Definições de IA +STR_INTRO_GAMESCRIPT_SETTINGS :{BLACK}Definições de Script de Jogo STR_INTRO_QUIT :{BLACK}Sair STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Iniciar um novo jogo. Ctrl+Clique salta a configuração do mapa @@ -2101,7 +2091,8 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Mostrar STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Mostrar definições STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Mostrar definições de NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Verificar conteúdo novo e actualizado para descarga -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Mostrar definições de IA e de script de jogo +STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Mostrar definições de IA +STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Mostrar definições de Script de Jogo STR_INTRO_TOOLTIP_QUIT :{BLACK}Sair de 'OpenTTD' STR_INTRO_BASESET :{BLACK}O conjunto de gráficos base seleccionado tem {NUM} sprite{P "" s} em falta. Por favor verifique se existem atualizações para o conjunto. @@ -2131,13 +2122,7 @@ STR_CHEAT_EDIT_MAX_HL :{LTBLUE}Editar STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT :{WHITE}Editar altura máxima de montanhas no mapa STR_CHEAT_CHANGE_DATE :{LTBLUE}Alterar data: {ORANGE}{DATE_SHORT} STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Alterar ano actual -STR_CHEAT_SETUP_PROD :{LTBLUE}Activar modificação de valores de produção: {ORANGE}{STRING} - -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Terreno temperado -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Terreno subárctico -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Terreno subtropical -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Terreno terra dos brinquedos +STR_CHEAT_SETUP_PROD :{LTBLUE}Ativar modificação de valores de produção: {ORANGE}{STRING} # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Novo Esquema de Cores @@ -2209,7 +2194,7 @@ STR_FACE_AFRICAN :{BLACK}Africano STR_FACE_SELECT_AFRICAN :{BLACK}Seleccionar Caras Africanas STR_FACE_YES :Sim STR_FACE_NO :Não -STR_FACE_MOUSTACHE_EARRING_TOOLTIP :{BLACK}Activar bigode ou brinco +STR_FACE_MOUSTACHE_EARRING_TOOLTIP :{BLACK}Ativar bigode ou brinco STR_FACE_HAIR :Cabelo: STR_FACE_HAIR_TOOLTIP :{BLACK}Mudar cabelo STR_FACE_EYEBROWS :Sobrancelhas: @@ -2217,7 +2202,7 @@ STR_FACE_EYEBROWS_TOOLTIP :{BLACK}Mudar so STR_FACE_EYECOLOUR :Cor dos olhos: STR_FACE_EYECOLOUR_TOOLTIP :{BLACK}Mudar cor dos olhos STR_FACE_GLASSES :Óculos: -STR_FACE_GLASSES_TOOLTIP :{BLACK}Activar óculos +STR_FACE_GLASSES_TOOLTIP :{BLACK}Ativar óculos STR_FACE_GLASSES_TOOLTIP_2 :{BLACK}Mudar óculos STR_FACE_NOSE :Nariz: STR_FACE_NOSE_TOOLTIP :{BLACK}Mudar nariz @@ -2498,13 +2483,13 @@ STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :esperando pela STR_NETWORK_MESSAGE_CLIENT_LEAVING :a sair STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} entrou no jogo -STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {STRING} entrou no jogo (Cliente #{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} entrou na empresa #{2:NUM} +STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {0:STRING} entrou no jogo (Client #{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {0:STRING} entrou na empresa #{2:NUM} STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} entrou como espectador -STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} iniciou uma nova empresa (#{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} deixou o jogo ({2:STRING}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {0:STRING} iniciou uma nova empresa (#{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {0:STRING} deixou o jogo ({2:STRING}) STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} mudou o nome para {STRING} -STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} deu {2:CURRENCY_LONG} a {1:STRING} +STR_NETWORK_MESSAGE_GIVE_MONEY :*** {0:STRING} deu {2:CURRENCY_LONG} a {1:STRING} STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}O servidor fechou a sessão STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}O servidor está a reiniciar...{}Por favor espere... STR_NETWORK_MESSAGE_KICKED :*** {STRING} foi expulso. Motivo: ({STRING}) @@ -2739,7 +2724,7 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Construi STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Construir paragem de eléctricos para passageiros. Ctrl permite juntar estações. Shift alterna contruir/mostrar custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Construir área de carregamento de camiões. Ctrl permite juntar estações. Shift alterna contruir/mostrar custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Construir paragem de eléctricos para carga. Ctrl permite juntar estações. Shift alterna contruir/mostrar custo estimado -STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD :{BLACK}Activar/Desactivar estradas de sentido único +STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD :{BLACK}Ativar/Desativar estradas de sentido único STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Construir ponte de estrada. Shift alterna contruir/mostrar custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}Construir ponte para eléctricos. Shift alterna contruir/mostrar custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Construir túnel de estrada. Shift alterna contruir/mostrar custo estimado @@ -2867,6 +2852,8 @@ STR_FOUND_TOWN_RANDOM_TOWN_BUTTON :{BLACK}Localida STR_FOUND_TOWN_RANDOM_TOWN_TOOLTIP :{BLACK}Fundar uma localidade num local aleatório STR_FOUND_TOWN_MANY_RANDOM_TOWNS :{BLACK}Várias localidades aleatórias STR_FOUND_TOWN_RANDOM_TOWNS_TOOLTIP :{BLACK}Cobrir o mapa com localidades colocadas aleatoriamente +STR_FOUND_TOWN_EXPAND_ALL_TOWNS :{BLACK}Expandir todas as localidades +STR_FOUND_TOWN_EXPAND_ALL_TOWNS_TOOLTIP :{BLACK}Fazer com que todas as localidades cresçam ligeiramente STR_FOUND_TOWN_NAME_TITLE :{YELLOW}Nome da localidade: STR_FOUND_TOWN_NAME_EDITOR_TITLE :{BLACK}Introduza o nome da localidade @@ -2899,7 +2886,7 @@ STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_TOOLTIP :{BLACK}Cobrir o STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_CAPTION :{WHITE}Criar indústrias aleatórias STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_QUERY :{YELLOW}Tem a certeza que deseja criar muitas indústrias aleatórias? STR_FUND_INDUSTRY_INDUSTRY_BUILD_COST :{BLACK}Custo: {YELLOW}{CURRENCY_LONG} -STR_FUND_INDUSTRY_PROSPECT_NEW_INDUSTRY :{BLACK}Prospectar +STR_FUND_INDUSTRY_PROSPECT_NEW_INDUSTRY :{BLACK}Prospetar STR_FUND_INDUSTRY_BUILD_NEW_INDUSTRY :{BLACK}Construir STR_FUND_INDUSTRY_FUND_NEW_INDUSTRY :{BLACK}Criar STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES :{BLACK}Remover todas as indústrias @@ -3087,9 +3074,9 @@ STR_FRAMERATE_DRAWING :{BLACK}Renderiz STR_FRAMERATE_DRAWING_VIEWPORTS :{BLACK} Janelas de exibição do mundo: STR_FRAMERATE_VIDEO :{BLACK}Saída de video: STR_FRAMERATE_SOUND :{BLACK}Mistura de Som: -STR_FRAMERATE_ALLSCRIPTS :{BLACK} GS/AI total: +STR_FRAMERATE_ALLSCRIPTS :{BLACK} SJ/IA total: STR_FRAMERATE_GAMESCRIPT :{BLACK} Script de jogo: -STR_FRAMERATE_AI :{BLACK} AI {NUM} {STRING} +STR_FRAMERATE_AI :{BLACK} IA {NUM} {STRING} ###length 15 STR_FRAMETIME_CAPTION_GAMELOOP :Loop de jogo @@ -3106,7 +3093,7 @@ STR_FRAMETIME_CAPTION_VIDEO :Saída de video STR_FRAMETIME_CAPTION_SOUND :Mistura de Som STR_FRAMETIME_CAPTION_ALLSCRIPTS :total scripts GS/AI STR_FRAMETIME_CAPTION_GAMESCRIPT :Script de jogo -STR_FRAMETIME_CAPTION_AI :AI {NUM} {STRING} +STR_FRAMETIME_CAPTION_AI :IA {NUM} {STRING} # Save/load game/scenario @@ -3145,6 +3132,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Dim. do STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Seleccionar o tamanho do mapa em mosaicos. O numero de mosaicos disponiveis será ligeiramente menor STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Num. de localidades: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Nomes das localidades: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Seleccionar o estilo dos nomes das localidades STR_MAPGEN_DATE :{BLACK}Data: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Num. de indústrias: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Pico mais alto: @@ -3160,11 +3149,40 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Diminuir STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Criação do terreno: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Tipo de terreno: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Nível do mar: +STR_MAPGEN_SEA_LEVEL :{BLACK}Nível do mar: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Rios: STR_MAPGEN_SMOOTHNESS :{BLACK}Suavidade: STR_MAPGEN_VARIETY :{BLACK}Variedade da distribuição: STR_MAPGEN_GENERATE :{WHITE}Gerar +STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}Definições de NewGRF +STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Mostrar definições de NewGRF +STR_MAPGEN_AI_SETTINGS :{BLACK}Definições de IA +STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Mostrar definições de IA +STR_MAPGEN_GS_SETTINGS :{BLACK}Definições de Script de Jogo +STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Mostrar definições de script de jogo + +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Inglês +STR_MAPGEN_TOWN_NAME_FRENCH :Francês +STR_MAPGEN_TOWN_NAME_GERMAN :Alemão +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Inglês (Adicional) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Latino-Americano +STR_MAPGEN_TOWN_NAME_SILLY :Absurdo +STR_MAPGEN_TOWN_NAME_SWEDISH :Sueco +STR_MAPGEN_TOWN_NAME_DUTCH :Holandês +STR_MAPGEN_TOWN_NAME_FINNISH :Finlandês +STR_MAPGEN_TOWN_NAME_POLISH :Polaco +STR_MAPGEN_TOWN_NAME_SLOVAK :Eslovaco +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norueguês +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Húngaro +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Austríaco +STR_MAPGEN_TOWN_NAME_ROMANIAN :Romeno +STR_MAPGEN_TOWN_NAME_CZECH :Checo +STR_MAPGEN_TOWN_NAME_SWISS :Suíço +STR_MAPGEN_TOWN_NAME_DANISH :Dinamarquês +STR_MAPGEN_TOWN_NAME_TURKISH :Turco +STR_MAPGEN_TOWN_NAME_ITALIAN :Italiano +STR_MAPGEN_TOWN_NAME_CATALAN :Catalão # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Limites do mapa: @@ -3220,8 +3238,8 @@ STR_GENERATION_PREPARING_GAME :{BLACK}A prepar # NewGRF settings STR_NEWGRF_SETTINGS_CAPTION :{WHITE}Definições NewGRF STR_NEWGRF_SETTINGS_INFO_TITLE :{WHITE}Informação detalhada do NewGRF -STR_NEWGRF_SETTINGS_ACTIVE_LIST :{WHITE}Ficheiros NewGRF activos -STR_NEWGRF_SETTINGS_INACTIVE_LIST :{WHITE}Ficheiros NewGRF inactivos +STR_NEWGRF_SETTINGS_ACTIVE_LIST :{WHITE}Ficheiros NewGRF ativos +STR_NEWGRF_SETTINGS_INACTIVE_LIST :{WHITE}Ficheiros NewGRF inativos STR_NEWGRF_SETTINGS_SELECT_PRESET :{ORANGE}Seleccionar predefinição: STR_NEWGRF_FILTER_TITLE :{ORANGE}Filtro: STR_NEWGRF_SETTINGS_PRESET_LIST_TOOLTIP :{BLACK}Carrega a predefinição seleccionada @@ -3267,7 +3285,7 @@ STR_NEWGRF_SETTINGS_PARAMETER_NONE :Nenhum STR_NEWGRF_SETTINGS_NO_INFO :{BLACK}Sem informação disponível STR_NEWGRF_SETTINGS_NOT_FOUND :{RED}Ficheiro correspondente não encontrado -STR_NEWGRF_SETTINGS_DISABLED :{RED}Desactivado +STR_NEWGRF_SETTINGS_DISABLED :{RED}Desativado STR_NEWGRF_SETTINGS_INCOMPATIBLE :{RED}Incompatível com esta versão do OpenTTD # NewGRF save preset window @@ -3281,7 +3299,7 @@ STR_SAVE_PRESET_SAVE :{BLACK}Grava STR_SAVE_PRESET_SAVE_TOOLTIP :{BLACK}Grava a predefinição com o nome seleccionado # NewGRF parameters window -STR_NEWGRF_PARAMETERS_CAPTION :{WHITE}Alterar parâmetros NewGRF +STR_NEWGRF_PARAMETERS_CAPTION :{WHITE}Alterar parâmetros de NewGRF STR_NEWGRF_PARAMETERS_CLOSE :{BLACK}Fechar STR_NEWGRF_PARAMETERS_RESET :{BLACK}Repor STR_NEWGRF_PARAMETERS_RESET_TOOLTIP :{BLACK}Retorna todos os parâmetros ao seu valor padrão @@ -3310,6 +3328,13 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Gráfico STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Proceder ao gráfico normal anterior, ignorando quaisquer gráficos pseudo/recolorir/tipo-de-letra e dando a volta no início STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Representação do gráfico seleccionado actualmente. O alinhamento é ignorado a desenhar este gráfico STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Desloca o gráfico, alterando os intervalos X e Y. Ctrl+Clique desloca o gráfico 8 unidades de uma só vez + +###length 2 +STR_SPRITE_ALIGNER_CENTRE_OFFSET :{BLACK}Deslocamento centrado +STR_SPRITE_ALIGNER_CENTRE_SPRITE :{BLACK}Sprite centrado + +STR_SPRITE_ALIGNER_CROSSHAIR :{BLACK}Mira + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Repor relativo STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Repor intervalos relativos atuais STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}Intervalo X: {NUM}, Intervalo Y: {NUM} (Absoluto) @@ -3327,15 +3352,15 @@ STR_NEWGRF_ERROR_MSG_FATAL :{RED}Fatal: {SI STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Ocorreu um erro fatal num NewGRF:{}{STRING} STR_NEWGRF_ERROR_POPUP :{WHITE}Ocorreu um erro de NewGRF:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} não funciona com a versão do TTDPatch reportada por OpenTTD. -STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} é para a versão {STRING} do TTD. -STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} foi concebido para ser usado com {STRING} -STR_NEWGRF_ERROR_INVALID_PARAMETER :Parâmetro inválido para {1:STRING}: parâmetro {STRING} ({NUM}) -STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} deve ser carregado antes do {STRING}. -STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} deve ser carregado depois do {STRING}. -STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} requer a versão {STRING} ou superior do OpenTTD. +STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} é para a versão {2:STRING} do TTD +STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} foi concebido para ser usado com {2:STRING} +STR_NEWGRF_ERROR_INVALID_PARAMETER :Parâmetro inválido para {1:STRING}: parâmetro {2:STRING} ({3:NUM}) +STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} deve ser carregado antes de {2:STRING} +STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} deve ser carregado depois de {2:STRING} +STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} requer OpenTTD versão {2:STRING} ou superior STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :ficheiro GRF concebido para o traduzir STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Demasiados NewGRFs carregados. -STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Carregar {1:STRING} como NewGRF estático com {STRING} pode causar dessincronização. +STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Carregar {1:STRING} como NewGRF estático com {2:STRING} pode causar dessincronização STR_NEWGRF_ERROR_UNEXPECTED_SPRITE :Gráfico inválido (sprite {3:NUM}) STR_NEWGRF_ERROR_UNKNOWN_PROPERTY :Propriedade Action 0 desconhecida {4:HEX} (sprite {3:NUM}) STR_NEWGRF_ERROR_INVALID_ID :Tentativa de uso de ID Inválido (sprite {3:NUM}) @@ -3343,7 +3368,7 @@ STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Contém múltiplas entradas Action 8 - (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Leitura além dos limites do pseudo-sprite (sprite {3:NUM}) STR_NEWGRF_ERROR_GRM_FAILED :Recursos GRF pedidos não disponíveis (sprite {3:NUM}) -STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} foi desactivado por {STRING} +STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} foi desativado por {STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Formato de Gráfico Inválido ou desconhecido (sprite {3:NUM}) STR_NEWGRF_ERROR_LIST_PROPERTY_TOO_LONG :Demasiados elementos na lista de valores de propriedade (sprite {3:NUM}, propriedade {4:HEX}) STR_NEWGRF_ERROR_INDPROD_CALLBACK :Revogação da produção industrial inválida (sprite {3:NUM}, "{2:STRING}") @@ -3357,7 +3382,7 @@ STR_NEWGRF_COMPATIBLE_LOADED :{ORANGE}Ficheir STR_NEWGRF_TOO_MANY_NEWGRFS :{WHITE}Impossivel adicionar ficheiro: alcançado limite de ficheiros NewGRF STR_NEWGRF_COMPATIBLE_LOAD_WARNING :{WHITE}GRF(s) compatíveis carregados para ficheiros em falta -STR_NEWGRF_DISABLED_WARNING :{WHITE}Ficheiro(s) GRF em falta foram desactivados +STR_NEWGRF_DISABLED_WARNING :{WHITE}Ficheiro(s) GRF em falta foram desativados STR_NEWGRF_UNPAUSE_WARNING_TITLE :{YELLOW}Ficheiro(s) GRF em falta STR_NEWGRF_UNPAUSE_WARNING :{WHITE}Sair da pausa pode causar problemas ao OpenTTD. Não envie informações sobre este tipo de problemas.{}Deseja realmente sair da pausa? @@ -3467,14 +3492,14 @@ STR_LOCAL_AUTHORITY_ACTION_EXCLUSIVE_TRANSPORT :Comprar exclusi STR_LOCAL_AUTHORITY_ACTION_BRIBE :Subornar a autoridade local ###length 8 -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{YELLOW}Iniciar uma campanha local publicitária pequena, para atrair mais passageiros e carga à sua empresa.{}Providencia um incremento temporário na avaliação das estações num raio pequeno à volta do centro da localidade.{}Custo: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{YELLOW}Iniciar uma campanha local publicitária média, para atrair mais passageiros e carga à sua empresa.{}Providencia um incremento temporário na avaliação das estações num raio médio à volta do centro da localidade.{}Custo: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{YELLOW}Iniciar uma campanha local publicitária grande, para atrair mais passageiros e carga à sua empresa.{}Providencia um incremento temporário na avaliação das estações num raio grande à volta do centro da localidade.{}Custo: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{YELLOW}Financiar a reconstrução da rede rodoviária urbana.{}Causa engarrafamentos consideráveis ao tráfego rodoviário até 6 meses.{}Custo: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{YELLOW}Construir uma estátua em honra da sua empresa.{}Providencia um incremento permanente na avaliação das estações nesta localidade.{}Custo: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{YELLOW}Financiar a construção de novos edifícios na localidade.{}Providencia um incremento temporário no crescimento desta localidade.{}Custo: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW}Comprar 1 ano de direitos exclusivos de transportes nesta localidade.{}A autoridade local não permitirá que os passageiros e a carga usem as estações dos seus concorrentes.{}Custo: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Subornar a autoridade local para aumentar a sua avaliação, correndo o risco de uma penalidade severa se apanhado.{}Custo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{YELLOW}Iniciar uma campanha local publicitária pequena, para atrair mais passageiros e carga à sua empresa.{}Providencia um incremento temporário na avaliação das estações num raio pequeno à volta do centro da localidade.{}{POP_COLOUR}Custo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{PUSH_COLOUR}{YELLOW}Iniciar uma campanha local publicitária média, para atrair mais passageiros e carga à sua empresa.{}Providencia um incremento temporário na avaliação das estações num raio médio à volta do centro da localidade.{}{POP_COLOUR}Custo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}Iniciar uma campanha local publicitária grande, para atrair mais passageiros e carga à sua empresa.{}Providencia um incremento temporário na avaliação das estações num raio grande à volta do centro da localidade.{}{POP_COLOUR}Custo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{PUSH_COLOUR}{YELLOW}Financiar a reconstrução da rede rodoviária urbana.{}Causa engarrafamentos consideráveis ao tráfego rodoviário até 6 meses.{}{POP_COLOUR}Custo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Construir uma estátua em honra da sua empresa.{}Providencia um incremento permanente na avaliação das estações nesta localidade.{}{POP_COLOUR}Custo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Financiar a construção de novos edifícios na localidade.{}Providencia um incremento temporário no crescimento desta localidade.{}{POP_COLOUR}Custo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}Comprar 1 ano de direitos exclusivos de transportes nesta localidade.{}A autoridade local não permitirá que os passageiros e a carga usem as estações dos seus concorrentes.{}{POP_COLOUR}Custo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Subornar a autoridade local para aumentar a sua avaliação, correndo o risco de uma penalidade severa se for apanhado.{}{POP_COLOUR}Custo: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}{COMPANY} Objectivos @@ -3647,16 +3672,18 @@ STR_FINANCES_SECTION_SHIP_REVENUE :{GOLD}Navios STR_FINANCES_SECTION_LOAN_INTEREST :{GOLD}Juros do Empréstimo STR_FINANCES_SECTION_OTHER :{GOLD}Outros +STR_FINANCES_TOTAL_CAPTION :{WHITE}Total STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} STR_FINANCES_ZERO_INCOME :{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} -STR_FINANCES_NET_PROFIT :{WHITE}Lucro Líquido +STR_FINANCES_PROFIT :{WHITE}Lucro STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Balanço bancário STR_FINANCES_OWN_FUNDS_TITLE :{WHITE}Fundos Próprios STR_FINANCES_LOAN_TITLE :{WHITE}Empréstimo STR_FINANCES_INTEREST_RATE :{WHITE}Juro do Empréstimo: {BLACK}{NUM}% STR_FINANCES_MAX_LOAN :{WHITE}Empréstimo Máximo: {BLACK}{CURRENCY_LONG} STR_FINANCES_TOTAL_CURRENCY :{BLACK}{CURRENCY_LONG} +STR_FINANCES_BANK_BALANCE :{WHITE}{CURRENCY_LONG} STR_FINANCES_BORROW_BUTTON :{BLACK}Pedir empréstimo {CURRENCY_LONG} STR_FINANCES_BORROW_TOOLTIP :{BLACK}Aumentar empréstimo. Ctrl+Clique aumenta tanto empréstimo quanto possível STR_FINANCES_REPAY_BUTTON :{BLACK}Pagar empréstimo {CURRENCY_LONG} @@ -3757,7 +3784,7 @@ STR_INDUSTRY_VIEW_PRODUCES_N_CARGO :{BLACK}Produz: STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :, {STRING}{STRING} STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Requer: -STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{0:STRING}{BLACK}{3:STRING} STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} a aguardar{STRING} STR_CONFIG_GAME_PRODUCTION :{WHITE}Modificar produção (múltiplo de 8, até 2040) @@ -3787,6 +3814,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Enviar i STR_VEHICLE_LIST_REPLACE_VEHICLES :Substituir Veículos STR_VEHICLE_LIST_SEND_FOR_SERVICING :Enviar para Serviço STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Lucro deste ano: {CURRENCY_LONG} (último ano: {CURRENCY_LONG}) +STR_VEHICLE_LIST_CARGO :{TINY_FONT}{BLACK}[{CARGO_LIST}] +STR_VEHICLE_LIST_NAME_AND_CARGO :{TINY_FONT}{BLACK}{STRING} {STRING} STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Enviar para Depósito STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Enviar para Depósito @@ -3878,6 +3907,11 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Máx. Fo STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Alcance: {GOLD}{COMMA} quadrados STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Tipo de aeronave: {GOLD}{STRING} +###length 3 +STR_CARGO_TYPE_FILTER_ALL :Todos os tipos de carga +STR_CARGO_TYPE_FILTER_FREIGHT :Mercadorias +STR_CARGO_TYPE_FILTER_NONE :Nenhum + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Lista de veículos ferroviários - clique num veículo para informações STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Lista de veículos rodoviários - clique num veículo para informações @@ -4046,7 +4080,7 @@ STR_ENGINE_PREVIEW_AIRCRAFT :aeronave STR_ENGINE_PREVIEW_SHIP :navio STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Custo: {CURRENCY_LONG} Peso: {WEIGHT_SHORT}{}Velocidade Máx.: {VELOCITY} Potência: {POWER}{}Custo de Circulação: {CURRENCY_LONG}/ano{}Capacidade: {CARGO_LONG} -STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Custo: {CURRENCY_LONG} Peso: {WEIGHT_SHORT}{}Velocidade Máx.: {VELOCITY} Potência: {POWER} F.T. Máx.: {6:FORCE}{}Custo de Circulação: {4:CURRENCY_LONG}/ano{}Capacidade: {5:CARGO_LONG} +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Custo: {0:CURRENCY_LONG} Peso: {1:WEIGHT_SHORT}{}Velocidade: {2:VELOCITY} Potência: {3:POWER} Tração Máx: {6:FORCE}{}Custo de Circulação: {4:CURRENCY_LONG}/ano{}Capacidade: {5:CARGO_LONG} STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Custo: {CURRENCY_LONG} Velocidade Máx.: {VELOCITY}{}Capacidade: {CARGO_LONG}{}Custo de Circulação: {CURRENCY_LONG}/ano STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Custo: {CURRENCY_LONG} Velocidade Máx.: {VELOCITY}{}Tipo de Aeronave: {STRING}{}Capacidade: {CARGO_LONG}, {CARGO_LONG}{}Custo de Circulação: {CURRENCY_LONG}/ano STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Custo: {CURRENCY_LONG} Velocidade Máx.: {VELOCITY}{}Tipo de Aeronave: {STRING}{}Capacidade: {CARGO_LONG}{}Custo de Circulação: {CURRENCY_LONG}/ano @@ -4205,12 +4239,13 @@ STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Peso: {L STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Peso: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potência: {LTBLUE}{POWER}{BLACK} Velocidade máx.: {LTBLUE}{VELOCITY} {BLACK}Tração Máx.: {LTBLUE}{FORCE} STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Lucro neste ano: {LTBLUE}{CURRENCY_LONG} (último ano: {CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Lucro deste ano: {LTBLUE}{CURRENCY_LONG} (último ano: {CURRENCY_LONG}) {BLACK}Performance min.: {LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Fiabilidade: {LTBLUE}{COMMA}% {BLACK}Avarias desde o último serviço: {LTBLUE}{COMMA} STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Construído: {LTBLUE}{NUM}{BLACK} Valor: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_INFO_NO_CAPACITY :{BLACK}Capacidade: {LTBLUE}Nenhuma{STRING} -STR_VEHICLE_INFO_CAPACITY :{BLACK}Capacidade: {LTBLUE}{CARGO_LONG}{3:STRING} -STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Capacidade: {LTBLUE}{CARGO_LONG}{3:STRING} (x{4:NUM}) +STR_VEHICLE_INFO_CAPACITY :{BLACK}Capacidade: {LTBLUE}{0:CARGO_LONG}{3:STRING} +STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Capacidade: {LTBLUE}{0:CARGO_LONG}{3:STRING} (x{4:NUM}) STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Capacidade: {LTBLUE}{CARGO_LONG}, {CARGO_LONG}{STRING} STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Créditos de Transferência: {LTBLUE}{CURRENCY_LONG} @@ -4369,7 +4404,7 @@ STR_ORDER_GO_TO_NEAREST_DEPOT :Ir para o depó STR_ORDER_GO_TO_NEAREST_HANGAR :Ir para o hangar mais próximo STR_ORDER_CONDITIONAL :Saltar ordem condicional STR_ORDER_SHARE :Partilhar ordens -STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Inserir nova ordem antes da ordem seleccionada, ou adicionar ao fim da lista. Ctrl torna em 'encher' as ordens em estações, em 'sem parar' as ordens de pontos de passagem e em 'serviço' as ordens em depósitos. 'Ordens Partilhadas' ou Ctrl permite que este veículos partilhe ordens com o veículo escolhido. Clicando em um veículo de copia as ordens desse veículo +STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Inserir nova ordem antes da ordem selecionada, ou adicionar ao fim da lista. Ctrl torna as ordens de estações em 'encher completamente qualquer carga'; as ordens em pontos de passagem 'sem parar'; e ordens de depósitos 'serviço'. 'Partilhar ordens' ou Ctrl permite que este veículo partilhe ordens com o veículo selecionado. Clicar num veículo copia as ordens desse veículo. Uma ordem para depósito desativa a manutenção programada (serviço) do veículo. STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP :{BLACK}Mostra todos os veículos que seguem este mesmo trajecto @@ -4479,22 +4514,22 @@ STR_TIMETABLE_STARTING_DATE :{BLACK}Data de STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Selecione uma data como ponto de partida deste horário. Ctrl+Clique distribui uniformemente todos os veiculos partilhando esta ordem pela sua ordem relativa, se a ordem for completamente calendarizada STR_TIMETABLE_CHANGE_TIME :{BLACK}Mudar Tempo -STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Muda o espaço de tempo que a ordem seleccionada deve durar +STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Mudar a duração do tempo que a ordem selecionada deve durar. Ctrl+Clique define o tempo para todas as ordens STR_TIMETABLE_CLEAR_TIME :{BLACK}Apagar Tempo -STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Apagar o tempo que dura a ordem seleccionada +STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Limpar a duração do tempo da ordem selecionada. Ctrl+Clique limpa os tempos para todas as ordens STR_TIMETABLE_CHANGE_SPEED :{BLACK}Alterar limite de velocidade -STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Mudar a velocidade maxima durante a viagem da ordem selecionada +STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Mudar a velocidade máxima durante a viagem da ordem selecionada. Ctrl+Clique define a velocidade para todas as ordens STR_TIMETABLE_CLEAR_SPEED :{BLACK}Remover limite de velocidade -STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Limpar a velocidade maxima durante a viagem da ordem selecionada +STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Limpar a velocidade máxima de viagem da ordem selecionada. Ctrl+Clique limpa as velocidades para todas as ordens. STR_TIMETABLE_RESET_LATENESS :{BLACK}Apagar Contador Atraso STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Limpar o contador de atraso, para que o veículo passe a estar a horas STR_TIMETABLE_AUTOFILL :{BLACK}Auto preencher -STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Preencher o horário automaticamente com os valores da próxima viagem (CTRL-clique para tentar manter os tempos de espera) +STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Preencher o horário automaticamente com os valores da próxima viagem. Ctrl+Clique para tentar manter os tempos de espera. STR_TIMETABLE_EXPECTED :{BLACK}Esperado STR_TIMETABLE_SCHEDULED :{BLACK}Marcado @@ -4538,12 +4573,14 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Houve um STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}A janela de Depuração de IA/Scripts de jogo está disponível apenas para o servidor # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Configuração IA/Script de jogo +STR_AI_CONFIG_CAPTION_AI :{WHITE}Configuração de IA +STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Configuração de Script de Jogo STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}O Script de jogo que será carregado no próximo jogo STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}As IAs que serão carregadas no próximo jogo STR_AI_CONFIG_HUMAN_PLAYER :Jogador humano STR_AI_CONFIG_RANDOM_AI :IA aleatória STR_AI_CONFIG_NONE :(nenhum) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Número máximo de oponentes: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Mover para cima STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Move a IA seleccionada para cima @@ -4551,12 +4588,11 @@ STR_AI_CONFIG_MOVE_DOWN :{BLACK}Mover pa STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Move a IA seleccionada para baixo STR_AI_CONFIG_GAMESCRIPT :{SILVER}Script de jogo +STR_AI_CONFIG_GAMESCRIPT_PARAM :{SILVER}Parâmetros STR_AI_CONFIG_AI :{SILVER}IAs -STR_AI_CONFIG_CHANGE :{BLACK}Selecionar {STRING} -STR_AI_CONFIG_CHANGE_NONE : -STR_AI_CONFIG_CHANGE_AI :IA -STR_AI_CONFIG_CHANGE_GAMESCRIPT :Script de jogo +STR_AI_CONFIG_CHANGE_AI :{BLACK}Selecionar IA +STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}Selecionar Script de Jogo STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Carregar outro script STR_AI_CONFIG_CONFIGURE :{BLACK}Configurar STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Configurar os parâmetros do script @@ -4585,9 +4621,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Mapa de STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Minimap screenshot # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parâmetros -STR_AI_SETTINGS_CAPTION_AI :IA -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Script de jogo +STR_AI_SETTINGS_CAPTION_AI :{WHITE}Parâmetros de IA STR_AI_SETTINGS_CLOSE :{BLACK}Fechar STR_AI_SETTINGS_RESET :{BLACK}Repor STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4751,6 +4785,7 @@ STR_ERROR_TOO_MANY_INDUSTRIES :{WHITE}... dema STR_ERROR_CAN_T_GENERATE_INDUSTRIES :{WHITE}Não é possível gerar indústrias... STR_ERROR_CAN_T_BUILD_HERE :{WHITE}Não é possível construir {STRING} aqui... STR_ERROR_CAN_T_CONSTRUCT_THIS_INDUSTRY :{WHITE}Não é possível construir este tipo de indústria aqui... +STR_ERROR_CAN_T_PROSPECT_INDUSTRY :{WHITE}Não é possível prospetar indústria... STR_ERROR_INDUSTRY_TOO_CLOSE :{WHITE}... muito perto de outra indústria STR_ERROR_MUST_FOUND_TOWN_FIRST :{WHITE}... é necessário construir uma localidade primeiro STR_ERROR_ONLY_ONE_ALLOWED_PER_TOWN :{WHITE}... só é permitido uma por localidade @@ -4765,6 +4800,8 @@ STR_ERROR_FOREST_CAN_ONLY_BE_PLANTED :{WHITE}... a fl STR_ERROR_CAN_ONLY_BE_BUILT_ABOVE_SNOW_LINE :{WHITE}... só se pode construir acima da linha da neve STR_ERROR_CAN_ONLY_BE_BUILT_BELOW_SNOW_LINE :{WHITE}... só se pode construir abaixo da linha da neve +STR_ERROR_PROSPECTING_WAS_UNLUCKY :{WHITE}O financiamento falhou em prospetar devido ao azar; tente novamente +STR_ERROR_NO_SUITABLE_PLACES_FOR_PROSPECTING :{WHITE}Não havia locais adequados para prospetar esta indústria STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES :{WHITE}Não foram encontrados locais adequados para '{STRING}' indústrias STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES_EXPLANATION :{WHITE}Altera os parâmetros de geração do mapa para obter um mapa melhor @@ -4773,7 +4810,7 @@ STR_ERROR_CAN_T_BUILD_RAILROAD_STATION :{WHITE}Não é STR_ERROR_CAN_T_BUILD_BUS_STATION :{WHITE}Não é possível construir estação de autocarros... STR_ERROR_CAN_T_BUILD_TRUCK_STATION :{WHITE}Não é possível construir estação de carregamento de camiões... STR_ERROR_CAN_T_BUILD_PASSENGER_TRAM_STATION :{WHITE}Não é possível construir estação de passageiros para eléctricos... -STR_ERROR_CAN_T_BUILD_CARGO_TRAM_STATION :{WHITE}Não é possível construir estação de carga para eléctricos... +STR_ERROR_CAN_T_BUILD_CARGO_TRAM_STATION :{WHITE}Não é possível construir estação de carga para elétricos... STR_ERROR_CAN_T_BUILD_DOCK_HERE :{WHITE}Não é possível construir doca aqui... STR_ERROR_CAN_T_BUILD_AIRPORT_HERE :{WHITE}Não é possível construir aeroporto aqui... @@ -4797,7 +4834,7 @@ STR_ERROR_MUST_REMOVE_RAILWAY_STATION_FIRST :{WHITE}É preci STR_ERROR_CAN_T_REMOVE_BUS_STATION :{WHITE}Impossível remover estação... STR_ERROR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Impossível remover estação... STR_ERROR_CAN_T_REMOVE_PASSENGER_TRAM_STATION :{WHITE}Impossível remover paragem de eléctricos de passageiros -STR_ERROR_CAN_T_REMOVE_CARGO_TRAM_STATION :{WHITE}Impossível remover estação de eléctricos de mercadorias... +STR_ERROR_CAN_T_REMOVE_CARGO_TRAM_STATION :{WHITE}Impossível remover estação de elétricos de mercadorias... STR_ERROR_MUST_REMOVE_ROAD_STOP_FIRST :{WHITE}Deverá remover a paragem rodoviária primeiro STR_ERROR_THERE_IS_NO_STATION :{WHITE}... não há nenhuma estação aqui @@ -4805,7 +4842,7 @@ STR_ERROR_MUST_DEMOLISH_RAILROAD :{WHITE}Precisa STR_ERROR_MUST_DEMOLISH_BUS_STATION_FIRST :{WHITE}Precisa de demolir a estação de autocarros primeiro STR_ERROR_MUST_DEMOLISH_TRUCK_STATION_FIRST :{WHITE}Precisa de demolir a estação de carga primeiro STR_ERROR_MUST_DEMOLISH_PASSENGER_TRAM_STATION_FIRST :{WHITE}Precisa demolir estação de eléctricos primeiro -STR_ERROR_MUST_DEMOLISH_CARGO_TRAM_STATION_FIRST :{WHITE}Precisa demolir estação de eléctricos primeiro +STR_ERROR_MUST_DEMOLISH_CARGO_TRAM_STATION_FIRST :{WHITE}Precisa demolir estação de elétricos primeiro STR_ERROR_MUST_DEMOLISH_DOCK_FIRST :{WHITE}Deverá demolir a doca primeiro STR_ERROR_MUST_DEMOLISH_AIRPORT_FIRST :{WHITE}Precisa de demolir o aeroporto primeiro @@ -5005,6 +5042,8 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Não é STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... o veículo está destruido +STR_ERROR_CAN_T_CLONE_VEHICLE_LIST :{WHITE}... nem todos os veículos são idênticos + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Nenhum veículo estará disponível STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Mudar a sua configuração NewGRF STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Nenhum veículo ainda disponível @@ -5031,6 +5070,8 @@ STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}Impossí STR_ERROR_CAN_T_COPY_SHARE_ORDER :{WHITE}... veiculo não pode ir a todas as estações STR_ERROR_CAN_T_ADD_ORDER :{WHITE}... veiculo não pode ir a essa estação STR_ERROR_CAN_T_ADD_ORDER_SHARED :{WHITE}... um veículo a partilhar esta ordem não pode ir a essa estação +STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST :{WHITE}... nem todos os veículos têm as mesmas ordens +STR_ERROR_CAN_T_SHARE_ORDER_VEHICLE_LIST :{WHITE}... nem todos os veículos estão a partilhar ordens STR_ERROR_CAN_T_SHARE_ORDER_LIST :{WHITE}Não é possível partilhar a lista de ordens... STR_ERROR_CAN_T_STOP_SHARING_ORDER_LIST :{WHITE}Impossível parar de partilhar a lista de ordens... diff --git a/src/lang/romanian.txt b/src/lang/romanian.txt index 64b9b7cbd6..12b3a0a9d6 100644 --- a/src/lang/romanian.txt +++ b/src/lang/romanian.txt @@ -200,6 +200,16 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}cp STR_UNITS_POWER_METRIC :{COMMA}cp STR_UNITS_POWER_SI :{COMMA}kW +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}cp/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}cp/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_SI :{DECIMAL}{NBSP}cp/kg +STR_UNITS_POWER_METRIC_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}cp/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}cp/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_SI :{DECIMAL}{NBSP}cp/kg +STR_UNITS_POWER_SI_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_SI :{DECIMAL}{NBSP}W/kg + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}kg @@ -226,8 +236,8 @@ STR_UNITS_HEIGHT_SI :{COMMA} m # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtru: -STR_LIST_FILTER_OSKTITLE :{BLACK}Filtru -STR_LIST_FILTER_TOOLTIP :{BLACK}Introduceți un cuvânt-cheie pentru filtrarea listei +STR_LIST_FILTER_OSKTITLE :{BLACK}Introduceți unul sau mai multe cuvinte cheie pentru a filtra lista +STR_LIST_FILTER_TOOLTIP :{BLACK}Introduceți unul sau mai multe cuvinte cheie pentru a filtra lista STR_TOOLTIP_GROUP_ORDER :{BLACK}Selectează ordinea de grupare STR_TOOLTIP_SORT_ORDER :{BLACK}Alegeți ordinea de sortare (ascendentă/descendentă) @@ -378,7 +388,7 @@ STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Construc STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Construcție tramvai STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Plantează arbori. Shift comută între plantare/afişare cost estimat STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Plasează semn -STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Amplasează obiect. Shift comută între amplasare/afişare cost estimat +STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Plasați obiectul. Ctrl selectează zona în diagonală. Shift comută construirea/afișarea estimării costurilor # Scenario editor file menu ###length 7 @@ -391,10 +401,11 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Ieşire din joc # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Opţiunile jocului STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Setări -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Setări IA / Script Joc +STR_SETTINGS_MENU_AI_SETTINGS :Setările AI +STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :Setări pentru scriptul jocului STR_SETTINGS_MENU_NEWGRF_SETTINGS :Setări NewGRF STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Opţiuni transparenţă STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Afişează numele oraşelor @@ -965,36 +976,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Rupia Indiană STR_GAME_OPTIONS_CURRENCY_IDR :Rupia indoneziană (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Ringgit Malaysian (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Pe partea stângă -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Pe partea dreaptă - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Numele orașelor: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Alege naţionalitatea numelor oraşelor - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Englezeşti (Original) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Franţuzeşti -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Nemţeşti -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Englezeşti (Adiţional) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Latino-Americane -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Amuzante -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Suedeze -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Olandeze -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finlandeze -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Poloneze -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slovace -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norvegiene -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Ungureşti -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Austriece -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Româneşti -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Ceheşti -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Elveţiene -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Daneze -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turceşti -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italieneşti -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Catalană - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Salvare automată STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Alege intervalul de timp dintre salvările automate @@ -1027,21 +1008,19 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Bifați STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Driver curent: {STRING} -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Mărime interfată -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Alege mărimea elementelor de interfaţa +STR_GAME_OPTIONS_GUI_SCALE_FRAME :{BLACK}Dimensiune interfaţă +STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Trageți glisorul pentru a seta dimensiunea interfeței. Țineți apăsat Ctrl pentru ajustare continuă +STR_GAME_OPTIONS_GUI_SCALE_AUTO :{BLACK}Detectează automat dimensiunea +STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Bifați această căsuţă pentru a detecta automat dimensiunea interfeței -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(auto-detecție) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normală -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Mărime dublă -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Mărime cvadruplă +STR_GAME_OPTIONS_GUI_SCALE_BEVELS :{BLACK}Scalează marginile +STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :{BLACK}Bifați această casetă pentru a scala marginile în funcție de dimensiunea interfeței -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Dimensiune font -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Alege dimensiunea fontului pentru interfață - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(auto-detecție) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Mărime dublă -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Mărime cvadruplă +STR_GAME_OPTIONS_GUI_SCALE_1X :1x +STR_GAME_OPTIONS_GUI_SCALE_2X :2x +STR_GAME_OPTIONS_GUI_SCALE_3X :3x +STR_GAME_OPTIONS_GUI_SCALE_4X :4x +STR_GAME_OPTIONS_GUI_SCALE_5X :5x STR_GAME_OPTIONS_GRAPHICS :{BLACK}Grafică @@ -1093,8 +1072,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Previzu STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 de Lire sterline (£) în moneda proprie STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Schimbă un parametru al monedei proprii -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Numărul maxim de companii concurente: {ORANGE}{COMMA} - STR_NONE :Nimic STR_FUNDING_ONLY :Doar finanțare STR_MINIMAL :Minim @@ -1144,6 +1121,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :peisajul temperat +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :peisajul sub-arctic +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :peisajul sub-tropical +STR_CLIMATE_TOYLAND_LANDSCAPE :peisajul 'ţara jucăriilor' + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Foarte plat STR_TERRAIN_TYPE_FLAT :Plat @@ -1449,6 +1432,8 @@ STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Grosimea liniil STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :Afișează numele NewGRF în fereastra de construcție a vehiculului: {STRING} STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Adaugă o linie în fereastra de construcție a vehiculului, afișând din care NewGRF vine vehiculul selectat. +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS :Afișați mărfurile pe care vehiculele le pot transporta în ferestrele listei {STRING} +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS_HELPTEXT :Dacă este activată, încărcătura transportabilă a vehiculului va apărea deasupra acestuia în listele de vehicule STR_CONFIG_SETTING_LANDSCAPE :Peisaj: {STRING} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Peisajele definesc scenariile de bază a jocului cu cerințe diferite pentru încărcături și dezvoltare a orașelor. NewGRF și scripturile de joc permit un control mai fin @@ -1503,6 +1488,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Îmbunătăţit STR_CONFIG_SETTING_ROAD_SIDE :Autovehicule: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Alege banda pentru condus +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Pe partea stângă +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Pe partea dreaptă + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Rotaţie hartă înălţimi: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Spre stânga @@ -1866,7 +1855,7 @@ STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED :permis STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED_CUSTOM_LAYOUT :permis, aspect particularizat al oraşului STR_CONFIG_SETTING_TOWN_CARGOGENMODE :Modalitatea de generare a cargoului dintr-un oraș: {STRING} -STR_CONFIG_SETTING_TOWN_CARGOGENMODE_HELPTEXT :Cât cargo este produs de casele dintr-un oraș, relativ la populația totală a orașului.{}Creștere pătratică: Un oraș de 2 ori mai mare generează de 4 ori mai mulți pasageri.{}Creștere liniară: Un oraș de 2 ori mai mare generează de 4 ori mai mulți pasageri. +STR_CONFIG_SETTING_TOWN_CARGOGENMODE_HELPTEXT :Câtă marfa este produsă de casele dintr-un oraș, relativ la populația totală a orașului.{}Creștere pătratică: Un oraș de 2 ori mai mare generează de 4 ori mai mulți pasageri.{}Creștere liniară: Un oraș de 2 ori mai mare generează de 4 ori mai mulți pasageri. ###length 2 STR_CONFIG_SETTING_TOWN_CARGOGENMODE_ORIGINAL :Pătratică (originală) STR_CONFIG_SETTING_TOWN_CARGOGENMODE_BITCOUNT :Liniar @@ -2037,7 +2026,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Întoarcere aut STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Permite trenurilor să întoarcă la semafor, dacă aşteaptă de mult timp ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Recomandat) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Recomandat) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Schimbă valoarea setării @@ -2080,7 +2069,8 @@ STR_INTRO_HIGHSCORE :{BLACK}Tabela c STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Setări STR_INTRO_NEWGRF_SETTINGS :{BLACK}Setări NewGRF STR_INTRO_ONLINE_CONTENT :{BLACK}Resurse online -STR_INTRO_SCRIPT_SETTINGS :{BLACK}Setări IA / Scripturi Joc +STR_INTRO_AI_SETTINGS :{BLACK}Setări AI +STR_INTRO_GAMESCRIPT_SETTINGS :{BLACK}Setări pentru scriptul jocului STR_INTRO_QUIT :{BLACK}Ieşire STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Începere joc nou. Ctrl+Click pentru a sări peste fereastra de configuraţie a harţii @@ -2100,7 +2090,8 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Afișeaz STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Setări afişare STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Afişează setările NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Verifică dacă există resurse noi sau actualizate pentru descărcare -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Afişează setările pentru Inteligența Artificială şi pentru Scripturi Joc +STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Afișează setările AI +STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Afișează setările scriptului de joc STR_INTRO_TOOLTIP_QUIT :{BLACK}Ieși din 'OpenTTD' STR_INTRO_BASESET :{BLACK}Setul grafic actual are lipsă {NUM} {P sprite spriteuri "de spriteuri"}. Verificați actualizările pentru setul de bază. @@ -2132,12 +2123,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Schimb STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Schimbă anul curent STR_CHEAT_SETUP_PROD :{LTBLUE}Activează accesul la valorile de producţie: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :peisajul temperat -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :peisajul sub-arctic -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :peisajul sub-tropical -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :peisajul 'ţara jucăriilor' - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Schemă de culori @@ -2497,13 +2482,13 @@ STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :se așteaptă p STR_NETWORK_MESSAGE_CLIENT_LEAVING :iese STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} a intrat în joc -STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {STRING} a intrat în joc (Clientul #{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} a intrat în compania #{2:NUM} +STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {0:STRING} a intrat în joc (Clientul #{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {0:STRING} a intrat în compania #{2:NUM} STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} a intrat ca spectator STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} a început o companie nouă (#{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} a ieşit din joc ({2:STRING}) +STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {0:STRING} a ieşit din joc ({2:STRING}) STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} și-a schimbat numele în {STRING} -STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} a dat {2:CURRENCY_LONG} către {1:STRING} +STR_NETWORK_MESSAGE_GIVE_MONEY :*** {0:STRING} a dat {2:CURRENCY_LONG} către {1:STRING} STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}Serverul a închis conexiunea STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Serverul este repornit...{}Vă rugăm aşteptaţi... STR_NETWORK_MESSAGE_KICKED :*** {STRING} a fost dat afară. Motiv: ({STRING}) @@ -2618,6 +2603,8 @@ STR_LINKGRAPH_LEGEND_SATURATED :{TINY_FONT}{BLA STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLACK}supraîncărcat # Linkgraph tooltip +STR_LINKGRAPH_STATS_TOOLTIP :{BLACK}{CARGO_LONG} care urmează să fie transportat pe lună de la {STATION} la {STATION} ({COMMA}% din capacitate){STRING} +STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} de transportat înapoi ({COMMA}% din capacitate) # Base for station construction window(s) STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Aria de acoperire @@ -2627,6 +2614,7 @@ STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP :{BLACK}Nu arăt STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP :{BLACK}Arată aria de acoperire a locaţiei propuse STR_STATION_BUILD_ACCEPTS_CARGO :{BLACK}Acceptă: {GOLD}{CARGO_LIST} STR_STATION_BUILD_SUPPLIES_CARGO :{BLACK}Furnizează: {GOLD}{CARGO_LIST} +STR_STATION_BUILD_INFRASTRUCTURE_COST :{BLACK}Cost întreținere: {GOLD}{CURRENCY_SHORT}/an # Join station window STR_JOIN_STATION_CAPTION :{WHITE}Uneşte staţia @@ -2814,11 +2802,11 @@ STR_LANDSCAPING_TOOLBAR :{WHITE}Modifica STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}Scade altitudinea unui punct de teren. Trage cu mouse-ul pentru a coborî primul punct de teren și a nivela restul zonei la noua înălțime a acestuia. Ctrl pentru selecţie pe diagonală. STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND :{BLACK}Creşte altitudinea unui punct de teren. Trage cu mouse-ul pentru a ridica primul punct de teren și a nivela restul zonei la noua înălțime a acestuia. Ctrl pentru selecţie pe diagonală. STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Nivelează terenul la înălțimea primului colț selectat. Ctrl pentru selecție pe diagonală -STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Cumpără teren pentru folosire ulterioară. Shift comută între cumpărare/afişare cost estimat +STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Cumpărați teren pentru utilizare ulterioară. Ctrl selectează zona în diagonală. Shift comută construirea/afișarea estimării costurilor # Object construction window STR_OBJECT_BUILD_CAPTION :{WHITE}Selecţia obiectelor -STR_OBJECT_BUILD_TOOLTIP :{BLACK}Selectaţi obiectele pentru construcţie. Shift comută între construire/afişare cost estimat +STR_OBJECT_BUILD_TOOLTIP :{BLACK}Selectați obiectul de construit. Ctrl selectează zona în diagonală. Shift comută construirea/afișarea estimării costurilor STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}Selectează clasa obiectului de construit STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}Previzualizarea obiectului STR_OBJECT_BUILD_SIZE :{BLACK}Dimensiune: {GOLD}{NUM} x {NUM} pătrăţele @@ -2862,6 +2850,8 @@ STR_FOUND_TOWN_RANDOM_TOWN_BUTTON :{BLACK}Oraş al STR_FOUND_TOWN_RANDOM_TOWN_TOOLTIP :{BLACK}Construieşte un oraş într-o locaţie aleatoare STR_FOUND_TOWN_MANY_RANDOM_TOWNS :{BLACK}Mai multe oraşe aleatoare STR_FOUND_TOWN_RANDOM_TOWNS_TOOLTIP :{BLACK}Umple harta cu oraşe generate aleator +STR_FOUND_TOWN_EXPAND_ALL_TOWNS :{BLACK}Extinde orasele +STR_FOUND_TOWN_EXPAND_ALL_TOWNS_TOOLTIP :{BLACK}Fă toate orașele să crească ușor STR_FOUND_TOWN_NAME_TITLE :{YELLOW}Nume oraş: STR_FOUND_TOWN_NAME_EDITOR_TITLE :{BLACK}Introdu numele oraşului @@ -3126,7 +3116,7 @@ STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Detalii STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}Nicio informaţie disponibilă STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING} STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: {WHITE}{STRING} -STR_SAVELOAD_FILTER_TITLE :{BLACK}Filtrare după: +STR_SAVELOAD_FILTER_TITLE :{BLACK}Filtru: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Suprascrie fișierul STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Sigur vrei să suprascrii fișierul existent? STR_SAVELOAD_DIRECTORY :{STRING} (listă) @@ -3140,6 +3130,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Mărime STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Alege mărimea hărții folosind ca unitate de măsură suprafețele. Numărul de suprafețe disponibile va fi puțin mai mic decât această valoare STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Nr. de oraşe: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Numele orașelor: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Alege naţionalitatea numelor oraşelor STR_MAPGEN_DATE :{BLACK}Data: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Nr. de industrii: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Cel mai înalt vârf: @@ -3155,11 +3147,40 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Reduce STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Generator de teren: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Tip teren: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Nivelul mării: +STR_MAPGEN_SEA_LEVEL :{BLACK}Nivelul mării: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Râuri: STR_MAPGEN_SMOOTHNESS :{BLACK}Netezime: STR_MAPGEN_VARIETY :{BLACK}Distribuţia varietăţii: STR_MAPGEN_GENERATE :{WHITE}Generează +STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}Setări NewGRF +STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Afişează setările NewGRF +STR_MAPGEN_AI_SETTINGS :{BLACK}Configurație AI +STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Afișează setările AI +STR_MAPGEN_GS_SETTINGS :{BLACK}Setări pentru scriptul de joc +STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Afișează setările scriptului de joc + +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Englezeşti (Original) +STR_MAPGEN_TOWN_NAME_FRENCH :Franţuzeşti +STR_MAPGEN_TOWN_NAME_GERMAN :Nemţeşti +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Englezeşti (Adiţional) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Latino-Americane +STR_MAPGEN_TOWN_NAME_SILLY :Amuzante +STR_MAPGEN_TOWN_NAME_SWEDISH :Suedeze +STR_MAPGEN_TOWN_NAME_DUTCH :Olandeze +STR_MAPGEN_TOWN_NAME_FINNISH :Finlandeze +STR_MAPGEN_TOWN_NAME_POLISH :Poloneze +STR_MAPGEN_TOWN_NAME_SLOVAK :Slovace +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norvegiene +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Ungureşti +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Austriece +STR_MAPGEN_TOWN_NAME_ROMANIAN :Româneşti +STR_MAPGEN_TOWN_NAME_CZECH :Ceheşti +STR_MAPGEN_TOWN_NAME_SWISS :Elveţiene +STR_MAPGEN_TOWN_NAME_DANISH :Daneze +STR_MAPGEN_TOWN_NAME_TURKISH :Turceşti +STR_MAPGEN_TOWN_NAME_ITALIAN :Italieneşti +STR_MAPGEN_TOWN_NAME_CATALAN :Catalană # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Margine: @@ -3305,6 +3326,13 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Imaginea STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Mergi la precedenta imagine normală, sărind peste pseudo-imagini, recolorări sau fonturi şi reporneşte când s-a ajuns la sfârşit STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Reprezentarea imaginii curente. Aliniamentul este ignorat STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Mișcă imaginea schimbând distanțele pe axele X şi Y. Ctrl+Clic pentru mutarea imaginii câte opt unități la un pas + +###length 2 +STR_SPRITE_ALIGNER_CENTRE_OFFSET :{BLACK}Offset centrat +STR_SPRITE_ALIGNER_CENTRE_SPRITE :{BLACK}Centrază sprite + +STR_SPRITE_ALIGNER_CROSSHAIR :{BLACK}Focus + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Resetează relativele STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Resetază limitele relative actuale STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}Limita X: {NUM}, Limita Y: {NUM} (Absolut) @@ -3322,15 +3350,15 @@ STR_NEWGRF_ERROR_MSG_FATAL :{RED}Fatal: {SI STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}O eroare fatală NewGRF a avut loc:{}{STRING} STR_NEWGRF_ERROR_POPUP :{WHITE}O eroare NewGRF a avut loc:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} nu va funcţiona cu versiunea TTDPatch raportată de OpenTTD -STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} este pentru versiunea {STRING} a TTD -STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} este conceput pentru a fi folosit cu {STRING} -STR_NEWGRF_ERROR_INVALID_PARAMETER :Parametru invalid pentru {1:STRING}: parametrul {STRING} ({NUM}) -STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} trebuie să fie încărcat înaintea {STRING} -STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} trebuie să fie încărcat după {STRING} -STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} necesită OpenTTD versiunea {STRING} sau mai nouă +STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} este pentru versiunea {2:STRING} a TTD +STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} este conceput pentru a fi folosit cu {2:STRING} +STR_NEWGRF_ERROR_INVALID_PARAMETER :Parametru invalid pentru {1:STRING}: parametrul {2:STRING} ({3:NUM}) +STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} trebuie să fie încărcat înaintea {2:STRING} +STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} trebuie să fie încărcat după {2:STRING} +STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} necesită OpenTTD versiunea {2:STRING} sau mai nouă STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :fişierul GRF conceput pentru traducere STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Sunt încărcate prea multe NewGRF-uri -STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Încărcarea {1:STRING} ca un NewGRF static cu {STRING} ar putea cauza desincronizări +STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Încărcarea {1:STRING} ca un NewGRF static cu {2:STRING} ar putea cauza desincronizări STR_NEWGRF_ERROR_UNEXPECTED_SPRITE :Element grafic neașteptat (sprite {3:NUM}) STR_NEWGRF_ERROR_UNKNOWN_PROPERTY :Proprietate necunoscută pentru Acțiunea 0 {4:HEX} (sprite {3:NUM}) STR_NEWGRF_ERROR_INVALID_ID :Încercare de a folosi un ID invalid (sprite {3:NUM}) @@ -3462,14 +3490,14 @@ STR_LOCAL_AUTHORITY_ACTION_EXCLUSIVE_TRANSPORT :Cumpără drept STR_LOCAL_AUTHORITY_ACTION_BRIBE :Mituieşte autoritatea locală ###length 8 -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{YELLOW}Inițiază o campanie publicitară mică pentru a atrage mai mulți călători și mai multe mărfuri spre compania ta.{}Oferă temporar un spor la cotația stației tale pe o rază mică în jurul centrului orașului.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{YELLOW}Inițiază o campanie publicitară medie pentru a atrage mai mulți călători și mai multe mărfuri spre compania ta.{}Oferă temporar un spor la cotația stației tale pe o rază medie în jurul centrului orașului.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{YELLOW}Inițiază o mare campanie publicitară pentru a atrage mai mulți călători și mai multe mărfuri spre compania ta.{}Oferă temporar un spor la cotația stației tale pe o rază mare în jurul centrului orașului.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{YELLOW}Finanțează reconstrucția rețelei locale de drumuri.{}Aceasta cauzează perturbări majore ale traficului rutier timp de până la 6 luni.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{YELLOW}Construiește o statuie în cinstea companiei tale.{}Oferă un spor permanent la cotația stației tale în acest oraș.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{YELLOW}Finanțează construcția de noi clădiri comerciale în oraș.{}Oferă un spor temporar dezvoltării în acest oraș.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW}Cumpără drepturi exclusive de transport în acest oraș, timp de un an.{}Autoritățile locale nu vor permite călătorilor și mărfurilor să folosească stațiile competitorilor.{}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Mituieşte autorităţile locale pentru a-ţi îmbunătăţi ratingul, dar cu riscul de a fi prins şi de a plăti amenzi serioase.{} Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{YELLOW}Inițiază o campanie publicitară mică pentru a atrage mai mulți călători și mai multe mărfuri spre compania ta.{}Oferă temporar un spor la cotația staților tale pe o rază mică în jurul centrului orașului.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{PUSH_COLOUR}{YELLOW}Inițiază o campanie publicitară medie pentru a atrage mai mulți călători și mai multe mărfuri spre compania ta.{}Oferă temporar un spor la cotația stațiilor tale pe o rază medie în jurul centrului orașului.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}Inițiază o mare campanie publicitară pentru a atrage mai mulți călători și mai multe mărfuri spre compania ta.{}Oferă temporar un spor la cotația stațiilor tale pe o rază mare în jurul centrului orașului.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{PUSH_COLOUR}{YELLOW}Finanțați reconstrucția rețelei de drumuri urbane.{}Provoacă perturbări considerabile ale traficului rutier timp de până la 6 luni.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Construiește o statuie în onoarea companiei tale.{}Oferă un spor permanent pentru cotele stațiilor tale din acest oraș.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Finanțează construcția de noi clădiri în oraș.{}Oferă un spor temporar dezvoltării în acest oraș.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}Cumpără drepturi exclusive de transport în acest oraș, timp de un an.{}Autoritățile locale nu vor permite călătorilor și mărfurilor să folosească stațiile competitorilor.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Mituiți autoritatea locală pentru a vă crește ratingul, cu riscul unei sancțiuni severe dacă eşti prins.{}{POP_COLOUR}Cost: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}{COMPANY} Scopuri @@ -3642,15 +3670,18 @@ STR_FINANCES_SECTION_SHIP_REVENUE :{GOLD}Nave STR_FINANCES_SECTION_LOAN_INTEREST :{GOLD}Dobânda la credit STR_FINANCES_SECTION_OTHER :{GOLD}Altele +STR_FINANCES_TOTAL_CAPTION :{WHITE}Total STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} +STR_FINANCES_ZERO_INCOME :{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} -STR_FINANCES_NET_PROFIT :{WHITE}Profit Net +STR_FINANCES_PROFIT :{WHITE}Profit STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Balanţă curentă STR_FINANCES_OWN_FUNDS_TITLE :{WHITE}Fonduri proprii STR_FINANCES_LOAN_TITLE :{WHITE}Credite STR_FINANCES_INTEREST_RATE :{WHITE}Dobândā la credit: {BLACK}{NUM}% STR_FINANCES_MAX_LOAN :{WHITE}Limită credit: {BLACK}{CURRENCY_LONG} STR_FINANCES_TOTAL_CURRENCY :{BLACK}{CURRENCY_LONG} +STR_FINANCES_BANK_BALANCE :{WHITE}{CURRENCY_LONG} STR_FINANCES_BORROW_BUTTON :{BLACK}Împrumută {CURRENCY_LONG} STR_FINANCES_BORROW_TOOLTIP :{BLACK}Împrumută o nouă sumă de bani. Ctrl-click pentru a împrumuta suma maximă posibilă STR_FINANCES_REPAY_BUTTON :{BLACK}Plăteşte înapoi {CURRENCY_LONG} @@ -3751,7 +3782,7 @@ STR_INDUSTRY_VIEW_PRODUCES_N_CARGO :{BLACK}Produce: STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :, {STRING}{STRING} STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Necesită: -STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{0:STRING}{BLACK}{3:STRING} STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} așteaptă{STRING} STR_CONFIG_GAME_PRODUCTION :{WHITE}Schimba productia (multiplu de 8, până la 2040) @@ -3781,6 +3812,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Trimite STR_VEHICLE_LIST_REPLACE_VEHICLES :Inlocuieste vehiculele STR_VEHICLE_LIST_SEND_FOR_SERVICING :Trimite in service STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Profit anul acesta: {CURRENCY_LONG} (anul trecut: {CURRENCY_LONG}) +STR_VEHICLE_LIST_CARGO :{TINY_FONT}{BLACK}[{CARGO_LIST}] +STR_VEHICLE_LIST_NAME_AND_CARGO :{TINY_FONT}{BLACK}{STRING} {STRING} STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Trimite la depou STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Trimite la depou @@ -3872,6 +3905,11 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Efort tr STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Rază acțiune: {GOLD}{COMMA} pătrățele STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Tip de aeronavă: {GOLD}{STRING} +###length 3 +STR_CARGO_TYPE_FILTER_ALL :Toate tipurile de marfă +STR_CARGO_TYPE_FILTER_FREIGHT :Marfă +STR_CARGO_TYPE_FILTER_NONE :Niciunul + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Lista de selectie a componentelor trenului - clic pe vehicule pt. informatii STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Listă selecţie vehicule rutiere - apasă pe vehicul pentru informaţii @@ -4040,7 +4078,7 @@ STR_ENGINE_PREVIEW_AIRCRAFT :aeronavă STR_ENGINE_PREVIEW_SHIP :navă STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Cost: {CURRENCY_LONG} Greutate: {WEIGHT_SHORT}{}Viteză: {VELOCITY} Putere: {POWER}{}Mentenanță: {CURRENCY_LONG}/an{}Capacitate: {CARGO_LONG} -STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Cost: {CURRENCY_LONG} Greutate: {WEIGHT_SHORT}{}Viteză: {VELOCITY} Putere: {POWER} Ef. T. Max.: {6:FORCE}{}Mentenanță: {4:CURRENCY_LONG}/an{}Capacitate: {5:CARGO_LONG} +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Cost: {0:CURRENCY_LONG} Greutate: {1:WEIGHT_SHORT}{}Viteză: {2:VELOCITY} Putere: {3:POWER} Ef. T. Max.: {6:FORCE}{}Cost operare: {4:CURRENCY_LONG}/an{}Capacitate: {5:CARGO_LONG} STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Viteză max.: {VELOCITY}{}Capacitate: {CARGO_LONG}{}Mentenanță: {CURRENCY_LONG}/an STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Viteză max.: {VELOCITY}{}Tip de aeronavă: {STRING}{}Capacitate: {CARGO_LONG}, {CARGO_LONG}{}Mentenanță: {CURRENCY_LONG}/an STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Viteză max.: {VELOCITY}{}Tip aeronavă: {STRING}{}Capacitate: {CARGO_LONG}{}Mentenanță: {CURRENCY_LONG}/an @@ -4199,12 +4237,13 @@ STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Greutate STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Greutate: {LTBLUE}{WEIGHT_SHORT} {BLACK}Putere: {LTBLUE}{POWER}{BLACK} Viteză max.: {LTBLUE}{VELOCITY} {BLACK}Efort tractiv: {LTBLUE}{FORCE} STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Profit pe anul curent: {LTBLUE}{CURRENCY_LONG} (anul precedent: {CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Profit anul curent: {LTBLUE}{CURRENCY_LONG} (anul trecut: {CURRENCY_LONG}) {BLACK}performanta minima: {LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Eficienţă: {LTBLUE}{COMMA}% {BLACK}Defecţiuni de la ultimul service: {LTBLUE}{COMMA} STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Construit: {LTBLUE}{NUM}{BLACK} Valoare: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_INFO_NO_CAPACITY :{BLACK}Capacitate: {LTBLUE}Nimic{STRING} -STR_VEHICLE_INFO_CAPACITY :{BLACK}Capacitate: {LTBLUE}{CARGO_LONG}{3:STRING} -STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Capacitate: {LTBLUE}{CARGO_LONG}{3:STRING} (x{4:NUM}) +STR_VEHICLE_INFO_CAPACITY :{BLACK}Capacitate: {LTBLUE}{0:CARGO_LONG}{3:STRING} +STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Capacitate: {LTBLUE}{0:CARGO_LONG}{3:STRING} (x{4:NUM}) STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Capacitate: {LTBLUE}{CARGO_LONG}, {CARGO_LONG}{STRING} STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Transferă Credit: {LTBLUE}{CURRENCY_LONG} @@ -4473,22 +4512,22 @@ STR_TIMETABLE_STARTING_DATE :{BLACK}Dată po STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Alege o dată ca punct de pornire pentru acest orar. Ctrl+clic distribuie toate vehiculele uniform de la data setată bazată pe comenzile relative, dacă comenzile au un orar complet STR_TIMETABLE_CHANGE_TIME :{BLACK}Modifică timpul -STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Modifică durata de timp alocată comenzii selectate +STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Modificați timpul pe care ar trebui să o dureze comanda evidențiată. Ctrl+Click setează ora pentru toate comenzile STR_TIMETABLE_CLEAR_TIME :{BLACK}Curata timp STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Elimină durata de timp pentru comanda selectată STR_TIMETABLE_CHANGE_SPEED :{BLACK}Schimbă limita de viteză -STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Schimbă limita maximă de viteză a comenzii selectate +STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Schimbă limita maximă de viteză a comenzii selectate. Ctrl+Click setează viteza pentru toate comenzile STR_TIMETABLE_CLEAR_SPEED :{BLACK}Şterge limita de viteză -STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Șterge limita maximă de viteză a comenzii selectate +STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Ștergeți viteza maximă de deplasare a comenzii evidențiate. Ctrl+Click șterge viteza pentru toate comenzile STR_TIMETABLE_RESET_LATENESS :{BLACK}Reinitializeaza contorul de intarziere STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Reiniţializează contorul de întârziere, astfel ca vehiculul să ajungă la timp STR_TIMETABLE_AUTOFILL :{BLACK}Auto-completare -STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Completează automat tabela cu timpi cu valorile pentru urmatoarea călătorie (CTRL-clic pentru a încerca să păstraţi timpii de aşteptare) +STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Completați automat orarul cu valorile din următoarea călătorie. Ctrl+Click pentru a încerca să păstrați timpii de așteptare STR_TIMETABLE_EXPECTED :{BLACK}Estimat STR_TIMETABLE_SCHEDULED :{BLACK}Planificat @@ -4532,12 +4571,14 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}O Inteli STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Fereastra pentru depanare IA / Script Joc este disponibilă doar serverului # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Configurație Inteligentă Artificială / Scripturi Joc +STR_AI_CONFIG_CAPTION_AI :{WHITE}Configurație AI +STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Configurarea scriptului de joc STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Script Joc încărcat în jocul următor STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}Modulul de IA care va fi încărcat în jocul următor STR_AI_CONFIG_HUMAN_PLAYER :Jucator uman STR_AI_CONFIG_RANDOM_AI :IA aleator STR_AI_CONFIG_NONE :(niciunul) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Numărul maxim de companii concurente: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}În sus STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Mută IA selectată sus în listă @@ -4545,12 +4586,11 @@ STR_AI_CONFIG_MOVE_DOWN :{BLACK}În jos STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Mută IA selectată jos în listă STR_AI_CONFIG_GAMESCRIPT :{SILVER}Script Joc +STR_AI_CONFIG_GAMESCRIPT_PARAM :{SILVER}Parametri STR_AI_CONFIG_AI :{SILVER}IA -STR_AI_CONFIG_CHANGE :{BLACK}Selectare {STRING} -STR_AI_CONFIG_CHANGE_NONE : -STR_AI_CONFIG_CHANGE_AI :IA -STR_AI_CONFIG_CHANGE_GAMESCRIPT :Script Joc +STR_AI_CONFIG_CHANGE_AI :{BLACK}Selectați IA +STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}Selectați Scriptul jocului STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Încarcă un alt script STR_AI_CONFIG_CONFIGURE :{BLACK}Configurază STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Configurează parametrii scriptului @@ -4579,9 +4619,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Captură STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Captură de hartă a lumii # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametrii -STR_AI_SETTINGS_CAPTION_AI :IA -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Script Joc +STR_AI_SETTINGS_CAPTION_AI :{WHITE}Parametrii IA STR_AI_SETTINGS_CLOSE :{BLACK}Închide STR_AI_SETTINGS_RESET :{BLACK}Resetează STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4745,6 +4783,7 @@ STR_ERROR_TOO_MANY_INDUSTRIES :{WHITE}... prea STR_ERROR_CAN_T_GENERATE_INDUSTRIES :{WHITE}Nu pot genera industrii... STR_ERROR_CAN_T_BUILD_HERE :{WHITE}Nu se poate construi {STRING} aici... STR_ERROR_CAN_T_CONSTRUCT_THIS_INDUSTRY :{WHITE}Acest tip de industrie nu se poate construi aici... +STR_ERROR_CAN_T_PROSPECT_INDUSTRY :{WHITE}Nu pot prospecta industria... STR_ERROR_INDUSTRY_TOO_CLOSE :{WHITE}... prea aproape de altă industrie STR_ERROR_MUST_FOUND_TOWN_FIRST :{WHITE}... mai întâi trebuie creat un oraş STR_ERROR_ONLY_ONE_ALLOWED_PER_TOWN :{WHITE}... un singur obiectiv de acest tip este permis per oraş @@ -4759,6 +4798,7 @@ STR_ERROR_FOREST_CAN_ONLY_BE_PLANTED :{WHITE}... păd STR_ERROR_CAN_ONLY_BE_BUILT_ABOVE_SNOW_LINE :{WHITE}... poate fi construit doar deasupra liniei zăpezii STR_ERROR_CAN_ONLY_BE_BUILT_BELOW_SNOW_LINE :{WHITE}... poate fi construit doar sub linia zăpezii +STR_ERROR_NO_SUITABLE_PLACES_FOR_PROSPECTING :{WHITE}Nu există locuri potrivite de prospectat pentru această industrie STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES :{WHITE}Nu s-au găsit locuri potrivite pentru industriile '{STRING}' STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES_EXPLANATION :{WHITE}Modifică parametrii generatorului ca să obții o hartă mai bună @@ -4926,6 +4966,7 @@ STR_ERROR_OBJECT_IN_THE_WAY :{WHITE}Obiect STR_ERROR_COMPANY_HEADQUARTERS_IN :{WHITE}... sediu de companie în cale STR_ERROR_CAN_T_PURCHASE_THIS_LAND :{WHITE}Nu poţi cumpăra teren aici... STR_ERROR_YOU_ALREADY_OWN_IT :{WHITE}... este deja în proprietatea ta! +STR_ERROR_BUILD_OBJECT_LIMIT_REACHED :{WHITE}... limita de obiecte construibile a fost atinsă # Group related errors STR_ERROR_GROUP_CAN_T_CREATE :{WHITE}Nu pot crea grupul... @@ -4998,6 +5039,8 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Nu se po STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... vehiculul este distrus +STR_ERROR_CAN_T_CLONE_VEHICLE_LIST :{WHITE}... nu toate vehiculele sunt identice + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Niciun vehicul nu va fi disponibil STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Schimbă configuraţia NewGRF STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Niciun vehicul nu este disponibil încă @@ -5024,6 +5067,8 @@ STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}Nu pot s STR_ERROR_CAN_T_COPY_SHARE_ORDER :{WHITE}... vehiculul nu poate ajunge la toate staţiile STR_ERROR_CAN_T_ADD_ORDER :{WHITE}... vehiculul nu poate ajunge la acea staţie STR_ERROR_CAN_T_ADD_ORDER_SHARED :{WHITE}... un vehicul care are acest ordin nu poate ajunge la acea staţie +STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST :{WHITE}... nu toate vehiculele au aceleași comenzi +STR_ERROR_CAN_T_SHARE_ORDER_VEHICLE_LIST :{WHITE}... nu toate vehiculele împart comenzi STR_ERROR_CAN_T_SHARE_ORDER_LIST :{WHITE}Nu se poate trece la comenzi sincronizate... STR_ERROR_CAN_T_STOP_SHARING_ORDER_LIST :{WHITE}Nu pot opri sincronizarea listei de comenzi... diff --git a/src/lang/russian.txt b/src/lang/russian.txt index 0038ae347d..2aeb02faf0 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -326,6 +326,16 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}л STR_UNITS_POWER_METRIC :{COMMA}{NBSP}лс STR_UNITS_POWER_SI :{COMMA}{NBSP}кВт +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}лс/т +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}лс/т +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_SI :{DECIMAL}{NBSP}лс/Мг +STR_UNITS_POWER_METRIC_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}лс/т +STR_UNITS_POWER_METRIC_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}лс/т +STR_UNITS_POWER_METRIC_TO_WEIGHT_SI :{DECIMAL}{NBSP}лс/Мг +STR_UNITS_POWER_SI_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}кВт/т +STR_UNITS_POWER_SI_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}кВт/т +STR_UNITS_POWER_SI_TO_WEIGHT_SI :{DECIMAL}{NBSP}Вт/кг + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}т STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}т STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}кг @@ -517,10 +527,11 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Выход # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Основные настройки STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Расширенные настройки -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Настройки ИИ / скрипта +STR_SETTINGS_MENU_AI_SETTINGS :Настройки ИИ +STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :Настройки игровых скриптов STR_SETTINGS_MENU_NEWGRF_SETTINGS :Настройки NewGRF STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Настройки прозрачности STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Показывать названия городов @@ -1110,36 +1121,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Индийск STR_GAME_OPTIONS_CURRENCY_IDR :Индонезийская рупия (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Малайзийский ринггит (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Левостороннее -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Правостороннее - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Названия городов: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Язык, который будет использоваться для выбора названий населённых пунктов - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Английские -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Французские -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Немецкие -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Английские (дополн.) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Латино-американские -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Английские (шуточные) -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Шведские -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Нидерландские -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Финские -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Польские -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Словацкие -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Норвежские -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Венгерские -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Австрийские -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Румынские -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Чешские -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Швейцарские -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Датские -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Турецкие -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Итальянские -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Каталанские - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Автосохранение STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Интервал автосохранения игры @@ -1172,21 +1153,19 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Вклю STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Видеодрайвер: {STRING} -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Размер элементов интерфейса -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Выберите размер элементов интерфейса +STR_GAME_OPTIONS_GUI_SCALE_FRAME :{BLACK}Масштаб интерфейса +STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Изменяйте масштаб интерфейса с помощью ползунка. Удерживайте Ctrl для тонкой настройки. +STR_GAME_OPTIONS_GUI_SCALE_AUTO :{BLACK}Автоопределение +STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Нажмите для автоматической установки масштаба интерфейса -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(Автовыбор) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Обычный -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Удвоенный -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Учетверённый +STR_GAME_OPTIONS_GUI_SCALE_BEVELS :{BLACK}Рельефные элементы +STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :{BLACK}Масштабировать рельефные элементы интерфейса -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Размер шрифта -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Выберите размер шрифта, используемого в игре - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(Автовыбор) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Нормальный -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Двукратный -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Четырёхкратный +STR_GAME_OPTIONS_GUI_SCALE_1X :1x +STR_GAME_OPTIONS_GUI_SCALE_2X :2x +STR_GAME_OPTIONS_GUI_SCALE_3X :3x +STR_GAME_OPTIONS_GUI_SCALE_4X :4x +STR_GAME_OPTIONS_GUI_SCALE_5X :5x STR_GAME_OPTIONS_GRAPHICS :{BLACK}Настройки графики @@ -1238,8 +1217,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Обр STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10{NBSP}000 фунтов стерлингов (£) в вашей валюте STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Изменить параметр валюты -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Максимальное количество конкурентов: {ORANGE}{COMMA} - STR_NONE :Нет STR_FUNDING_ONLY :Строить самому STR_MINIMAL :Минимальное @@ -1293,6 +1270,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Умеренный ландшафт +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Субарктический ландшафт +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Субтропический ландшафт +STR_CLIMATE_TOYLAND_LANDSCAPE :Игрушечный ландшафт + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Плоский STR_TERRAIN_TYPE_FLAT :Равнинный @@ -1600,6 +1583,8 @@ 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_SHOW_CARGO_IN_LISTS :Показывать типы перевозимых грузов в списках ТС: {STRING} +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS_HELPTEXT :Если включено, в списках транспорта будут указаны типы грузов, которые каждое ТС может перевозить. STR_CONFIG_SETTING_LANDSCAPE :Тип карты: {STRING} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Тип карты определяет основу игрового процесса, например, доступные типы транспорта и грузов, различные условия роста городов. Всё это также может быть изменено с помощью модулей NewGRF и игровых скриптов. @@ -1654,6 +1639,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Улучшен STR_CONFIG_SETTING_ROAD_SIDE :Движение автотранспорта: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Выберите сторону дороги, по которой движется автотранспорт +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Левостороннее +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Правостороннее + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Вращение карты высот: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Против часовой стрелки @@ -2188,7 +2177,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Автомат STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Разрешить поездам разворачиваться у светофора, если они долго ждут разрешающего сигнала ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Рекомендуется) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Рекомендуется) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Изменить значение @@ -2231,7 +2220,8 @@ STR_INTRO_HIGHSCORE :{BLACK}Табл STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Расширенные настройки STR_INTRO_NEWGRF_SETTINGS :{BLACK}Настройки NewGRF STR_INTRO_ONLINE_CONTENT :{BLACK}Проверить онлайн-контент -STR_INTRO_SCRIPT_SETTINGS :{BLACK}Настройки ИИ / скрипта +STR_INTRO_AI_SETTINGS :{BLACK}Настройки ИИ +STR_INTRO_GAMESCRIPT_SETTINGS :{BLACK}Настройки игровых скриптов STR_INTRO_QUIT :{BLACK}Выход STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Начать новую игру. Ctrl+щелчок пропускает этап настройки карты. @@ -2251,7 +2241,8 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Пока STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Изменить расширенные настройки игры STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Показать настройки NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Найти новый и обновлённый контент для загрузки -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Изменить настройки ИИ / игрового скрипта +STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Показать настройки ИИ +STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Показать настройки игровых скриптов STR_INTRO_TOOLTIP_QUIT :{BLACK}Выйти из OpenTTD STR_INTRO_BASESET :{BLACK}В выбранном наборе базовой графики отсутству{P 0 е ю ю}т {NUM} спрайт{P "" а ов}. Пожалуйста, обновите набор графики. @@ -2283,12 +2274,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Изм STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Изменить текущий год STR_CHEAT_SETUP_PROD :{LTBLUE}Разрешить изменение производительности: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Умеренный ландшафт -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Субарктический ландшафт -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Субтропический ландшафт -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Игрушечный ландшафт - # Livery window STR_LIVERY_CAPTION :{WHITE}Цвета компании «{COMPANY}» @@ -2648,13 +2633,13 @@ STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :ожидает STR_NETWORK_MESSAGE_CLIENT_LEAVING :отключение STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} подключился к игре -STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {STRING} подключился к игре (клиент #{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} подключился к компании #{2:NUM} +STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {0:STRING} подключился к игре (клиент #{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {0:STRING} подключился к компании #{2:NUM} STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} подключился в качестве зрителя -STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} основал новую компанию (#{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} покинул игру ({2:STRING}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {0:STRING} основал новую компанию (#{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {0:STRING} покинул игру ({2:STRING}) STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} сменил(а) имя на {STRING} -STR_NETWORK_MESSAGE_GIVE_MONEY :*** Компания «{STRING}» передала «{STRING}» {CURRENCY_LONG} +STR_NETWORK_MESSAGE_GIVE_MONEY :*** Компания «{0:STRING}» передала «{1:STRING}» {2:CURRENCY_LONG} STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}Сервер закрыл сессию STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Сервер перезапускается...{}Пожалуйста, подождите... STR_NETWORK_MESSAGE_KICKED :*** {STRING} был исключён из игры. Причина: ({STRING}) @@ -3041,6 +3026,8 @@ STR_FOUND_TOWN_RANDOM_TOWN_BUTTON :{BLACK}Случ STR_FOUND_TOWN_RANDOM_TOWN_TOOLTIP :{BLACK}Создать город в случайном месте STR_FOUND_TOWN_MANY_RANDOM_TOWNS :{BLACK}Множество различных городов STR_FOUND_TOWN_RANDOM_TOWNS_TOOLTIP :{BLACK}Разместить на карте различные города случайным образом +STR_FOUND_TOWN_EXPAND_ALL_TOWNS :{BLACK}Расширить все города +STR_FOUND_TOWN_EXPAND_ALL_TOWNS_TOOLTIP :{BLACK}Увеличить размер всех городов STR_FOUND_TOWN_NAME_TITLE :{YELLOW}Название города: STR_FOUND_TOWN_NAME_EDITOR_TITLE :{BLACK}Введите название города @@ -3319,6 +3306,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Разм STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Выберите размер карты в клетках. Размер поля, доступного игрокам, будет немного меньше. STR_MAPGEN_BY :{BLACK}× STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Количество городов: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Названия городов: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Язык, который будет использоваться для выбора названий населённых пунктов STR_MAPGEN_DATE :{BLACK}Дата: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Кол-во предпр.: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Высочайшая вершина: @@ -3334,11 +3323,40 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Умен STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Генератор ландшафта: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Тип ландшафта: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Количество морей и озёр: +STR_MAPGEN_SEA_LEVEL :{BLACK}Количество морей и озёр: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Количество рек: STR_MAPGEN_SMOOTHNESS :{BLACK}Грубость ландшафта: STR_MAPGEN_VARIETY :{BLACK}Разнообразие ландшафта: STR_MAPGEN_GENERATE :{WHITE}Создать +STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}Настройки NewGRF +STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Показать настройки NewGRF +STR_MAPGEN_AI_SETTINGS :{BLACK}Настройки ИИ +STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Показать настройки ИИ +STR_MAPGEN_GS_SETTINGS :{BLACK}Настройки игровых скриптов +STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Показать настройки игровых скриптов + +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Английские +STR_MAPGEN_TOWN_NAME_FRENCH :Французские +STR_MAPGEN_TOWN_NAME_GERMAN :Немецкие +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Английские (дополн.) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Латино-американские +STR_MAPGEN_TOWN_NAME_SILLY :Английские (шуточные) +STR_MAPGEN_TOWN_NAME_SWEDISH :Шведские +STR_MAPGEN_TOWN_NAME_DUTCH :Нидерландские +STR_MAPGEN_TOWN_NAME_FINNISH :Финские +STR_MAPGEN_TOWN_NAME_POLISH :Польские +STR_MAPGEN_TOWN_NAME_SLOVAK :Словацкие +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Норвежские +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Венгерские +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Австрийские +STR_MAPGEN_TOWN_NAME_ROMANIAN :Румынские +STR_MAPGEN_TOWN_NAME_CZECH :Чешские +STR_MAPGEN_TOWN_NAME_SWISS :Швейцарские +STR_MAPGEN_TOWN_NAME_DANISH :Датские +STR_MAPGEN_TOWN_NAME_TURKISH :Турецкие +STR_MAPGEN_TOWN_NAME_ITALIAN :Итальянские +STR_MAPGEN_TOWN_NAME_CATALAN :Каталанские # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Края карты: @@ -3484,6 +3502,13 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Пред STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Перейти к предыдущему нормальному спрайту, пропуская изменяющие цвет, шрифтовые, псевдоспрайты. Переход из начала списка к последнему спрайту. STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Представление выбранного спрайта. Выравнивание не учитывается при прорисовке этого спрайта. STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Двигайте спрайт, изменяя смещение по осям X и Y. С помощью Ctrl+щелчка можно сдвигать спрайты на 8 единиц. + +###length 2 +STR_SPRITE_ALIGNER_CENTRE_OFFSET :{BLACK}Смещение в центре +STR_SPRITE_ALIGNER_CENTRE_SPRITE :{BLACK}Спрайт в центре + +STR_SPRITE_ALIGNER_CROSSHAIR :{BLACK}Перекрестие + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Сброс смещения STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Сбросить значения относительного смещения STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}Смещение X: {NUM}; смещение Y: {NUM} (абсолютное) @@ -3501,15 +3526,15 @@ STR_NEWGRF_ERROR_MSG_FATAL :{RED}Крити STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Ошибка при работе с NewGRF:{}{STRING} STR_NEWGRF_ERROR_POPUP :{WHITE}Ошибка, связанная с модулем NewGRF:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} не будет работать с версией TTDPatch, сообщенной OpenTTD. -STR_NEWGRF_ERROR_DOS_OR_WINDOWS :Файл {1:STRING} требует {STRING}-версию TTD -STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} сделан для использования совместно с {STRING} -STR_NEWGRF_ERROR_INVALID_PARAMETER :Неверный параметр {1:STRING}: параметр {STRING} ({NUM}) -STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} должен быть загружен перед {STRING}. -STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} должен быть загружен после {STRING}. -STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} требует OpenTTD версии {STRING} или выше. +STR_NEWGRF_ERROR_DOS_OR_WINDOWS :Файл {1:STRING} требует TTD версии {2:STRING} +STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} предполагается использовать совместно с {2:STRING} +STR_NEWGRF_ERROR_INVALID_PARAMETER :Неверный параметр {1:STRING}: параметр {2:STRING} ({3:NUM}) +STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} должен быть загружен перед {2:STRING}. +STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} должен быть загружен после {2:STRING}. +STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :Для {1:STRING} требуется OpenTTD версии {2:STRING} или выше STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :файл GRF, который им переводится. STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Загружено слишком много модулей NewGRF -STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Загрузка {1:STRING} в качестве статического NewGRF с {STRING} может вызвать рассинхронизацию. +STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Загрузка {1:STRING} в качестве статического NewGRF с {2:STRING} может вызвать рассинхронизацию STR_NEWGRF_ERROR_UNEXPECTED_SPRITE :Неверный спрайт (спрайт {3:NUM}) STR_NEWGRF_ERROR_UNKNOWN_PROPERTY :Неизвестное свойство у «Action 0» {4:HEX} (спрайт {3:NUM}) STR_NEWGRF_ERROR_INVALID_ID :Попытка использования недопустимого идентификатора (спрайт {3:NUM}) @@ -3641,14 +3666,14 @@ STR_LOCAL_AUTHORITY_ACTION_EXCLUSIVE_TRANSPORT :Купить э STR_LOCAL_AUTHORITY_ACTION_BRIBE :Взятка местной администрации ###length 8 -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{YELLOW}Провести малую рекламную кампанию для увеличения грузо- и пассажиропотока на ваших станциях.{}Она временно повысит рейтинг ваших станций, построенных рядом с центром города.{}Стоимость: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{YELLOW}Провести среднюю рекламную кампанию для увеличения грузо- и пассажиропотока на ваших станциях.{}Она временно повысит рейтинг ваших станций, находящихся не очень далеко от центра города.{}Стоимость: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{YELLOW}Провести большую рекламную кампанию для увеличения грузо- и пассажиропотока на ваших станциях.{}Она временно повысит рейтинг ваших станций на значительной площади в городе и окрестностях.{}Стоимость: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{YELLOW}Профинансировать реконструкцию городских дорог.{}Вызывает большие нарушения движения на срок до 6 месяцев.{}Стоимость: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{YELLOW}Установить статую в честь вашей компании.{}Она добавит рейтинг вашим станциям.{}Стоимость: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{YELLOW}Профинансировать строительство новых зданий.{}Это временно ускорит рост города.{}Стоимость: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW}Купить годовые эксклюзивные права на транспортные перевозки в городе.{}Администрация разрешит пользоваться ТОЛЬКО вашими станциями.{}Стоимость: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Дать взятку городской администрации для повышения рейтинга. Существует риск санкций, если факт подкупа раскроется.{}Цена: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{YELLOW}Провести малую рекламную кампанию для увеличения грузо- и пассажиропотока на ваших станциях.{}Она временно повысит рейтинг ваших станций, построенных рядом с центром города.{}{POP_COLOUR}Стоимость: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{PUSH_COLOUR}{YELLOW}Провести среднюю рекламную кампанию для увеличения грузо- и пассажиропотока на ваших станциях.{}Она временно повысит рейтинг ваших станций, находящихся не очень далеко от центра города.{}{POP_COLOUR}Стоимость: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}Провести большую рекламную кампанию для увеличения грузо- и пассажиропотока на ваших станциях.{}Она временно повысит рейтинг ваших станций на значительной площади в городе и окрестностях.{}{POP_COLOUR}Стоимость: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{PUSH_COLOUR}{YELLOW}Профинансировать реконструкцию городских дорог.{}Вызывает большие нарушения движения на срок до 6 месяцев.{}{POP_COLOUR}Стоимость: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Установить статую в честь вашей компании.{}Она добавит рейтинг вашим станциям.{}{POP_COLOUR}Стоимость: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Профинансировать строительство новых зданий.{}Это временно ускорит рост города.{}{POP_COLOUR}Стоимость: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}Приобрести годовые эксклюзивные права на транспортные перевозки в городе.{}Городская администрация разрешит пользоваться ТОЛЬКО вашими станциями.{}{POP_COLOUR}Стоимость: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Дать взятку городской администрации для повышения рейтинга. Существует риск санкций, если факт подкупа раскроется.{}{POP_COLOUR}Цена: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}Задачи компании «{COMPANY}» @@ -3801,8 +3826,8 @@ STR_FINANCES_CAPTION :{WHITE}Фина STR_FINANCES_YEAR :{WHITE}{NUM} ###length 3 -STR_FINANCES_REVENUE_TITLE :{WHITE}Доход -STR_FINANCES_OPERATING_EXPENSES_TITLE :{WHITE}Эксплуатационные расходы +STR_FINANCES_REVENUE_TITLE :{WHITE}Доходы +STR_FINANCES_OPERATING_EXPENSES_TITLE :{WHITE}Операционные расходы STR_FINANCES_CAPITAL_EXPENSES_TITLE :{WHITE}Капитальные расходы @@ -3821,16 +3846,18 @@ STR_FINANCES_SECTION_SHIP_REVENUE :{GOLD}Суда STR_FINANCES_SECTION_LOAN_INTEREST :{GOLD}Платёж по кредиту STR_FINANCES_SECTION_OTHER :{GOLD}Прочие расходы +STR_FINANCES_TOTAL_CAPTION :{WHITE}Всего STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} STR_FINANCES_ZERO_INCOME :{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} -STR_FINANCES_NET_PROFIT :{WHITE}Чистая прибыль +STR_FINANCES_PROFIT :{WHITE}Прибыль STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Баланс: STR_FINANCES_OWN_FUNDS_TITLE :{WHITE}Собственные средства STR_FINANCES_LOAN_TITLE :{WHITE}Взято в кредит STR_FINANCES_INTEREST_RATE :{WHITE}Проценты по кредиту: {BLACK}{NUM}% STR_FINANCES_MAX_LOAN :{WHITE}Макс. сумма кредита: {BLACK}{CURRENCY_LONG} STR_FINANCES_TOTAL_CURRENCY :{BLACK}{CURRENCY_LONG} +STR_FINANCES_BANK_BALANCE :{WHITE}{CURRENCY_LONG} STR_FINANCES_BORROW_BUTTON :{BLACK}Занять {CURRENCY_LONG} STR_FINANCES_BORROW_TOOLTIP :{BLACK}Взять деньги в кредит. Ctrl+щелчок - взять максимально возможную сумму. STR_FINANCES_REPAY_BUTTON :{BLACK}Отдать {CURRENCY_LONG} @@ -3931,7 +3958,7 @@ STR_INDUSTRY_VIEW_PRODUCES_N_CARGO :{BLACK}Прои STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :, {STRING}{STRING} STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Требуется: -STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{0:STRING}{BLACK}{3:STRING} STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} ожидает{STRING} STR_CONFIG_GAME_PRODUCTION :{WHITE}Изменить производительность (кратно 8, до 2040) @@ -3961,6 +3988,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Упра STR_VEHICLE_LIST_REPLACE_VEHICLES :Замена транспорта STR_VEHICLE_LIST_SEND_FOR_SERVICING :Отправить на тех. обслуживание STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Прибыль в этом году: {CURRENCY_LONG} (в прошлом году: {CURRENCY_LONG}) +STR_VEHICLE_LIST_CARGO :{TINY_FONT}{BLACK}[{CARGO_LIST}] +STR_VEHICLE_LIST_NAME_AND_CARGO :{TINY_FONT}{BLACK}{STRING} {STRING} STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Отправить в депо STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Отправить в гараж @@ -4052,6 +4081,11 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Макс STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Дальность: {GOLD}{COMMA} клет{P ка ки ок} STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Тип возд. судна: {GOLD}{STRING} +###length 3 +STR_CARGO_TYPE_FILTER_ALL :Все типы грузов +STR_CARGO_TYPE_FILTER_FREIGHT :Груз +STR_CARGO_TYPE_FILTER_NONE :Нет + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Список железнодорожного транспорта - щёлкните для получения информации. Ctrl+щелчок скроет/покажет ТС. STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Список автотранспорта - щёлкните для получения информации. Ctrl+щелчок скроет/покажет выбранный автомобиль. @@ -4228,7 +4262,7 @@ STR_ENGINE_PREVIEW_SHIP :судно STR_ENGINE_PREVIEW_SHIP.gen :судна STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Цена: {CURRENCY_LONG} Масса: {WEIGHT_SHORT}{}Скорость: {VELOCITY} Мощность: {POWER}{}Стоимость обслуж.: {CURRENCY_LONG}/год{}Ёмкость: {CARGO_LONG} -STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Цена: {CURRENCY_LONG} Масса: {WEIGHT_SHORT}{}Скорость: {VELOCITY} Мощность: {POWER} Макс. ТУ: {6:FORCE}{}Стоимость обслуж.: {4:CURRENCY_LONG}/год{}Ёмкость: {5:CARGO_LONG} +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Цена: {0:CURRENCY_LONG} Масса: {1:WEIGHT_SHORT}{}Скорость: {2:VELOCITY} Мощность: {3:POWER} Макс. ТУ: {6:FORCE}{}Стоимость обслуж.: {4:CURRENCY_LONG}/год{}Ёмкость: {5:CARGO_LONG} STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Цена: {CURRENCY_LONG} Макс. скорость: {VELOCITY}{}Ёмкость: {CARGO_LONG}{}Стоимость обслуж.: {CURRENCY_LONG}/год STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Цена: {CURRENCY_LONG} Макс. скорость: {VELOCITY}{}Тип: {STRING}{}Ёмкость: {CARGO_LONG}, {CARGO_LONG}{}Стоимость обслуж.: {CURRENCY_LONG}/год STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Цена: {CURRENCY_LONG} Макс. скорость: {VELOCITY}{}Тип: {STRING}{}Ёмкость: {CARGO_LONG}{}Стоимость обслуж.: {CURRENCY_LONG}/год @@ -4391,12 +4425,13 @@ STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Масс STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Масса: {LTBLUE}{WEIGHT_SHORT} {BLACK}Мощность: {LTBLUE}{POWER}{BLACK} Макс. скорость: {LTBLUE}{VELOCITY} {BLACK}Макс. ТУ: {LTBLUE}{FORCE} STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Прибыль в этом году: {LTBLUE}{CURRENCY_LONG} (в прошлом году: {CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Прибыль в этом году: {LTBLUE}{CURRENCY_LONG} (в прошлом году: {CURRENCY_LONG}) {BLACK}Мин. удельная мощн.: {LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Надёжность: {LTBLUE}{COMMA}% {BLACK}Поломок после ТО: {LTBLUE}{COMMA} STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Построен в {LTBLUE}{NUM} г.{BLACK} Стоимость: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_INFO_NO_CAPACITY :{BLACK}Ёмкость: {LTBLUE}отсутствует{STRING} -STR_VEHICLE_INFO_CAPACITY :{BLACK}Ёмкость: {LTBLUE}{CARGO_LONG}{3:STRING} -STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Ёмкость: {LTBLUE}{CARGO_LONG}{3:STRING} (×{4:NUM}) +STR_VEHICLE_INFO_CAPACITY :{BLACK}Ёмкость: {LTBLUE}{0:CARGO_LONG}{3:STRING} +STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Ёмкость: {LTBLUE}{0:CARGO_LONG}{3:STRING} (×{4:NUM}) STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Ёмкость: {LTBLUE}{CARGO_LONG}, {CARGO_LONG}{STRING} STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Выручка перевозки: {LTBLUE}{CURRENCY_LONG} @@ -4665,16 +4700,16 @@ STR_TIMETABLE_STARTING_DATE :{BLACK}Нача STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Выберите начальную дату для этого графика. Ctrl+щелчок равномерно распределит все транспортные средства, следующие по этому маршруту, если время движения по нему полностью рассчитано. STR_TIMETABLE_CHANGE_TIME :{BLACK}Изменить время -STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Изменить время для выделенного задания +STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Изменить время исполнения выделенного задания. Ctrl+щелчок устанавливает время для всех заданий. STR_TIMETABLE_CLEAR_TIME :{BLACK}Сбросить время -STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Сбросить время в выделенном задании +STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Сбросить время в выделенном задании. Ctrl+щелчок - сбросить время во всех заданиях. STR_TIMETABLE_CHANGE_SPEED :{BLACK}Изменить огранич. скорости -STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Изменить ограничение скорости движения для выбранного задания +STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Изменить ограничение скорости движения для выбранного задания. Ctrl+щелчок устанавливает скорость для всех заданий. STR_TIMETABLE_CLEAR_SPEED :{BLACK}Сбросить огранич. скорости -STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Сбросить ограничение скорости движения для выделенного задания +STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Сбросить ограничение скорости движения для выделенного задания. Ctrl+щелчок - сбросить время для всех заданий. STR_TIMETABLE_RESET_LATENESS :{BLACK}Сбросить счетчик опозд. STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Сбросить счётчик отклонения от графика, чтобы транспорт снова считался приходящим вовремя @@ -4724,12 +4759,14 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Один STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Окно отладки ИИ / скрипта доступно только для сервера # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Конфигурация ИИ / скрипта +STR_AI_CONFIG_CAPTION_AI :{WHITE}Настройки ИИ +STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Настройки игровых скриптов STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Игровой скрипт, который будет загружен в следующей игре STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}Модули ИИ, которые будут загружены в следующей игре STR_AI_CONFIG_HUMAN_PLAYER :Человек STR_AI_CONFIG_RANDOM_AI :Случайный ИИ STR_AI_CONFIG_NONE :(нет) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Максимальное количество конкурентов: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Вверх STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Переместить этот модуль ИИ вверх по списку @@ -4737,12 +4774,11 @@ STR_AI_CONFIG_MOVE_DOWN :{BLACK}Вниз STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Переместить этот модуль ИИ вниз по списку STR_AI_CONFIG_GAMESCRIPT :{SILVER}Игровой скрипт +STR_AI_CONFIG_GAMESCRIPT_PARAM :{SILVER}Параметры STR_AI_CONFIG_AI :{SILVER}ИИ -STR_AI_CONFIG_CHANGE :{BLACK}Выбрать {STRING} -STR_AI_CONFIG_CHANGE_NONE : -STR_AI_CONFIG_CHANGE_AI :ИИ -STR_AI_CONFIG_CHANGE_GAMESCRIPT :Игровой скрипт +STR_AI_CONFIG_CHANGE_AI :{BLACK}ИИ +STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}Игровой скрипт STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Загрузить другой скрипт STR_AI_CONFIG_CONFIGURE :{BLACK}Конфигурация STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Настроить параметры скрипта @@ -4771,9 +4807,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Сним STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Снимок миникарты # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}Параметры {STRING} -STR_AI_SETTINGS_CAPTION_AI :ИИ -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Игровой скрипт +STR_AI_SETTINGS_CAPTION_AI :{WHITE}Параметры ИИ STR_AI_SETTINGS_CLOSE :{BLACK}Закрыть STR_AI_SETTINGS_RESET :{BLACK}Сброс STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4937,6 +4971,7 @@ STR_ERROR_TOO_MANY_INDUSTRIES :{WHITE}... сл STR_ERROR_CAN_T_GENERATE_INDUSTRIES :{WHITE}Невозможно создать предприятия... STR_ERROR_CAN_T_BUILD_HERE :{WHITE}Здесь нельзя создать {STRING}... STR_ERROR_CAN_T_CONSTRUCT_THIS_INDUSTRY :{WHITE}Построить это предприятие невозможно... +STR_ERROR_CAN_T_PROSPECT_INDUSTRY :{WHITE}Не удалось разведать месторождение... STR_ERROR_INDUSTRY_TOO_CLOSE :{WHITE}... слишком близко к другому предприятию STR_ERROR_MUST_FOUND_TOWN_FIRST :{WHITE}... сначала постройте город STR_ERROR_ONLY_ONE_ALLOWED_PER_TOWN :{WHITE}... такой объект уже есть в городе @@ -4951,6 +4986,8 @@ STR_ERROR_FOREST_CAN_ONLY_BE_PLANTED :{WHITE}... ле STR_ERROR_CAN_ONLY_BE_BUILT_ABOVE_SNOW_LINE :{WHITE}... можно строить только выше снеговой линии STR_ERROR_CAN_ONLY_BE_BUILT_BELOW_SNOW_LINE :{WHITE}... можно строить только ниже снеговой линии +STR_ERROR_PROSPECTING_WAS_UNLUCKY :{WHITE}Геологоразведка не принесла результатов; попробуйте снова. +STR_ERROR_NO_SUITABLE_PLACES_FOR_PROSPECTING :{WHITE}Нет подходящего места для геологоразведки. STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES :{WHITE}Нет подходящего места для {STRING.gen} STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES_EXPLANATION :{WHITE}Измените настройки создания карты для получения более подходящей карты @@ -5191,6 +5228,8 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Нево STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... транспортное средство уничтожено +STR_ERROR_CAN_T_CLONE_VEHICLE_LIST :{WHITE}... не все ТС идентичны друг другу + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Все транспортные средства будут недоступны STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Измените конфигурацию модуля NewGRF STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Нет доступных транспортных средств @@ -5217,6 +5256,8 @@ STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}Нево STR_ERROR_CAN_T_COPY_SHARE_ORDER :{WHITE}... ТС не может достигнуть всех станций STR_ERROR_CAN_T_ADD_ORDER :{WHITE}... ТС не может достигнуть этой станции STR_ERROR_CAN_T_ADD_ORDER_SHARED :{WHITE}... ТС с общим маршрутом не может достигнуть этой станции +STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST :{WHITE}... не у всех ТС одинаковый маршрут +STR_ERROR_CAN_T_SHARE_ORDER_VEHICLE_LIST :{WHITE}... не у всех ТС одинаковый общий маршрут STR_ERROR_CAN_T_SHARE_ORDER_LIST :{WHITE}Невозможно использовать общий маршрут... STR_ERROR_CAN_T_STOP_SHARING_ORDER_LIST :{WHITE}Невозможно создать индивидуальный маршрут... diff --git a/src/lang/serbian.txt b/src/lang/serbian.txt index 6f1b45a238..5a0b573383 100644 --- a/src/lang/serbian.txt +++ b/src/lang/serbian.txt @@ -388,6 +388,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}ks STR_UNITS_POWER_METRIC :{COMMA}ks STR_UNITS_POWER_SI :{COMMA}kW + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}kg @@ -579,10 +580,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Izađi # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Opcije STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Podešavanja -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Podešavanja VI/Skripte partije STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF podešavanja STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Opcije transparentnosti STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Prikazana imena naselja @@ -1160,36 +1160,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Indijska rupija STR_GAME_OPTIONS_CURRENCY_IDR :Indonezijska rupija (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Malezijski ringit (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Levom stranom -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Desnom stranom - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Imena naselja: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Izaberi stil imena naselja - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Engleska (Originalna) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Francuska -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Nemačka -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Engleska (Dodatna) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Latinoamerička -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Šašava -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Švedska -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Holandska -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finska -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Poljska -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slovačka -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norveška -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Mađarska -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Austrijanska -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Rumunska -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Češka -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Švajcarska -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Danska -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turska -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italijanska -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Katalonska - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Auto čuvanje pozicije STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Izbor vremenskog intervala između dve automatski sačuvane pozicije @@ -1221,21 +1191,8 @@ STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Štikliranjem se uključuje v-sync. Promena ovog podešavanja će biti vidljiva tek nakon ponovnog pokretanja igre. Radi jedino sa uključenim hardverskim ubrzanjem. -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Veličina interfejsa -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Izaberite većinu elementa koja će se koristiti -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(automatska detekcija) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normalna veličina -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Uvećavajte veličinu dva puta -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Uvećavajte veličinu četiri puta -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Veličina fonta -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Izaberi veličinu fonta za interfejs - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(automatska detekcija) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Uobičajen -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Dvostruka veličina -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Četvorostruka veličina STR_GAME_OPTIONS_GRAPHICS :{BLACK}Grafike @@ -1287,8 +1244,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Primer: STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 funti (£) u vašoj moneti STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Promena parametara sopstvene monete -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Najveći broj suparnika: {ORANGE}{COMMA} - STR_NONE :Nijedan STR_FUNDING_ONLY :Samo finansiranje STR_MINIMAL :Najmanji @@ -1338,6 +1293,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Umereni klimatski pojas +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Subpolarni klimatski pojas +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Suptropski klimatski pojas +STR_CLIMATE_TOYLAND_LANDSCAPE :Zemlja igračaka + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Ravničarski STR_TERRAIN_TYPE_FLAT :Brdski @@ -1696,6 +1657,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Unapređen STR_CONFIG_SETTING_ROAD_SIDE :Drumskih vozila: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Odaberite stranu saobraćaja +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Levom stranom +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Desnom stranom + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Orijentacija elevacione karte: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Nalevo @@ -2222,7 +2187,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Automatska prom STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Dozvoljeno okretanje vozova na signalu, ako su dugo čekali ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Preporučuje se) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Preporučuje se) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Promena vrednosti @@ -2265,7 +2230,6 @@ STR_INTRO_HIGHSCORE :{BLACK}Tabela n STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Podešavanja STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF Podešavanja STR_INTRO_ONLINE_CONTENT :{BLACK}Spisak Dodataka na Mreži -STR_INTRO_SCRIPT_SETTINGS :{BLACK}Podešavanja VI/Skripte Partije STR_INTRO_QUIT :{BLACK}Izađi STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Započinje novu partiju. Ctrl+Klik preskače konfiguraciju mape @@ -2285,7 +2249,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Prikazuj STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Prikaži podešavanje STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Prikazuje NewGRF podešavanja STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Pregled novih i ažureiranih dodatka za preuzimanje -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Prikazuje podešavanja za VI/Skriptu partije STR_INTRO_TOOLTIP_QUIT :{BLACK}Napušta 'OpenTTD' STR_INTRO_BASESET :{BLACK}Trenutno odabranom skupu osnovne grafike nedostaje {NUM} sprajt{P "" "ova" "ova"}. Proverite da li postoje izmene za ovaj skup. @@ -2317,12 +2280,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Promena STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Promena trenutne godine STR_CHEAT_SETUP_PROD :{LTBLUE}Dozvoliti promenu količine proizvodnje: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Umereni klimatski pojas -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Subpolarni klimatski pojas -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Suptropski klimatski pojas -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Zemlja igračaka - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Šema boja @@ -3323,6 +3280,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Veličin STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Izaberite veličinu mape u pločicama. Broj dostupnih pločica će biti neznatno manji STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Broj naselja: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Imena naselja: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Izaberi stil imena naselja STR_MAPGEN_DATE :{BLACK}Datum: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Broj fabrika: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Najviši vrh: @@ -3338,12 +3297,35 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Smanji p STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Oblikovanje reljefa: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Vrsta terena: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Nivo mora: +STR_MAPGEN_SEA_LEVEL :{BLACK}Nivo mora: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Broj reka: STR_MAPGEN_SMOOTHNESS :{BLACK}Postepenost: STR_MAPGEN_VARIETY :{BLACK}Raznolikost: STR_MAPGEN_GENERATE :{WHITE}Napravi +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Engleska (Originalna) +STR_MAPGEN_TOWN_NAME_FRENCH :Francuska +STR_MAPGEN_TOWN_NAME_GERMAN :Nemačka +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Engleska (Dodatna) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Latinoamerička +STR_MAPGEN_TOWN_NAME_SILLY :Šašava +STR_MAPGEN_TOWN_NAME_SWEDISH :Švedska +STR_MAPGEN_TOWN_NAME_DUTCH :Holandska +STR_MAPGEN_TOWN_NAME_FINNISH :Finska +STR_MAPGEN_TOWN_NAME_POLISH :Poljska +STR_MAPGEN_TOWN_NAME_SLOVAK :Slovačka +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norveška +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Mađarska +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Austrijanska +STR_MAPGEN_TOWN_NAME_ROMANIAN :Rumunska +STR_MAPGEN_TOWN_NAME_CZECH :Češka +STR_MAPGEN_TOWN_NAME_SWISS :Švajcarska +STR_MAPGEN_TOWN_NAME_DANISH :Danska +STR_MAPGEN_TOWN_NAME_TURKISH :Turska +STR_MAPGEN_TOWN_NAME_ITALIAN :Italijanska +STR_MAPGEN_TOWN_NAME_CATALAN :Katalonska + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Ivice terena: STR_MAPGEN_NORTHWEST :{BLACK}Severozapad @@ -3488,6 +3470,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Prethodn STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Vraća se na prethodni normalan sprajt, preskačući sve pseudo/prebojavajuće/font sprajtove i prelazi na kraj posle početnog STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Prikaz trenutno odabranog sprajta. Poravnanje se ignoriše tokom iscrtavanja ovog sprajta STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Premeštanje sprajta po kordinatama, menjanjem X i Y pomeraja. Ctrl+Klik za pomeranje sprajta osam jedinica odjednom + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Poništi relativne STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Poništi trenutne relativne pomake STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X pomak: {NUM}, Y pomak: {NUM} (Apsolutni) @@ -4044,6 +4030,8 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Najveća STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Domet: {GOLD}{COMMA} pločica STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK} Tip aviona: {GOLD} {STRING} +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Spisak probranih šinskih vozila - kliknite na vozilo za više podataka STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Spisak probranih drumskih vozila - kliknite na vozilo za više podataka @@ -4720,12 +4708,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Jedna od STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Prozor za korigovanje VI / Skripte Partije je dostupan samo na serveru # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Podešavanja VI / skripte igre STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Skripta igre koja će biti pokrenuta u sledećoj partiji STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}Veštačke inteligencije koje će biti pokrenute u sledećoj partiji STR_AI_CONFIG_HUMAN_PLAYER :Ljudsko biće STR_AI_CONFIG_RANDOM_AI :Proizvoljna VI STR_AI_CONFIG_NONE :(nijedna) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Najveći broj suparnika: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Pomeri Naviše STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Pomera obeleženu VI naviše u listi @@ -4735,8 +4723,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Pomera o STR_AI_CONFIG_GAMESCRIPT :{SILVER}Skripta igre STR_AI_CONFIG_AI :{SILVER}VIe -STR_AI_CONFIG_CHANGE :{BLACK}Izaberi {STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :VI STR_AI_CONFIG_CHANGE_GAMESCRIPT :Skripta igre STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Učitava drugu skriptu @@ -4767,9 +4753,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Slika ek STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Slika umanjene mape # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametri STR_AI_SETTINGS_CAPTION_AI :VI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Skripta Partije STR_AI_SETTINGS_CLOSE :{BLACK}Zatvori STR_AI_SETTINGS_RESET :{BLACK}Poništi STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -5186,6 +5170,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Servisni STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... vozilo je uništeno + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Nijedno vozilo neće biti dostupno STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Promenite konfiguraciju za NewGRF STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Nijedno vozilo još uvek nije dostupno diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index 307413fb39..4d97b6050d 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -200,6 +200,10 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP} STR_UNITS_POWER_METRIC :{COMMA}{NBSP}匹马力 STR_UNITS_POWER_SI :{COMMA}{NBSP}千瓦 +STR_UNITS_POWER_METRIC_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}马力/吨 +STR_UNITS_POWER_METRIC_TO_WEIGHT_SI :{DECIMAL}{NBSP}马力/毫克 +STR_UNITS_POWER_SI_TO_WEIGHT_SI :{DECIMAL}{NBSP}瓦/千克 + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}英吨 STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}吨 STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}千克 @@ -391,10 +395,11 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :退出 # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :游戏选项 STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :设置 -STR_SETTINGS_MENU_SCRIPT_SETTINGS :AI / 游戏脚本设定 +STR_SETTINGS_MENU_AI_SETTINGS :AI 设置 +STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :游戏脚本设置 STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF 设置 STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :透明选项 STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :显示城镇名称 @@ -965,36 +970,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :印度卢布( STR_GAME_OPTIONS_CURRENCY_IDR :印尼盾 (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :马来西亚林吉特 (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :左侧通行 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :右侧通行 - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}城镇名称: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}选择城镇名称的命名风格 - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :英国 (原始的) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :法国 -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :德国 -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :英国 (增强的) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :美式拉丁 -STR_GAME_OPTIONS_TOWN_NAME_SILLY :搞笑地名 -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :瑞典 -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :荷兰 -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :芬兰 -STR_GAME_OPTIONS_TOWN_NAME_POLISH :波兰 -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :斯洛伐克 -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :挪威 -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :匈牙利 -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :澳大利亚 -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :罗马尼亚 -STR_GAME_OPTIONS_TOWN_NAME_CZECH :捷克 -STR_GAME_OPTIONS_TOWN_NAME_SWISS :瑞士 -STR_GAME_OPTIONS_TOWN_NAME_DANISH :丹麦 -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :土耳其 -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :意大利 -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :加泰罗尼亚 - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}自动保存 STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}选择自动保存的周期 @@ -1027,21 +1002,19 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}点击 STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}使用中的驱动程序: {STRING} -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}界面大小 -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}选择使用的界面元素大小 +STR_GAME_OPTIONS_GUI_SCALE_FRAME :{BLACK}界面大小 +STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}拖动滑块以设置界面大小。按住 Ctrl 进行连续调整 +STR_GAME_OPTIONS_GUI_SCALE_AUTO :{BLACK}自动检测大小 +STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}选中此框可自动检测界面大小 -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(自动检测) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :正常大小 -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :两倍大小 -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :四倍大小 +STR_GAME_OPTIONS_GUI_SCALE_BEVELS :{BLACK}适应边框大小 +STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :{BLACK}选中此框使边框大小随界面大小而缩放 -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}字体大小 -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}选择此字体大小 - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(自动检测) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :正常 -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :两倍大小 -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :四倍大小 +STR_GAME_OPTIONS_GUI_SCALE_1X :1倍 +STR_GAME_OPTIONS_GUI_SCALE_2X :2倍 +STR_GAME_OPTIONS_GUI_SCALE_3X :3倍 +STR_GAME_OPTIONS_GUI_SCALE_4X :4倍 +STR_GAME_OPTIONS_GUI_SCALE_5X :5倍 STR_GAME_OPTIONS_GRAPHICS :{BLACK}图像 @@ -1093,8 +1066,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}预览 STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 英磅(£) 兑换自定义货币的数量 STR_CURRENCY_CHANGE_PARAMETER :{BLACK}改变当前的货币参数 -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}最大竞争对手个数:{ORANGE}{COMMA} - STR_NONE :没有 STR_FUNDING_ONLY :不生成 STR_MINIMAL :每种仅一个 @@ -1144,6 +1115,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :温带景观 +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :寒带景观 +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :沙漠景观 +STR_CLIMATE_TOYLAND_LANDSCAPE :奇幻景观 + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :非常平整 STR_TERRAIN_TYPE_FLAT :平整 @@ -1449,6 +1426,8 @@ 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_SHOW_CARGO_IN_LISTS :在列表窗口中显示车辆可以携带的货物 {STRING} +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS_HELPTEXT :如果启用,车辆的可运输负载将出现在车辆列表的上方 STR_CONFIG_SETTING_LANDSCAPE :景观: {STRING} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :此设置决定基本的游戏场景、有什么货物可供运输,以及城镇发展的所需条件。然而,NewGRF 及游戏脚本可以比此设置更加细致地设置游戏场景 @@ -1503,6 +1482,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :增强的 STR_CONFIG_SETTING_ROAD_SIDE :道路车辆: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :选择道路通行方向 +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :左侧通行 +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :右侧通行 + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :高度图旋转:{STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :逆时针 @@ -2037,7 +2020,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :遇到红灯时 STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :当列车在信号灯前长时间等待时,允许掉头 ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(推荐) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(推荐) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}改变设置值 @@ -2080,7 +2063,8 @@ STR_INTRO_HIGHSCORE :{BLACK}高分 STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}设置 STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF 设置 STR_INTRO_ONLINE_CONTENT :{BLACK}在线查找扩展包 -STR_INTRO_SCRIPT_SETTINGS :{BLACK}AI / 脚本 设定 +STR_INTRO_AI_SETTINGS :{BLACK}AI 设置 +STR_INTRO_GAMESCRIPT_SETTINGS :{BLACK}游戏脚本设置 STR_INTRO_QUIT :{BLACK}退出 STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}开始新游戏. 单击的同时按住Ctrl以跳过地图设置界面 @@ -2100,7 +2084,8 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}显示 STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}显示设置 STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}显示GRF设定 STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}连接服务器并查找扩展包 -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}查看AI和脚本设定 +STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}显示AI设置 +STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}显示游戏脚本设置 STR_INTRO_TOOLTIP_QUIT :{BLACK}退出 'OpenTTD' STR_INTRO_BASESET :{BLACK}当前选定的基础图形组缺少 {NUM} 个子画面。请检查基础图形组有无更新。 @@ -2132,12 +2117,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}改变 STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}改变当前年份 STR_CHEAT_SETUP_PROD :{LTBLUE}开启可调整产量模式:{ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :温带景观 -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :寒带景观 -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :沙漠景观 -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :奇幻景观 - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} 的色彩方案 @@ -2618,6 +2597,7 @@ STR_LINKGRAPH_LEGEND_SATURATED :{TINY_FONT}{BLA STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLACK}超载 # Linkgraph tooltip +STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG}要运回({COMMA}% of capacity) # Base for station construction window(s) STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}显示覆盖区域 @@ -2627,6 +2607,7 @@ STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP :{BLACK}不显 STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP :{BLACK}显示可以覆盖的区域 STR_STATION_BUILD_ACCEPTS_CARGO :{BLACK}接受:{GOLD}{CARGO_LIST} STR_STATION_BUILD_SUPPLIES_CARGO :{BLACK}供给: {GOLD}{CARGO_LIST} +STR_STATION_BUILD_INFRASTRUCTURE_COST :{BLACK}维护成本: {GOLD}{CURRENCY_SHORT}/年 # Join station window STR_JOIN_STATION_CAPTION :{WHITE}合并车站 @@ -2814,7 +2795,7 @@ STR_LANDSCAPING_TOOLBAR :{WHITE}景观 STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}降低地块的一角 STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND :{BLACK}升高地块的一角 STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}拉平地面 -STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}购买土地以备将来使用,按住 Shift 键操作可以显示所需资金 +STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}购买土地以备将来使用。按 Ctrl 键可选择对角线区域。按 Shift 键可以预览所需资金。 # Object construction window STR_OBJECT_BUILD_CAPTION :{WHITE}物体选单 @@ -3140,6 +3121,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}地图 STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}选择地图尺寸(单位:格)。可用的数值会略小。 STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}城镇数量: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}城镇名称: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}选择城镇名称的命名风格 STR_MAPGEN_DATE :{BLACK}日期: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}工业数量: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}最高峰: @@ -3155,11 +3138,40 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}减少 1 STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}生成地形: STR_MAPGEN_TERRAIN_TYPE :{BLACK}地形特点: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}海洋面积: +STR_MAPGEN_SEA_LEVEL :{BLACK}海洋面积: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}河流数量: STR_MAPGEN_SMOOTHNESS :{BLACK}平滑度: STR_MAPGEN_VARIETY :{BLACK}多样的分发: STR_MAPGEN_GENERATE :{WHITE}生成 +STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF设置 +STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}显示NewGRF设置 +STR_MAPGEN_AI_SETTINGS :{BLACK}AI 设置 +STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}显示AI设置 +STR_MAPGEN_GS_SETTINGS :{BLACK}游戏脚本设置 +STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}显示游戏脚本设置 + +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :英国 (原始的) +STR_MAPGEN_TOWN_NAME_FRENCH :法国 +STR_MAPGEN_TOWN_NAME_GERMAN :德国 +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :英国 (增强的) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :美式拉丁 +STR_MAPGEN_TOWN_NAME_SILLY :搞笑地名 +STR_MAPGEN_TOWN_NAME_SWEDISH :瑞典 +STR_MAPGEN_TOWN_NAME_DUTCH :荷兰 +STR_MAPGEN_TOWN_NAME_FINNISH :芬兰 +STR_MAPGEN_TOWN_NAME_POLISH :波兰 +STR_MAPGEN_TOWN_NAME_SLOVAK :斯洛伐克 +STR_MAPGEN_TOWN_NAME_NORWEGIAN :挪威 +STR_MAPGEN_TOWN_NAME_HUNGARIAN :匈牙利 +STR_MAPGEN_TOWN_NAME_AUSTRIAN :澳大利亚 +STR_MAPGEN_TOWN_NAME_ROMANIAN :罗马尼亚 +STR_MAPGEN_TOWN_NAME_CZECH :捷克 +STR_MAPGEN_TOWN_NAME_SWISS :瑞士 +STR_MAPGEN_TOWN_NAME_DANISH :丹麦 +STR_MAPGEN_TOWN_NAME_TURKISH :土耳其 +STR_MAPGEN_TOWN_NAME_ITALIAN :意大利 +STR_MAPGEN_TOWN_NAME_CATALAN :加泰罗尼亚 # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}地图边缘: @@ -3305,6 +3317,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}上一 STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}继续处理上一个正常的图形元素,略过任何虚位/重新着色/文字字型相关的图形元素;并且在处理到第一个图形元素后,返回最后的图形元素继续处理。 STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}显示目前选取的 sprite。当 sprite 正在描绘时会忽略其定位。 STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}从 X 及 Y 座标方向移动图形元素。如按住 Ctrl 键再点击,可一次移动 8 个单位 + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}重置相关 STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}重置当前相关偏移 STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X 偏移: {NUM}, Y 偏移: {NUM} (绝对) @@ -3642,16 +3658,18 @@ STR_FINANCES_SECTION_SHIP_REVENUE :{GOLD}船只 STR_FINANCES_SECTION_LOAN_INTEREST :{GOLD}贷款利息 STR_FINANCES_SECTION_OTHER :{GOLD}其他费用 +STR_FINANCES_TOTAL_CAPTION :{WHITE}总计 STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} STR_FINANCES_ZERO_INCOME :{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} -STR_FINANCES_NET_PROFIT :{WHITE}净利润 +STR_FINANCES_PROFIT :{WHITE}利润 STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}流动资金 STR_FINANCES_OWN_FUNDS_TITLE :{WHITE}自有资金 STR_FINANCES_LOAN_TITLE :{WHITE}已贷款额 STR_FINANCES_INTEREST_RATE :{WHITE}贷款利息: {BLACK}{NUM}% STR_FINANCES_MAX_LOAN :{WHITE}最大贷款额度:{BLACK}{CURRENCY_LONG} STR_FINANCES_TOTAL_CURRENCY :{BLACK}{CURRENCY_LONG} +STR_FINANCES_BANK_BALANCE :{WHITE}{CURRENCY_LONG} STR_FINANCES_BORROW_BUTTON :{BLACK}贷款 {CURRENCY_LONG} STR_FINANCES_BORROW_TOOLTIP :{BLACK}贷款{}Ctrl+点击 可贷款最大额度 STR_FINANCES_REPAY_BUTTON :{BLACK}还款 {CURRENCY_LONG} @@ -3782,6 +3800,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}向所 STR_VEHICLE_LIST_REPLACE_VEHICLES :替换车辆/飞机/船只 STR_VEHICLE_LIST_SEND_FOR_SERVICING :进行保养 STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}今年利润:{CURRENCY_LONG} (去年利润:{CURRENCY_LONG}) +STR_VEHICLE_LIST_CARGO :{TINY_FONT}{BLACK}[{CARGO_LIST}] +STR_VEHICLE_LIST_NAME_AND_CARGO :{TINY_FONT}{BLACK}{STRING} {STRING} STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :前往列车车库 STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :前往汽车车库 @@ -3873,6 +3893,11 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}最大 STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}航行距离: {GOLD}{COMMA} 格 STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}飞机类型: {GOLD}{STRING} +###length 3 +STR_CARGO_TYPE_FILTER_ALL :所有货物类型 +STR_CARGO_TYPE_FILTER_FREIGHT :货运 +STR_CARGO_TYPE_FILTER_NONE :没有 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}列车车辆选择列表。点击车辆查看详细信息,或者按住 Ctrl 键再点击以切换是否隐藏车辆的种类 STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}路面车辆选择列表。点击车辆查看详细信息,或者按住 Ctrl 键再点击以切换是否隐藏车辆的种类 @@ -4200,6 +4225,7 @@ STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}重量 STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}重量:{LTBLUE}{WEIGHT_SHORT} {BLACK}功率:{LTBLUE}{POWER}{BLACK} 最大速度:{LTBLUE}{VELOCITY} {BLACK}最大牵引力:{LTBLUE}{FORCE} STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}今年利润:{LTBLUE}{CURRENCY_LONG} (去年利润:{CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}今年利润: {LTBLUE}{CURRENCY_LONG} (去年利润: {CURRENCY_LONG}) {BLACK}最小功率: {LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}可靠性:{LTBLUE}{COMMA}% {BLACK}上次保养后抛锚的次数:{LTBLUE}{COMMA} STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}建造年份:{LTBLUE}{NUM}{BLACK} 价值:{LTBLUE}{CURRENCY_LONG} @@ -4533,12 +4559,14 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}您使 STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}AI调试窗口只对服务器可用 # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}AI 设置 +STR_AI_CONFIG_CAPTION_AI :{WHITE}AI配置 +STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}游戏脚本配置 STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}下局游戏将启用这些脚本 STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}下局游戏将启用这些AI STR_AI_CONFIG_HUMAN_PLAYER :玩家 STR_AI_CONFIG_RANDOM_AI :随机 AI STR_AI_CONFIG_NONE :(无) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}最大竞争对手个数:{ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}上移 STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}在列表中将选择的AI上移 @@ -4546,10 +4574,9 @@ STR_AI_CONFIG_MOVE_DOWN :{BLACK}下移 STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}在列表中将选择的AI下移 STR_AI_CONFIG_GAMESCRIPT :{SILVER}游戏脚本 +STR_AI_CONFIG_GAMESCRIPT_PARAM :{SILVER}参数 STR_AI_CONFIG_AI :{SILVER}AI -STR_AI_CONFIG_CHANGE :{BLACK}选择{STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :AI STR_AI_CONFIG_CHANGE_GAMESCRIPT :游戏脚本 STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}装在另一脚本 @@ -4580,9 +4607,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}高度 STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}小地图截图 # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} 参数 STR_AI_SETTINGS_CAPTION_AI :AI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :游戏脚本 STR_AI_SETTINGS_CLOSE :{BLACK}关闭 STR_AI_SETTINGS_RESET :{BLACK}重设 STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4927,6 +4952,7 @@ STR_ERROR_OBJECT_IN_THE_WAY :{WHITE}目标 STR_ERROR_COMPANY_HEADQUARTERS_IN :{WHITE}目标处有公司总部 STR_ERROR_CAN_T_PURCHASE_THIS_LAND :{WHITE}不能购买这个地块! STR_ERROR_YOU_ALREADY_OWN_IT :{WHITE}你已经拥有此地块! +STR_ERROR_BUILD_OBJECT_LIMIT_REACHED :{WHITE}...对象构造达到极限 # Group related errors STR_ERROR_GROUP_CAN_T_CREATE :{WHITE}无法新建分组…… @@ -4999,6 +5025,8 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}不能 STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... 运具已撞毁 +STR_ERROR_CAN_T_CLONE_VEHICLE_LIST :{WHITE}...并非所有车辆都相同 + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}没有可用的运输工具 STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}请改动您的 NewGRF 设置 STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}暂时沒有可用的运输工具 @@ -5025,6 +5053,8 @@ STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}不能 STR_ERROR_CAN_T_COPY_SHARE_ORDER :{WHITE}车辆无法到达全部站点 STR_ERROR_CAN_T_ADD_ORDER :{WHITE}车辆无法到达那个车站 STR_ERROR_CAN_T_ADD_ORDER_SHARED :{WHITE}一个共享此调度计划的载具无法到达那个车站 +STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST :{WHITE}...并不是所有的车辆都有相同的指令 +STR_ERROR_CAN_T_SHARE_ORDER_VEHICLE_LIST :{WHITE}...并不是所有的车辆都有相同的指令 STR_ERROR_CAN_T_SHARE_ORDER_LIST :{WHITE}不能共享调度计划…… STR_ERROR_CAN_T_STOP_SHARING_ORDER_LIST :{WHITE}不能停止共享调度计划…… diff --git a/src/lang/slovak.txt b/src/lang/slovak.txt index 62a916dcad..8f5d1fe95c 100644 --- a/src/lang/slovak.txt +++ b/src/lang/slovak.txt @@ -264,6 +264,16 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}hp STR_UNITS_POWER_METRIC :{COMMA}hp STR_UNITS_POWER_SI :{COMMA}kW +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_SI :{DECIMAL}{NBSP}hp/Mg +STR_UNITS_POWER_METRIC_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_SI :{DECIMAL}{NBSP}hp/Mg +STR_UNITS_POWER_SI_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_SI :{DECIMAL}{NBSP}W/kg + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}kg @@ -289,9 +299,9 @@ STR_UNITS_HEIGHT_METRIC :{COMMA} m STR_UNITS_HEIGHT_SI :{COMMA} m # Common window strings -STR_LIST_FILTER_TITLE :{BLACK}Filtrovací reťazec: -STR_LIST_FILTER_OSKTITLE :{BLACK}Vložiť filtrovací reťazec -STR_LIST_FILTER_TOOLTIP :{BLACK}Vložiť kľúčové slovo pre filtrovanie zoznamu +STR_LIST_FILTER_TITLE :{BLACK}Filter: +STR_LIST_FILTER_OSKTITLE :{BLACK}Vložiť aspoň jedno klúčové slovo pre filtrovanie +STR_LIST_FILTER_TOOLTIP :{BLACK}Vložiť aspoň jedno klúčové slovo pre filtrovanie STR_TOOLTIP_GROUP_ORDER :{BLACK}Zvoľ druh zoskupenia STR_TOOLTIP_SORT_ORDER :{BLACK}Spôsob triedenia (zostupný/vzostupný) @@ -352,8 +362,8 @@ STR_SORT_BY_PRODUCTION :Produkcia STR_SORT_BY_TYPE :Typ STR_SORT_BY_TRANSPORTED :Prepravené STR_SORT_BY_NUMBER :Číslo -STR_SORT_BY_PROFIT_LAST_YEAR :Profit v minulom roku -STR_SORT_BY_PROFIT_THIS_YEAR :Profit v tomto roku +STR_SORT_BY_PROFIT_LAST_YEAR :Zisk v minulom roku +STR_SORT_BY_PROFIT_THIS_YEAR :Zisk v tomto roku STR_SORT_BY_AGE :Vek STR_SORT_BY_RELIABILITY :Spoľahlivosť STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE :Kapacita podľa typu nákladu @@ -380,10 +390,10 @@ STR_SORT_BY_RANGE :Rozsah STR_SORT_BY_POPULATION :Populácia STR_SORT_BY_RATING :Hodnotenie STR_SORT_BY_NUM_VEHICLES :Počet vozidiel -STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Celkový profit v minulom roku -STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :Celkový profit v tomto roku -STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Priemerný profit v minulom roku -STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Priemerný profit v tomto roku +STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Celkový zisk v minulom roku +STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :Celkový zisk v tomto roku +STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Priemerný zisk v minulom roku +STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Priemerný zisk v tomto roku # Group by options for vehicle list STR_GROUP_BY_NONE :Žiadne @@ -442,7 +452,7 @@ STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Stavba c STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Výstavba električkovej trate STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Sadiť stromy. Shift zobrazí odhadovanú cenu STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Umiestniť popis -STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Umiestniť objekt. Shift zobrazí odhadovanú cenu +STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Umiestniť objekt. Ctrl označí oblasť diagonálne. Shift zobrazí odhadovanú cenu # Scenario editor file menu ###length 7 @@ -455,10 +465,11 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Ukončiť # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Možnosti hry STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Nastavenia -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Nastavenia AI/skriptu +STR_SETTINGS_MENU_AI_SETTINGS :Nastavenia AI +STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :Nastavenia skriptu STR_SETTINGS_MENU_NEWGRF_SETTINGS :Nastavenia NewGRF STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Nastavenia priehľadnosti STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Zobraziť názvy miest @@ -497,7 +508,7 @@ STR_SUBSIDIES_MENU_SUBSIDIES :Dotácie # Graph menu ###length 6 -STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH :Graf prevádzkového profitu +STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH :Graf prevádzkového zisku STR_GRAPH_MENU_INCOME_GRAPH :Graf tržieb STR_GRAPH_MENU_DELIVERED_CARGO_GRAPH :Graf prepraveného nákladu STR_GRAPH_MENU_PERFORMANCE_HISTORY_GRAPH :Graf hodnotenia výkonu @@ -652,7 +663,7 @@ STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STR STR_GRAPH_Y_LABEL :{TINY_FONT}{STRING} STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COMMA} -STR_GRAPH_OPERATING_PROFIT_CAPTION :{WHITE}Graf prevádzkového profitu +STR_GRAPH_OPERATING_PROFIT_CAPTION :{WHITE}Graf prevádzkového zisku STR_GRAPH_INCOME_CAPTION :{WHITE}Graf tržieb STR_GRAPH_CARGO_DELIVERED_CAPTION :{WHITE}Graf prepraveného nákladu (jednotiek nákladu) STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION :{WHITE}Graf hodnotenia výkonu (najvyššie hodnotenie je 1000) @@ -698,7 +709,7 @@ STR_PERFORMANCE_DETAIL_SELECT_COMPANY_TOOLTIP :{BLACK}Ukázať ###length 10 STR_PERFORMANCE_DETAIL_VEHICLES :{BLACK}Vozidlá: STR_PERFORMANCE_DETAIL_STATIONS :{BLACK}Stanice: -STR_PERFORMANCE_DETAIL_MIN_PROFIT :{BLACK}Min. profit: +STR_PERFORMANCE_DETAIL_MIN_PROFIT :{BLACK}Min. zisk: STR_PERFORMANCE_DETAIL_MIN_INCOME :{BLACK}Min. príjem: STR_PERFORMANCE_DETAIL_MAX_INCOME :{BLACK}Max. príjem: STR_PERFORMANCE_DETAIL_DELIVERED :{BLACK}Prepravené: @@ -710,7 +721,7 @@ STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}Spolu: ###length 10 STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP :{BLACK}Počet vozidiel, ktoré dosiahli v minulom roku zisk. Patria sem cestné vozidlá, vlaky, lode a lietadlá STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}Počet nedávno obsluhovaných staníc. Železničné stanice, autobusové zastávky, letiská a pod. sa počítajú oddelene aj keď patria do rovnakej stanice -STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP :{BLACK}Profit vozidla s najnižšími tržbami (zo všetkých vozidiel starších ako 2 roky) +STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP :{BLACK}Zisk vozidla s najnižšími tržbami (zo všetkých vozidiel starších ako 2 roky) STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}Množstvo peňazí zarobených v kvartáli s najmenším ziskom v posledných 12 kvartáloch STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP :{BLACK}Množstvo peňazí zarobených v kvartáli s najväčším ziskom v posledných 12 kvartáloch STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP :{BLACK}Počet jednotiek nákladu prepravených v posledných štyroch kvartáloch @@ -882,9 +893,9 @@ STR_NEWS_FIRST_AIRCRAFT_ARRIVAL :{BIG_FONT}{BLAC STR_NEWS_TRAIN_CRASH :{BIG_FONT}{BLACK}Vlakové nešťastie!{}{COMMA} mŕtv{P i i ych} pri požiari po kolízii STR_NEWS_ROAD_VEHICLE_CRASH_DRIVER :{BIG_FONT}{BLACK}Dopravná nehoda!{}Vodič zomrel po kolízii s vlakom -STR_NEWS_ROAD_VEHICLE_CRASH :{BIG_FONT}{BLACK}Dopravná nehoda!{}{COMMA} mŕtvych po kolízii s vlakom +STR_NEWS_ROAD_VEHICLE_CRASH :{BIG_FONT}{BLACK}Dopravná nehoda!{}{COMMA} mŕtv{P i i ych} po kolízii s vlakom STR_NEWS_AIRCRAFT_CRASH :{BIG_FONT}{BLACK}Letecké nešťastie!{}{COMMA} mŕtv{P y i ych} po požiari na {STATION} -STR_NEWS_PLANE_CRASH_OUT_OF_FUEL :{BIG_FONT}{BLACK}Letecké nešťastie!{}Lietadlu došlo palivo, {COMMA} mŕtvych pri požiari +STR_NEWS_PLANE_CRASH_OUT_OF_FUEL :{BIG_FONT}{BLACK}Letecké nešťastie!{}Lietadlu došlo palivo, {COMMA} mŕtv{P y i ych} pri požiari STR_NEWS_DISASTER_ZEPPELIN :{BIG_FONT}{BLACK}Zeppelin zničený pri nehode na {STATION}! STR_NEWS_DISASTER_SMALL_UFO :{BIG_FONT}{BLACK}Cestné vozidlo bolo zničené pri kolízii s 'UFO' @@ -892,7 +903,7 @@ STR_NEWS_DISASTER_AIRPLANE_OIL_REFINERY :{BIG_FONT}{BLAC STR_NEWS_DISASTER_HELICOPTER_FACTORY :{BIG_FONT}{BLACK}Za nejasných okolností bola zničená továreň neďaleko mesta {TOWN}! STR_NEWS_DISASTER_BIG_UFO :{BIG_FONT}{BLACK}'UFO' pristálo neďaleko mesta {TOWN}! STR_NEWS_DISASTER_COAL_MINE_SUBSIDENCE :{BIG_FONT}{BLACK}Zával v uhoľnej bani neďaleko mesta {TOWN}! -STR_NEWS_DISASTER_FLOOD_VEHICLE :{BIG_FONT}{BLACK}Povodeň!{}Najmenej {COMMA} ľudí je nezvestných alebo mŕtvych po obrovských záplavách! +STR_NEWS_DISASTER_FLOOD_VEHICLE :{BIG_FONT}{BLACK}Povodeň!{}Najmenej {COMMA} {P človek ľudia ľudí} {P je sú je} nezvestn{P ý í ých} alebo mŕtv{P y i ych} po obrovských záplavách! STR_NEWS_COMPANY_IN_TROUBLE_TITLE :{BIG_FONT}{BLACK}Dopravná spoločnosť má problémy! STR_NEWS_COMPANY_IN_TROUBLE_DESCRIPTION :{BIG_FONT}{BLACK}{STRING} bude predaná alebo vyhlási bankrot pokiaľ čoskoro nezvýši produktivitu! @@ -1033,36 +1044,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Indická rupia STR_GAME_OPTIONS_CURRENCY_IDR :Indonézska rupia (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Malajzijský ringgit (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Jazdia naľavo -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Jazdia napravo - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Názvy miest: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Výber štýlu názvov miest - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Anglické (pôvodné) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Francúzske -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Nemecké -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Anglické (ďalšie) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Latinsko-Americké -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Anglické (hlúpe) -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Švédske -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Holandské -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Fínske -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Poľské -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slovenské -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Nórske -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Maďarské -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Rakúske -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Rumunské -STR_GAME_OPTIONS_TOWN_NAME_CZECH :České -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Švajčiarské -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Dánske -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turecké -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Talianské -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Katalánske - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Automatické ukladanie STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Výber intervalu automatického ukladania @@ -1093,22 +1074,21 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Nastaven STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Zaškrtnite toto políčko, aby ste povolili vertikálnu synchronizáciu. Zmeny budú uplatnené až po reštarte hry. Funguje iba ak je zapnutá hardvérová akcelerácia. +STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Aktuálny ovládač: {STRING} -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Veľkosť rozhrania -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Výber veľkosti prvkov rozhrania +STR_GAME_OPTIONS_GUI_SCALE_FRAME :{BLACK}Veľkosť rozhrania +STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Potiahnutím posúvača nastavte veľkosť rozhrania. Pre plynulé nastavenie podržte Ctrl +STR_GAME_OPTIONS_GUI_SCALE_AUTO :{BLACK}Detekovať rozmery automaticky +STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Začiarknutím tohto políčka automaticky zistiť veľkosť rozhrania -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(automaticky zistené) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normálna -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Dvojnásobná veľkosť -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Štvornásobná veľkosť +STR_GAME_OPTIONS_GUI_SCALE_BEVELS :{BLACK}Mierkové úkosy +STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :{BLACK}Začiarknutím tohto políčka zmeníte úkosy podľa veľkosti rozhrania -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Veľkosť písma -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Výber veľkosti písma v rozhraní - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(automaticky zistené) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normálna -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Dvojnásobná veľkosť -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Štvornásobná veľkosť +STR_GAME_OPTIONS_GUI_SCALE_1X :1x +STR_GAME_OPTIONS_GUI_SCALE_2X :2x +STR_GAME_OPTIONS_GUI_SCALE_3X :3x +STR_GAME_OPTIONS_GUI_SCALE_4X :4x +STR_GAME_OPTIONS_GUI_SCALE_5X :5x STR_GAME_OPTIONS_GRAPHICS :{BLACK}Grafika @@ -1160,8 +1140,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Náhľa STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 libier (£) vo vašej mene STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Zmeniť parametre vlastnej meny -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Maximálny počet konkurentov: {ORANGE}{COMMA} - STR_NONE :Žiadny STR_FUNDING_ONLY :Iba financovanie STR_MINIMAL :Minimálny @@ -1211,6 +1189,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Krajina mierneho pásma +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Subpolárna krajina +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Subtropická krajina +STR_CLIMATE_TOYLAND_LANDSCAPE :Krajina hračiek + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Veľmi rovný STR_TERRAIN_TYPE_FLAT :Rovný @@ -1221,15 +1205,16 @@ STR_TERRAIN_TYPE_CUSTOM :Vlastná výšk STR_TERRAIN_TYPE_CUSTOM_VALUE :Vlastná výška ({NUM}) ###length 4 +STR_CITY_APPROVAL_LENIENT :Zhovievavý STR_CITY_APPROVAL_TOLERANT :Tolerantný STR_CITY_APPROVAL_HOSTILE :Odmietavý -STR_CITY_APPROVAL_PERMISSIVE :Pozitívny +STR_CITY_APPROVAL_PERMISSIVE :Povoľný (nemá vplyv na akcie spoločnosti) STR_WARNING_NO_SUITABLE_AI :{WHITE}Nieje dostupné žiadne použiteľné AI...{}Niekoľko AI je možné stiahnuť cez 'Online obsah' # Settings tree window STR_CONFIG_SETTING_TREE_CAPTION :{WHITE}Nastavenia -STR_CONFIG_SETTING_FILTER_TITLE :{BLACK}Filtrovací reťazec: +STR_CONFIG_SETTING_FILTER_TITLE :{BLACK}Filter: STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}Rozbaliť všetko STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Zabaliť všetko STR_CONFIG_SETTING_RESET_ALL :Resetovať všetky hodnoty @@ -1324,8 +1309,8 @@ STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT :Ak je povolené STR_CONFIG_SETTING_DISASTERS :Havárie: {STRING} STR_CONFIG_SETTING_DISASTERS_HELPTEXT :Vypne alebo zapne katastrofy, ktoré môžu občas zablokovať alebo zničiť vozidlá alebo infraštruktúru -STR_CONFIG_SETTING_CITY_APPROVAL :Postoj mestskej správy k reštrukturalizácii v oblasti: {STRING} -STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT :Zvoľte ako veľmi ovplyvňuje hluk a poškodzovanie prostredia spoločnosťami ich hodnotenie v meste a ich budúce možnosti výstavby v oblasti vlastnenej mestom +STR_CONFIG_SETTING_CITY_APPROVAL :Postoj miestnej samosprávy: {STRING} +STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT :Zvoľte ako veľmi ovplyvňuje hluk a poškodzovanie prostredia spoločnosťami ich hodnotenie v meste a ich budúce možnosti výstavby v meste STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT :Limit výšky mapy: {STRING} STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT_HELPTEXT :Zvoľte maximálnu výšku terénu na mape. S "(automatický)" bude vybraná správna hodnota podľa generátora krajiny @@ -1479,7 +1464,7 @@ STR_CONFIG_SETTING_ORDER_REVIEW_OFF :Nie STR_CONFIG_SETTING_ORDER_REVIEW_EXDEPOT :Áno, okrem zastavených vozidiel STR_CONFIG_SETTING_ORDER_REVIEW_ON :U všetkých vozidiel -STR_CONFIG_SETTING_WARN_INCOME_LESS :Varovať, ak je vozidlo stratové: {STRING} +STR_CONFIG_SETTING_WARN_INCOME_LESS :Varovať ak je vozidlo stratové: {STRING} STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Ak je zapnuté, zobrazí sa správa ak vozidlo nevykázalo žiaden zisk za predošlý rok. STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Nikdy neprestať s výrobou starých vozidiel: {STRING} @@ -1515,6 +1500,8 @@ STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Hrúbka čiar v STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :Zobraziť názov NewGRF v okne vozidiel: {STRING} STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Pridá riadok do zoznamu vozidiel, ktorý ukazuje z akého NewGRF vozidlo pochádza. +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS :Zobraziť náklad, ktorý môžu vozidlá prepravovať v oknách zoznamu {STRING} +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS_HELPTEXT :Ak je zapnuté, v zoznamoch vozidiel sa nad ňou zobrazí prepravovateľný náklad vozidla STR_CONFIG_SETTING_LANDSCAPE :Krajina: {STRING} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Krajiny definujú základný herný scenár s rôznymi druhmi nákladu a požiadavkami na rast miest. NewGRF a herné skripty umožňujú ich lepšiu kontrolu @@ -1569,6 +1556,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Vylepšený STR_CONFIG_SETTING_ROAD_SIDE :Cestné vozidlá: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Vyberte jazdnú stranu +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Jazdia naľavo +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Jazdia napravo + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Orientácia výškovej mapy: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Proti smeru hodinových ručičiek @@ -1595,7 +1586,13 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Zelená STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Tmavozelená STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Fialová +STR_CONFIG_SETTING_LINKGRAPH_COLOURS :Farby prekrytia toku nákladu: {STRING} +STR_CONFIG_SETTING_LINKGRAPH_COLOURS_HELPTEXT :Nastavte farebnú schému použitú pre prekrytie toku nákladu. ###length 4 +STR_CONFIG_SETTING_LINKGRAPH_COLOURS_GREEN_TO_RED :Zelenočervená +STR_CONFIG_SETTING_LINKGRAPH_COLOURS_GREEN_TO_BLUE :Zelenomodrá +STR_CONFIG_SETTING_LINKGRAPH_COLOURS_GREY_TO_RED :Sivá až červená +STR_CONFIG_SETTING_LINKGRAPH_COLOURS_GREYSCALE :Odtiene šedej STR_CONFIG_SETTING_SCROLLMODE :Správanie pohľadu pri posúvaní myšou: {STRING} STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Reakcia na posúvanie (scrollovanie) na mape @@ -1877,8 +1874,8 @@ STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Ak je zapnuté, STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Minimálny vek spoločnosti na obchodovanie s podielmi: {STRING} STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES_HELPTEXT :Určuje minimálny vek spoločnosti na to, aby od nej mohli ostatné spoločnosti kupovať a predavať podiely. -STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Percentáž profitu na zaplatenie podávacieho systému: {STRING} -STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :Percento príjmov dať na strednú ´nohu´ vo feeder systémoch, získate väčšiu kontrolu nad príjmamy +STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Percentáž zisku na zaplatenie podávacieho systému: {STRING} +STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :Percento príjmov dať na strednú ´nohu´ vo feeder systémoch, získate väčšiu kontrolu nad príjmami STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :Pri ťahaní, umiestni návestidlo každé: {STRING} STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Nastaviť vzdialenosť návestidiel, akou budú umiestnené na trati po najbližšiu prekážku (návestidlo, križovatku), pri stavbe ťahaním @@ -2097,7 +2094,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Automatické ob STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Povoliť vlakom otočiť sa na návestidlách, ak tam čakajú dlhý čas ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(odporučený) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(odporučený) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Zmeniť hodnotu nastavenia @@ -2140,7 +2137,8 @@ STR_INTRO_HIGHSCORE :{BLACK}Najvyš STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Nastavenia STR_INTRO_NEWGRF_SETTINGS :{BLACK}Nastavenia NewGRF STR_INTRO_ONLINE_CONTENT :{BLACK}Skontrolovať online obsah -STR_INTRO_SCRIPT_SETTINGS :{BLACK}Nastavenia AI/skriptu +STR_INTRO_AI_SETTINGS :{BLACK}Nastavenia AI +STR_INTRO_GAMESCRIPT_SETTINGS :{BLACK}Nastavenia skriptu STR_INTRO_QUIT :{BLACK}Ukončiť STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Spustiť novú hru. Ctrl+klik preskočí nastavenie mapy @@ -2160,7 +2158,8 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Zobrazi STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Zobraziť nastavenia STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Zobraziť nastavenia NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Skontrolovať nový a aktualizovaný obsah pre stiahnutie -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Zobraziť nastavenia AI/skriptu +STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Zobraziť AI nastavenia +STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Zobraz nastavenia skriptu STR_INTRO_TOOLTIP_QUIT :{BLACK}Ukončiť 'OpenTTD' STR_INTRO_BASESET :{BLACK}Vo vybranej základnej sade grafiky chýba {NUM} prv{P ok ky kov}. Prosím skontrolujte aktualizácie sady grafiky. @@ -2192,12 +2191,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Zmeniť STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Zmeniť súčasný rok STR_CHEAT_SETUP_PROD :{LTBLUE}Povoliť zmenu objemu výroby: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Krajina mierneho pásma -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Subpolárna krajina -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Subtropická krajina -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Krajina hračiek - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Farebná schéma @@ -2557,13 +2550,13 @@ STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :čaká sa na ak STR_NETWORK_MESSAGE_CLIENT_LEAVING :odchádza STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} vstúpil do hry -STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {STRING} vstúpil do hry (klient č. {2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} sa pripojil do spoločnosti č. {2:NUM} +STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {0:STRING} vstúpil do hry (klient č. {2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {0:STRING} sa pripojil do spoločnosti č. {2:NUM} STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} sa pripojil k pozorovateľom -STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} založil novú spoločnosť (č. {2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} opustil hru ({2:STRING}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {0:STRING} založil novú spoločnosť (#{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {0:STRING} opustil hru ({2:STRING}) STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} zmenil/-a svoje meno na {STRING} -STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} dal {2:CURRENCY_LONG} spoločnosti {1:STRING} +STR_NETWORK_MESSAGE_GIVE_MONEY :*** {0:STRING} dal {2:CURRENCY_LONG} spoločnosti {1:STRING} STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}Server ukončil reláciu STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Server sa reštartuje...{}Čakajte prosím... STR_NETWORK_MESSAGE_KICKED :*** Hráč {STRING} bol vyhodený. Dôvod: ({STRING}) @@ -2678,6 +2671,9 @@ STR_LINKGRAPH_LEGEND_SATURATED :{TINY_FONT}{BLA STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLACK}preťažené # Linkgraph tooltip +STR_LINKGRAPH_STATS_TOOLTIP :{BLACK}{CARGO_LONG} na prepravu za mesiac z {STATION} do {STATION} ({COMMA}% kapacity){STRING} +STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} na prepravu naspäť ({COMMA}% kapacity) +STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}Priemerný čas cesty: {NUM}{NBSP}d{P eň ni ní} # Base for station construction window(s) STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Ukázať oblasť pokrytia @@ -2687,6 +2683,7 @@ STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP :{BLACK}Nezvýra STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP :{BLACK}Zobraziť oblasť pokrytia stavanej plochy STR_STATION_BUILD_ACCEPTS_CARGO :{BLACK}Prijíma: {GOLD}{CARGO_LIST} STR_STATION_BUILD_SUPPLIES_CARGO :{BLACK}Dodáva: {GOLD}{CARGO_LIST} +STR_STATION_BUILD_INFRASTRUCTURE_COST :{BLACK}Náklady na údržbu: {GOLD}{CURRENCY_SHORT}/rok # Join station window STR_JOIN_STATION_CAPTION :{WHITE}Spojiť stanicu @@ -2874,11 +2871,11 @@ STR_LANDSCAPING_TOOLBAR :{WHITE}Úprava STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}Znížiť roh políčka. Ťahaním znížite prvý vybraný roh a vyrovnáte celú vybranú oblasť na novú výšku. Ctrl označí oblasť diagonálne. Shift zobrazí odhadovanú cenu STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND :{BLACK}Zvýšiť roh políčka. Ťahaním zvýšite prvý vybraný roh a vyrovnáte celú vybranú oblasť na novú výšku. Ctrl označí oblasť diagonálne. Shift zobrazí odhadovanú cenu STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Vyrovnať výšku terénu podľa vybraného rohu. Ctrl označí oblasť diagonálne. Shift zobrazí odhadovanú cenu -STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Zakúpiť pozemok pre budúce použitie. Shift zobrazí odhadovanú cenu +STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Zakúpiť pozemok pre budúce použitie. Ctrl označí oblasť diagonálne. Shift zobrazí odhadovanú cenu # Object construction window STR_OBJECT_BUILD_CAPTION :{WHITE}Výber objektu -STR_OBJECT_BUILD_TOOLTIP :{BLACK}Vyberte objekt na vybudovanie. Shift zobrazí odhadovanú cenu +STR_OBJECT_BUILD_TOOLTIP :{BLACK}Vyberte objekt na vybudovanie. Ctrl označí oblasť diagonálne. Shift zobrazí odhadovanú cenu STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}Vyberte triedu objektu na vybudovanie STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}Náhľad objektu STR_OBJECT_BUILD_SIZE :{BLACK}Rozmery: {GOLD}{NUM} x {NUM} políčok @@ -3186,7 +3183,7 @@ STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Detaily STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}Informácia nie je k dispozícii STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING} STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: {WHITE}{STRING} -STR_SAVELOAD_FILTER_TITLE :{BLACK}Filtrovací reťazec: +STR_SAVELOAD_FILTER_TITLE :{BLACK}Filter: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Prepísanie súboru STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Ste si istý, že chcete prepísať existujúci súbor? STR_SAVELOAD_DIRECTORY :{STRING} (Priečinok) @@ -3200,6 +3197,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Veľkos STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Výber veľkosti mapy v políčkach. Počet dostupných políčok bude o trochu nižší STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Počet miest: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Názvy miest: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Výber štýlu názvov miest STR_MAPGEN_DATE :{BLACK}Rok: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Počet priemyslu: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Najvyšší vrchol: @@ -3215,11 +3214,40 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Zníži STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Generátor krajiny: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Typ terénu: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Rozloha mora: +STR_MAPGEN_SEA_LEVEL :{BLACK}Rozloha mora: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Rieky: STR_MAPGEN_SMOOTHNESS :{BLACK}Členitosť: STR_MAPGEN_VARIETY :{BLACK}Rozmanitosť distribúcie: STR_MAPGEN_GENERATE :{WHITE}Generovať +STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}Nastavenia NewGRF +STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Zobraziť nastavenia NewGRF +STR_MAPGEN_AI_SETTINGS :{BLACK}Nastavenia AI +STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Zobraziť AI nastavenia +STR_MAPGEN_GS_SETTINGS :{BLACK}Nastavenia skriptu +STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Zobraz nastavenia skriptu + +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Anglické (pôvodné) +STR_MAPGEN_TOWN_NAME_FRENCH :Francúzske +STR_MAPGEN_TOWN_NAME_GERMAN :Nemecké +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Anglické (ďalšie) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Latinsko-Americké +STR_MAPGEN_TOWN_NAME_SILLY :Anglické (hlúpe) +STR_MAPGEN_TOWN_NAME_SWEDISH :Švédske +STR_MAPGEN_TOWN_NAME_DUTCH :Holandské +STR_MAPGEN_TOWN_NAME_FINNISH :Fínske +STR_MAPGEN_TOWN_NAME_POLISH :Poľské +STR_MAPGEN_TOWN_NAME_SLOVAK :Slovenské +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Nórske +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Maďarské +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Rakúske +STR_MAPGEN_TOWN_NAME_ROMANIAN :Rumunské +STR_MAPGEN_TOWN_NAME_CZECH :České +STR_MAPGEN_TOWN_NAME_SWISS :Švajčiarské +STR_MAPGEN_TOWN_NAME_DANISH :Dánske +STR_MAPGEN_TOWN_NAME_TURKISH :Turecké +STR_MAPGEN_TOWN_NAME_ITALIAN :Talianské +STR_MAPGEN_TOWN_NAME_CATALAN :Katalánske # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Okraje mapy: @@ -3278,7 +3306,7 @@ STR_NEWGRF_SETTINGS_INFO_TITLE :{WHITE}Detailn STR_NEWGRF_SETTINGS_ACTIVE_LIST :{WHITE}Aktívne NewGRF súbory STR_NEWGRF_SETTINGS_INACTIVE_LIST :{WHITE}Neaktívne NewGRF súbory STR_NEWGRF_SETTINGS_SELECT_PRESET :{ORANGE}Vybrať predvoľbu: -STR_NEWGRF_FILTER_TITLE :{ORANGE}Filtrovací reťazec: +STR_NEWGRF_FILTER_TITLE :{ORANGE}Filter: STR_NEWGRF_SETTINGS_PRESET_LIST_TOOLTIP :{BLACK}Nahrať vybraný zoznam STR_NEWGRF_SETTINGS_PRESET_SAVE :{BLACK}Uložit zoznam STR_NEWGRF_SETTINGS_PRESET_SAVE_TOOLTIP :{BLACK}Uložiť aktuálne nastavenie ako zoznam @@ -3365,6 +3393,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Predchá STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Prejsť na predchádzajúci normálny sprite, vynechajúc akékoľvek falošné/prefarbené sprites a sprites fontu použité na začiatku STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Reprezentuje aktuálne zvolený sprite. Zarovnanie je ignorované pri vykresľovaní sprite-u STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Posúvajte sprite, so súčasnou zmenou X a Y súradnice. Ctrl+klik posunie sprite o osem jednotiek súčasne + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Resetovať relatívne STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Resetovať aktuálne relatívne posunutie STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X offset: {NUM}, Y offset: {NUM} (absolútne) @@ -3382,15 +3414,15 @@ STR_NEWGRF_ERROR_MSG_FATAL :{RED}Kritická STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Nastala závažná chyba NewGRF:{}{STRING} STR_NEWGRF_ERROR_POPUP :{WHITE}Vyskytla sa chyba NewGRF:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} nebude fungovať s TTDPatch verziou nahlásenou OpenTTD. -STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} je pre verziu {STRING} TTD. -STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} je navrhnutý pre použitie s {STRING} -STR_NEWGRF_ERROR_INVALID_PARAMETER :Neplatný parameter {1:STRING}: parameter {STRING} ({NUM}) -STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} musí byť načítaný pred {STRING} -STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} musí byť načítaný po {STRING} -STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} vyžaduje verziu OpenTTD {STRING} alebo vyššiu. +STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} je pre verziu {2:STRING} TTD +STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} je navrhnutý pre použitie s {2:STRING} +STR_NEWGRF_ERROR_INVALID_PARAMETER :Neplatný parameter {1:STRING}: parameter {2:STRING} ({3:NUM}) +STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} musí byť načítaný pred {2:STRING} +STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} musí byť načítaný po {2:STRING} +STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} vyžaduje verziu OpenTTD {2:STRING} alebo vyššiu STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :GRF súbor bol navrhnutý na preklad STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Načítaných priveľa súborov NewGRF. -STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Načítanie {1:STRING} ako statického NewGRF s {STRING} môže spôsobiť chybné zobrazenie. +STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Načítanie {1:STRING} ako statického NewGRF s {2:STRING} môže spôsobiť chybné zobrazenie STR_NEWGRF_ERROR_UNEXPECTED_SPRITE :Neočakávaný sprite (sprite {3:NUM}) STR_NEWGRF_ERROR_UNKNOWN_PROPERTY :Neznáma vlastnosť Action 0 {4:HEX} (sprite {3:NUM}) STR_NEWGRF_ERROR_INVALID_ID :Pokus o použitie neplatného ID (sprite {3:NUM}) @@ -3522,14 +3554,14 @@ STR_LOCAL_AUTHORITY_ACTION_EXCLUSIVE_TRANSPORT :Zakúpiť exklu STR_LOCAL_AUTHORITY_ACTION_BRIBE :Podplatiť miestnu správu ###length 8 -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{YELLOW}Spustiť malú reklamnú kampaň, ktorá priláka viac cestujúcich a nákladu k vašej spoločnosti.{}Zabezpečí dočasné zvýšenie hodnotenia staníc v malom okruhu okolo centra mesta.{}Cena: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{YELLOW}Spustiť strednú reklamnú kampaň, ktorá priláka viac cestujúcich a nákladu k vašej spoločnosti.{}Zabezpečí dočasné zvýšenie hodnotenia staníc v stredne veľkom okruhu okolo centra mesta.{}Cena: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{YELLOW}Spustiť veľkú reklamnú kampaň, ktorá priláka viac cestujúcich a nákladu k vašej spoločnosti.{}Zabezpečí dočasné zvýšenie hodnotenia staníc vo veľkom okruhu okolo centra mesta.{}Cena: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{YELLOW}Financovať rekonštrukciu mestskej cestnej siete.{}Spôsobí dopravný chaos a zápchy trvajúce ďalších 6 mesiacov.{}Cena: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{YELLOW}Postaviť sochu na počesť vašej spoločnosti.{}Zabezpečí trvalé zvýšenie hodnotenia staníc v tomto meste.{}Cena: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{YELLOW}Financovať výstavbu nových budov v meste.{}Zabezpečí dočasné zrýchlenie rastu tohto mesta.{}Cena: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW}Zakúpiť exkluzívne dopravné práva v meste na 1 rok.{}Miestna správa nedovolí cestujúcim a nákladu používať stanice konkurentov.{}Cena: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Podplatiť miestnu správu pre zvýšenie hodnotenia vašej spoločnosti, s rizikom ťažkého postihu pri odhalení.{}Cena: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{YELLOW}Spustiť malú reklamnú kampaň, ktorá priláka viac cestujúcich a nákladu k vašej spoločnosti.{}Zabezpečí dočasné zvýšenie hodnotenia staníc v malom okruhu okolo centra mesta.{}{POP_COLOUR}Cena: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{PUSH_COLOUR}{YELLOW}Spustiť strednú reklamnú kampaň, ktorá priláka viac cestujúcich a nákladu k vašej spoločnosti.{}Zabezpečí dočasné zvýšenie hodnotenia staníc v stredne veľkom okruhu okolo centra mesta.{}{POP_COLOUR}Cena: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}Spustiť veľkú reklamnú kampaň, ktorá priláka viac cestujúcich a nákladu k vašej spoločnosti.{}Zabezpečí dočasné zvýšenie hodnotenia staníc vo veľkom okruhu okolo centra mesta.{}{POP_COLOUR}Cena: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{PUSH_COLOUR}{YELLOW}Financovať rekonštrukciu mestskej cestnej siete.{}Spôsobí dopravný chaos a zápchy trvajúce ďalších 6 mesiacov.{}{POP_COLOUR}Cena: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Postaviť sochu na počesť vašej spoločnosti.{}Zabezpečí trvalé zvýšenie hodnotenia staníc v tomto meste.{}{POP_COLOUR}Cena: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Financovať výstavbu nových budov v meste.{}Zabezpečí dočasné zrýchlenie rastu tohto mesta.{}{POP_COLOUR}Cena: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}Zakúpiť exkluzívne dopravné práva v meste na 1 rok.{}Miestna správa nedovolí cestujúcim a nákladu používať stanice konkurentov.{}{POP_COLOUR}Cena: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Podplatiť miestnu správu pre zvýšenie hodnotenia vašej spoločnosti, s rizikom ťažkého postihu pri odhalení.{}{POP_COLOUR}Cena: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}{COMPANY} Ciele @@ -3682,24 +3714,38 @@ STR_FINANCES_CAPTION :{WHITE}Financie STR_FINANCES_YEAR :{WHITE}{NUM} ###length 3 +STR_FINANCES_REVENUE_TITLE :{WHITE}Výnosy +STR_FINANCES_OPERATING_EXPENSES_TITLE :{WHITE}Prevádzkové náklady +STR_FINANCES_CAPITAL_EXPENSES_TITLE :{WHITE}Kapitálové výdavky ###length 13 STR_FINANCES_SECTION_CONSTRUCTION :{GOLD}Výstavba STR_FINANCES_SECTION_NEW_VEHICLES :{GOLD}Nové vozidlá -STR_FINANCES_SECTION_TRAIN_RUNNING_COSTS :{GOLD}Prevádzka vlakov -STR_FINANCES_SECTION_ROAD_VEHICLE_RUNNING_COSTS :{GOLD}Prevádzka cestných vozidiel -STR_FINANCES_SECTION_AIRCRAFT_RUNNING_COSTS :{GOLD}Prevádzka lietadiel -STR_FINANCES_SECTION_SHIP_RUNNING_COSTS :{GOLD}Prevádzka lodí +STR_FINANCES_SECTION_TRAIN_RUNNING_COSTS :{GOLD}Vlaky +STR_FINANCES_SECTION_ROAD_VEHICLE_RUNNING_COSTS :{GOLD}Cestné vozidlá +STR_FINANCES_SECTION_AIRCRAFT_RUNNING_COSTS :{GOLD}Lietadlá +STR_FINANCES_SECTION_SHIP_RUNNING_COSTS :{GOLD}Lode +STR_FINANCES_SECTION_INFRASTRUCTURE :{GOLD}Infraštruktúra +STR_FINANCES_SECTION_TRAIN_REVENUE :{GOLD}Vlaky +STR_FINANCES_SECTION_ROAD_VEHICLE_REVENUE :{GOLD}Cestné vozidlá +STR_FINANCES_SECTION_AIRCRAFT_REVENUE :{GOLD}Lietadlá +STR_FINANCES_SECTION_SHIP_REVENUE :{GOLD}Lode STR_FINANCES_SECTION_LOAN_INTEREST :{GOLD}Úroky STR_FINANCES_SECTION_OTHER :{GOLD}Ostatné -STR_FINANCES_NEGATIVE_INCOME :{BLACK}-{CURRENCY_LONG} -STR_FINANCES_POSITIVE_INCOME :{BLACK}+{CURRENCY_LONG} +STR_FINANCES_TOTAL_CAPTION :{WHITE}Spolu +STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} +STR_FINANCES_ZERO_INCOME :{CURRENCY_LONG} +STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} +STR_FINANCES_PROFIT :{WHITE}Zisk STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Zostatok na účte v banke +STR_FINANCES_OWN_FUNDS_TITLE :{WHITE}Vlastné prostriedky STR_FINANCES_LOAN_TITLE :{WHITE}Úver +STR_FINANCES_INTEREST_RATE :{WHITE}Úroky: {BLACK}{NUM}% STR_FINANCES_MAX_LOAN :{WHITE}Maximálny úver: {BLACK}{CURRENCY_LONG} STR_FINANCES_TOTAL_CURRENCY :{BLACK}{CURRENCY_LONG} +STR_FINANCES_BANK_BALANCE :{WHITE}{CURRENCY_LONG} STR_FINANCES_BORROW_BUTTON :{BLACK}Požičať {CURRENCY_LONG} STR_FINANCES_BORROW_TOOLTIP :{BLACK}Zvýšiť veľkosť úveru. Crtl+klik požičia koľko sa dá STR_FINANCES_REPAY_BUTTON :{BLACK}Splatiť {CURRENCY_LONG} @@ -3800,7 +3846,7 @@ STR_INDUSTRY_VIEW_PRODUCES_N_CARGO :{BLACK}Produkuj STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :, {STRING}{STRING} STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Vyžaduje: -STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{0:STRING}{BLACK}{3:STRING} STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} čak{P á ajú á}{STRING} STR_CONFIG_GAME_PRODUCTION :{WHITE}Zmeniť produkciu (násobky 8, až do 2040) @@ -3829,7 +3875,9 @@ STR_VEHICLE_LIST_MANAGE_LIST :{BLACK}Možnost STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Zadať príkazy všetkým vozidlám v zozname STR_VEHICLE_LIST_REPLACE_VEHICLES :Vymeniť vozidlá STR_VEHICLE_LIST_SEND_FOR_SERVICING :Vykonať servis -STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Profit tento rok: {CURRENCY_LONG} (minulý rok: {CURRENCY_LONG}) +STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Zisk tento rok: {CURRENCY_LONG} (minulý rok: {CURRENCY_LONG}) +STR_VEHICLE_LIST_CARGO :{TINY_FONT}{BLACK}[{CARGO_LIST}] +STR_VEHICLE_LIST_NAME_AND_CARGO :{TINY_FONT}{BLACK}{STRING} {STRING} STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Poslať do depa STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Poslať do garáže @@ -3872,8 +3920,8 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Odstrániť vš STR_GROUP_RENAME_CAPTION :{BLACK}Premenovať skupinu -STR_GROUP_PROFIT_THIS_YEAR :Profit v tomto roku: -STR_GROUP_PROFIT_LAST_YEAR :Profit v minulom roku: +STR_GROUP_PROFIT_THIS_YEAR :Zisk v tomto roku: +STR_GROUP_PROFIT_LAST_YEAR :Zisk v minulom roku: STR_GROUP_OCCUPANCY :Súčasné využitie: STR_GROUP_OCCUPANCY_VALUE :{NUM}% @@ -3921,6 +3969,11 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Max. tra STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Dolet: {GOLD}{COMMA} políčok STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Typ lietadla: {GOLD}{STRING} +###length 3 +STR_CARGO_TYPE_FILTER_ALL :Všetky druhy nákladu +STR_CARGO_TYPE_FILTER_FREIGHT :Nákladné +STR_CARGO_TYPE_FILTER_NONE :Žiadne + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Výber vlakov. Pre získanie informácií klikni na vlak. CTRL+klik prepne skrytie typu vlaku. STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Výber cestných vozidiel. Pre získanie informácií klikni na vozidlo. CTRL+klik prepne skrytie typu vozidla. @@ -4089,7 +4142,7 @@ STR_ENGINE_PREVIEW_AIRCRAFT :{G=s}lietadlo STR_ENGINE_PREVIEW_SHIP :{G=z}loď STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Cena: {CURRENCY_LONG} Hmotnosť: {WEIGHT_SHORT}{}Rýchlosť: {VELOCITY} Výkon: {POWER}{}Prevádzkové náklady: {CURRENCY_LONG}/rok{}Kapacita: {CARGO_LONG} -STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Cena: {CURRENCY_LONG} Hmotnosť: {WEIGHT_SHORT}{}Rýchlosť: {VELOCITY} Sila: {POWER} Max. T.E.: {6:FORCE}{}Prevádzkové náklady: {4:CURRENCY_LONG}/yr{}Kapacita: {5:CARGO_LONG} +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Cena: {0:CURRENCY_LONG} Váha: {1:WEIGHT_SHORT}{}Rýchlosť: {2:VELOCITY} Výkon: {3:POWER} Max. trakčná sila: {6:FORCE}{}Prevádzkové náklady: {4:CURRENCY_LONG}/rok{}Kapacita: {5:CARGO_LONG} STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Cena: {CURRENCY_LONG} Max. Rýchlosť: {VELOCITY}{}Kapacita: {CARGO_LONG}{}Prevádzkové náklady: {CURRENCY_LONG}/rok STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Cena: {CURRENCY_LONG} Rýchlosť: {VELOCITY}{}Typ lietadla: {STRING}{}Kapacita: {CARGO_LONG}, {CARGO_LONG}{}Prevádzkové náklady: {CURRENCY_LONG}/rok STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Cena: {CURRENCY_LONG} Rýchlosť: {VELOCITY}{}Typ lietadla: {STRING}{}Kapacita: {CARGO_LONG}{}Prevádzkové náklady: {CURRENCY_LONG}/rok @@ -4247,13 +4300,14 @@ STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Rýchlos STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Hmotnosť: {LTBLUE}{WEIGHT_SHORT} {BLACK}Sila: {LTBLUE}{POWER}{BLACK} Max. rýchlosť: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Hmotnosť: {LTBLUE}{WEIGHT_SHORT} {BLACK}Sila: {LTBLUE}{POWER}{BLACK} Max. rýchlosť: {LTBLUE}{VELOCITY} {BLACK}Max. T.E.: {LTBLUE}{FORCE} -STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Profit tento rok: {LTBLUE}{CURRENCY_LONG} (minulý rok: {CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Zisk v tomto roku: {LTBLUE}{CURRENCY_LONG} (minulý rok: {CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Zisk v tomto roku: {LTBLUE}{CURRENCY_LONG} (minulý rok: {CURRENCY_LONG}) {BLACK}Min. výkon: {LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Spoľahlivosť: {LTBLUE}{COMMA}% {BLACK}Poruchy od posledného servisu: {LTBLUE}{COMMA} STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Vyrobený: {LTBLUE}{NUM}{BLACK} Cena: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_INFO_NO_CAPACITY :{BLACK}Kapacita: {LTBLUE}Žiadna{STRING} -STR_VEHICLE_INFO_CAPACITY :{BLACK}Kapacita: {LTBLUE}{CARGO_LONG}{3:STRING} -STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Kapacita: {LTBLUE}{CARGO_LONG}{3:STRING} (x{4:NUM}) +STR_VEHICLE_INFO_CAPACITY :{BLACK}Kapacita: {LTBLUE}{0:CARGO_LONG}{3:STRING} +STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Kapacita: {LTBLUE}{0:CARGO_LONG}{3:STRING} (x{4:NUM}) STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Kapacita: {LTBLUE}{CARGO_LONG}, {CARGO_LONG}{STRING} STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Transfer kredity: {LTBLUE}{CURRENCY_LONG} @@ -4279,8 +4333,8 @@ STR_VEHICLE_DETAILS_TRAIN_ENGINE_BUILT_AND_VALUE :{LTBLUE}{ENGINE STR_VEHICLE_DETAILS_TRAIN_WAGON_VALUE :{LTBLUE}{ENGINE}{BLACK} Hodnota: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY_TEXT :{BLACK}Celkový náklad (kapacita) tohto vlaku: -STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY :{LTBLUE}- {CARGO_LONG} ({CARGO_SHORT}) -STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY_MULT :{LTBLUE}- {CARGO_LONG} ({CARGO_SHORT}) (x{NUM}) +STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY :{LTBLUE}{CARGO_LONG} ({CARGO_SHORT}) +STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY_MULT :{LTBLUE}{CARGO_LONG} ({CARGO_SHORT}) (x{NUM}) STR_VEHICLE_DETAILS_CARGO_EMPTY :{LTBLUE}Prázdny STR_VEHICLE_DETAILS_CARGO_FROM :{LTBLUE}{CARGO_LONG} z {STATION} @@ -4519,7 +4573,7 @@ STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Tento ce STR_TIMETABLE_STATUS_START_AT :{BLACK}Tento cestovný poriadok začne {STRING} STR_TIMETABLE_STARTING_DATE :{BLACK}Začiatočný dátum -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Vyberte dátum začiatku cestovného poriadku. Ctrl+klik nastaví počiatočný dátum tohto cestovného poriadku pre všetky vozidlá zdieľajúce tieto príkazy na základe ich relatívneho poradia, ak je cestovný poriadok kompletne vyplnený +STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Vyberte dátum začiatku cestovného poriadku. Ctrl+klik rozdelí od daného dátumu rovnomerne všetky vozidlá zdieľajúce tieto príkazy na základe ich relatívneho poradia, ak je cestovný poriadok kompletne vyplnený STR_TIMETABLE_CHANGE_TIME :{BLACK}Zmeniť čas STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Zmeniť dĺžku trvania označeného príkazu @@ -4581,12 +4635,14 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Jeden z STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Okno ladenia AI/skriptu je dostupné len pre server # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Nastavenia AI/skriptu +STR_AI_CONFIG_CAPTION_AI :{WHITE}Konfigurácia AI +STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Konfigurácia skriptu STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Skript, ktorý bude načítaný v ďalšej hre STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}AI, ktoré budú načítané v ďalšiej hre STR_AI_CONFIG_HUMAN_PLAYER :Človek STR_AI_CONFIG_RANDOM_AI :Náhodná AI STR_AI_CONFIG_NONE :(žiadne) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Maximálny počet konkurentov: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Posunúť vyššie STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Posunúť vyššie vybrané AI v zozname @@ -4594,12 +4650,11 @@ STR_AI_CONFIG_MOVE_DOWN :{BLACK}Posunú STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Posunúť nižšie vybrané AI v zozname STR_AI_CONFIG_GAMESCRIPT :{SILVER}Herný skript +STR_AI_CONFIG_GAMESCRIPT_PARAM :{SILVER}Parametre STR_AI_CONFIG_AI :{SILVER}AI (umelá inteligencia) -STR_AI_CONFIG_CHANGE :{BLACK}Vybrať {STRING} -STR_AI_CONFIG_CHANGE_NONE : -STR_AI_CONFIG_CHANGE_AI :AI -STR_AI_CONFIG_CHANGE_GAMESCRIPT :Skript +STR_AI_CONFIG_CHANGE_AI :{BLACK}Vyber AI +STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}Vyber skript STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Spusti ďalší skript STR_AI_CONFIG_CONFIGURE :{BLACK}Nastaviť STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Nastaviť parametre skriptu @@ -4628,9 +4683,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Snímka STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Snímka minimapy # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametre -STR_AI_SETTINGS_CAPTION_AI :Umelá inteligencia -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Skript +STR_AI_SETTINGS_CAPTION_AI :{WHITE}Parametre AI STR_AI_SETTINGS_CLOSE :{BLACK}Zavrieť STR_AI_SETTINGS_RESET :{BLACK}Resetovať STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4975,6 +5028,7 @@ STR_ERROR_OBJECT_IN_THE_WAY :{WHITE}V ceste STR_ERROR_COMPANY_HEADQUARTERS_IN :{WHITE}... sídlo spoločnosti v ceste STR_ERROR_CAN_T_PURCHASE_THIS_LAND :{WHITE}Tento pozemok nie je možné kúpiť... STR_ERROR_YOU_ALREADY_OWN_IT :{WHITE}... už to vlastníš! +STR_ERROR_BUILD_OBJECT_LIMIT_REACHED :{WHITE}... dosiahnutý stavebný limit objektu # Group related errors STR_ERROR_GROUP_CAN_T_CREATE :{WHITE}Nie je možné vytvoriť skupinu... @@ -5047,6 +5101,8 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Nemožno STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... vozidlo je zničené +STR_ERROR_CAN_T_CLONE_VEHICLE_LIST :{WHITE}... nie všetky vozidlá sú rovnaké + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Žiadne vozidlá nebudú k dispozícii STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Zmena vašej konfigurácie NewGRF STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Zatiaľ nie sú dostupné žiadne vozidlá @@ -5073,6 +5129,8 @@ STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}Nie je m STR_ERROR_CAN_T_COPY_SHARE_ORDER :{WHITE}... vozidlo nemôže ísť do všetkých staníc STR_ERROR_CAN_T_ADD_ORDER :{WHITE}... vozidlo nemôže ísť do tejto stanice STR_ERROR_CAN_T_ADD_ORDER_SHARED :{WHITE}... vozidlo zdieľajúce tento príkaz nemôže ísť do stanice +STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST :{WHITE}... nie všetky vozidlá majú rovnaké príkazy +STR_ERROR_CAN_T_SHARE_ORDER_VEHICLE_LIST :{WHITE}... nie všetky vozidlá zdieľajú príkazy STR_ERROR_CAN_T_SHARE_ORDER_LIST :{WHITE}Nemožno zdieľať zoznam príkazov ... STR_ERROR_CAN_T_STOP_SHARING_ORDER_LIST :{WHITE}Nie je možné prestať zdieľať zoznam príkazov... diff --git a/src/lang/slovenian.txt b/src/lang/slovenian.txt index 39a1b4f5dc..5cc0f79079 100644 --- a/src/lang/slovenian.txt +++ b/src/lang/slovenian.txt @@ -350,6 +350,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}KM STR_UNITS_POWER_METRIC :{COMMA}KM STR_UNITS_POWER_SI :{COMMA} kW + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA} t STR_UNITS_WEIGHT_SHORT_SI :{COMMA} kg @@ -528,10 +529,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Izhod # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Možnosti igre STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Nastavitve -STR_SETTINGS_MENU_SCRIPT_SETTINGS :UI/Nastavitve skriptov igre STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF nastavitve STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Nastavitve prozornega pogleda STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Imena mest prikazana @@ -1081,36 +1081,6 @@ STR_GAME_OPTIONS_CURRENCY_GEL :Gruzijski Lari STR_GAME_OPTIONS_CURRENCY_IRR :Iranski Rial (IRR) STR_GAME_OPTIONS_CURRENCY_HKD :Hong Kongški dolar (HKD) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Vožnja po levi -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Vožnja po desni - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Imena mest -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Izberi slog imena mest - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Angleška (Originalna) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Francoska -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Nemška -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Angleška (Dodatna) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Latinsko-Ameriška -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Butasta -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Švedska -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Nizozemska -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finska -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Poljska -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slovaška -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norveška -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Madžarska -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Avstrijska -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Romunska -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Češka -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Švicarska -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Danska -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turška -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italijanska -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Katalonska - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Samodejno shrani STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Izberi časovni interval samodejnega shranjevanja igre @@ -1135,15 +1105,8 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :drugo -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Velikost vmesnika -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Izberi velikost elementa vmesnika - -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normalno -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Dvojna velikost -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Velikost kvadrata -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(samodejno zaznaj) @@ -1190,8 +1153,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Predogl STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 funtov (£) v tvoji valuti STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Zamenjaj parameter valute po meri -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Največje število tekmecev: {ORANGE}{COMMA} - STR_NONE :Brez STR_FUNDING_ONLY :Samo financiranje STR_MINIMAL :Minimalno @@ -1241,6 +1202,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Zmerno podnebje +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Sub arktično podnebje +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Sub tropsko podnebje +STR_CLIMATE_TOYLAND_LANDSCAPE :Pokrajina v deželi igrač + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Zelo raven STR_TERRAIN_TYPE_FLAT :Raven @@ -1574,6 +1541,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Izboljšan STR_CONFIG_SETTING_ROAD_SIDE :Cestna vozila: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Izberi stran vožnje +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Vožnja po levi +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Vožnja po desni + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Zasuk višinskega zemljevida: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Nasprotno urini smeri @@ -2053,7 +2024,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Avtomatično ob STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Dovoli vlakom obračanje na signalih, če so tam čakali že dolgo. ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Priporočeno) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Priporočeno) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Spremeni vrednost @@ -2094,7 +2065,6 @@ STR_INTRO_HIGHSCORE :{BLACK}Tabela n STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Nastavitve STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF nastavitve STR_INTRO_ONLINE_CONTENT :{BLACK}Preveri razpoložljive vsebine -STR_INTRO_SCRIPT_SETTINGS :{BLACK}UI / Nastavitve skriptov igre STR_INTRO_QUIT :{BLACK}Izhod STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Začni novo igro. Ctrl+Klik preskoči konfiguracijo sveta @@ -2114,7 +2084,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Prikaži STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Nastavitve zaslona STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Prikaži nastavitve NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Preveri posodobljene vsebine na strežniku,{} ki so na voljo za prenos -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Prikaži UI in Nastavitve skriptov igre STR_INTRO_TOOLTIP_QUIT :{BLACK}Izhod iz 'OpenTTD' STR_INTRO_TRANSLATION :{BLACK}Temu prevodu manjka {NUM} vnos{P "" a i ov}. Prosimo pomagaj izboljšati OpenTTD in se vpiši za prevajanje. Preveri readme.txt za podrobnosti. @@ -2143,12 +2112,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Spremen STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Spremeni trenutno leto STR_CHEAT_SETUP_PROD :{LTBLUE}Omogoči spreminjanje proizvodnih vrednosti: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Zmerno podnebje -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Sub arktično podnebje -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Sub tropsko podnebje -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Pokrajina v deželi igrač - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Barvna shema @@ -3000,16 +2963,41 @@ STR_MAPGEN_MAPSIZE :{BLACK}Velikost STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Izberi velikost zemljevida v ploščah. Število plošč na voljo bo nekoliko nižje. STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Število mest: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Imena mest +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Izberi slog imena mest STR_MAPGEN_DATE :{BLACK}Datum: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Število industrij: STR_MAPGEN_LAND_GENERATOR :{BLACK}Ustvarjalec terena: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Tip terena: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Morska gladina: +STR_MAPGEN_SEA_LEVEL :{BLACK}Morska gladina: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Reke: STR_MAPGEN_SMOOTHNESS :{BLACK}Glajenje: STR_MAPGEN_VARIETY :{BLACK}Raznolika distribucija: STR_MAPGEN_GENERATE :{WHITE}Ustvari +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Angleška (Originalna) +STR_MAPGEN_TOWN_NAME_FRENCH :Francoska +STR_MAPGEN_TOWN_NAME_GERMAN :Nemška +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Angleška (Dodatna) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Latinsko-Ameriška +STR_MAPGEN_TOWN_NAME_SILLY :Butasta +STR_MAPGEN_TOWN_NAME_SWEDISH :Švedska +STR_MAPGEN_TOWN_NAME_DUTCH :Nizozemska +STR_MAPGEN_TOWN_NAME_FINNISH :Finska +STR_MAPGEN_TOWN_NAME_POLISH :Poljska +STR_MAPGEN_TOWN_NAME_SLOVAK :Slovaška +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norveška +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Madžarska +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Avstrijska +STR_MAPGEN_TOWN_NAME_ROMANIAN :Romunska +STR_MAPGEN_TOWN_NAME_CZECH :Češka +STR_MAPGEN_TOWN_NAME_SWISS :Švicarska +STR_MAPGEN_TOWN_NAME_DANISH :Danska +STR_MAPGEN_TOWN_NAME_TURKISH :Turška +STR_MAPGEN_TOWN_NAME_ITALIAN :Italijanska +STR_MAPGEN_TOWN_NAME_CATALAN :Katalonska + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Robovi ozemlja: STR_MAPGEN_NORTHWEST :{BLACK}Severozahod @@ -3145,6 +3133,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Prejšnj STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Nadaljuj k prejšnji navadni sličici, zanemari vse navidezne/pobarvane/besedilne sličice in okvir na koncu STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Predstavitev trenutno izbrane sličice. Zamik je zanemarjen pri risanju te sličice STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Premakni sličico naokrog s spreminjanjem X in Y osi. Ctrl-Klik za premik sličice 8 enot v koraku + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Resetiraj relativno STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Resetiraj zdajšne relativne odmike STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X odmik: {NUM}, Y odmik: {NUM} (Absolutno) @@ -3656,6 +3648,8 @@ STR_PURCHASE_INFO_ALL_BUT :Vse, razen {CAR STR_PURCHASE_INFO_MAX_TE :{BLACK}Največja vlečna moč: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Domet: {GOLD}{COMMA} polj +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Seznam železniških vozil - klikni na vozilo za informacije STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Seznam cestnih vozil - klikni na vozilo za informacije @@ -4280,12 +4274,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Ena izme STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Okno razhroščevanja UI / skripte je na voljo samo za strežnik # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Nastavitve UI / skript igre STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Skript igre, ki bo naložen v naslednji igri STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}UI, ki bodo naložene v naslednji igri STR_AI_CONFIG_HUMAN_PLAYER :Igralec STR_AI_CONFIG_RANDOM_AI :Naključni UI STR_AI_CONFIG_NONE :(brez) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Največje število tekmecev: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Premakni višje STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Premakni izbran UI višje po seznamu @@ -4295,8 +4289,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Premakni STR_AI_CONFIG_GAMESCRIPT :{SILVER}Skripta igre STR_AI_CONFIG_AI :{SILVER}UI-ji -STR_AI_CONFIG_CHANGE :{BLACK}Izberi {STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :UI STR_AI_CONFIG_CHANGE_GAMESCRIPT :Skripta igre STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Naloži drugi skript @@ -4320,9 +4312,7 @@ STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Ne sprem # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametri STR_AI_SETTINGS_CAPTION_AI :UI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Skripta igre STR_AI_SETTINGS_CLOSE :{BLACK}Zapri STR_AI_SETTINGS_RESET :{BLACK}Resetiraj STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4728,6 +4718,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Ni mogo STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... vozilo je uničeno + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Sploh ni razpoložljivih vozil STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Zamenjaj svojo NewGRF konfiguracijo STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Ni še vozil na razpolago. diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt index 538267a815..f617245262 100644 --- a/src/lang/spanish.txt +++ b/src/lang/spanish.txt @@ -201,6 +201,16 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}hp STR_UNITS_POWER_METRIC :{COMMA}{NBSP}cv STR_UNITS_POWER_SI :{COMMA}{NBSP}kW +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_SI :{DECIMAL}{NBSP}hp/Mg +STR_UNITS_POWER_METRIC_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}cv/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}cv/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_SI :{DECIMAL}{NBSP}cv/Mg +STR_UNITS_POWER_SI_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_SI :{DECIMAL}{NBSP}W/kg + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -226,9 +236,9 @@ STR_UNITS_HEIGHT_METRIC :{COMMA}{NBSP}m STR_UNITS_HEIGHT_SI :{COMMA}{NBSP}m # Common window strings -STR_LIST_FILTER_TITLE :{BLACK}Patrón de filtrado: -STR_LIST_FILTER_OSKTITLE :{BLACK}Escribe un patrón de filtrado -STR_LIST_FILTER_TOOLTIP :{BLACK}Introduzca una palabra clave para filtrar la lista +STR_LIST_FILTER_TITLE :{BLACK}Filtro: +STR_LIST_FILTER_OSKTITLE :{BLACK}Introduce texto para filtrar +STR_LIST_FILTER_TOOLTIP :{BLACK}Introduce una o varias palabras clave para filtrar la lista STR_TOOLTIP_GROUP_ORDER :{BLACK}Selecciona la orden de agrupamiento STR_TOOLTIP_SORT_ORDER :{BLACK}Selecciona el orden de clasificación (descendiente/ascendiente) @@ -317,7 +327,7 @@ STR_SORT_BY_RANGE :Alcance STR_SORT_BY_POPULATION :Población STR_SORT_BY_RATING :Calificación STR_SORT_BY_NUM_VEHICLES :Número de vehículos -STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Beneficio total del último año +STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Beneficio total del año anterior STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :Beneficio total este año STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Beneficio medio el año pasado STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Beneficio medio este año @@ -379,7 +389,7 @@ STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Construc STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Construcción de tranvía STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Plantar árboles. Mayús permite mostrar una estimación del precio STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Colocar letrero -STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Colocar objeto. Mayús permite mostrar una estimación del precio +STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Colocar objeto. Ctrl permite seleccionar un área diagonalmente. Mayús permite mostrar una estimación del precio # Scenario editor file menu ###length 7 @@ -392,10 +402,11 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Salir # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Opciones de juego STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Configuración -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Configuración de Scripts +STR_SETTINGS_MENU_AI_SETTINGS :Configuración de IA +STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :{BLACK}Configuración de script de juego STR_SETTINGS_MENU_NEWGRF_SETTINGS :Configuración NewGRF STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Opciones de transparencia STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Ver nombres de municipios @@ -437,14 +448,14 @@ STR_SUBSIDIES_MENU_SUBSIDIES :Subvenciones STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH :Gráfica de beneficio operativo STR_GRAPH_MENU_INCOME_GRAPH :Gráfica de ingresos STR_GRAPH_MENU_DELIVERED_CARGO_GRAPH :Gráfica de carga entregada -STR_GRAPH_MENU_PERFORMANCE_HISTORY_GRAPH :Gráfica de rendimiento +STR_GRAPH_MENU_PERFORMANCE_HISTORY_GRAPH :Gráfica de desempeño STR_GRAPH_MENU_COMPANY_VALUE_GRAPH :Gráfica del valor de la empresa -STR_GRAPH_MENU_CARGO_PAYMENT_RATES :Tarifas de pagos por carga +STR_GRAPH_MENU_CARGO_PAYMENT_RATES :Tarifas de pago de cargas # Company league menu ###length 3 STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE :Tabla de clasificación de empresas -STR_GRAPH_MENU_DETAILED_PERFORMANCE_RATING :Detalles del rendimiento +STR_GRAPH_MENU_DETAILED_PERFORMANCE_RATING :Calificación detallada de desempeño STR_GRAPH_MENU_HIGHSCORE :Tabla de puntuaciones # Industry menu @@ -494,7 +505,7 @@ STR_NEWS_MENU_DELETE_ALL_MESSAGES :Borrar todos lo STR_ABOUT_MENU_LAND_BLOCK_INFO :Información del terreno STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Activar consola -STR_ABOUT_MENU_AI_DEBUG :Depuración de Script de juego / IA +STR_ABOUT_MENU_AI_DEBUG :Depuración de script de juego/IA STR_ABOUT_MENU_SCREENSHOT :Captura de pantalla STR_ABOUT_MENU_SHOW_FRAMERATE :Mostrar fotogramas por segundo - FPS STR_ABOUT_MENU_ABOUT_OPENTTD :Acerca de 'OpenTTD' @@ -592,20 +603,20 @@ STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COM STR_GRAPH_OPERATING_PROFIT_CAPTION :{WHITE}Gráfica de Beneficio Operativo STR_GRAPH_INCOME_CAPTION :{WHITE}Gráfica de Ingresos STR_GRAPH_CARGO_DELIVERED_CAPTION :{WHITE}Unidades de carga entregadas -STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION :{WHITE}Calificaciones de rendimiento de empresas (máximo=1000) +STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION :{WHITE}Nivel de desempeño de empresas (máximo=1000) STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Valor de la empresa -STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Tarifa de pago por carga +STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Tarifas de pago de cargas STR_GRAPH_CARGO_PAYMENT_RATES_X_LABEL :{TINY_FONT}{BLACK}Días en tránsito -STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}Pago por entregar 10 unidades (o 1,000 litros) de carga a una distancia de 20 casillas +STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}Pago por entregar 10 unidades (o 10 000 litros) de carga a una distancia de 20 casillas STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLACK}Activar todos STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}Desactivar todos -STR_GRAPH_CARGO_TOOLTIP_ENABLE_ALL :{BLACK}Mostrar todos los tipos de carga en la gráfica de tarifas de pagos por carga -STR_GRAPH_CARGO_TOOLTIP_DISABLE_ALL :{BLACK}Ocultar todos los tipos de carga en la gráfica de tarifas de pagos por carga -STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO :{BLACK}Mostrar/Ocultar gráfica para este tipo de carga +STR_GRAPH_CARGO_TOOLTIP_ENABLE_ALL :{BLACK}Muestra todos los tipos de carga en la gráfica de tarifas de pago de cargas +STR_GRAPH_CARGO_TOOLTIP_DISABLE_ALL :{BLACK}Oculta todos los tipos de carga en la gráfica de tarifas de pago de cargas +STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO :{BLACK}Alterna entre mostrar/ocultar la gráfica para este tipo de carga STR_GRAPH_CARGO_PAYMENT_CARGO :{TINY_FONT}{BLACK}{STRING} -STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP :{BLACK}Muestra detalles del rendimiento +STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP :{BLACK}Muestra detalles del nivel de desempeño # Graph key window STR_GRAPH_KEY_CAPTION :{WHITE}Leyenda de las gráficas @@ -625,21 +636,21 @@ STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_PRESIDENT :Presidente STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TYCOON :Magnate # Performance detail window -STR_PERFORMANCE_DETAIL :{WHITE}Detalle de rendimiento +STR_PERFORMANCE_DETAIL :{WHITE}Detalle de nivel de desempeño STR_PERFORMANCE_DETAIL_KEY :{BLACK}Detalle STR_PERFORMANCE_DETAIL_AMOUNT_CURRENCY :{BLACK}({CURRENCY_SHORT}/{CURRENCY_SHORT}) STR_PERFORMANCE_DETAIL_AMOUNT_INT :{BLACK}({COMMA}/{COMMA}) STR_PERFORMANCE_DETAIL_PERCENT :{WHITE}{NUM}% -STR_PERFORMANCE_DETAIL_SELECT_COMPANY_TOOLTIP :{BLACK}Mostrar detalles de esta empresa +STR_PERFORMANCE_DETAIL_SELECT_COMPANY_TOOLTIP :{BLACK}Muestra detalles para esta empresa ###length 10 STR_PERFORMANCE_DETAIL_VEHICLES :{BLACK}Vehículos: STR_PERFORMANCE_DETAIL_STATIONS :{BLACK}Estaciones: STR_PERFORMANCE_DETAIL_MIN_PROFIT :{BLACK}Beneficio Mín.: -STR_PERFORMANCE_DETAIL_MIN_INCOME :{BLACK}Ingreso Mín.: -STR_PERFORMANCE_DETAIL_MAX_INCOME :{BLACK}Ingreso Máx.: +STR_PERFORMANCE_DETAIL_MIN_INCOME :{BLACK}Beneficio Mín.: +STR_PERFORMANCE_DETAIL_MAX_INCOME :{BLACK}Beneficio Máx.: STR_PERFORMANCE_DETAIL_DELIVERED :{BLACK}Entregado: -STR_PERFORMANCE_DETAIL_CARGO :{BLACK}Carga: +STR_PERFORMANCE_DETAIL_CARGO :{BLACK}Cargas: STR_PERFORMANCE_DETAIL_MONEY :{BLACK}Dinero: STR_PERFORMANCE_DETAIL_LOAN :{BLACK}Préstamo: STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}Total: @@ -647,14 +658,14 @@ STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}Total: ###length 10 STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP :{BLACK}Cantidad de vehículos que obtuvieron beneficios el año pasado. Incluye vehículos de carretera, trenes, barcos y aeronaves STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}Cantidad de partes de estación que han tenido servicio. Las estaciones de tren, paradas de autobús, aeropuertos y demás son contabilizadas por separado, incluso si pertenecen a la misma estación -STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP :{BLACK}Beneficio del vehículo con menores ingresos (considerando sólo vehículos con más de 2 años) -STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}Cantidad de dinero ganado en el trimestre con el beneficio más bajo de los pasados 12 trimestres -STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP :{BLACK}Cantidad de dinero ganado en el trimestre con el beneficio más alto de los pasados 12 trimestres -STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP :{BLACK}Unidades de carga entregadas en los pasados cuatro trimestres +STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP :{BLACK}Beneficio del vehículo menos rentable (considerando sólo vehículos con más de 2 años) +STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}Cantidad de dinero ganado en el trimestre con el menor beneficio de los últimos 12 trimestres +STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP :{BLACK}Cantidad de dinero ganado en el trimestre con el mayor beneficio de los últimos 12 trimestres +STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP :{BLACK}Unidades de carga entregadas en los cuatro últimos trimestres STR_PERFORMANCE_DETAIL_CARGO_TOOLTIP :{BLACK}Número de tipos de carga entregados en el último trimestre STR_PERFORMANCE_DETAIL_MONEY_TOOLTIP :{BLACK}Cantidad de dinero que esta empresa tiene en el banco STR_PERFORMANCE_DETAIL_LOAN_TOOLTIP :{BLACK}Cantidad de dinero que esta empresa ha recibido como préstamo -STR_PERFORMANCE_DETAIL_TOTAL_TOOLTIP :{BLACK}Total de puntos ganados del máximo posible +STR_PERFORMANCE_DETAIL_TOTAL_TOOLTIP :{BLACK}Total de puntos obtenidos del máximo posible # Music window STR_MUSIC_JAZZ_JUKEBOX_CAPTION :{WHITE}Selección de Jazz @@ -966,36 +977,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Rupia india (IN STR_GAME_OPTIONS_CURRENCY_IDR :Rupia indonesia (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Ringgit malasio (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Conducir por la izquierda -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Conducir por la derecha - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Nombres de municipios: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Selección del estilo del nombre de los municipios - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Inglés -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Francés -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Alemán -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Inglés (Adicional) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Latinoamericano -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Tontos/Absurdos -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Sueco -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Holandés -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finlandés -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Polaco -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Eslovaco -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Noruego -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Húngaro -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Austríaco -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Rumano -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Checo -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Suizo -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Danés -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turco -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italiano -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Catalán - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Autoguardado STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Selección del intervalo entre guardados automáticos del juego @@ -1012,7 +993,7 @@ STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :{BLACK}Seleccio STR_GAME_OPTIONS_LANGUAGE_PERCENTAGE :{STRING} ({NUM}% completo) STR_GAME_OPTIONS_FULLSCREEN :{BLACK}Pantalla completa -STR_GAME_OPTIONS_FULLSCREEN_TOOLTIP :{BLACK}Marca esta opción para jugar OpenTTD a pantalla completa +STR_GAME_OPTIONS_FULLSCREEN_TOOLTIP :{BLACK}Marca esta casilla para jugar OpenTTD a pantalla completa STR_GAME_OPTIONS_RESOLUTION :{BLACK}Resolución de pantalla STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}Selecciona la resolución de pantalla a usar @@ -1028,21 +1009,19 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Marca es STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Controlador actual: {STRING} -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Tamaño de la interfaz -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Selecciona el tamaño de los elementos de la interfaz a usar +STR_GAME_OPTIONS_GUI_SCALE_FRAME :{BLACK}Tamaño de la interfaz +STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Mueve el control deslizante para seleccionar el tamaño de la interfaz. Presiona Ctrl para seleccionar de forma continua +STR_GAME_OPTIONS_GUI_SCALE_AUTO :{BLACK}Autodetectar tamaño +STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Marca esta casilla para detectar automáticamente el tamaño de la interfaz -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(autodetectar) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Tamaño doble -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Tamaño cuádruple +STR_GAME_OPTIONS_GUI_SCALE_BEVELS :{BLACK}Escalar bordes +STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :{BLACK}Marca esta casilla para escalar los bordes según el tamaño de la interfaz -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Tamaño de fuente -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Selecciona el tamaño de fuente a utilizar en la interfaz - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(autodetectar) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Tamaño doble -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Tamaño cuádruple +STR_GAME_OPTIONS_GUI_SCALE_1X :1x +STR_GAME_OPTIONS_GUI_SCALE_2X :2x +STR_GAME_OPTIONS_GUI_SCALE_3X :3x +STR_GAME_OPTIONS_GUI_SCALE_4X :4x +STR_GAME_OPTIONS_GUI_SCALE_5X :5x STR_GAME_OPTIONS_GRAPHICS :{BLACK}Gráficos @@ -1090,12 +1069,10 @@ STR_CURRENCY_SET_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Configur STR_CURRENCY_DECREASE_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Cambia al Euro antes STR_CURRENCY_INCREASE_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Cambia al Euro después -STR_CURRENCY_PREVIEW :{LTBLUE}Previa: {ORANGE}{CURRENCY_LONG} +STR_CURRENCY_PREVIEW :{LTBLUE}Vista preliminar: {ORANGE} {CURRENCY_LONG} STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 Libras(£) en tu moneda STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Cambiar parámetro de moneda personalizada -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Núm. máximo de jugadores: {ORANGE}{COMMA} - STR_NONE :Ninguno STR_FUNDING_ONLY :Solo fundadas STR_MINIMAL :Mínimo @@ -1145,6 +1122,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Terreno templado +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Terreno subártico +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Terreno subtropical +STR_CLIMATE_TOYLAND_LANDSCAPE :Terreno juguetelandia + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Muy llano STR_TERRAIN_TYPE_FLAT :Llano @@ -1155,7 +1138,7 @@ STR_TERRAIN_TYPE_CUSTOM :Altura personal STR_TERRAIN_TYPE_CUSTOM_VALUE :Altura personalizada ({NUM}) ###length 4 -STR_CITY_APPROVAL_LENIENT :Tolerante +STR_CITY_APPROVAL_LENIENT :Indulgente STR_CITY_APPROVAL_TOLERANT :Tolerante STR_CITY_APPROVAL_HOSTILE :Hostil STR_CITY_APPROVAL_PERMISSIVE :Permisiva (sin efecto sobre las acciones de las compañías) @@ -1164,7 +1147,7 @@ STR_WARNING_NO_SUITABLE_AI :{WHITE}No se ha # Settings tree window STR_CONFIG_SETTING_TREE_CAPTION :{WHITE}Configuración -STR_CONFIG_SETTING_FILTER_TITLE :{BLACK}Patrón de filtrado: +STR_CONFIG_SETTING_FILTER_TITLE :{BLACK}Filtro: STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}Expandir todos STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Colapsar todos STR_CONFIG_SETTING_RESET_ALL :{BLACK}Restablecer valores @@ -1450,6 +1433,8 @@ STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Grosor de las l STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :Mostrar el nombre del NewGRF en la ventana de compra de vehículos: {STRING} STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Añade una línea a la ventana de compra de vehículos, mostrando a qué NewGRF pertenece el vehículo seleccionado. +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS :Mostrar las cargas que pueden llevar los vehículos en las ventanas con listas {STRING} +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS_HELPTEXT :Si se activa, las cargas que los vehículos pueden transportar aparecerán encima de éstos en las listas de vehículos STR_CONFIG_SETTING_LANDSCAPE :Terreno: {STRING} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Los terrenos definen escenarios con diferentes tipos de carga y requisitos de crecimiento de municipios. Es posible modificarlos empleando NewGRF y scripts de juego @@ -1504,6 +1489,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Mejorado STR_CONFIG_SETTING_ROAD_SIDE :Vehículos de carretera: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Selecciona el lado de conducción +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Conducir por la izquierda +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Conducir por la derecha + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Rotación del Mapa de alturas: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Sentido antihorario @@ -1628,7 +1617,7 @@ STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Mostrar horario STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Muestra los tiempos de viaje en los horarios en tics en lugar de en días STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Mostrar salidas y llegadas en los horarios: {STRING} -STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Muestra tiempos de llegada y salida adelantados en los horarios +STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Muestra fechas de llegada y salida previstas en los horarios STR_CONFIG_SETTING_QUICKGOTO :Creación rápida de órdenes para vehículos: {STRING} STR_CONFIG_SETTING_QUICKGOTO_HELPTEXT :Preselecciona el cursor "Ir a" al abrir la ventana de órdenes @@ -1704,7 +1693,7 @@ STR_CONFIG_SETTING_AI_BUILDS_SHIPS :Desactivar barc STR_CONFIG_SETTING_AI_BUILDS_SHIPS_HELPTEXT :Activa esta opción para deshabilitar la construcción de barcos para las IA STR_CONFIG_SETTING_AI_PROFILE :Perfil por defecto: {STRING} -STR_CONFIG_SETTING_AI_PROFILE_HELPTEXT :Selecciona el perfil a usar para IA aleatorias o para los valores iniciales cuando se añade una nueva IA o un Script de juego +STR_CONFIG_SETTING_AI_PROFILE_HELPTEXT :Selecciona el perfil a usar para IA aleatorias o para los valores iniciales cuando se añade una nueva IA o un script de juego ###length 3 STR_CONFIG_SETTING_AI_PROFILE_EASY :Fácil STR_CONFIG_SETTING_AI_PROFILE_MEDIUM :Intermedio @@ -2004,7 +1993,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Métrico (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) STR_CONFIG_SETTING_LOCALISATION :{ORANGE}Localización -STR_CONFIG_SETTING_GRAPHICS :{ORANGE}Gráficas +STR_CONFIG_SETTING_GRAPHICS :{ORANGE}Gráficos STR_CONFIG_SETTING_SOUND :{ORANGE}Efectos de sonido STR_CONFIG_SETTING_INTERFACE :{ORANGE}Interfaz STR_CONFIG_SETTING_INTERFACE_GENERAL :{ORANGE}General @@ -2038,7 +2027,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Cambio de senti STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Permite a los trenes darse la vuelta ante una señal, si han esperado durante un tiempo lo suficientemente largo ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Recomendado) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Recomendado) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Cambiar valor de la opción @@ -2081,7 +2070,8 @@ STR_INTRO_HIGHSCORE :{BLACK}Tabla de STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Configuración STR_INTRO_NEWGRF_SETTINGS :{BLACK}Configuración NewGRF STR_INTRO_ONLINE_CONTENT :{BLACK}Contenido Online -STR_INTRO_SCRIPT_SETTINGS :{BLACK}Configuración de Scripts +STR_INTRO_AI_SETTINGS :{BLACK}Configuración de IA +STR_INTRO_GAMESCRIPT_SETTINGS :{BLACK}Scripts de Juego STR_INTRO_QUIT :{BLACK}Salir STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Comeenza una partida nueva. Ctrl+clic omite la configuración del escenario @@ -2099,9 +2089,10 @@ STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Seleccio STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Muestra las opciones de juego STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Muestra la tabla de puntuaciones STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Muestra la configuración -STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Muestra los ajustes de NewGRF +STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Muestra la configuración de NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Comprueba si hay contenidos nuevos y actualizados para descargar -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Muestra la configuración de Scripts de juego e IA +STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Muestra la configuración de IA +STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Muestra la configuración de script de juego STR_INTRO_TOOLTIP_QUIT :{BLACK}Salir de 'OpenTTD' STR_INTRO_BASESET :{BLACK}El conjunto de gráficos base actualmente seleccionado no encuentra {NUM} sprite{P "" s}. Comprueba si hay actualizaciones para el conjunto base, o usa otro totalmente actualizado. @@ -2133,12 +2124,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Cambiar STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Cambiar año actual STR_CHEAT_SETUP_PROD :{LTBLUE}Permitir modificar los valores de producción: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Terreno templado -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Terreno subártico -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Terreno subtropical -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Terreno juguetelandia - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Esquema de Color @@ -2498,13 +2483,13 @@ STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :esperando actua STR_NETWORK_MESSAGE_CLIENT_LEAVING :abandonando STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} se ha unido a la partida -STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {STRING} se ha unido a la partida (Cliente #{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} se ha unido a la empresa #{2:NUM} +STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {0:STRING} se ha unido a la partida (Cliente #{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {0:STRING} se ha unido a la empresa #{2:NUM} STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} se ha unido como espectador -STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} ha creado una empresa nueva (#{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} ha abandonado el juego ({2:STRING}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {0:STRING} ha creado una empresa nueva (#{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {0:STRING} ha abandonado el juego ({2:STRING}) STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} ha cambiado su nombre a {STRING} -STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} ha dado {2:CURRENCY_LONG} a {1:STRING} +STR_NETWORK_MESSAGE_GIVE_MONEY :*** {0:STRING} ha transferido {2:CURRENCY_LONG} a {1:STRING} STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}El servidor ha cerrado la sesión STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}El servidor está reiniciando...{}Espera por favor... STR_NETWORK_MESSAGE_KICKED :*** {STRING} ha sido expulsado. Razón: ({STRING}) @@ -2525,13 +2510,13 @@ STR_CONTENT_SELECT_ALL_CAPTION :{BLACK}Seleccio STR_CONTENT_SELECT_ALL_CAPTION_TOOLTIP :{BLACK}Marca todo el contenido para descarga STR_CONTENT_SELECT_UPDATES_CAPTION :{BLACK}Seleccionar actualizaciones STR_CONTENT_SELECT_UPDATES_CAPTION_TOOLTIP :{BLACK}Marca para descargar todo el contenido que es una actualizacion del contenido existente -STR_CONTENT_UNSELECT_ALL_CAPTION :{BLACK}Desmarcar todas -STR_CONTENT_UNSELECT_ALL_CAPTION_TOOLTIP :{BLACK}Marca todo el contenido para no ser descargado +STR_CONTENT_UNSELECT_ALL_CAPTION :{BLACK}Deseleccionar todo +STR_CONTENT_UNSELECT_ALL_CAPTION_TOOLTIP :{BLACK}Selecciona todo el contenido para no ser descargado STR_CONTENT_SEARCH_EXTERNAL :{BLACK}Buscar en páginas externas STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}Busca contenido no disponible en el servicio de contenido de OpenTTD en páginas externas no asociadas con OpenTTD STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}¡Estás abandonando OpenTTD! STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}Los términos y condiciones para descargar contenido de páginas externas varían.{}Será necesario consultar dichas páginas para obtener instrucciones de cómo instalar el contenido en OpenTTD.{}¿Desea continuar? -STR_CONTENT_FILTER_TITLE :{BLACK}Etiqueta/nombre del filtro +STR_CONTENT_FILTER_TITLE :{BLACK}Filtro de etiqueta/nombre: STR_CONTENT_OPEN_URL :{BLACK}Visitar web STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}Visitar la página web de este contenido STR_CONTENT_DOWNLOAD_CAPTION :{BLACK}Descargar @@ -2607,7 +2592,7 @@ STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Ajustar STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Establece los objetos como invisibles en vez de transparentes # Linkgraph legend window -STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Leyenda de Flujos de Carga +STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Leyenda de flujos de carga STR_LINKGRAPH_LEGEND_ALL :{BLACK}Todas STR_LINKGRAPH_LEGEND_NONE :{BLACK}Ninguna STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Seleccione las empresas a mostrar @@ -2619,6 +2604,9 @@ STR_LINKGRAPH_LEGEND_SATURATED :{TINY_FONT}{BLA STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLACK}sobrecargado # Linkgraph tooltip +STR_LINKGRAPH_STATS_TOOLTIP :{BLACK}{CARGO_LONG} para ser transportad{G 0 o a}{P 0 "" s} al mes desde {STATION} a {STATION} ({COMMA}% de la capacidad){STRING} +STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} para ser transportad{G 0 o a}{P 0 "" s} de vuelta ({COMMA}% de la capacidad) +STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}Tiempo de viaje promedio: {NUM}{NBSP}día{P "" s} # Base for station construction window(s) STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Mostrar área de cobertura @@ -2628,6 +2616,7 @@ STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP :{BLACK}Oculta e STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP :{BLACK}Muestra área de cobertura del lugar propuesto STR_STATION_BUILD_ACCEPTS_CARGO :{BLACK}Acepta: {GOLD}{CARGO_LIST} STR_STATION_BUILD_SUPPLIES_CARGO :{BLACK}Suministra: {GOLD}{CARGO_LIST} +STR_STATION_BUILD_INFRASTRUCTURE_COST :{BLACK}Coste de mantenimiento: {GOLD}{CURRENCY_SHORT}/año # Join station window STR_JOIN_STATION_CAPTION :{WHITE}Unir estación @@ -2815,11 +2804,11 @@ STR_LANDSCAPING_TOOLBAR :{WHITE}Terreno STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}Baja una esquina del terreno. Arrastrando se reduce la esquina seleccionada y se nivela el resto del terreno seleccionado a dicha altura. Ctrl permite seleccionar un área diagonalmente. Mayús permite mostrar una estimación del precio STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND :{BLACK}Sube una esquina del terreno. Arrastrando se eleva la esquina seleccionada y se nivela el resto del terreno seleccionado a dicha altura. Ctrl permite seleccionar un área diagonalmente. Mayús permite mostrar una estimación del precio STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Nivela un área de terreno a la altura de la primera esquina seleccionada. Ctrl permite seleccionar un área diagonalmente. Mayús permite mostrar una estimación del precio -STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Compra el terreno para futuros usos. Mayús permite mostrar una estimación del precio +STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Compra el terreno para futuros usos. Ctrl permite seleccionar un área diagonalmente. Mayús permite mostrar una estimación del precio # Object construction window STR_OBJECT_BUILD_CAPTION :{WHITE}Selección de Objeto -STR_OBJECT_BUILD_TOOLTIP :{BLACK}Selecciona el objeto a construir. Mayús permite mostrar una estimación del precio +STR_OBJECT_BUILD_TOOLTIP :{BLACK}Selecciona el objeto a construir. Ctrl permite seleccionar un área diagonalmente. Mayús permite mostrar una estimación del precio STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}Selecciona el tipo de objeto a construir STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}Vista previa del objeto STR_OBJECT_BUILD_SIZE :{BLACK}Tamaño: {GOLD}{NUM} x {NUM} casillas @@ -2863,6 +2852,8 @@ STR_FOUND_TOWN_RANDOM_TOWN_BUTTON :{BLACK}Municipi STR_FOUND_TOWN_RANDOM_TOWN_TOOLTIP :{BLACK}Funda un municipio en un lugar aleatorio STR_FOUND_TOWN_MANY_RANDOM_TOWNS :{BLACK}Varios municipios al azar STR_FOUND_TOWN_RANDOM_TOWNS_TOOLTIP :{BLACK}Cubre el mapa con municipios colocados al azar +STR_FOUND_TOWN_EXPAND_ALL_TOWNS :{BLACK}Expandir todos los municipios +STR_FOUND_TOWN_EXPAND_ALL_TOWNS_TOOLTIP :{BLACK}Expande levemente todos los municipios STR_FOUND_TOWN_NAME_TITLE :{YELLOW}Nombre del municipio: STR_FOUND_TOWN_NAME_EDITOR_TITLE :{BLACK}Introducir nombre de municipio @@ -2907,14 +2898,14 @@ STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_QUERY :{YELLOW}¿Está STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Cadena de industrias para la industria {STRING} STR_INDUSTRY_CARGOES_CARGO_CAPTION :{WHITE}Cadena de industrias para la carga {STRING} STR_INDUSTRY_CARGOES_PRODUCERS :{WHITE}Industrias proveedoras -STR_INDUSTRY_CARGOES_CUSTOMERS :{WHITE}Industrias clientes +STR_INDUSTRY_CARGOES_CUSTOMERS :{WHITE}Industrias consumidoras STR_INDUSTRY_CARGOES_HOUSES :{WHITE}Casas STR_INDUSTRY_CARGOES_INDUSTRY_TOOLTIP :{BLACK}Clica en la industria para ver sus proveedores y clientes -STR_INDUSTRY_CARGOES_CARGO_TOOLTIP :{BLACK}{STRING}{}Clica en la carga para mostrar sus proveedores y clientes +STR_INDUSTRY_CARGOES_CARGO_TOOLTIP :{BLACK}{STRING}{}Clica en la carga para mostrar sus proveedores y consumidores STR_INDUSTRY_DISPLAY_CHAIN :{BLACK}Mostrar cadena STR_INDUSTRY_DISPLAY_CHAIN_TOOLTIP :{BLACK}Muestra industrias que suministran o aceptan la carga -STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP :{BLACK}Enlazar al mapa -STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP_TOOLTIP :{BLACK}Muestra las industrias seleccionadas también en el minimapa +STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP :{BLACK}Mostrar en el minimapa +STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP_TOOLTIP :{BLACK}Muestra las industrias seleccionadas en el minimapa STR_INDUSTRY_CARGOES_SELECT_CARGO :{BLACK}Seleccionar carga STR_INDUSTRY_CARGOES_SELECT_CARGO_TOOLTIP :{BLACK}Selecciona el tipo de carga a mostrar STR_INDUSTRY_CARGOES_SELECT_INDUSTRY :{BLACK}Seleccionar industria @@ -3127,7 +3118,7 @@ STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Detalles STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}No hay información disponible STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING} STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: {WHITE}{STRING} -STR_SAVELOAD_FILTER_TITLE :{BLACK}Patrón de filtrado: +STR_SAVELOAD_FILTER_TITLE :{BLACK}Filtro: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Sobrescribir Archivo STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}¿Estás seguro de que quieres sobrescribir el archivo existente? STR_SAVELOAD_DIRECTORY :{STRING} (Directorio) @@ -3141,6 +3132,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Tamaño STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Selecciona el tamaño del mapa en casillas. El número de casillas disponible en el mapa será ligeramente inferior STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}No. de municipios: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Nombres de municipios: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Selección del estilo del nombre de los municipios STR_MAPGEN_DATE :{BLACK}Fecha: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}No. de industrias: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Punto más alto: @@ -3156,11 +3149,40 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Reducir STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Generador terreno: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Tipo de terreno -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Nivel del mar: +STR_MAPGEN_SEA_LEVEL :{BLACK}Nivel del mar: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Ríos: STR_MAPGEN_SMOOTHNESS :{BLACK}Uniformidad: STR_MAPGEN_VARIETY :{BLACK}Variedad: STR_MAPGEN_GENERATE :{WHITE}Generar +STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}Configuración de NewGRF +STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Muestra la configuración de NewGRF +STR_MAPGEN_AI_SETTINGS :{BLACK}Configuración de IA +STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Muestra la configuración de IA +STR_MAPGEN_GS_SETTINGS :{BLACK}Configuración de script de juego +STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Muestra la configuración de script de juego + +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Inglés +STR_MAPGEN_TOWN_NAME_FRENCH :Francés +STR_MAPGEN_TOWN_NAME_GERMAN :Alemán +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Inglés (Adicional) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Latinoamericano +STR_MAPGEN_TOWN_NAME_SILLY :Tontos/Absurdos +STR_MAPGEN_TOWN_NAME_SWEDISH :Sueco +STR_MAPGEN_TOWN_NAME_DUTCH :Holandés +STR_MAPGEN_TOWN_NAME_FINNISH :Finlandés +STR_MAPGEN_TOWN_NAME_POLISH :Polaco +STR_MAPGEN_TOWN_NAME_SLOVAK :Eslovaco +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Noruego +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Húngaro +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Austríaco +STR_MAPGEN_TOWN_NAME_ROMANIAN :Rumano +STR_MAPGEN_TOWN_NAME_CZECH :Checo +STR_MAPGEN_TOWN_NAME_SWISS :Suizo +STR_MAPGEN_TOWN_NAME_DANISH :Danés +STR_MAPGEN_TOWN_NAME_TURKISH :Turco +STR_MAPGEN_TOWN_NAME_ITALIAN :Italiano +STR_MAPGEN_TOWN_NAME_CATALAN :Catalán # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Bordes del mapa: @@ -3219,7 +3241,7 @@ STR_NEWGRF_SETTINGS_INFO_TITLE :{WHITE}Informac STR_NEWGRF_SETTINGS_ACTIVE_LIST :{WHITE}Archivos NewGRF activos STR_NEWGRF_SETTINGS_INACTIVE_LIST :{WHITE}Archivos NewGRF inactivos STR_NEWGRF_SETTINGS_SELECT_PRESET :{ORANGE}Seleccionar configuración: -STR_NEWGRF_FILTER_TITLE :{ORANGE}Patrón de filtrado: +STR_NEWGRF_FILTER_TITLE :{ORANGE}Filtro: STR_NEWGRF_SETTINGS_PRESET_LIST_TOOLTIP :{BLACK}Cargar la configuración seleccionada STR_NEWGRF_SETTINGS_PRESET_SAVE :{BLACK}Guardar STR_NEWGRF_SETTINGS_PRESET_SAVE_TOOLTIP :{BLACK}Guardar la lista actual como configuración @@ -3229,8 +3251,8 @@ STR_NEWGRF_SETTINGS_ADD :{BLACK}Añadir STR_NEWGRF_SETTINGS_ADD_FILE_TOOLTIP :{BLACK}Añade el NewGRF seleccionado a tu configuración STR_NEWGRF_SETTINGS_RESCAN_FILES :{BLACK}Actualizar archivos STR_NEWGRF_SETTINGS_RESCAN_FILES_TOOLTIP :{BLACK}Actualiza la lista de archivos NewGRF disponibles -STR_NEWGRF_SETTINGS_REMOVE :{BLACK}Quitar -STR_NEWGRF_SETTINGS_REMOVE_TOOLTIP :{BLACK}Quita el NewGRF seleccionado de la lista +STR_NEWGRF_SETTINGS_REMOVE :{BLACK}Retirar +STR_NEWGRF_SETTINGS_REMOVE_TOOLTIP :{BLACK}Retira el NewGRF seleccionado de la lista STR_NEWGRF_SETTINGS_MOVEUP :{BLACK}Mover Arriba STR_NEWGRF_SETTINGS_MOVEUP_TOOLTIP :{BLACK}Mueve el NewGRF seleccionado hacia arriba STR_NEWGRF_SETTINGS_MOVEDOWN :{BLACK}Mover Abajo @@ -3306,6 +3328,13 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Sprite a STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Salta al sprite anterior (ignorando pseudosprites, sprites recoloreados y sprites de fuente) y pasa del primer al último sprite STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Representa el sprite seleccionado. Su alineamiento es ignorado al dibujarlo STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Mover el sprite, cambiando los ajustes X e Y. Ctrl+clic mueve el sprite ocho unidades de una sola vez + +###length 2 +STR_SPRITE_ALIGNER_CENTRE_OFFSET :{BLACK}Desviación (offset) centrada +STR_SPRITE_ALIGNER_CENTRE_SPRITE :{BLACK}Sprite centrado + +STR_SPRITE_ALIGNER_CROSSHAIR :{BLACK}Punto de mira + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Reiniciar coordenadas relativas STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Reinicia las coordenadas relativas actuales STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}Coordenada X: {NUM}, Coordenada Y: {NUM} (Absoluta) @@ -3323,15 +3352,15 @@ STR_NEWGRF_ERROR_MSG_FATAL :{RED}Error Fata STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Ha ocurrido un error fatal de NewGRF:{}{STRING} STR_NEWGRF_ERROR_POPUP :{WHITE}Ha ocurrido un error de NewGRF:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} no funcionará con la con la versión de TTDPatch informada por OpenTTD -STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} es para la versión {STRING} de TTD -STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} está diseñado para ser usado con {STRING} -STR_NEWGRF_ERROR_INVALID_PARAMETER :Parámetro incorrecto para {1:STRING}: párametro {STRING} ({NUM}) -STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} debe ser cargado antes de {STRING} -STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} debe ser cargado después de {STRING} -STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} necesita la versión {STRING} ó superior de OpenTTD +STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} es para la versión {2:STRING} of TTD +STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} está diseñado para ser usado con {2:STRING} +STR_NEWGRF_ERROR_INVALID_PARAMETER :Parámetro incorrecto para {1:STRING}: párametro {2:STRING} ({3:NUM}) +STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} debe cargarse antes de {2:STRING} +STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} debe cargarse después de {2:STRING} +STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} requiere la versión {2:STRING} ó superior de OpenTTD STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :el archivo GRF ha sido diseñado para ser traducido STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Se han cargado demasiados NewGRF -STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Cargar {1:STRING} como NewGRF estático con {STRING} puede causar desincronizaciones +STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Cargar {1:STRING} como NewGRF estático con {2:STRING} puede causar desincronizaciones STR_NEWGRF_ERROR_UNEXPECTED_SPRITE :Sprite inesperado (sprite {3:NUM}) STR_NEWGRF_ERROR_UNKNOWN_PROPERTY :Propiedad de Acción 0 desconocida {4:HEX} (sprite {3:NUM}) STR_NEWGRF_ERROR_INVALID_ID :Intento de usar una ID inválida (sprite {3:NUM}) @@ -3463,14 +3492,14 @@ STR_LOCAL_AUTHORITY_ACTION_EXCLUSIVE_TRANSPORT :Comprar derecho STR_LOCAL_AUTHORITY_ACTION_BRIBE :Sobornar a la autoridad local ###length 8 -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{YELLOW}Inicia una campaña publicitaria local pequeña para atraer más pasajeros y carga a sus servicios de transporte.{}Proporciona un incremento temporal en la calificación de las estaciones en un radio pequeño alrededor del centro del municipio.{}Coste: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{YELLOW}Inicia una campaña publicitaria local mediana para atraer más pasajeros y carga a sus servicios de transporte.{}Proporciona un incremento temporal en la calificación de las estaciones en un radio mediano alrededor del centro del municipio.{}Coste: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{YELLOW}Inicia una campaña publicitaria local grande para atraer más pasajeros y carga a sus servicios de transporte.{}Proporciona un incremento temporal en la calificación de las estaciones en un radio grande alrededor del centro del municipio.{}Coste: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{YELLOW}Paga la reconstrucción de las carreteras locales.{}Provoca considerables complicaciones de tráfico durante 6 meses.{}Coste: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{YELLOW}Construye una estatua en honor a su empresa.{}Proporciona un incremento permanente en la calificación de las estaciones de este municipio.{}Coste: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{YELLOW}Paga la construcción de nuevos edificios comerciales en el municipio.{}Proporciona un incremento temporal en el crecimiento del municipio.{}Coste: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW}Compra derechos de transporte exclusivos en este municipio durante un año.{}Las autoridades no permitirán el uso de las estaciones de la competencia.{}Coste: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Soborna a las autoridades locales para aumentar su calificación, con el riesgo de sufrir una penalización severa si es descubierto.{}Coste: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{YELLOW}Inicia una campaña publicitaria local pequeña para atraer más pasajeros y carga a sus servicios de transporte.{}Proporciona un incremento temporal en la calificación de las estaciones en un radio pequeño alrededor del centro del municipio.{}{POP_COLOUR}Coste: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{PUSH_COLOUR}{YELLOW}Inicia una campaña publicitaria local mediana para atraer más pasajeros y carga a sus servicios de transporte.{}Proporciona un incremento temporal en la calificación de las estaciones en un radio mediano alrededor del centro del municipio.{}{POP_COLOUR}Coste: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}Inicia una campaña publicitaria local grande para atraer más pasajeros y carga a sus servicios de transporte.{}Proporciona un incremento temporal en la calificación de las estaciones en un radio grande alrededor del centro del municipio.{}{POP_COLOUR}Coste: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{PUSH_COLOUR}{YELLOW}Paga la reconstrucción de las carreteras locales.{}Provoca considerables complicaciones de tráfico durante 6 meses.{}{POP_COLOUR}Coste: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Construye una estatua en honor a su empresa.{}Proporciona un incremento permanente en la calificación de las estaciones de este municipio.{}{POP_COLOUR}Coste: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Paga la construcción de nuevos edificios comerciales en el municipio.{}Proporciona un incremento temporal en el crecimiento del municipio.{}{POP_COLOUR}Coste: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}Compra derechos de transporte exclusivos en este municipio durante un año.{}Las autoridades no permitirán el uso de las estaciones de la competencia.{}{POP_COLOUR}Coste: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Soborna a las autoridades locales para aumentar su calificación, con el riesgo de sufrir una penalización severa si es descubierto.{}{POP_COLOUR}Coste: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}Objetivos de {COMPANY} @@ -3599,10 +3628,10 @@ STR_CARGO_RATING_OUTSTANDING :Excepcional STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centrar vista en la posición de la estación. Ctrl+clic abre un punto de vista en dicha posición STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Cambia el nombre de la estación -STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Muestra todos los trenes que tienen esta estación en su horario -STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Muestra todos los vehículos de carretera que tienen esta estación en su horario -STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Muestra todas las aeronaves que tienen esta estación en su horario -STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Muestra todos los barcos que tienen esta estación en su horario +STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Muestra todos los trenes que tienen esta estación en sus órdenes +STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Muestra todos los vehículos de carretera que tienen esta estación en sus órdenes +STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Muestra todas las aeronaves que tienen esta estación en sus órdenes +STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Muestra todos los barcos que tienen esta estación en sus órdenes STR_STATION_VIEW_RENAME_STATION_CAPTION :Renombrar estación/zona de carga @@ -3643,15 +3672,18 @@ STR_FINANCES_SECTION_SHIP_REVENUE :{GOLD}Barcos STR_FINANCES_SECTION_LOAN_INTEREST :{GOLD}Intereses de Préstamo STR_FINANCES_SECTION_OTHER :{GOLD}Otros +STR_FINANCES_TOTAL_CAPTION :{WHITE}Total STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} +STR_FINANCES_ZERO_INCOME :{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} -STR_FINANCES_NET_PROFIT :{WHITE}Beneficio neto -STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Saldo en Banco +STR_FINANCES_PROFIT :{WHITE}Beneficio +STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Saldo bancario STR_FINANCES_OWN_FUNDS_TITLE :{WHITE}Fondos propios STR_FINANCES_LOAN_TITLE :{WHITE}Préstamo STR_FINANCES_INTEREST_RATE :{WHITE}Tipo de interés del préstamo: {BLACK}{NUM}% STR_FINANCES_MAX_LOAN :{WHITE}Préstamo Máximo: {BLACK}{CURRENCY_LONG} STR_FINANCES_TOTAL_CURRENCY :{BLACK}{CURRENCY_LONG} +STR_FINANCES_BANK_BALANCE :{WHITE}{CURRENCY_LONG} STR_FINANCES_BORROW_BUTTON :{BLACK}Pedir Préstamo {CURRENCY_LONG} STR_FINANCES_BORROW_TOOLTIP :{BLACK}Incrementa el préstamo. Ctrl+clic solicita todo el préstamo posible STR_FINANCES_REPAY_BUTTON :{BLACK}Pagar Préstamo {CURRENCY_LONG} @@ -3752,7 +3784,7 @@ STR_INDUSTRY_VIEW_PRODUCES_N_CARGO :{BLACK}Produce: STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :, {STRING}{STRING} STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Necesita: -STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{0:STRING}{BLACK}{3:STRING} STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} esperando{STRING} STR_CONFIG_GAME_PRODUCTION :{WHITE}Cambiar producción (múltiplos de 8, máximo 2040) @@ -3781,7 +3813,9 @@ STR_VEHICLE_LIST_MANAGE_LIST :{BLACK}Administ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Envia instrucciones a todos los vehículos de la lista STR_VEHICLE_LIST_REPLACE_VEHICLES :Reemplazar vehículos STR_VEHICLE_LIST_SEND_FOR_SERVICING :Enviar para Mantenimiento -STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Beneficio este año: {CURRENCY_LONG} (último año: {CURRENCY_LONG}) +STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Beneficio este año: {CURRENCY_LONG} (año anterior: {CURRENCY_LONG}) +STR_VEHICLE_LIST_CARGO :{TINY_FONT}{BLACK}[{CARGO_LIST}] +STR_VEHICLE_LIST_NAME_AND_CARGO :{TINY_FONT}{BLACK}{STRING} {STRING} STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Enviar a Depósito STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Enviar a Depósito @@ -3825,7 +3859,7 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Quitar todos lo STR_GROUP_RENAME_CAPTION :{BLACK}Renombrar un grupo STR_GROUP_PROFIT_THIS_YEAR :Beneficio este año: -STR_GROUP_PROFIT_LAST_YEAR :Beneficio del año pasado: +STR_GROUP_PROFIT_LAST_YEAR :Beneficio del año anterior: STR_GROUP_OCCUPANCY :Utilización actual: STR_GROUP_OCCUPANCY_VALUE :{NUM}% @@ -3873,6 +3907,11 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}F.T. má STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Alcance: {GOLD}{COMMA} casillas STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Tipo de aeronave: {GOLD}{STRING} +###length 3 +STR_CARGO_TYPE_FILTER_ALL :Todos los tipos +STR_CARGO_TYPE_FILTER_FREIGHT :Carga +STR_CARGO_TYPE_FILTER_NONE :Ninguno + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Lista de selección de los vehículos de ferrocarril. Clica en el vehículo para más información. Pulsa Ctrl+clic para mostrar/ocultar el tipo del vehículo STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Lista de selección de vehículos de carretera. Clica en el vehículo para más información. Pulsa Ctrl+clic para mostrar/ocultar el tipo del vehículo @@ -4041,7 +4080,7 @@ STR_ENGINE_PREVIEW_AIRCRAFT :{G=f}aeronave STR_ENGINE_PREVIEW_SHIP :{G=m}barco STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Precio: {CURRENCY_LONG} Peso: {WEIGHT_SHORT}{}Velocidad: {VELOCITY} Potencia: {POWER}{}Coste Mantenimiento: {CURRENCY_LONG}/año{}Capacidad: {CARGO_LONG} -STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Precio: {CURRENCY_LONG} Peso: {WEIGHT_SHORT}{}Velocidad: {VELOCITY} Potencia: {POWER} F.T. Máxima: {6:FORCE}{}Coste Mantenimiento: {4:CURRENCY_LONG}/año{}Capacidad: {5:CARGO_LONG} +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Precio: {0:CURRENCY_LONG} Peso: {1:WEIGHT_SHORT}{}Velocidad: {2:VELOCITY} Potencia: {3:POWER} F.T. Máxima: {6:FORCE}{}Coste Mantenimiento: {4:CURRENCY_LONG}/año{}Capacidad: {5:CARGO_LONG} STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Precio: {CURRENCY_LONG} Velocidad Máx.: {VELOCITY}{}Capacidad: {CARGO_LONG}{}Coste Mantenimiento: {CURRENCY_LONG}/año STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Precio: {CURRENCY_LONG} Velocidad Máx.: {VELOCITY}{}Tipo de aeronave: {STRING}{}Capacidad: {CARGO_LONG}, {CARGO_LONG}{}Coste Mantenimiento: {CURRENCY_LONG}/año STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Precio: {CURRENCY_LONG} Velocidad Máx.: {VELOCITY}{}Tipo de aeronave: {STRING}{}Capacidad: {CARGO_LONG}{}Coste Mantenimiento: {CURRENCY_LONG}/año @@ -4199,13 +4238,14 @@ STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Velocida STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Peso: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potencia: {LTBLUE}{POWER}{BLACK} Velocidad Máx.: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Peso: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potencia: {LTBLUE}{POWER}{BLACK} Velocidad Máx.: {LTBLUE}{VELOCITY} {BLACK}F.T. Máx.: {LTBLUE}{FORCE} -STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Beneficio este año: {LTBLUE}{CURRENCY_LONG} (último año: {CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Beneficio este año: {LTBLUE}{CURRENCY_LONG} (año anterior: {CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Beneficio este año: {LTBLUE}{CURRENCY_LONG} (año anterior: {CURRENCY_LONG}) {BLACK}Potencia específica mín.: {LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Fiabilidad: {LTBLUE}{COMMA}% {BLACK}Averías desde el último mantenimiento: {LTBLUE}{COMMA} STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Construido: {LTBLUE}{NUM}{BLACK} Valor: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_INFO_NO_CAPACITY :{BLACK}Capacidad: {LTBLUE}Ninguna{STRING} -STR_VEHICLE_INFO_CAPACITY :{BLACK}Capacidad: {LTBLUE}{CARGO_LONG}{3:STRING} -STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Capacidad: {LTBLUE}{CARGO_LONG}{3:STRING} (x{4:NUM}) +STR_VEHICLE_INFO_CAPACITY :{BLACK}Capacidad: {LTBLUE}{0:CARGO_LONG}{3:STRING} +STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Capacidad: {LTBLUE}{0:CARGO_LONG}{3:STRING} (x{4:NUM}) STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Capacidad: {LTBLUE}{CARGO_LONG}, {CARGO_LONG}{STRING} STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Créditos de Transferencia: {LTBLUE}{CURRENCY_LONG} @@ -4366,7 +4406,7 @@ STR_ORDER_CONDITIONAL :Salto de orden STR_ORDER_SHARE :Compartir órdenes STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Añade una nueva orden antes de la orden resaltada, o la añade al final de la lista. Ctrl sobre estaciones ordena 'Carga completa de cualquier carga', sobre puntos de ruta ordena 'sin paradas' y sobre depósitos ordena 'mantenimiento'. Ctrl o Compartir órdenes permite a este vehículo compartir órdenes con el vehículo seleccionado. Clica sobre un vehículo copia las órdenes. Una órden de depósito desactiva el mantenimiento automático del vehículo -STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP :{BLACK}Muestra todos los vehículos con el mismo horario +STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP :{BLACK}Muestra todos los vehículos que comparten estas órdenes y este horario # String parts to build the order string STR_ORDER_GO_TO_WAYPOINT :Ir vía {WAYPOINT} @@ -4446,54 +4486,54 @@ STR_TIMETABLE_ORDER_VIEW_TOOLTIP :{BLACK}Cambia a STR_TIMETABLE_TOOLTIP :{BLACK}Horario - Clica en una orden para resaltarla -STR_TIMETABLE_NO_TRAVEL :Sin viaje +STR_TIMETABLE_NO_TRAVEL :No viajar STR_TIMETABLE_NOT_TIMETABLEABLE :Viajar (automático; programado por la próxima orden manual) STR_TIMETABLE_TRAVEL_NOT_TIMETABLED :Viajar (sin programar) STR_TIMETABLE_TRAVEL_NOT_TIMETABLED_SPEED :Viajar (sin programar) a {2:VELOCITY} como máximo STR_TIMETABLE_TRAVEL_FOR :Viajar durante {STRING} STR_TIMETABLE_TRAVEL_FOR_SPEED :Viajar durante {STRING} a {VELOCITY} como máximo -STR_TIMETABLE_TRAVEL_FOR_ESTIMATED :Viajando (durante {STRING}, sin programar) -STR_TIMETABLE_TRAVEL_FOR_SPEED_ESTIMATED :Viajando (durante {STRING}, sin programar) a {VELOCITY} como máximo -STR_TIMETABLE_STAY_FOR_ESTIMATED :(permaneciendo {STRING}, sin programar) -STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(viajando durante {STRING}, sin programar) -STR_TIMETABLE_STAY_FOR :y esperar {STRING} +STR_TIMETABLE_TRAVEL_FOR_ESTIMATED :Viajar (durante {STRING}, sin programar) +STR_TIMETABLE_TRAVEL_FOR_SPEED_ESTIMATED :Viajar (durante {STRING}, sin programar) a {VELOCITY} como máximo +STR_TIMETABLE_STAY_FOR_ESTIMATED :(permanecer {STRING}, sin programar) +STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(viajar durante {STRING}, sin programar) +STR_TIMETABLE_STAY_FOR :y permanecer {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :y viajar durante {STRING} STR_TIMETABLE_DAYS :{COMMA}{NBSP}día{P "" s} STR_TIMETABLE_TICKS :{COMMA}{NBSP}tic{P "" s} -STR_TIMETABLE_TOTAL_TIME :{BLACK}El horario tardará {STRING} en completarse -STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}El horario tardará al menos {STRING} en completarse (no todas las órdenes) +STR_TIMETABLE_TOTAL_TIME :{BLACK}El horario tardará {STRING} en recorrerse +STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}El horario tardará al menos {STRING} en recorrerse (no todas las órdenes) -STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Este vehículo está actualmente en hora -STR_TIMETABLE_STATUS_LATE :{BLACK}Este vehículo está actualmente retrasado {STRING} -STR_TIMETABLE_STATUS_EARLY :{BLACK}Este vehículo está actualmente adelantado {STRING} +STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Este vehículo actualmente es puntual +STR_TIMETABLE_STATUS_LATE :{BLACK}Este vehículo actualmente está retrasado {STRING} +STR_TIMETABLE_STATUS_EARLY :{BLACK}Este vehículo actualmente está adelantado {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Este horario no ha comenzado STR_TIMETABLE_STATUS_START_AT :{BLACK}Este horario comenzará el {STRING} STR_TIMETABLE_STARTING_DATE :{BLACK}Fecha de inicio -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Selecciona una fecha como punto de partida de este horario. Ctrl+clic permite fijar el punto de partida de este horario y distribuye todos los vehículos que lo compartan siempre y cuando el horario esté completo +STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Selecciona la fecha de inicio del horario. Ctrl+click distribuye uniformemente todos los vehículos que compartan este horario a partir de la fecha proporcionada, basados en su orden relativo, siempre que el horario esté completamente rellenado -STR_TIMETABLE_CHANGE_TIME :{BLACK}Cambiar duración -STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Cambia la duración de la orden seleccionada +STR_TIMETABLE_CHANGE_TIME :{BLACK}Modificar duración +STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Modifica la duración de la orden seleccionada. Ctrl+clic establece la duración para todas las órdenes STR_TIMETABLE_CLEAR_TIME :{BLACK}Borrar duración -STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Borra la duración de la orden resaltada +STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Borra la duración de la orden resaltada.Ctrl+clic elimina la duración de todas las órdenes -STR_TIMETABLE_CHANGE_SPEED :{BLACK}Cambiar límite de velocidad -STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Cambia el límite de velocidad de la orden resaltada +STR_TIMETABLE_CHANGE_SPEED :{BLACK}Modificar límite de velocidad +STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Cambia el límite de velocidad de la orden resaltada. Ctrl+clic establece el límite para todas las órdenes STR_TIMETABLE_CLEAR_SPEED :{BLACK}Borrar límite de velocidad -STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Borra el límite de velocidad de la orden resaltada +STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Borra el límite de velocidad de la orden resaltada. Ctrl+clic elimina el límite de todas las órdenes -STR_TIMETABLE_RESET_LATENESS :{BLACK}Reiniciar retrasos -STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Pone a cero el retraso del vehículo, así el vehículo estará en hora +STR_TIMETABLE_RESET_LATENESS :{BLACK}Reiniciar retraso +STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Establece en cero el retraso acumulado del vehículo para que sea puntual STR_TIMETABLE_AUTOFILL :{BLACK}Rellenar automáticamente -STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Rellena la tabla de horarios automáticamente con los valores de la siguiente jornada (Ctrl+clic para tratar de mantener los tiempos de espera) +STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Rellena el horario automáticamente con los valores del siguiente recorrido. Ctrl+clic para intentar mantener los tiempos de permanencia en estación -STR_TIMETABLE_EXPECTED :{BLACK}Esperado +STR_TIMETABLE_EXPECTED :{BLACK}Previsto STR_TIMETABLE_SCHEDULED :{BLACK}Programado -STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Alterna entre esperado y programado +STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Alterna entre fechas previstas y programadas STR_TIMETABLE_ARRIVAL_ABBREVIATION :Ll: STR_TIMETABLE_DEPARTURE_ABBREVIATION :S: @@ -4502,14 +4542,14 @@ STR_TIMETABLE_DEPARTURE_ABBREVIATION :S: # Date window (for timetable) STR_DATE_CAPTION :{WHITE}Seleccionar fecha STR_DATE_SET_DATE :{BLACK}Seleccionar fecha -STR_DATE_SET_DATE_TOOLTIP :{BLACK}Usar la fecha seleccionada como punto de inicio del horario +STR_DATE_SET_DATE_TOOLTIP :{BLACK}Usa la fecha seleccionada como punto de inicio del horario STR_DATE_DAY_TOOLTIP :{BLACK}Selecciona el día STR_DATE_MONTH_TOOLTIP :{BLACK}Selecciona el mes STR_DATE_YEAR_TOOLTIP :{BLACK}Selecciona el año # AI debug window -STR_AI_DEBUG :{WHITE}Depuración de Scripts de juego/IA +STR_AI_DEBUG :{WHITE}Depuración de scripts de juego/IA STR_AI_DEBUG_NAME_AND_VERSION :{BLACK}{STRING} (v{NUM}) STR_AI_DEBUG_NAME_TOOLTIP :{BLACK}Nombre del script STR_AI_DEBUG_SETTINGS :{BLACK}Configuración @@ -4525,20 +4565,22 @@ STR_AI_DEBUG_MATCH_CASE_TOOLTIP :{BLACK}Activa/d STR_AI_DEBUG_CONTINUE :{BLACK}Continuar STR_AI_DEBUG_CONTINUE_TOOLTIP :{BLACK}Quita la pausa y hace que la IA continúe STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}Mostrar salida de depuración de esta IA -STR_AI_GAME_SCRIPT :{BLACK}Script de juego -STR_AI_GAME_SCRIPT_TOOLTIP :{BLACK}Comprobar el registro del Script de juego +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ó ninguna IA apropiada para cargar.{}Ésta es una IA por defecto que no realiza acción alguna.{}Puedes descargar nuevas IA mediante el sistema de 'Contenido Online' -STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Uno de los scripts ejecutados ha fallado. Por favor, informa del fallo al autor del script con una captura de la ventana de depuración de Script / IA -STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}La ventana de depuración de Scripts solo está disponible para el servidor +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 de script/IA +STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}La ventana de depuración de scripts solo está disponible para el servidor # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Configuración de Scripts de juego/IA +STR_AI_CONFIG_CAPTION_AI :{WHITE}Configuración de IA +STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Configuración de scripts de juego STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Script de juego que será cargado en la próxima partida STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}IA que serán cargadas en la próxima partida STR_AI_CONFIG_HUMAN_PLAYER :Jugador humano STR_AI_CONFIG_RANDOM_AI :IA aleatoria STR_AI_CONFIG_NONE :(ninguno) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Núm. máximo de jugadores: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Mover hacia arriba STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Mover la IA seleccionada hacia arriba @@ -4546,13 +4588,12 @@ STR_AI_CONFIG_MOVE_DOWN :{BLACK}Mover ha STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Mover la IA seleccionada hacia abajo STR_AI_CONFIG_GAMESCRIPT :{SILVER}Script de juego +STR_AI_CONFIG_GAMESCRIPT_PARAM :{SILVER}Parámetros STR_AI_CONFIG_AI :{SILVER}IA -STR_AI_CONFIG_CHANGE :{BLACK}Seleccionar {STRING} -STR_AI_CONFIG_CHANGE_NONE : -STR_AI_CONFIG_CHANGE_AI :IA -STR_AI_CONFIG_CHANGE_GAMESCRIPT :Script de juego -STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Cargar otro script +STR_AI_CONFIG_CHANGE_AI :{BLACK}Seleccionar IA +STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}Seleccionar script de juego +STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Carga otro script STR_AI_CONFIG_CONFIGURE :{BLACK}Configurar STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Configura los parámetros del script @@ -4580,9 +4621,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Mapa de STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Minimapa # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}Parámetros {STRING} -STR_AI_SETTINGS_CAPTION_AI :IA -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Script de juego +STR_AI_SETTINGS_CAPTION_AI :{WHITE}Parámetros de IA STR_AI_SETTINGS_CLOSE :{BLACK}Cerrar STR_AI_SETTINGS_RESET :{BLACK}Reiniciar STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4746,6 +4785,7 @@ STR_ERROR_TOO_MANY_INDUSTRIES :{WHITE}... dema STR_ERROR_CAN_T_GENERATE_INDUSTRIES :{WHITE}No se pueden crear industrias... STR_ERROR_CAN_T_BUILD_HERE :{WHITE}No puede construirse {STRING} aquí... STR_ERROR_CAN_T_CONSTRUCT_THIS_INDUSTRY :{WHITE}No se puede construir este tipo de industria aquí... +STR_ERROR_CAN_T_PROSPECT_INDUSTRY :{WHITE}No se puede realizar prospección para la industria... STR_ERROR_INDUSTRY_TOO_CLOSE :{WHITE}... demasiado cerca de otra industria STR_ERROR_MUST_FOUND_TOWN_FIRST :{WHITE}... debe construirse un municipio primero STR_ERROR_ONLY_ONE_ALLOWED_PER_TOWN :{WHITE}... solo se permite uno por municipio @@ -4760,7 +4800,9 @@ STR_ERROR_FOREST_CAN_ONLY_BE_PLANTED :{WHITE}... solo STR_ERROR_CAN_ONLY_BE_BUILT_ABOVE_SNOW_LINE :{WHITE}... solo puede construirse por encima de la cota de nieve STR_ERROR_CAN_ONLY_BE_BUILT_BELOW_SNOW_LINE :{WHITE}... solo puede construirse por debajo de la cota de nieve -STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES :{WHITE}No había sitios apropiados disponibles para industrias '{STRING}' +STR_ERROR_PROSPECTING_WAS_UNLUCKY :{WHITE}La fundación ha fallado debido a una prospeccion desafortunada; intentar de nuevo +STR_ERROR_NO_SUITABLE_PLACES_FOR_PROSPECTING :{WHITE}No había lugares apropiados para realizar prospecciones para esta industria +STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES :{WHITE}No había lugares apropiados para industrias '{STRING}' STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES_EXPLANATION :{WHITE}Cambia los parámetros de generación del mapa para obtener un mapa mejor # Station construction related errors @@ -4903,7 +4945,7 @@ STR_ERROR_CAN_T_PLANT_TREE_HERE :{WHITE}No se pu STR_ERROR_CAN_T_BUILD_BRIDGE_HERE :{WHITE}No puede construirse un puente aquí... STR_ERROR_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Primero debe demolerse el puente STR_ERROR_CAN_T_START_AND_END_ON :{WHITE}No se puede comenzar y acabar en la misma posición -STR_ERROR_BRIDGEHEADS_NOT_SAME_HEIGHT :{WHITE}Las cabeceras del puente no están al mismo nivel +STR_ERROR_BRIDGEHEADS_NOT_SAME_HEIGHT :{WHITE}Los estribos del puente no están al mismo nivel STR_ERROR_BRIDGE_TOO_LOW_FOR_TERRAIN :{WHITE}El puente es demasiado bajo para el terreno STR_ERROR_BRIDGE_TOO_HIGH_FOR_TERRAIN :{WHITE}El puente es demasiado alto para este terreno. STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Comienzo y final deben estar en línea @@ -4927,6 +4969,7 @@ STR_ERROR_OBJECT_IN_THE_WAY :{WHITE}Objeto e STR_ERROR_COMPANY_HEADQUARTERS_IN :{WHITE}... la sede de la empresa está en medio STR_ERROR_CAN_T_PURCHASE_THIS_LAND :{WHITE}No es posible comprar este terreno... STR_ERROR_YOU_ALREADY_OWN_IT :{WHITE}... ¡ya es de su propiedad! +STR_ERROR_BUILD_OBJECT_LIMIT_REACHED :{WHITE}... límite de construcción de objetos alcanzado # Group related errors STR_ERROR_GROUP_CAN_T_CREATE :{WHITE}No se puede crear grupo... @@ -4999,6 +5042,8 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}No se pu STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... el vehículo está destruido +STR_ERROR_CAN_T_CLONE_VEHICLE_LIST :{WHITE}... no todos los vehículos son idénticos + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Ningún vehículo estará disponible STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Es necesario modificar la configuración NewGRF STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}En esta fecha no hay vehículos disponibles @@ -5025,6 +5070,8 @@ STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}No se pu STR_ERROR_CAN_T_COPY_SHARE_ORDER :{WHITE}... el vehículo no puede ir a todas las estaciones STR_ERROR_CAN_T_ADD_ORDER :{WHITE}... el vehículo no puede ir a esa estación STR_ERROR_CAN_T_ADD_ORDER_SHARED :{WHITE}... un vehículo que comparte esta orden no puede ir a esa estación +STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST :{WHITE}... no todos los vehículos tienen las mismas órdenes +STR_ERROR_CAN_T_SHARE_ORDER_VEHICLE_LIST :{WHITE}... no todos los vehículos comparten las órdenes STR_ERROR_CAN_T_SHARE_ORDER_LIST :{WHITE}No se puede compartir lista de órdenes... STR_ERROR_CAN_T_STOP_SHARING_ORDER_LIST :{WHITE}No se puede dejar de compartir lista de órdenes... @@ -5035,7 +5082,7 @@ STR_ERROR_AIRCRAFT_NOT_ENOUGH_RANGE :{WHITE}... la a # Timetable related errors STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}No se puede asignar horario al vehículo... STR_ERROR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}Los vehículos sólo pueden esperar en estaciones -STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}Este vehículo no va a detenerse en esta estación +STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}Este vehículo no se detendrá en esta estación # Sign related errors STR_ERROR_TOO_MANY_SIGNS :{WHITE}... demasiados letreros diff --git a/src/lang/spanish_MX.txt b/src/lang/spanish_MX.txt index 25de17db56..e6cfb57398 100644 --- a/src/lang/spanish_MX.txt +++ b/src/lang/spanish_MX.txt @@ -201,6 +201,16 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}hp STR_UNITS_POWER_METRIC :{COMMA}{NBSP}cv STR_UNITS_POWER_SI :{COMMA}{NBSP}kW +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_SI :{DECIMAL}{NBSP}hp/Mg +STR_UNITS_POWER_METRIC_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_SI :{DECIMAL}{NBSP}hp/Mg +STR_UNITS_POWER_SI_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_SI :{DECIMAL}{NBSP}W/kg + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -305,7 +315,7 @@ STR_SORT_BY_WAITING_TOTAL :Carga total en STR_SORT_BY_WAITING_AVAILABLE :Carga disponible en espera STR_SORT_BY_RATING_MAX :Mayor índice de carga STR_SORT_BY_RATING_MIN :Menor índice de carga -STR_SORT_BY_ENGINE_ID :Id. locomotora (orden clásico) +STR_SORT_BY_ENGINE_ID :ID de vehículo (orden clásico) STR_SORT_BY_COST :Costo STR_SORT_BY_POWER :Potencia STR_SORT_BY_TRACTIVE_EFFORT :Fuerza de tracción @@ -392,10 +402,11 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Salir # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Opciones de juego STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Configuración -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Configuración de scripts +STR_SETTINGS_MENU_AI_SETTINGS :Configuración de IA +STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :Configuración de scripts de juego STR_SETTINGS_MENU_NEWGRF_SETTINGS :Configuración de NewGRF STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Opciones de transparencia STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Mostrar nombres de localidades @@ -645,7 +656,7 @@ STR_PERFORMANCE_DETAIL_LOAN :{BLACK}Préstam STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}Total: ###length 10 -STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP :{BLACK}Cuántos vehículos tuvieron ganancias el último año, contando los de carretera, trenes, barcos y aeronaves +STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP :{BLACK}Cuántos vehículos tuvieron ganancias el último año, contando los autotransportes, trenes, barcos y aeronaves STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}Número de estaciones abastecidas recientemente. Las estaciones de tren, paradas de autobuses, aeropuertos y demás se contabilizan aparte, aun si pertenecen a la misma estación STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP :{BLACK}Utilidad del vehículo con menores ingresos (de entre aquellos con más de 2 años) STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}Cantidad de efectivo ganado en el trimestre con la utilidad más baja de los últimos 12 trimestres @@ -679,7 +690,7 @@ STR_MUSIC_TOOLTIP_SKIP_TO_PREVIOUS_TRACK :{BLACK}Saltar a STR_MUSIC_TOOLTIP_SKIP_TO_NEXT_TRACK_IN_SELECTION :{BLACK}Saltar a la pista siguiente de la selección STR_MUSIC_TOOLTIP_STOP_PLAYING_MUSIC :{BLACK}Detener música STR_MUSIC_TOOLTIP_START_PLAYING_MUSIC :{BLACK}Comenzar música -STR_MUSIC_TOOLTIP_DRAG_SLIDERS_TO_SET_MUSIC :{BLACK}Mover los cursores para ajustar el volumen de la música y los efectos +STR_MUSIC_TOOLTIP_DRAG_SLIDERS_TO_SET_MUSIC :{BLACK}Mover el deslizador para ajustar el volumen de la música y los efectos STR_MUSIC_TOOLTIP_SELECT_ALL_TRACKS_PROGRAM :{BLACK}Elegir programa 'todas las pistas' STR_MUSIC_TOOLTIP_SELECT_OLD_STYLE_MUSIC :{BLACK}Elegir programa 'antiguo' STR_MUSIC_TOOLTIP_SELECT_NEW_STYLE_MUSIC :{BLACK}Elegir programa 'moderno' @@ -779,12 +790,12 @@ STR_SMALLMAP_TOWN :{TINY_FONT}{WHI STR_SMALLMAP_DISABLE_ALL :{BLACK}Ocultar todo STR_SMALLMAP_ENABLE_ALL :{BLACK}Mostrar todo STR_SMALLMAP_SHOW_HEIGHT :{BLACK}Mostrar relieve -STR_SMALLMAP_TOOLTIP_DISABLE_ALL_INDUSTRIES :{BLACK}No mostrar industrias en el mapa +STR_SMALLMAP_TOOLTIP_DISABLE_ALL_INDUSTRIES :{BLACK}Ocultar del mapa las industrias STR_SMALLMAP_TOOLTIP_ENABLE_ALL_INDUSTRIES :{BLACK}Mostrar todas las industrias en el mapa STR_SMALLMAP_TOOLTIP_SHOW_HEIGHT :{BLACK}Alternar vista de relieve -STR_SMALLMAP_TOOLTIP_DISABLE_ALL_COMPANIES :{BLACK}No mostrar propiedades de empresas en el mapa +STR_SMALLMAP_TOOLTIP_DISABLE_ALL_COMPANIES :{BLACK}Ocultar del mapa las propiedades de las empresas STR_SMALLMAP_TOOLTIP_ENABLE_ALL_COMPANIES :{BLACK}Mostrar todas las propiedades de empresas en el mapa -STR_SMALLMAP_TOOLTIP_DISABLE_ALL_CARGOS :{BLACK}Ocultar todas las cargas del mapa +STR_SMALLMAP_TOOLTIP_DISABLE_ALL_CARGOS :{BLACK}Ocultar del mapa las cargas STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}Mostrar todas las cargas en el mapa # Status bar messages @@ -820,7 +831,7 @@ STR_NEWS_AIRCRAFT_CRASH :{BIG_FONT}{BLAC STR_NEWS_PLANE_CRASH_OUT_OF_FUEL :{BIG_FONT}{BLACK}¡Accidente aéreo!{}Avión se queda sin combustible, ¡{COMMA} personas mueren en explosión! STR_NEWS_DISASTER_ZEPPELIN :{BIG_FONT}{BLACK}¡Desastre de zepelín en {STATION}! -STR_NEWS_DISASTER_SMALL_UFO :{BIG_FONT}{BLACK}¡Vehículo destruido en la carretara al impactar con ovni! +STR_NEWS_DISASTER_SMALL_UFO :{BIG_FONT}{BLACK}¡Vehículo destruido en la carretera al impactar con ovni! STR_NEWS_DISASTER_AIRPLANE_OIL_REFINERY :{BIG_FONT}{BLACK}¡Explota refinería de petróleo cerca de {TOWN}! STR_NEWS_DISASTER_HELICOPTER_FACTORY :{BIG_FONT}{BLACK}¡Fábrica destruida misteriosamente cerca de {TOWN}! STR_NEWS_DISASTER_BIG_UFO :{BIG_FONT}{BLACK}¡Ovni aterriza cerca de {TOWN}! @@ -920,7 +931,7 @@ STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Copiar u # Game options window STR_GAME_OPTIONS_CAPTION :{WHITE}Opciones de juego STR_GAME_OPTIONS_CURRENCY_UNITS_FRAME :{BLACK}Divisa -STR_GAME_OPTIONS_CURRENCY_UNITS_DROPDOWN_TOOLTIP :{BLACK}Selección de divisa +STR_GAME_OPTIONS_CURRENCY_UNITS_DROPDOWN_TOOLTIP :{BLACK}Elegir divisa ###length 42 STR_GAME_OPTIONS_CURRENCY_GBP :Libra británica (GBP) @@ -966,36 +977,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Rupia india (IN STR_GAME_OPTIONS_CURRENCY_IDR :Rupia indonesia (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Ringgit malasio (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Manejar por la izquierda -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Manejar por la derecha - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Nombres de localidades: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Elegir el estilo de nombres para las localidades - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Inglés -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Francés -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Alemán -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Inglés (adicional) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :América Latina -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Tonterías (inglés) -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Sueco -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Holandés -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finlandés -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Polaco -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Eslovaco -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Noruego -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Húngaro -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Austríaco -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Rumano -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Checo -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Suizo -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Danés -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turco -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italiano -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Catalán - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Guardado automático STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Elegir el intervalo de guardados automáticos @@ -1028,21 +1009,19 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Activar STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Controlador actual: {STRING} -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Tamaño de la interfaz -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Elegir el tamaño de los elementos de la interfaz +STR_GAME_OPTIONS_GUI_SCALE_FRAME :{BLACK}Tamaño de la interfaz +STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Mover el deslizador para cambiar el tamaño de la interfaz. Mantener pulsado Ctrl para un control fino +STR_GAME_OPTIONS_GUI_SCALE_AUTO :{BLACK}Detectar automáticamente +STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Detectar tamaño de la interfaz automáticamente -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(detectar) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Doble -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Cuádruple +STR_GAME_OPTIONS_GUI_SCALE_BEVELS :{BLACK}Ajustar biseles +STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :{BLACK}Ajustar el tamaño de los biseles respecto a la interfaz -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Tamaño de texto -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Elegir el tamaño de letra de la interfaz - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(detectar) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Doble -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Cuádruple +STR_GAME_OPTIONS_GUI_SCALE_1X :1x +STR_GAME_OPTIONS_GUI_SCALE_2X :2x +STR_GAME_OPTIONS_GUI_SCALE_3X :3x +STR_GAME_OPTIONS_GUI_SCALE_4X :4x +STR_GAME_OPTIONS_GUI_SCALE_5X :5x STR_GAME_OPTIONS_GRAPHICS :{BLACK}Gráficos @@ -1094,8 +1073,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Vista p STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 libras (£) en la moneda STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Cambiar parámetro de moneda personalizada -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Núm. máximo de jugadores: {ORANGE}{COMMA} - STR_NONE :Ninguno STR_FUNDING_ONLY :Solo fundadas STR_MINIMAL :Mínimo @@ -1145,6 +1122,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Ambiente Templado +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Ambiente Subártico +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Ambiente Subtropical +STR_CLIMATE_TOYLAND_LANDSCAPE :Ambiente de Mundo de juguetes + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Muy plano STR_TERRAIN_TYPE_FLAT :Plano @@ -1270,16 +1253,16 @@ STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT_AUTO :(automático) STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN :{WHITE}No se puede establecer el límite de elevación del mapa en el valor indicado. Al menos una montaña ya es más alta STR_CONFIG_SETTING_AUTOSLOPE :Alterar terreno debajo de edificios, vías férreas, etc.: {STRING} -STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :Permitir la alteración del terreno debajo de infraestructura sin tener que retirarla +STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :Permitir alteración de terreno debajo de infraestructura sin tener que retirarla -STR_CONFIG_SETTING_CATCHMENT :Permitir cambiar el tamaño del área de recolección a una forma más real: {STRING} -STR_CONFIG_SETTING_CATCHMENT_HELPTEXT :Las áreas de recolección se adecúan a diferentes tamaños, según los tipos de estaciones y aeropuertos +STR_CONFIG_SETTING_CATCHMENT :Permitir áreas de recolección más realistas: {STRING} +STR_CONFIG_SETTING_CATCHMENT_HELPTEXT :Las áreas de recolección se ajustarán a los tamaños de los tipos de estaciones y aeropuertos STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES :Las estaciones privadas pueden dar servicio a industrias con estaciones neutrales: {STRING} STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES_HELPTEXT :Al activarse, las industrias con estaciones integradas (ej. plataformas petrolíferas) podrán aceptar carga de estaciones aledañas. Al desactivarse, tales industrias solo recibirán carga en sus propias estaciones y no aceptarán de otras estaciones, ni la estación integrada brindará servicio a nada más que su industria -STR_CONFIG_SETTING_EXTRADYNAMITE :Permitir mayor eliminación de carreteras, puentes y túneles: {STRING} -STR_CONFIG_SETTING_EXTRADYNAMITE_HELPTEXT :Hacer más fácil eliminar infraestructura y edificios que sean propiedad de las localidades +STR_CONFIG_SETTING_EXTRADYNAMITE :Permitir eliminación más fácil de propiedades de localidades: {STRING} +STR_CONFIG_SETTING_EXTRADYNAMITE_HELPTEXT :Hacer más fácil la eliminación de la infraestructura y los edificios que sean propiedad de las localidades STR_CONFIG_SETTING_TRAIN_LENGTH :Longitud máxima de trenes: {STRING} STR_CONFIG_SETTING_TRAIN_LENGTH_HELPTEXT :Longitud máxima permitida para los trenes @@ -1304,8 +1287,8 @@ STR_CONFIG_SETTING_ROAD_VEHICLE_SLOPE_STEEPNESS_HELPTEXT :Grado de inclin STR_CONFIG_SETTING_FORBID_90_DEG :Prohibir a trenes realizar giros de 90°: {STRING} STR_CONFIG_SETTING_FORBID_90_DEG_HELPTEXT :Los giros de 90° ocurren en vías férreas perpendiculares donde el tren gira 90° al pasar de una casilla a otra, en lugar de los 45° habituales en otras combinaciones de vías. -STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS :Permitir la ampliación de estaciones no adyacentes: {STRING} -STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT :Permitir añadir de partes a una estación sin tener que estar en contacto directo con las partes existentes. Se debe pulsar Ctrl+Clic para añadir las nuevas partes +STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS :Permitir ampliación de estaciones no adyacentes: {STRING} +STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT :Se podrán añadir partes a una estación sin que tengan que estar una al lado de la otra. Ctrl+Clic para añadir las nuevas partes STR_CONFIG_SETTING_INFLATION :Inflación: {STRING} STR_CONFIG_SETTING_INFLATION_HELPTEXT :Activar inflación en la economía, lo que hace que los costos aumenten ligeramente más rápido que los ingresos @@ -1330,7 +1313,7 @@ STR_CONFIG_SETTING_INDUSTRY_PLATFORM :Área plana alr STR_CONFIG_SETTING_INDUSTRY_PLATFORM_HELPTEXT :Cantidad de espacio plano alrededor de las industrias. Esto asegura que haya espacio libre alrededor de las industrias para construir vías férreas, etc. STR_CONFIG_SETTING_MULTIPINDTOWN :Permitir varias industrias similares por localidad: {STRING} -STR_CONFIG_SETTING_MULTIPINDTOWN_HELPTEXT :En general, una localidad admite un solo tipo de industria a la vez, pero con esta opción varias industrias del mismo tipo en una localidad son posibles +STR_CONFIG_SETTING_MULTIPINDTOWN_HELPTEXT :En general, una localidad admite un solo tipo de industria a la vez, pero con esta opción varias industrias del mismo tipo en una localidad serán posibles STR_CONFIG_SETTING_SIGNALSIDE :Mostrar señales: {STRING} STR_CONFIG_SETTING_SIGNALSIDE_HELPTEXT :Elegir el lado de las vías donde se construirán las señales @@ -1340,7 +1323,7 @@ STR_CONFIG_SETTING_SIGNALSIDE_DRIVING_SIDE :En el lado de c 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_SHOWFINANCES_HELPTEXT :Al activarse, la ventana de finanzas aparecerá al final de cada año para permitir la inspección más sencilla del estado financiero de la empresa STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Todo nuevo recorrido es 'Sin paradas' por defecto: {STRING} STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Cada 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 solo define el valor por defecto para nuevos recorridos, pero cada recorrido individual puede ajustarse independientemente @@ -1353,7 +1336,7 @@ STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :mitad STR_CONFIG_SETTING_STOP_LOCATION_FAR_END :final STR_CONFIG_SETTING_AUTOSCROLL :Recorrer vista cuando se mueva el cursor a los bordes: {STRING} -STR_CONFIG_SETTING_AUTOSCROLL_HELPTEXT :Al activarse, las vistas se desplazarán cuando el ratón se acarque a los bordes de la ventana +STR_CONFIG_SETTING_AUTOSCROLL_HELPTEXT :Al activarse, las vistas se desplazarán cuando el ratón se acerque a los bordes de la ventana ###length 4 STR_CONFIG_SETTING_AUTOSCROLL_DISABLED :Desactivado STR_CONFIG_SETTING_AUTOSCROLL_MAIN_VIEWPORT_FULLSCREEN :Vista principal, solo en pantalla completa @@ -1361,19 +1344,19 @@ STR_CONFIG_SETTING_AUTOSCROLL_MAIN_VIEWPORT :Vista principal STR_CONFIG_SETTING_AUTOSCROLL_EVERY_VIEWPORT :Todas las vistas STR_CONFIG_SETTING_BRIBE :Permitir sobornos al ayuntamiento: {STRING} -STR_CONFIG_SETTING_BRIBE_HELPTEXT :Las empresas intentan sobornar a los ayuntamientos. Si un inspector lo descubre, la empresa no podrá operar en la localidad seis meses +STR_CONFIG_SETTING_BRIBE_HELPTEXT :Las empresas podrán sobornar a los ayuntamientos, pero si un inspector lo descubre, la empresa no podrá operar en la localidad durante seis meses -STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :Permitir adquirir los derechos de transporte exclusivos: {STRING} -STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Si una empresa compra los derechos de transporte exclusivos en una localidad, las estaciones de la competencia no recibirán carga nada todo un año +STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :Permitir adquisición de derechos de transporte exclusivos: {STRING} +STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Si una empresa compra los derechos de transporte exclusivos en una localidad, las estaciones de la competencia no recibirán carga todo un año -STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS :Permitir la construcción de nuevos edificios: {STRING} +STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS :Permitir construcción de nuevos edificios: {STRING} STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT :Las empresas aportan dinero a los ayuntamientos para que construyan nuevas casas y edificios STR_CONFIG_SETTING_ALLOW_FUND_ROAD :Permitir el pago de la reconstrucción de las carreteras locales: {STRING} -STR_CONFIG_SETTING_ALLOW_FUND_ROAD_HELPTEXT :Las empresas aportan dinero a los ayuntamientos para que reconstruyan sus carreteras y así sabotear a otros servicios de transporte por carretera que operen en la zona +STR_CONFIG_SETTING_ALLOW_FUND_ROAD_HELPTEXT :Las empresas aportan dinero a los ayuntamientos para reconstruir sus carreteras, lo que perjudicando otros servicios de transporte en la zona -STR_CONFIG_SETTING_ALLOW_GIVE_MONEY :Permitir enviar dinero a otras empresas: {STRING} -STR_CONFIG_SETTING_ALLOW_GIVE_MONEY_HELPTEXT :Permitir la transferencia de dinero entre empresas en modo multijugador +STR_CONFIG_SETTING_ALLOW_GIVE_MONEY :Permitir envío de dinero a otras empresas: {STRING} +STR_CONFIG_SETTING_ALLOW_GIVE_MONEY_HELPTEXT :En modo multijugador, las empresas podrán transferirse dinero STR_CONFIG_SETTING_FREIGHT_TRAINS :Multiplicador de peso para simular trenes pesados: {STRING} STR_CONFIG_SETTING_FREIGHT_TRAINS_HELPTEXT :Impacto de llevar carga en los trenes. Un valor mayor exige mayor potencia a los trenes para llevar carga, sobre todo al subir colinas @@ -1383,16 +1366,16 @@ STR_CONFIG_SETTING_PLANE_SPEED_HELPTEXT :Establece la ve STR_CONFIG_SETTING_PLANE_SPEED_VALUE :1/{COMMA} STR_CONFIG_SETTING_PLANE_CRASHES :Cantidad de accidentes aéreos: {STRING} -STR_CONFIG_SETTING_PLANE_CRASHES_HELPTEXT :Probabilidad de que ocurran accidentes aéreos.{}* Las aeronaves grandes son más propensas a accidentes en areopuertos pequeños +STR_CONFIG_SETTING_PLANE_CRASHES_HELPTEXT :Probabilidad de que ocurran accidentes aéreos.{}* Las aeronaves grandes son más propensas a accidentes en aeropuertos pequeños ###length 3 STR_CONFIG_SETTING_PLANE_CRASHES_NONE :Ninguno* STR_CONFIG_SETTING_PLANE_CRASHES_REDUCED :Reducida STR_CONFIG_SETTING_PLANE_CRASHES_NORMAL :Normal -STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Permitir la construcción de paradas de paso en localidades: {STRING} -STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Permitir la construcción de paradas de paso en carreteras que sean propiedad de las localidades -STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD :Permitir la construcción de paradas paradas de paso en carreteras de la competencia: {STRING} -STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD_HELPTEXT :Construir paradas de autobuses de paso en carreteras que sean propiedad de otras empresas +STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Permitir construcción de paradas de paso en localidades: {STRING} +STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Se podrán construir paradas de paso en las carreteras que sean propiedad de las localidades +STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD :Permitir construcción de paradas de paso en carreteras de la competencia: {STRING} +STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD_HELPTEXT :Se podrán construir paradas de paso en las carreteras que sean propiedad de otras empresas STR_CONFIG_SETTING_DYNAMIC_ENGINES_EXISTING_VEHICLES :{WHITE}No se puede cambiar esta opción si ya existen vehículos STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE :Mantenimiento de infraestructura: {STRING} @@ -1420,7 +1403,7 @@ STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Mostrar un mens STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Vehículos siempre disponibles: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Todos los modelos de vehículos estarán disponibles para siempre tras haber sido introducidos -STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Renovar automáticamente vehículos anicuados: {STRING} +STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Renovar automáticamente vehículos viejos: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Los vehículos próximos al final de su vida útil serán renovados automáticamente, siempre y cuando se cumplan las condiciones de renovación STR_CONFIG_SETTING_AUTORENEW_MONTHS :Renovar automáticamente el vehículo cumpla {STRING} @@ -1450,6 +1433,8 @@ STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Grosor de las l 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_SHOW_CARGO_IN_LISTS :Mostrar la carga que los vehículos pueden llevar en las ventanas de listas {STRING} +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS_HELPTEXT :Al activarse, la carga que el vehículo puede transportar aparecerá en las listas de vehículos STR_CONFIG_SETTING_LANDSCAPE :Ambiente: {STRING} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Los ambientes definen mapas con diferentes tipos de carga y requisitos de crecimiento de las localidades. Pueden ajustarse con NewGRF y scripts de juego @@ -1504,6 +1489,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Mejorado STR_CONFIG_SETTING_ROAD_SIDE :Autotransportes: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Elegir el lado de la circulación +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Manejar por la izquierda +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Manejar por la derecha + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Rotar mapa de alturas: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :A la izquierda @@ -1559,8 +1548,8 @@ STR_CONFIG_SETTING_LIVERIES_NONE :Ninguno STR_CONFIG_SETTING_LIVERIES_OWN :Mi empresa STR_CONFIG_SETTING_LIVERIES_ALL :Todas las empresas -STR_CONFIG_SETTING_PREFER_TEAMCHAT :Activar chat de equipo con : {STRING} -STR_CONFIG_SETTING_PREFER_TEAMCHAT_HELPTEXT :Cambiar el acceso al chat interno de la empresa y al chat público entre y +STR_CONFIG_SETTING_PREFER_TEAMCHAT :Activar chat de equipo con la tecla Intro: {STRING} +STR_CONFIG_SETTING_PREFER_TEAMCHAT_HELPTEXT :Cambiar el acceso al chat interno de la empresa y al chat público entre Intro y Ctrl+Intro STR_CONFIG_SETTING_SCROLLWHEEL_MULTIPLIER :Velocidad de la rueda del ratón sobre el mapa: {STRING} STR_CONFIG_SETTING_SCROLLWHEEL_MULTIPLIER_HELPTEXT :Controlar la sensibilidad de la rueda del ratón @@ -1608,7 +1597,7 @@ STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_SHORT :corto (31-12-20 STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_ISO :ISO (2008-12-31) STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME :Pausar la partida automáticamente al comenzar: {STRING} -STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME_HELPTEXT :Al activarse, el juego se detendrá automáticamente al comenzar nuevas partidas para permitir revisar el mapa +STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME_HELPTEXT :Al activarse, en cada inicio de partida el juego se detendrá automáticamente, para permitir la inspección del mapa STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL :Al pausar, permitir: {STRING} STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_HELPTEXT :Acciones se pueden realizar mientras el juego está en pausa. @@ -1697,7 +1686,7 @@ STR_CONFIG_SETTING_AI_BUILDS_TRAINS_HELPTEXT :Activar esta op STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES :Desactivar autotransportes para la computadora: {STRING} STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES_HELPTEXT :Activar esta opción deshabilita la construcción de autotransportes por jugadores no humanos -STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT :Desactivar aeroplanos para la computadora: {STRING} +STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT :Desactivar aeronaves para la computadora: {STRING} STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT_HELPTEXT :Activar esta opción deshabilita la construcción de aeronaves por jugadores no humanos STR_CONFIG_SETTING_AI_BUILDS_SHIPS :Desactivar barcos para la computadora: {STRING} @@ -1711,7 +1700,7 @@ STR_CONFIG_SETTING_AI_PROFILE_MEDIUM :Intermedio STR_CONFIG_SETTING_AI_PROFILE_HARD :Difícil STR_CONFIG_SETTING_AI_IN_MULTIPLAYER :Permitir jugadores no humanos en modo multijugador: {STRING} -STR_CONFIG_SETTING_AI_IN_MULTIPLAYER_HELPTEXT :Permitir a los jugadores controlados por la computadora participar en partidas de varios jugadores +STR_CONFIG_SETTING_AI_IN_MULTIPLAYER_HELPTEXT :Los jugadores controlados por la computadora podrán participar en partidas de varios jugadores STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES :#opcodes disponibles antes de que los scripts sean suspendidos: {STRING} STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES_HELPTEXT :Número máximo de operaciones que un script puede realizar por turno @@ -1720,7 +1709,7 @@ STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_HELPTEXT :Cantidad de mem 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_ISPERCENT_HELPTEXT :Elegir si el mantenimiento de vehículos se da por días o por fiabilidad menor a un porcentaje específico 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 @@ -1730,7 +1719,7 @@ STR_CONFIG_SETTING_SERVINT_AIRCRAFT :Intervalo de ma 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_SERVINT_VALUE :{COMMA}{NBSP}día{P 0 "" s}/% +STR_CONFIG_SETTING_SERVINT_VALUE :{COMMA}{NBSP}día{P 0 "" s} o % ###setting-zero-is-special STR_CONFIG_SETTING_SERVINT_DISABLED :Deshabilitado @@ -1796,11 +1785,11 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_SUMMARY :Resumen STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Completo STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Noticias a color aparecen en el año: {STRING} -STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Año en el que los periódicos comenzarán a imprimirse a color. Antes de ese año, apacerán en blanco y negro +STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Año en el que los periódicos se imprimirán a color. Antes de ese año, saldrá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_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 inicio hará que la tabla de puntuaciones nunca se muestre. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} ###setting-zero-is-special STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Nunca @@ -1812,11 +1801,11 @@ STR_CONFIG_SETTING_ECONOMY_TYPE_ORIGINAL :Original STR_CONFIG_SETTING_ECONOMY_TYPE_SMOOTH :Estable STR_CONFIG_SETTING_ECONOMY_TYPE_FROZEN :Rígida -STR_CONFIG_SETTING_ALLOW_SHARES :Permitir comprar acciones de otras empresas: {STRING} -STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Al activarse, se pueden comprar y vender acciones de otras empresas. Las acciones de una empresa solamente estarán disponibles cuando la empresa cumpla una edad determinada +STR_CONFIG_SETTING_ALLOW_SHARES :Permitir compra de acciones de otras empresas: {STRING} +STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Al activarse, se pueden comprar y vender las acciones de otras empresas, aunque solo estarán disponibles a partir de una edad determinada de las empresas STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Edad mínima de la empresa para intercambiar acciones: {STRING} -STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES_HELPTEXT :Estabelcer la edad mínima que debe tener una empresa para que otros puedan comprarle y venderle acciones. +STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES_HELPTEXT :Establecer la edad mínima que debe tener una empresa para que otros puedan comprarle y venderle acciones. STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Porcentaje de la utilidad total a pagar por transferencias de carga: {STRING} STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :Porcentaje de utilidad cedida a los transportes intermedios en sistemas de transferencia de carga, dando un mayor control sobre la utilidad de cada vehículo @@ -1828,7 +1817,7 @@ STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :Al arrastrar, m STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Forma en que se colocan las señales con Ctrl+Arrastrar. Al desactivarse, se colocan señales cerca de túneles y puentes para evitar tramos largos sin señales. Al activarse, se colocan señales cada tanto de casillas, con lo que alinear señales en vías paralelas es más fácil STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Señales mecánicas por defecto antes de: {STRING} -STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Año a partir del cual se usarán señales eléctricas. Antes de ese año se usarán señales mecánicas, las cuales funcionan igual pero tienen distinto aspecto +STR_CONFIG_SETTING_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_CYCLE_SIGNAL_TYPES :Cambiar entre tipos de señales: {STRING} STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Elegir la alternación entre señales al usar Ctrl+Clic con la herramienta de señales @@ -1854,10 +1843,10 @@ STR_CONFIG_SETTING_TOWN_LAYOUT_RANDOM :Aleatorio STR_CONFIG_SETTING_ALLOW_TOWN_ROADS :Permitir a las localidades construir carreteras: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Los ayuntamientos construyen carreteras para que las localidades se expandan. Desactivar para impedirlo STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Permitir a las localidades construir pasos a nivel: {STRING} -STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Activar esta opción permite a las localidades construir pasos a nivel +STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Permite a las localidades construir pasos a nivel -STR_CONFIG_SETTING_NOISE_LEVEL :Permitir el ruido de aeropuertos controlado por localidades: {STRING} -STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Al desactivarse, puede haber hasta dos aeropuertos por localidad. Al activarse, el número de aeropuertos por localidad depende de su nivel de ruido permitido, el cual depende de la población, el tamaño de cada aeropuerto y la distancia +STR_CONFIG_SETTING_NOISE_LEVEL :Permitir que localidades controlen ruido de aeropuertos: {STRING} +STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Al desactivarse, solo podrá haber dos aeropuertos por localidad. Al activarse, el número de aeropuertos por localidad se limitará por su nivel de ruido permitido, el cual dependerá de la población, el tamaño del aeropuerto y la distancia STR_CONFIG_SETTING_TOWN_FOUNDING :Fundar localidades: {STRING} STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Activar esta opción permite a los jugadores funda nuevas localidades durante la partida @@ -1875,8 +1864,8 @@ STR_CONFIG_SETTING_TOWN_CARGOGENMODE_BITCOUNT :Lineal STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :Crecimiento de árboles durante la partida: {STRING} STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :Controlar la aparición aleatoria de árboles durante la partida. Esto puede afectar industrias que dependen del crecimiento de árboles, como los aserraderos ###length 4 -STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_SPREAD :Crecer pero no expandir {RED}(rompe el aserradero) -STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_RAINFOREST :Crecer pero solo expandir en bosques +STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_SPREAD :Crecer, pero no expandir {RED}(rompe el aserradero) +STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_RAINFOREST :Crecer, pero solo expandir en bosques STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_ALL :Crecer y expandir por todos lados STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_GROWTH_NO_SPREAD :No crecer ni expandir {RED}(rompe el aserradero) @@ -1971,7 +1960,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS :Unidades del ju STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Unidades de potencia de vehículos: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :Cada vez que se muestre la potencia de un vehículo en la interfaz de usuario, se emplearán las unidades elegidas ###length 3 -STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_IMPERIAL :Imperial (cv) +STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_IMPERIAL :Imperial (hp) STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_METRIC :Métrico (cv) STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_SI :SI (kW) @@ -2003,7 +1992,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperial (pies) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Métrico (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) -STR_CONFIG_SETTING_LOCALISATION :{ORANGE}Localización +STR_CONFIG_SETTING_LOCALISATION :{ORANGE}Adaptación local STR_CONFIG_SETTING_GRAPHICS :{ORANGE}Gráficos STR_CONFIG_SETTING_SOUND :{ORANGE}Sonido STR_CONFIG_SETTING_INTERFACE :{ORANGE}Interfaz @@ -2016,7 +2005,7 @@ STR_CONFIG_SETTING_ACCOUNTING :{ORANGE}Contabi STR_CONFIG_SETTING_VEHICLES :{ORANGE}Vehículos STR_CONFIG_SETTING_VEHICLES_PHYSICS :{ORANGE}Leyes físicas STR_CONFIG_SETTING_VEHICLES_ROUTING :{ORANGE}Enrutamiento -STR_CONFIG_SETTING_LIMITATIONS :{ORANGE}Limitaciones +STR_CONFIG_SETTING_LIMITATIONS :{ORANGE}Restricciones STR_CONFIG_SETTING_ACCIDENTS :{ORANGE}Desastres y accidentes STR_CONFIG_SETTING_GENWORLD :{ORANGE}Generación de mapa STR_CONFIG_SETTING_ENVIRONMENT :{ORANGE}Entorno @@ -2038,7 +2027,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Cambio de senti STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Los trenes se darán la vuelta ante una señal si han estado esperado durante un tiempo largo ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(recomendado) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(recomendado) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Establecer valor @@ -2081,7 +2070,8 @@ STR_INTRO_HIGHSCORE :{BLACK}Tabla de STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Configuración STR_INTRO_NEWGRF_SETTINGS :{BLACK}Config. NewGRF STR_INTRO_ONLINE_CONTENT :{BLACK}Contenido en línea -STR_INTRO_SCRIPT_SETTINGS :{BLACK}Configuración de scripts +STR_INTRO_AI_SETTINGS :{BLACK}Configuración de IA +STR_INTRO_GAMESCRIPT_SETTINGS :{BLACK}Scripts de juego STR_INTRO_QUIT :{BLACK}Salir STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Comenzar una nueva partida. Ctrl+Clic omite la configuración del mapa @@ -2101,11 +2091,12 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Mostrar STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Mostrar configuración STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Mostrar configuración de NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Revisar si hay nuevos contenidos actualizados para descargar -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Mostrar configuración de scripts +STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Mostrar configuración de IA +STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Mostrar configuración de scripts de juego STR_INTRO_TOOLTIP_QUIT :{BLACK}Salir de 'OpenTTD' STR_INTRO_BASESET :{BLACK}A los gráficos base elegidos les hace falta {NUM} spirte{P "" s}. Necesitan actualizarse. -STR_INTRO_TRANSLATION :{BLACK}Este idioma tiene {NUM} cadena{P "" s} de texto sin traducir todavía. Ayudar a mejorar OpenTTD siriviendo como traductor. Consulta el archivo readme.txt para más detalles. +STR_INTRO_TRANSLATION :{BLACK}Este idioma tiene {NUM} cadena{P "" s} de texto sin traducir todavía. Ayudar a mejorar OpenTTD registrándote como traductor. Consulta el archivo readme.txt para más detalles. # Quit window STR_QUIT_CAPTION :{WHITE}Salir @@ -2131,13 +2122,7 @@ STR_CHEAT_EDIT_MAX_HL :{LTBLUE}Cambiar STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT :{WHITE}Cambiar la elevación máxima de las montañas en el mapa STR_CHEAT_CHANGE_DATE :{LTBLUE}Cambiar fecha: {ORANGE} {DATE_SHORT} STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Cambiar año actual -STR_CHEAT_SETUP_PROD :{LTBLUE}Permitir cambiar los valores de producción: {ORANGE}{STRING} - -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Ambiente Templado -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Ambiente Subártico -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Ambiente Subtropical -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Ambiente de Mundo de juguetes +STR_CHEAT_SETUP_PROD :{LTBLUE}Permitir cambio de valores de producción: {ORANGE}{STRING} # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Cromática @@ -2386,7 +2371,7 @@ STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Bloquear acceso STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_RESET :Eliminar STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_UNLOCK :Restablecer contraseña -STR_NETWORK_CLIENT_LIST_ASK_CAPTION :{WHITE}Acción de aministrador +STR_NETWORK_CLIENT_LIST_ASK_CAPTION :{WHITE}Acción de administrador STR_NETWORK_CLIENT_LIST_ASK_CLIENT_KICK :{YELLOW}¿Sacar al jugador "{STRING}"? STR_NETWORK_CLIENT_LIST_ASK_CLIENT_BAN :{YELLOW}¿Bloquear acceso al jugador "{STRING}"? STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}¿Eliminar la empresa "{COMPANY}"? @@ -2498,13 +2483,13 @@ STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :esperando actua STR_NETWORK_MESSAGE_CLIENT_LEAVING :saliendo STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} se unió a la partida -STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {STRING} se unió a la partida (Cliente #{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} se unió a la empresa #{2:NUM} +STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {0:STRING} se unió a la partida (Cliente #{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {0:STRING} se unió a la empresa #{2:NUM} STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} se unió como espectador -STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} creó una nueva empresa (#{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} salió de la partida ({2:STRING}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {0:STRING} creó una nueva empresa (#{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {0:STRING} salió de la partida ({2:STRING}) STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} cambió su nombre a {STRING} -STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} le transfirió {2:CURRENCY_LONG} a {1:STRING} +STR_NETWORK_MESSAGE_GIVE_MONEY :*** {0:STRING} le transfirió {2:CURRENCY_LONG} a {1:STRING} STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}El servidor ha cerrado la sesión STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Se está reiniciando el servidor...{}Espera por favor... STR_NETWORK_MESSAGE_KICKED :*** {STRING} ha sido expulsado. Razón: ({STRING}) @@ -2585,7 +2570,7 @@ STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD_FILE_NOT_WRITABLE :{WHITE}... no s STR_CONTENT_ERROR_COULD_NOT_EXTRACT :{WHITE}No ha sido posible descomprimir el archivo descargado STR_MISSING_GRAPHICS_SET_CAPTION :{WHITE}Gráficos no encontrados -STR_MISSING_GRAPHICS_SET_MESSAGE :{BLACK}OpenTTD requiere gráficos para funcionar pero no se pudo encontrar ninguno. ¿Permitir que OpenTTD descargue e instale dichos gráficos? +STR_MISSING_GRAPHICS_SET_MESSAGE :{BLACK}OpenTTD requiere gráficos para funcionar pero no se encontró ninguno. ¿Permitir que se descarguen e instalen automáticamente? STR_MISSING_GRAPHICS_YES_DOWNLOAD :{BLACK}Sí, descargar los gráficos STR_MISSING_GRAPHICS_NO_QUIT :{BLACK}No, salir de OpenTTD @@ -2631,6 +2616,7 @@ STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP :{BLACK}No mostr STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP :{BLACK}Mostrar área de recolección en el sitio planeado STR_STATION_BUILD_ACCEPTS_CARGO :{BLACK}Acepta: {GOLD}{CARGO_LIST} STR_STATION_BUILD_SUPPLIES_CARGO :{BLACK}Abastece: {GOLD}{CARGO_LIST} +STR_STATION_BUILD_INFRASTRUCTURE_COST :{BLACK}Costo de mantenimiento: {GOLD}{CURRENCY_SHORT}/año # Join station window STR_JOIN_STATION_CAPTION :{WHITE}Ampliar estación @@ -2732,7 +2718,7 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION :{BLACK}Construi STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}Construir sección de tranvía. Ctrl quita los carriles de tranvía. Mayús muestra un costo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}Construir carretera con orientación automática. Ctrl quita carreteras. Mayús muestra un costo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Construir tranvías con orientación automática. Ctrl quita los carriles de tranvía. Mayús muestra un costo estimado -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Construir depósito de carretera (para comprar y dar mantenimiento a vehículos). Mayús muestra un costo estimado +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Construir depósito de autotransportes (para comprar y dar mantenimiento a vehículos). Mayús muestra un costo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Construir depósito de tranvías (para comprar y dar mantenimiento a tranvías). Mayús muestra un costo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Construir parada de autobús. Ctrl activa la ampliación de estaciones. Mayús muestra un costo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Construir estación de tranvía de pasajeros. Ctrl activa la ampliación de estaciones. Mayús muestra un costo estimado @@ -2925,7 +2911,7 @@ STR_INDUSTRY_CARGOES_SELECT_INDUSTRY_TOOLTIP :{BLACK}Elegir l # Land area window STR_LAND_AREA_INFORMATION_CAPTION :{WHITE}Información sobre área de terreno -STR_LAND_AREA_INFORMATION_LOCATION_TOOLTIP :{BLACK}Centrar la vista en la casilla.Ctrl+Clic abre una vista aparte +STR_LAND_AREA_INFORMATION_LOCATION_TOOLTIP :{BLACK}Centrar la vista en la casilla. Ctrl+Clic abre una vista aparte STR_LAND_AREA_INFORMATION_COST_TO_CLEAR_N_A :{BLACK}Costo por despejar: {LTBLUE}N/D STR_LAND_AREA_INFORMATION_COST_TO_CLEAR :{BLACK}Costo por despejar: {RED}{CURRENCY_LONG} STR_LAND_AREA_INFORMATION_REVENUE_WHEN_CLEARED :{BLACK}Ingreso por despejar: {LTBLUE}{CURRENCY_LONG} @@ -3098,7 +3084,7 @@ STR_FRAMETIME_CAPTION_GL_ROADVEHS :Ticks de autotr STR_FRAMETIME_CAPTION_GL_SHIPS :Ticks de barcos STR_FRAMETIME_CAPTION_GL_AIRCRAFT :Ticks de areonaves STR_FRAMETIME_CAPTION_GL_LANDSCAPE :Ticks de mapa -STR_FRAMETIME_CAPTION_GL_LINKGRAPH :Retraro en gráfica de distribución +STR_FRAMETIME_CAPTION_GL_LINKGRAPH :Retraso en gráfica de distribución STR_FRAMETIME_CAPTION_DRAWING :Presentación de gráficos STR_FRAMETIME_CAPTION_DRAWING_VIEWPORTS :Presentación de ventanas de vista generales STR_FRAMETIME_CAPTION_VIDEO :Salida de video @@ -3144,6 +3130,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Tamaño STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Elegir el tamaño del mapa en número de casillas. El número real de casillas disponibles en el mapa será ligeramente inferior STR_MAPGEN_BY :{BLACK}× STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Núm. de localidades: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Nombres de localidades: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Elegir el estilo de nombres para las localidades STR_MAPGEN_DATE :{BLACK}Fecha: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Núm. de industrias: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Cima más alta: @@ -3159,11 +3147,40 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Disminui STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Generador de terreno: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Tipo de terreno: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Nivel del mar: +STR_MAPGEN_SEA_LEVEL :{BLACK}Nivel del mar: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Ríos: STR_MAPGEN_SMOOTHNESS :{BLACK}Suavidad: STR_MAPGEN_VARIETY :{BLACK}Variedad: STR_MAPGEN_GENERATE :{WHITE}Generar +STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}Configuración de NewGRF +STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Mostrar configuración de NewGRF +STR_MAPGEN_AI_SETTINGS :{BLACK}Configuración de IA +STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Mostrar configuración de IA +STR_MAPGEN_GS_SETTINGS :{BLACK}Configuración de scripts de juego +STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Mostrar configuración de scripts de juego + +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Inglés +STR_MAPGEN_TOWN_NAME_FRENCH :Francés +STR_MAPGEN_TOWN_NAME_GERMAN :Alemán +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Inglés (adicional) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :América Latina +STR_MAPGEN_TOWN_NAME_SILLY :Tonterías (inglés) +STR_MAPGEN_TOWN_NAME_SWEDISH :Sueco +STR_MAPGEN_TOWN_NAME_DUTCH :Holandés +STR_MAPGEN_TOWN_NAME_FINNISH :Finlandés +STR_MAPGEN_TOWN_NAME_POLISH :Polaco +STR_MAPGEN_TOWN_NAME_SLOVAK :Eslovaco +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Noruego +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Húngaro +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Austríaco +STR_MAPGEN_TOWN_NAME_ROMANIAN :Rumano +STR_MAPGEN_TOWN_NAME_CZECH :Checo +STR_MAPGEN_TOWN_NAME_SWISS :Suizo +STR_MAPGEN_TOWN_NAME_DANISH :Danés +STR_MAPGEN_TOWN_NAME_TURKISH :Turco +STR_MAPGEN_TOWN_NAME_ITALIAN :Italiano +STR_MAPGEN_TOWN_NAME_CATALAN :Catalán # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Bordes del mapa: @@ -3309,6 +3326,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Sprite a STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Ir al sprite anterior (ignorando pseudosprites, sprites coloreados y sprites de fuente) y pasar del primer al último sprite STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Representación del sprite elegido. Se ignora la alineación al ser dibujado STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Mover el sprite cambiando los valores X y Y. Ctrl+Clic mueve el sprite ocho unidades de una sola vez + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Restaurar coordenadas relativas STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Restaurar las coordenadas relativas STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}Coordenada X: {NUM}, Coordenada Y: {NUM} (absoluta) @@ -3326,21 +3347,21 @@ STR_NEWGRF_ERROR_MSG_FATAL :{RED}Error fata STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Ocurrió un error fatal de NewGRF:{}{STRING} STR_NEWGRF_ERROR_POPUP :{WHITE}Ocurrió un error de NewGRF:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} no funcionará con la con la versión de TTDPatch reportada por OpenTTD -STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} es la para la versión {STRING} de TTD -STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} está diseñado para usarse con {STRING} -STR_NEWGRF_ERROR_INVALID_PARAMETER :Parámetro no válido para {1:STRING}: parámetro {STRING} ({NUM}) -STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} debe cargarse antes de {STRING} -STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} debe cargarse después de {STRING} -STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} requiere OpenTTD versión {STRING} o superior +STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} es la para la versión {2:STRING} de TTD +STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} está diseñado para usarse con {2:STRING} +STR_NEWGRF_ERROR_INVALID_PARAMETER :Parámetro no válido para {1:STRING}: parámetro {2:STRING} ({3:NUM}) +STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} debe cargarse antes de {2:STRING} +STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} debe cargarse después de {2:STRING} +STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} requiere OpenTTD versión {2:STRING} o superior STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :El archivo GRF fue diseñado para ser traducido STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Demasiados NewGRF cargados -STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Cargar {1:STRING} como NewGRF estático con {STRING} puede causar desincronizaciones +STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Cargar {1:STRING} como NewGRF estático con {2:STRING} puede causar asincronías STR_NEWGRF_ERROR_UNEXPECTED_SPRITE :Sprite inesperado (sprite {3:NUM}) STR_NEWGRF_ERROR_UNKNOWN_PROPERTY :Propiedad de Acción 0 desconocida {4:HEX} (sprite {3:NUM}) STR_NEWGRF_ERROR_INVALID_ID :Intento de usar una ID no válida (sprite {3:NUM}) STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} contiene un sprite con errores. Todos los sprites con errores se muestran como un símbolo de interrogación rojo (?) STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Contiene múltiples entradas de Acción 8 (sprite {3:NUM}) -STR_NEWGRF_ERROR_READ_BOUNDS :La lectura excedió el límite de pseudo-sprite (sprite {3:NUM}) +STR_NEWGRF_ERROR_READ_BOUNDS :La lectura excedió el límite de un pseudosprite (sprite {3:NUM}) STR_NEWGRF_ERROR_GRM_FAILED :Recursos GRF solicitados no disponibles (sprite {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} fue desactivado por {STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Formato de colocación de sprites no válido o desconocido (sprite {3:NUM}) @@ -3466,14 +3487,14 @@ STR_LOCAL_AUTHORITY_ACTION_EXCLUSIVE_TRANSPORT :Comprar los der STR_LOCAL_AUTHORITY_ACTION_BRIBE :Sobornar al ayuntamiento ###length 8 -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{YELLOW}Iniciar una pequeña campaña publicitaria local para atraer más pasajeros y carga a tus servicios de transporte.{}Otorga un aumento temporal a la evaluación de estaciones en un radio pequeño alrededor del centro de la localidad.{}Costo: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{YELLOW}Iniciar una campaña publicitaria local mediana para atraer más pasajeros y carga a tus servicios de transporte.{}Otorga un aumento temporal a la evaluación de estaciones en un radio mediano alrededor del centro de la localidad.{}Costo: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{YELLOW}Iniciar una gran campaña publicitaria local para atraer más pasajeros y carga a tus servicios de transporte.{}Otorga un aumento temporal a la evaluación de estaciones en un radio grande alrededor del centro de la localidad.{}Costo: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{YELLOW}Pagar la reconstrucción de las carreteras locales.{}Provoca considerables complicaciones al tráfico hasta por 6 meses.{}Costo: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{YELLOW}Construir una estatua en honor a tu empresa.{}Otorga un aumento permanente a la evaluación estaciones en esta localidad.{}Costo: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{YELLOW}Pagar la construcción de nuevos edificios comerciales en la localidad.{}Otorga un aumento temporal a su crecimiento.{}Costo: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW}Comprar los derechos exclusivos de transporte en esta localidad por un año.{}El ayuntamiento solo permitirá el uso de estaciones que sean de tu empresa.{}Costo: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Sobornar al ayuntamiento para aumentar mejorar tu evaluación, con el riesgo de una severa penalización si llegas a ser descubierto.{}Costo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{YELLOW}Iniciar una pequeña campaña publicitaria local para atraer más pasajeros y carga a tus servicios de transporte.{}Otorga un aumento temporal a la evaluación de estaciones en un radio pequeño alrededor del centro de la localidad.{}{POP_COLOUR}Costo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{PUSH_COLOUR}{YELLOW}Iniciar una campaña publicitaria local mediana para atraer más pasajeros y carga a tus servicios de transporte.{}Otorga un aumento temporal a la evaluación de estaciones en un radio mediano alrededor del centro de la localidad.{}{POP_COLOUR}Costo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}Iniciar una gran campaña publicitaria local para atraer más pasajeros y carga a tus servicios de transporte.{}Otorga un aumento temporal a la evaluación de estaciones en un radio grande alrededor del centro de la localidad.{}{POP_COLOUR}Costo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{PUSH_COLOUR}{YELLOW}Pagar la reconstrucción de las carreteras locales.{}Provoca considerables complicaciones al tráfico hasta por 6 meses.{}{POP_COLOUR}Costo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Construir una estatua en honor a tu empresa.{}Otorga un aumento permanente a la evaluación estaciones en esta localidad.{}Costo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Pagar la construcción de nuevos edificios comerciales en la localidad.{}Otorga un aumento temporal a su crecimiento.{}{POP_COLOUR}Costo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}Comprar los derechos exclusivos de transporte en esta localidad por un año.{}El ayuntamiento solo permitirá el uso de estaciones que sean de tu empresa.{}{POP_COLOUR}Costo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Sobornar al ayuntamiento para aumentar mejorar tu evaluación, con el riesgo de una severa penalización si llegas a ser descubierto.{}{POP_COLOUR}Costo: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}Metas de {COMPANY} @@ -3531,11 +3552,11 @@ STR_STORY_BOOK_SPECTATOR_CAPTION :{WHITE}Historia STR_STORY_BOOK_SPECTATOR :Historial global STR_STORY_BOOK_TITLE :{YELLOW}{STRING} STR_STORY_BOOK_GENERIC_PAGE_ITEM :Página {NUM} -STR_STORY_BOOK_SEL_PAGE_TOOLTIP :{BLACK}Permitir ir a una página específica al elegirla en esta lista desplegable +STR_STORY_BOOK_SEL_PAGE_TOOLTIP :{BLACK}Pasar a una página específica al elegirla de esta lista STR_STORY_BOOK_PREV_PAGE :{BLACK}Anterior STR_STORY_BOOK_PREV_PAGE_TOOLTIP :{BLACK}Ir a la página anterior STR_STORY_BOOK_NEXT_PAGE :{BLACK}Siguiente -STR_STORY_BOOK_NEXT_PAGE_TOOLTIP :{BLACK}Ir a la siguiente página +STR_STORY_BOOK_NEXT_PAGE_TOOLTIP :{BLACK}Ir a la página siguiente STR_STORY_BOOK_INVALID_GOAL_REF :{RED}Referencia a objetivos no válida # Station list window @@ -3610,7 +3631,7 @@ STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Mostrar STR_STATION_VIEW_RENAME_STATION_CAPTION :Cambiar nombre de estación STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Cerrar aeropuerto -STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}No permitir que aterricen aviones en este aeropuerto +STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Evita el aterrizaje de aeronaves en este aeropuerto # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} @@ -3646,16 +3667,18 @@ STR_FINANCES_SECTION_SHIP_REVENUE :{GOLD}Barcos STR_FINANCES_SECTION_LOAN_INTEREST :{GOLD}T. de interés del préstamo STR_FINANCES_SECTION_OTHER :{GOLD}Otros +STR_FINANCES_TOTAL_CAPTION :{WHITE}Total STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} STR_FINANCES_ZERO_INCOME :{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} -STR_FINANCES_NET_PROFIT :{WHITE}Utilidad neta +STR_FINANCES_PROFIT :{WHITE}Ganancias STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Saldo en banco STR_FINANCES_OWN_FUNDS_TITLE :{WHITE}Fondos propios STR_FINANCES_LOAN_TITLE :{WHITE}Préstamo STR_FINANCES_INTEREST_RATE :{WHITE}T. de interés del préstamo: {BLACK}{NUM}% STR_FINANCES_MAX_LOAN :{WHITE}Préstamo máximo: {BLACK}{CURRENCY_LONG} STR_FINANCES_TOTAL_CURRENCY :{BLACK}{CURRENCY_LONG} +STR_FINANCES_BANK_BALANCE :{WHITE}{CURRENCY_LONG} STR_FINANCES_BORROW_BUTTON :{BLACK}Pedir préstamo de {CURRENCY_LONG} STR_FINANCES_BORROW_TOOLTIP :{BLACK}Incrementar préstamo. Ctrl+Clic solicita todo el préstamo posible STR_FINANCES_REPAY_BUTTON :{BLACK}Abonar {CURRENCY_LONG} del préstamo @@ -3670,7 +3693,7 @@ STR_COMPANY_VIEW_INAUGURATED_TITLE :{GOLD}Inaugurac STR_COMPANY_VIEW_COLOUR_SCHEME_TITLE :{GOLD}Cromática: STR_COMPANY_VIEW_VEHICLES_TITLE :{GOLD}Vehículos: STR_COMPANY_VIEW_TRAINS :{WHITE}{COMMA} tren{P "" es} -STR_COMPANY_VIEW_ROAD_VEHICLES :{WHITE}{COMMA} vehículo{P "" s} de carretera +STR_COMPANY_VIEW_ROAD_VEHICLES :{WHITE}{COMMA} autotransporte{P "" s} STR_COMPANY_VIEW_AIRCRAFT :{WHITE}{COMMA} aeronave{P "" s} STR_COMPANY_VIEW_SHIPS :{WHITE}{COMMA} barco{P "" s} STR_COMPANY_VIEW_VEHICLES_NONE :{WHITE}Ninguno @@ -3739,7 +3762,7 @@ STR_INDUSTRY_DIRECTORY_ITEM_PROD3 :{ORANGE}{INDUST STR_INDUSTRY_DIRECTORY_ITEM_PRODMORE :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} y {NUM} más... STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Nombres de industrias. Clic para centrar la vista en la industria. Ctrl+Clic abre una vista aparte STR_INDUSTRY_DIRECTORY_ACCEPTED_CARGO_FILTER :{BLACK}Carga aceptada: {SILVER}{STRING} -STR_INDUSTRY_DIRECTORY_PRODUCED_CARGO_FILTER :{BLACK}Cargemento producido: {SILVER}{STRING} +STR_INDUSTRY_DIRECTORY_PRODUCED_CARGO_FILTER :{BLACK}Carga producida: {SILVER}{STRING} STR_INDUSTRY_DIRECTORY_FILTER_ALL_TYPES :Todos los tipos STR_INDUSTRY_DIRECTORY_FILTER_NONE :Ninguno @@ -3756,7 +3779,7 @@ STR_INDUSTRY_VIEW_PRODUCES_N_CARGO :{BLACK}Produce: STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :, {STRING}{STRING} STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Requiere: -STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{0:STRING}{BLACK}{3:STRING} STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} esperando{STRING} STR_CONFIG_GAME_PRODUCTION :{WHITE}Cambiar producción (múltiplo de 8, máximo 2040) @@ -3765,7 +3788,7 @@ STR_CONFIG_GAME_PRODUCTION_LEVEL :{WHITE}Cambiar # Vehicle lists ###length VEHICLE_TYPES STR_VEHICLE_LIST_TRAIN_CAPTION :{WHITE}{STRING}: {COMMA} tren{P "" es} -STR_VEHICLE_LIST_ROAD_VEHICLE_CAPTION :{WHITE}{STRING}: {COMMA} vehículo{P "" s} de carretera +STR_VEHICLE_LIST_ROAD_VEHICLE_CAPTION :{WHITE}{STRING}: {COMMA} autotransporte{P "" s} STR_VEHICLE_LIST_SHIP_CAPTION :{WHITE}{STRING}: {COMMA} barco{P "" s} STR_VEHICLE_LIST_AIRCRAFT_CAPTION :{WHITE}{STRING}: {COMMA} aeronave{P "" s} @@ -3786,6 +3809,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Enviar i STR_VEHICLE_LIST_REPLACE_VEHICLES :Reemplazar vehículos STR_VEHICLE_LIST_SEND_FOR_SERVICING :Enviar a mantenimiento STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Ganancias este año: {CURRENCY_LONG} (último año: {CURRENCY_LONG}) +STR_VEHICLE_LIST_CARGO :{TINY_FONT}{BLACK}[{CARGO_LIST}] +STR_VEHICLE_LIST_NAME_AND_CARGO :{TINY_FONT}{BLACK}{STRING} {STRING} STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Enviar a depósito STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Enviar a depósito @@ -3877,11 +3902,16 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Máx. fu STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Alcance: {GOLD}{COMMA} casillas STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Tipo de aeronave: {GOLD}{STRING} +###length 3 +STR_CARGO_TYPE_FILTER_ALL :Todos los tipos +STR_CARGO_TYPE_FILTER_FREIGHT :Carga +STR_CARGO_TYPE_FILTER_NONE :Ninguno + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Lista de selección trenes. Clic en un tren para más información. Ctrl+Clic para mostrar u ocultar el tipo de tren STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Lista de selección de autotransportes. Clic en un vehículo para más información. Ctrl+Clic para mostrar u ocultar el tipo del vehículo STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Lista de selección de barcos. Clic en un barco para más información. Ctrl+Clic para mostrar u ocultar el tipo de barco -STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Lista de selección de aeronaves. Clic en un aeronave para más información. Ctrl+Clic para mostrar u ocultar el tipo de aeronave +STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Lista de selección de aeronaves. Clic en una aeronave para más información. Ctrl+Clic para mostrar u ocultar el tipo de aeronave ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_BUTTON :{BLACK}Comprar @@ -3905,7 +3935,7 @@ STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Comprar STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar y reformar el tren elegido. Mayús+Clic muestra un precio estimado de compra STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar y reformar el autotransporte elegido. Mayús+Clic muestra un precio estimado de compra STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar y reformar el barco elegido. Mayús+Clic muestra un precio estimado de compra -STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar y reformar la areonave seleccionada. Mayús+Clic muestra un costo estimado de compra +STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar y reformar la aeronave seleccionada. Mayús+Clic muestra un costo estimado de compra ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_RENAME_BUTTON :{BLACK}Cambiar nombre @@ -3952,7 +3982,7 @@ STR_DEPOT_RENAME_DEPOT_CAPTION :Cambiar nombre STR_DEPOT_NO_ENGINE :{BLACK}- STR_DEPOT_VEHICLE_TOOLTIP :{BLACK}{ENGINE}{STRING} STR_DEPOT_VEHICLE_TOOLTIP_CHAIN :{BLACK}{NUM} vehículo{P "" s}{STRING} -STR_DEPOT_VEHICLE_TOOLTIP_CARGO :{}{CARGO_LONG} ({CARGO_SHORT}) +STR_DEPOT_VEHICLE_TOOLTIP_CARGO :{}{CARGO_LONG} (capacidad: {CARGO_SHORT}) ###length VEHICLE_TYPES STR_DEPOT_TRAIN_LIST_TOOLTIP :{BLACK}Trenes: arrastrar vehículos de ferrocarril con Clic izquierdo para añadirlos o quitarlos del tren. Clic derecho para más información. Mantener pulsado Ctrl para usar estos comandos con el resto del tren @@ -4045,7 +4075,7 @@ STR_ENGINE_PREVIEW_AIRCRAFT :{G=f}aeronave STR_ENGINE_PREVIEW_SHIP :{G=m}barco STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Costo: {CURRENCY_LONG} Peso: {WEIGHT_SHORT}{}Velocidad: {VELOCITY} Potencia: {POWER}{}Costo de operación: {CURRENCY_LONG}/año{}Capacidad: {CARGO_LONG} -STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Costo: {CURRENCY_LONG} Peso: {WEIGHT_SHORT}{}Velocidad: {VELOCITY} Potencia: {POWER} Máx. F.T.: {6:FORCE}{}Costo de operación: {4:CURRENCY_LONG}/año{}Capacidad: {5:CARGO_LONG} +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Costo: {0:CURRENCY_LONG} Peso: {1:WEIGHT_SHORT}{}Velocidad: {2:VELOCITY} Potencia: {3:POWER} Máx. F.T.: {6:FORCE}{}Costo de operación: {4:CURRENCY_LONG}/año{}Capacidad: {5:CARGO_LONG} STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Costo: {CURRENCY_LONG} Velocidad máx.: {VELOCITY}{}Capacidad: {CARGO_LONG}{}Costo de mantenimiento: {CURRENCY_LONG}/año STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Costo: {CURRENCY_LONG} Vel. máx.: {VELOCITY}{}Tipo de aeronave: {STRING}{}Capacidad: {CARGO_LONG}, {CARGO_LONG}{}Costo de operación: {CURRENCY_LONG} al año STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Costo: {CURRENCY_LONG} Vel. máx.: {VELOCITY}{}Tipo de aeronave: {STRING}{}Capacidad: {CARGO_LONG}{}Costo de operación: {CURRENCY_LONG} al año @@ -4086,8 +4116,8 @@ STR_REPLACE_ALL_RAILTYPE :Todos los vehí STR_REPLACE_ALL_ROADTYPE :Todos los autotransportes ###length 2 -STR_REPLACE_HELP_RAILTYPE :{BLACK}Elegir el tipo de vías férreas para las que se desea reemplazar locomotoras -STR_REPLACE_HELP_ROADTYPE :{BLACK}Elegir el tipo de carretera para el que se desea reemplazar locomotoras +STR_REPLACE_HELP_RAILTYPE :{BLACK}Elegir el tipo de vías férreas según el vehículo ferroviario a reemplazar +STR_REPLACE_HELP_ROADTYPE :{BLACK}Elegir el tipo de carretera según el autotransporte a reemplazar ###next-name-looks-similar STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Mostrar el vehículo que reemplazará al otro de la izquierda @@ -4099,7 +4129,7 @@ STR_REPLACE_MAGLEV_VEHICLES :Trenes maglev STR_REPLACE_ROAD_VEHICLES :Autotransportes STR_REPLACE_TRAM_VEHICLES :Vehículos de tranvía -STR_REPLACE_REMOVE_WAGON :{BLACK}Quitar vagó ({STRING}): {ORANGE}{STRING} +STR_REPLACE_REMOVE_WAGON :{BLACK}Quitar vagones ({STRING}): {ORANGE}{STRING} STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Hacer que el reemplazo automático mantenga la longitud del tren quitando vagones (empezando por el frente), si el cambio de locomotora produce un tren más largo STR_REPLACE_REMOVE_WAGON_GROUP_HELP :{STRING}. Ctrl+Clic para incluir subgrupos @@ -4204,12 +4234,13 @@ STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Peso: {L STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Peso: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potencia: {LTBLUE}{POWER}{BLACK} Velocidad máx.: {LTBLUE}{VELOCITY} {BLACK}F.T. máx.: {LTBLUE}{FORCE} STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Ganancias este año: {LTBLUE}{CURRENCY_LONG} (último año: {CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Ganancias este año: {LTBLUE}{CURRENCY_LONG} (último año: {CURRENCY_LONG}) {BLACK}Mín. rendimiento: {LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Fiabilidad: {LTBLUE}{COMMA}% {BLACK}Averías desde el último mantenimiento: {LTBLUE}{COMMA} STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Construido: {LTBLUE}{NUM}{BLACK} Valor: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_INFO_NO_CAPACITY :{BLACK}Capacidad: {LTBLUE}Ninguna{STRING} -STR_VEHICLE_INFO_CAPACITY :{BLACK}Capacidad: {LTBLUE}{CARGO_LONG}{3:STRING} -STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Capacidad: {LTBLUE}{CARGO_LONG}{3:STRING} (×{4:NUM}) +STR_VEHICLE_INFO_CAPACITY :{BLACK}Capacidad: {LTBLUE}{0:CARGO_LONG}{3:STRING} +STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Capacidad: {LTBLUE}{0:CARGO_LONG}{3:STRING} (×{4:NUM}) STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Capacidad: {LTBLUE}{CARGO_LONG}, {CARGO_LONG}{STRING} STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Créditos por transferencia: {LTBLUE}{CURRENCY_LONG} @@ -4338,7 +4369,7 @@ STR_ORDER_CONDITIONAL_AGE :Edad (años) STR_ORDER_CONDITIONAL_REQUIRES_SERVICE :Requiere mantenimiento STR_ORDER_CONDITIONAL_UNCONDITIONALLY :Siempre STR_ORDER_CONDITIONAL_REMAINING_LIFETIME :Vida útil restante (años) -STR_ORDER_CONDITIONAL_MAX_RELIABILITY :Fabilidad máxima +STR_ORDER_CONDITIONAL_MAX_RELIABILITY :Fiabilidad máxima ###next-name-looks-similar STR_ORDER_CONDITIONAL_COMPARATOR_TOOLTIP :{BLACK}Comparación de los datos del vehículo respecto al valor dado @@ -4537,12 +4568,14 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Uno de l STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}La ventana de depuración de scripts solo está disponible para el servidor # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Configuración de scripts +STR_AI_CONFIG_CAPTION_AI :{WHITE}Configuración de IA +STR_AI_CONFIG_CAPTION_GAMESCRIPT :Configuración de scripts de juego STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Script de juego que será cargado en la próxima partida STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}Scripts de IA que serán cargados la próxima partida STR_AI_CONFIG_HUMAN_PLAYER :Jugador humano STR_AI_CONFIG_RANDOM_AI :IA aleatoria STR_AI_CONFIG_NONE :(ninguno) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Núm. máximo de jugadores: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Mover hacia arriba STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Mover la IA elegida una posición hacia arriba @@ -4550,12 +4583,11 @@ STR_AI_CONFIG_MOVE_DOWN :{BLACK}Mover ha STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Mover la IA elegida una posición hacia abajo STR_AI_CONFIG_GAMESCRIPT :{SILVER}Script de juego +STR_AI_CONFIG_GAMESCRIPT_PARAM :{SILVER}Parámetros STR_AI_CONFIG_AI :{SILVER}IA -STR_AI_CONFIG_CHANGE :{BLACK}Seleccionar {STRING} -STR_AI_CONFIG_CHANGE_NONE : -STR_AI_CONFIG_CHANGE_AI :IA -STR_AI_CONFIG_CHANGE_GAMESCRIPT :Script de juego +STR_AI_CONFIG_CHANGE_AI :{BLACK}Elegir IA +STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}Elegir script de juego STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Cargar otro script STR_AI_CONFIG_CONFIGURE :{BLACK}Configurar STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Configurar los parámetros del script @@ -4584,9 +4616,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Mapa de STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Captura de minimapa # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}Parámetros {STRING} -STR_AI_SETTINGS_CAPTION_AI :IA -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Script de juego +STR_AI_SETTINGS_CAPTION_AI :{WHITE}Parámetros de IA STR_AI_SETTINGS_CLOSE :{BLACK}Cerrar STR_AI_SETTINGS_RESET :{BLACK}Reiniciar STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4907,7 +4937,7 @@ STR_ERROR_CAN_T_PLANT_TREE_HERE :{WHITE}No se pu STR_ERROR_CAN_T_BUILD_BRIDGE_HERE :{WHITE}No se puede construir puente aquí... STR_ERROR_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Primero se debe demoler el puente STR_ERROR_CAN_T_START_AND_END_ON :{WHITE}No se puede comenzar y acabar en la misma posición -STR_ERROR_BRIDGEHEADS_NOT_SAME_HEIGHT :{WHITE}Las estribos del puente no están al mismo nivel +STR_ERROR_BRIDGEHEADS_NOT_SAME_HEIGHT :{WHITE}Los estribos del puente no están al mismo nivel STR_ERROR_BRIDGE_TOO_LOW_FOR_TERRAIN :{WHITE}El puente es demasiado bajo para este terreno STR_ERROR_BRIDGE_TOO_HIGH_FOR_TERRAIN :{WHITE}El puente es demasiado alto para este terreno STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Principio y final deben estar alineados @@ -4979,7 +5009,7 @@ STR_ERROR_CAN_T_STOP_START_AIRCRAFT :{WHITE}No se pu STR_ERROR_CAN_T_SEND_TRAIN_TO_DEPOT :{WHITE}No se puede enviar el tren al depósito... STR_ERROR_CAN_T_SEND_ROAD_VEHICLE_TO_DEPOT :{WHITE}No se puede enviar el vehículo al depósito... STR_ERROR_CAN_T_SEND_SHIP_TO_DEPOT :{WHITE}No se puede enviar el barco a astillero... -STR_ERROR_CAN_T_SEND_AIRCRAFT_TO_HANGAR :{WHITE}No se puede enviar el aeronave al hangar +STR_ERROR_CAN_T_SEND_AIRCRAFT_TO_HANGAR :{WHITE}No se puede enviar la aeronave al hangar ###length VEHICLE_TYPES STR_ERROR_CAN_T_BUY_TRAIN :{WHITE}No se puede comprar tren... @@ -5004,6 +5034,8 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}No se pu STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... el vehículo está destruido +STR_ERROR_CAN_T_CLONE_VEHICLE_LIST :{WHITE}... no todos los vehículos son idénticos + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}No habrá vehículos disponibles STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Se debe modificar la configuración de NewGRF STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Todavía no hay vehículos disponibles @@ -5030,6 +5062,8 @@ STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}No se pu STR_ERROR_CAN_T_COPY_SHARE_ORDER :{WHITE}... el vehículo no puede ir a todas las estaciones STR_ERROR_CAN_T_ADD_ORDER :{WHITE}... el vehículo no puede ir a esa estación STR_ERROR_CAN_T_ADD_ORDER_SHARED :{WHITE}... un vehículo que comparte este recorrido no puede ir a esa estación +STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST :{WHITE}... no todos los vehículos tienen los mismos recorridos +STR_ERROR_CAN_T_SHARE_ORDER_VEHICLE_LIST :{WHITE}... no todos los vehículos comparten los recorridos STR_ERROR_CAN_T_SHARE_ORDER_LIST :{WHITE}No se puede compartir la lista de recorridos... STR_ERROR_CAN_T_STOP_SHARING_ORDER_LIST :{WHITE}No se puede dejar de compartir la lista de recorridos... @@ -5083,7 +5117,7 @@ STR_TOWN_BUILDING_NAME_MODERN_OFFICE_BUILDING_1 :Edificio de ofi STR_TOWN_BUILDING_NAME_WAREHOUSE_1 :Almacén STR_TOWN_BUILDING_NAME_OFFICE_BLOCK_3 :Edificio de oficinas STR_TOWN_BUILDING_NAME_STADIUM_1 :Estadio -STR_TOWN_BUILDING_NAME_OLD_HOUSES_1 :Casas antiguass +STR_TOWN_BUILDING_NAME_OLD_HOUSES_1 :Casas antiguas STR_TOWN_BUILDING_NAME_COTTAGES_1 :Casas rurales STR_TOWN_BUILDING_NAME_HOUSES_1 :Casas STR_TOWN_BUILDING_NAME_FLATS_1 :Departamentos diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index 2139c0e3ab..6fa025c286 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -200,6 +200,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}hk STR_UNITS_POWER_METRIC :{COMMA}{NBSP}hk STR_UNITS_POWER_SI :{COMMA}{NBSP}kW + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -391,10 +392,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Avsluta # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Spelinställningar STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Inställningar -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Inställningar för datorspelare / spelskript STR_SETTINGS_MENU_NEWGRF_SETTINGS :Inställningar för NewGRF STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Inställningar för genomskinlighet STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Stadsnamn visas @@ -965,36 +965,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Indisk rupie (I STR_GAME_OPTIONS_CURRENCY_IDR :Indonesisk rupie (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Malaysisk ringgit (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Kör på vänster sida -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Kör på höger sida - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Stadsnamn: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Välj typ av stadsnamn - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Engelska (Original) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Franska -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Tyska -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Engelska (Extra) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Latinamerikanska -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Löjliga -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Svenska -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Hollänska -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finska -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Polska -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slovakiska -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norska -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Ungerska -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Österrikiska -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Rumänska -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Tjeckiska -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Schweiziska -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Danska -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turkiska -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italienska -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Katalanska - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Spara automatiskt STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Välj intervall mellan automatiskt sparande @@ -1027,21 +997,8 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Markera STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Nuvarande drivrutin: {STRING} -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Gränssnittstorlek -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Välj vilken gränssnittsstorlek som ska användas -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(Upptäck automatiskt) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Dubbel storlek -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Fyrdubbel storlek -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Storlek på typsnitt -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Välj vilken storlek som ska användas på gränssnittets typsnitt - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(Upptäck automatiskt) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Dubbel storlek -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Kvadrupel storlek STR_GAME_OPTIONS_GRAPHICS :{BLACK}Grafik @@ -1093,8 +1050,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Förhan STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 pund (£) i din valuta STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Ändra valutaparametrar -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Max antal motståndare: {ORANGE}{COMMA} - STR_NONE :Ingen STR_FUNDING_ONLY :Endast finansiering STR_MINIMAL :Minimal @@ -1144,6 +1099,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Tempererat landskap +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Sub-arktiskt landskap +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Sub-tropiskt landskap +STR_CLIMATE_TOYLAND_LANDSCAPE :Leksakslandskap + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Väldigt platt STR_TERRAIN_TYPE_FLAT :Platt @@ -1503,6 +1464,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Förbättrad STR_CONFIG_SETTING_ROAD_SIDE :Vägfordon: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Välj körsida +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Kör på vänster sida +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Kör på höger sida + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Höjdkartans rotation: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Motsols @@ -2037,7 +2002,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Vänd automatis STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Tillåt att tåg vänder vid en signal om de har väntat där länge ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Rekommenderad) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Rekommenderad) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Ändra inställningsvärde @@ -2080,7 +2045,6 @@ STR_INTRO_HIGHSCORE :{BLACK}Bästa s STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Inställningar STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF-inställningar STR_INTRO_ONLINE_CONTENT :{BLACK}Kontrollera online-innehåll -STR_INTRO_SCRIPT_SETTINGS :{BLACK}AI / spelskript-inställningar STR_INTRO_QUIT :{BLACK}Avsluta STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Starta ett nytt spel. Ctrl+klick hoppar över landskapskonfigurationen @@ -2100,7 +2064,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Visar en STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Skärminställningar STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Visa inställningar för NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Kolla efter nytt och nyuppdaterat innehåll för nedladdning -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Visa inställningar för datorspelare och spelskript STR_INTRO_TOOLTIP_QUIT :{BLACK}Avsluta 'OpenTTD' STR_INTRO_BASESET :{BLACK}Det grafikpaket som för närvarande är valt som standard saknar {NUM} sprite{P "" s}. Vänligen kontrollera om det finns en uppdatering till paketet. @@ -2132,12 +2095,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Byt dat STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Ändra nuvarande år STR_CHEAT_SETUP_PROD :{LTBLUE}Aktivera modifiering av produktionsvärden: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Tempererat landskap -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Sub-arktiskt landskap -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Sub-tropiskt landskap -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Leksakslandskap - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Färgschema @@ -3140,6 +3097,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Kartstor STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Ange kartans storlek i rutor. Antalet tillgängliga rutor kommer att bli något lägre STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Antal städer: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Stadsnamn: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Välj typ av stadsnamn STR_MAPGEN_DATE :{BLACK}Datum: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Antal industrier: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Högsta höjdpunkt: @@ -3155,12 +3114,35 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Minska STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Landgenerator: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terrängtyp: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Havsnivå +STR_MAPGEN_SEA_LEVEL :{BLACK}Havsnivå STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Flod: STR_MAPGEN_SMOOTHNESS :{BLACK}Jämnhet: STR_MAPGEN_VARIETY :{BLACK}Varierad distribution: STR_MAPGEN_GENERATE :{WHITE}Generera +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Engelska (Original) +STR_MAPGEN_TOWN_NAME_FRENCH :Franska +STR_MAPGEN_TOWN_NAME_GERMAN :Tyska +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Engelska (Extra) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Latinamerikanska +STR_MAPGEN_TOWN_NAME_SILLY :Löjliga +STR_MAPGEN_TOWN_NAME_SWEDISH :Svenska +STR_MAPGEN_TOWN_NAME_DUTCH :Hollänska +STR_MAPGEN_TOWN_NAME_FINNISH :Finska +STR_MAPGEN_TOWN_NAME_POLISH :Polska +STR_MAPGEN_TOWN_NAME_SLOVAK :Slovakiska +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norska +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Ungerska +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Österrikiska +STR_MAPGEN_TOWN_NAME_ROMANIAN :Rumänska +STR_MAPGEN_TOWN_NAME_CZECH :Tjeckiska +STR_MAPGEN_TOWN_NAME_SWISS :Schweiziska +STR_MAPGEN_TOWN_NAME_DANISH :Danska +STR_MAPGEN_TOWN_NAME_TURKISH :Turkiska +STR_MAPGEN_TOWN_NAME_ITALIAN :Italienska +STR_MAPGEN_TOWN_NAME_CATALAN :Katalanska + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Kartgränser: STR_MAPGEN_NORTHWEST :{BLACK}Nordväst @@ -3305,6 +3287,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Tidigare STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Fortsätt till föregående normala spriteobjekt, ignorera eventuella pseudo/recolour/font spriteobjekt och börja om från slutet efter första spriteobjektet STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Representation av det valda objektet. Justeringen ignoreras när objektet ritas. STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Flytta runt objektet, ändrar X och Y offsets. Ctrl+klicka för att flyta runt objektet åtta steg i taget + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Återställ relativ STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Återställ den nuvarande relativa offsetten STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X offsett: {NUM}, Y offsett: {NUM} (Absolut) @@ -3644,7 +3630,6 @@ STR_FINANCES_SECTION_OTHER :{GOLD}Övrigt STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} -STR_FINANCES_NET_PROFIT :{WHITE}Nettoförtjänst STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Banksaldo STR_FINANCES_OWN_FUNDS_TITLE :{WHITE}Egna medel STR_FINANCES_LOAN_TITLE :{WHITE}Lån @@ -3872,6 +3857,8 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Maximal STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Räckvidd: {GOLD}{COMMA} rutor STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Flygplanstyp: {GOLD}{STRING} +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Lista av tågvagnar. Klicka på tågvagn för information. Ctrl+klick visar eller döljer vagnstypen STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Vägfordonslista. Klicka på fordon för information. Ctrl+klick visar eller döljer fordonstypen @@ -4532,12 +4519,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Ett av s STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Felsökning av datorspelare / spelskript är bara tillgänglig för servern # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Konfiguration av datorspelare/spelskript STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Spelskriptet som kommer att läsas in i nästa spel STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}Datorspelare som kommer att läsas in i nästa spel STR_AI_CONFIG_HUMAN_PLAYER :Mänsklig spelare STR_AI_CONFIG_RANDOM_AI :Slumpa datorspelare STR_AI_CONFIG_NONE :(inget) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Max antal motståndare: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Flytta upp STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Flytta upp vald datorspelare i listan @@ -4547,8 +4534,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Flytta n STR_AI_CONFIG_GAMESCRIPT :{SILVER}Spelskript STR_AI_CONFIG_AI :{SILVER}Datorspelare -STR_AI_CONFIG_CHANGE :{BLACK}Välj {STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :Datorspelare STR_AI_CONFIG_CHANGE_GAMESCRIPT :Spelskript STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Läs in ett annat skript @@ -4579,9 +4564,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Skärmdu STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Skärmdump av miniatyrkartan # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} parametrar STR_AI_SETTINGS_CAPTION_AI :Datorspelarens -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Spelskriptets STR_AI_SETTINGS_CLOSE :{BLACK}Stäng STR_AI_SETTINGS_RESET :{BLACK}Återställ STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4998,6 +4981,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Kan inte STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... fordonet är förstört + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Inga fordon alls kommer att vara tillgängliga STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Ändra din konfiguration av NewGRF:er STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Inga fordon är tillgängliga än diff --git a/src/lang/tamil.txt b/src/lang/tamil.txt index f396445696..a9ebb69bf7 100644 --- a/src/lang/tamil.txt +++ b/src/lang/tamil.txt @@ -200,6 +200,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}hp STR_UNITS_POWER_METRIC :{COMMA}{NBSP}hp STR_UNITS_POWER_SI :{COMMA}{NBSP}kW + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}டன் STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}டன் STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}கி.கி. @@ -383,10 +384,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :வெளியேறு # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :விளையாட்டு விருப்ப பேரம் STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :அமைப்புகள் -STR_SETTINGS_MENU_SCRIPT_SETTINGS :AI / ஆட்ட அமைப்புகள் STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF அமைப்புகள் STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :ஒளி அமைப்புகள் STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :நகரத்தின் பெயர்களை காட்டு @@ -935,36 +935,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :இந்தி STR_GAME_OPTIONS_CURRENCY_IDR :இந்தோனேசிய ரூபியா (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :மலேசிய ரிங்கிட்டு (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :இடப்பக்கம் ஒட்டு -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :வலப்பக்கம் ஒட்டு - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}நகரங்களின் பெயர்கள்: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}நகர பெயர்கள் பாணியினைத் தேர்ந்தெடுக்கவும் - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :ஆங்கிலம் (இயற்கையான) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :பிரெஞ்சு -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :ஜெர்மன் -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :ஆங்கிலம் (கூடுதலான) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :இலத்தின்-அமெரிக்க -STR_GAME_OPTIONS_TOWN_NAME_SILLY :முட்டாள்தனமான -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :சுவீடிஷ் -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :டச்சு -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :பின்னிஷ் -STR_GAME_OPTIONS_TOWN_NAME_POLISH :போலிஷ் -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :சுலோவக் -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :நார்வேஜியன் -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :ஹங்கேரியன் -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :ஆஸ்திரியன் -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :ரோமேனியன் -STR_GAME_OPTIONS_TOWN_NAME_CZECH :செக் -STR_GAME_OPTIONS_TOWN_NAME_SWISS :சுவிஸ் -STR_GAME_OPTIONS_TOWN_NAME_DANISH :டேனிஷ் -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :துர்கிஷ் -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :இத்தாலியன் -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :கடலன் - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}தானாக சேமி STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}தானியங்கி விளையாட்டு சேமிப்பு இடைவெளியைத் தேர்ந்தெடுக்கவும் @@ -992,19 +962,8 @@ STR_GAME_OPTIONS_RESOLUTION_ITEM :{NUM}x{NUM} STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}இடைமுக அளவு -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}பயன்படுத்த இடைமுக உறுப்பு அளவை தேர்ந்தெடுக்கவும் -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(தானாக கண்டறி) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :சராசரி -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :இரண்டு மடங்கு -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :நான்கு மடங்கு -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}எழுத்துரு அளவு - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :இயல்பான -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :இரண்டு மடங்கு -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :நான்கு மடங்கு STR_GAME_OPTIONS_REFRESH_RATE_ITEM :{NUM}Hz @@ -1052,8 +1011,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}மு STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 பவுண்டு (£) உங்க்ள் நாணயத்தில் STR_CURRENCY_CHANGE_PARAMETER :{BLACK}பயனரால் மாற்றப்பட்ட பண குணாதிசயங்களை மாற்று -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}அதிகபட்ச போட்டியாளர்கள்: {ORANGE}{COMMA} - STR_NONE :ஒன்றுமில்லை STR_FUNDING_ONLY :நிதியளிப்பு மட்டும் STR_MINIMAL :குறைந்தபட்சம் @@ -1103,6 +1060,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :மிதமான நிலவெளி +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :வட துருவ நிலவெளி +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :மிதவெப்பமண்டல நிலவெளி +STR_CLIMATE_TOYLAND_LANDSCAPE :பொம்மை நிலவெளி + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :மிகவும் சமமான STR_TERRAIN_TYPE_FLAT :சமமான @@ -1399,6 +1362,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :சீரமை STR_CONFIG_SETTING_ROAD_SIDE :சாலை வாகனங்கள்: {STRING} +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :இடப்பக்கம் ஒட்டு +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :வலப்பக்கம் ஒட்டு + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :உயர்பட சுழற்ச்சி: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :வலமிருந்து இடமாக செல் @@ -1827,7 +1794,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :சிக்ன STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :இரயில்கள் நீண்ட நேரம் காத்திருந்தால், சிக்னலில் திரும்புவதற்கு அனுமதிக்கவும் ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(பரிந்துரைக்கப்பட்டது) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(பரிந்துரைக்கப்பட்டது) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}அமைப்பின் மதிப்பினை மாற்று @@ -1848,6 +1815,7 @@ STR_CONFIG_ERROR_OUT_OF_MEMORY :{WHITE}நி # Video initalization errors STR_VIDEO_DRIVER_ERROR :{WHITE}வீடியோ அமைப்புகளில் பிழை... +STR_VIDEO_DRIVER_ERROR_NO_HARDWARE_ACCELERATION :{WHITE}... இணைவொத்த GPU கிடைக்கவில்லை. வன்பொருள் முடுக்கம் செயலிழக்கப்பட்டுள்ளது # Intro window STR_INTRO_CAPTION :{WHITE}OpenTTD {REV} @@ -1864,7 +1832,6 @@ STR_INTRO_HIGHSCORE :{BLACK}பு STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}அமைப்புகள் STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF அமைப்புகள் STR_INTRO_ONLINE_CONTENT :{BLACK}கோப்புகளை இணையதளத்தில் தேடு -STR_INTRO_SCRIPT_SETTINGS :{BLACK}AI / ஆட்டம் அமைப்புகள் STR_INTRO_QUIT :{BLACK}வெளியேறு STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}புதிய ஆட்டத்தினைத் தொடங்கும். Ctrl+Click அழுத்தினால் வரைபட அமைப்புவடிவாக்கம் தவிர்க்கப்படும் @@ -1882,7 +1849,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}பு STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}திரை அமைப்புகள் STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}NewGRF அமைப்புகளைக் காட்டு STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}பதிவிறக்கம் செய்ய புதிய மற்றும் புதுப்பிக்கப்பட்ட உள்ளடக்கத்தை பார்க்கவும் -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}AI/வரிவடிவங்கள் அமைப்புகளைக் காட்டு STR_INTRO_TOOLTIP_QUIT :{BLACK} 'OpenTTD'ஐ விட்டு வெளியேறு STR_INTRO_TRANSLATION :{BLACK}இந்த மொழிபெயர்ப்பில் {NUM} இல்லை {P "" s}.மொழிபெயர்பாளராக பதிவு செய்து OpenTTDவிற்கு உதவவும். மேலும் விவரங்கள் அறிய readme.txt ஐ பார்க்கவும்.. @@ -1912,12 +1878,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}தே STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}நடப்பு வருடத்தை மாற்று STR_CHEAT_SETUP_PROD :{LTBLUE}தயாரிப்பு மதிப்புகளை மாற்ற முடியும்: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :மிதமான நிலவெளி -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :வட துருவ நிலவெளி -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :மிதவெப்பமண்டல நிலவெளி -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :பொம்மை நிலவெளி - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - நிற கோட்பாடு @@ -2113,6 +2073,7 @@ STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE :{BLACK}தொ STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TOOLTIP :{BLACK}உங்கள் சேவையகத்தை மற்றவர்கள் எப்படி அணுகலாம் STR_NETWORK_CLIENT_LIST_PLAYER_NAME_TOOLTIP :{BLACK}உங்கள் வீரரின் பெயர் STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_TOOLTIP :{BLACK}இந்த நிறுவனத்திற்கான நிர்வாக நடவடிக்கைகள் +STR_NETWORK_CLIENT_LIST_JOIN_TOOLTIP :இந்த நிறுவனத்தில் சேரு STR_NETWORK_CLIENT_LIST_CHAT_CLIENT_TOOLTIP :{BLACK}இந்த விளையாட்டாளருக்கு ஒரு செய்தியை அனுப்பவும் STR_NETWORK_CLIENT_LIST_CHAT_SPECTATOR_TOOLTIP :{BLACK}அனைத்து பார்வையாளர்களுக்கும் ஒரு செய்தியை அனுப்பவும் STR_NETWORK_CLIENT_LIST_NEW_COMPANY :(புதிய நிறுவனம்) @@ -2797,6 +2758,8 @@ STR_MAPGEN_WORLD_GENERATION_CAPTION :{WHITE}உல STR_MAPGEN_MAPSIZE :{BLACK}வரைபடத்தின் அளவு: STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}நகரங்களின் எண்ணிக்கை: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}நகரங்களின் பெயர்கள்: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}நகர பெயர்கள் பாணியினைத் தேர்ந்தெடுக்கவும் STR_MAPGEN_DATE :{BLACK}தேதி: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}தொழிற்சாலைகளின் எண்ணிக்கை: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}மிக உயர்ந்த சிகரம்: @@ -2809,12 +2772,35 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}பா STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}பூமி உருவாக்குனர்: STR_MAPGEN_TERRAIN_TYPE :{BLACK}நிலவகை: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}கடல் மட்டம்: +STR_MAPGEN_SEA_LEVEL :{BLACK}கடல் மட்டம்: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}ஆறுகள்: STR_MAPGEN_SMOOTHNESS :{BLACK}சமநிலை: STR_MAPGEN_VARIETY :{BLACK}பலவகை பரவல்: STR_MAPGEN_GENERATE :{WHITE}உருவாக்கு +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :ஆங்கிலம் (இயற்கையான) +STR_MAPGEN_TOWN_NAME_FRENCH :பிரெஞ்சு +STR_MAPGEN_TOWN_NAME_GERMAN :ஜெர்மன் +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :ஆங்கிலம் (கூடுதலான) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :இலத்தின்-அமெரிக்க +STR_MAPGEN_TOWN_NAME_SILLY :முட்டாள்தனமான +STR_MAPGEN_TOWN_NAME_SWEDISH :சுவீடிஷ் +STR_MAPGEN_TOWN_NAME_DUTCH :டச்சு +STR_MAPGEN_TOWN_NAME_FINNISH :பின்னிஷ் +STR_MAPGEN_TOWN_NAME_POLISH :போலிஷ் +STR_MAPGEN_TOWN_NAME_SLOVAK :சுலோவக் +STR_MAPGEN_TOWN_NAME_NORWEGIAN :நார்வேஜியன் +STR_MAPGEN_TOWN_NAME_HUNGARIAN :ஹங்கேரியன் +STR_MAPGEN_TOWN_NAME_AUSTRIAN :ஆஸ்திரியன் +STR_MAPGEN_TOWN_NAME_ROMANIAN :ரோமேனியன் +STR_MAPGEN_TOWN_NAME_CZECH :செக் +STR_MAPGEN_TOWN_NAME_SWISS :சுவிஸ் +STR_MAPGEN_TOWN_NAME_DANISH :டேனிஷ் +STR_MAPGEN_TOWN_NAME_TURKISH :துர்கிஷ் +STR_MAPGEN_TOWN_NAME_ITALIAN :இத்தாலியன் +STR_MAPGEN_TOWN_NAME_CATALAN :கடலன் + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}வரைபடத்தின் முனைகள்: STR_MAPGEN_NORTHWEST :{BLACK}வடமேற்கு @@ -2941,6 +2927,10 @@ STR_SPRITE_ALIGNER_CAPTION :{WHITE}ஸ் STR_SPRITE_ALIGNER_NEXT_BUTTON :{BLACK}அடுத்த ஸ்பிரைட்டு STR_SPRITE_ALIGNER_GOTO_BUTTON :{BLACK}ஸ்பிரைட்டுயிற்கு செல்லவும் STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}முந்தைய ஸ்பிரைட்டு + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}முன்னிருந்தமாதிரி மாற்று STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}தற்போதைய ஆஃப்செட்களை மீட்டமைக்கவும் STR_SPRITE_ALIGNER_OFFSETS_REL :{BLACK}X ஒதுக்கம்: {NUM}, Y ஒதுக்கம்: {NUM} (சார்பு) @@ -3432,6 +3422,7 @@ STR_BUY_VEHICLE_SHIP_CAPTION :புது STR_BUY_VEHICLE_AIRCRAFT_CAPTION :புது விமானம் STR_PURCHASE_INFO_COST_WEIGHT :{BLACK}செலவு: {GOLD}{CURRENCY_LONG}{BLACK} எடை: {GOLD}{WEIGHT_SHORT} +STR_PURCHASE_INFO_COST_REFIT_WEIGHT :{BLACK} செலவு: {GOLD}{CURRENCY_LONG}{BLACK} (சரக்கு திருத்தல் விலை: {GOLD}{CURRENCY_LONG}{BLACK}) கனம்: {GOLD}{WEIGHT_SHORT} STR_PURCHASE_INFO_SPEED_POWER :{BLACK}வேகம்: {GOLD}{VELOCITY}{BLACK} திறன்: {GOLD}{POWER} STR_PURCHASE_INFO_SPEED :{BLACK}வேகம்: {GOLD}{VELOCITY} STR_PURCHASE_INFO_SPEED_OCEAN :{BLACK}கடலில் வேகம்: {GOLD}{VELOCITY} @@ -3454,6 +3445,8 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}அத STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}தூரம்: {GOLD}{COMMA} கட்டங்கள் STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}விமான வகை: {GOLD}{STRING} +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}இரயில் வாகனங்கள் பட்டியல் - மேலும் விவரங்களுக்கு வாகனத்தை சொடுக்கவும் STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}சாலை வாகனங்கள் பட்டியல் - மேலும் விவரங்களுக்கு வாகனத்தை சொடுக்கவும் @@ -4060,12 +4053,12 @@ STR_AI_GAME_SCRIPT_TOOLTIP :{BLACK}வர STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}AI/ஆட்ட வரிவடிவம் சரிபார்த்தல் கட்டம் சர்வர்களுக்கு மட்டுமே உள்ளது # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}AI/வரிவடிவம் ஏற்றபடி அமை STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}வரிவடிவம் அடுத்த ஆட்டங்களிலிருந்து பதிவேற்றப்படும் STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}அடுத்த ஆட்டங்களில் பதிவேற்றப்படும் AI-கள் STR_AI_CONFIG_HUMAN_PLAYER :மனித வீரர் STR_AI_CONFIG_RANDOM_AI :ஏதொவொரு AI STR_AI_CONFIG_NONE :(none) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}அதிகபட்ச போட்டியாளர்கள்: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}மேல் நகர்த்து STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}தேரந்தெடுக்கப்பட்ட AI-இனை பட்டியலில் மேல் நகர்த்து @@ -4075,8 +4068,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}தே STR_AI_CONFIG_GAMESCRIPT :{SILVER}விளையாட்டின் ஸ்கிரிப்ட் STR_AI_CONFIG_AI :{SILVER}AIகள் -STR_AI_CONFIG_CHANGE :{BLACK}தேர்ந்தெடு {STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :AI STR_AI_CONFIG_CHANGE_GAMESCRIPT :விளையாட்டின் ஸ்கிரிப்ட் STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}மற்றொறு வரிவடிவத்தினை பதிவேற்று @@ -4107,9 +4098,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}உய STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}சிறிய வரைபட திரைபிடிப்பு # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} குணாதிசயங்கள் STR_AI_SETTINGS_CAPTION_AI :AI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :விளையாட்டின் ஸ்கிரிப்ட் STR_AI_SETTINGS_CLOSE :{BLACK}மூடு STR_AI_SETTINGS_RESET :{BLACK}முன்னிருந்தமாதிரி மாற்று STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4517,6 +4506,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}சர STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... வாகனம் அழிக்கப்பட்டுள்ளது + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}எந்த வாகனங்களும் தற்போது கிடையாது STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}தங்களது NewGRF அமைப்பினை மாற்றவும் STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}தற்போது எந்த வாகனங்களும் கிடையாது diff --git a/src/lang/thai.txt b/src/lang/thai.txt index ac3af355b3..20fb06bf97 100644 --- a/src/lang/thai.txt +++ b/src/lang/thai.txt @@ -198,6 +198,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA} แร STR_UNITS_POWER_METRIC :{COMMA} แรงม้า STR_UNITS_POWER_SI :{COMMA} กิโลวัตต์ + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}ตัน STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA} ตัน STR_UNITS_WEIGHT_SHORT_SI :{COMMA} กิโลกรัม @@ -379,10 +380,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :ออก # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :ตัวเลือกเกม STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :การตั้งค่า -STR_SETTINGS_MENU_SCRIPT_SETTINGS :กำหนดค่าสคริปต์ AI/Game STR_SETTINGS_MENU_NEWGRF_SETTINGS :กำหนดค่า NewGRF STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :แถบเมนูตั้งค่าวัตถุโปร่งใส STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :แสดงชื่อเมือง @@ -941,36 +941,6 @@ STR_GAME_OPTIONS_CURRENCY_IRR :Iranian Rial (I STR_GAME_OPTIONS_CURRENCY_HKD :ดอลลาร์ฮ่องกง (HKD) STR_GAME_OPTIONS_CURRENCY_MYR :ริงกิตมาเลเซีย (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :ขับชิดซ้าย -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :ขับชิดขวา - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}ชื่อเมือง: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}เลือกรูปแบบของชื่อเมือง - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :อังกฤษ (ดั้งเดิม) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :ฝรั่งเศส -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :เยอรมัน -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :อังกฤษ (ตัวเสริม) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :ลาติน-อเมริกัน -STR_GAME_OPTIONS_TOWN_NAME_SILLY :อังกฤษอย่างง่าย -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :สวีดิช -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :ดัชต์ -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :ฟินน์ -STR_GAME_OPTIONS_TOWN_NAME_POLISH :โปลิช -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :สโลวากิช -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :นอร์วิเจียน -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :ฮังกาเรียน -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :ออสเตรียน -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :โรมาเนียน -STR_GAME_OPTIONS_TOWN_NAME_CZECH :เช็ค -STR_GAME_OPTIONS_TOWN_NAME_SWISS :สวิส -STR_GAME_OPTIONS_TOWN_NAME_DANISH :เดนมาร์ค -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :ตุรกี -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :อิตาเลียน -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :คาตาลัน - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}บันทึกเกมอัตโนมัติ STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}เลือกระยะห่างระหว่างการบันทึกเกมอัตโนมัติแต่ละครั้ง @@ -995,15 +965,8 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :อื่นๆ -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}ขนาดของแผงควบคุม -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :ปกติ -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :คูณสี่ -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}ขนาดตัวอักษร - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :ปกติ -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :ขนาดใหญ่คูณสอง STR_GAME_OPTIONS_REFRESH_RATE :{BLACK}รีเฟรชเรทของหน้าจอ @@ -1051,8 +1014,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}แส STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 ปอนด์สเตอร์ลิง (£) ในสกุลเงินของคุณ STR_CURRENCY_CHANGE_PARAMETER :{BLACK}เปลี่ยนการกำหนดค่าตัวแปรสกุลเงิน -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}จำนวนผู้ร่วมแข่งขันสูงสุด: {ORANGE}{COMMA} - STR_NONE :ไม่มี STR_FUNDING_ONLY :ระดมทุนเท่านั้น STR_MINIMAL :ขั้นต่ำ @@ -1102,6 +1063,12 @@ STR_SUBSIDY_X2 :2 เท่า STR_SUBSIDY_X3 :3 เท่า STR_SUBSIDY_X4 :4 เท่า +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :ภูมิประเทศเขตอบอุ่น +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :ภูมิประเทศเขตกึ่งขั้วโลก +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :ภูมิประเทศเขตกึ่งมรสุม +STR_CLIMATE_TOYLAND_LANDSCAPE :ภูมิประเทศเมืองของเล่น + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :แบนราบมาก STR_TERRAIN_TYPE_FLAT :แบนราบ @@ -1428,6 +1395,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :ปรังป STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :เลือกฝั่งในการขับขี่ +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :ขับชิดซ้าย +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :ขับชิดขวา + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :ทิศการหมุน Heightmap: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :ทวนเข็มนาฬิกา @@ -1916,7 +1887,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :หมุนก STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :อนุญาตให้ขบวนรถไฟกลับขบวนที่เสาอาณัติสัญญาณเมื่อมีการรอสัญญาณอนุญาตเป็นเวลานาน ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(แนะนำ) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(แนะนำ) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}เปลี่ยนค่าการตั้งค่า @@ -1958,7 +1929,6 @@ STR_INTRO_HIGHSCORE :{BLACK}ตา STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}ตั้งค่า STR_INTRO_NEWGRF_SETTINGS :{BLACK}การตั้งค่า NewGRF STR_INTRO_ONLINE_CONTENT :{BLACK}ตรวจสอบเนื้อหาออนไลน์ -STR_INTRO_SCRIPT_SETTINGS :{BLACK}ตั้งค่า AI/Game Script STR_INTRO_QUIT :{BLACK}ออก STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}เริ่มเกมใหม่, Ctrl+Click เพื่อข้ามการตั้งค่าแผนที่ @@ -1978,7 +1948,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}แส STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}การตั้งค่า หน้าจอ STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}แสดงการกำหนดค่า NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}ตรวจสอบเนื้อหาใหม่และการปรับปรุงสำหรับดาวโหลด -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}แสดงการตั้งค่า AI/Game script STR_INTRO_TOOLTIP_QUIT :{BLACK}ออกจากเกม OpenTTD STR_INTRO_TRANSLATION :{BLACK} การแปลภาษาส่วนนี้หายไป {NUM} string{P ""}. โปรดช่วยทำให้ OpenTTD ดีขึ้นโดยการสมัครเป็นผู้แปล. ดูใน readme.txt สำหรับรายละเอียด. @@ -2007,12 +1976,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}เป STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}เปลี่ยนปีปัจจุบัน STR_CHEAT_SETUP_PROD :{LTBLUE}เปิดใช้งานการแก้ไขปริมาณผลผลิต: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :ภูมิประเทศเขตอบอุ่น -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :ภูมิประเทศเขตกึ่งขั้วโลก -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :ภูมิประเทศเขตกึ่งมรสุม -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :ภูมิประเทศเมืองของเล่น - # Livery window STR_LIVERY_GENERAL_TOOLTIP :{BLACK}แสดงแบบสีทั่วไป @@ -2931,6 +2894,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}ขน STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}เลือกขนาดของแผนที่(ตาราง) จำนวนของตารางที่สามารถมองเห็นจะมีจำนวนน้อยกว่าเล็กน้อย STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}จำนวนเมือง +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}ชื่อเมือง: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}เลือกรูปแบบของชื่อเมือง STR_MAPGEN_DATE :{BLACK}วันที่: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}จำนวนอุตสาหกรรม: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}จุดที่พีคมากที่สุด: @@ -2940,12 +2905,35 @@ STR_MAPGEN_SNOW_COVERAGE_UP :{BLACK}เพ STR_MAPGEN_DESERT_COVERAGE :{BLACK}การปกคลุมของทะเลทราย: STR_MAPGEN_LAND_GENERATOR :{BLACK}เครื่องมือสร้างสภาพพื้นดิน: STR_MAPGEN_TERRAIN_TYPE :{BLACK}ประเภทภูมิประเทศ: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}ระดับทะเล: +STR_MAPGEN_SEA_LEVEL :{BLACK}ระดับทะเล: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}แม่น้ำ: STR_MAPGEN_SMOOTHNESS :{BLACK}ความเรียบ: STR_MAPGEN_VARIETY :{BLACK}การกระจายความแตกต่าง: STR_MAPGEN_GENERATE :{WHITE}สร้างสภาพภูมิประเทศ +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :อังกฤษ (ดั้งเดิม) +STR_MAPGEN_TOWN_NAME_FRENCH :ฝรั่งเศส +STR_MAPGEN_TOWN_NAME_GERMAN :เยอรมัน +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :อังกฤษ (ตัวเสริม) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :ลาติน-อเมริกัน +STR_MAPGEN_TOWN_NAME_SILLY :อังกฤษอย่างง่าย +STR_MAPGEN_TOWN_NAME_SWEDISH :สวีดิช +STR_MAPGEN_TOWN_NAME_DUTCH :ดัชต์ +STR_MAPGEN_TOWN_NAME_FINNISH :ฟินน์ +STR_MAPGEN_TOWN_NAME_POLISH :โปลิช +STR_MAPGEN_TOWN_NAME_SLOVAK :สโลวากิช +STR_MAPGEN_TOWN_NAME_NORWEGIAN :นอร์วิเจียน +STR_MAPGEN_TOWN_NAME_HUNGARIAN :ฮังกาเรียน +STR_MAPGEN_TOWN_NAME_AUSTRIAN :ออสเตรียน +STR_MAPGEN_TOWN_NAME_ROMANIAN :โรมาเนียน +STR_MAPGEN_TOWN_NAME_CZECH :เช็ค +STR_MAPGEN_TOWN_NAME_SWISS :สวิส +STR_MAPGEN_TOWN_NAME_DANISH :เดนมาร์ค +STR_MAPGEN_TOWN_NAME_TURKISH :ตุรกี +STR_MAPGEN_TOWN_NAME_ITALIAN :อิตาเลียน +STR_MAPGEN_TOWN_NAME_CATALAN :คาตาลัน + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}ขอบแผนที่: STR_MAPGEN_NORTHWEST :{BLACK}ตะวันตกเฉียงเหนือ @@ -3080,6 +3068,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}sprite STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}เคลื่อนไปยัง sprite ปกติอันก่อนหน้า โดยข้าม pseudo/recolour/font และวกกลับเมื่อถึงจุดเริ่มต้น STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}แสดง sprite ที่เลือกใหม่อีกครั้ง STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}ย้าย sprite wxiv[q, แก้ไขแกน X และ Y สำหรับความคลาดเคลื่อน + +###length 2 + + STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}รีเซ็ตการตั้งค่าปัจจุบัน STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}ตำแน่ง X: {NUM}, ตำแหน่ง Y: {NUM} (แบบแน่นอน) STR_SPRITE_ALIGNER_PICKER_BUTTON :{BLACK}หยิบ sprite @@ -3604,6 +3596,8 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}กำ STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}พิสัยทำการ: {GOLD}{COMMA} ช่อง STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}ชนิดของเครื่องบิน: {GOLD}{STRING} +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}รายการรถไฟ - คลิกที่รถไฟเพื่อดูรายละเอียด STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}รายการรถ - คลิกที่รถเพื่อดูรายละเอียด @@ -4240,12 +4234,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}ถ้ STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}AI/Game Script Debug window จะใช้งานได้เฉพาะที่เป็น Server # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}ปรับแต่ง AI/Game Script STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Game Script จะเปิดใช้งานในเกมถัดไป STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}AI จะทำการเปิดใช้งานในเกมถัดไป STR_AI_CONFIG_HUMAN_PLAYER :ผู้เล่น STR_AI_CONFIG_RANDOM_AI :คอมพิวเตอร์ STR_AI_CONFIG_NONE :(ไม่มี) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}จำนวนผู้ร่วมแข่งขันสูงสุด: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}เลื่อนขึ้น STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}ย้าย AI ที่เลือกขึ้นด้านบนของรายชื่อ @@ -4255,8 +4249,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}ย้ STR_AI_CONFIG_GAMESCRIPT :{SILVER}Game Script STR_AI_CONFIG_AI :{SILVER}AI -STR_AI_CONFIG_CHANGE :{BLACK}เลือก {STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :AI STR_AI_CONFIG_CHANGE_GAMESCRIPT :Game Script STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}โหลดscriptอื่น @@ -4282,9 +4274,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}บั STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}จับภาพหน้าจอ มินิแมพ # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameters STR_AI_SETTINGS_CAPTION_AI :AI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Game Script STR_AI_SETTINGS_CLOSE :{BLACK}ปิด STR_AI_SETTINGS_RESET :{BLACK}เริ่มใหม่ STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4689,6 +4679,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}ไม STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... ยานพาหนะถูกทำลาย + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}ไม่มียานพาหานะให้เลือก STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}เปลี่ยนการกำหนดค่าสำหรับ NewGRF STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}ยังไม่มียานพาหานะให้เลือก diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index 0b6890eb22..e16613f80d 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -200,6 +200,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP} STR_UNITS_POWER_METRIC :{COMMA}{NBSP}匹 STR_UNITS_POWER_SI :{COMMA}{NBSP}千瓦 + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}短噸 STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}噸 STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}公斤 @@ -391,10 +392,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :離開 # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :遊戲選項 STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :設定 -STR_SETTINGS_MENU_SCRIPT_SETTINGS :AI / 遊戲腳本設定 STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF 設定 STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :透明度選項 STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :顯示市鎮名稱 @@ -965,36 +965,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :印度盧比(IN STR_GAME_OPTIONS_CURRENCY_IDR :印尼盾 (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :馬來西亞令吉 (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :靠左行駛 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :靠右行駛 - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}市鎮名稱: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}選擇市鎮命名風格 - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :英國 (原版) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :法國 -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :德國 -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :英國 (增訂版) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :拉丁美洲 -STR_GAME_OPTIONS_TOWN_NAME_SILLY :荒唐名稱 -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :瑞典 -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :荷蘭 -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :芬蘭 -STR_GAME_OPTIONS_TOWN_NAME_POLISH :波蘭 -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :斯洛伐克 -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :挪威 -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :匈牙利 -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :奧地利 -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :羅馬尼亞 -STR_GAME_OPTIONS_TOWN_NAME_CZECH :捷克 -STR_GAME_OPTIONS_TOWN_NAME_SWISS :瑞士 -STR_GAME_OPTIONS_TOWN_NAME_DANISH :丹麥 -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :土耳其 -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :義大利 -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :加泰隆尼亞 - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}自動存檔 STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}選擇自動存檔頻率 @@ -1027,21 +997,8 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}勾選 STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}使用中的驅動程式: {STRING} -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}介面大小 -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}選擇使用的介面元素大小 -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(自動偵測) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :正常大小 -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :兩倍大小 -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :四倍大小 -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}字體大小 -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}選擇此字體大小 - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(自動偵測) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :正常 -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :兩倍大小 -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :四倍大小 STR_GAME_OPTIONS_GRAPHICS :{BLACK}圖形 @@ -1093,8 +1050,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}預覽 STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}將10000 Pound (£)換算成你的幣值 STR_CURRENCY_CHANGE_PARAMETER :{BLACK}修改自訂幣值參數 -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}競爭對手數目上限:{ORANGE}{COMMA} - STR_NONE :無 STR_FUNDING_ONLY :只挹注資金 STR_MINIMAL :最小 @@ -1144,6 +1099,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :溫帶 +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :寒帶 +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :亞熱帶 +STR_CLIMATE_TOYLAND_LANDSCAPE :玩具世界 + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :非常平坦 STR_TERRAIN_TYPE_FLAT :平坦 @@ -1503,6 +1464,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :改進版 STR_CONFIG_SETTING_ROAD_SIDE :公路車輛:{STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :選擇行車方向。 +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :靠左行駛 +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :靠右行駛 + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :旋轉高度圖:{STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :逆時針 @@ -2037,7 +2002,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :在號誌自動 STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :設定是否容許列車在號誌前等候超過一段時間後調頭。 ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(建議) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(建議) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}修改設定值 @@ -2080,7 +2045,6 @@ STR_INTRO_HIGHSCORE :{BLACK}積分 STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}設定 STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF 設定 STR_INTRO_ONLINE_CONTENT :{BLACK}檢查線上內容 -STR_INTRO_SCRIPT_SETTINGS :{BLACK}AI / 遊戲腳本設定 STR_INTRO_QUIT :{BLACK}離開 STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}開始新遊戲。按住 Ctrl 點選可跳過地圖設定畫面 @@ -2100,7 +2064,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}顯示 STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}顯示設定 STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}顯示 NewGRF 設定 STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}檢查有無最新或可更新的內容可下載 -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}顯示AI和遊戲腳本設定 STR_INTRO_TOOLTIP_QUIT :{BLACK}離開「OpenTTD」 STR_INTRO_BASESET :{BLACK}目前圖形設定缺少 {NUM}個貼圖。 請確認基礎貼圖組是否有更新。 @@ -2132,12 +2095,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}修改 STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}變更目前年份 STR_CHEAT_SETUP_PROD :{LTBLUE}允許修改產量:{ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :溫帶 -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :寒帶 -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :亞熱帶 -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :玩具世界 - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} 的配色 @@ -3140,6 +3097,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}地圖 STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}選擇地圖大小(單位為方格)。實際可供使用的方格數量會比所設定的值略低 STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}市鎮數量: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}市鎮名稱: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}選擇市鎮命名風格 STR_MAPGEN_DATE :{BLACK}日期: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}工業數量: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}最高峰: @@ -3155,12 +3114,35 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}將沙 STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}地形產生器: STR_MAPGEN_TERRAIN_TYPE :{BLACK}地形種類: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}海平面: +STR_MAPGEN_SEA_LEVEL :{BLACK}海平面: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}河流: STR_MAPGEN_SMOOTHNESS :{BLACK}平滑度: STR_MAPGEN_VARIETY :{BLACK}地形起伏分佈: STR_MAPGEN_GENERATE :{WHITE}產生 +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :英國 (原版) +STR_MAPGEN_TOWN_NAME_FRENCH :法國 +STR_MAPGEN_TOWN_NAME_GERMAN :德國 +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :英國 (增訂版) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :拉丁美洲 +STR_MAPGEN_TOWN_NAME_SILLY :荒唐名稱 +STR_MAPGEN_TOWN_NAME_SWEDISH :瑞典 +STR_MAPGEN_TOWN_NAME_DUTCH :荷蘭 +STR_MAPGEN_TOWN_NAME_FINNISH :芬蘭 +STR_MAPGEN_TOWN_NAME_POLISH :波蘭 +STR_MAPGEN_TOWN_NAME_SLOVAK :斯洛伐克 +STR_MAPGEN_TOWN_NAME_NORWEGIAN :挪威 +STR_MAPGEN_TOWN_NAME_HUNGARIAN :匈牙利 +STR_MAPGEN_TOWN_NAME_AUSTRIAN :奧地利 +STR_MAPGEN_TOWN_NAME_ROMANIAN :羅馬尼亞 +STR_MAPGEN_TOWN_NAME_CZECH :捷克 +STR_MAPGEN_TOWN_NAME_SWISS :瑞士 +STR_MAPGEN_TOWN_NAME_DANISH :丹麥 +STR_MAPGEN_TOWN_NAME_TURKISH :土耳其 +STR_MAPGEN_TOWN_NAME_ITALIAN :義大利 +STR_MAPGEN_TOWN_NAME_CATALAN :加泰隆尼亞 + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}地圖邊緣: STR_MAPGEN_NORTHWEST :{BLACK}西北方 @@ -3305,6 +3287,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}上一 STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}繼續處理上一個正常的子畫面,略過任何虛位/重新著色/文字字型相關的子畫面,並在到達第一個子畫面後,返回最後的子畫面繼續進行處理。 STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}顯示目前選取的 sprite。當 sprite 正在描繪時會忽略其定位 STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}移動 sprite 到指定的 X 及 Y 座標位移。Ctrl+點擊可以一次移動8個單元格。 + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}重設相對值 STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}重設目前的相對位移值 STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X 位移:{NUM},Y 位移:{NUM}(絕對值) @@ -3644,7 +3630,6 @@ STR_FINANCES_SECTION_OTHER :{GOLD}其他 STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} -STR_FINANCES_NET_PROFIT :{WHITE}淨收益 STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}銀行餘額 STR_FINANCES_OWN_FUNDS_TITLE :{WHITE}自有資金 STR_FINANCES_LOAN_TITLE :{WHITE}貸款 @@ -3872,6 +3857,8 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}最大 STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}範圍:{GOLD}{COMMA} 方格 STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}飛機類型:{GOLD}{STRING} +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}列車選單。點選機車或車卡檢視詳細資訊,或者按住 Ctrl 鍵再點選機車或車卡以切換是否顯示機車或車卡的種類 STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}車輛選單。點選車輛檢視詳細資訊,或者按住 Ctrl 鍵再點選車輛以切換是否顯示車輛的種類 @@ -4532,12 +4519,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}正在 STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}AI/只可於伺服器打開遊戲腳本除錯視窗 # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}AI /遊戲腳本的組態 STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}將於下一次遊戲中載入的腳本 STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}下局開始時將啟用AI STR_AI_CONFIG_HUMAN_PLAYER :人類玩家 STR_AI_CONFIG_RANDOM_AI :隨機 AI STR_AI_CONFIG_NONE :(無) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}競爭對手數目上限:{ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}向上移 STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}向上移動所選的 AI @@ -4547,8 +4534,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}向下 STR_AI_CONFIG_GAMESCRIPT :{SILVER}遊戲腳本 STR_AI_CONFIG_AI :{SILVER}AI -STR_AI_CONFIG_CHANGE :{BLACK}選擇 {STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :AI STR_AI_CONFIG_CHANGE_GAMESCRIPT :遊戲腳本 STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}載入另一腳本 @@ -4579,9 +4564,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}高度 STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}小地圖截圖 # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} 參數 STR_AI_SETTINGS_CAPTION_AI :AI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :遊戲腳本 STR_AI_SETTINGS_CLOSE :{BLACK}關閉 STR_AI_SETTINGS_RESET :{BLACK}重設 STR_AI_SETTINGS_SETTING :{STRING}:{ORANGE}{STRING} @@ -4998,6 +4981,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}不能 STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... 車輛已被摧毀 + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}沒有可用的車輛 STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}請修改您的 NewGRF 設定 STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}未有可用的車輛 diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt index c6d23d993b..a28ca59a98 100644 --- a/src/lang/turkish.txt +++ b/src/lang/turkish.txt @@ -201,6 +201,16 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}bg STR_UNITS_POWER_METRIC :{COMMA}{NBSP}bg STR_UNITS_POWER_SI :{COMMA}{NBSP}kW +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}bg/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}bg/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_SI :{DECIMAL}{NBSP}bg/Mg +STR_UNITS_POWER_METRIC_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}bg/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}bg/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_SI :{DECIMAL}{NBSP}hp/Mg +STR_UNITS_POWER_SI_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_SI :{DECIMAL}{NBSP}W/kg + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -379,7 +389,7 @@ STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Yol yap STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK} Tramvay yapımı STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Ağaç dik. Shift ile tıklama maliyet tahminini gösterir STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Tabela koy -STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Nesneyi yerleştirin. Shift ile tıklama maliyet tahminini gösterir +STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Nesneyi yerleştirin. Ctrl alanı çapraz olarak seçer. Shift inşa etme/değerini gösterme arasında geçiş yapar # Scenario editor file menu ###length 7 @@ -392,10 +402,11 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Oyundan Çık # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Seçenekler STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Ayarlar -STR_SETTINGS_MENU_SCRIPT_SETTINGS :YZ/Oyun betik ayarları +STR_SETTINGS_MENU_AI_SETTINGS :YZ ayarları +STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :Oyun betiği ayarları STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF ayarları STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Şeffaflık seçenekleri STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Şehir isimlerini göster @@ -966,36 +977,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Hindistan Rupis STR_GAME_OPTIONS_CURRENCY_IDR :Endonezya Rupiahı (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Malezya Ringgiti (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Soldan trafik -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Sağdan trafik - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Şehir isimleri: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Şehir isimleri için bir tür seçin - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :İngiliz (Özgün) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Fransız -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Alman -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :İngiliz (İlave) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Latin-Amerikan -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Saçmasapan (İngilizce) -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :İsveç -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Hollanda -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Fin -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Leh -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slovak -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norveç -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Macar -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Avusturya -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Romen -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Çek -STR_GAME_OPTIONS_TOWN_NAME_SWISS :İsviçre -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Danimarka -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Türk -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italyan -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Katalan - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Otomatik Kaydet STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Otomatik kaydetme sıklığını seçin @@ -1028,21 +1009,19 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Dikey se STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Geçerli sürücü: {STRING} -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Arayüz boyutu -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Kullanmak üzere arayüz bileşen boyutunu seçin +STR_GAME_OPTIONS_GUI_SCALE_FRAME :{BLACK}Arayüz büyüklüğü +STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Arayüz büyüklüğünü ayarlamak için kaydırın. Sürekli ayarlama için Ctrl tuşunu basılı tutun +STR_GAME_OPTIONS_GUI_SCALE_AUTO :{BLACK}Büyüklüğü otomatik algıla +STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Arayüz boyutunu otomatik ayarlamak için bu kutucuğu işaretleyin -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(otomatik-tespit) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :İki kat büyük -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Dört kat büyük +STR_GAME_OPTIONS_GUI_SCALE_BEVELS :{BLACK}Eğimi ayarla +STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :{BLACK}Eğimi arayüz boyutuna göre ayarlamak için bu kutucuğu işaretleyin -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Yazı boyutu -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :Arayüz boyutunu seç - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(otomatik-tespit) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Yazı iki kat büyük -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Dört kat büyük +STR_GAME_OPTIONS_GUI_SCALE_1X :1x +STR_GAME_OPTIONS_GUI_SCALE_2X :2x +STR_GAME_OPTIONS_GUI_SCALE_3X :3x +STR_GAME_OPTIONS_GUI_SCALE_4X :4x +STR_GAME_OPTIONS_GUI_SCALE_5X :5x STR_GAME_OPTIONS_GRAPHICS :{BLACK}Grafikler @@ -1094,8 +1073,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Önizle STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 Sterlin'in (£) para biriminizdeki karşılığı STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Özel para birimini değiştir -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}En fazla rakip: {ORANGE}{COMMA} - STR_NONE :Hiç STR_FUNDING_ONLY :Yalnızca yatırım STR_MINIMAL :En düşük @@ -1145,6 +1122,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Ilıman iklim +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Soğuk iklim +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Tropik iklim +STR_CLIMATE_TOYLAND_LANDSCAPE :Oyun bahçesi + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Dümdüz STR_TERRAIN_TYPE_FLAT :Düz @@ -1450,6 +1433,8 @@ STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Grafiklerdeki STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :NewGRF'nin adını araç inşa penceresinde göster: {STRING} STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Araç inşa penceresine, seçilen aracın hangi NewGRF'den geldiğini gösteren bir satır ekleyin. +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS :Liste menüsünde araçların taşıyabildiği kargoları göster {STRING} +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS_HELPTEXT :Etkinleştirildiğinde, araç listesinin üstünde aracın nakliye edilebilir yükü gözükür STR_CONFIG_SETTING_LANDSCAPE :İklim: {STRING} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :İklimler farklı kargo ve şehir gelişme gereksinimlerini belirleyen temel oynanış senaryolarını tanımlar. NewGRF ve Oyun Betikleri daha ince ayarlar yapmanızı sağlar @@ -1504,6 +1489,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Gelişmiş STR_CONFIG_SETTING_ROAD_SIDE :Yol araçları: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Sürüş yönünü seçin +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Soldan trafik +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Sağdan trafik + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Yükseklik haritasını döndür: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Saat yönünün tersi @@ -2038,7 +2027,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :İşaretlerde o STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Tren sinyalde uzun süre beklediği takdirde ters yöne gitmesine izin ver ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Önerilen) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Önerilen) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Ayar değerini değiştir @@ -2081,7 +2070,8 @@ STR_INTRO_HIGHSCORE :{BLACK}Puan Tab STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Ayarlar STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF Ayarları STR_INTRO_ONLINE_CONTENT :{BLACK}Çevrimiçi İçeriği Kontrol Et -STR_INTRO_SCRIPT_SETTINGS :{BLACK}YZ/Oyun Betik Ayarları +STR_INTRO_AI_SETTINGS :{BLACK}YZ Ayarları +STR_INTRO_GAMESCRIPT_SETTINGS :{BLACK}Oyun Betiği Ayarları STR_INTRO_QUIT :{BLACK}Çıkış STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Yeni oyuna başla. Ctrl+Tıklama harita ayarlamasını atlar. @@ -2101,7 +2091,8 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Puan tab STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Görüntü ayarları STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}NewGRF ayarlarını göster STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}İndirilecek yeni ve güncellenmiş içeriği kontrol et -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}YZ ve Oyun betik ayarlarını göster +STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}YZ ayarlarını göster +STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Oyun betiği ayarlarını göster STR_INTRO_TOOLTIP_QUIT :{BLACK}'OpenTTD' den çık STR_INTRO_BASESET :{BLACK}Geçerli seçimdeki temel grafik setinin {NUM} örneği eksik. Lütfen temel setin güncellemelerini kontrol edin. @@ -2133,12 +2124,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Tarihi STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Yılı değiştir STR_CHEAT_SETUP_PROD :{LTBLUE}Üretim değerlerini değiştir: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Ilıman iklim -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Soğuk iklim -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Tropik iklim -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Oyun bahçesi - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Renk Düzeni @@ -2498,13 +2483,13 @@ STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :bağlantı graf STR_NETWORK_MESSAGE_CLIENT_LEAVING :ayrılıyor STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} oyuna katıldı -STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {STRING} oyuna katıldı (İstemci #{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} #{2:NUM} numaralı şirkete katıldı +STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {0:STRING} oyuna katıldı (İstemci #{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {0:STRING} #{2:NUM} numaralı şirkete katıldı STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} gözlemcilere katıldı -STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} yeni bir şirket kurdu (#{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} oyunu terketti ({2:STRING}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {0:STRING} yeni bir şirket kurdu (#{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {0:STRING} oyunu terketti ({2:STRING}) STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} adını {STRING} olarak değiştirdi -STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} {1:STRING} adlı şirkete {2:CURRENCY_LONG} verdi +STR_NETWORK_MESSAGE_GIVE_MONEY :*** {0:STRING} {1:STRING} adlı şirkete {2:CURRENCY_LONG} verdi STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}Sunucu kapandı STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Sunucu baştan başlatılıyor...{}Lütfen bekleyin... STR_NETWORK_MESSAGE_KICKED :*** {STRING} atıldı. Sebep: ({STRING}) @@ -2619,6 +2604,9 @@ STR_LINKGRAPH_LEGEND_SATURATED :{TINY_FONT}{BLA STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLACK}aşırı dolu # Linkgraph tooltip +STR_LINKGRAPH_STATS_TOOLTIP :{BLACK}{CARGO_LONG} aylık nakledilecek {STATION} istasyonundan {STATION} istasyonuna ({COMMA}% kapasite ile){STRING} +STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} geri nakledilecek ({COMMA}% kapasite ile) +STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}Ortalama seyahat süresi: {NUM}{NBSP}gün # Base for station construction window(s) STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Kapsama alanı @@ -2628,6 +2616,7 @@ STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP :{BLACK}Kapsama STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP :{BLACK}Kapsama alanını göster STR_STATION_BUILD_ACCEPTS_CARGO :{BLACK}İstenen: {GOLD}{CARGO_LIST} STR_STATION_BUILD_SUPPLIES_CARGO :{BLACK}Sağladıkları: {GOLD}{CARGO_LIST} +STR_STATION_BUILD_INFRASTRUCTURE_COST :{BLACK}Bakım maliyeti: {GOLD}{CURRENCY_SHORT}/yıl # Join station window STR_JOIN_STATION_CAPTION :{WHITE}İstasyonu birleştir @@ -2815,11 +2804,11 @@ STR_LANDSCAPING_TOOLBAR :{WHITE}Arazi d STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}Arazinin bir köşesini alçalt. Sürükleme ilk seçilen köşeyi alçaltır ve seçilen araziyi yeni yüksekliğe indirir. Ctrl bir alanı köşeden köşeye seçer. Shift ile tıklama maliyet tahminini gösterir STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND :{BLACK}Arazinin bir köşesini yükselt. Sürükleme ilk seçilen köşeyi yükseltir ve seçilen araziyi yeni yüksekliğe çıkarır. Ctrl bir alanı köşeden köşeye seçer. Shift ile tıklama maliyet tahminini gösterir STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Bir alanı ilk seçilen köşenin yüksekliğine düzle. Ctrl ile alanı köşeden köşeye seçer. Shift ile tıklama maliyet tahminini gösterir -STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Gelecekte kullanım için arazi satın al. Shift ile tıklama maliyet tahminini gösterir +STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Gelecekte kullanım için arazi satın al. Ctrl alanı çapraz olarak seçer. Shift ile tıklama maliyet tahminini gösterir # Object construction window STR_OBJECT_BUILD_CAPTION :{WHITE}Nesne Seçimi -STR_OBJECT_BUILD_TOOLTIP :{BLACK}Yapılacak nesneyi seçin. Shift ile tıklama maliyet tahminini gösterir +STR_OBJECT_BUILD_TOOLTIP :{BLACK}Yapılacak nesneyi seçin. Ctrl alanı çapraz olarak seçer. Shift ile tıklama maliyet tahminini gösterir STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}İnşa edilecek nesnenin sınıfını seçin STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}Nesnenin önizlemesi STR_OBJECT_BUILD_SIZE :{BLACK}Boyut: {GOLD}{NUM} x {NUM} kare @@ -3141,6 +3130,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Harita b STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Haritanın büyüklüğünü kare sayısına göre seçin. Kullanılabilir karelerin sayısı bir miktar az olacaktır. STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Şehir sayısı: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Şehir isimleri: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Şehir isimleri için bir tür seçin STR_MAPGEN_DATE :{BLACK}Tarih: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Fabrika sayısı: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}En yüksek tepe: @@ -3156,11 +3147,40 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Çöl ö STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}%{NUM} STR_MAPGEN_LAND_GENERATOR :{BLACK}Harita üretici: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Arazi türü: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Deniz seviyesi: +STR_MAPGEN_SEA_LEVEL :{BLACK}Deniz seviyesi: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Nehirler: STR_MAPGEN_SMOOTHNESS :{BLACK}Düzlük seviyesi: STR_MAPGEN_VARIETY :{BLACK}Çeşitlilik dağılımı: STR_MAPGEN_GENERATE :{WHITE}Oluştur +STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF Ayarları +STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}NewGRF ayarlarını göster +STR_MAPGEN_AI_SETTINGS :{BLACK}YZ Ayarları +STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}YZ ayarlarını göster +STR_MAPGEN_GS_SETTINGS :{BLACK}Oyun Betiği Ayarları +STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Oyun betiği ayarlarını göster + +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :İngiliz (Özgün) +STR_MAPGEN_TOWN_NAME_FRENCH :Fransız +STR_MAPGEN_TOWN_NAME_GERMAN :Alman +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :İngiliz (İlave) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Latin-Amerikan +STR_MAPGEN_TOWN_NAME_SILLY :Saçmasapan (İngilizce) +STR_MAPGEN_TOWN_NAME_SWEDISH :İsveç +STR_MAPGEN_TOWN_NAME_DUTCH :Hollanda +STR_MAPGEN_TOWN_NAME_FINNISH :Fin +STR_MAPGEN_TOWN_NAME_POLISH :Leh +STR_MAPGEN_TOWN_NAME_SLOVAK :Slovak +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norveç +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Macar +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Avusturya +STR_MAPGEN_TOWN_NAME_ROMANIAN :Romen +STR_MAPGEN_TOWN_NAME_CZECH :Çek +STR_MAPGEN_TOWN_NAME_SWISS :İsviçre +STR_MAPGEN_TOWN_NAME_DANISH :Danimarka +STR_MAPGEN_TOWN_NAME_TURKISH :Türk +STR_MAPGEN_TOWN_NAME_ITALIAN :Italyan +STR_MAPGEN_TOWN_NAME_CATALAN :Katalan # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Harita kenarları: @@ -3306,6 +3326,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Önceki STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Tüm sahte/yeniden renklendirme/yazı tipi nesnelerini ve baştaki sargıyı atlayarak bir önceki normal nesneye geç STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Seçili nesnenin mevcut gösterimi. Bu nesneyi çizerken hizalama ihmal edilir STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Nesneyi X ve Y ofsetlerini değiştirerek gezdir. Ctrl+Tıklama ile nesneleri bir kerede sekiz birim kaydır + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Bağılı sıfırla STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Geçerli bağıl ofsetleri sıfırla STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X ofseti: {NUM}, Y ofseti: {NUM} (Gerçek) @@ -3323,15 +3347,15 @@ STR_NEWGRF_ERROR_MSG_FATAL :{RED}Ölümcül STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Ölümcül bir NewGRF hatası oluştu:{}{STRING} STR_NEWGRF_ERROR_POPUP :{WHITE}NewGRF hatası oluştu:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} OpenTTD tarafından belirtilen TTDPatch sürümüyle çalışmayacaktır -STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING}, TTD'nin {STRING} sürümü içindir -STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING}, {STRING} ile kullanılmak için tasarlanmıştır -STR_NEWGRF_ERROR_INVALID_PARAMETER :{1:STRING} için geçersiz parametre: {STRING} ({NUM}) -STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} önce, {STRING} ondan sonra yüklenmeli -STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} sonra, {STRING} ondan önce yüklenmeli -STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} OpenTTD {STRING} veya daha yüksek bir sürüm gerektirir +STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING}, TTD'nin {2:STRING} sürümü içindir +STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING}, {2:STRING} ile kullanılmak için tasarlanmıştır +STR_NEWGRF_ERROR_INVALID_PARAMETER :{1:STRING} için geçersiz parametre: {2:STRING} ({3:NUM}) +STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} önce, {2:STRING} ondan sonra yüklenmeli +STR_NEWGRF_ERROR_LOAD_AFTER :Önce {1:STRING}, sonra {2:STRING} yüklenmeli. +STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} OpenTTD {2:STRING} veya daha yüksek bir sürüm gerektirir STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :GRF dosyası çeviri için yapılmış STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Çok fazla NewGRF yüklendi -STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :{1:STRING} adlı NewGRF'yi {STRING} ile birlikte kullanmak senkronizasyon sorunu oluşturabilir +STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :{1:STRING} adlı NewGRF'yi {2:STRING} ile birlikte kullanmak senkronizasyon sorunu oluşturabilir STR_NEWGRF_ERROR_UNEXPECTED_SPRITE :Beklenmedik nesne (nesne {3:NUM}) STR_NEWGRF_ERROR_UNKNOWN_PROPERTY :Bilinmeyen Action 0 özelliği {4:HEX} (nesne {3:NUM}) STR_NEWGRF_ERROR_INVALID_ID :Geçersiz ID kullanım girişimi (nesne {3:NUM}) @@ -3463,14 +3487,14 @@ STR_LOCAL_AUTHORITY_ACTION_EXCLUSIVE_TRANSPORT :Ayrıcalıklı STR_LOCAL_AUTHORITY_ACTION_BRIBE :Belediyeye rüşvet ver ###length 8 -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{YELLOW} Müsteri çekmek için duvarlara poster yapıştır.{}Şehir merkezinin etrafında küçük bir çapta istasyon derecelendirmesinde geçici bir yükseltme sağlar.{}Fiyat: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{YELLOW} Müsteri çekmek için radyoya reklam ver.{}Şehir merkezinin etrafında orta bir çapta istasyon derecelendirmesinde geçici bir yükseltme sağlar.{}Fiyat: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{YELLOW} Müsteri çekmek için televizyona reklam ver.{}Şehir merkezinin etrafında büyük bir çapta istasyon derecelendirmesinde geçici bir yükseltme sağlar.{}Fiyat: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{YELLOW} Yol tamirleri için belediyeye bağış yap.{}6 ay boyunca şehrin yolları kullanılamaz.{}Fiyat: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{YELLOW}Şirket sahibinin heykelini dik.{}Şehirdeki istasyon derecelendirmesinde kalıcı bir yükseltme sağlar.{}Fiyatı: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{YELLOW}Şehirde ticari binaların yapımı için bağış yap.{}Bu kasabanın büyümesine geçici bir yükseltme sağlar.{}Fiyatı: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW} Bir yıllık ayrıcalıklı nakliyat haklarını satın al.{} Belediye, rakip istasyonların yolcu ve kargo taşımasına izin vermez.{} Fiyat: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Yakalanma riskini göze alarak belediyeye rüşvet ver.{}Fiyat: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{YELLOW} Müsteri çekmek için küçük reklam kampanyası düzenle.{}Şehir merkezinin etrafında küçük bir alanda istasyon derecelendirmesinde geçici bir yükseltme sağlar.{}{POP_COLOUR}Fiyat: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{PUSH_COLOUR}{YELLOW} Müsteri çekmek için radyoya reklam ver.{}Şehir merkezinin etrafında orta bir çapta istasyon derecelendirmesinde geçici bir yükseltme sağlar.{}{POP_COLOUR}Fiyat: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW} Müsteri çekmek için televizyona reklam ver.{}Şehir merkezinin etrafında büyük bir çapta istasyon derecelendirmesinde geçici bir yükseltme sağlar.{}{POP_COLOUR}Fiyat: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{PUSH_COLOUR}{YELLOW} Yol tamirleri için belediyeye bağış yap.{}6 ay boyunca şehrin yollarında önemli aksamalara sebep olur.{}{POP_COLOUR}Fiyat: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Şirket sahibinin heykelini dik.{}Şehirdeki istasyon derecelendirmesinde kalıcı bir yükseltme sağlar.{}{POP_COLOUR}Fiyatı: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Şehirde ticari binaların yapımı için bağış yap.{}Bu kasabanın büyümesine geçici bir yükseltme sağlar.{}{POP_COLOUR}Fiyatı: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW} Bir yıllık ayrıcalıklı nakliyat haklarını satın al.{} Belediye, rakip istasyonların yolcu ve kargo taşımasına izin vermez.{}{POP_COLOUR} Fiyat: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Yakalanırsan şiddetli bir ceza alma riskini göze alarak yerel yönetime bölge derecelendirmesini arttırmak için rüşvet ver.{}{POP_COLOUR}Fiyat: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}{COMPANY} Hedefler @@ -3643,16 +3667,18 @@ STR_FINANCES_SECTION_SHIP_REVENUE :{GOLD}Gemiler STR_FINANCES_SECTION_LOAN_INTEREST :{GOLD}Kredi Faizi STR_FINANCES_SECTION_OTHER :{GOLD}Diğer +STR_FINANCES_TOTAL_CAPTION :{WHITE}Toplam STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} STR_FINANCES_ZERO_INCOME :{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} -STR_FINANCES_NET_PROFIT :{WHITE}Net Kâr +STR_FINANCES_PROFIT :{WHITE}Kâr STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Banka Hesabı STR_FINANCES_OWN_FUNDS_TITLE :{WHITE}Kendi Sermayem STR_FINANCES_LOAN_TITLE :{WHITE}Kredi STR_FINANCES_INTEREST_RATE :{WHITE}Kredi Faizi: {BLACK}%{NUM} STR_FINANCES_MAX_LOAN :{WHITE}Azami Kredi: {BLACK}{CURRENCY_LONG} STR_FINANCES_TOTAL_CURRENCY :{BLACK}{CURRENCY_LONG} +STR_FINANCES_BANK_BALANCE :{WHITE}{CURRENCY_LONG} STR_FINANCES_BORROW_BUTTON :{BLACK}{CURRENCY_LONG} Kredi Al STR_FINANCES_BORROW_TOOLTIP :{BLACK}Borcu arttır. Ctrl+Tıklama alınabilen en yüksek borcu alır STR_FINANCES_REPAY_BUTTON :{BLACK}{CURRENCY_LONG} Geri Öde @@ -3753,7 +3779,7 @@ STR_INDUSTRY_VIEW_PRODUCES_N_CARGO :{BLACK}Üretile STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :, {STRING}{STRING} STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Gereken: -STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{0:STRING}{BLACK}{3:STRING} STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} bekliyor{STRING} STR_CONFIG_GAME_PRODUCTION :{WHITE}Üretimi değiştir (8'in katı, 2040'a kadar) @@ -3783,6 +3809,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Listedek STR_VEHICLE_LIST_REPLACE_VEHICLES :Araçları Değiştir STR_VEHICLE_LIST_SEND_FOR_SERVICING :Bakıma Gönder STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Bu seneki kar: {CURRENCY_LONG} (geçen sene: {CURRENCY_LONG}) +STR_VEHICLE_LIST_CARGO :{TINY_FONT}{BLACK}[{CARGO_LIST}] +STR_VEHICLE_LIST_NAME_AND_CARGO :{TINY_FONT}{BLACK}{STRING} {STRING} STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Garaja Gönder STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Garaja Gönder @@ -3874,6 +3902,11 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Aza. Çe STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Menzil: {GOLD}{COMMA} kare STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Uçak türü: {GOLD}{STRING} +###length 3 +STR_CARGO_TYPE_FILTER_ALL :Tüm kargo tipleri +STR_CARGO_TYPE_FILTER_FREIGHT :Nakliye +STR_CARGO_TYPE_FILTER_NONE :Hiçbiri + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Tren seçim listesi. Bilgi için araç tıklayın. Ctrl+Tıklama araç türünün gizlenmesini açar/kapatır STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Karayolu araçları seçim listesi. Bilgi için araca tıklayın. Ctrl+Tıklama araç türünün gizlenmesini açar/kapatır @@ -4042,7 +4075,7 @@ STR_ENGINE_PREVIEW_AIRCRAFT :uçak STR_ENGINE_PREVIEW_SHIP :gemi STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Fiyat: {CURRENCY_LONG} Ağırlık: {WEIGHT_SHORT}{}Hız: {VELOCITY} Güç: {POWER}{}İşletme Gideri: {CURRENCY_LONG}/yıl{}Kapasite: {CARGO_LONG} -STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Maliyet: {CURRENCY_LONG} Ağırlık: {WEIGHT_SHORT}{}Hız: {VELOCITY} Güç: {POWER} Azami Tork: {6:FORCE}{}İşletme Gideri: {4:CURRENCY_LONG}/yıl{}Kapasite: {5:CARGO_LONG} +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Maliyet: {0:CURRENCY_LONG} Ağırlık: {1:WEIGHT_SHORT}{}Hız: {2:VELOCITY} Güç: {3:POWER} Azami Tork: {6:FORCE}{}İşletme Gideri: {4:CURRENCY_LONG}/yıl{}Kapasite: {5:CARGO_LONG} STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Maliyet: {CURRENCY_LONG} Azami Hız: {VELOCITY}{}Kapasite: {CARGO_LONG}{}İşletme Gideri: {CURRENCY_LONG}/yıl STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Maliyet: {CURRENCY_LONG} Azami Hız: {VELOCITY}{}Uçak türü: {STRING}{}Kapasite: {CARGO_LONG}, {CARGO_LONG}{}İşletme Gideri: {CURRENCY_LONG}/yıl STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Maliyet: {CURRENCY_LONG} Azami Hız: {VELOCITY}{}Uçak türü: {STRING}{}Kapasite: {CARGO_LONG}{}İşletme Gideri: {CURRENCY_LONG}//yıl @@ -4201,12 +4234,13 @@ STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Ağırl STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Ağırlık: {LTBLUE}{WEIGHT_SHORT} {BLACK}Güç: {LTBLUE}{POWER}{BLACK} Azami Hız: {LTBLUE}{VELOCITY} {BLACK}Azami Tork: {LTBLUE}{FORCE} STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Bu yılki kar: {LTBLUE}{CURRENCY_LONG} (geçen yıl: {CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Bu yıl kâr: {LTBLUE}{CURRENCY_LONG} (geçen sene: {CURRENCY_LONG}) {BLACK}Min. performans: {LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Güvenilirlik: {LTBLUE}{COMMA}% {BLACK}Son bakımdan beri bozulma sayısı: {LTBLUE}{COMMA} STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Üretim: {LTBLUE}{NUM}{BLACK} Değer: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_INFO_NO_CAPACITY :{BLACK}Kapasite: {LTBLUE}Yok{STRING} -STR_VEHICLE_INFO_CAPACITY :{BLACK}Kapasite: {LTBLUE}{CARGO_LONG}{3:STRING} -STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Kapasite: {LTBLUE}{CARGO_LONG}{3:STRING} (x{4:NUM}) +STR_VEHICLE_INFO_CAPACITY :{BLACK}Kapasite: {LTBLUE}{0:CARGO_LONG}{3:STRING} +STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Kapasite: {LTBLUE}{0:CARGO_LONG}{3:STRING} (x{4:NUM}) STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Kapasite: {LTBLUE}{CARGO_LONG}, {CARGO_LONG}{STRING} STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Aktarma Maliyeti: {LTBLUE}{CURRENCY_LONG} @@ -4534,12 +4568,14 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Çalış STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}YZ Hata Ayıklama penceresi sadece sunucu içindir # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}YZ Yapılandırması +STR_AI_CONFIG_CAPTION_AI :{WHITE}YZ Konfigürasyonu +STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Oyun Betiği Konfigürasyonu STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Bir sonraki oyunda yüklenecek Oyun Betiği STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}Bir sonraki oyunda yüklenecek YZ'ler STR_AI_CONFIG_HUMAN_PLAYER :İnsan oyuncu STR_AI_CONFIG_RANDOM_AI :Rastgele YZ STR_AI_CONFIG_NONE :(hiçbiri) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}En fazla rakip: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Yukarı taşı STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Seçilen YZ'yi listede yukarı taşı @@ -4547,12 +4583,11 @@ STR_AI_CONFIG_MOVE_DOWN :{BLACK}Aşağı STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Seçilen YZ'yi listede aşağı taşı STR_AI_CONFIG_GAMESCRIPT :{SILVER}Oyun Betiği +STR_AI_CONFIG_GAMESCRIPT_PARAM :{SILVER}Parametreler STR_AI_CONFIG_AI :{SILVER}YZ'ler -STR_AI_CONFIG_CHANGE :{BLACK}{STRING} Seç -STR_AI_CONFIG_CHANGE_NONE : -STR_AI_CONFIG_CHANGE_AI :YZ -STR_AI_CONFIG_CHANGE_GAMESCRIPT :Oyun Betiği +STR_AI_CONFIG_CHANGE_AI :{BLACK}YZ Seç +STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}Oyun Betiği Seç STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Başka bir betik yükle STR_AI_CONFIG_CONFIGURE :{BLACK}Yapılandır STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Betik parametrelerini yapılandır @@ -4581,9 +4616,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Yüksekl STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Küçük harita ekran görüntüsü # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametreler -STR_AI_SETTINGS_CAPTION_AI :YZ -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Oyun Betiği +STR_AI_SETTINGS_CAPTION_AI :{WHITE}YZ Parametreleri STR_AI_SETTINGS_CLOSE :{BLACK}Kapat STR_AI_SETTINGS_RESET :{BLACK}Yeniden başlat STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4928,6 +4961,7 @@ STR_ERROR_OBJECT_IN_THE_WAY :{WHITE}Yolda ne STR_ERROR_COMPANY_HEADQUARTERS_IN :{WHITE}... yolda şirket binası var STR_ERROR_CAN_T_PURCHASE_THIS_LAND :{WHITE}Burası satın alınamaz... STR_ERROR_YOU_ALREADY_OWN_IT :{WHITE}... zaten senin! +STR_ERROR_BUILD_OBJECT_LIMIT_REACHED :{WHITE}... Nesne oluşturma sınırına ulaştınız # Group related errors STR_ERROR_GROUP_CAN_T_CREATE :{WHITE}Grup oluşturulamıyor... @@ -5000,6 +5034,8 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Servis a STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... araç imha edilmiş +STR_ERROR_CAN_T_CLONE_VEHICLE_LIST :{WHITE}... tüm araçlar birebir aynı değil + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Hiçbir araç kullanılabilir olmayacak STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Yeni NewGRF yapılandırmanızı değiştirin STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Henüz hiçbir araç kullanılabilir değil @@ -5026,6 +5062,8 @@ STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}Seçili STR_ERROR_CAN_T_COPY_SHARE_ORDER :{WHITE}... araç istasyonların tümüne gidemiyor STR_ERROR_CAN_T_ADD_ORDER :{WHITE}... araç bu istasyona gidemiyor STR_ERROR_CAN_T_ADD_ORDER_SHARED :{WHITE}... bu emri paylaşan bir araç bu istasyona gidemiyor +STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST :{WHITE}... tüm araçlar aynı talimatlara sahip değil +STR_ERROR_CAN_T_SHARE_ORDER_VEHICLE_LIST :{WHITE}... tüm araçlar aynı talimatları paylaşmıyor STR_ERROR_CAN_T_SHARE_ORDER_LIST :{WHITE}Talimat listesi paylasilamiyor... STR_ERROR_CAN_T_STOP_SHARING_ORDER_LIST :{WHITE}Paylaşılan talimat listesini durduramazsınız... diff --git a/src/lang/ukrainian.txt b/src/lang/ukrainian.txt index bc2233bfd1..235959f31f 100644 --- a/src/lang/ukrainian.txt +++ b/src/lang/ukrainian.txt @@ -325,6 +325,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}к STR_UNITS_POWER_METRIC :{COMMA}{NBSP}к.с. STR_UNITS_POWER_SI :{COMMA}{NBSP}кВт + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}т STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}т STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}кг @@ -516,10 +517,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Вихід # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Налаштування гри STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Налаштування -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Налаштування AI / Ігрового скрипта STR_SETTINGS_MENU_NEWGRF_SETTINGS :Налаштування NewGRF STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Налаштування прозорості STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Показувати назви міст @@ -1093,36 +1093,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Індійсь STR_GAME_OPTIONS_CURRENCY_IDR :Індонезійська рупія (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Малайзійський рингіт (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :лівосторонній рух -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :правосторонній рух - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Назви міст: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Виберіть стиль назв міст - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Англійські (оригінальні) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Французькі -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Німецькі -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Англійські (додаткові) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Латиноамериканські -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Кумедні -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Шведські -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Нідерландські -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Фінські -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Польські -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Словацькі -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Норвезькі -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Угорські -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Австрійські -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Румунські -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Чеські -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Швейцарські -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Данські -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Турецькі -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Італійські -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Каталонські - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Автозбереження STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Виберіть період автозбереження гри @@ -1154,21 +1124,8 @@ STR_GAME_OPTIONS_VIDEO_VSYNC :Вертика STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Увімкнутий прапорець дозволить вертикальну синхронізацію екрану. Налаштування запрацює тільки після перезапуску гри. Працює тільки за увімкнутого прискорення апаратного забезпечення. -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Розмір інтерфейсу -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Оберіть розмір елементів інтерфейсу -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(автоматичо) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Нормальний розмір -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Подвійний розмір -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Почетверний розмір -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Розмір шрифту -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Виберть розмір шрифту інтерфейсу - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(автоматичо) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Нормальний -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Подвійний розмір -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Почетверний розмір STR_GAME_OPTIONS_GRAPHICS :{BLACK}Графіка @@ -1220,8 +1177,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Від STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 фунтів (£) у вашій валюті STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Налаштування іншої грошової одиниці -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Кількість конкурентів: {ORANGE}{COMMA} - STR_NONE :нема STR_FUNDING_ONLY :засновувати власноруч STR_MINIMAL :мінімально @@ -1271,6 +1226,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Помірний ландшафт +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Субарктичний ландшафт +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Субтропічний ландшафт +STR_CLIMATE_TOYLAND_LANDSCAPE :Іграшковий ландшафт + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :плаский STR_TERRAIN_TYPE_FLAT :рівнинний @@ -1630,6 +1591,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :покраще STR_CONFIG_SETTING_ROAD_SIDE :Автотранспорт: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Виберіть сторону, по якій рухається автотранспорт +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :лівосторонній рух +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :правосторонній рух + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Поворот карти висот: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :проти годинникової стрілки @@ -2158,7 +2123,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Автомат STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Дозволяє поїздам розвертатися на сигналах, котрі не вдається проїхати впродовж довгого часу. ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(рекомендовано) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(рекомендовано) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Змініть значення @@ -2201,7 +2166,6 @@ STR_INTRO_HIGHSCORE :{BLACK}Табл STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Налаштування STR_INTRO_NEWGRF_SETTINGS :{BLACK}Налаштування NewGRF STR_INTRO_ONLINE_CONTENT :{BLACK}Додатковий контент -STR_INTRO_SCRIPT_SETTINGS :{BLACK}Налаштування AI / GS STR_INTRO_QUIT :{BLACK}Вихід STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Почати нову гру. Ctrl+клац мишою пропускає конфігурацію карти @@ -2221,7 +2185,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Пока STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Налаштування відображення STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Показати налаштування NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Перевірити доступний для завантаження додатковий контент -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Показати налаштування AI / Ігрового Скрипта STR_INTRO_TOOLTIP_QUIT :{BLACK}Вийти з OpenTTD STR_INTRO_BASESET :{BLACK}В обраному наборі базової графіки немає {NUM} спрайт{P а ів ів}. Будь ласка, оновіть набір графіки. @@ -2253,12 +2216,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Змі STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Змінити поточний рік STR_CHEAT_SETUP_PROD :{LTBLUE}Дозволити зміну рівня виробництва: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Помірний ландшафт -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Субарктичний ландшафт -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Субтропічний ландшафт -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Іграшковий ландшафт - # Livery window STR_LIVERY_CAPTION :{WHITE}Кольори компанії «{COMPANY}» @@ -3264,6 +3221,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Розм STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Оберіть розмір карти в клітинках. Кількість доступних клітинок буде трохи меншою STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Міста: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Назви міст: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Виберіть стиль назв міст STR_MAPGEN_DATE :{BLACK}Дата: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Кількість виробництв: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Найвища гора: @@ -3279,12 +3238,35 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Змен STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Ландшафт: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Тип ландшафту: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Рівень моря: +STR_MAPGEN_SEA_LEVEL :{BLACK}Рівень моря: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Ріки: STR_MAPGEN_SMOOTHNESS :{BLACK}Гладкість: STR_MAPGEN_VARIETY :{BLACK}Розподіл різноманітності: STR_MAPGEN_GENERATE :{WHITE}Генерувати +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Англійські (оригінальні) +STR_MAPGEN_TOWN_NAME_FRENCH :Французькі +STR_MAPGEN_TOWN_NAME_GERMAN :Німецькі +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Англійські (додаткові) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Латиноамериканські +STR_MAPGEN_TOWN_NAME_SILLY :Кумедні +STR_MAPGEN_TOWN_NAME_SWEDISH :Шведські +STR_MAPGEN_TOWN_NAME_DUTCH :Нідерландські +STR_MAPGEN_TOWN_NAME_FINNISH :Фінські +STR_MAPGEN_TOWN_NAME_POLISH :Польські +STR_MAPGEN_TOWN_NAME_SLOVAK :Словацькі +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Норвезькі +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Угорські +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Австрійські +STR_MAPGEN_TOWN_NAME_ROMANIAN :Румунські +STR_MAPGEN_TOWN_NAME_CZECH :Чеські +STR_MAPGEN_TOWN_NAME_SWISS :Швейцарські +STR_MAPGEN_TOWN_NAME_DANISH :Данські +STR_MAPGEN_TOWN_NAME_TURKISH :Турецькі +STR_MAPGEN_TOWN_NAME_ITALIAN :Італійські +STR_MAPGEN_TOWN_NAME_CATALAN :Каталонські + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Краї карти: STR_MAPGEN_NORTHWEST :{BLACK}північно-західний @@ -3429,6 +3411,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Попе STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Повернутися до попереднього нормального спрайту, пропускаючи будь-які псевдо/перемальовані/шрифтові спрайти і обгортаючи (wrap) навколо починаючи з першого спрайту і закінчуючи останнім STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Відображення обраного спрайту (вирівнювання ігнорується) STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Рухайте спрайт навколо, змінюючи його зміщення за X та Y. Ctrl+клік зміщує спрайт на 8 клітинок + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Відновити відносні STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Відновити поточні зсуви (відносні) STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}Зсув по осі X: {NUM}, Зсув по осі Y: {NUM} (Абсолютно) @@ -3985,6 +3971,8 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Макс STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Дальність: {GOLD}{COMMA} клітинок STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Тип літака: {GOLD}{STRING} +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Список поїздів. Клацніть на поїзд для інформації. Ctrl+клац мишою вимикає показ типу транспорту STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Список автомобілів. Клацніть на авто для отримання інформації. Ctrl+клац мишою вимикає показ типу транспорту @@ -4645,12 +4633,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Один STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Вікно налагодження АІ / Ігрового Скрипта доступне тільки серверу # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Налаштування AI / Ігрового Скрипта STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Ігровий Скрипт, який буде завантажено в наступній грі STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}АІ, які будуть завантажені в наступній грі STR_AI_CONFIG_HUMAN_PLAYER :Гравець-людина STR_AI_CONFIG_RANDOM_AI :Випадковий AI STR_AI_CONFIG_NONE :(нема) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Кількість конкурентів: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Перемістити вище STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Перемістити обраний AI вверх по списку @@ -4660,8 +4648,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Пере STR_AI_CONFIG_GAMESCRIPT :{SILVER}Ігровий Скрипт STR_AI_CONFIG_AI :{SILVER}АІ -STR_AI_CONFIG_CHANGE :{BLACK}Вибрати {STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :AI STR_AI_CONFIG_CHANGE_GAMESCRIPT :Ігровий Скрипт STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Завантажити інший скрипт @@ -4692,9 +4678,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Знят STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Зняток мінімапи # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Параметри STR_AI_SETTINGS_CAPTION_AI :АІ -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Ігровий Скрипт STR_AI_SETTINGS_CLOSE :{BLACK}Закрити STR_AI_SETTINGS_RESET :{BLACK}Скидання STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -5111,6 +5095,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Не м STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... транспорт знищено + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Недоступний жоден транспортний засіб STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Змінити налаштування встановленого NewGRF STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Жоден вид транспорту ще не став доступним diff --git a/src/lang/urdu.txt b/src/lang/urdu.txt index 35074cf9a0..5d2947ee58 100644 --- a/src/lang/urdu.txt +++ b/src/lang/urdu.txt @@ -198,6 +198,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA} ھار STR_UNITS_POWER_METRIC :{COMMA} ھارس پآور STR_UNITS_POWER_SI :{COMMA} کلو واٹ + STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA} من STR_UNITS_WEIGHT_SHORT_SI :{COMMA} kg @@ -360,9 +361,8 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :باہر نکلو # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :کھیل کے اختیارات -STR_SETTINGS_MENU_SCRIPT_SETTINGS :AI / کھیل کے اختیارات STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF اختیارات STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Transparency کے اختیارات STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :آبادیوں کے نام دکھائے جائیں @@ -891,36 +891,6 @@ STR_GAME_OPTIONS_CURRENCY_KRW :جنوبی کو STR_GAME_OPTIONS_CURRENCY_ZAR :جنوبی افریقہ کے رنڈ (ZAR) STR_GAME_OPTIONS_CURRENCY_CUSTOM :اپنی مرضی کی ۔۔۔ -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :بائیں طرف چلے -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :دائیں طرف چلے - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}شہروں کے نام -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}شہروں کے نام کی طرز اختیار کریں - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :انگریزی (اصلی) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :فرانسیسی -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :جرمن -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :انگریزی (اضافی) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :لاطینی امریکی -STR_GAME_OPTIONS_TOWN_NAME_SILLY :سِلی -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :سوئیڈش -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :ڈچ -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :فِنش -STR_GAME_OPTIONS_TOWN_NAME_POLISH :پولش -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :سلواک -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :ناروئیجین -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :ہینگرین -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :آسٹرین -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :رومانین -STR_GAME_OPTIONS_TOWN_NAME_CZECH :چیک -STR_GAME_OPTIONS_TOWN_NAME_SWISS :سوئس -STR_GAME_OPTIONS_TOWN_NAME_DANISH :ڈینش -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :ٹرکش -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :اِٹالین -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :کاٹالن - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}خود مختار بچاو STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}خودمختار کھیل بچانے کے درمیان وقفہ اختیار کریں @@ -950,7 +920,6 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :دیگر - STR_GAME_OPTIONS_BASE_GRF :{BLACK}بُنیادی گرافک سیٹ STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}بُنیادی گرافک سیٹ اختیار کریں STR_GAME_OPTIONS_BASE_GRF_STATUS :{RED}{NUM} missing/corrupted file{P "" s} @@ -993,8 +962,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}جائ STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}اپنی کرنسی میں 10000 پاونڈ (£) STR_CURRENCY_CHANGE_PARAMETER :{BLACK}اپنی مرضی کے کرنسی پیرامیٹر کو تبدیل کریں -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}مدمقابلوں کی زیادہ سے زیادہ تعداد: {ORANGE}{COMMA} - STR_NONE :کوئی نہیں STR_FUNDING_ONLY :صرف فنڈنگ STR_MINIMAL :کم از کم @@ -1044,6 +1011,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Temperate منظر کشی +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Sub-arctic منظر کشی +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Sub-tropical منظر کشی +STR_CLIMATE_TOYLAND_LANDSCAPE :Toyland منظر کشی + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :بہت سیدھا STR_TERRAIN_TYPE_FLAT :سیدھا @@ -1243,6 +1216,10 @@ STR_CONFIG_SETTING_TREE_PLACER_ORIGINAL :اصلی STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :بہتر بنایا ہوا +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :بائیں طرف چلے +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :دائیں طرف چلے + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :اونچائی والے نقشے کو گھمانا: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :الٹی گھڑی وار @@ -1520,7 +1497,7 @@ STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS :بحری جہا STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :اشاروں پر خودکار ریورس ہونا: {STRING} ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Recommended) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Recommended) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}سیٹنگ کی ولیو بدلیں @@ -1554,7 +1531,6 @@ STR_INTRO_MULTIPLAYER :{BLACK}زیاد STR_INTRO_GAME_OPTIONS :{BLACK}کھیل کے اختیارات STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF چنئے STR_INTRO_ONLINE_CONTENT :{BLACK}آن لائن مواد دیکھیں -STR_INTRO_SCRIPT_SETTINGS :{BLACK}AI / کھیل کے اختیارات STR_INTRO_QUIT :{BLACK}باہر نکلو STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}نیا کھیل شروع کریں۔ Ctrl+Click نقشے کی ترتیب کو چھوڑ دے گا @@ -1572,7 +1548,6 @@ STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}منظر STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}کھیل کے اختیارات دکھائیں STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}NewGRF سیٹنگز دیکھیئے STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}نئے اور ترمیم شدہ مواد کو ڈاون لوڈ کرنے کے لئے چیک کریں -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK} AI اور کھیل کے اختیارات دکھائیں STR_INTRO_TOOLTIP_QUIT :{BLACK}'OpenTTD' سے باہر نکلو STR_INTRO_TRANSLATION :{BLACK}اس ترجمے میں {NUM} لائنین{P "" یں} غیر ترجمہ سدہ ہیں۔ براہ مہربانی ترجمہ کُنندہ بن کر OpenTTD کی مدد کریں۔ تفصیلات کے لئے readme.txt دیکھیں @@ -1599,12 +1574,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}تار STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}موجودہ سال بدلیں STR_CHEAT_SETUP_PROD :{LTBLUE}پیداوار میں تبدیلی کو فعال کریں: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Temperate منظر کشی -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Sub-arctic منظر کشی -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Sub-tropical منظر کشی -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Toyland منظر کشی - # Livery window STR_LIVERY_GENERAL_TOOLTIP :{BLACK}رنگوں کا عام انتخاب دکھائیں @@ -2258,6 +2227,31 @@ STR_ABOUT_OPENTTD :{WHITE}اوپن # World generation STR_MAPGEN_BY :{BLACK}* +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}شہروں کے نام +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}شہروں کے نام کی طرز اختیار کریں + +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :انگریزی (اصلی) +STR_MAPGEN_TOWN_NAME_FRENCH :فرانسیسی +STR_MAPGEN_TOWN_NAME_GERMAN :جرمن +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :انگریزی (اضافی) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :لاطینی امریکی +STR_MAPGEN_TOWN_NAME_SILLY :سِلی +STR_MAPGEN_TOWN_NAME_SWEDISH :سوئیڈش +STR_MAPGEN_TOWN_NAME_DUTCH :ڈچ +STR_MAPGEN_TOWN_NAME_FINNISH :فِنش +STR_MAPGEN_TOWN_NAME_POLISH :پولش +STR_MAPGEN_TOWN_NAME_SLOVAK :سلواک +STR_MAPGEN_TOWN_NAME_NORWEGIAN :ناروئیجین +STR_MAPGEN_TOWN_NAME_HUNGARIAN :ہینگرین +STR_MAPGEN_TOWN_NAME_AUSTRIAN :آسٹرین +STR_MAPGEN_TOWN_NAME_ROMANIAN :رومانین +STR_MAPGEN_TOWN_NAME_CZECH :چیک +STR_MAPGEN_TOWN_NAME_SWISS :سوئس +STR_MAPGEN_TOWN_NAME_DANISH :ڈینش +STR_MAPGEN_TOWN_NAME_TURKISH :ٹرکش +STR_MAPGEN_TOWN_NAME_ITALIAN :اِٹالین +STR_MAPGEN_TOWN_NAME_CATALAN :کاٹالن # Strings for map borders at game generation @@ -2303,6 +2297,10 @@ STR_SPRITE_ALIGNER_GOTO_TOOLTIP :{BLACK} جای STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK} پچھلا sprite STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK} منتخب sprite کا اظھار۔ اس sprite کے نقش میں سف بندی نظر اندازکی جائے گی۔ STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK} ارد گرد sprite ھلایئے، X اور Y offset تبدیل کیجئے + +###length 2 + + STR_SPRITE_ALIGNER_PICKER_BUTTON :{BLACK} منتخب sprite کیجئے STR_SPRITE_ALIGNER_PICKER_TOOLTIP :{BLACK} اسکرین سے کسی sprite کو منتخب کیجئے @@ -2485,6 +2483,8 @@ STR_BUY_VEHICLE_AIRCRAFT_CAPTION :نیا طیار STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}پہنچ: {GOLD}{COMMA} ٹائلیں +###length 3 + ###length VEHICLE_TYPES ###length VEHICLE_TYPES @@ -2717,11 +2717,11 @@ STR_AI_DEBUG_CONTINUE_TOOLTIP :{BLACK} وقف # AI configuration window +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}مدمقابلوں کی زیادہ سے زیادہ تعداد: {ORANGE}{COMMA} STR_AI_CONFIG_GAMESCRIPT :{SILVER}کھیل کا سکرپٹ -STR_AI_CONFIG_CHANGE_NONE : # Available AIs window @@ -2903,6 +2903,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}مرمت + # Specific vehicle errors diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index 81156b9d11..846e17349f 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -200,6 +200,16 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}hp STR_UNITS_POWER_METRIC :{COMMA}{NBSP}hp STR_UNITS_POWER_SI :{COMMA}{NBSP}kW +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_SI :{DECIMAL}{NBSP}hp/Mg +STR_UNITS_POWER_METRIC_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}hp/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_SI :{DECIMAL}{NBSP}hp/Mg +STR_UNITS_POWER_SI_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_SI :{DECIMAL}{NBSP}W/kg + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -391,10 +401,11 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Thoát # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Cấu hình trò chơi STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Thiết lập -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Thiết lập AI / Game script +STR_SETTINGS_MENU_AI_SETTINGS :Thiết lập AI +STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :Thiết lập kịch bản màn chơi STR_SETTINGS_MENU_NEWGRF_SETTINGS :Thông số NewGRF STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Thiết lập hiệu ứng trong suốt STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Hiển thị tên thị trấn @@ -965,36 +976,6 @@ STR_GAME_OPTIONS_CURRENCY_INR :Rupee Ấn Đ STR_GAME_OPTIONS_CURRENCY_IDR :Rupiah Indonesia (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Ringgit Malaysia (MYR) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Lái bên trái -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Lái bên phải - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Tên thị trấn: -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Lựa chọn kiểu tên thị trấn - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Tiếng Anh (Nguyên bản) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Pháp -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Đức -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Tiếng Anh (Bổ sung) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Mỹ-Latin -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Silly -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Thụy Điển -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Hà Lan -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Phần Lan -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Ba Lan -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slovakia -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Na Uy -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Hungary -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Úc -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Ru-ma-ni -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Séc -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Thụy Sỹ -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Đan Mạch -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Thổ Nhĩ Kỳ -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Ý -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Catalan - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Lưu tự động STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Lựa chọn khoảng thời gian tự động lưu @@ -1027,21 +1008,19 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Đánh d STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Trình điều khiển hiện tại: {STRING} -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Kích thước giao diện -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Chọn kích thước của các đối tượng trên giao diện +STR_GAME_OPTIONS_GUI_SCALE_FRAME :{BLACK}Kích thước giao diện +STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Kéo thanh trượt để điều chỉnh kích thước giao diện. Giữ Ctrl để điều chỉnh liên tục +STR_GAME_OPTIONS_GUI_SCALE_AUTO :{BLACK}Tự động nhận dạng kích thước +STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Đánh dấu vào ô này để điều chỉnh kích thước giao diện tự động -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(nhận diện tự động) -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Bình thường -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Gấp 2 lần -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Gấp 4 lần +STR_GAME_OPTIONS_GUI_SCALE_BEVELS :Tỷ lệ góc xiên +STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :{BLACK}Đánh dấu vào ô này để điều chỉnh tỷ lệ góc xiên theo kích thước giao diện -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Cỡ chữ -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Chọn cỡ chữ trong giao diện - -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(nhận diện tự động) -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Bình thường -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Phóng to gấp đôi -STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Phóng nhân bốn +STR_GAME_OPTIONS_GUI_SCALE_1X :1x +STR_GAME_OPTIONS_GUI_SCALE_2X :2x +STR_GAME_OPTIONS_GUI_SCALE_3X :3x +STR_GAME_OPTIONS_GUI_SCALE_4X :4x +STR_GAME_OPTIONS_GUI_SCALE_5X :5x STR_GAME_OPTIONS_GRAPHICS :{BLACK}Hình ảnh @@ -1093,8 +1072,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Xem tr STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 Pound (£) tính bằng tiền của bạn STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Sửa tham số của tiền tự chỉnh -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Số đối thủ cạnh tranh tối đa: {ORANGE}{COMMA} - STR_NONE :Không Có STR_FUNDING_ONLY :Chỉ Cấp Vốn STR_MINIMAL :Tối Thiểu @@ -1144,6 +1121,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Địa hình vừa phải +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Địa hình giá lạnh +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Địa hình cận nhiệt đới +STR_CLIMATE_TOYLAND_LANDSCAPE :Địa hình đồ chơi + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Rất Phẳng STR_TERRAIN_TYPE_FLAT :Phẳng @@ -1449,6 +1432,8 @@ STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Độ đậm c STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :Hiển thị tên NewGRF trong cửa sổ xây phương tiện: {STRING} STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Thêm một dòng vào cửa sổ xây phương tiện, hiển thị phương tiện đến từ NewGRF nào. +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS :Liệt kê hàng hoá mà phương tiện có thể chuyên chở trong cửa sổ danh sách {STRING} +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS_HELPTEXT :Nếu được bật, những hàng hóa có thể vận chuyển của phương tiện sẽ được hiển thị phía trên chúng trong danh sách phương tiện STR_CONFIG_SETTING_LANDSCAPE :Nền đất: {STRING} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Nền đất là định nghĩa cơ bản của các màn chơi với các kiểu hàng hóa và yêu cầu cho sự phát triển đô thị khác nhau. NewGRF và kịch bản chơi cho phép các điều chỉnh nhỏ hơn @@ -1503,6 +1488,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Tối Ưu Hóa STR_CONFIG_SETTING_ROAD_SIDE :Xe cộ: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Chọn phía xe chạy +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Lái bên trái +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Lái bên phải + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Xoay bản đồ địa hình: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Ngược chiều đồng hồ @@ -2037,7 +2026,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Tự động đ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Cho phép xe lửa vòng lại nơi đèn báo, khi nó chờ quá lâu ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Nên dùng) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Nên dùng) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Thay đổi giá trị @@ -2080,7 +2069,8 @@ STR_INTRO_HIGHSCORE :{BLACK}Bảng STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Thiết lập STR_INTRO_NEWGRF_SETTINGS :{BLACK}Thiết Lập NewGRF STR_INTRO_ONLINE_CONTENT :{BLACK}Các Nội Dung Trên Mạng -STR_INTRO_SCRIPT_SETTINGS :{BLACK}Thiết Lập AI / Game Script +STR_INTRO_AI_SETTINGS :{BLACK}Thiết Lập AI +STR_INTRO_GAMESCRIPT_SETTINGS :{BLACK}Thiết lập Game Script STR_INTRO_QUIT :{BLACK}Thoát STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Màn chơi mới.Ctrl+Click để bỏ qua phần điều chỉnh màn @@ -2100,7 +2090,8 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Hiện b STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Thiết lập hiển thị STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Hiển thị tùy chỉnh NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Kiểm tra những nội dung mới & cập nhật để tải về -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Hiển thị thiết lập AI và Game script +STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Hiển thị tùy chỉnh AI +STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Hiển thị thiết lập kịch bản màn chơi STR_INTRO_TOOLTIP_QUIT :{BLACK}Thoát 'OpenTTD' STR_INTRO_BASESET :{BLACK}Gói đồ họa cơ sở đang chọn bị thiếu {NUM} sprite. Hãy cập nhật gói cơ sở này. @@ -2132,12 +2123,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Sửa t STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Thay đổi thời gian hiện tại STR_CHEAT_SETUP_PROD :{LTBLUE}Cho phép khả năng sửa giá trị sản xuất: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Địa hình vừa phải -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Địa hình giá lạnh -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Địa hình cận nhiệt đới -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Địa hình đồ chơi - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Cách Phối Màu Mới @@ -2497,13 +2482,13 @@ STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :đợi cập nh STR_NETWORK_MESSAGE_CLIENT_LEAVING :ra khỏi ván STR_NETWORK_MESSAGE_CLIENT_JOINED :*** Máy trạm {STRING} gia nhập ván chơi -STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** Máy trạm {STRING} đã vào trò chơi (Máy trạm #{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} gia nhập công ty #{2:NUM} +STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** Máy trạm {0:STRING} đã vào trò chơi (Máy trạm #{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {0:STRING} đã gia nhập công ty #{2:NUM} STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} vào xem ván chơi -STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} khai trương công ty mới (#{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} rời bỏ ván chơi ({2:STRING}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {0:STRING} khai trương công ty mới (#{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {0:STRING} rời bỏ ván chơi ({2:STRING}) STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} đã đổi tên thành {STRING} -STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} tặng {2:CURRENCY_LONG} cho {1:STRING} +STR_NETWORK_MESSAGE_GIVE_MONEY :*** {0:STRING} tặng {2:CURRENCY_LONG} cho {1:STRING} STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}Server kết thúc phiên STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Server khởi động lại...{}Xin chờ... STR_NETWORK_MESSAGE_KICKED :*** {STRING} đã bị đá khỏi ván chơi. Lý do: ({STRING}) @@ -3144,6 +3129,8 @@ STR_MAPGEN_MAPSIZE :{BLACK}Kích th STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Lựa chọn kích thước bản đồ theo đơn vị ô. Số lượng ô thực sự có thể nhỏ hơn 1 chút. STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Số lượng đô thị: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Tên thị trấn: +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Lựa chọn kiểu tên thị trấn STR_MAPGEN_DATE :{BLACK}Thời điểm: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Số lượng nhà máy: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Độ cao đỉnh cao nhất: @@ -3159,11 +3146,40 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Giảm STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Tạo nền đất: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Kiểu nền đất: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Mực nước biển: +STR_MAPGEN_SEA_LEVEL :{BLACK}Mực nước biển: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Số sông/suối: STR_MAPGEN_SMOOTHNESS :{BLACK}Độ phẳng phiu: STR_MAPGEN_VARIETY :{BLACK}Phân bổ sự đa dạng: STR_MAPGEN_GENERATE :{WHITE}Khởi Tạo +STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}Thiết Lập NewGRF +STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Hiển thị tùy chỉnh NewGRF +STR_MAPGEN_AI_SETTINGS :{BLACK}Thiết lập AI +STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Hiển thị tùy chỉnh AI +STR_MAPGEN_GS_SETTINGS :{BLACK}Thiết lập Game Script +STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Hiển thị thiết lập game script + +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Tiếng Anh (Nguyên bản) +STR_MAPGEN_TOWN_NAME_FRENCH :Pháp +STR_MAPGEN_TOWN_NAME_GERMAN :Đức +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Tiếng Anh (Bổ sung) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :Mỹ-Latin +STR_MAPGEN_TOWN_NAME_SILLY :Silly +STR_MAPGEN_TOWN_NAME_SWEDISH :Thụy Điển +STR_MAPGEN_TOWN_NAME_DUTCH :Hà Lan +STR_MAPGEN_TOWN_NAME_FINNISH :Phần Lan +STR_MAPGEN_TOWN_NAME_POLISH :Ba Lan +STR_MAPGEN_TOWN_NAME_SLOVAK :Slovakia +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Na Uy +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Hungary +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Úc +STR_MAPGEN_TOWN_NAME_ROMANIAN :Ru-ma-ni +STR_MAPGEN_TOWN_NAME_CZECH :Séc +STR_MAPGEN_TOWN_NAME_SWISS :Thụy Sỹ +STR_MAPGEN_TOWN_NAME_DANISH :Đan Mạch +STR_MAPGEN_TOWN_NAME_TURKISH :Thổ Nhĩ Kỳ +STR_MAPGEN_TOWN_NAME_ITALIAN :Ý +STR_MAPGEN_TOWN_NAME_CATALAN :Catalan # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Rìa bản đồ: @@ -3309,6 +3325,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Sprite t STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Xử lý sprite bình thường ở trước, bỏ qua các loại pseudo/recolour/font sprite căn theo điểm bắt đầu STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Theo những thông tin của sprite đã chọn. Thì việc căn chỉnh khi vẽ đối với sprite này sẽ bị bỏ qua STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Di chuyển sprite xung quanh, thay đổi X và Y offsets. Ctrl+Click để di chuyển sprite tám đơn vị một lúc + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Đặt lại tương đối STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Đặt lại các dịch chuyển tương đối hiện tại STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK} dịch X: {NUM}, dịch Y: {NUM} (tuyệt đối) @@ -3326,15 +3346,15 @@ STR_NEWGRF_ERROR_MSG_FATAL :{RED}Lỗi nghi STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Xảy ra lỗi NewGRF nghiêm trọng:{}{STRING} STR_NEWGRF_ERROR_POPUP :{WHITE}Có lỗi NewGRF xảy ra:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} sẽ không hoạt động với phiên bản TTDPatch version theo như báo cáo của OpenTTD. -STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} để dành cho phiên bản {STRING} của TTD. -STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} được thiết kế để xài với {STRING} -STR_NEWGRF_ERROR_INVALID_PARAMETER :Tham số không hợp lệ {1:STRING}: tham số {STRING} ({NUM}) -STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} phải được nạp trước {STRING}. -STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} phỉa được nạp sau {STRING}. -STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} yêu cầu phiên bản OpenTTD {STRING} hoặc cao hơn. +STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} để dành cho phiên bản {2:STRING} của TTD. +STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} được thiết kế để dùng với {2:STRING} +STR_NEWGRF_ERROR_INVALID_PARAMETER :Tham số không hợp lệ {1:STRING}: tham số {2:STRING} ({3:NUM}) +STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} phải được nạp trước {2:STRING} +STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} phỉa được nạp sau {2:STRING}. +STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} yêu cầu phiên bản OpenTTD {2:STRING} hoặc cao hơn. STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :GRF file được thiết kế để phiên dịch STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Quá nhiều NewGRFs đã nạp. -STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Nạp {1:STRING} như là NewGRF tĩnh với {STRING} có thể gây mất đồng bộ +STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Nạp {1:STRING} như là NewGRF tĩnh với {2:STRING} có thể gây mất đồng bộ STR_NEWGRF_ERROR_UNEXPECTED_SPRITE :sprite không hợp lệ (sprite {3:NUM}) STR_NEWGRF_ERROR_UNKNOWN_PROPERTY :Thuộc tính thực thi 0 chưa định nghĩa {4:HEX} (sprite {3:NUM}) STR_NEWGRF_ERROR_INVALID_ID :Sử dụng IT không hợp lệ (sprite {3:NUM}) @@ -3466,14 +3486,14 @@ STR_LOCAL_AUTHORITY_ACTION_EXCLUSIVE_TRANSPORT :Mua độc quy STR_LOCAL_AUTHORITY_ACTION_BRIBE :Hối lộ quan chức địa phương ###length 8 -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{YELLOW}Thực hiện chiến dịch quảng cáo nhỏ để thu hút khách và hàng hoá vận chuyển.{}Tăng xếp hạng cho các trạm gần trung tâm trong thời gian ngắn.{}Chi phí: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{YELLOW}Thực hiện chiến dịch quảng cáo trung bình để thu hút khách và hàng hoá vận chuyển.{}Tăng xếp hạng cho các trạm xung quanh trung tâm trong thời gian ngắn.{}Chi phí: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{YELLOW}Thực hiện chiến dịch quảng cáo lớn để thu hút khách và hàng hoá vận chuyển.{}Tăng xếp hạng cho các trạm xung quanh & xa trung tâm trong thời gian ngắn.{}Chi phí: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{YELLOW}Tài trợ xây dựng lại đường sá của đô thị.{} Sẽ gây ách tắc giao thông đường bộ trong 6 tháng.{}Chi phí: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{YELLOW}Dựng tượng đài tôn vinh để quảng bá hình ảnh công ty.{} Tăng xếp hạng cho các trạm trong khu vực.{} Chi phí: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{YELLOW}Tài trợ xây dựng các toà nhà để thúc đẩy phát triển đô thị.{}Tăng sự phát triển đô thị trong một thời gian ngắn.{}Chi phí: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW}Mua 1 năm độc quyền kinh doanh vận tải của đô thị.{} Chính quyền địa phương sẽ ra luật chỉ cho phép hành khách và hàng hoá vào nhà ga, bến, cảng của công ty.{}Chi phí: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Đút lót quan chức địa phương để nâng cao quyền lợi, có một tỉ lệ rủi ro nếu bại lộ và sẽ mất hết quyền lợi lẫn tiền hối lộ.{}Chi phí: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{YELLOW}Thực hiện chiến dịch quảng cáo nhỏ để thu hút khách và hàng hoá vận chuyển.{}Tăng xếp hạng cho các trạm gần trung tâm trong thời gian ngắn.{}{POP_COLOUR}Chi phí: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{PUSH_COLOUR}{YELLOW}Thực hiện chiến dịch quảng cáo trung bình để thu hút khách và hàng hoá vận chuyển.{}Tăng xếp hạng cho các trạm xung quanh trung tâm trong thời gian ngắn.{}{POP_COLOUR}Chi phí: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}Thực hiện chiến dịch quảng cáo lớn để thu hút khách và hàng hoá vận chuyển.{}Tăng xếp hạng cho các trạm xung quanh & xa trung tâm trong thời gian ngắn.{}{POP_COLOUR}Chi phí: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{PUSH_COLOUR}{YELLOW}Tài trợ xây dựng lại đường sá của đô thị.{} Sẽ gây ách tắc giao thông đường bộ trong 6 tháng.{}{POP_COLOUR}Chi phí: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Dựng tượng đài tôn vinh để quảng bá hình ảnh công ty.{} Tăng xếp hạng cho các trạm trong khu vực.{}{POP_COLOUR} Chi phí: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Tài trợ xây dựng các toà nhà để thúc đẩy phát triển đô thị.{}Tăng sự phát triển đô thị trong một thời gian ngắn.{}{POP_COLOUR}Chi phí: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}Mua 1 năm độc quyền kinh doanh vận tải của đô thị.{} Chính quyền địa phương sẽ ra luật chỉ cho phép hành khách và hàng hoá vào nhà ga, bến, cảng của công ty.{}{POP_COLOUR}Chi phí: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Đút lót quan chức địa phương để nâng cao quyền lợi, có một tỉ lệ rủi ro nếu bại lộ và sẽ mất hết quyền lợi lẫn tiền hối lộ.{}{POP_COLOUR}Chi phí: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}Mục Tiêu Của {COMPANY} @@ -3646,16 +3666,18 @@ STR_FINANCES_SECTION_SHIP_REVENUE :{GOLD}Tàu thuy STR_FINANCES_SECTION_LOAN_INTEREST :{GOLD}Lãi vay vốn STR_FINANCES_SECTION_OTHER :{GOLD}Khác +STR_FINANCES_TOTAL_CAPTION :{WHITE}Tổng số STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} STR_FINANCES_ZERO_INCOME :{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} -STR_FINANCES_NET_PROFIT :{WHITE}Lợi Nhuận Ròng +STR_FINANCES_PROFIT :{WHITE}Lợi nhuận STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Số dư hiện có STR_FINANCES_OWN_FUNDS_TITLE :{WHITE}Nguồn Vốn Riêng STR_FINANCES_LOAN_TITLE :{WHITE}Đi vay STR_FINANCES_INTEREST_RATE :{WHITE}Lãi Vay Vốn: {BLACK}{NUM}% STR_FINANCES_MAX_LOAN :{WHITE}Hạn mức vay: {BLACK}{CURRENCY_LONG} STR_FINANCES_TOTAL_CURRENCY :{BLACK}{CURRENCY_LONG} +STR_FINANCES_BANK_BALANCE :{WHITE}{CURRENCY_LONG} STR_FINANCES_BORROW_BUTTON :{BLACK}Vay {CURRENCY_LONG} STR_FINANCES_BORROW_TOOLTIP :{BLACK}Vay thêm tiền. Ctrl+Click vay hết hạn mức ngay STR_FINANCES_REPAY_BUTTON :{BLACK}Trả nợ {CURRENCY_LONG} @@ -3756,7 +3778,7 @@ STR_INDUSTRY_VIEW_PRODUCES_N_CARGO :{BLACK}Sản l STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :, {STRING}{STRING} STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Cần cung cấp: -STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{0:STRING}{BLACK}{3:STRING} STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} đang chờ{STRING} STR_CONFIG_GAME_PRODUCTION :{WHITE}Thay đổi sản lượng (bội số của 8, max 2040) @@ -3786,6 +3808,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Gửi ch STR_VEHICLE_LIST_REPLACE_VEHICLES :Thay phương tiện STR_VEHICLE_LIST_SEND_FOR_SERVICING :Gửi về bảo trì STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Lợi nhuận năm nay: {CURRENCY_LONG} (năm ngoái: {CURRENCY_LONG}) +STR_VEHICLE_LIST_CARGO :{TINY_FONT}{BLACK}[{CARGO_LIST}] +STR_VEHICLE_LIST_NAME_AND_CARGO :{TINY_FONT}{BLACK}{STRING} {STRING} STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Gửi về xưởng STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Gửi về xưởng @@ -3877,6 +3901,11 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Lực k STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Tầm xa: {GOLD}{COMMA} ô STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Kiểu máy bay: {GOLD}{STRING} +###length 3 +STR_CARGO_TYPE_FILTER_ALL :Tất cả hàng hóa +STR_CARGO_TYPE_FILTER_FREIGHT :Hàng hóa +STR_CARGO_TYPE_FILTER_NONE :Không + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Danh sách tàu hỏa có thể chọn. Click vào tàu hỏa để xem thông tin. Ctrl+Click để ẩn/hiện loại được chọn STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Danh sách xe có thể chọn. Click vào xe để xem thông tin. Ctrl+Click để ẩn/hiện loại được chọn @@ -4045,7 +4074,7 @@ STR_ENGINE_PREVIEW_AIRCRAFT :máy bay STR_ENGINE_PREVIEW_SHIP :tàu thuỷ STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Giá thành: {CURRENCY_LONG} Tải trọng: {WEIGHT_SHORT}{}Tốc độ: {VELOCITY} Công suất: {POWER}{}Chi phí hoạt động: {CURRENCY_LONG}/năm{}Sức chứa: {CARGO_LONG} -STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Giá: {CURRENCY_LONG} Nặng: {WEIGHT_SHORT}{}Tốc độ: {VELOCITY} Công suất: {POWER} Max. T.E.: {6:FORCE}{}Giá vận hành: {4:CURRENCY_LONG}/yr{}Năng suất: {5:CARGO_LONG} +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Giá: {0:CURRENCY_LONG} Nặng: {1:WEIGHT_SHORT}{}Tốc độ: {2:VELOCITY} Công suất: {3:POWER} Max. T.E.: {6:FORCE}{}Giá vận hành: {4:CURRENCY_LONG}/yr{}Năng suất: {5:CARGO_LONG} STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Giá thành: {CURRENCY_LONG} Tốc độ tối đa: {VELOCITY}{}Sức chứa: {CARGO_LONG}{}Chi phí hoạt động: {CURRENCY_LONG}/năm STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Giá: {CURRENCY_LONG} Tốc độ tối đa: {VELOCITY}{}Kiểu máy bay: {STRING}{}Sức chứa: {CARGO_LONG}, {CARGO_LONG}{}Chi phí hoạt động: {CURRENCY_LONG}/năm STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}GIá: {CURRENCY_LONG} Tốc độ tối đa: {VELOCITY}{}Kiểu máy bay: {STRING}{}Sức chứa: {CARGO_LONG}{}Chi phí hoạt động: {CURRENCY_LONG}/năm @@ -4204,12 +4233,13 @@ STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Tải tr STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Tải trọng: {LTBLUE}{WEIGHT_SHORT} {BLACK}Công suất: {LTBLUE}{POWER}{BLACK} Tốc độ tối đa: {LTBLUE}{VELOCITY} {BLACK}Max. T.E.: {LTBLUE}{FORCE} STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Lợi nhuận năm nay: {LTBLUE}{CURRENCY_LONG} (năm ngoái: {CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Lợi nhuận năm nay: {LTBLUE}{CURRENCY_LONG} (năm ngoái: {CURRENCY_LONG}) {BLACK}Hiệu suất tối thiểu: {LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Độ tin cậy: {LTBLUE}{COMMA}% {BLACK}Hỏng hóc kể từ lần bảo trì cuối: {LTBLUE}{COMMA} STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Mua lúc: {LTBLUE}{NUM}{BLACK} Giá trị: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_INFO_NO_CAPACITY :{BLACK}Sức chứa: {LTBLUE}Không{STRING} -STR_VEHICLE_INFO_CAPACITY :{BLACK}Sức chứa: {LTBLUE}{CARGO_LONG}{3:STRING} -STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Sức chứa: {LTBLUE}{CARGO_LONG}{3:STRING} (x{4:NUM}) +STR_VEHICLE_INFO_CAPACITY :{BLACK}Sức chứa: {LTBLUE}{0:CARGO_LONG}{3:STRING} +STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Sức chứa: {LTBLUE}{0:CARGO_LONG}{3:STRING} (x{4:NUM}) STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Sức chứa: {LTBLUE}{CARGO_LONG}, {CARGO_LONG}{STRING} STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Cước trung chuyển: {LTBLUE}{CURRENCY_LONG} @@ -4537,12 +4567,14 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Có mộ STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Cửa sổ gỡ lỗi AI/Game Script chỉ có trên server # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Thiết Lập Game AI/Game Script +STR_AI_CONFIG_CAPTION_AI :{WHITE}Cấu hình AI +STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Cấu hình Game Script STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Các Game Script sẽ được chạy trong ván chơi tiếp theo STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}Các AIs sẽ được chạy trong ván chơi tiếp theo STR_AI_CONFIG_HUMAN_PLAYER :Nhân vật người STR_AI_CONFIG_RANDOM_AI :AI ngẫu nhiên STR_AI_CONFIG_NONE :(không) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Số đối thủ cạnh tranh tối đa: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Chuyển Lên Trên STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Di chuyển AI lên trên danh sách @@ -4550,12 +4582,11 @@ STR_AI_CONFIG_MOVE_DOWN :{BLACK}Di Chuy STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Di chuyển AI xuống dưới danh sách STR_AI_CONFIG_GAMESCRIPT :{SILVER}Game Script +STR_AI_CONFIG_GAMESCRIPT_PARAM :{SILVER}Tham số STR_AI_CONFIG_AI :{SILVER}AIs -STR_AI_CONFIG_CHANGE :{BLACK}Chọn {STRING} -STR_AI_CONFIG_CHANGE_NONE : -STR_AI_CONFIG_CHANGE_AI :AI -STR_AI_CONFIG_CHANGE_GAMESCRIPT :Game Script +STR_AI_CONFIG_CHANGE_AI :{BLACK}Chọn AI +STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}Chọn Game Script STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Chạy tập lệnh khác STR_AI_CONFIG_CONFIGURE :{BLACK}Tham Số STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Cấu hình tham số cho AI @@ -4584,9 +4615,7 @@ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Chụp b STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Chụp màn hình bản đồ nhỏ # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Các Thông Số -STR_AI_SETTINGS_CAPTION_AI :AI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Game Script +STR_AI_SETTINGS_CAPTION_AI :{WHITE}Tham số AI STR_AI_SETTINGS_CLOSE :{BLACK}Đóng STR_AI_SETTINGS_RESET :{BLACK}Thiết Lập Lại STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -5004,6 +5033,8 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Không t STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... xe đã bị phá hủy +STR_ERROR_CAN_T_CLONE_VEHICLE_LIST :{WHITE}... các phương tiện không như nhau + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Không có phương tiện nào sẵn sàng cả STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Thay đổi tham số NewGRF STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Chưa có phương tiện nào có sẵn @@ -5030,6 +5061,8 @@ STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}Không t STR_ERROR_CAN_T_COPY_SHARE_ORDER :{WHITE}... phương tiện không thể tới được mọi ga, bến STR_ERROR_CAN_T_ADD_ORDER :{WHITE}... phương tiện không thể tới ga, bến đó được STR_ERROR_CAN_T_ADD_ORDER_SHARED :{WHITE}... phương tiện dùng lộ trình chia sẻ này không tới được ga, bến đó +STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST :{WHITE}... các phương tiện không có cùng lộ trình +STR_ERROR_CAN_T_SHARE_ORDER_VEHICLE_LIST :{WHITE}... không phải tất cả phương tiện đang chia sẻ lộ trình STR_ERROR_CAN_T_SHARE_ORDER_LIST :{WHITE}Không thể chia sẻ lộ trình... STR_ERROR_CAN_T_STOP_SHARING_ORDER_LIST :{WHITE}Không thể dừng chia sẻ danh sách lịch trình... diff --git a/src/lang/welsh.txt b/src/lang/welsh.txt index d6216de83a..f6b9ef0b6b 100644 --- a/src/lang/welsh.txt +++ b/src/lang/welsh.txt @@ -198,6 +198,7 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}hp STR_UNITS_POWER_METRIC :{COMMA}{NBSP}hp STR_UNITS_POWER_SI :{COMMA}{NBSP}kW + STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg @@ -375,10 +376,9 @@ STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Gadael # Settings menu -###length 14 +###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Dewisiadau Gêm STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Gosodiadau -STR_SETTINGS_MENU_SCRIPT_SETTINGS :Gosodiadau AI / sgript Gêm STR_SETTINGS_MENU_NEWGRF_SETTINGS :Gosodiadau NewGRF STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Dewisiadau tryloywder STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Dangos enwau trefi @@ -928,36 +928,6 @@ STR_GAME_OPTIONS_CURRENCY_IRR :Rial Iran (IRR) STR_GAME_OPTIONS_CURRENCY_RUB :Rwbl Rwsaidd Newydd (RUB) STR_GAME_OPTIONS_CURRENCY_CNY :Renminbi Tseina (CNY) -###length 2 -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Gyrru ar y chwith -STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Gyrru ar y dde - -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Enwau Trefi -STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Dewis arddull yr enwau trefi - -###length 21 -STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Saesneg (Gwreiddiol) -STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Ffrangeg -STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Almaeneg -STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Saesneg (Ychwanegol) -STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :America Ladin -STR_GAME_OPTIONS_TOWN_NAME_SILLY :Gwirion -STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Swedaidd -STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Iseldireg -STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Ffinnaidd -STR_GAME_OPTIONS_TOWN_NAME_POLISH :Pwylaidd -STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Slofacaidd -STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norwyaidd -STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Hwngaraidd -STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Awstriaidd -STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Rwmaniaidd -STR_GAME_OPTIONS_TOWN_NAME_CZECH :Tsecaidd -STR_GAME_OPTIONS_TOWN_NAME_SWISS :Swisaidd -STR_GAME_OPTIONS_TOWN_NAME_DANISH :Danaidd -STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Twrcaidd -STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Eidalaidd -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Catalanaidd - STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Awtogadw STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Dewiswch pa mor aml y dylid awtogadw gemau @@ -982,12 +952,6 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :arall -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Maint rhyngwyneb -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Dewis maint yr elfennau rhyngwyneb i'w defnyddio - -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Arferol -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Dyblyg -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Pedwarplyg @@ -1036,8 +1000,6 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Rhagolw STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 Punt (£) yn eich arian cyfaddas STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Newid paramedrau arian cyfaddas -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Uchafswm nifer y cystadleuwyr: {ORANGE}{COMMA} - STR_NONE :Dim STR_FUNDING_ONLY :Ariannu'n unig STR_MINIMAL :Lleiafsymol @@ -1087,6 +1049,12 @@ STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 +###length 4 +STR_CLIMATE_TEMPERATE_LANDSCAPE :Tirwedd Tymherus +STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Tirwedd Is-arctig +STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Tirwedd trofannol +STR_CLIMATE_TOYLAND_LANDSCAPE :Tirwedd Teganau + ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Gwastad Iawn STR_TERRAIN_TYPE_FLAT :Gwastad @@ -1421,6 +1389,10 @@ STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Gwell STR_CONFIG_SETTING_ROAD_SIDE :Cerbydau ffordd: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Dewis yr ochr gyrru +###length 2 +STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Gyrru ar y chwith +STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Gyrru ar y dde + STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Tro Map Uchder: {STRING} ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Gwrthglocwedd @@ -1898,7 +1870,7 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Troi'n ôl yn a STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Caniatáu i drenau gwrthdroi wrth signal, os ydynt wedi aros yno am beth amser ###length 2 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF -STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Argymellir) +STR_CONFIG_SETTING_PATHFINDER_YAPF :YAPF {BLUE}(Argymellir) STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Newid gwerth gosodiad @@ -1940,7 +1912,6 @@ STR_INTRO_HIGHSCORE :{BLACK}Tabl Sg STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Gosodiadau STR_INTRO_NEWGRF_SETTINGS :{BLACK}Gosodiadau NewGRF STR_INTRO_ONLINE_CONTENT :{BLACK}Gwirio Cynnwys Ar-lein -STR_INTRO_SCRIPT_SETTINGS :{BLACK}Gosodiadau AI / Sgript Gêm STR_INTRO_QUIT :{BLACK}Gadael STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Dechrau gêm newydd. Mae Ctrl+Clic yn hepgor dewisiadau map @@ -1960,7 +1931,6 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Dangos y STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Gosodiadau arddangos STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Dangos gosodiadau NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Gwirio am gynnwys newydd neu wedi'i ddiweddaru i'w lwytho i lawr -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Dangos gosodiadau AI a sgript Gêm STR_INTRO_TOOLTIP_QUIT :{BLACK}Gadael 'OpenTTD' STR_INTRO_BASESET :{BLACK}Mae {NUM} corlun ar goll o'r set raffeg sylfaenol a ddewiswyd. Gwiriwch am ddiweddariadau i'r set raffeg. @@ -1990,12 +1960,6 @@ STR_CHEAT_CHANGE_DATE :{LTBLUE}Newid d STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Newid y flwyddyn bresennol STR_CHEAT_SETUP_PROD :{LTBLUE}Galluogi newid graddfeydd cynhyrchu: {ORANGE}{STRING} -###length 4 -STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Tirwedd Tymherus -STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Tirwedd Is-arctig -STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Tirwedd trofannol -STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Tirwedd Teganau - # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Cynllun Lliw @@ -2850,16 +2814,41 @@ STR_MAPGEN_MAPSIZE :{BLACK}Maint Ma STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Dewis maint y map mewn teiliau. Bydd y nifer o deiliau sydd ara gael ychydig yn llai STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Nifer trefi: +STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Enwau Trefi +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Dewis arddull yr enwau trefi STR_MAPGEN_DATE :{BLACK}Dyddiad: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Nifer diwydiannau: STR_MAPGEN_LAND_GENERATOR :{BLACK}Cynhyrchydd Tir: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Math Tirwedd: -STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Lefel y Môr: +STR_MAPGEN_SEA_LEVEL :{BLACK}Lefel y Môr: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Afonydd: STR_MAPGEN_SMOOTHNESS :{BLACK}Llyfnder: STR_MAPGEN_VARIETY :{BLACK}Dosbarthiad amrywiaeth: STR_MAPGEN_GENERATE :{WHITE}Cynhyrchu +###length 21 +STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Saesneg (Gwreiddiol) +STR_MAPGEN_TOWN_NAME_FRENCH :Ffrangeg +STR_MAPGEN_TOWN_NAME_GERMAN :Almaeneg +STR_MAPGEN_TOWN_NAME_ADDITIONAL_ENGLISH :Saesneg (Ychwanegol) +STR_MAPGEN_TOWN_NAME_LATIN_AMERICAN :America Ladin +STR_MAPGEN_TOWN_NAME_SILLY :Gwirion +STR_MAPGEN_TOWN_NAME_SWEDISH :Swedaidd +STR_MAPGEN_TOWN_NAME_DUTCH :Iseldireg +STR_MAPGEN_TOWN_NAME_FINNISH :Ffinnaidd +STR_MAPGEN_TOWN_NAME_POLISH :Pwylaidd +STR_MAPGEN_TOWN_NAME_SLOVAK :Slofacaidd +STR_MAPGEN_TOWN_NAME_NORWEGIAN :Norwyaidd +STR_MAPGEN_TOWN_NAME_HUNGARIAN :Hwngaraidd +STR_MAPGEN_TOWN_NAME_AUSTRIAN :Awstriaidd +STR_MAPGEN_TOWN_NAME_ROMANIAN :Rwmaniaidd +STR_MAPGEN_TOWN_NAME_CZECH :Tsecaidd +STR_MAPGEN_TOWN_NAME_SWISS :Swisaidd +STR_MAPGEN_TOWN_NAME_DANISH :Danaidd +STR_MAPGEN_TOWN_NAME_TURKISH :Twrcaidd +STR_MAPGEN_TOWN_NAME_ITALIAN :Eidalaidd +STR_MAPGEN_TOWN_NAME_CATALAN :Catalanaidd + # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Ymylon mapiau: STR_MAPGEN_NORTHWEST :{BLACK}Gog. Orllewin @@ -2995,6 +2984,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Corlun b STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Mynd i'r corlun cyffredin blaenorol, gan hepgor unrhyw gorluniau ailliwio/ffont/llidgorluniau, ac amlapio o'r corlun cyntaf i'r olaf STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Cynrychioliad o'r corlun a ddewiswyd. Fe anwybyddir yr aliniad wrth lunio'r corlun STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Symud y corlun, gan newid yr atredau X ac Y. Mae Ctrl+Clic yn symud y corlun wyth uned ar y tro + +###length 2 + + STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Ailosod perthyniad STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Ailosod y dodiadau perthynol STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}Dodiad X: {NUM}, Dodiad Y: {NUM} (Absoliwt) @@ -3513,6 +3506,8 @@ STR_PURCHASE_INFO_MAX_TE :{BLACK}Grym Tyn STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Pellter cyrhaeddiad: {GOLD}{COMMA} teil STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Math awyren: {GOLD}{STRING} +###length 3 + ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Rhestr dewis trenau. Cliciwch ar gerbyd am wybodaeth. Mae Ctrl+Clicio'n toglu cuddio'r math cerbyd STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Rhestr dewis cerbydau ffordd. Cliciwch ar gerbyd am wybodaeth. Mae Ctrl+Clicio'n toglu cuddio'r math cerbyd @@ -4146,12 +4141,12 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Mae sgri STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Mae'r Ffenestr Ddadnamu AI / Sgript Gêm ar gael ar gyfer y gweinydd yn unig # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Ffurfweddiad AI / Sgript Gêm STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Y Sgriptiau Gêm a lwythir yn y gêm nesaf STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}Yr AIau a lwythir yn y gêm nesaf STR_AI_CONFIG_HUMAN_PLAYER :Chwaraewr dynol STR_AI_CONFIG_RANDOM_AI :AI ar hap STR_AI_CONFIG_NONE :(dim) +STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Uchafswm nifer y cystadleuwyr: {ORANGE}{COMMA} STR_AI_CONFIG_MOVE_UP :{BLACK}Symud i Fyny STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Symud yr AI a ddewiswyd i fyny'r rhestr @@ -4161,8 +4156,6 @@ STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Symud yr STR_AI_CONFIG_GAMESCRIPT :{SILVER}Sgript Gêm STR_AI_CONFIG_AI :{SILVER}AIau -STR_AI_CONFIG_CHANGE :{BLACK}Dewis {STRING} -STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :AI STR_AI_CONFIG_CHANGE_GAMESCRIPT :Sgript Gêm STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Llwytho sgript arall @@ -4186,9 +4179,7 @@ STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Peidio n # AI Parameters -STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Paramedrau STR_AI_SETTINGS_CAPTION_AI :AI -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Sgript Gêm STR_AI_SETTINGS_CLOSE :{BLACK}Cau STR_AI_SETTINGS_RESET :{BLACK}Ailosod STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4595,6 +4586,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Methu ne STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... cerbyd wedi ei ddinistrio + STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Ni fydd cerbydau ar gael o gwbl STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Newid eich ffurfweddiad NewGRF STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Dim cerbydau ar gael eto diff --git a/src/league_base.h b/src/league_base.h new file mode 100644 index 0000000000..8a70db4ca2 --- /dev/null +++ b/src/league_base.h @@ -0,0 +1,68 @@ +/* + * 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 league_base.h %LeagueTable base class. */ + +#ifndef LEAGUE_BASE_H +#define LEAGUE_BASE_H + +#include "company_type.h" +#include "goal_type.h" +#include "league_type.h" +#include "core/pool_type.hpp" + +bool IsValidLink(Link link); + +typedef Pool LeagueTableElementPool; +extern LeagueTableElementPool _league_table_element_pool; + +typedef Pool LeagueTablePool; +extern LeagueTablePool _league_table_pool; + + +/** + * Struct about league table elements. + * Each LeagueTable is composed of one or more elements. Elements are sorted by their rating (higher=better). + **/ +struct LeagueTableElement : LeagueTableElementPool::PoolItem<&_league_table_element_pool> { + LeagueTableID table; ///< Id of the table which this element belongs to + uint64 rating; ///< Value that determines ordering of elements in the table (higher=better) + CompanyID company; ///< Company Id to show the color blob for or INVALID_COMPANY + std::string text; ///< Text of the element + std::string score; ///< String representation of the score associated with the element + Link link; ///< What opens when element is clicked + + /** + * We need an (empty) constructor so struct isn't zeroed (as C++ standard states) + */ + LeagueTableElement() { } + + /** + * (Empty) destructor has to be defined else operator delete might be called with nullptr parameter + */ + ~LeagueTableElement() { } +}; + + +/** Struct about custom league tables */ +struct LeagueTable : LeagueTablePool::PoolItem<&_league_table_pool> { + std::string title; ///< Title of the table + std::string header; ///< Text to show above the table + std::string footer; ///< Text to show below the table + + /** + * We need an (empty) constructor so struct isn't zeroed (as C++ standard states) + */ + LeagueTable() { } + + /** + * (Empty) destructor has to be defined else operator delete might be called with nullptr parameter + */ + ~LeagueTable() { } +}; + +#endif /* LEAGUE_BASE_H */ diff --git a/src/league_cmd.cpp b/src/league_cmd.cpp new file mode 100644 index 0000000000..6e715fd030 --- /dev/null +++ b/src/league_cmd.cpp @@ -0,0 +1,176 @@ +/* + * 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 league_cmd.cpp Handling of league tables. */ + +#include "stdafx.h" +#include "league_cmd.h" +#include "league_base.h" +#include "command_type.h" +#include "command_func.h" +#include "industry.h" +#include "story_base.h" +#include "town.h" +#include "window_func.h" +#include "core/pool_func.hpp" + +#include "safeguards.h" + +LeagueTableElementPool _league_table_element_pool("LeagueTableElement"); +INSTANTIATE_POOL_METHODS(LeagueTableElement) + +LeagueTablePool _league_table_pool("LeagueTable"); +INSTANTIATE_POOL_METHODS(LeagueTable) + +/** + * Checks whether a link is valid, i.e. has a valid target. + * @param link the link to check + * @return true iff the link is valid + */ +bool IsValidLink(Link link) +{ + switch (link.type) { + case LT_NONE: return (link.target == 0); + case LT_TILE: return IsValidTile(link.target); + case LT_INDUSTRY: return Industry::IsValidID(link.target); + case LT_TOWN: return Town::IsValidID(link.target); + case LT_COMPANY: return Company::IsValidID(link.target); + case LT_STORY_PAGE: return StoryPage::IsValidID(link.target); + default: return false; + } + return false; +} + +/** + * Create a new league table. + * @param flags type of operation + * @param title Title of the league table + * @param header Text to show above the table + * @param footer Text to show below the table + * @return the cost of this operation or an error + */ +std::tuple CmdCreateLeagueTable(DoCommandFlag flags, const std::string &title, const std::string &header, const std::string &footer) +{ + if (_current_company != OWNER_DEITY) return { CMD_ERROR, INVALID_LEAGUE_TABLE }; + if (!LeagueTable::CanAllocateItem()) return { CMD_ERROR, INVALID_LEAGUE_TABLE }; + if (title.empty()) return { CMD_ERROR, INVALID_LEAGUE_TABLE }; + + if (flags & DC_EXEC) { + LeagueTable *lt = new LeagueTable(); + lt->title = title; + lt->header = header; + lt->footer = footer; + return { CommandCost(), lt->index }; + } + + return { CommandCost(), INVALID_LEAGUE_TABLE }; +} + + +/** + * Create a new element in a league table. + * @param flags type of operation + * @param table Id of the league table this element belongs to + * @param rating Value that elements are ordered by + * @param company Company to show the color blob for or INVALID_COMPANY + * @param text Text of the element + * @param score String representation of the score associated with the element + * @param link_type Type of the referenced object + * @param link_target Id of the referenced object + * @return the cost of this operation or an error + */ +std::tuple CmdCreateLeagueTableElement(DoCommandFlag flags, LeagueTableID table, int64 rating, CompanyID company, const std::string &text, const std::string &score, LinkType link_type, LinkTargetID link_target) +{ + if (_current_company != OWNER_DEITY) return { CMD_ERROR, INVALID_LEAGUE_TABLE_ELEMENT }; + if (!LeagueTableElement::CanAllocateItem()) return { CMD_ERROR, INVALID_LEAGUE_TABLE_ELEMENT }; + Link link{link_type, link_target}; + if (!IsValidLink(link)) return { CMD_ERROR, INVALID_LEAGUE_TABLE_ELEMENT }; + if (company != INVALID_COMPANY && !Company::IsValidID(company)) return { CMD_ERROR, INVALID_LEAGUE_TABLE_ELEMENT }; + + if (flags & DC_EXEC) { + LeagueTableElement *lte = new LeagueTableElement(); + lte->table = table; + lte->rating = rating; + lte->company = company; + lte->text = text; + lte->score = score; + lte->link = link; + InvalidateWindowData(WC_COMPANY_LEAGUE, table); + return { CommandCost(), lte->index }; + } + return { CommandCost(), INVALID_LEAGUE_TABLE_ELEMENT }; +} + +/** + * Update the attributes of a league table element. + * @param flags type of operation + * @param element Id of the element to update + * @param company Company to show the color blob for or INVALID_COMPANY + * @param text Text of the element + * @param link_type Type of the referenced object + * @param link_target Id of the referenced object + * @return the cost of this operation or an error + */ +CommandCost CmdUpdateLeagueTableElementData(DoCommandFlag flags, LeagueTableElementID element, CompanyID company, const std::string &text, LinkType link_type, LinkTargetID link_target) +{ + if (_current_company != OWNER_DEITY) return CMD_ERROR; + auto lte = LeagueTableElement::GetIfValid(element); + if (lte == nullptr) return CMD_ERROR; + if (company != INVALID_COMPANY && !Company::IsValidID(company)) return CMD_ERROR; + Link link{link_type, link_target}; + if (!IsValidLink(link)) return CMD_ERROR; + + if (flags & DC_EXEC) { + lte->company = company; + lte->text = text; + lte->link = link; + InvalidateWindowData(WC_COMPANY_LEAGUE, lte->table); + } + return CommandCost(); +} + +/** + * Update the score of a league table element. + * @param flags type of operation + * @param element Id of the element to update + * @param rating Value that elements are ordered by + * @param score String representation of the score associated with the element + * @return the cost of this operation or an error + */ +CommandCost CmdUpdateLeagueTableElementScore(DoCommandFlag flags, LeagueTableElementID element, int64 rating, const std::string &score) +{ + if (_current_company != OWNER_DEITY) return CMD_ERROR; + auto lte = LeagueTableElement::GetIfValid(element); + if (lte == nullptr) return CMD_ERROR; + + if (flags & DC_EXEC) { + lte->rating = rating; + lte->score = score; + InvalidateWindowData(WC_COMPANY_LEAGUE, lte->table); + } + return CommandCost(); +} + +/** + * Remove a league table element. + * @param flags type of operation + * @param element Id of the element to update + * @return the cost of this operation or an error + */ +CommandCost CmdRemoveLeagueTableElement(DoCommandFlag flags, LeagueTableElementID element) +{ + if (_current_company != OWNER_DEITY) return CMD_ERROR; + auto lte = LeagueTableElement::GetIfValid(element); + if (lte == nullptr) return CMD_ERROR; + + if (flags & DC_EXEC) { + auto table = lte->table; + delete lte; + InvalidateWindowData(WC_COMPANY_LEAGUE, table); + } + return CommandCost(); +} diff --git a/src/league_cmd.h b/src/league_cmd.h new file mode 100644 index 0000000000..39adb4aee4 --- /dev/null +++ b/src/league_cmd.h @@ -0,0 +1,29 @@ +/* + * 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 league_cmd.h Command definitions related to league tables. */ + +#ifndef LEAGUE_CMD_H +#define LEAGUE_CMD_H + +#include "league_type.h" +#include "command_type.h" +#include "company_type.h" + +std::tuple CmdCreateLeagueTable(DoCommandFlag flags, const std::string &title, const std::string &header, const std::string &footer); +std::tuple CmdCreateLeagueTableElement(DoCommandFlag flags, LeagueTableID table, int64 rating, CompanyID company, const std::string &text, const std::string &score, LinkType link_type, LinkTargetID link_target); +CommandCost CmdUpdateLeagueTableElementData(DoCommandFlag flags, LeagueTableElementID element, CompanyID company, const std::string &text, LinkType link_type, LinkTargetID link_target); +CommandCost CmdUpdateLeagueTableElementScore(DoCommandFlag flags, LeagueTableElementID element, int64 rating, const std::string &score); +CommandCost CmdRemoveLeagueTableElement(DoCommandFlag flags, LeagueTableElementID element); + +DEF_CMD_TRAIT(CMD_CREATE_LEAGUE_TABLE, CmdCreateLeagueTable, CMD_DEITY | CMD_STR_CTRL, CMDT_OTHER_MANAGEMENT) +DEF_CMD_TRAIT(CMD_CREATE_LEAGUE_TABLE_ELEMENT, CmdCreateLeagueTableElement, CMD_DEITY | CMD_STR_CTRL, CMDT_OTHER_MANAGEMENT) +DEF_CMD_TRAIT(CMD_UPDATE_LEAGUE_TABLE_ELEMENT_DATA, CmdUpdateLeagueTableElementData, CMD_DEITY | CMD_STR_CTRL, CMDT_OTHER_MANAGEMENT) +DEF_CMD_TRAIT(CMD_UPDATE_LEAGUE_TABLE_ELEMENT_SCORE, CmdUpdateLeagueTableElementScore, CMD_DEITY | CMD_STR_CTRL, CMDT_OTHER_MANAGEMENT) +DEF_CMD_TRAIT(CMD_REMOVE_LEAGUE_TABLE_ELEMENT, CmdRemoveLeagueTableElement, CMD_DEITY, CMDT_OTHER_MANAGEMENT) + +#endif /* LEAGUE_CMD_H */ diff --git a/src/league_gui.cpp b/src/league_gui.cpp new file mode 100644 index 0000000000..a46cd2efa6 --- /dev/null +++ b/src/league_gui.cpp @@ -0,0 +1,452 @@ +/* + * 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 league_gui.cpp GUI for league tables. */ + +#include "stdafx.h" +#include "league_gui.h" + +#include "company_base.h" +#include "company_gui.h" +#include "gui.h" +#include "industry.h" +#include "league_base.h" +#include "sortlist_type.h" +#include "story_base.h" +#include "strings_func.h" +#include "tile_map.h" +#include "town.h" +#include "viewport_func.h" +#include "window_gui.h" +#include "widgets/league_widget.h" +#include "table/strings.h" +#include "table/sprites.h" + +#include "safeguards.h" + + +static const StringID _performance_titles[] = { + STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER, + STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER, + STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRAFFIC_MANAGER, + STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRAFFIC_MANAGER, + STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRANSPORT_COORDINATOR, + STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRANSPORT_COORDINATOR, + STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ROUTE_SUPERVISOR, + STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ROUTE_SUPERVISOR, + STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_DIRECTOR, + STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_DIRECTOR, + STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHIEF_EXECUTIVE, + STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHIEF_EXECUTIVE, + STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHAIRMAN, + STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHAIRMAN, + STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_PRESIDENT, + STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TYCOON, +}; + +static inline StringID GetPerformanceTitleFromValue(uint value) +{ + return _performance_titles[std::min(value, 1000u) >> 6]; +} + +class PerformanceLeagueWindow : public Window { +private: + GUIList companies; + uint ordinal_width; ///< The width of the ordinal number + uint text_width; ///< The width of the actual text + int line_height; ///< Height of the text lines + Dimension icon; ///< Dimension of the company icon. + + /** + * (Re)Build the company league list + */ + void BuildCompanyList() + { + if (!this->companies.NeedRebuild()) return; + + this->companies.clear(); + + for (const Company *c : Company::Iterate()) { + this->companies.push_back(c); + } + + this->companies.shrink_to_fit(); + this->companies.RebuildDone(); + } + + /** Sort the company league by performance history */ + static bool PerformanceSorter(const Company * const &c1, const Company * const &c2) + { + return c2->old_economy[0].performance_history < c1->old_economy[0].performance_history; + } + +public: + PerformanceLeagueWindow(WindowDesc *desc, WindowNumber window_number) : Window(desc) + { + this->InitNested(window_number); + this->companies.ForceRebuild(); + this->companies.NeedResort(); + } + + void OnPaint() override + { + this->BuildCompanyList(); + this->companies.Sort(&PerformanceSorter); + + this->DrawWidgets(); + } + + void DrawWidget(const Rect &r, int widget) const override + { + if (widget != WID_PLT_BACKGROUND) return; + + Rect ir = r.Shrink(WidgetDimensions::scaled.framerect); + int icon_y_offset = (this->line_height - this->icon.height) / 2; + int text_y_offset = (this->line_height - FONT_HEIGHT_NORMAL) / 2; + + bool rtl = _current_text_dir == TD_RTL; + Rect ordinal = ir.WithWidth(this->ordinal_width, rtl); + uint icon_left = ir.Indent(rtl ? this->text_width : this->ordinal_width, rtl).left; + Rect text = ir.WithWidth(this->text_width, !rtl); + + for (uint i = 0; i != this->companies.size(); i++) { + const Company *c = this->companies[i]; + DrawString(ordinal.left, ordinal.right, ir.top + text_y_offset, i + STR_ORDINAL_NUMBER_1ST, i == 0 ? TC_WHITE : TC_YELLOW); + + DrawCompanyIcon(c->index, icon_left, ir.top + icon_y_offset); + + SetDParam(0, c->index); + SetDParam(1, c->index); + SetDParam(2, GetPerformanceTitleFromValue(c->old_economy[0].performance_history)); + DrawString(text.left, text.right, ir.top + text_y_offset, STR_COMPANY_LEAGUE_COMPANY_NAME); + ir.top += this->line_height; + } + } + + void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override + { + if (widget != WID_PLT_BACKGROUND) return; + + this->ordinal_width = 0; + for (uint i = 0; i < MAX_COMPANIES; i++) { + this->ordinal_width = std::max(this->ordinal_width, GetStringBoundingBox(STR_ORDINAL_NUMBER_1ST + i).width); + } + this->ordinal_width += WidgetDimensions::scaled.hsep_wide; // Keep some extra spacing + + uint widest_width = 0; + uint widest_title = 0; + for (uint i = 0; i < lengthof(_performance_titles); i++) { + uint width = GetStringBoundingBox(_performance_titles[i]).width; + if (width > widest_width) { + widest_title = i; + widest_width = width; + } + } + + this->icon = GetSpriteSize(SPR_COMPANY_ICON); + this->line_height = std::max(this->icon.height + WidgetDimensions::scaled.vsep_normal, FONT_HEIGHT_NORMAL); + + for (const Company *c : Company::Iterate()) { + SetDParam(0, c->index); + SetDParam(1, c->index); + SetDParam(2, _performance_titles[widest_title]); + widest_width = std::max(widest_width, GetStringBoundingBox(STR_COMPANY_LEAGUE_COMPANY_NAME).width); + } + + this->text_width = widest_width + WidgetDimensions::scaled.hsep_indent * 3; // Keep some extra spacing + + size->width = WidgetDimensions::scaled.framerect.Horizontal() + this->ordinal_width + this->icon.width + this->text_width + WidgetDimensions::scaled.hsep_wide; + size->height = this->line_height * MAX_COMPANIES + WidgetDimensions::scaled.framerect.Vertical(); + } + + void OnGameTick() override + { + if (this->companies.NeedResort()) { + this->SetDirty(); + } + } + + /** + * Some data on this window has become invalid. + * @param data Information about the changed data. + * @param gui_scope Whether the call is done from GUI scope. You may not do everything when not in GUI scope. See #InvalidateWindowData() for details. + */ + 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->companies.ForceRebuild(); + } else { + this->companies.ForceResort(); + } + } +}; + +static const NWidgetPart _nested_performance_league_widgets[] = { + NWidget(NWID_HORIZONTAL), + NWidget(WWT_CLOSEBOX, COLOUR_BROWN), + NWidget(WWT_CAPTION, COLOUR_BROWN), SetDataTip(STR_COMPANY_LEAGUE_TABLE_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), + NWidget(WWT_SHADEBOX, COLOUR_BROWN), + NWidget(WWT_STICKYBOX, COLOUR_BROWN), + EndContainer(), + NWidget(WWT_PANEL, COLOUR_BROWN, WID_PLT_BACKGROUND), SetMinimalSize(400, 0), SetMinimalTextLines(15, WidgetDimensions::unscaled.framerect.Vertical()), +}; + +static WindowDesc _performance_league_desc( + WDP_AUTO, "league", 0, 0, + WC_COMPANY_LEAGUE, WC_NONE, + 0, + _nested_performance_league_widgets, lengthof(_nested_performance_league_widgets) +); + +void ShowPerformanceLeagueTable() +{ + AllocateWindowDescFront(&_performance_league_desc, 0); +} + +static void HandleLinkClick(Link link) +{ + TileIndex xy; + switch (link.type) { + case LT_NONE: return; + + case LT_TILE: + if (!IsValidTile(link.target)) return; + xy = link.target; + break; + + case LT_INDUSTRY: + if (!Industry::IsValidID(link.target)) return; + xy = Industry::Get(link.target)->location.tile; + break; + + case LT_TOWN: + if (!Town::IsValidID(link.target)) return; + xy = Town::Get(link.target)->xy; + break; + + case LT_COMPANY: + ShowCompany((CompanyID)link.target); + return; + + case LT_STORY_PAGE: { + if (!StoryPage::IsValidID(link.target)) return; + CompanyID story_company = StoryPage::Get(link.target)->company; + ShowStoryBook(story_company, link.target); + return; + } + + default: NOT_REACHED(); + } + + if (_ctrl_pressed) { + ShowExtraViewportWindow(xy); + } else { + ScrollMainWindowToTile(xy); + } +} + + +class ScriptLeagueWindow : public Window { +private: + LeagueTableID table; + std::vector> rows; + uint rank_width; ///< The width of the rank ordinal + uint text_width; ///< The width of the actual text + uint score_width; ///< The width of the score text + uint header_height; ///< Height of the table header + int line_height; ///< Height of the text lines + Dimension icon_size; ///< Dimenion of the company icon. + std::string title; + + /** + * Rebuild the company league list + */ + void BuildTable() + { + this->rows.clear(); + this->title = std::string{}; + auto lt = LeagueTable::GetIfValid(this->table); + if (lt == nullptr) return; + + /* We store title in the window class so we can safely reference the string later */ + this->title = lt->title; + + std::vector elements; + for(LeagueTableElement *lte : LeagueTableElement::Iterate()) { + if (lte->table == this->table) { + elements.push_back(lte); + } + } + std::sort(elements.begin(), elements.end(), [](auto a, auto b) { return a->rating > b->rating; }); + + /* Calculate rank, companies with the same rating share the ranks */ + uint rank = 0; + for (uint i = 0; i != elements.size(); i++) { + auto *lte = elements[i]; + if (i > 0 && elements[i - 1]->rating != lte->rating) rank = i; + this->rows.emplace_back(std::make_pair(rank, lte)); + } + } + +public: + ScriptLeagueWindow(WindowDesc *desc, LeagueTableID table) : Window(desc) + { + this->table = table; + this->BuildTable(); + this->InitNested(table); + } + + void SetStringParameters(int widget) const override + { + if (widget != WID_SLT_CAPTION) return; + SetDParamStr(0, this->title); + } + + void OnPaint() override + { + this->DrawWidgets(); + } + + void DrawWidget(const Rect &r, int widget) const override + { + if (widget != WID_SLT_BACKGROUND) return; + + auto lt = LeagueTable::GetIfValid(this->table); + if (lt == nullptr) return; + + Rect ir = r.Shrink(WidgetDimensions::scaled.framerect); + + if (!lt->header.empty()) { + SetDParamStr(0, lt->header); + ir.top = DrawStringMultiLine(ir.left, ir.right, ir.top, UINT16_MAX, STR_JUST_RAW_STRING, TC_BLACK) + WidgetDimensions::scaled.vsep_wide; + } + + int icon_y_offset = (this->line_height - this->icon_size.height) / 2; + int text_y_offset = (this->line_height - FONT_HEIGHT_NORMAL) / 2; + + /* Calculate positions.of the columns */ + bool rtl = _current_text_dir == TD_RTL; + int spacer = WidgetDimensions::scaled.hsep_wide; + Rect rank_rect = ir.WithWidth(this->rank_width, rtl); + Rect icon_rect = ir.Indent(this->rank_width + (rtl ? 0 : spacer), rtl).WithWidth(this->icon_size.width, rtl); + Rect text_rect = ir.Indent(this->rank_width + spacer + this->icon_size.width, rtl).WithWidth(this->text_width, rtl); + Rect score_rect = ir.Indent(this->rank_width + 2 * spacer + this->icon_size.width + this->text_width, rtl).WithWidth(this->score_width, rtl); + + for (auto [rank, lte] : this->rows) { + DrawString(rank_rect.left, rank_rect.right, ir.top + text_y_offset, rank + STR_ORDINAL_NUMBER_1ST, rank == 0 ? TC_WHITE : TC_YELLOW); + if (this->icon_size.width > 0 && lte->company != INVALID_COMPANY) DrawCompanyIcon(lte->company, icon_rect.left, ir.top + icon_y_offset); + SetDParamStr(0, lte->text); + DrawString(text_rect.left, text_rect.right, ir.top + text_y_offset, STR_JUST_RAW_STRING, TC_BLACK); + SetDParamStr(0, lte->score); + DrawString(score_rect.left, score_rect.right, ir.top + text_y_offset, STR_JUST_RAW_STRING, TC_BLACK, SA_RIGHT); + ir.top += this->line_height; + } + + if (!lt->footer.empty()) { + ir.top += WidgetDimensions::scaled.vsep_wide; + SetDParamStr(0, lt->footer); + ir.top = DrawStringMultiLine(ir.left, ir.right, ir.top, UINT16_MAX, STR_JUST_RAW_STRING, TC_BLACK); + } + } + + void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override + { + if (widget != WID_SLT_BACKGROUND) return; + + auto lt = LeagueTable::GetIfValid(this->table); + if (lt == nullptr) return; + + this->icon_size = GetSpriteSize(SPR_COMPANY_ICON); + this->line_height = std::max(this->icon_size.height + WidgetDimensions::scaled.fullbevel.Vertical(), FONT_HEIGHT_NORMAL); + + /* Calculate maximum width of every column */ + this->rank_width = this->text_width = this->score_width = 0; + bool show_icon_column = false; + for (auto [rank, lte] : this->rows) { + this->rank_width = std::max(this->rank_width, GetStringBoundingBox(STR_ORDINAL_NUMBER_1ST + rank).width); + SetDParamStr(0, lte->text); + this->text_width = std::max(this->text_width, GetStringBoundingBox(STR_JUST_RAW_STRING).width); + SetDParamStr(0, lte->score); + this->score_width = std::max(this->score_width, GetStringBoundingBox(STR_JUST_RAW_STRING).width); + if (lte->company != INVALID_COMPANY) show_icon_column = true; + } + + if (!show_icon_column) this->icon_size.width = 0; + else this->icon_size.width += WidgetDimensions::scaled.hsep_wide; + + size->width = this->rank_width + this->icon_size.width + this->text_width + this->score_width + WidgetDimensions::scaled.framerect.Horizontal() + WidgetDimensions::scaled.hsep_wide * 2; + size->height = this->line_height * std::max(3u, (unsigned)this->rows.size()) + WidgetDimensions::scaled.framerect.Vertical(); + + if (!lt->header.empty()) { + SetDParamStr(0, lt->header); + this->header_height = GetStringHeight(STR_JUST_RAW_STRING, size->width - WidgetDimensions::scaled.framerect.Horizontal()) + WidgetDimensions::scaled.vsep_wide; + size->height += header_height; + } else this->header_height = 0; + + if (!lt->footer.empty()) { + SetDParamStr(0, lt->footer); + size->height += GetStringHeight(STR_JUST_RAW_STRING, size->width - WidgetDimensions::scaled.framerect.Horizontal()) + WidgetDimensions::scaled.vsep_wide; + } + } + + void OnClick(Point pt, int widget, int click_count) override + { + if (widget != WID_SLT_BACKGROUND) return; + + auto *wid = this->GetWidget(WID_SLT_BACKGROUND); + int index = (pt.y - WidgetDimensions::scaled.framerect.top - wid->pos_y - this->header_height) / this->line_height; + if (index >= 0 && (uint)index < this->rows.size()) { + auto lte = this->rows[index].second; + HandleLinkClick(lte->link); + } + } + + /** + * Some data on this window has become invalid. + * @param data Information about the changed data. + * @param gui_scope Whether the call is done from GUI scope. You may not do everything when not in GUI scope. See #InvalidateWindowData() for details. + */ + void OnInvalidateData(int data = 0, bool gui_scope = true) override + { + this->BuildTable(); + this->ReInit(); + } +}; + +static const NWidgetPart _nested_script_league_widgets[] = { + NWidget(NWID_HORIZONTAL), + NWidget(WWT_CLOSEBOX, COLOUR_BROWN), + NWidget(WWT_CAPTION, COLOUR_BROWN, WID_SLT_CAPTION), SetDataTip(STR_BLACK_RAW_STRING, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), + NWidget(WWT_SHADEBOX, COLOUR_BROWN), + NWidget(WWT_STICKYBOX, COLOUR_BROWN), + EndContainer(), + NWidget(WWT_PANEL, COLOUR_BROWN, WID_SLT_BACKGROUND), SetMinimalSize(400, 0), SetMinimalTextLines(15, WidgetDimensions::scaled.framerect.Vertical()), +}; + +static WindowDesc _script_league_desc( + WDP_AUTO, "league", 0, 0, + WC_COMPANY_LEAGUE, WC_NONE, + 0, + _nested_script_league_widgets, lengthof(_nested_script_league_widgets) +); + +void ShowScriptLeagueTable(LeagueTableID table) +{ + if (!LeagueTable::IsValidID(table)) return; + AllocateWindowDescFront(&_script_league_desc, table); +} + +void ShowFirstLeagueTable() +{ + auto it = LeagueTable::Iterate(); + if (!it.empty()) { + ShowScriptLeagueTable((*it.begin())->index); + } else { + ShowPerformanceLeagueTable(); + } +} diff --git a/src/league_gui.h b/src/league_gui.h new file mode 100644 index 0000000000..602979f1f6 --- /dev/null +++ b/src/league_gui.h @@ -0,0 +1,19 @@ +/* + * 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 league_gui.h League table GUI functions. */ + +#ifndef LEAGUE_GUI_H +#define LEAGUE_GUI_H + +#include "league_type.h" + +void ShowPerformanceLeagueTable(); +void ShowScriptLeagueTable(LeagueTableID table); +void ShowFirstLeagueTable(); + +#endif /* LEAGUE_GUI_H */ diff --git a/src/league_type.h b/src/league_type.h new file mode 100644 index 0000000000..3344bc206e --- /dev/null +++ b/src/league_type.h @@ -0,0 +1,40 @@ +/* + * 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 league_type.h basic types related to league tables */ + +#ifndef LEAGUE_TYPE_H +#define LEAGUE_TYPE_H + +/** Types of the possible link targets. */ +enum LinkType : byte { + LT_NONE = 0, ///< No link + LT_TILE = 1, ///< Link a tile + LT_INDUSTRY = 2, ///< Link an industry + LT_TOWN = 3, ///< Link a town + LT_COMPANY = 4, ///< Link a company + LT_STORY_PAGE = 5, ///< Link a story page +}; + +typedef uint32 LinkTargetID; ///< Contains either tile, industry ID, town ID, story page ID or company ID + +struct Link { + LinkType type; + LinkTargetID target; + Link(LinkType type, LinkTargetID target): type{type}, target{target} {} + Link(): Link(LT_NONE, 0) {} +}; + +typedef uint8 LeagueTableID; ///< ID of a league table +struct LeagueTable; +static const LeagueTableID INVALID_LEAGUE_TABLE = 0xFF; ///< Invalid/unknown index of LeagueTable + +typedef uint16 LeagueTableElementID; ///< ID of a league table element +struct LeagueTableElement; +static const LeagueTableElementID INVALID_LEAGUE_TABLE_ELEMENT = 0xFFFF; ///< Invalid/unknown index of LeagueTableElement + +#endif /* LEAGUE_TYPE_H */ diff --git a/src/linkgraph/linkgraph_gui.cpp b/src/linkgraph/linkgraph_gui.cpp index c32c5d395a..8752894b04 100644 --- a/src/linkgraph/linkgraph_gui.cpp +++ b/src/linkgraph/linkgraph_gui.cpp @@ -379,16 +379,20 @@ bool LinkGraphOverlay::ShowTooltip(Point pt, TooltipCloseCondition close_cond) char *buf_end = buf; buf[0] = 0; /* Fill buf with more information if this is a bidirectional link. */ + uint32 back_time = 0; auto k = this->cached_links[j->first].find(i->first); - const auto &back = k->second; - if (k != this->cached_links[j->first].end() && back.Usage() > 0) { - SetDParam(0, back.cargo); - SetDParam(1, back.Usage()); - SetDParam(2, back.Usage() * 100 / (back.capacity + 1)); - buf_end = GetString(buf, STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION, lastof(buf)); + if (k != this->cached_links[j->first].end()) { + const auto &back = k->second; + back_time = back.time; + if (back.Usage() > 0) { + SetDParam(0, back.cargo); + SetDParam(1, back.Usage()); + SetDParam(2, back.Usage() * 100 / (back.capacity + 1)); + buf_end = GetString(buf, STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION, lastof(buf)); + } } /* Add information about the travel time if known. */ - const auto time = link.time ? back.time ? ((link.time + back.time) / 2) : link.time : back.time; + const auto time = link.time ? back_time ? ((link.time + back_time) / 2) : link.time : back_time; if (time > 0) { SetDParam(0, time); buf_end = GetString(buf_end, STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION, lastof(buf)); @@ -505,13 +509,11 @@ static const NWidgetPart _nested_linkgraph_legend_widgets[] = { NWidget(WWT_STICKYBOX, COLOUR_DARK_GREEN), EndContainer(), NWidget(WWT_PANEL, COLOUR_DARK_GREEN), - NWidget(NWID_HORIZONTAL), + NWidget(NWID_HORIZONTAL), SetPadding(WidgetDimensions::unscaled.framerect), SetPIP(0, WidgetDimensions::unscaled.framerect.Horizontal(), 0), NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_LGL_SATURATION), - SetPadding(WD_FRAMERECT_TOP, 0, WD_FRAMERECT_BOTTOM, WD_CAPTIONTEXT_LEFT), NWidgetFunction(MakeSaturationLegendLinkGraphGUI), EndContainer(), NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_LGL_COMPANIES), - SetPadding(WD_FRAMERECT_TOP, 0, WD_FRAMERECT_BOTTOM, WD_CAPTIONTEXT_LEFT), NWidget(NWID_VERTICAL, NC_EQUALSIZE), NWidgetFunction(MakeCompanyButtonRowsLinkGraphGUI), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_LGL_COMPANIES_ALL), SetDataTip(STR_LINKGRAPH_LEGEND_ALL, STR_NULL), @@ -519,7 +521,6 @@ static const NWidgetPart _nested_linkgraph_legend_widgets[] = { EndContainer(), EndContainer(), NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_LGL_CARGOES), - SetPadding(WD_FRAMERECT_TOP, WD_FRAMERECT_RIGHT, WD_FRAMERECT_BOTTOM, WD_CAPTIONTEXT_LEFT), NWidget(NWID_VERTICAL, NC_EQUALSIZE), NWidgetFunction(MakeCargoesLegendLinkGraphGUI), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_LGL_CARGOES_ALL), SetDataTip(STR_LINKGRAPH_LEGEND_ALL, STR_NULL), @@ -588,8 +589,8 @@ void LinkGraphLegendWindow::UpdateWidgetSize(int widget, Dimension *size, const } if (str != STR_NULL) { Dimension dim = GetStringBoundingBox(str); - dim.width += WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; - dim.height += WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; + dim.width += padding.width; + dim.height += padding.height; *size = maxdim(*size, dim); } } @@ -597,8 +598,8 @@ void LinkGraphLegendWindow::UpdateWidgetSize(int widget, Dimension *size, const CargoSpec *cargo = CargoSpec::Get(widget - WID_LGL_CARGO_FIRST); if (cargo->IsValid()) { Dimension dim = GetStringBoundingBox(cargo->abbrev); - dim.width += WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; - dim.height += WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; + dim.width += padding.width; + dim.height += padding.height; *size = maxdim(*size, dim); } } @@ -606,15 +607,17 @@ void LinkGraphLegendWindow::UpdateWidgetSize(int widget, Dimension *size, const void LinkGraphLegendWindow::DrawWidget(const Rect &r, int widget) const { + Rect br = r.Shrink(WidgetDimensions::scaled.bevel); + if (this->IsWidgetLowered(widget)) br = br.Translate(WidgetDimensions::scaled.pressed, WidgetDimensions::scaled.pressed); if (IsInsideMM(widget, WID_LGL_COMPANY_FIRST, WID_LGL_COMPANY_LAST + 1)) { if (this->IsWidgetDisabled(widget)) return; CompanyID cid = (CompanyID)(widget - WID_LGL_COMPANY_FIRST); Dimension sprite_size = GetSpriteSize(SPR_COMPANY_ICON); - DrawCompanyIcon(cid, (r.left + r.right + 1 - sprite_size.width) / 2, (r.top + r.bottom + 1 - sprite_size.height) / 2); + DrawCompanyIcon(cid, CenterBounds(br.left, br.right, sprite_size.width), CenterBounds(br.top, br.bottom, sprite_size.height)); } if (IsInsideMM(widget, WID_LGL_SATURATION_FIRST, WID_LGL_SATURATION_LAST + 1)) { uint8 colour = LinkGraphOverlay::LINK_COLOURS[_settings_client.gui.linkgraph_colours][widget - WID_LGL_SATURATION_FIRST]; - GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, colour); + GfxFillRect(br, colour); StringID str = STR_NULL; if (widget == WID_LGL_SATURATION_FIRST) { str = STR_LINKGRAPH_LEGEND_UNUSED; @@ -624,14 +627,14 @@ void LinkGraphLegendWindow::DrawWidget(const Rect &r, int widget) const str = STR_LINKGRAPH_LEGEND_SATURATED; } if (str != STR_NULL) { - DrawString(r.left, r.right, (r.top + r.bottom + 1 - FONT_HEIGHT_SMALL) / 2, str, GetContrastColour(colour) | TC_FORCED, SA_HOR_CENTER); + DrawString(br.left, br.right, CenterBounds(br.top, br.bottom, FONT_HEIGHT_SMALL), str, GetContrastColour(colour) | TC_FORCED, SA_HOR_CENTER); } } if (IsInsideMM(widget, WID_LGL_CARGO_FIRST, WID_LGL_CARGO_LAST + 1)) { if (this->IsWidgetDisabled(widget)) return; CargoSpec *cargo = CargoSpec::Get(widget - WID_LGL_CARGO_FIRST); - GfxFillRect(r.left + 2, r.top + 2, r.right - 2, r.bottom - 2, cargo->legend_colour); - DrawString(r.left, r.right, (r.top + r.bottom + 1 - FONT_HEIGHT_SMALL) / 2, cargo->abbrev, GetContrastColour(cargo->legend_colour, 73), SA_HOR_CENTER); + GfxFillRect(br, cargo->legend_colour); + DrawString(br.left, br.right, CenterBounds(br.top, br.bottom, FONT_HEIGHT_SMALL), cargo->abbrev, GetContrastColour(cargo->legend_colour, 73), SA_HOR_CENTER); } } diff --git a/src/map_type.h b/src/map_type.h index ba5af450a4..89012d6753 100644 --- a/src/map_type.h +++ b/src/map_type.h @@ -60,10 +60,10 @@ struct TileIndexDiffC { }; /** Minimal and maximal map width and height */ -static const uint MIN_MAP_SIZE_BITS = 6; ///< Minimal size of map is equal to 2 ^ MIN_MAP_SIZE_BITS -static const uint MAX_MAP_SIZE_BITS = 12; ///< Maximal size of map is equal to 2 ^ MAX_MAP_SIZE_BITS -static const uint MIN_MAP_SIZE = 1 << MIN_MAP_SIZE_BITS; ///< Minimal map size = 64 -static const uint MAX_MAP_SIZE = 1 << MAX_MAP_SIZE_BITS; ///< Maximal map size = 4096 +static const uint MIN_MAP_SIZE_BITS = 6; ///< Minimal size of map is equal to 2 ^ MIN_MAP_SIZE_BITS +static const uint MAX_MAP_SIZE_BITS = 12; ///< Maximal size of map is equal to 2 ^ MAX_MAP_SIZE_BITS +static const uint MIN_MAP_SIZE = 1U << MIN_MAP_SIZE_BITS; ///< Minimal map size = 64 +static const uint MAX_MAP_SIZE = 1U << MAX_MAP_SIZE_BITS; ///< Maximal map size = 4096 /** * Approximation of the length of a straight track, relative to a diagonal diff --git a/src/misc/lrucache.hpp b/src/misc/lrucache.hpp index f6cac49bfa..b0e950b2fc 100644 --- a/src/misc/lrucache.hpp +++ b/src/misc/lrucache.hpp @@ -1,5 +1,3 @@ -/* $Id$ */ - /* * This file is part of OpenTTD. * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. diff --git a/src/misc_gui.cpp b/src/misc_gui.cpp index 1a3ba2b05c..2641f7227e 100644 --- a/src/misc_gui.cpp +++ b/src/misc_gui.cpp @@ -75,16 +75,15 @@ public: { if (widget != WID_LI_BACKGROUND) return; - uint y = r.top + WD_TEXTPANEL_TOP; + Rect ir = r.Shrink(WidgetDimensions::scaled.frametext); for (size_t i = 0; i < this->landinfo_data.size(); i++) { - DrawString(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, y, this->landinfo_data[i], i == 0 ? TC_LIGHT_BLUE : TC_FROMSTRING, SA_HOR_CENTER); - y += FONT_HEIGHT_NORMAL + WD_PAR_VSEP_NORMAL; - if (i == 0) y += 4; + DrawString(ir, this->landinfo_data[i], i == 0 ? TC_LIGHT_BLUE : TC_FROMSTRING, SA_HOR_CENTER); + ir.top += FONT_HEIGHT_NORMAL + (i == 0 ? WidgetDimensions::scaled.vsep_wide : WidgetDimensions::scaled.vsep_normal); } if (!this->cargo_acceptance.empty()) { SetDParamStr(0, this->cargo_acceptance); - DrawStringMultiLine(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, y, r.bottom - WD_TEXTPANEL_BOTTOM, STR_JUST_RAW_STRING, TC_FROMSTRING, SA_CENTER); + DrawStringMultiLine(ir, STR_JUST_RAW_STRING, TC_FROMSTRING, SA_CENTER); } } @@ -92,20 +91,19 @@ public: { if (widget != WID_LI_BACKGROUND) return; - size->height = WD_TEXTPANEL_TOP + WD_TEXTPANEL_BOTTOM; + size->height = WidgetDimensions::scaled.frametext.Vertical(); for (size_t i = 0; i < this->landinfo_data.size(); i++) { - uint width = GetStringBoundingBox(this->landinfo_data[i]).width + WD_FRAMETEXT_LEFT + WD_FRAMETEXT_RIGHT; + uint width = GetStringBoundingBox(this->landinfo_data[i]).width + WidgetDimensions::scaled.frametext.Horizontal(); size->width = std::max(size->width, width); - size->height += FONT_HEIGHT_NORMAL + WD_PAR_VSEP_NORMAL; - if (i == 0) size->height += 4; + size->height += FONT_HEIGHT_NORMAL + (i == 0 ? WidgetDimensions::scaled.vsep_wide : WidgetDimensions::scaled.vsep_normal); } if (!this->cargo_acceptance.empty()) { - uint width = GetStringBoundingBox(this->cargo_acceptance).width + WD_FRAMETEXT_LEFT + WD_FRAMETEXT_RIGHT; + uint width = GetStringBoundingBox(this->cargo_acceptance).width + WidgetDimensions::scaled.frametext.Horizontal(); size->width = std::max(size->width, std::min(300u, width)); SetDParamStr(0, cargo_acceptance); - size->height += GetStringHeight(STR_JUST_RAW_STRING, size->width - WD_FRAMETEXT_LEFT - WD_FRAMETEXT_RIGHT); + size->height += GetStringHeight(STR_JUST_RAW_STRING, size->width - WidgetDimensions::scaled.frametext.Horizontal()); } } @@ -419,6 +417,7 @@ static const char * const _credits[] = { u8" Peter Nelson (peter1138) - Spiritual descendant from NewGRF gods (since 0.4.5)", u8" Remko Bijker (Rubidium) - Coder and way more (since 0.4.5)", u8" Patric Stout (TrueBrain) - NoProgrammer (since 0.3), sys op", + u8" Tyler Trahan (2TallTyler) - General coding (since 13)", u8"", u8"Inactive Developers:", u8" Grzegorz Duczy\u0144ski (adf88) - General coding (1.7 - 1.8)", @@ -657,7 +656,7 @@ void HideFillingPercent(TextEffectID *te_id) } static const NWidgetPart _nested_tooltips_widgets[] = { - NWidget(WWT_PANEL, COLOUR_GREY, WID_TT_BACKGROUND), SetMinimalSize(200, 32), EndContainer(), + NWidget(WWT_EMPTY, INVALID_COLOUR, WID_TT_BACKGROUND), EndContainer(), }; static WindowDesc _tool_tips_desc( @@ -723,20 +722,20 @@ struct TooltipsWindow : public Window size->height = GetStringHeight(this->string_id, size->width); /* Increase slightly to have some space around the box. */ - size->width += 2 + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; - size->height += 2 + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; + size->width += WidgetDimensions::scaled.framerect.Horizontal() + WidgetDimensions::scaled.fullbevel.Horizontal(); + size->height += WidgetDimensions::scaled.framerect.Vertical() + WidgetDimensions::scaled.fullbevel.Vertical(); } void DrawWidget(const Rect &r, int widget) const override { /* There is only one widget. */ - GfxFillRect(r.left, r.top, r.right, r.bottom, PC_BLACK); - GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, PC_LIGHT_YELLOW); + GfxFillRect(r, PC_BLACK); + GfxFillRect(r.Shrink(WidgetDimensions::scaled.bevel), PC_LIGHT_YELLOW); for (uint arg = 0; arg < this->paramcount; arg++) { SetDParam(arg, this->params[arg]); } - DrawStringMultiLine(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, r.bottom - WD_FRAMERECT_BOTTOM, this->string_id, TC_FROMSTRING, SA_CENTER); + DrawStringMultiLine(r.Shrink(WidgetDimensions::scaled.framerect).Shrink(WidgetDimensions::scaled.fullbevel), this->string_id, TC_FROMSTRING, SA_CENTER); } void OnMouseLoop() override @@ -790,6 +789,11 @@ void QueryString::HandleEditBox(Window *w, int wid) } } +static int GetCaretWidth() +{ + return GetCharacterWidth(FS_NORMAL, '_'); +} + void QueryString::DrawEditBox(const Window *w, int wid) const { const NWidgetLeaf *wi = w->GetWidget(wid); @@ -798,26 +802,23 @@ void QueryString::DrawEditBox(const Window *w, int wid) const bool rtl = _current_text_dir == TD_RTL; Dimension sprite_size = GetSpriteSize(rtl ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT); - int clearbtn_width = sprite_size.width + WD_IMGBTN_LEFT + WD_IMGBTN_RIGHT; + int clearbtn_width = sprite_size.width + WidgetDimensions::scaled.imgbtn.Horizontal(); - int clearbtn_left = wi->pos_x + (rtl ? 0 : wi->current_x - clearbtn_width); - int clearbtn_right = wi->pos_x + (rtl ? clearbtn_width : wi->current_x) - 1; - int left = wi->pos_x + (rtl ? clearbtn_width : 0); - int right = wi->pos_x + (rtl ? wi->current_x : wi->current_x - clearbtn_width) - 1; + Rect r = wi->GetCurrentRect(); + Rect cr = r.WithWidth(clearbtn_width, !rtl); + Rect fr = r.Indent(clearbtn_width, !rtl); - int top = wi->pos_y; - int bottom = wi->pos_y + wi->current_y - 1; + DrawFrameRect(cr, wi->colour, wi->IsLowered() ? FR_LOWERED : FR_NONE); + DrawSprite(rtl ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT, PAL_NONE, cr.left + WidgetDimensions::scaled.imgbtn.left + (wi->IsLowered() ? 1 : 0), CenterBounds(r.top, r.bottom, sprite_size.height) + (wi->IsLowered() ? 1 : 0)); + if (this->text.bytes == 1) GfxFillRect(cr.Shrink(WidgetDimensions::scaled.bevel), _colour_gradient[wi->colour & 0xF][2], FILLRECT_CHECKER); - DrawFrameRect(clearbtn_left, top, clearbtn_right, bottom, wi->colour, wi->IsLowered() ? FR_LOWERED : FR_NONE); - DrawSprite(rtl ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT, PAL_NONE, clearbtn_left + WD_IMGBTN_LEFT + (wi->IsLowered() ? 1 : 0), (top + bottom - sprite_size.height) / 2 + (wi->IsLowered() ? 1 : 0)); - if (this->text.bytes == 1) GfxFillRect(clearbtn_left + 1, top + 1, clearbtn_right - 1, bottom - 1, _colour_gradient[wi->colour & 0xF][2], FILLRECT_CHECKER); - - DrawFrameRect(left, top, right, bottom, wi->colour, FR_LOWERED | FR_DARKENED); - GfxFillRect(left + 1, top + 1, right - 1, bottom - 1, PC_BLACK); + DrawFrameRect(fr, wi->colour, FR_LOWERED | FR_DARKENED); + GfxFillRect(fr.Shrink(WidgetDimensions::scaled.bevel), PC_BLACK); + fr = fr.Shrink(WidgetDimensions::scaled.framerect); /* Limit the drawing of the string inside the widget boundaries */ DrawPixelInfo dpi; - if (!FillDrawPixelInfo(&dpi, left + WD_FRAMERECT_LEFT, top + WD_FRAMERECT_TOP, right - left - WD_FRAMERECT_RIGHT, bottom - top - WD_FRAMERECT_BOTTOM)) return; + if (!FillDrawPixelInfo(&dpi, fr.left, fr.top, fr.Width(), fr.Height())) return; DrawPixelInfo *old_dpi = _cur_dpi; _cur_dpi = &dpi; @@ -825,12 +826,12 @@ void QueryString::DrawEditBox(const Window *w, int wid) const /* We will take the current widget length as maximum width, with a small * space reserved at the end for the caret to show */ const Textbuf *tb = &this->text; - int delta = std::min(0, (right - left) - tb->pixels - 10); + int delta = std::min(0, (fr.right - fr.left) - tb->pixels - GetCaretWidth()); if (tb->caretxoffs + delta < 0) delta = -tb->caretxoffs; /* If we have a marked area, draw a background highlight. */ - if (tb->marklength != 0) GfxFillRect(delta + tb->markxoffs, 0, delta + tb->markxoffs + tb->marklength - 1, bottom - top, PC_GREY); + if (tb->marklength != 0) GfxFillRect(delta + tb->markxoffs, 0, delta + tb->markxoffs + tb->marklength - 1, fr.bottom - fr.top, PC_GREY); DrawString(delta, tb->pixels, 0, tb->buf, TC_YELLOW); bool focussed = w->IsWidgetGloballyFocused(wid) || IsOSKOpenedFor(w, wid); @@ -856,17 +857,16 @@ Point QueryString::GetCaretPosition(const Window *w, int wid) const bool rtl = _current_text_dir == TD_RTL; Dimension sprite_size = GetSpriteSize(rtl ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT); - int clearbtn_width = sprite_size.width + WD_IMGBTN_LEFT + WD_IMGBTN_RIGHT; + int clearbtn_width = sprite_size.width + WidgetDimensions::scaled.imgbtn.Horizontal(); - int left = wi->pos_x + (rtl ? clearbtn_width : 0); - int right = wi->pos_x + (rtl ? wi->current_x : wi->current_x - clearbtn_width) - 1; + Rect r = wi->GetCurrentRect().Indent(clearbtn_width, !rtl).Shrink(WidgetDimensions::scaled.framerect); /* Clamp caret position to be inside out current width. */ const Textbuf *tb = &this->text; - int delta = std::min(0, (right - left) - tb->pixels - 10); + int delta = std::min(0, (r.right - r.left) - tb->pixels - GetCaretWidth()); if (tb->caretxoffs + delta < 0) delta = -tb->caretxoffs; - Point pt = {left + WD_FRAMERECT_LEFT + tb->caretxoffs + delta, (int)wi->pos_y + WD_FRAMERECT_TOP}; + Point pt = {r.left + tb->caretxoffs + delta, r.top}; return pt; } @@ -886,26 +886,20 @@ Rect QueryString::GetBoundingRect(const Window *w, int wid, const char *from, co bool rtl = _current_text_dir == TD_RTL; Dimension sprite_size = GetSpriteSize(rtl ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT); - int clearbtn_width = sprite_size.width + WD_IMGBTN_LEFT + WD_IMGBTN_RIGHT; + int clearbtn_width = sprite_size.width + WidgetDimensions::scaled.imgbtn.Horizontal(); - int left = wi->pos_x + (rtl ? clearbtn_width : 0); - int right = wi->pos_x + (rtl ? wi->current_x : wi->current_x - clearbtn_width) - 1; - - int top = wi->pos_y + WD_FRAMERECT_TOP; - int bottom = wi->pos_y + wi->current_y - 1 - WD_FRAMERECT_BOTTOM; + Rect r = wi->GetCurrentRect().Indent(clearbtn_width, !rtl).Shrink(WidgetDimensions::scaled.framerect); /* Clamp caret position to be inside our current width. */ const Textbuf *tb = &this->text; - int delta = std::min(0, (right - left) - tb->pixels - 10); + int delta = std::min(0, r.Width() - tb->pixels - GetCaretWidth()); if (tb->caretxoffs + delta < 0) delta = -tb->caretxoffs; /* Get location of first and last character. */ Point p1 = GetCharPosInString(tb->buf, from, FS_NORMAL); Point p2 = from != to ? GetCharPosInString(tb->buf, to, FS_NORMAL) : p1; - Rect r = { Clamp(left + p1.x + delta + WD_FRAMERECT_LEFT, left, right), top, Clamp(left + p2.x + delta + WD_FRAMERECT_LEFT, left, right - WD_FRAMERECT_RIGHT), bottom }; - - return r; + return { Clamp(r.left + p1.x + delta, r.left, r.right), r.top, Clamp(r.left + p2.x + delta, r.left, r.right), r.bottom }; } /** @@ -923,22 +917,18 @@ const char *QueryString::GetCharAtPosition(const Window *w, int wid, const Point bool rtl = _current_text_dir == TD_RTL; Dimension sprite_size = GetSpriteSize(rtl ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT); - int clearbtn_width = sprite_size.width + WD_IMGBTN_LEFT + WD_IMGBTN_RIGHT; + int clearbtn_width = sprite_size.width + WidgetDimensions::scaled.imgbtn.Horizontal(); - int left = wi->pos_x + (rtl ? clearbtn_width : 0); - int right = wi->pos_x + (rtl ? wi->current_x : wi->current_x - clearbtn_width) - 1; + Rect r = wi->GetCurrentRect().Indent(clearbtn_width, !rtl).Shrink(WidgetDimensions::scaled.framerect); - int top = wi->pos_y + WD_FRAMERECT_TOP; - int bottom = wi->pos_y + wi->current_y - 1 - WD_FRAMERECT_BOTTOM; - - if (!IsInsideMM(pt.y, top, bottom)) return nullptr; + if (!IsInsideMM(pt.y, r.top, r.bottom)) return nullptr; /* Clamp caret position to be inside our current width. */ const Textbuf *tb = &this->text; - int delta = std::min(0, (right - left) - tb->pixels - 10); + int delta = std::min(0, r.Width() - tb->pixels - GetCaretWidth()); if (tb->caretxoffs + delta < 0) delta = -tb->caretxoffs; - return ::GetCharAtPosition(tb->buf, pt.x - delta - left); + return ::GetCharAtPosition(tb->buf, pt.x - delta - r.left); } void QueryString::ClickEditBox(Window *w, Point pt, int wid, int click_count, bool focus_changed) @@ -950,9 +940,9 @@ void QueryString::ClickEditBox(Window *w, Point pt, int wid, int click_count, bo bool rtl = _current_text_dir == TD_RTL; int clearbtn_width = GetSpriteSize(rtl ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT).width; - int clearbtn_left = wi->pos_x + (rtl ? 0 : wi->current_x - clearbtn_width); + Rect cr = wi->GetCurrentRect().WithWidth(clearbtn_width, !rtl); - if (IsInsideBS(pt.x, clearbtn_left, clearbtn_width)) { + if (IsInsideMM(pt.x, cr.left, cr.right)) { if (this->text.bytes > 1) { this->text.DeleteAll(); w->HandleButtonClick(wid); @@ -1012,9 +1002,9 @@ struct QueryStringWindow : public Window { if (this->flags & QSF_PASSWORD) { assert(this->nested_root->smallest_x > 0); - this->warning_size.width = this->nested_root->current_x - (WD_FRAMETEXT_LEFT + WD_FRAMETEXT_RIGHT + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT); + this->warning_size.width = this->nested_root->current_x - WidgetDimensions::scaled.frametext.Horizontal() - WidgetDimensions::scaled.framerect.Horizontal(); this->warning_size.height = GetStringHeight(STR_WARNING_PASSWORD_SECURITY, this->warning_size.width); - this->warning_size.height += WD_FRAMETEXT_TOP + WD_FRAMETEXT_BOTTOM + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; + this->warning_size.height += WidgetDimensions::scaled.frametext.Vertical() + WidgetDimensions::scaled.framerect.Vertical(); } else { this->warning_size = Dimension{ 0, 0 }; } @@ -1041,8 +1031,7 @@ struct QueryStringWindow : public Window if (widget != WID_QS_WARNING) return; if (this->flags & QSF_PASSWORD) { - DrawStringMultiLine(r.left + WD_FRAMERECT_LEFT + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT - WD_FRAMERECT_RIGHT, - r.top + WD_FRAMERECT_TOP + WD_FRAMETEXT_TOP, r.bottom - WD_FRAMERECT_BOTTOM - WD_FRAMETEXT_BOTTOM, + DrawStringMultiLine(r.Shrink(WidgetDimensions::scaled.framerect).Shrink(WidgetDimensions::scaled.frametext), STR_WARNING_PASSWORD_SECURITY, TC_FROMSTRING, SA_CENTER); } } @@ -1185,8 +1174,8 @@ struct QueryWindow : public Window { if (widget != WID_Q_TEXT) return; Dimension d = GetStringMultiLineBoundingBox(this->message, *size); - d.width += WD_FRAMETEXT_LEFT + WD_FRAMETEXT_RIGHT; - d.height += WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; + d.width += WidgetDimensions::scaled.frametext.Horizontal(); + d.height += WidgetDimensions::scaled.framerect.Vertical(); *size = d; } @@ -1194,7 +1183,7 @@ struct QueryWindow : public Window { { if (widget != WID_Q_TEXT) return; - DrawStringMultiLine(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, r.top + WD_FRAMERECT_TOP, r.bottom - WD_FRAMERECT_BOTTOM, + DrawStringMultiLine(r.Shrink(WidgetDimensions::scaled.frametext, WidgetDimensions::scaled.framerect), this->message, TC_FROMSTRING, SA_CENTER); } @@ -1246,11 +1235,13 @@ static const NWidgetPart _nested_query_widgets[] = { NWidget(WWT_CLOSEBOX, COLOUR_RED), NWidget(WWT_CAPTION, COLOUR_RED, WID_Q_CAPTION), SetDataTip(STR_JUST_STRING, STR_NULL), EndContainer(), - NWidget(WWT_PANEL, COLOUR_RED), SetPIP(8, 15, 8), - NWidget(WWT_TEXT, COLOUR_RED, WID_Q_TEXT), SetMinimalSize(200, 12), - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(20, 29, 20), - NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_Q_NO), SetMinimalSize(71, 12), SetFill(1, 1), SetDataTip(STR_QUIT_NO, STR_NULL), - NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_Q_YES), SetMinimalSize(71, 12), SetFill(1, 1), SetDataTip(STR_QUIT_YES, STR_NULL), + NWidget(WWT_PANEL, COLOUR_RED), + NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_wide, 0), SetPadding(WidgetDimensions::unscaled.modalpopup), + NWidget(WWT_TEXT, COLOUR_RED, WID_Q_TEXT), SetMinimalSize(200, 12), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(WidgetDimensions::unscaled.hsep_indent, WidgetDimensions::unscaled.hsep_indent, WidgetDimensions::unscaled.hsep_indent), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_Q_NO), SetMinimalSize(71, 12), SetFill(1, 1), SetDataTip(STR_QUIT_NO, STR_NULL), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_Q_YES), SetMinimalSize(71, 12), SetFill(1, 1), SetDataTip(STR_QUIT_YES, STR_NULL), + EndContainer(), EndContainer(), EndContainer(), }; diff --git a/src/mixer.cpp b/src/mixer.cpp index b9b20fccfd..b862353383 100644 --- a/src/mixer.cpp +++ b/src/mixer.cpp @@ -10,6 +10,7 @@ #include "stdafx.h" #include #include +#include #include "core/math_func.hpp" #include "framerate_type.h" #include "settings_type.h" @@ -18,8 +19,6 @@ #include "mixer.h" struct MixerChannel { - bool active; - /* pointer to allocated buffer memory */ int8 *memory; @@ -36,11 +35,13 @@ struct MixerChannel { bool is16bit; }; +static std::atomic _active_channels; static MixerChannel _channels[8]; static uint32 _play_rate = 11025; static uint32 _max_size = UINT_MAX; static MxStreamCallback _music_stream = nullptr; static std::mutex _music_stream_mutex; +static std::atomic _effect_vol; /** * The theoretical maximum volume for a single sound sample. Multiple sound @@ -135,9 +136,9 @@ static void mix_int8_to_int16(MixerChannel *sc, int16 *buffer, uint samples, uin sc->pos = b - sc->memory; } -static void MxCloseChannel(MixerChannel *mc) +static void MxCloseChannel(uint8 channel_index) { - mc->active = false; + _active_channels.fetch_and(~(1 << channel_index), std::memory_order_release); } void MxMixSamples(void *buffer, uint samples) @@ -149,8 +150,6 @@ void MxMixSamples(void *buffer, uint samples) last_samples = samples; } - MixerChannel *mc; - /* Clear the buffer */ memset(buffer, 0, sizeof(int16) * 2 * samples); @@ -164,34 +163,36 @@ void MxMixSamples(void *buffer, uint samples) * perceived difference in loudness to better match expectations. effect_vol * is expected to be in the range 0-127 hence the division by 127 * 127 to * get back into range. */ - uint8 effect_vol = (_settings_client.music.effect_vol * - _settings_client.music.effect_vol * - _settings_client.music.effect_vol) / (127 * 127); + uint8 effect_vol_setting = _effect_vol.load(std::memory_order_relaxed); + uint8 effect_vol = (effect_vol_setting * + effect_vol_setting * + effect_vol_setting) / (127 * 127); /* Mix each channel */ - for (mc = _channels; mc != endof(_channels); mc++) { - if (mc->active) { - if (mc->is16bit) { - mix_int16(mc, (int16*)buffer, samples, effect_vol); - } else { - mix_int8_to_int16(mc, (int16*)buffer, samples, effect_vol); - } - if (mc->samples_left == 0) MxCloseChannel(mc); + uint8 active = _active_channels.load(std::memory_order_acquire); + for (uint8 idx : SetBitIterator(active)) { + MixerChannel *mc = &_channels[idx]; + if (mc->is16bit) { + mix_int16(mc, (int16*)buffer, samples, effect_vol); + } else { + mix_int8_to_int16(mc, (int16*)buffer, samples, effect_vol); } + if (mc->samples_left == 0) MxCloseChannel(idx); } } MixerChannel *MxAllocateChannel() { - MixerChannel *mc; - for (mc = _channels; mc != endof(_channels); mc++) { - if (!mc->active) { - free(mc->memory); - mc->memory = nullptr; - return mc; - } - } - return nullptr; + uint8 currently_active = _active_channels.load(std::memory_order_acquire); + uint8 available = ~currently_active; + if (available == 0) return nullptr; + + uint8 channel_index = FindFirstBit(available); + + MixerChannel *mc = &_channels[channel_index]; + free(mc->memory); + mc->memory = nullptr; + return mc; } void MxSetChannelRawSrc(MixerChannel *mc, int8 *mem, size_t size, uint rate, bool is16bit) @@ -231,7 +232,8 @@ void MxSetChannelVolume(MixerChannel *mc, uint volume, float pan) void MxActivateChannel(MixerChannel *mc) { - mc->active = true; + uint8 channel_index = mc - _channels; + _active_channels.fetch_or((1 << channel_index), std::memory_order_release); } /** @@ -255,3 +257,8 @@ bool MxInitialize(uint rate) _music_stream = nullptr; /* rate may have changed, any music source is now invalid */ return true; } + +void SetEffectVolume(uint8 volume) +{ + _effect_vol.store(volume, std::memory_order_relaxed); +} diff --git a/src/mixer.h b/src/mixer.h index bd7b18a44a..51669da71c 100644 --- a/src/mixer.h +++ b/src/mixer.h @@ -30,4 +30,6 @@ void MxActivateChannel(MixerChannel*); uint32 MxSetMusicSource(MxStreamCallback music_callback); +void SetEffectVolume(uint8 volume); + #endif /* MIXER_H */ diff --git a/src/music_gui.cpp b/src/music_gui.cpp index b4a4de5196..a2bd44add7 100644 --- a/src/music_gui.cpp +++ b/src/music_gui.cpp @@ -27,6 +27,7 @@ #include "widgets/dropdown_func.h" #include "widgets/dropdown_type.h" #include "widgets/slider_func.h" +#include "mixer.h" #include "widgets/music_widget.h" @@ -521,29 +522,29 @@ struct MusicTrackSelectionWindow : public Window { { switch (widget) { case WID_MTS_LIST_LEFT: { - GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, PC_BLACK); + GfxFillRect(r.Shrink(WidgetDimensions::scaled.bevel), PC_BLACK); - int y = r.top + WD_FRAMERECT_TOP; + Rect tr = r.Shrink(WidgetDimensions::scaled.framerect); for (MusicSystem::Playlist::const_iterator song = _music.music_set.begin(); song != _music.music_set.end(); ++song) { SetDParam(0, song->tracknr); SetDParam(1, 2); SetDParamStr(2, song->songname); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_PLAYLIST_TRACK_NAME); - y += FONT_HEIGHT_SMALL; + DrawString(tr, STR_PLAYLIST_TRACK_NAME); + tr.top += FONT_HEIGHT_SMALL; } break; } case WID_MTS_LIST_RIGHT: { - GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, PC_BLACK); + GfxFillRect(r.Shrink(WidgetDimensions::scaled.bevel), PC_BLACK); - int y = r.top + WD_FRAMERECT_TOP; + Rect tr = r.Shrink(WidgetDimensions::scaled.framerect); for (MusicSystem::Playlist::const_iterator song = _music.active_playlist.begin(); song != _music.active_playlist.end(); ++song) { SetDParam(0, song->tracknr); SetDParam(1, 2); SetDParamStr(2, song->songname); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_PLAYLIST_TRACK_NAME); - y += FONT_HEIGHT_SMALL; + DrawString(tr, STR_PLAYLIST_TRACK_NAME); + tr.top += FONT_HEIGHT_SMALL; } break; } @@ -681,8 +682,8 @@ struct MusicWindow : public Window { case WID_M_TRACK_NR: { Dimension d = GetStringBoundingBox(STR_MUSIC_TRACK_NONE); - d.width += WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; - d.height += WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; + d.width += padding.width; + d.height += padding.height; *size = maxdim(*size, d); break; } @@ -693,8 +694,8 @@ struct MusicWindow : public Window { SetDParamStr(0, song->songname); d = maxdim(d, GetStringBoundingBox(STR_MUSIC_TITLE_NAME)); } - d.width += WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; - d.height += WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; + d.width += padding.width; + d.height += padding.height; *size = maxdim(*size, d); break; } @@ -711,7 +712,7 @@ struct MusicWindow : public Window { { switch (widget) { case WID_M_TRACK_NR: { - GfxFillRect(r.left + 1, r.top + 1, r.right, r.bottom, PC_BLACK); + GfxFillRect(r.Shrink(WidgetDimensions::scaled.bevel.left, WidgetDimensions::scaled.bevel.top, 0, WidgetDimensions::scaled.bevel.bottom), PC_BLACK); if (BaseMusic::GetUsedSet()->num_available == 0) { break; } @@ -721,12 +722,12 @@ struct MusicWindow : public Window { SetDParam(1, 2); str = STR_MUSIC_TRACK_DIGIT; } - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, str); + DrawString(r.Shrink(WidgetDimensions::scaled.framerect), str); break; } case WID_M_TRACK_NAME: { - GfxFillRect(r.left, r.top + 1, r.right - 1, r.bottom, PC_BLACK); + GfxFillRect(r.Shrink(0, WidgetDimensions::scaled.bevel.top, WidgetDimensions::scaled.bevel.right, WidgetDimensions::scaled.bevel.bottom), PC_BLACK); StringID str = STR_MUSIC_TITLE_NONE; MusicSystem::PlaylistEntry entry(_music.GetCurrentSong()); if (BaseMusic::GetUsedSet()->num_available == 0) { @@ -735,16 +736,16 @@ struct MusicWindow : public Window { str = STR_MUSIC_TITLE_NAME; 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); + DrawString(r.Shrink(WidgetDimensions::scaled.framerect), str, TC_FROMSTRING, SA_HOR_CENTER); break; } case WID_M_MUSIC_VOL: - DrawVolumeSliderWidget(r, _settings_client.music.music_vol); + DrawSliderWidget(r, 0, INT8_MAX, _settings_client.music.music_vol, {}); break; case WID_M_EFFECT_VOL: - DrawVolumeSliderWidget(r, _settings_client.music.effect_vol); + DrawSliderWidget(r, 0, INT8_MAX, _settings_client.music.effect_vol, {}); break; } } @@ -787,8 +788,12 @@ struct MusicWindow : public Window { case WID_M_MUSIC_VOL: case WID_M_EFFECT_VOL: { // volume sliders byte &vol = (widget == WID_M_MUSIC_VOL) ? _settings_client.music.music_vol : _settings_client.music.effect_vol; - if (ClickVolumeSliderWidget(this->GetWidget(widget)->GetCurrentRect(), pt, vol)) { - if (widget == WID_M_MUSIC_VOL) MusicDriver::GetInstance()->SetVolume(vol); + if (ClickSliderWidget(this->GetWidget(widget)->GetCurrentRect(), pt, 0, INT8_MAX, vol)) { + if (widget == WID_M_MUSIC_VOL) { + MusicDriver::GetInstance()->SetVolume(vol); + } else { + SetEffectVolume(vol); + } this->SetWidgetDirty(widget); SetWindowClassesDirty(WC_GAME_OPTIONS); } diff --git a/src/network/network_chat_gui.cpp b/src/network/network_chat_gui.cpp index cbaf4b9163..c3f232a2ab 100644 --- a/src/network/network_chat_gui.cpp +++ b/src/network/network_chat_gui.cpp @@ -17,6 +17,7 @@ #include "../window_func.h" #include "../toolbar_gui.h" #include "../core/geometry_func.hpp" +#include "../zoom_func.h" #include "network.h" #include "network_client.h" #include "network_base.h" @@ -106,7 +107,7 @@ void CDECL NetworkAddChatMessage(TextColour colour, uint duration, const std::st void NetworkReInitChatBoxSize() { _chatmsg_box.y = 3 * FONT_HEIGHT_NORMAL; - _chatmsg_box.height = MAX_CHAT_MESSAGES * (FONT_HEIGHT_NORMAL + NETWORK_CHAT_LINE_SPACING) + 4; + _chatmsg_box.height = MAX_CHAT_MESSAGES * (FONT_HEIGHT_NORMAL + ScaleGUITrad(NETWORK_CHAT_LINE_SPACING)) + ScaleGUITrad(4); _chatmessage_backup = ReallocT(_chatmessage_backup, _chatmsg_box.width * _chatmsg_box.height * BlitterFactory::GetCurrentBlitter()->GetBytesPerPixel()); } @@ -116,7 +117,7 @@ void NetworkInitChatMessage() MAX_CHAT_MESSAGES = _settings_client.gui.network_chat_box_height; _chatmsg_list.clear(); - _chatmsg_box.x = 10; + _chatmsg_box.x = ScaleGUITrad(10); _chatmsg_box.width = _settings_client.gui.network_chat_box_width_pct * _screen.width / 100; NetworkReInitChatBoxSize(); _chatmessage_visible = false; @@ -242,7 +243,7 @@ void NetworkDrawChatMessage() for (auto &cmsg : _chatmsg_list) { if (!show_all && cmsg.remove_time < now) continue; - ypos = DrawStringMultiLine(_chatmsg_box.x + 3, _chatmsg_box.x + _chatmsg_box.width - 1, top, ypos, cmsg.message, cmsg.colour, SA_LEFT | SA_BOTTOM | SA_FORCE) - NETWORK_CHAT_LINE_SPACING; + ypos = DrawStringMultiLine(_chatmsg_box.x + ScaleGUITrad(3), _chatmsg_box.x + _chatmsg_box.width - 1, top, ypos, cmsg.message, cmsg.colour, SA_LEFT | SA_BOTTOM | SA_FORCE) - NETWORK_CHAT_LINE_SPACING; if (ypos < top) break; } @@ -508,7 +509,7 @@ static const NWidgetPart _nested_chat_window_widgets[] = { NWidget(WWT_CLOSEBOX, COLOUR_GREY, WID_NC_CLOSE), NWidget(WWT_PANEL, COLOUR_GREY, WID_NC_BACKGROUND), NWidget(NWID_HORIZONTAL), - NWidget(WWT_TEXT, COLOUR_GREY, WID_NC_DESTINATION), SetMinimalSize(62, 12), SetPadding(1, 0, 1, 0), SetAlignment(SA_TOP | SA_RIGHT), SetDataTip(STR_NULL, STR_NULL), + NWidget(WWT_TEXT, COLOUR_GREY, WID_NC_DESTINATION), SetMinimalSize(62, 12), SetPadding(1, 0, 1, 0), SetAlignment(SA_VERT_CENTER | SA_RIGHT), SetDataTip(STR_NULL, STR_NULL), NWidget(WWT_EDITBOX, COLOUR_GREY, WID_NC_TEXTBOX), SetMinimalSize(100, 12), SetPadding(1, 0, 1, 0), SetResize(1, 0), SetDataTip(STR_NETWORK_CHAT_OSKTITLE, STR_NULL), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_NC_SENDBUTTON), SetMinimalSize(62, 12), SetPadding(1, 0, 1, 0), SetDataTip(STR_NETWORK_CHAT_SEND, STR_NULL), diff --git a/src/network/network_command.cpp b/src/network/network_command.cpp index d39618abf4..2285b53360 100644 --- a/src/network/network_command.cpp +++ b/src/network/network_command.cpp @@ -26,6 +26,7 @@ #include "../group_cmd.h" #include "../industry_cmd.h" #include "../landscape_cmd.h" +#include "../league_cmd.h" #include "../misc_cmd.h" #include "../news_cmd.h" #include "../object_cmd.h" @@ -149,7 +150,7 @@ constexpr UnpackNetworkCommandProc MakeUnpackNetworkCommandCallback() noexcept template constexpr UnpackDispatchT MakeUnpackNetworkCommand(std::index_sequence) noexcept { - return UnpackDispatchT{{ {MakeUnpackNetworkCommandCallback()}...}}; + return UnpackDispatchT{{ MakeUnpackNetworkCommandCallback()...}}; } template diff --git a/src/network/network_content_gui.cpp b/src/network/network_content_gui.cpp index 9903bb2644..f7a812b11d 100644 --- a/src/network/network_content_gui.cpp +++ b/src/network/network_content_gui.cpp @@ -81,14 +81,12 @@ void ShowContentTextfileWindow(TextfileType file_type, const ContentInfo *ci) /** Nested widgets for the download window. */ static const NWidgetPart _nested_network_content_download_status_window_widgets[] = { NWidget(WWT_CAPTION, COLOUR_GREY), SetDataTip(STR_CONTENT_DOWNLOAD_TITLE, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), - NWidget(WWT_PANEL, COLOUR_GREY, WID_NCDS_BACKGROUND), - NWidget(NWID_SPACER), SetMinimalSize(350, 0), SetMinimalTextLines(3, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM + 30), - NWidget(NWID_HORIZONTAL), - NWidget(NWID_SPACER), SetMinimalSize(125, 0), - NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCDS_CANCELOK), SetMinimalSize(101, 12), SetDataTip(STR_BUTTON_CANCEL, STR_NULL), - NWidget(NWID_SPACER), SetFill(1, 0), + NWidget(WWT_PANEL, COLOUR_GREY), + NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_wide, 0), SetPadding(WidgetDimensions::unscaled.modalpopup), + NWidget(WWT_EMPTY, INVALID_COLOUR, WID_NCDS_PROGRESS_BAR), SetFill(1, 0), + NWidget(WWT_EMPTY, INVALID_COLOUR, WID_NCDS_PROGRESS_TEXT), SetFill(1, 0), SetMinimalSize(350, 0), + NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCDS_CANCELOK), SetDataTip(STR_BUTTON_CANCEL, STR_NULL), SetFill(1, 0), EndContainer(), - NWidget(NWID_SPACER), SetMinimalSize(0, 4), EndContainer(), }; @@ -115,33 +113,56 @@ void BaseNetworkContentDownloadStatusWindow::Close() this->Window::Close(); } +void BaseNetworkContentDownloadStatusWindow::UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) +{ + switch (widget) { + case WID_NCDS_PROGRESS_BAR: + SetDParamMaxDigits(0, 8); + SetDParamMaxDigits(1, 8); + SetDParamMaxDigits(2, 8); + *size = GetStringBoundingBox(STR_CONTENT_DOWNLOAD_PROGRESS_SIZE); + /* We need some spacing for the 'border' */ + size->height += WidgetDimensions::scaled.frametext.Horizontal(); + size->width += WidgetDimensions::scaled.frametext.Vertical(); + break; + + case WID_NCDS_PROGRESS_TEXT: + size->height = FONT_HEIGHT_NORMAL * 2 + WidgetDimensions::scaled.vsep_normal; + break; + } +} + void BaseNetworkContentDownloadStatusWindow::DrawWidget(const Rect &r, int widget) const { - if (widget != WID_NCDS_BACKGROUND) return; + switch (widget) { + case WID_NCDS_PROGRESS_BAR: { + /* Draw the % complete with a bar and a text */ + DrawFrameRect(r, COLOUR_GREY, FR_BORDERONLY | FR_LOWERED); + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); + DrawFrameRect(ir.WithWidth((uint64)ir.Width() * this->downloaded_bytes / this->total_bytes, false), COLOUR_MAUVE, FR_NONE); + SetDParam(0, this->downloaded_bytes); + SetDParam(1, this->total_bytes); + SetDParam(2, this->downloaded_bytes * 100LL / this->total_bytes); + DrawString(ir.left, ir.right, CenterBounds(ir.top, ir.bottom, FONT_HEIGHT_NORMAL), STR_CONTENT_DOWNLOAD_PROGRESS_SIZE, TC_FROMSTRING, SA_HOR_CENTER); + break; + } - /* Draw nice progress bar :) */ - DrawFrameRect(r.left + 20, r.top + 4, r.left + 20 + (int)((this->width - 40LL) * this->downloaded_bytes / this->total_bytes), r.top + 14, COLOUR_MAUVE, FR_NONE); - - int y = r.top + 20; - SetDParam(0, this->downloaded_bytes); - SetDParam(1, this->total_bytes); - SetDParam(2, this->downloaded_bytes * 100LL / this->total_bytes); - DrawString(r.left + 2, r.right - 2, y, STR_CONTENT_DOWNLOAD_PROGRESS_SIZE, TC_FROMSTRING, SA_HOR_CENTER); - - StringID str; - if (this->downloaded_bytes == this->total_bytes) { - str = STR_CONTENT_DOWNLOAD_COMPLETE; - } else if (!this->name.empty()) { - SetDParamStr(0, this->name); - SetDParam(1, this->downloaded_files); - SetDParam(2, this->total_files); - str = STR_CONTENT_DOWNLOAD_FILE; - } else { - str = STR_CONTENT_DOWNLOAD_INITIALISE; + case WID_NCDS_PROGRESS_TEXT: { + StringID str; + if (this->downloaded_bytes == this->total_bytes) { + str = STR_CONTENT_DOWNLOAD_COMPLETE; + } else if (!this->name.empty()) { + SetDParamStr(0, this->name); + SetDParam(1, this->downloaded_files); + SetDParam(2, this->total_files); + str = STR_CONTENT_DOWNLOAD_FILE; + } else { + str = STR_CONTENT_DOWNLOAD_INITIALISE; + } + DrawStringMultiLine(r, str, TC_FROMSTRING, SA_CENTER); + break; + } } - - y += FONT_HEIGHT_NORMAL + 5; - DrawStringMultiLine(r.left + 2, r.right - 2, y, y + FONT_HEIGHT_NORMAL * 2, str, TC_FROMSTRING, SA_CENTER); } void BaseNetworkContentDownloadStatusWindow::OnDownloadProgress(const ContentInfo *ci, int bytes) @@ -524,8 +545,6 @@ public: selected(nullptr), list_pos(0) { - this->checkbox_size = maxdim(maxdim(GetSpriteSize(SPR_BOX_EMPTY), GetSpriteSize(SPR_BOX_CHECKED)), GetSpriteSize(SPR_BLOT)); - this->CreateNestedTree(); this->vscroll = this->GetScrollbar(WID_NCL_SCROLLBAR); this->FinishInitNested(WN_NETWORK_WINDOW_CONTENT_LIST); @@ -556,11 +575,16 @@ public: this->Window::Close(); } + void OnInit() override + { + this->checkbox_size = maxdim(maxdim(GetSpriteSize(SPR_BOX_EMPTY), GetSpriteSize(SPR_BOX_CHECKED)), GetSpriteSize(SPR_BLOT)); + } + void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override { switch (widget) { case WID_NCL_CHECKBOX: - size->width = this->checkbox_size.width + WD_MATRIX_RIGHT + WD_MATRIX_LEFT; + size->width = this->checkbox_size.width + padding.width; break; case WID_NCL_TYPE: { @@ -568,12 +592,12 @@ public: for (int i = CONTENT_TYPE_BEGIN; i < CONTENT_TYPE_END; i++) { d = maxdim(d, GetStringBoundingBox(STR_CONTENT_TYPE_BASE_GRAPHICS + i - CONTENT_TYPE_BASE_GRAPHICS)); } - size->width = d.width + WD_MATRIX_RIGHT + WD_MATRIX_LEFT; + size->width = d.width + padding.width; break; } case WID_NCL_MATRIX: - resize->height = std::max(this->checkbox_size.height, (uint)FONT_HEIGHT_NORMAL) + WD_MATRIX_TOP + WD_MATRIX_BOTTOM; + resize->height = std::max(this->checkbox_size.height, (uint)FONT_HEIGHT_NORMAL) + padding.height; size->height = 10 * resize->height; break; } @@ -616,17 +640,15 @@ public: */ void DrawMatrix(const Rect &r) const { - const NWidgetBase *nwi_checkbox = this->GetWidget(WID_NCL_CHECKBOX); - const NWidgetBase *nwi_name = this->GetWidget(WID_NCL_NAME); - const NWidgetBase *nwi_type = this->GetWidget(WID_NCL_TYPE); - - int line_height = std::max(this->checkbox_size.height, (uint)FONT_HEIGHT_NORMAL); + Rect checkbox = this->GetWidget(WID_NCL_CHECKBOX)->GetCurrentRect(); + Rect name = this->GetWidget(WID_NCL_NAME)->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect); + Rect type = this->GetWidget(WID_NCL_TYPE)->GetCurrentRect(); /* Fill the matrix with the information */ - int sprite_y_offset = WD_MATRIX_TOP + (line_height - this->checkbox_size.height) / 2 - 1; - int text_y_offset = WD_MATRIX_TOP + (line_height - FONT_HEIGHT_NORMAL) / 2; - uint y = r.top; + int sprite_y_offset = (this->resize.step_height - this->checkbox_size.height) / 2; + int text_y_offset = (this->resize.step_height - FONT_HEIGHT_NORMAL) / 2; + Rect mr = r.WithHeight(this->resize.step_height); auto iter = this->content.begin() + this->vscroll->GetPosition(); size_t last = this->vscroll->GetPosition() + this->vscroll->GetCapacity(); auto end = (last < this->content.size()) ? this->content.begin() + last : this->content.end(); @@ -634,7 +656,7 @@ public: for (/**/; iter != end; iter++) { const ContentInfo *ci = *iter; - if (ci == this->selected) GfxFillRect(r.left + 1, y + 1, r.right - 1, y + this->resize.step_height - 1, PC_GREY); + if (ci == this->selected) GfxFillRect(mr.Shrink(WidgetDimensions::scaled.bevel), PC_GREY); SpriteID sprite; SpriteID pal = PAL_NONE; @@ -646,13 +668,13 @@ public: case ContentInfo::DOES_NOT_EXIST: sprite = SPR_BLOT; pal = PALETTE_TO_RED; break; default: NOT_REACHED(); } - DrawSprite(sprite, pal, nwi_checkbox->pos_x + (pal == PAL_NONE ? 2 : 3), y + sprite_y_offset + (pal == PAL_NONE ? 1 : 0)); + DrawSprite(sprite, pal, checkbox.left + (sprite == SPR_BLOT ? 3 : 2), mr.top + sprite_y_offset + (sprite == SPR_BLOT ? 0 : 1)); StringID str = STR_CONTENT_TYPE_BASE_GRAPHICS + ci->type - CONTENT_TYPE_BASE_GRAPHICS; - DrawString(nwi_type->pos_x, nwi_type->pos_x + nwi_type->current_x - 1, y + text_y_offset, str, TC_BLACK, SA_HOR_CENTER); + DrawString(type.left, type.right, mr.top + text_y_offset, str, TC_BLACK, SA_HOR_CENTER); - DrawString(nwi_name->pos_x + WD_FRAMERECT_LEFT, nwi_name->pos_x + nwi_name->current_x - WD_FRAMERECT_RIGHT, y + text_y_offset, ci->name, TC_BLACK); - y += this->resize.step_height; + DrawString(name.left, name.right, mr.top + text_y_offset, ci->name, TC_BLACK); + mr = mr.Translate(0, this->resize.step_height); } } @@ -662,60 +684,59 @@ public: */ void DrawDetails(const Rect &r) const { - static const int DETAIL_LEFT = 5; ///< Number of pixels at the left - static const int DETAIL_RIGHT = 5; ///< Number of pixels at the right - static const int DETAIL_TOP = 5; ///< Number of pixels at the top - /* Height for the title banner */ - int DETAIL_TITLE_HEIGHT = 5 * FONT_HEIGHT_NORMAL; + int HEADER_HEIGHT = 3 * FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.frametext.Vertical(); + + Rect hr = r.WithHeight(HEADER_HEIGHT).Shrink(WidgetDimensions::scaled.frametext); + Rect tr = r.Shrink(WidgetDimensions::scaled.frametext); + tr.top += HEADER_HEIGHT; /* Create the nice grayish rectangle at the details top */ - GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.top + DETAIL_TITLE_HEIGHT, PC_DARK_BLUE); - DrawString(r.left + WD_INSET_LEFT, r.right - WD_INSET_RIGHT, r.top + FONT_HEIGHT_NORMAL + WD_INSET_TOP, STR_CONTENT_DETAIL_TITLE, TC_FROMSTRING, SA_HOR_CENTER); + GfxFillRect(r.WithHeight(HEADER_HEIGHT).Shrink(WidgetDimensions::scaled.bevel.left, WidgetDimensions::scaled.bevel.top, WidgetDimensions::scaled.bevel.right, 0), PC_DARK_BLUE); + DrawString(hr.left, hr.right, hr.top, STR_CONTENT_DETAIL_TITLE, TC_FROMSTRING, SA_HOR_CENTER); /* Draw the total download size */ SetDParam(0, this->filesize_sum); - DrawString(r.left + DETAIL_LEFT, r.right - DETAIL_RIGHT, r.bottom - FONT_HEIGHT_NORMAL - WD_PAR_VSEP_NORMAL, STR_CONTENT_TOTAL_DOWNLOAD_SIZE); + DrawString(tr.left, tr.right, tr.bottom - FONT_HEIGHT_NORMAL + 1, STR_CONTENT_TOTAL_DOWNLOAD_SIZE); if (this->selected == nullptr) return; /* And fill the rest of the details when there's information to place there */ - DrawStringMultiLine(r.left + WD_INSET_LEFT, r.right - WD_INSET_RIGHT, r.top + DETAIL_TITLE_HEIGHT / 2, r.top + DETAIL_TITLE_HEIGHT, STR_CONTENT_DETAIL_SUBTITLE_UNSELECTED + this->selected->state, TC_FROMSTRING, SA_CENTER); + DrawStringMultiLine(hr.left, hr.right, hr.top + FONT_HEIGHT_NORMAL, hr.bottom, STR_CONTENT_DETAIL_SUBTITLE_UNSELECTED + this->selected->state, TC_FROMSTRING, SA_CENTER); /* Also show the total download size, so keep some space from the bottom */ - const uint max_y = r.bottom - FONT_HEIGHT_NORMAL - WD_PAR_VSEP_WIDE; - int y = r.top + DETAIL_TITLE_HEIGHT + DETAIL_TOP; + tr.bottom -= FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_wide; if (this->selected->upgrade) { SetDParam(0, STR_CONTENT_TYPE_BASE_GRAPHICS + this->selected->type - CONTENT_TYPE_BASE_GRAPHICS); - y = DrawStringMultiLine(r.left + DETAIL_LEFT, r.right - DETAIL_RIGHT, y, max_y, STR_CONTENT_DETAIL_UPDATE); - y += WD_PAR_VSEP_WIDE; + tr.top = DrawStringMultiLine(tr, STR_CONTENT_DETAIL_UPDATE); + tr.top += WidgetDimensions::scaled.vsep_wide; } SetDParamStr(0, this->selected->name); - y = DrawStringMultiLine(r.left + DETAIL_LEFT, r.right - DETAIL_RIGHT, y, max_y, STR_CONTENT_DETAIL_NAME); + tr.top = DrawStringMultiLine(tr, STR_CONTENT_DETAIL_NAME); if (!this->selected->version.empty()) { SetDParamStr(0, this->selected->version); - y = DrawStringMultiLine(r.left + DETAIL_LEFT, r.right - DETAIL_RIGHT, y, max_y, STR_CONTENT_DETAIL_VERSION); + tr.top = DrawStringMultiLine(tr, STR_CONTENT_DETAIL_VERSION); } if (!this->selected->description.empty()) { SetDParamStr(0, this->selected->description); - y = DrawStringMultiLine(r.left + DETAIL_LEFT, r.right - DETAIL_RIGHT, y, max_y, STR_CONTENT_DETAIL_DESCRIPTION); + tr.top = DrawStringMultiLine(tr, STR_CONTENT_DETAIL_DESCRIPTION); } if (!this->selected->url.empty()) { SetDParamStr(0, this->selected->url); - y = DrawStringMultiLine(r.left + DETAIL_LEFT, r.right - DETAIL_RIGHT, y, max_y, STR_CONTENT_DETAIL_URL); + tr.top = DrawStringMultiLine(tr, STR_CONTENT_DETAIL_URL); } SetDParam(0, STR_CONTENT_TYPE_BASE_GRAPHICS + this->selected->type - CONTENT_TYPE_BASE_GRAPHICS); - y = DrawStringMultiLine(r.left + DETAIL_LEFT, r.right - DETAIL_RIGHT, y, max_y, STR_CONTENT_DETAIL_TYPE); + tr.top = DrawStringMultiLine(tr, STR_CONTENT_DETAIL_TYPE); - y += WD_PAR_VSEP_WIDE; + tr.top += WidgetDimensions::scaled.vsep_wide; SetDParam(0, this->selected->filesize); - y = DrawStringMultiLine(r.left + DETAIL_LEFT, r.right - DETAIL_RIGHT, y, max_y, STR_CONTENT_DETAIL_FILESIZE); + tr.top = DrawStringMultiLine(tr, STR_CONTENT_DETAIL_FILESIZE); if (!this->selected->dependencies.empty()) { /* List dependencies */ @@ -733,7 +754,7 @@ public: } } SetDParamStr(0, buf); - y = DrawStringMultiLine(r.left + DETAIL_LEFT, r.right - DETAIL_RIGHT, y, max_y, STR_CONTENT_DETAIL_DEPENDENCIES); + tr.top = DrawStringMultiLine(tr, STR_CONTENT_DETAIL_DEPENDENCIES); } if (!this->selected->tags.empty()) { @@ -744,7 +765,7 @@ public: p += seprintf(p, lastof(buf), p == buf ? "%s" : ", %s", tag.c_str()); } SetDParamStr(0, buf); - y = DrawStringMultiLine(r.left + DETAIL_LEFT, r.right - DETAIL_RIGHT, y, max_y, STR_CONTENT_DETAIL_TAGS); + tr.top = DrawStringMultiLine(tr, STR_CONTENT_DETAIL_TAGS); } if (this->selected->IsSelected()) { @@ -761,7 +782,7 @@ public: } if (p != buf) { SetDParamStr(0, buf); - y = DrawStringMultiLine(r.left + DETAIL_LEFT, r.right - DETAIL_RIGHT, y, max_y, STR_CONTENT_DETAIL_SELECTED_BECAUSE_OF); + tr.top = DrawStringMultiLine(tr, STR_CONTENT_DETAIL_SELECTED_BECAUSE_OF); } } } diff --git a/src/network/network_content_gui.h b/src/network/network_content_gui.h index 54fbcc36b3..570f15462f 100644 --- a/src/network/network_content_gui.h +++ b/src/network/network_content_gui.h @@ -33,6 +33,7 @@ public: BaseNetworkContentDownloadStatusWindow(WindowDesc *desc); void Close() override; + void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override; void DrawWidget(const Rect &r, int widget) const override; void OnDownloadProgress(const ContentInfo *ci, int bytes) override; }; diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index b51d4e8066..cc9adaa01a 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -126,7 +126,7 @@ public: /* First initialise some variables... */ for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) { child_wid->SetupSmallestSize(w, init_array); - this->smallest_y = std::max(this->smallest_y, child_wid->smallest_y + child_wid->padding_top + child_wid->padding_bottom); + this->smallest_y = std::max(this->smallest_y, child_wid->smallest_y + child_wid->padding.Vertical()); } /* ... then in a second pass make sure the 'current' sizes are set. Won't change for most widgets. */ @@ -391,66 +391,71 @@ protected: * @param y from where to draw? * @param highlight does the line need to be highlighted? */ - void DrawServerLine(const NetworkGameList *cur_item, uint y, bool highlight) const + void DrawServerLine(const NetworkGameList *cur_item, int y, bool highlight) const { - const NWidgetBase *nwi_name = this->GetWidget(WID_NG_NAME); - const NWidgetBase *nwi_info = this->GetWidget(WID_NG_INFO); + Rect name = this->GetWidget(WID_NG_NAME)->GetCurrentRect(); + Rect info = this->GetWidget(WID_NG_INFO)->GetCurrentRect(); /* show highlighted item with a different colour */ - if (highlight) GfxFillRect(nwi_name->pos_x + 1, y + 1, nwi_info->pos_x + nwi_info->current_x - 2, y + this->resize.step_height - 2, PC_GREY); + if (highlight) { + Rect r = {name.left, y, info.right, y + (int)this->resize.step_height - 1}; + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); + GfxFillRect(ir.left, ir.top, ir.right, ir.bottom, PC_GREY); + } /* offsets to vertically centre text and icons */ int text_y_offset = (this->resize.step_height - FONT_HEIGHT_NORMAL) / 2 + 1; int icon_y_offset = (this->resize.step_height - GetSpriteSize(SPR_BLOT).height) / 2; int lock_y_offset = (this->resize.step_height - GetSpriteSize(SPR_LOCK).height) / 2; - DrawString(nwi_name->pos_x + WD_FRAMERECT_LEFT, nwi_name->pos_x + nwi_name->current_x - WD_FRAMERECT_RIGHT, y + text_y_offset, cur_item->info.server_name, TC_BLACK); + name = name.Shrink(WidgetDimensions::scaled.framerect); + DrawString(name.left, name.right, y + text_y_offset, cur_item->info.server_name, TC_BLACK); /* only draw details if the server is online */ if (cur_item->status == NGLS_ONLINE) { const NWidgetServerListHeader *nwi_header = this->GetWidget(WID_NG_HEADER); if (nwi_header->IsWidgetVisible(WID_NG_CLIENTS)) { - const NWidgetBase *nwi_clients = this->GetWidget(WID_NG_CLIENTS); + Rect clients = this->GetWidget(WID_NG_CLIENTS)->GetCurrentRect(); SetDParam(0, cur_item->info.clients_on); SetDParam(1, cur_item->info.clients_max); SetDParam(2, cur_item->info.companies_on); SetDParam(3, cur_item->info.companies_max); - DrawString(nwi_clients->pos_x, nwi_clients->pos_x + nwi_clients->current_x - 1, y + text_y_offset, STR_NETWORK_SERVER_LIST_GENERAL_ONLINE, TC_FROMSTRING, SA_HOR_CENTER); + DrawString(clients.left, clients.right, y + text_y_offset, STR_NETWORK_SERVER_LIST_GENERAL_ONLINE, TC_FROMSTRING, SA_HOR_CENTER); } if (nwi_header->IsWidgetVisible(WID_NG_MAPSIZE)) { /* map size */ - const NWidgetBase *nwi_mapsize = this->GetWidget(WID_NG_MAPSIZE); + Rect mapsize = this->GetWidget(WID_NG_MAPSIZE)->GetCurrentRect(); SetDParam(0, cur_item->info.map_width); SetDParam(1, cur_item->info.map_height); - DrawString(nwi_mapsize->pos_x, nwi_mapsize->pos_x + nwi_mapsize->current_x - 1, y + text_y_offset, STR_NETWORK_SERVER_LIST_MAP_SIZE_SHORT, TC_FROMSTRING, SA_HOR_CENTER); + DrawString(mapsize.left, mapsize.right, y + text_y_offset, STR_NETWORK_SERVER_LIST_MAP_SIZE_SHORT, TC_FROMSTRING, SA_HOR_CENTER); } if (nwi_header->IsWidgetVisible(WID_NG_DATE)) { /* current date */ - const NWidgetBase *nwi_date = this->GetWidget(WID_NG_DATE); + Rect date = this->GetWidget(WID_NG_DATE)->GetCurrentRect(); YearMonthDay ymd; ConvertDateToYMD(cur_item->info.game_date, &ymd); SetDParam(0, ymd.year); - DrawString(nwi_date->pos_x, nwi_date->pos_x + nwi_date->current_x - 1, y + text_y_offset, STR_JUST_INT, TC_BLACK, SA_HOR_CENTER); + DrawString(date.left, date.right, y + text_y_offset, STR_JUST_INT, TC_BLACK, SA_HOR_CENTER); } if (nwi_header->IsWidgetVisible(WID_NG_YEARS)) { /* number of years the game is running */ - const NWidgetBase *nwi_years = this->GetWidget(WID_NG_YEARS); + Rect years = this->GetWidget(WID_NG_YEARS)->GetCurrentRect(); YearMonthDay ymd_cur, ymd_start; ConvertDateToYMD(cur_item->info.game_date, &ymd_cur); ConvertDateToYMD(cur_item->info.start_date, &ymd_start); SetDParam(0, ymd_cur.year - ymd_start.year); - DrawString(nwi_years->pos_x, nwi_years->pos_x + nwi_years->current_x - 1, y + text_y_offset, STR_JUST_INT, TC_BLACK, SA_HOR_CENTER); + DrawString(years.left, years.right, y + text_y_offset, STR_JUST_INT, TC_BLACK, SA_HOR_CENTER); } /* draw a lock if the server is password protected */ - if (cur_item->info.use_password) DrawSprite(SPR_LOCK, PAL_NONE, nwi_info->pos_x + this->lock_offset, y + lock_y_offset); + if (cur_item->info.use_password) DrawSprite(SPR_LOCK, PAL_NONE, info.left + this->lock_offset, y + lock_y_offset); /* draw red or green icon, depending on compatibility with server */ - DrawSprite(SPR_BLOT, (cur_item->info.compatible ? PALETTE_TO_GREEN : (cur_item->info.version_compatible ? PALETTE_TO_YELLOW : PALETTE_TO_RED)), nwi_info->pos_x + this->blot_offset, y + icon_y_offset + 1); + DrawSprite(SPR_BLOT, (cur_item->info.compatible ? PALETTE_TO_GREEN : (cur_item->info.version_compatible ? PALETTE_TO_YELLOW : PALETTE_TO_RED)), info.left + this->blot_offset, y + icon_y_offset + 1); } } @@ -473,10 +478,6 @@ public: this->list_pos = SLP_INVALID; this->server = nullptr; - this->lock_offset = 5; - this->blot_offset = this->lock_offset + 3 + GetSpriteSize(SPR_LOCK).width; - this->flag_offset = this->blot_offset + 2 + GetSpriteSize(SPR_BLOT).width; - this->CreateNestedTree(); this->vscroll = this->GetScrollbar(WID_NG_SCROLLBAR); this->FinishInitNested(WN_NETWORK_WINDOW_GAME); @@ -512,17 +513,24 @@ public: this->last_sorting = this->servers.GetListing(); } + void OnInit() override + { + this->lock_offset = ScaleGUITrad(5); + this->blot_offset = this->lock_offset + ScaleGUITrad(3) + GetSpriteSize(SPR_LOCK).width; + this->flag_offset = this->blot_offset + ScaleGUITrad(2) + GetSpriteSize(SPR_BLOT).width; + } + void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override { switch (widget) { case WID_NG_MATRIX: - resize->height = WD_MATRIX_TOP + std::max(GetSpriteSize(SPR_BLOT).height, (uint)FONT_HEIGHT_NORMAL) + WD_MATRIX_BOTTOM; + resize->height = std::max(GetSpriteSize(SPR_BLOT).height, (uint)FONT_HEIGHT_NORMAL) + padding.height; fill->height = resize->height; size->height = 12 * resize->height; break; case WID_NG_LASTJOINED: - size->height = WD_MATRIX_TOP + std::max(GetSpriteSize(SPR_BLOT).height, (uint)FONT_HEIGHT_NORMAL) + WD_MATRIX_BOTTOM; + size->height = std::max(GetSpriteSize(SPR_BLOT).height, (uint)FONT_HEIGHT_NORMAL) + WidgetDimensions::scaled.matrix.Vertical(); break; case WID_NG_LASTJOINED_SPACER: @@ -633,15 +641,19 @@ public: { NetworkGameList *sel = this->server; - const int detail_height = 6 + 8 + 6 + 3 * FONT_HEIGHT_NORMAL; + /* Height for the title banner */ + int HEADER_HEIGHT = 3 * FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.frametext.Vertical(); + + Rect hr = r.WithHeight(HEADER_HEIGHT).Shrink(WidgetDimensions::scaled.frametext); + Rect tr = r.Shrink(WidgetDimensions::scaled.frametext); + tr.top += HEADER_HEIGHT; /* Draw the right menu */ - GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.top + detail_height - 1, PC_DARK_BLUE); + /* Create the nice grayish rectangle at the details top */ + GfxFillRect(r.WithHeight(HEADER_HEIGHT).Shrink(WidgetDimensions::scaled.bevel.left, WidgetDimensions::scaled.bevel.top, WidgetDimensions::scaled.bevel.right, 0), PC_DARK_BLUE); if (sel == nullptr) { - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + 6 + 4 + FONT_HEIGHT_NORMAL, STR_NETWORK_SERVER_LIST_GAME_INFO, TC_FROMSTRING, SA_HOR_CENTER); + DrawString(hr.left, hr.right, hr.top, STR_NETWORK_SERVER_LIST_GAME_INFO, TC_FROMSTRING, SA_HOR_CENTER); } else if (sel->status != NGLS_ONLINE) { - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + 6 + 4 + FONT_HEIGHT_NORMAL, sel->info.server_name, TC_ORANGE, SA_HOR_CENTER); // game name - StringID message = INVALID_STRING_ID; switch (sel->status) { case NGLS_OFFLINE: message = STR_NETWORK_SERVER_LIST_SERVER_OFFLINE; break; @@ -652,63 +664,63 @@ public: /* Handled by the if-case above. */ case NGLS_ONLINE: NOT_REACHED(); } - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + detail_height + 4, message, TC_FROMSTRING, SA_HOR_CENTER); // server offline + + DrawString(hr.left, hr.right, hr.top, message, TC_FROMSTRING, SA_HOR_CENTER); // server offline + DrawStringMultiLine(hr.left, hr.right, hr.top + FONT_HEIGHT_NORMAL, hr.bottom, sel->info.server_name, TC_ORANGE, SA_HOR_CENTER); // game name + DrawString(tr.left, tr.right, tr.top, message, TC_FROMSTRING, SA_HOR_CENTER); // server offline } else { // show game info - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + 6, STR_NETWORK_SERVER_LIST_GAME_INFO, TC_FROMSTRING, SA_HOR_CENTER); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + 6 + 4 + FONT_HEIGHT_NORMAL, sel->info.server_name, TC_ORANGE, SA_HOR_CENTER); // game name - - uint16 y = r.top + detail_height + 4; + DrawString(hr.left, hr.right, hr.top, STR_NETWORK_SERVER_LIST_GAME_INFO, TC_FROMSTRING, SA_HOR_CENTER); + DrawStringMultiLine(hr.left, hr.right, hr.top + FONT_HEIGHT_NORMAL, hr.bottom, sel->info.server_name, TC_ORANGE, SA_HOR_CENTER); // game name SetDParam(0, sel->info.clients_on); SetDParam(1, sel->info.clients_max); SetDParam(2, sel->info.companies_on); SetDParam(3, sel->info.companies_max); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_NETWORK_SERVER_LIST_CLIENTS); - y += FONT_HEIGHT_NORMAL; + DrawString(tr, STR_NETWORK_SERVER_LIST_CLIENTS); + tr.top += FONT_HEIGHT_NORMAL; - SetDParam(0, STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE + sel->info.landscape); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_NETWORK_SERVER_LIST_LANDSCAPE); // landscape - y += FONT_HEIGHT_NORMAL; + SetDParam(0, STR_CLIMATE_TEMPERATE_LANDSCAPE + sel->info.landscape); + DrawString(tr, STR_NETWORK_SERVER_LIST_LANDSCAPE); // landscape + tr.top += FONT_HEIGHT_NORMAL; SetDParam(0, sel->info.map_width); SetDParam(1, sel->info.map_height); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_NETWORK_SERVER_LIST_MAP_SIZE); // map size - y += FONT_HEIGHT_NORMAL; + DrawString(tr, STR_NETWORK_SERVER_LIST_MAP_SIZE); // map size + tr.top += FONT_HEIGHT_NORMAL; SetDParamStr(0, sel->info.server_revision); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_NETWORK_SERVER_LIST_SERVER_VERSION); // server version - y += FONT_HEIGHT_NORMAL; + DrawString(tr, STR_NETWORK_SERVER_LIST_SERVER_VERSION); // server version + tr.top += FONT_HEIGHT_NORMAL; SetDParamStr(0, sel->connection_string); StringID invite_or_address = StrStartsWith(sel->connection_string, "+") ? STR_NETWORK_SERVER_LIST_INVITE_CODE : STR_NETWORK_SERVER_LIST_SERVER_ADDRESS; - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, invite_or_address); // server address / invite code - y += FONT_HEIGHT_NORMAL; + DrawString(tr, invite_or_address); // server address / invite code + tr.top += FONT_HEIGHT_NORMAL; SetDParam(0, sel->info.start_date); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_NETWORK_SERVER_LIST_START_DATE); // start date - y += FONT_HEIGHT_NORMAL; + DrawString(tr, STR_NETWORK_SERVER_LIST_START_DATE); // start date + tr.top += FONT_HEIGHT_NORMAL; SetDParam(0, sel->info.game_date); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_NETWORK_SERVER_LIST_CURRENT_DATE); // current date - y += FONT_HEIGHT_NORMAL; + DrawString(tr, STR_NETWORK_SERVER_LIST_CURRENT_DATE); // current date + tr.top += FONT_HEIGHT_NORMAL; if (sel->info.gamescript_version != -1) { SetDParamStr(0, sel->info.gamescript_name); SetDParam(1, sel->info.gamescript_version); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_NETWORK_SERVER_LIST_GAMESCRIPT); // gamescript name and version - y += FONT_HEIGHT_NORMAL; + tr.top = DrawStringMultiLine(tr, STR_NETWORK_SERVER_LIST_GAMESCRIPT); // gamescript name and version } - y += WD_PAR_VSEP_NORMAL; + tr.top += WidgetDimensions::scaled.vsep_wide; if (!sel->info.compatible) { - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, sel->info.version_compatible ? STR_NETWORK_SERVER_LIST_GRF_MISMATCH : STR_NETWORK_SERVER_LIST_VERSION_MISMATCH, TC_FROMSTRING, SA_HOR_CENTER); // server mismatch + DrawString(tr, sel->info.version_compatible ? STR_NETWORK_SERVER_LIST_GRF_MISMATCH : STR_NETWORK_SERVER_LIST_VERSION_MISMATCH, TC_FROMSTRING, SA_HOR_CENTER); // server mismatch } else if (sel->info.clients_on == sel->info.clients_max) { /* Show: server full, when clients_on == max_clients */ - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_NETWORK_SERVER_LIST_SERVER_FULL, TC_FROMSTRING, SA_HOR_CENTER); // server full + DrawString(tr, STR_NETWORK_SERVER_LIST_SERVER_FULL, TC_FROMSTRING, SA_HOR_CENTER); // server full } else if (sel->info.use_password) { - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_NETWORK_SERVER_LIST_PASSWORD, TC_FROMSTRING, SA_HOR_CENTER); // password warning + DrawString(tr, STR_NETWORK_SERVER_LIST_PASSWORD, TC_FROMSTRING, SA_HOR_CENTER); // password warning } } } @@ -955,7 +967,7 @@ static const NWidgetPart _nested_network_game_widgets[] = { EndContainer(), NWidget(WWT_PANEL, COLOUR_LIGHT_BLUE, WID_NG_DETAILS), NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(5, 5, 5), - NWidget(WWT_EMPTY, INVALID_COLOUR, WID_NG_DETAILS_SPACER), SetMinimalSize(140, 0), SetMinimalTextLines(15, 24 + WD_PAR_VSEP_NORMAL), SetResize(0, 1), SetFill(1, 1), // Make sure it's at least this wide + NWidget(WWT_EMPTY, INVALID_COLOUR, WID_NG_DETAILS_SPACER), SetMinimalSize(140, 0), SetMinimalTextLines(15, 24 + WidgetDimensions::unscaled.vsep_normal), SetResize(0, 1), SetFill(1, 1), // Make sure it's at least this wide NWidget(NWID_HORIZONTAL, NC_NONE), SetPIP(5, 5, 5), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_NG_NEWGRF_MISSING_SEL), NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NG_NEWGRF_MISSING), SetFill(1, 0), SetDataTip(STR_NEWGRF_SETTINGS_FIND_MISSING_CONTENT_BUTTON, STR_NEWGRF_SETTINGS_FIND_MISSING_CONTENT_TOOLTIP), @@ -1069,7 +1081,7 @@ struct NetworkStartServerWindow : public Window { switch (widget) { case WID_NSS_SETPWD: /* If password is set, draw red '*' next to 'Set password' button. */ - if (!_settings_client.network.server_password.empty()) DrawString(r.right + WD_FRAMERECT_LEFT, this->width - WD_FRAMERECT_RIGHT, r.top, "*", TC_RED); + if (!_settings_client.network.server_password.empty()) DrawString(r.right + WidgetDimensions::scaled.framerect.left, this->width - WidgetDimensions::scaled.framerect.right, r.top, "*", TC_RED); } } @@ -1434,8 +1446,8 @@ public: disabled(disabled) { Dimension d = GetSpriteSize(sprite); - this->height = d.height + ScaleGUITrad(WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM); - this->width = d.width + ScaleGUITrad(WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT); + this->height = d.height + WidgetDimensions::scaled.framerect.Vertical(); + this->width = d.width + WidgetDimensions::scaled.framerect.Horizontal(); } virtual ~ButtonCommon() {} @@ -1495,8 +1507,6 @@ private: std::map>> buttons; ///< Per line which buttons are available. - static const int CLIENT_OFFSET_LEFT = 12; ///< Offset of client entries compared to company entries. - /** * Chat button on a Company is clicked. * @param w The instance of this window. @@ -1677,10 +1687,10 @@ private: ButtonCommon *GetButtonAtPoint(Point pt) { uint index = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_CL_MATRIX); - NWidgetBase *widget_matrix = this->GetWidget(WID_CL_MATRIX); + Rect matrix = this->GetWidget(WID_CL_MATRIX)->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect); bool rtl = _current_text_dir == TD_RTL; - uint x = rtl ? (uint)widget_matrix->pos_x + WD_FRAMERECT_LEFT : widget_matrix->current_x - WD_FRAMERECT_RIGHT; + uint x = rtl ? matrix.left : matrix.right; /* Find the buttons for this row. */ auto button_find = this->buttons.find(index); @@ -1695,7 +1705,7 @@ private: return button.get(); } - int width = button->width + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; + int width = button->width + WidgetDimensions::scaled.framerect.Horizontal(); x += rtl ? width : -width; } @@ -1740,8 +1750,8 @@ public: case WID_CL_MATRIX: { uint height = std::max({GetSpriteSize(SPR_COMPANY_ICON).height, GetSpriteSize(SPR_JOIN).height, GetSpriteSize(SPR_ADMIN).height, GetSpriteSize(SPR_CHAT).height}); - height += ScaleGUITrad(WD_FRAMERECT_TOP) + ScaleGUITrad(WD_FRAMERECT_BOTTOM); - this->line_height = std::max(height, (uint)FONT_HEIGHT_NORMAL) + ScaleGUITrad(WD_MATRIX_TOP + WD_MATRIX_BOTTOM); + height += WidgetDimensions::scaled.framerect.Vertical(); + this->line_height = std::max(height, (uint)FONT_HEIGHT_NORMAL) + padding.height; resize->width = 1; resize->height = this->line_height; @@ -1832,14 +1842,14 @@ public: int index = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_CL_MATRIX); bool rtl = _current_text_dir == TD_RTL; - NWidgetBase *widget_matrix = this->GetWidget(WID_CL_MATRIX); + Rect matrix = this->GetWidget(WID_CL_MATRIX)->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect); Dimension d = GetSpriteSize(SPR_COMPANY_ICON); - uint text_left = widget_matrix->pos_x + (rtl ? (uint)WD_FRAMERECT_LEFT : d.width + 8); - uint text_right = widget_matrix->pos_x + widget_matrix->current_x - (rtl ? d.width + 8 : (uint)WD_FRAMERECT_RIGHT); + uint text_left = matrix.left + (rtl ? 0 : d.width + WidgetDimensions::scaled.hsep_wide); + uint text_right = matrix.right - (rtl ? d.width + WidgetDimensions::scaled.hsep_wide : 0); Dimension d2 = GetSpriteSize(SPR_PLAYER_SELF); - uint offset_x = CLIENT_OFFSET_LEFT - d2.width - 3; + uint offset_x = WidgetDimensions::scaled.hsep_indent - d2.width - ScaleGUITrad(3); uint player_icon_x = rtl ? text_right - offset_x - d2.width : text_left + offset_x; @@ -1972,23 +1982,26 @@ public: * @param y The y-position to start with the buttons. * @param buttons The buttons to draw. */ - void DrawButtons(uint &x, uint y, const std::vector> &buttons) const + void DrawButtons(int &x, uint y, const std::vector> &buttons) const { + Rect r; + for (auto &button : buttons) { bool rtl = _current_text_dir == TD_RTL; - uint left = rtl ? x : x - button->width; - uint right = rtl ? x + button->width : x; + int offset = (this->line_height - button->height) / 2; + r.left = rtl ? x : x - button->width + 1; + r.right = rtl ? x + button->width - 1 : x; + r.top = y + offset; + r.bottom = r.top + button->height - 1; - int offset = std::max(0, ((int)(this->line_height + 1) - (int)button->height) / 2); - - DrawFrameRect(left, y + offset, right, y + offset + button->height, button->colour, FR_NONE); - DrawSprite(button->sprite, PAL_NONE, left + ScaleGUITrad(WD_FRAMERECT_LEFT), y + offset + ScaleGUITrad(WD_FRAMERECT_TOP)); + DrawFrameRect(r, button->colour, FR_NONE); + DrawSprite(button->sprite, PAL_NONE, r.left + WidgetDimensions::scaled.framerect.left, r.top + WidgetDimensions::scaled.framerect.top); if (button->disabled) { - GfxFillRect(left + 1, y + offset + 1, right - 1, y + offset + button->height - 1, _colour_gradient[button->colour & 0xF][2], FILLRECT_CHECKER); + GfxFillRect(r.Shrink(WidgetDimensions::scaled.bevel), _colour_gradient[button->colour & 0xF][2], FILLRECT_CHECKER); } - int width = button->width + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; + int width = button->width + WidgetDimensions::scaled.hsep_normal; x += rtl ? width : -width; } } @@ -1996,30 +2009,27 @@ public: /** * Draw a company and its clients on the matrix. * @param company_id The company to draw. - * @param left The most left pixel of the line. - * @param right The most right pixel of the line. - * @param top The top of the first line. + * @param r The rect to draw within. * @param line The Nth line we are drawing. Updated during this function. */ - void DrawCompany(CompanyID company_id, uint left, uint right, uint top, uint &line) const + void DrawCompany(CompanyID company_id, const Rect &r, uint &line) const { bool rtl = _current_text_dir == TD_RTL; - int text_y_offset = std::max(0, ((int)(this->line_height + 1) - (int)FONT_HEIGHT_NORMAL) / 2) + WD_MATRIX_BOTTOM; + int text_y_offset = CenterBounds(0, this->line_height, FONT_HEIGHT_NORMAL); Dimension d = GetSpriteSize(SPR_COMPANY_ICON); - int offset = std::max(0, ((int)(this->line_height + 1) - (int)d.height) / 2); - - uint text_left = left + (rtl ? (uint)WD_FRAMERECT_LEFT : d.width + 8); - uint text_right = right - (rtl ? d.width + 8 : (uint)WD_FRAMERECT_RIGHT); + int offset = CenterBounds(0, this->line_height, d.height); uint line_start = this->vscroll->GetPosition(); uint line_end = line_start + this->vscroll->GetCapacity(); - uint y = top + (this->line_height * (line - line_start)); + uint y = r.top + (this->line_height * (line - line_start)); /* Draw the company line (if in range of scrollbar). */ if (IsInsideMM(line, line_start, line_end)) { - uint x = rtl ? text_left : text_right; + int icon_left = r.WithWidth(d.width, rtl).left; + Rect tr = r.Indent(d.width + WidgetDimensions::scaled.hsep_normal, rtl); + int &x = rtl ? tr.left : tr.right; /* If there are buttons for this company, draw them. */ auto button_find = this->buttons.find(line); @@ -2028,17 +2038,17 @@ public: } if (company_id == COMPANY_SPECTATOR) { - DrawSprite(SPR_COMPANY_ICON, PALETTE_TO_GREY, rtl ? right - d.width - 4 : left + 4, y + offset); - DrawString(rtl ? x : text_left, rtl ? text_right : x, y + text_y_offset, STR_NETWORK_CLIENT_LIST_SPECTATORS, TC_SILVER); + DrawSprite(SPR_COMPANY_ICON, PALETTE_TO_GREY, icon_left, y + offset); + DrawString(tr.left, tr.right, y + text_y_offset, STR_NETWORK_CLIENT_LIST_SPECTATORS, TC_SILVER); } else if (company_id == COMPANY_NEW_COMPANY) { - DrawSprite(SPR_COMPANY_ICON, PALETTE_TO_GREY, rtl ? right - d.width - 4 : left + 4, y + offset); - DrawString(rtl ? x : text_left, rtl ? text_right : x, y + text_y_offset, STR_NETWORK_CLIENT_LIST_NEW_COMPANY, TC_WHITE); + DrawSprite(SPR_COMPANY_ICON, PALETTE_TO_GREY, icon_left, y + offset); + DrawString(tr.left, tr.right, y + text_y_offset, STR_NETWORK_CLIENT_LIST_NEW_COMPANY, TC_WHITE); } else { - DrawCompanyIcon(company_id, rtl ? right - d.width - 4 : left + 4, y + offset); + DrawCompanyIcon(company_id, icon_left, y + offset); SetDParam(0, company_id); SetDParam(1, company_id); - DrawString(rtl ? x : text_left, rtl ? text_right : x, y + text_y_offset, STR_COMPANY_NAME, TC_SILVER); + DrawString(tr.left, tr.right, y + text_y_offset, STR_COMPANY_NAME, TC_SILVER); } } @@ -2050,11 +2060,12 @@ public: /* Draw the player line (if in range of scrollbar). */ if (IsInsideMM(line, line_start, line_end)) { - uint x = rtl ? text_left : text_right; + Rect tr = r.Indent(WidgetDimensions::scaled.hsep_indent, rtl); /* If there are buttons for this client, draw them. */ auto button_find = this->buttons.find(line); if (button_find != this->buttons.end()) { + int &x = rtl ? tr.left : tr.right; this->DrawButtons(x, y, button_find->second); } @@ -2067,13 +2078,13 @@ public: if (player_icon != 0) { Dimension d2 = GetSpriteSize(player_icon); - uint offset_x = CLIENT_OFFSET_LEFT - 3; - int offset_y = std::max(0, ((int)(this->line_height + 1) - (int)d2.height) / 2); - DrawSprite(player_icon, PALETTE_TO_GREY, rtl ? text_right - offset_x : text_left + offset_x - d2.width, y + offset_y); + int offset_y = CenterBounds(0, this->line_height, d2.height); + DrawSprite(player_icon, PALETTE_TO_GREY, rtl ? tr.right - d2.width : tr.left, y + offset_y); + tr = tr.Indent(d2.width + WidgetDimensions::scaled.hsep_normal, rtl); } SetDParamStr(0, ci->client_name); - DrawString(rtl ? x : text_left + CLIENT_OFFSET_LEFT, rtl ? text_right - CLIENT_OFFSET_LEFT : x, y + text_y_offset, STR_JUST_RAW_STRING, TC_BLACK); + DrawString(tr.left, tr.right, y + text_y_offset, STR_JUST_RAW_STRING, TC_BLACK); } y += this->line_height; @@ -2085,31 +2096,32 @@ public: { switch (widget) { case WID_CL_MATRIX: { + Rect ir = r.Shrink(WidgetDimensions::scaled.framerect, RectPadding::zero); uint line = 0; if (this->hover_index >= 0) { - uint offset = this->hover_index * this->line_height; - GfxFillRect(r.left + 2, r.top + offset, r.right - 1, r.top + offset + this->line_height - 2, GREY_SCALE(9)); + Rect br = r.WithHeight(this->line_height).Translate(0, this->hover_index * this->line_height); + GfxFillRect(br.Shrink(WidgetDimensions::scaled.bevel), GREY_SCALE(9)); } NetworkClientInfo *own_ci = NetworkClientInfo::GetByClientID(_network_own_client_id); CompanyID client_playas = own_ci == nullptr ? COMPANY_SPECTATOR : own_ci->client_playas; if (client_playas == COMPANY_SPECTATOR && !NetworkMaxCompaniesReached()) { - this->DrawCompany(COMPANY_NEW_COMPANY, r.left, r.right, r.top, line); + this->DrawCompany(COMPANY_NEW_COMPANY, ir, line); } if (client_playas != COMPANY_SPECTATOR) { - this->DrawCompany(client_playas, r.left, r.right, r.top, line); + this->DrawCompany(client_playas, ir, line); } for (const Company *c : Company::Iterate()) { if (client_playas == c->index) continue; - this->DrawCompany(c->index, r.left, r.right, r.top, line); + this->DrawCompany(c->index, ir, line); } /* Spectators */ - this->DrawCompany(COMPANY_SPECTATOR, r.left, r.right, r.top, line); + this->DrawCompany(COMPANY_SPECTATOR, ir, line); break; } @@ -2154,62 +2166,79 @@ struct NetworkJoinStatusWindow : Window { void DrawWidget(const Rect &r, int widget) const override { - if (widget != WID_NJS_BACKGROUND) return; + switch (widget) { + case WID_NJS_PROGRESS_BAR: { + /* Draw the % complete with a bar and a text */ + DrawFrameRect(r, COLOUR_GREY, FR_BORDERONLY | FR_LOWERED); + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); + uint8 progress; // used for progress bar + switch (_network_join_status) { + case NETWORK_JOIN_STATUS_CONNECTING: + case NETWORK_JOIN_STATUS_AUTHORIZING: + case NETWORK_JOIN_STATUS_GETTING_COMPANY_INFO: + progress = 10; // first two stages 10% + break; + case NETWORK_JOIN_STATUS_WAITING: + progress = 15; // third stage is 15% + break; + case NETWORK_JOIN_STATUS_DOWNLOADING: + if (_network_join_bytes_total == 0) { + progress = 15; // We don't have the final size yet; the server is still compressing! + break; + } + FALLTHROUGH; - uint8 progress; // used for progress bar - DrawString(r.left + 2, r.right - 2, r.top + 20, STR_NETWORK_CONNECTING_1 + _network_join_status, TC_FROMSTRING, SA_HOR_CENTER); - switch (_network_join_status) { - case NETWORK_JOIN_STATUS_CONNECTING: case NETWORK_JOIN_STATUS_AUTHORIZING: - case NETWORK_JOIN_STATUS_GETTING_COMPANY_INFO: - progress = 10; // first two stages 10% - break; - case NETWORK_JOIN_STATUS_WAITING: - SetDParam(0, _network_join_waiting); - DrawString(r.left + 2, r.right - 2, r.top + 20 + FONT_HEIGHT_NORMAL, STR_NETWORK_CONNECTING_WAITING, TC_FROMSTRING, SA_HOR_CENTER); - progress = 15; // third stage is 15% - break; - case NETWORK_JOIN_STATUS_DOWNLOADING: - SetDParam(0, _network_join_bytes); - SetDParam(1, _network_join_bytes_total); - DrawString(r.left + 2, r.right - 2, r.top + 20 + FONT_HEIGHT_NORMAL, _network_join_bytes_total == 0 ? STR_NETWORK_CONNECTING_DOWNLOADING_1 : STR_NETWORK_CONNECTING_DOWNLOADING_2, TC_FROMSTRING, SA_HOR_CENTER); - if (_network_join_bytes_total == 0) { - progress = 15; // We don't have the final size yet; the server is still compressing! - break; + default: // Waiting is 15%, so the resting receivement of map is maximum 70% + progress = 15 + _network_join_bytes * (100 - 15) / _network_join_bytes_total; + break; } - FALLTHROUGH; + DrawFrameRect(ir.WithWidth(ir.Width() * progress / 100, false), COLOUR_MAUVE, FR_NONE); + DrawString(ir.left, ir.right, CenterBounds(ir.top, ir.bottom, FONT_HEIGHT_NORMAL), STR_NETWORK_CONNECTING_1 + _network_join_status, TC_FROMSTRING, SA_HOR_CENTER); + break; + } - default: // Waiting is 15%, so the resting receivement of map is maximum 70% - progress = 15 + _network_join_bytes * (100 - 15) / _network_join_bytes_total; + case WID_NJS_PROGRESS_TEXT: + switch (_network_join_status) { + case NETWORK_JOIN_STATUS_WAITING: + SetDParam(0, _network_join_waiting); + DrawStringMultiLine(r, STR_NETWORK_CONNECTING_WAITING, TC_FROMSTRING, SA_CENTER); + break; + case NETWORK_JOIN_STATUS_DOWNLOADING: + SetDParam(0, _network_join_bytes); + SetDParam(1, _network_join_bytes_total); + DrawStringMultiLine(r, _network_join_bytes_total == 0 ? STR_NETWORK_CONNECTING_DOWNLOADING_1 : STR_NETWORK_CONNECTING_DOWNLOADING_2, TC_FROMSTRING, SA_CENTER); + break; + default: + break; + } + break; } - - /* Draw nice progress bar :) */ - DrawFrameRect(r.left + 20, r.top + 5, (int)((this->width - 20) * progress / 100), r.top + 15, COLOUR_MAUVE, FR_NONE); } void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override { - if (widget != WID_NJS_BACKGROUND) return; + switch (widget) { + case WID_NJS_PROGRESS_BAR: + /* Account for the statuses */ + for (uint i = 0; i < NETWORK_JOIN_STATUS_END; i++) { + *size = maxdim(*size, GetStringBoundingBox(STR_NETWORK_CONNECTING_1 + i)); + } + /* For the number of waiting (other) players */ + SetDParamMaxValue(0, MAX_CLIENTS); + *size = maxdim(*size, GetStringBoundingBox(STR_NETWORK_CONNECTING_WAITING)); + /* We need some spacing for the 'border' */ + size->height += WidgetDimensions::scaled.frametext.Horizontal(); + size->width += WidgetDimensions::scaled.frametext.Vertical(); + break; - size->height = 25 + 2 * FONT_HEIGHT_NORMAL; - - /* Account for the statuses */ - uint width = 0; - for (uint i = 0; i < NETWORK_JOIN_STATUS_END; i++) { - width = std::max(width, GetStringBoundingBox(STR_NETWORK_CONNECTING_1 + i).width); + case WID_NJS_PROGRESS_TEXT: + /* Account for downloading ~ 10 MiB */ + SetDParamMaxDigits(0, 8); + SetDParamMaxDigits(1, 8); + *size = maxdim(*size, GetStringBoundingBox(STR_NETWORK_CONNECTING_DOWNLOADING_1)); + *size = maxdim(*size, GetStringBoundingBox(STR_NETWORK_CONNECTING_DOWNLOADING_1)); + break; } - - /* For the number of waiting (other) players */ - SetDParamMaxValue(0, MAX_CLIENTS); - width = std::max(width, GetStringBoundingBox(STR_NETWORK_CONNECTING_WAITING).width); - - /* Account for downloading ~ 10 MiB */ - SetDParamMaxDigits(0, 8); - SetDParamMaxDigits(1, 8); - width = std::max(width, GetStringBoundingBox(STR_NETWORK_CONNECTING_DOWNLOADING_1).width); - width = std::max(width, GetStringBoundingBox(STR_NETWORK_CONNECTING_DOWNLOADING_2).width); - - /* Give a bit more clearing for the widest strings than strictly needed */ - size->width = width + WD_FRAMERECT_LEFT + WD_FRAMERECT_BOTTOM + 10; } void OnClick(Point pt, int widget, int click_count) override @@ -2239,13 +2268,11 @@ struct NetworkJoinStatusWindow : Window { static const NWidgetPart _nested_network_join_status_window_widgets[] = { NWidget(WWT_CAPTION, COLOUR_GREY), SetDataTip(STR_NETWORK_CONNECTING_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), NWidget(WWT_PANEL, COLOUR_GREY), - NWidget(WWT_EMPTY, COLOUR_GREY, WID_NJS_BACKGROUND), - NWidget(NWID_HORIZONTAL), - NWidget(NWID_SPACER), SetMinimalSize(75, 0), SetFill(1, 0), - NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NJS_CANCELOK), SetMinimalSize(101, 12), SetDataTip(STR_NETWORK_CONNECTION_DISCONNECT, STR_NULL), - NWidget(NWID_SPACER), SetMinimalSize(75, 0), SetFill(1, 0), + NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_wide, 0), SetPadding(WidgetDimensions::unscaled.modalpopup), + NWidget(WWT_EMPTY, INVALID_COLOUR, WID_NJS_PROGRESS_BAR), SetFill(1, 0), + NWidget(WWT_EMPTY, INVALID_COLOUR, WID_NJS_PROGRESS_TEXT), SetFill(1, 0), SetMinimalSize(350, 0), + NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NJS_CANCELOK), SetMinimalSize(101, 12), SetDataTip(STR_NETWORK_CONNECTION_DISCONNECT, STR_NULL), SetFill(1, 0), EndContainer(), - NWidget(NWID_SPACER), SetMinimalSize(0, 4), EndContainer(), }; @@ -2296,9 +2323,9 @@ struct NetworkCompanyPasswordWindow : public Window { void UpdateWarningStringSize() { assert(this->nested_root->smallest_x > 0); - this->warning_size.width = this->nested_root->current_x - (WD_FRAMETEXT_LEFT + WD_FRAMETEXT_RIGHT + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT); + this->warning_size.width = this->nested_root->current_x - (WidgetDimensions::scaled.framerect.Horizontal()) * 2; this->warning_size.height = GetStringHeight(STR_WARNING_PASSWORD_SECURITY, this->warning_size.width); - this->warning_size.height += WD_FRAMETEXT_TOP + WD_FRAMETEXT_BOTTOM + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; + this->warning_size.height += (WidgetDimensions::scaled.framerect.Vertical()) * 2; this->ReInit(); } @@ -2314,8 +2341,7 @@ struct NetworkCompanyPasswordWindow : public Window { { if (widget != WID_NCP_WARNING) return; - DrawStringMultiLine(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, - r.top + WD_FRAMERECT_TOP, r.bottom - WD_FRAMERECT_BOTTOM, + DrawStringMultiLine(r.Shrink(WidgetDimensions::scaled.framerect), STR_WARNING_PASSWORD_SECURITY, TC_FROMSTRING, SA_CENTER); } @@ -2408,14 +2434,14 @@ struct NetworkAskRelayWindow : public Window { { if (widget == WID_NAR_TEXT) { *size = GetStringBoundingBox(STR_NETWORK_ASK_RELAY_TEXT); - size->height = GetStringHeight(STR_NETWORK_ASK_RELAY_TEXT, size->width - WD_FRAMETEXT_LEFT - WD_FRAMETEXT_RIGHT) + WD_FRAMETEXT_BOTTOM + WD_FRAMETEXT_TOP; + size->height = GetStringHeight(STR_NETWORK_ASK_RELAY_TEXT, size->width - WidgetDimensions::scaled.frametext.Horizontal()) + WidgetDimensions::scaled.frametext.Vertical(); } } void DrawWidget(const Rect &r, int widget) const override { if (widget == WID_NAR_TEXT) { - DrawStringMultiLine(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, r.top + WD_FRAMETEXT_TOP, r.bottom - WD_FRAMETEXT_BOTTOM, STR_NETWORK_ASK_RELAY_TEXT, TC_FROMSTRING, SA_CENTER); + DrawStringMultiLine(r.Shrink(WidgetDimensions::scaled.frametext), STR_NETWORK_ASK_RELAY_TEXT, TC_FROMSTRING, SA_CENTER); } } diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 0a3dff80bb..692ef30850 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -328,7 +328,6 @@ struct GRFTempEngineData { uint8 roadtramtype; const GRFFile *defaultcargo_grf; ///< GRF defining the cargo translation table to use if the default cargo is the 'first refittable'. Refittability refittability; ///< Did the newgrf set any refittability property? If not, default refittability will be applied. - bool prop27_set; ///< Did the NewGRF set property 27 (misc flags)? uint8 rv_max_speed; ///< Temporary storage of RV prop 15, maximum speed in mph/0.8 CargoTypes ctt_include_mask; ///< Cargo types always included in the refit mask. CargoTypes ctt_exclude_mask; ///< Cargo types always excluded from the refit mask. @@ -430,13 +429,7 @@ static GRFFile *GetFileByFilename(const char *filename) /** Reset all NewGRFData that was used only while processing data */ static void ClearTemporaryNewGRFData(GRFFile *gf) { - /* Clear the GOTO labels used for GRF processing */ - for (GRFLabel *l = gf->label; l != nullptr;) { - GRFLabel *l2 = l->next; - free(l); - l = l2; - } - gf->label = nullptr; + gf->labels.clear(); } /** @@ -1295,7 +1288,6 @@ static ChangeInfoResult RailVehicleChangeInfo(uint engine, int numinfo, int prop case 0x27: // Miscellaneous flags ei->misc_flags = buf->ReadByte(); _loaded_newgrf_features.has_2CC |= HasBit(ei->misc_flags, EF_USES_2CC); - _gted[e->index].prop27_set = true; break; case 0x28: // Cargo classes allowed @@ -1336,6 +1328,14 @@ static ChangeInfoResult RailVehicleChangeInfo(uint engine, int numinfo, int prop rvi->curve_speed_mod = buf->ReadWord(); break; + case 0x2F: // Engine variant + ei->variant_id = GetNewEngineID(_cur.grffile, VEH_TRAIN, buf->ReadWord()); + break; + + case 0x30: // Extra miscellaneous flags + ei->extra_flags = static_cast(buf->ReadDWord()); + break; + default: ret = CommonVehicleChangeInfo(ei, prop, buf); break; @@ -1530,6 +1530,14 @@ static ChangeInfoResult RoadVehicleChangeInfo(uint engine, int numinfo, int prop break; } + case 0x26: // Engine variant + ei->variant_id = GetNewEngineID(_cur.grffile, VEH_ROAD, buf->ReadWord()); + break; + + case 0x27: // Extra miscellaneous flags + ei->extra_flags = static_cast(buf->ReadDWord()); + break; + default: ret = CommonVehicleChangeInfo(ei, prop, buf); break; @@ -1702,6 +1710,14 @@ static ChangeInfoResult ShipVehicleChangeInfo(uint engine, int numinfo, int prop break; } + case 0x20: // Engine variant + ei->variant_id = GetNewEngineID(_cur.grffile, VEH_SHIP, buf->ReadWord()); + break; + + case 0x21: // Extra miscellaneous flags + ei->extra_flags = static_cast(buf->ReadDWord()); + break; + default: ret = CommonVehicleChangeInfo(ei, prop, buf); break; @@ -1856,6 +1872,14 @@ static ChangeInfoResult AircraftVehicleChangeInfo(uint engine, int numinfo, int avi->max_range = buf->ReadWord(); break; + case 0x20: // Engine variant + ei->variant_id = GetNewEngineID(_cur.grffile, VEH_AIRCRAFT, buf->ReadWord()); + break; + + case 0x21: // Extra miscellaneous flags + ei->extra_flags = static_cast(buf->ReadDWord()); + break; + default: ret = CommonVehicleChangeInfo(ei, prop, buf); break; @@ -6250,9 +6274,17 @@ static void GraphicsNew(ByteReader *buf) if (offset <= depot_no_track_offset && offset + num > depot_no_track_offset) _loaded_newgrf_features.tram = TRAMWAY_REPLACE_DEPOT_NO_TRACK; } + /* If the baseset or grf only provides sprites for flat tiles (pre #10282), duplicate those for use on slopes. */ + bool dup_oneway_sprites = ((type == 0x09) && (offset + num <= SPR_ONEWAY_SLOPE_N_OFFSET)); + for (; num > 0; num--) { _cur.nfo_line++; - LoadNextSprite(replace == 0 ? _cur.spriteid++ : replace++, *_cur.file, _cur.nfo_line); + int load_index = (replace == 0 ? _cur.spriteid++ : replace++); + LoadNextSprite(load_index, *_cur.file, _cur.nfo_line); + if (dup_oneway_sprites) { + DupSprite(load_index, load_index + SPR_ONEWAY_SLOPE_N_OFFSET); + DupSprite(load_index, load_index + SPR_ONEWAY_SLOPE_S_OFFSET); + } } _cur.skip_sprites = skip_num; @@ -6715,15 +6747,15 @@ static void SkipIf(ByteReader *buf) * file. The jump will always be the first matching label that follows * the current nfo_line. If no matching label is found, the first matching * label in the file is used. */ - GRFLabel *choice = nullptr; - for (GRFLabel *label = _cur.grffile->label; label != nullptr; label = label->next) { - if (label->label != numsprites) continue; + const GRFLabel *choice = nullptr; + for (const auto &label : _cur.grffile->labels) { + if (label.label != numsprites) continue; /* Remember a goto before the current line */ - if (choice == nullptr) choice = label; + if (choice == nullptr) choice = &label; /* If we find a label here, this is definitely good */ - if (label->nfo_line > _cur.nfo_line) { - choice = label; + if (label.nfo_line > _cur.nfo_line) { + choice = &label; break; } } @@ -7571,23 +7603,9 @@ static void DefineGotoLabel(ByteReader *buf) byte nfo_label = buf->ReadByte(); - GRFLabel *label = MallocT(1); - label->label = nfo_label; - label->nfo_line = _cur.nfo_line; - label->pos = _cur.file->GetPos(); - label->next = nullptr; + _cur.grffile->labels.emplace_back(nfo_label, _cur.nfo_line, _cur.file->GetPos()); - /* Set up a linked list of goto targets which we will search in an Action 0x7/0x9 */ - if (_cur.grffile->label == nullptr) { - _cur.grffile->label = label; - } else { - /* Attach the label to the end of the list */ - GRFLabel *l; - for (l = _cur.grffile->label; l->next != nullptr; l = l->next) {} - l->next = label; - } - - grfmsg(2, "DefineGotoLabel: GOTO target with label 0x%02X", label->label); + grfmsg(2, "DefineGotoLabel: GOTO target with label 0x%02X", nfo_label); } /** @@ -8365,89 +8383,89 @@ static void GRFUnsafe(ByteReader *buf) /** Initialize the TTDPatch flags */ static void InitializeGRFSpecial() { - _ttdpatch_flags[0] = ((_settings_game.station.never_expire_airports ? 1 : 0) << 0x0C) // keepsmallairport - | (1 << 0x0D) // newairports - | (1 << 0x0E) // largestations - | ((_settings_game.construction.max_bridge_length > 16 ? 1 : 0) << 0x0F) // longbridges - | (0 << 0x10) // loadtime - | (1 << 0x12) // presignals - | (1 << 0x13) // extpresignals - | ((_settings_game.vehicle.never_expire_vehicles ? 1 : 0) << 0x16) // enginespersist - | (1 << 0x1B) // multihead - | (1 << 0x1D) // lowmemory - | (1 << 0x1E); // generalfixes + _ttdpatch_flags[0] = ((_settings_game.station.never_expire_airports ? 1U : 0U) << 0x0C) // keepsmallairport + | (1U << 0x0D) // newairports + | (1U << 0x0E) // largestations + | ((_settings_game.construction.max_bridge_length > 16 ? 1U : 0U) << 0x0F) // longbridges + | (0U << 0x10) // loadtime + | (1U << 0x12) // presignals + | (1U << 0x13) // extpresignals + | ((_settings_game.vehicle.never_expire_vehicles ? 1U : 0U) << 0x16) // enginespersist + | (1U << 0x1B) // multihead + | (1U << 0x1D) // lowmemory + | (1U << 0x1E); // generalfixes - _ttdpatch_flags[1] = ((_settings_game.economy.station_noise_level ? 1 : 0) << 0x07) // moreairports - based on units of noise - | (1 << 0x08) // mammothtrains - | (1 << 0x09) // trainrefit - | (0 << 0x0B) // subsidiaries - | ((_settings_game.order.gradual_loading ? 1 : 0) << 0x0C) // gradualloading - | (1 << 0x12) // unifiedmaglevmode - set bit 0 mode. Not revelant to OTTD - | (1 << 0x13) // unifiedmaglevmode - set bit 1 mode - | (1 << 0x14) // bridgespeedlimits - | (1 << 0x16) // eternalgame - | (1 << 0x17) // newtrains - | (1 << 0x18) // newrvs - | (1 << 0x19) // newships - | (1 << 0x1A) // newplanes - | ((_settings_game.construction.train_signal_side == 1 ? 1 : 0) << 0x1B) // signalsontrafficside - | ((_settings_game.vehicle.disable_elrails ? 0 : 1) << 0x1C); // electrifiedrailway + _ttdpatch_flags[1] = ((_settings_game.economy.station_noise_level ? 1U : 0U) << 0x07) // moreairports - based on units of noise + | (1U << 0x08) // mammothtrains + | (1U << 0x09) // trainrefit + | (0U << 0x0B) // subsidiaries + | ((_settings_game.order.gradual_loading ? 1U : 0U) << 0x0C) // gradualloading + | (1U << 0x12) // unifiedmaglevmode - set bit 0 mode. Not revelant to OTTD + | (1U << 0x13) // unifiedmaglevmode - set bit 1 mode + | (1U << 0x14) // bridgespeedlimits + | (1U << 0x16) // eternalgame + | (1U << 0x17) // newtrains + | (1U << 0x18) // newrvs + | (1U << 0x19) // newships + | (1U << 0x1A) // newplanes + | ((_settings_game.construction.train_signal_side == 1 ? 1U : 0U) << 0x1B) // signalsontrafficside + | ((_settings_game.vehicle.disable_elrails ? 0U : 1U) << 0x1C); // electrifiedrailway - _ttdpatch_flags[2] = (1 << 0x01) // loadallgraphics - obsolote - | (1 << 0x03) // semaphores - | (1 << 0x0A) // newobjects - | (0 << 0x0B) // enhancedgui - | (0 << 0x0C) // newagerating - | ((_settings_game.construction.build_on_slopes ? 1 : 0) << 0x0D) // buildonslopes - | (1 << 0x0E) // fullloadany - | (1 << 0x0F) // planespeed - | (0 << 0x10) // moreindustriesperclimate - obsolete - | (0 << 0x11) // moretoylandfeatures - | (1 << 0x12) // newstations - | (1 << 0x13) // tracktypecostdiff - | (1 << 0x14) // manualconvert - | ((_settings_game.construction.build_on_slopes ? 1 : 0) << 0x15) // buildoncoasts - | (1 << 0x16) // canals - | (1 << 0x17) // newstartyear - | ((_settings_game.vehicle.freight_trains > 1 ? 1 : 0) << 0x18) // freighttrains - | (1 << 0x19) // newhouses - | (1 << 0x1A) // newbridges - | (1 << 0x1B) // newtownnames - | (1 << 0x1C) // moreanimation - | ((_settings_game.vehicle.wagon_speed_limits ? 1 : 0) << 0x1D) // wagonspeedlimits - | (1 << 0x1E) // newshistory - | (0 << 0x1F); // custombridgeheads + _ttdpatch_flags[2] = (1U << 0x01) // loadallgraphics - obsolote + | (1U << 0x03) // semaphores + | (1U << 0x0A) // newobjects + | (0U << 0x0B) // enhancedgui + | (0U << 0x0C) // newagerating + | ((_settings_game.construction.build_on_slopes ? 1U : 0U) << 0x0D) // buildonslopes + | (1U << 0x0E) // fullloadany + | (1U << 0x0F) // planespeed + | (0U << 0x10) // moreindustriesperclimate - obsolete + | (0U << 0x11) // moretoylandfeatures + | (1U << 0x12) // newstations + | (1U << 0x13) // tracktypecostdiff + | (1U << 0x14) // manualconvert + | ((_settings_game.construction.build_on_slopes ? 1U : 0U) << 0x15) // buildoncoasts + | (1U << 0x16) // canals + | (1U << 0x17) // newstartyear + | ((_settings_game.vehicle.freight_trains > 1 ? 1U : 0U) << 0x18) // freighttrains + | (1U << 0x19) // newhouses + | (1U << 0x1A) // newbridges + | (1U << 0x1B) // newtownnames + | (1U << 0x1C) // moreanimation + | ((_settings_game.vehicle.wagon_speed_limits ? 1U : 0U) << 0x1D) // wagonspeedlimits + | (1U << 0x1E) // newshistory + | (0U << 0x1F); // custombridgeheads - _ttdpatch_flags[3] = (0 << 0x00) // newcargodistribution - | (1 << 0x01) // windowsnap - | ((_settings_game.economy.allow_town_roads || _generating_world ? 0 : 1) << 0x02) // townbuildnoroad - | (1 << 0x03) // pathbasedsignalling - | (0 << 0x04) // aichoosechance - | (1 << 0x05) // resolutionwidth - | (1 << 0x06) // resolutionheight - | (1 << 0x07) // newindustries - | ((_settings_game.order.improved_load ? 1 : 0) << 0x08) // fifoloading - | (0 << 0x09) // townroadbranchprob - | (0 << 0x0A) // tempsnowline - | (1 << 0x0B) // newcargo - | (1 << 0x0C) // enhancemultiplayer - | (1 << 0x0D) // onewayroads - | (1 << 0x0E) // irregularstations - | (1 << 0x0F) // statistics - | (1 << 0x10) // newsounds - | (1 << 0x11) // autoreplace - | (1 << 0x12) // autoslope - | (0 << 0x13) // followvehicle - | (1 << 0x14) // trams - | (0 << 0x15) // enhancetunnels - | (1 << 0x16) // shortrvs - | (1 << 0x17) // articulatedrvs - | ((_settings_game.vehicle.dynamic_engines ? 1 : 0) << 0x18) // dynamic engines - | (1 << 0x1E) // variablerunningcosts - | (1 << 0x1F); // any switch is on + _ttdpatch_flags[3] = (0U << 0x00) // newcargodistribution + | (1U << 0x01) // windowsnap + | ((_settings_game.economy.allow_town_roads || _generating_world ? 0U : 1U) << 0x02) // townbuildnoroad + | (1U << 0x03) // pathbasedsignalling + | (0U << 0x04) // aichoosechance + | (1U << 0x05) // resolutionwidth + | (1U << 0x06) // resolutionheight + | (1U << 0x07) // newindustries + | ((_settings_game.order.improved_load ? 1U : 0U) << 0x08) // fifoloading + | (0U << 0x09) // townroadbranchprob + | (0U << 0x0A) // tempsnowline + | (1U << 0x0B) // newcargo + | (1U << 0x0C) // enhancemultiplayer + | (1U << 0x0D) // onewayroads + | (1U << 0x0E) // irregularstations + | (1U << 0x0F) // statistics + | (1U << 0x10) // newsounds + | (1U << 0x11) // autoreplace + | (1U << 0x12) // autoslope + | (0U << 0x13) // followvehicle + | (1U << 0x14) // trams + | (0U << 0x15) // enhancetunnels + | (1U << 0x16) // shortrvs + | (1U << 0x17) // articulatedrvs + | ((_settings_game.vehicle.dynamic_engines ? 1U : 0U) << 0x18) // dynamic engines + | (1U << 0x1E) // variablerunningcosts + | (1U << 0x1F); // any switch is on - _ttdpatch_flags[4] = (1 << 0x00) // larger persistent storage - | ((_settings_game.economy.inflation ? 1 : 0) << 0x01); // inflation is on + _ttdpatch_flags[4] = (1U << 0x00) // larger persistent storage + | ((_settings_game.economy.inflation ? 1U : 0U) << 0x01); // inflation is on } /** Reset and clear all NewGRF stations */ @@ -8985,11 +9003,9 @@ static void FinaliseEngineArray() if (!HasBit(e->info.climates, _settings_game.game_creation.landscape)) continue; - /* When the train does not set property 27 (misc flags), but it - * is overridden by a NewGRF graphically we want to disable the - * flipping possibility. */ - if (e->type == VEH_TRAIN && !_gted[e->index].prop27_set && e->GetGRF() != nullptr && is_custom_sprite(e->u.rail.image_index)) { - ClrBit(e->info.misc_flags, EF_RAIL_FLIPS); + /* Set appropriate flags on variant engine */ + if (e->info.variant_id != INVALID_ENGINE) { + Engine::Get(e->info.variant_id)->display_flags |= EngineDisplayFlags::HasVariants | EngineDisplayFlags::IsFolded; } /* Skip wagons, there livery is defined via the engine */ diff --git a/src/newgrf.h b/src/newgrf.h index eb6c22d477..9e6a4f1c25 100644 --- a/src/newgrf.h +++ b/src/newgrf.h @@ -98,7 +98,8 @@ struct GRFLabel { byte label; uint32 nfo_line; size_t pos; - struct GRFLabel *next; + + GRFLabel(byte label, uint32 nfo_line, size_t pos) : label(label), nfo_line(nfo_line), pos(pos) {} }; /** Dynamic data of a loaded NewGRF */ @@ -121,7 +122,7 @@ struct GRFFile : ZeroedMemoryAllocator { uint32 param[0x80]; uint param_end; ///< one more than the highest set parameter - GRFLabel *label; ///< Pointer to the first label. This is a linked list, not an array. + std::vector labels; ///< List of labels std::vector cargo_list; ///< Cargo translation table (local ID -> label) uint8 cargo_map[NUM_CARGO]; ///< Inverse cargo translation table (CargoID -> local ID) diff --git a/src/newgrf_debug_gui.cpp b/src/newgrf_debug_gui.cpp index ec221e2f33..8d13892d30 100644 --- a/src/newgrf_debug_gui.cpp +++ b/src/newgrf_debug_gui.cpp @@ -273,11 +273,6 @@ static inline const NIHelper *GetFeatureHelper(uint window_number) /** Window used for inspecting NewGRFs. */ struct NewGRFInspectWindow : Window { - static const int LEFT_OFFSET = 5; ///< Position of left edge - static const int RIGHT_OFFSET = 5; ///< Position of right edge - static const int TOP_OFFSET = 5; ///< Position of top edge - static const int BOTTOM_OFFSET = 5; ///< Position of bottom edge - /** The value for the variable 60 parameters. */ static uint32 var60params[GSF_FAKE_END][0x20]; @@ -376,15 +371,15 @@ struct NewGRFInspectWindow : Window { case WID_NGRFI_VEH_CHAIN: { assert(this->HasChainIndex()); GrfSpecFeature f = GetFeatureNum(this->window_number); - size->height = std::max(size->height, GetVehicleImageCellSize((VehicleType)(VEH_TRAIN + (f - GSF_TRAINS)), EIT_IN_DEPOT).height + 2 + WD_BEVEL_TOP + WD_BEVEL_BOTTOM); + size->height = std::max(size->height, GetVehicleImageCellSize((VehicleType)(VEH_TRAIN + (f - GSF_TRAINS)), EIT_IN_DEPOT).height + 2 + WidgetDimensions::scaled.bevel.Vertical()); break; } case WID_NGRFI_MAINPANEL: - resize->height = std::max(11, FONT_HEIGHT_NORMAL + 1); + resize->height = std::max(11, FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal); resize->width = 1; - size->height = 5 * resize->height + TOP_OFFSET + BOTTOM_OFFSET; + size->height = 5 * resize->height + WidgetDimensions::scaled.frametext.Vertical(); break; } } @@ -407,7 +402,7 @@ struct NewGRFInspectWindow : Window { offset -= this->vscroll->GetPosition(); if (offset < 0 || offset >= this->vscroll->GetCapacity()) return; - ::DrawString(r.left + LEFT_OFFSET, r.right - RIGHT_OFFSET, r.top + TOP_OFFSET + (offset * this->resize.step_height), buf, TC_BLACK); + ::DrawString(r.Shrink(WidgetDimensions::scaled.frametext).Shrink(0, offset * this->resize.step_height, 0, 0), buf, TC_BLACK); } void DrawWidget(const Rect &r, int widget) const override @@ -428,7 +423,8 @@ struct NewGRFInspectWindow : Window { if (u == v) sel_end = total_width; } - int width = r.right + 1 - r.left - WD_BEVEL_LEFT - WD_BEVEL_RIGHT; + Rect br = r.Shrink(WidgetDimensions::scaled.bevel); + int width = br.Width(); int skip = 0; if (total_width > width) { int sel_center = (sel_start + sel_end) / 2; @@ -437,8 +433,8 @@ struct NewGRFInspectWindow : Window { GrfSpecFeature f = GetFeatureNum(this->window_number); int h = GetVehicleImageCellSize((VehicleType)(VEH_TRAIN + (f - GSF_TRAINS)), EIT_IN_DEPOT).height; - int y = (r.top + r.bottom - h) / 2; - DrawVehicleImage(v->First(), r.left + WD_BEVEL_LEFT, r.right - WD_BEVEL_RIGHT, y + 1, INVALID_VEHICLE, EIT_IN_DETAILS, skip); + int y = CenterBounds(br.top, br.bottom, h); + DrawVehicleImage(v->First(), br, INVALID_VEHICLE, EIT_IN_DETAILS, skip); /* Highlight the articulated part (this is different to the whole-vehicle highlighting of DrawVehicleImage */ if (_current_text_dir == TD_RTL) { @@ -584,7 +580,7 @@ struct NewGRFInspectWindow : Window { if (nif->variables == nullptr) return; /* Get the line, make sure it's within the boundaries. */ - int line = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_NGRFI_MAINPANEL, TOP_OFFSET); + int line = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_NGRFI_MAINPANEL, WidgetDimensions::scaled.frametext.top); if (line == INT_MAX) return; /* Find the variable related to the line */ @@ -610,7 +606,7 @@ struct NewGRFInspectWindow : Window { void OnResize() override { - this->vscroll->SetCapacityFromWidget(this, WID_NGRFI_MAINPANEL, TOP_OFFSET + BOTTOM_OFFSET); + this->vscroll->SetCapacityFromWidget(this, WID_NGRFI_MAINPANEL, WidgetDimensions::scaled.frametext.Vertical()); } /** @@ -812,12 +808,18 @@ struct SpriteAlignerWindow : Window { Scrollbar *vscroll; SmallMap offs_start_map; ///< Mapping of starting offsets for the sprites which have been aligned in the sprite aligner window. + static bool centre; + static bool crosshair; + SpriteAlignerWindow(WindowDesc *desc, WindowNumber wno) : Window(desc) { this->CreateNestedTree(); this->vscroll = this->GetScrollbar(WID_SA_SCROLLBAR); this->FinishInitNested(wno); + this->SetWidgetLoweredState(WID_SA_CENTRE, SpriteAlignerWindow::centre); + this->SetWidgetLoweredState(WID_SA_CROSSHAIR, SpriteAlignerWindow::crosshair); + /* Oh yes, we assume there is at least one normal sprite! */ while (GetSpriteType(this->current_sprite) != ST_NORMAL) this->current_sprite++; } @@ -863,7 +865,9 @@ struct SpriteAlignerWindow : Window { size->height = ScaleGUITrad(200); break; case WID_SA_LIST: - resize->height = FONT_HEIGHT_NORMAL + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; + SetDParamMaxDigits(0, 6); + size->width = GetStringBoundingBox(STR_BLACK_COMMA).width + padding.width; + resize->height = FONT_HEIGHT_NORMAL + padding.height; resize->width = 1; fill->height = resize->height; break; @@ -878,17 +882,27 @@ struct SpriteAlignerWindow : Window { case WID_SA_SPRITE: { /* Center the sprite ourselves */ const Sprite *spr = GetSprite(this->current_sprite, ST_NORMAL); - int width = r.right - r.left + 1 - WD_BEVEL_LEFT - WD_BEVEL_RIGHT; - int height = r.bottom - r.top + 1 - WD_BEVEL_TOP - WD_BEVEL_BOTTOM; - int x = -UnScaleGUI(spr->x_offs) + (width - UnScaleGUI(spr->width) ) / 2; - int y = -UnScaleGUI(spr->y_offs) + (height - UnScaleGUI(spr->height)) / 2; + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); + int x; + int y; + if (SpriteAlignerWindow::centre) { + x = -UnScaleGUI(spr->x_offs) + (ir.Width() - UnScaleGUI(spr->width)) / 2; + y = -UnScaleGUI(spr->y_offs) + (ir.Height() - UnScaleGUI(spr->height)) / 2; + } else { + x = ir.Width() / 2; + y = ir.Height() / 2; + } DrawPixelInfo new_dpi; - if (!FillDrawPixelInfo(&new_dpi, r.left + WD_BEVEL_LEFT, r.top + WD_BEVEL_TOP, width, height)) break; + if (!FillDrawPixelInfo(&new_dpi, ir.left, ir.top, ir.Width(), ir.Height())) break; DrawPixelInfo *old_dpi = _cur_dpi; _cur_dpi = &new_dpi; DrawSprite(this->current_sprite, PAL_NONE, x, y, nullptr, ZOOM_LVL_GUI); + if (this->crosshair) { + GfxDrawLine(x, 0, x, ir.Height() - 1, PC_WHITE, 1, 1); + GfxDrawLine(0, y, ir.Width() - 1, y, PC_WHITE, 1, 1); + } _cur_dpi = old_dpi; @@ -902,11 +916,11 @@ struct SpriteAlignerWindow : Window { std::vector &list = _newgrf_debug_sprite_picker.sprites; int max = std::min(this->vscroll->GetPosition() + this->vscroll->GetCapacity(), (uint)list.size()); - int y = r.top + WD_FRAMERECT_TOP; + Rect ir = r.Shrink(WidgetDimensions::scaled.matrix); for (int i = this->vscroll->GetPosition(); i < max; i++) { SetDParam(0, list[i]); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_BLACK_COMMA, TC_FROMSTRING, SA_RIGHT | SA_FORCE); - y += step_size; + DrawString(ir, STR_BLACK_COMMA, TC_FROMSTRING, SA_RIGHT | SA_FORCE); + ir.top += step_size; } break; } @@ -994,6 +1008,18 @@ struct SpriteAlignerWindow : Window { this->offs_start_map.Erase(this->current_sprite); this->SetDirty(); break; + + case WID_SA_CENTRE: + SpriteAlignerWindow::centre = !SpriteAlignerWindow::centre; + this->SetWidgetLoweredState(widget, SpriteAlignerWindow::centre); + this->SetDirty(); + break; + + case WID_SA_CROSSHAIR: + SpriteAlignerWindow::crosshair = !SpriteAlignerWindow::crosshair; + this->SetWidgetLoweredState(widget, SpriteAlignerWindow::crosshair); + this->SetDirty(); + break; } } @@ -1030,6 +1056,9 @@ struct SpriteAlignerWindow : Window { } }; +bool SpriteAlignerWindow::centre = true; +bool SpriteAlignerWindow::crosshair = true; + static const NWidgetPart _nested_sprite_aligner_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), @@ -1047,34 +1076,34 @@ static const NWidgetPart _nested_sprite_aligner_widgets[] = { EndContainer(), NWidget(NWID_HORIZONTAL), SetPIP(10, 5, 10), NWidget(NWID_SPACER), SetFill(1, 1), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_SA_UP), SetDataTip(SPR_ARROW_UP, STR_SPRITE_ALIGNER_MOVE_TOOLTIP), SetResize(0, 0), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_SA_UP), SetDataTip(SPR_ARROW_UP, STR_SPRITE_ALIGNER_MOVE_TOOLTIP), SetResize(0, 0), SetMinimalSize(11, 11), NWidget(NWID_SPACER), SetFill(1, 1), EndContainer(), NWidget(NWID_HORIZONTAL_LTR), SetPIP(10, 5, 10), NWidget(NWID_VERTICAL), NWidget(NWID_SPACER), SetFill(1, 1), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_SA_LEFT), SetDataTip(SPR_ARROW_LEFT, STR_SPRITE_ALIGNER_MOVE_TOOLTIP), SetResize(0, 0), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_SA_LEFT), SetDataTip(SPR_ARROW_LEFT, STR_SPRITE_ALIGNER_MOVE_TOOLTIP), SetResize(0, 0), SetMinimalSize(11, 11), NWidget(NWID_SPACER), SetFill(1, 1), EndContainer(), NWidget(WWT_PANEL, COLOUR_DARK_BLUE, WID_SA_SPRITE), SetDataTip(STR_NULL, STR_SPRITE_ALIGNER_SPRITE_TOOLTIP), EndContainer(), NWidget(NWID_VERTICAL), NWidget(NWID_SPACER), SetFill(1, 1), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_SA_RIGHT), SetDataTip(SPR_ARROW_RIGHT, STR_SPRITE_ALIGNER_MOVE_TOOLTIP), SetResize(0, 0), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_SA_RIGHT), SetDataTip(SPR_ARROW_RIGHT, STR_SPRITE_ALIGNER_MOVE_TOOLTIP), SetResize(0, 0), SetMinimalSize(11, 11), NWidget(NWID_SPACER), SetFill(1, 1), EndContainer(), EndContainer(), NWidget(NWID_HORIZONTAL), SetPIP(10, 5, 10), NWidget(NWID_SPACER), SetFill(1, 1), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_SA_DOWN), SetDataTip(SPR_ARROW_DOWN, STR_SPRITE_ALIGNER_MOVE_TOOLTIP), SetResize(0, 0), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_SA_DOWN), SetDataTip(SPR_ARROW_DOWN, STR_SPRITE_ALIGNER_MOVE_TOOLTIP), SetResize(0, 0), SetMinimalSize(11, 11), NWidget(NWID_SPACER), SetFill(1, 1), EndContainer(), NWidget(WWT_LABEL, COLOUR_GREY, WID_SA_OFFSETS_ABS), SetDataTip(STR_SPRITE_ALIGNER_OFFSETS_ABS, STR_NULL), SetFill(1, 0), SetPadding(0, 10, 0, 10), NWidget(WWT_LABEL, COLOUR_GREY, WID_SA_OFFSETS_REL), SetDataTip(STR_SPRITE_ALIGNER_OFFSETS_REL, STR_NULL), SetFill(1, 0), SetPadding(0, 10, 0, 10), - NWidget(NWID_HORIZONTAL), SetPIP(10, 5, 10), - NWidget(NWID_SPACER), SetFill(1, 1), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SA_RESET_REL), SetDataTip(STR_SPRITE_ALIGNER_RESET_BUTTON, STR_SPRITE_ALIGNER_RESET_TOOLTIP), SetFill(0, 0), - NWidget(NWID_SPACER), SetFill(1, 1), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(10, 5, 10), + NWidget(WWT_TEXTBTN_2, COLOUR_GREY, WID_SA_CENTRE), SetDataTip(STR_SPRITE_ALIGNER_CENTRE_OFFSET, STR_NULL), SetFill(1, 0), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SA_RESET_REL), SetDataTip(STR_SPRITE_ALIGNER_RESET_BUTTON, STR_SPRITE_ALIGNER_RESET_TOOLTIP), SetFill(1, 0), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SA_CROSSHAIR), SetDataTip(STR_SPRITE_ALIGNER_CROSSHAIR, STR_NULL), SetFill(1, 0), EndContainer(), EndContainer(), NWidget(NWID_VERTICAL), SetPIP(10, 5, 10), diff --git a/src/newgrf_engine.cpp b/src/newgrf_engine.cpp index a8dace53f8..af72c65ed1 100644 --- a/src/newgrf_engine.cpp +++ b/src/newgrf_engine.cpp @@ -975,6 +975,8 @@ static uint32 VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *object, case 0x92: return Clamp(_date - DAYS_TILL_ORIGINAL_BASE_YEAR, 0, 0xFFFF); // Date of last service case 0x93: return GB(Clamp(_date - DAYS_TILL_ORIGINAL_BASE_YEAR, 0, 0xFFFF), 8, 8); case 0xC4: return Clamp(_cur_year, ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR; // Build year + case 0xC6: return Engine::Get(this->self_type)->grf_prop.local_id; + case 0xC7: return GB(Engine::Get(this->self_type)->grf_prop.local_id, 8, 8); case 0xDA: return INVALID_VEHICLE; // Next vehicle case 0xF2: return 0; // Cargo subtype } diff --git a/src/newgrf_gui.cpp b/src/newgrf_gui.cpp index 1b7ab44f6c..223c1e21af 100644 --- a/src/newgrf_gui.cpp +++ b/src/newgrf_gui.cpp @@ -66,8 +66,9 @@ void ShowNewGRFError() } } -static void ShowNewGRFInfo(const GRFConfig *c, uint x, uint y, uint right, uint bottom, bool show_params) +static void ShowNewGRFInfo(const GRFConfig *c, const Rect &r, bool show_params) { + Rect tr = r.Shrink(WidgetDimensions::scaled.frametext); if (c->error != nullptr) { char message[512]; SetDParamStr(0, c->error->custom_message); // is skipped by built-in messages @@ -79,34 +80,34 @@ static void ShowNewGRFInfo(const GRFConfig *c, uint x, uint y, uint right, uint GetString(message, c->error->message != STR_NULL ? c->error->message : STR_JUST_RAW_STRING, lastof(message)); SetDParamStr(0, message); - y = DrawStringMultiLine(x, right, y, bottom, c->error->severity); + tr.top = DrawStringMultiLine(tr, c->error->severity); } /* Draw filename or not if it is not known (GRF sent over internet) */ if (c->filename != nullptr) { SetDParamStr(0, c->filename); - y = DrawStringMultiLine(x, right, y, bottom, STR_NEWGRF_SETTINGS_FILENAME); + tr.top = DrawStringMultiLine(tr, STR_NEWGRF_SETTINGS_FILENAME); } /* Prepare and draw GRF ID */ char buff[256]; seprintf(buff, lastof(buff), "%08X", BSWAP32(c->ident.grfid)); SetDParamStr(0, buff); - y = DrawStringMultiLine(x, right, y, bottom, STR_NEWGRF_SETTINGS_GRF_ID); + tr.top = DrawStringMultiLine(tr, STR_NEWGRF_SETTINGS_GRF_ID); if ((_settings_client.gui.newgrf_developer_tools || _settings_client.gui.newgrf_show_old_versions) && c->version != 0) { SetDParam(0, c->version); - y = DrawStringMultiLine(x, right, y, bottom, STR_NEWGRF_SETTINGS_VERSION); + tr.top = DrawStringMultiLine(tr, STR_NEWGRF_SETTINGS_VERSION); } if ((_settings_client.gui.newgrf_developer_tools || _settings_client.gui.newgrf_show_old_versions) && c->min_loadable_version != 0) { SetDParam(0, c->min_loadable_version); - y = DrawStringMultiLine(x, right, y, bottom, STR_NEWGRF_SETTINGS_MIN_VERSION); + tr.top = DrawStringMultiLine(tr, STR_NEWGRF_SETTINGS_MIN_VERSION); } /* Prepare and draw MD5 sum */ md5sumToString(buff, lastof(buff), c->ident.md5sum); SetDParamStr(0, buff); - y = DrawStringMultiLine(x, right, y, bottom, STR_NEWGRF_SETTINGS_MD5SUM); + tr.top = DrawStringMultiLine(tr, STR_NEWGRF_SETTINGS_MD5SUM); /* Show GRF parameter list */ if (show_params) { @@ -117,7 +118,7 @@ static void ShowNewGRFInfo(const GRFConfig *c, uint x, uint y, uint right, uint } else { SetDParam(0, STR_NEWGRF_SETTINGS_PARAMETER_NONE); } - y = DrawStringMultiLine(x, right, y, bottom, STR_NEWGRF_SETTINGS_PARAMETER); + tr.top = DrawStringMultiLine(tr, STR_NEWGRF_SETTINGS_PARAMETER); /* Draw the palette of the NewGRF */ if (c->palette & GRFP_BLT_32BPP) { @@ -125,21 +126,21 @@ static void ShowNewGRFInfo(const GRFConfig *c, uint x, uint y, uint right, uint } else { SetDParam(0, (c->palette & GRFP_USE_WINDOWS) ? STR_NEWGRF_SETTINGS_PALETTE_LEGACY : STR_NEWGRF_SETTINGS_PALETTE_DEFAULT); } - y = DrawStringMultiLine(x, right, y, bottom, STR_NEWGRF_SETTINGS_PALETTE); + tr.top = DrawStringMultiLine(tr, STR_NEWGRF_SETTINGS_PALETTE); } /* Show flags */ - if (c->status == GCS_NOT_FOUND) y = DrawStringMultiLine(x, right, y, bottom, STR_NEWGRF_SETTINGS_NOT_FOUND); - if (c->status == GCS_DISABLED) y = DrawStringMultiLine(x, right, y, bottom, STR_NEWGRF_SETTINGS_DISABLED); - if (HasBit(c->flags, GCF_INVALID)) y = DrawStringMultiLine(x, right, y, bottom, STR_NEWGRF_SETTINGS_INCOMPATIBLE); - if (HasBit(c->flags, GCF_COMPATIBLE)) y = DrawStringMultiLine(x, right, y, bottom, STR_NEWGRF_COMPATIBLE_LOADED); + if (c->status == GCS_NOT_FOUND) tr.top = DrawStringMultiLine(tr, STR_NEWGRF_SETTINGS_NOT_FOUND); + if (c->status == GCS_DISABLED) tr.top = DrawStringMultiLine(tr, STR_NEWGRF_SETTINGS_DISABLED); + if (HasBit(c->flags, GCF_INVALID)) tr.top = DrawStringMultiLine(tr, STR_NEWGRF_SETTINGS_INCOMPATIBLE); + if (HasBit(c->flags, GCF_COMPATIBLE)) tr.top = DrawStringMultiLine(tr, STR_NEWGRF_COMPATIBLE_LOADED); /* Draw GRF info if it exists */ if (!StrEmpty(c->GetDescription())) { SetDParamStr(0, c->GetDescription()); - y = DrawStringMultiLine(x, right, y, bottom, STR_BLACK_RAW_STRING); + tr.top = DrawStringMultiLine(tr, STR_BLACK_RAW_STRING); } else { - y = DrawStringMultiLine(x, right, y, bottom, STR_NEWGRF_SETTINGS_NO_INFO); + tr.top = DrawStringMultiLine(tr, STR_NEWGRF_SETTINGS_NO_INFO); } } @@ -212,7 +213,7 @@ struct NewGRFParametersWindow : public Window { } case WID_NP_BACKGROUND: - this->line_height = std::max(SETTING_BUTTON_HEIGHT, FONT_HEIGHT_NORMAL) + WD_MATRIX_TOP + WD_MATRIX_BOTTOM; + this->line_height = std::max(SETTING_BUTTON_HEIGHT, FONT_HEIGHT_NORMAL) + padding.height; resize->width = 1; resize->height = this->line_height; @@ -221,14 +222,14 @@ struct NewGRFParametersWindow : public Window { case WID_NP_DESCRIPTION: /* Minimum size of 4 lines. The 500 is the default size of the window. */ - Dimension suggestion = {500 - WD_FRAMERECT_LEFT - WD_FRAMERECT_RIGHT, (uint)FONT_HEIGHT_NORMAL * 4 + WD_TEXTPANEL_TOP + WD_TEXTPANEL_BOTTOM}; + Dimension suggestion = {500U - WidgetDimensions::scaled.frametext.Horizontal(), (uint)FONT_HEIGHT_NORMAL * 4 + WidgetDimensions::scaled.frametext.Vertical()}; for (uint i = 0; i < this->grf_config->param_info.size(); i++) { const GRFParameterInfo *par_info = this->grf_config->param_info[i]; if (par_info == nullptr) continue; const char *desc = GetGRFStringFromGRFText(par_info->desc); if (desc == nullptr) continue; Dimension d = GetStringMultiLineBoundingBox(desc, suggestion); - d.height += WD_TEXTPANEL_TOP + WD_TEXTPANEL_BOTTOM; + d.height += WidgetDimensions::scaled.frametext.Vertical(); suggestion = maxdim(d, suggestion); } size->height = suggestion.height; @@ -252,18 +253,17 @@ struct NewGRFParametersWindow : public Window { if (par_info == nullptr) return; const char *desc = GetGRFStringFromGRFText(par_info->desc); if (desc == nullptr) return; - DrawStringMultiLine(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_TEXTPANEL_TOP, r.bottom - WD_TEXTPANEL_BOTTOM, desc, TC_BLACK); + DrawStringMultiLine(r.Shrink(WidgetDimensions::scaled.framerect), desc, TC_BLACK); return; } else if (widget != WID_NP_BACKGROUND) { return; } + Rect ir = r.Shrink(WidgetDimensions::scaled.frametext, RectPadding::zero); bool rtl = _current_text_dir == TD_RTL; - uint buttons_left = rtl ? r.right - SETTING_BUTTON_WIDTH - 3 : r.left + 4; - uint text_left = r.left + (rtl ? WD_FRAMERECT_LEFT : SETTING_BUTTON_WIDTH + 8); - uint text_right = r.right - (rtl ? SETTING_BUTTON_WIDTH + 8 : WD_FRAMERECT_RIGHT); + uint buttons_left = rtl ? ir.right - SETTING_BUTTON_WIDTH : ir.left; + Rect tr = ir.Indent(SETTING_BUTTON_WIDTH + WidgetDimensions::scaled.hsep_wide, rtl); - int y = r.top; int button_y_offset = (this->line_height - SETTING_BUTTON_HEIGHT) / 2; int text_y_offset = (this->line_height - FONT_HEIGHT_NORMAL) / 2; for (uint i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < this->vscroll->GetCount(); i++) { @@ -273,13 +273,13 @@ struct NewGRFParametersWindow : public Window { bool selected = (i == this->clicked_row); if (par_info->type == PTYPE_BOOL) { - DrawBoolButton(buttons_left, y + button_y_offset, current_value != 0, this->editable); + DrawBoolButton(buttons_left, ir.top + button_y_offset, current_value != 0, this->editable); SetDParam(2, par_info->GetValue(this->grf_config) == 0 ? STR_CONFIG_SETTING_OFF : STR_CONFIG_SETTING_ON); } else if (par_info->type == PTYPE_UINT_ENUM) { if (par_info->complete_labels) { - DrawDropDownButton(buttons_left, y + button_y_offset, COLOUR_YELLOW, this->clicked_row == i && this->clicked_dropdown, this->editable); + DrawDropDownButton(buttons_left, ir.top + button_y_offset, COLOUR_YELLOW, this->clicked_row == i && this->clicked_dropdown, this->editable); } else { - DrawArrowButtons(buttons_left, y + button_y_offset, COLOUR_YELLOW, (this->clicked_button == i) ? 1 + (this->clicked_increase != rtl) : 0, this->editable && current_value > par_info->min_value, this->editable && current_value < par_info->max_value); + DrawArrowButtons(buttons_left, ir.top + button_y_offset, COLOUR_YELLOW, (this->clicked_button == i) ? 1 + (this->clicked_increase != rtl) : 0, this->editable && current_value > par_info->min_value, this->editable && current_value < par_info->max_value); } SetDParam(2, STR_JUST_INT); SetDParam(3, current_value); @@ -301,8 +301,8 @@ struct NewGRFParametersWindow : public Window { SetDParam(1, i + 1); } - DrawString(text_left, text_right, y + text_y_offset, STR_NEWGRF_PARAMETERS_SETTING, selected ? TC_WHITE : TC_LIGHT_BLUE); - y += this->line_height; + DrawString(tr.left, tr.right, ir.top + text_y_offset, STR_NEWGRF_PARAMETERS_SETTING, selected ? TC_WHITE : TC_LIGHT_BLUE); + ir.top += this->line_height; } } @@ -347,10 +347,9 @@ struct NewGRFParametersWindow : public Window { this->clicked_dropdown = false; } - const NWidgetBase *wid = this->GetWidget(WID_NP_BACKGROUND); - int x = pt.x - wid->pos_x; - if (_current_text_dir == TD_RTL) x = wid->current_x - 1 - x; - x -= 4; + Rect r = this->GetWidget(widget)->GetCurrentRect().Shrink(WidgetDimensions::scaled.frametext, RectPadding::zero); + int x = pt.x - r.left; + if (_current_text_dir == TD_RTL) x = r.Width() - 1 - x; GRFParameterInfo *par_info = (num < this->grf_config->param_info.size()) ? this->grf_config->param_info[num] : nullptr; if (par_info == nullptr) par_info = GetDummyParameterInfo(num); @@ -364,8 +363,7 @@ struct NewGRFParametersWindow : public Window { this->clicked_dropdown = false; this->closing_dropdown = false; } else { - const NWidgetBase *wid = this->GetWidget(WID_NP_BACKGROUND); - int rel_y = (pt.y - (int)wid->pos_y) % this->line_height; + int rel_y = (pt.y - r.top) % this->line_height; Rect wi_rect; wi_rect.left = pt.x - (_current_text_dir == TD_RTL ? SETTING_BUTTON_WIDTH - 1 - x : x);; @@ -730,26 +728,29 @@ struct NewGRFWindow : public Window, NewGRFScanCallback { switch (widget) { case WID_NS_FILE_LIST: { - Dimension d = maxdim(GetSpriteSize(SPR_SQUARE), GetSpriteSize(SPR_WARNING_SIGN)); - resize->height = std::max(d.height + 2U, FONT_HEIGHT_NORMAL + 2U); - size->height = std::max(size->height, WD_FRAMERECT_TOP + 6 * resize->height + WD_FRAMERECT_BOTTOM); + Dimension d = maxdim(GetScaledSpriteSize(SPR_SQUARE), GetScaledSpriteSize(SPR_WARNING_SIGN)); + resize->height = std::max(d.height + 2U, FONT_HEIGHT_NORMAL); + size->height = std::max(size->height, padding.height + 6 * resize->height); break; } case WID_NS_AVAIL_LIST: - resize->height = std::max(12, FONT_HEIGHT_NORMAL + 2); - size->height = std::max(size->height, WD_FRAMERECT_TOP + 8 * resize->height + WD_FRAMERECT_BOTTOM); + { + Dimension d = maxdim(GetScaledSpriteSize(SPR_SQUARE), GetScaledSpriteSize(SPR_WARNING_SIGN)); + resize->height = std::max(d.height + 2U, FONT_HEIGHT_NORMAL); + size->height = std::max(size->height, padding.height + 8 * resize->height); break; + } case WID_NS_NEWGRF_INFO_TITLE: { Dimension dim = GetStringBoundingBox(STR_NEWGRF_SETTINGS_INFO_TITLE); - size->height = std::max(size->height, dim.height + WD_FRAMETEXT_TOP + WD_FRAMETEXT_BOTTOM); - size->width = std::max(size->width, dim.width + WD_FRAMETEXT_LEFT + WD_FRAMETEXT_RIGHT); + size->height = std::max(size->height, dim.height + WidgetDimensions::scaled.frametext.Vertical()); + size->width = std::max(size->width, dim.width + WidgetDimensions::scaled.frametext.Horizontal()); break; } case WID_NS_NEWGRF_INFO: - size->height = std::max(size->height, WD_FRAMERECT_TOP + 10 * FONT_HEIGHT_NORMAL + WD_FRAMERECT_BOTTOM + padding.height + 2); + size->height = std::max(size->height, WidgetDimensions::scaled.framerect.Vertical() + 10 * FONT_HEIGHT_NORMAL); break; case WID_NS_PRESET_LIST: { @@ -833,10 +834,11 @@ struct NewGRFWindow : public Window, NewGRFScanCallback { { switch (widget) { case WID_NS_FILE_LIST: { - GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, PC_BLACK); + const Rect br = r.Shrink(WidgetDimensions::scaled.bevel); + GfxFillRect(br, PC_BLACK); + Rect tr = r.Shrink(WidgetDimensions::scaled.framerect); uint step_height = this->GetWidget(WID_NS_FILE_LIST)->resize_y; - uint y = r.top + WD_FRAMERECT_TOP; Dimension square = GetSpriteSize(SPR_SQUARE); Dimension warning = GetSpriteSize(SPR_WARNING_SIGN); int square_offset_y = (step_height - square.height) / 2; @@ -844,10 +846,10 @@ struct NewGRFWindow : public Window, NewGRFScanCallback { int offset_y = (step_height - FONT_HEIGHT_NORMAL) / 2; bool rtl = _current_text_dir == TD_RTL; - uint text_left = rtl ? r.left + WD_FRAMERECT_LEFT : r.left + square.width + 15; - uint text_right = rtl ? r.right - square.width - 15 : r.right - WD_FRAMERECT_RIGHT; - uint square_left = rtl ? r.right - square.width - 5 : r.left + 5; - uint warning_left = rtl ? r.right - square.width - warning.width - 10 : r.left + square.width + 10; + uint text_left = rtl ? tr.left : tr.left + square.width + 13; + uint text_right = rtl ? tr.right - square.width - 13 : tr.right; + uint square_left = rtl ? tr.right - square.width - 3 : tr.left + 3; + uint warning_left = rtl ? tr.right - square.width - warning.width - 8 : tr.left + square.width + 8; int i = 0; for (const GRFConfig *c = this->actives; c != nullptr; c = c->next, i++) { @@ -857,35 +859,36 @@ struct NewGRFWindow : public Window, NewGRFScanCallback { PaletteID pal = this->GetPalette(c); if (h) { - GfxFillRect(r.left + 1, y, r.right - 1, y + step_height - 1, PC_DARK_BLUE); + GfxFillRect(br.left, tr.top, br.right, tr.top + step_height - 1, PC_DARK_BLUE); } else if (i == this->active_over) { /* Get index of current selection. */ int active_sel_pos = 0; for (GRFConfig *c = this->actives; c != nullptr && c != this->active_sel; c = c->next, active_sel_pos++) {} if (active_sel_pos != this->active_over) { - uint top = this->active_over < active_sel_pos ? y + 1 : y + step_height - 2; - GfxFillRect(r.left + WD_FRAMERECT_LEFT, top - 1, r.right - WD_FRAMERECT_RIGHT, top + 1, PC_GREY); + uint top = this->active_over < active_sel_pos ? tr.top + 1 : tr.top + step_height - 2; + GfxFillRect(tr.left, top - 1, tr.right, top + 1, PC_GREY); } } - DrawSprite(SPR_SQUARE, pal, square_left, y + square_offset_y); - if (c->error != nullptr) DrawSprite(SPR_WARNING_SIGN, 0, warning_left, y + warning_offset_y); + DrawSprite(SPR_SQUARE, pal, square_left, tr.top + square_offset_y); + if (c->error != nullptr) DrawSprite(SPR_WARNING_SIGN, 0, warning_left, tr.top + warning_offset_y); uint txtoffset = c->error == nullptr ? 0 : warning.width; - DrawString(text_left + (rtl ? 0 : txtoffset), text_right - (rtl ? txtoffset : 0), y + offset_y, text, h ? TC_WHITE : TC_ORANGE); - y += step_height; + DrawString(text_left + (rtl ? 0 : txtoffset), text_right - (rtl ? txtoffset : 0), tr.top + offset_y, text, h ? TC_WHITE : TC_ORANGE); + tr.top += step_height; } } if (i == this->active_over && this->vscroll->IsVisible(i)) { // Highlight is after the last GRF entry. - GfxFillRect(r.left + WD_FRAMERECT_LEFT, y, r.right - WD_FRAMERECT_RIGHT, y + 2, PC_GREY); + GfxFillRect(tr.left, tr.top, tr.right, tr.top + 2, PC_GREY); } break; } case WID_NS_AVAIL_LIST: { - GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, this->active_over == -2 ? PC_DARK_GREY : PC_BLACK); + const Rect br = r.Shrink(WidgetDimensions::scaled.bevel); + GfxFillRect(br, this->active_over == -2 ? PC_DARK_GREY : PC_BLACK); + Rect tr = r.Shrink(WidgetDimensions::scaled.framerect); uint step_height = this->GetWidget(WID_NS_AVAIL_LIST)->resize_y; int offset_y = (step_height - FONT_HEIGHT_NORMAL) / 2; - uint y = r.top + WD_FRAMERECT_TOP; uint min_index = this->vscroll2->GetPosition(); uint max_index = std::min(min_index + this->vscroll2->GetCapacity(), (uint)this->avails.size()); @@ -894,24 +897,25 @@ struct NewGRFWindow : public Window, NewGRFScanCallback { bool h = (c == this->avail_sel); const char *text = c->GetName(); - if (h) GfxFillRect(r.left + 1, y, r.right - 1, y + step_height - 1, PC_DARK_BLUE); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y + offset_y, text, h ? TC_WHITE : TC_SILVER); - y += step_height; + if (h) GfxFillRect(br.left, tr.top, br.right, tr.top + step_height - 1, PC_DARK_BLUE); + DrawString(tr.left, tr.right, tr.top + offset_y, text, h ? TC_WHITE : TC_SILVER); + tr.top += step_height; } break; } - case WID_NS_NEWGRF_INFO_TITLE: + case WID_NS_NEWGRF_INFO_TITLE: { /* Create the nice grayish rectangle at the details top. */ - GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, PC_DARK_BLUE); - DrawString(r.left, r.right, (r.top + r.bottom - FONT_HEIGHT_NORMAL) / 2, STR_NEWGRF_SETTINGS_INFO_TITLE, TC_FROMSTRING, SA_HOR_CENTER); + GfxFillRect(r.Shrink(WidgetDimensions::scaled.bevel), PC_DARK_BLUE); + DrawString(r.left, r.right, CenterBounds(r.top, r.bottom, FONT_HEIGHT_NORMAL), STR_NEWGRF_SETTINGS_INFO_TITLE, TC_FROMSTRING, SA_HOR_CENTER); break; + } case WID_NS_NEWGRF_INFO: { const GRFConfig *selected = this->active_sel; if (selected == nullptr) selected = this->avail_sel; if (selected != nullptr) { - ShowNewGRFInfo(selected, r.left + WD_FRAMERECT_LEFT, r.top + WD_FRAMERECT_TOP, r.right - WD_FRAMERECT_RIGHT, r.bottom - WD_FRAMERECT_BOTTOM, this->show_params); + ShowNewGRFInfo(selected, r, this->show_params); } break; } @@ -1611,13 +1615,13 @@ public: this->acs->SetupSmallestSize(w, init_array); this->inf->SetupSmallestSize(w, init_array); - uint min_avs_width = this->avs->smallest_x + this->avs->padding_left + this->avs->padding_right; - uint min_acs_width = this->acs->smallest_x + this->acs->padding_left + this->acs->padding_right; - uint min_inf_width = this->inf->smallest_x + this->inf->padding_left + this->inf->padding_right; + uint min_avs_width = this->avs->smallest_x + this->avs->padding.Horizontal(); + uint min_acs_width = this->acs->smallest_x + this->acs->padding.Horizontal(); + uint min_inf_width = this->inf->smallest_x + this->inf->padding.Horizontal(); - uint min_avs_height = this->avs->smallest_y + this->avs->padding_top + this->avs->padding_bottom; - uint min_acs_height = this->acs->smallest_y + this->acs->padding_top + this->acs->padding_bottom; - uint min_inf_height = this->inf->smallest_y + this->inf->padding_top + this->inf->padding_bottom; + uint min_avs_height = this->avs->smallest_y + this->avs->padding.Vertical(); + uint min_acs_height = this->acs->smallest_y + this->acs->padding.Vertical(); + uint min_inf_height = this->inf->smallest_y + this->inf->padding.Vertical(); /* Smallest window is in two column mode. */ this->smallest_x = std::max(min_avs_width, min_acs_width) + INTER_COLUMN_SPACING + min_inf_width; @@ -1647,9 +1651,9 @@ public: { this->StoreSizePosition(sizing, x, y, given_width, given_height); - uint min_avs_width = this->avs->smallest_x + this->avs->padding_left + this->avs->padding_right; - uint min_acs_width = this->acs->smallest_x + this->acs->padding_left + this->acs->padding_right; - uint min_inf_width = this->inf->smallest_x + this->inf->padding_left + this->inf->padding_right; + uint min_avs_width = this->avs->smallest_x + this->avs->padding.Horizontal(); + uint min_acs_width = this->acs->smallest_x + this->acs->padding.Horizontal(); + uint min_inf_width = this->inf->smallest_x + this->inf->padding.Horizontal(); uint min_list_width = std::max(min_avs_width, min_acs_width); // Smallest width of the lists such that they have equal width (incl padding). uint avs_extra_width = min_list_width - min_avs_width; // Additional width needed for avs to reach min_list_width. @@ -1685,10 +1689,10 @@ public: avs_width = ComputeMaxSize(this->avs->smallest_x, this->avs->smallest_x + avs_width, this->avs->GetHorizontalStepSize(sizing)); uint acs_width = given_width - // Remaining space, including horizontal padding. - inf_width - this->inf->padding_left - this->inf->padding_right - - avs_width - this->avs->padding_left - this->avs->padding_right - 2 * INTER_COLUMN_SPACING; + inf_width - this->inf->padding.Horizontal() - + avs_width - this->avs->padding.Horizontal() - 2 * INTER_COLUMN_SPACING; acs_width = ComputeMaxSize(min_acs_width, acs_width, this->acs->GetHorizontalStepSize(sizing)) - - this->acs->padding_left - this->acs->padding_right; + this->acs->padding.Horizontal(); /* Never use fill_y on these; the minimal size is chosen, so that the 3 column view looks nice */ uint avs_height = ComputeMaxSize(this->avs->smallest_y, given_height, this->avs->resize_y); @@ -1696,25 +1700,25 @@ public: /* Assign size and position to the children. */ if (rtl) { - x += this->inf->padding_left; - this->inf->AssignSizePosition(sizing, x, y + this->inf->padding_top, inf_width, inf_height, rtl); - x += inf_width + this->inf->padding_right + INTER_COLUMN_SPACING; + x += this->inf->padding.left; + this->inf->AssignSizePosition(sizing, x, y + this->inf->padding.top, inf_width, inf_height, rtl); + x += inf_width + this->inf->padding.right + INTER_COLUMN_SPACING; } else { - x += this->avs->padding_left; - this->avs->AssignSizePosition(sizing, x, y + this->avs->padding_top, avs_width, avs_height, rtl); - x += avs_width + this->avs->padding_right + INTER_COLUMN_SPACING; + x += this->avs->padding.left; + this->avs->AssignSizePosition(sizing, x, y + this->avs->padding.top, avs_width, avs_height, rtl); + x += avs_width + this->avs->padding.right + INTER_COLUMN_SPACING; } - x += this->acs->padding_left; - this->acs->AssignSizePosition(sizing, x, y + this->acs->padding_top, acs_width, acs_height, rtl); - x += acs_width + this->acs->padding_right + INTER_COLUMN_SPACING; + x += this->acs->padding.left; + this->acs->AssignSizePosition(sizing, x, y + this->acs->padding.top, acs_width, acs_height, rtl); + x += acs_width + this->acs->padding.right + INTER_COLUMN_SPACING; if (rtl) { - x += this->avs->padding_left; - this->avs->AssignSizePosition(sizing, x, y + this->avs->padding_top, avs_width, avs_height, rtl); + x += this->avs->padding.left; + this->avs->AssignSizePosition(sizing, x, y + this->avs->padding.top, avs_width, avs_height, rtl); } else { - x += this->inf->padding_left; - this->inf->AssignSizePosition(sizing, x, y + this->inf->padding_top, inf_width, inf_height, rtl); + x += this->inf->padding.left; + this->inf->AssignSizePosition(sizing, x, y + this->inf->padding.top, inf_width, inf_height, rtl); } } else { /* Two columns, all space in extra_width goes to both lists. Since the lists are underneath each other, @@ -1724,8 +1728,8 @@ public: uint acs_width = ComputeMaxSize(this->acs->smallest_x, this->acs->smallest_x + acs_extra_width + extra_width, this->acs->GetHorizontalStepSize(sizing)); - uint min_avs_height = (!this->editable) ? 0 : this->avs->smallest_y + this->avs->padding_top + this->avs->padding_bottom + INTER_LIST_SPACING; - uint min_acs_height = this->acs->smallest_y + this->acs->padding_top + this->acs->padding_bottom; + uint min_avs_height = (!this->editable) ? 0 : this->avs->smallest_y + this->avs->padding.Vertical() + INTER_LIST_SPACING; + uint min_acs_height = this->acs->smallest_y + this->acs->padding.Vertical(); uint extra_height = given_height - min_acs_height - min_avs_height; /* Never use fill_y on these; instead use the INTER_LIST_SPACING as filler */ @@ -1735,29 +1739,29 @@ public: /* Assign size and position to the children. */ if (rtl) { - x += this->inf->padding_left; - this->inf->AssignSizePosition(sizing, x, y + this->inf->padding_top, inf_width, inf_height, rtl); - x += inf_width + this->inf->padding_right + INTER_COLUMN_SPACING; + x += this->inf->padding.left; + this->inf->AssignSizePosition(sizing, x, y + this->inf->padding.top, inf_width, inf_height, rtl); + x += inf_width + this->inf->padding.right + INTER_COLUMN_SPACING; - this->acs->AssignSizePosition(sizing, x + this->acs->padding_left, y + this->acs->padding_top, acs_width, acs_height, rtl); + this->acs->AssignSizePosition(sizing, x + this->acs->padding.left, y + this->acs->padding.top, acs_width, acs_height, rtl); if (this->editable) { - this->avs->AssignSizePosition(sizing, x + this->avs->padding_left, y + given_height - avs_height - this->avs->padding_bottom, avs_width, avs_height, rtl); + this->avs->AssignSizePosition(sizing, x + this->avs->padding.left, y + given_height - avs_height - this->avs->padding.bottom, avs_width, avs_height, rtl); } else { this->avs->AssignSizePosition(sizing, 0, 0, this->avs->smallest_x, this->avs->smallest_y, rtl); } } else { - this->acs->AssignSizePosition(sizing, x + this->acs->padding_left, y + this->acs->padding_top, acs_width, acs_height, rtl); + this->acs->AssignSizePosition(sizing, x + this->acs->padding.left, y + this->acs->padding.top, acs_width, acs_height, rtl); if (this->editable) { - this->avs->AssignSizePosition(sizing, x + this->avs->padding_left, y + given_height - avs_height - this->avs->padding_bottom, avs_width, avs_height, rtl); + this->avs->AssignSizePosition(sizing, x + this->avs->padding.left, y + given_height - avs_height - this->avs->padding.bottom, avs_width, avs_height, rtl); } else { this->avs->AssignSizePosition(sizing, 0, 0, this->avs->smallest_x, this->avs->smallest_y, rtl); } - uint dx = this->acs->current_x + this->acs->padding_left + this->acs->padding_right; + uint dx = this->acs->current_x + this->acs->padding.Horizontal(); if (this->editable) { - dx = std::max(dx, this->avs->current_x + this->avs->padding_left + this->avs->padding_right); + dx = std::max(dx, this->avs->current_x + this->avs->padding.Horizontal()); } - x += dx + INTER_COLUMN_SPACING + this->inf->padding_left; - this->inf->AssignSizePosition(sizing, x, y + this->inf->padding_top, inf_width, inf_height, rtl); + x += dx + INTER_COLUMN_SPACING + this->inf->padding.left; + this->inf->AssignSizePosition(sizing, x, y + this->inf->padding.top, inf_width, inf_height, rtl); } } } @@ -1780,8 +1784,8 @@ public: } }; -const uint NWidgetNewGRFDisplay::INTER_LIST_SPACING = WD_RESIZEBOX_WIDTH + 1; -const uint NWidgetNewGRFDisplay::INTER_COLUMN_SPACING = WD_RESIZEBOX_WIDTH; +const uint NWidgetNewGRFDisplay::INTER_COLUMN_SPACING = 12; +const uint NWidgetNewGRFDisplay::INTER_LIST_SPACING = NWidgetNewGRFDisplay::INTER_COLUMN_SPACING + 1; const uint NWidgetNewGRFDisplay::MAX_EXTRA_INFO_WIDTH = 150; const uint NWidgetNewGRFDisplay::MIN_EXTRA_FOR_3_COLUMNS = 50; @@ -1789,7 +1793,7 @@ static const NWidgetPart _nested_newgrf_actives_widgets[] = { /* Left side, presets. */ NWidget(NWID_HORIZONTAL), NWidget(WWT_TEXT, COLOUR_MAUVE), SetDataTip(STR_NEWGRF_SETTINGS_SELECT_PRESET, STR_NULL), - SetPadding(0, WD_FRAMETEXT_RIGHT, 0, 0), + SetPadding(0, WidgetDimensions::unscaled.frametext.right, 0, 0), NWidget(WWT_DROPDOWN, COLOUR_YELLOW, WID_NS_PRESET_LIST), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_JUST_STRING, STR_NEWGRF_SETTINGS_PRESET_LIST_TOOLTIP), EndContainer(), @@ -1800,10 +1804,10 @@ static const NWidgetPart _nested_newgrf_actives_widgets[] = { SetDataTip(STR_NEWGRF_SETTINGS_PRESET_DELETE, STR_NEWGRF_SETTINGS_PRESET_DELETE_TOOLTIP), EndContainer(), - NWidget(NWID_SPACER), SetMinimalSize(0, WD_RESIZEBOX_WIDTH), SetResize(1, 0), SetFill(1, 0), + NWidget(NWID_SPACER), SetMinimalSize(0, NWidgetNewGRFDisplay::INTER_COLUMN_SPACING), SetResize(1, 0), SetFill(1, 0), NWidget(WWT_PANEL, COLOUR_MAUVE), NWidget(WWT_LABEL, COLOUR_MAUVE), SetDataTip(STR_NEWGRF_SETTINGS_ACTIVE_LIST, STR_NULL), - SetFill(1, 0), SetResize(1, 0), SetPadding(3, WD_FRAMETEXT_RIGHT, 0, WD_FRAMETEXT_LEFT), + SetFill(1, 0), SetResize(1, 0), SetPadding(3, WidgetDimensions::unscaled.frametext.right, 0, WidgetDimensions::unscaled.frametext.left), /* Left side, active grfs. */ NWidget(NWID_HORIZONTAL), SetPadding(0, 2, 0, 2), NWidget(WWT_PANEL, COLOUR_MAUVE), @@ -1815,7 +1819,7 @@ static const NWidgetPart _nested_newgrf_actives_widgets[] = { EndContainer(), /* Buttons. */ NWidget(NWID_SELECTION, INVALID_COLOUR, WID_NS_SHOW_REMOVE), - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPadding(2, 2, 2, 2), SetPIP(0, WD_RESIZEBOX_WIDTH, 0), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPadding(2, 2, 2, 2), SetPIP(0, NWidgetNewGRFDisplay::INTER_COLUMN_SPACING, 0), NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_NS_REMOVE), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_NEWGRF_SETTINGS_REMOVE, STR_NEWGRF_SETTINGS_REMOVE_TOOLTIP), NWidget(NWID_VERTICAL), @@ -1841,10 +1845,10 @@ static const NWidgetPart _nested_newgrf_actives_widgets[] = { static const NWidgetPart _nested_newgrf_availables_widgets[] = { NWidget(WWT_PANEL, COLOUR_MAUVE), NWidget(WWT_LABEL, COLOUR_MAUVE), SetDataTip(STR_NEWGRF_SETTINGS_INACTIVE_LIST, STR_NULL), - SetFill(1, 0), SetResize(1, 0), SetPadding(3, WD_FRAMETEXT_RIGHT, 0, WD_FRAMETEXT_LEFT), + SetFill(1, 0), SetResize(1, 0), SetPadding(3, WidgetDimensions::unscaled.frametext.right, 0, WidgetDimensions::unscaled.frametext.left), /* Left side, available grfs, filter edit box. */ - NWidget(NWID_HORIZONTAL), SetPadding(WD_TEXTPANEL_TOP, 0, WD_TEXTPANEL_BOTTOM, 0), - SetPIP(WD_FRAMETEXT_LEFT, WD_FRAMETEXT_RIGHT, WD_FRAMETEXT_RIGHT), + NWidget(NWID_HORIZONTAL), SetPadding(WidgetDimensions::unscaled.frametext.top, 0, WidgetDimensions::unscaled.frametext.bottom, 0), + SetPIP(WidgetDimensions::unscaled.frametext.left, WidgetDimensions::unscaled.frametext.right, WidgetDimensions::unscaled.frametext.right), NWidget(WWT_TEXT, COLOUR_MAUVE), SetFill(0, 1), SetDataTip(STR_NEWGRF_FILTER_TITLE, STR_NULL), NWidget(WWT_EDITBOX, COLOUR_MAUVE, WID_NS_FILTER), SetFill(1, 0), SetMinimalSize(50, 12), SetResize(1, 0), SetDataTip(STR_LIST_FILTER_OSKTITLE, STR_LIST_FILTER_TOOLTIP), @@ -1859,7 +1863,7 @@ static const NWidgetPart _nested_newgrf_availables_widgets[] = { NWidget(NWID_VSCROLLBAR, COLOUR_MAUVE, WID_NS_SCROLL2BAR), EndContainer(), /* Left side, available grfs, buttons. */ - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPadding(2, 2, 2, 2), SetPIP(0, WD_RESIZEBOX_WIDTH, 0), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPadding(2, 2, 2, 2), SetPIP(0, NWidgetNewGRFDisplay::INTER_COLUMN_SPACING, 0), NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_NS_ADD), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_NEWGRF_SETTINGS_ADD, STR_NEWGRF_SETTINGS_ADD_FILE_TOOLTIP), NWidget(NWID_VERTICAL), @@ -1892,7 +1896,7 @@ static const NWidgetPart _nested_newgrf_infopanel_widgets[] = { EndContainer(), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_NS_SHOW_APPLY), /* Right side, buttons. */ - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(0, WD_RESIZEBOX_WIDTH, 0), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(0, NWidgetNewGRFDisplay::INTER_COLUMN_SPACING, 0), NWidget(NWID_VERTICAL), NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_NS_SET_PARAMETERS), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_NEWGRF_SETTINGS_SET_PARAMETERS, STR_NULL), @@ -1930,7 +1934,7 @@ static const NWidgetPart _nested_newgrf_widgets[] = { NWidget(WWT_DEFSIZEBOX, COLOUR_MAUVE), EndContainer(), NWidget(WWT_PANEL, COLOUR_MAUVE), - NWidgetFunction(NewGRFDisplay), SetPadding(WD_RESIZEBOX_WIDTH, WD_RESIZEBOX_WIDTH, 2, WD_RESIZEBOX_WIDTH), + NWidgetFunction(NewGRFDisplay), SetPadding(NWidgetNewGRFDisplay::INTER_COLUMN_SPACING, NWidgetNewGRFDisplay::INTER_COLUMN_SPACING, 2, NWidgetNewGRFDisplay::INTER_COLUMN_SPACING), /* Resize button. */ NWidget(NWID_HORIZONTAL), NWidget(NWID_SPACER), SetFill(1, 0), SetResize(1, 0), @@ -2007,11 +2011,13 @@ static const NWidgetPart _nested_save_preset_widgets[] = { EndContainer(), NWidget(WWT_PANEL, COLOUR_GREY), NWidget(NWID_HORIZONTAL), - NWidget(WWT_INSET, COLOUR_GREY, WID_SVP_PRESET_LIST), SetPadding(2, 1, 0, 2), + NWidget(WWT_INSET, COLOUR_GREY, WID_SVP_PRESET_LIST), SetPadding(2, 1, 2, 2), SetDataTip(0x0, STR_SAVE_PRESET_LIST_TOOLTIP), SetResize(1, 10), SetScrollbar(WID_SVP_SCROLLBAR), EndContainer(), NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_SVP_SCROLLBAR), EndContainer(), - NWidget(WWT_EDITBOX, COLOUR_GREY, WID_SVP_EDITBOX), SetPadding(3, 2, 2, 2), SetFill(1, 0), SetResize(1, 0), + EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY), + NWidget(WWT_EDITBOX, COLOUR_GREY, WID_SVP_EDITBOX), SetPadding(2, 2, 2, 2), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_SAVE_PRESET_TITLE, STR_SAVE_PRESET_EDITBOX_TOOLTIP), EndContainer(), NWidget(NWID_HORIZONTAL), @@ -2074,14 +2080,14 @@ struct SavePresetWindow : public Window { { switch (widget) { case WID_SVP_PRESET_LIST: { - resize->height = FONT_HEIGHT_NORMAL + 2U; + resize->height = FONT_HEIGHT_NORMAL; size->height = 0; for (uint i = 0; i < this->presets.size(); i++) { Dimension d = GetStringBoundingBox(this->presets[i].c_str()); - size->width = std::max(size->width, d.width + WD_FRAMETEXT_LEFT + WD_FRAMETEXT_RIGHT); + size->width = std::max(size->width, d.width + padding.width); resize->height = std::max(resize->height, d.height); } - size->height = ClampU((uint)this->presets.size(), 5, 20) * resize->height + 1; + size->height = ClampU((uint)this->presets.size(), 5, 20) * resize->height + padding.height; break; } } @@ -2091,20 +2097,21 @@ struct SavePresetWindow : public Window { { switch (widget) { case WID_SVP_PRESET_LIST: { - GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, PC_BLACK); + const Rect br = r.Shrink(WidgetDimensions::scaled.bevel); + GfxFillRect(br, PC_BLACK); uint step_height = this->GetWidget(WID_SVP_PRESET_LIST)->resize_y; int offset_y = (step_height - FONT_HEIGHT_NORMAL) / 2; - uint y = r.top + WD_FRAMERECT_TOP; + Rect tr = r.Shrink(WidgetDimensions::scaled.framerect); uint min_index = this->vscroll->GetPosition(); uint max_index = std::min(min_index + this->vscroll->GetCapacity(), (uint)this->presets.size()); for (uint i = min_index; i < max_index; i++) { - if ((int)i == this->selected) GfxFillRect(r.left + 1, y, r.right - 1, y + step_height - 2, PC_DARK_BLUE); + if ((int)i == this->selected) GfxFillRect(br.left, tr.top, br.right, tr.top + step_height - 1, PC_DARK_BLUE); const char *text = this->presets[i].c_str(); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right, y + offset_y, text, ((int)i == this->selected) ? TC_WHITE : TC_SILVER); - y += step_height; + DrawString(tr.left, tr.right, tr.top + offset_y, text, ((int)i == this->selected) ? TC_WHITE : TC_SILVER); + tr.top += step_height; } break; } @@ -2158,12 +2165,10 @@ static void ShowSavePresetWindow(const char *initial_text) static const NWidgetPart _nested_scan_progress_widgets[] = { NWidget(WWT_CAPTION, COLOUR_GREY), SetDataTip(STR_NEWGRF_SCAN_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), NWidget(WWT_PANEL, COLOUR_GREY), - NWidget(NWID_HORIZONTAL), SetPIP(20, 0, 20), - NWidget(NWID_VERTICAL), SetPIP(11, 8, 11), - NWidget(WWT_LABEL, INVALID_COLOUR), SetDataTip(STR_NEWGRF_SCAN_MESSAGE, STR_NULL), SetFill(1, 0), - NWidget(WWT_EMPTY, INVALID_COLOUR, WID_SP_PROGRESS_BAR), SetFill(1, 0), - NWidget(WWT_EMPTY, INVALID_COLOUR, WID_SP_PROGRESS_TEXT), SetFill(1, 0), - EndContainer(), + NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_wide, 0), SetPadding(WidgetDimensions::unscaled.modalpopup), + NWidget(WWT_LABEL, INVALID_COLOUR), SetDataTip(STR_NEWGRF_SCAN_MESSAGE, STR_NULL), SetFill(1, 0), + NWidget(WWT_EMPTY, INVALID_COLOUR, WID_SP_PROGRESS_BAR), SetFill(1, 0), + NWidget(WWT_EMPTY, INVALID_COLOUR, WID_SP_PROGRESS_TEXT), SetFill(1, 0), SetMinimalSize(400, 0), EndContainer(), EndContainer(), }; @@ -2200,8 +2205,8 @@ struct ScanProgressWindow : public Window { SetDParamMaxValue(0, 100); *size = GetStringBoundingBox(STR_GENERATION_PROGRESS); /* We need some spacing for the 'border' */ - size->height += 8; - size->width += 8; + size->height += WidgetDimensions::scaled.frametext.Horizontal(); + size->width += WidgetDimensions::scaled.frametext.Vertical(); break; } @@ -2210,8 +2215,8 @@ struct ScanProgressWindow : public Window { SetDParamMaxDigits(1, 4); /* We really don't know the width. We could determine it by scanning the NewGRFs, * but this is the status window for scanning them... */ - size->width = std::max(400U, GetStringBoundingBox(STR_NEWGRF_SCAN_STATUS).width); - size->height = FONT_HEIGHT_NORMAL * 2 + WD_PAR_VSEP_NORMAL; + size->width = std::max(size->width, GetStringBoundingBox(STR_NEWGRF_SCAN_STATUS).width); + size->height = FONT_HEIGHT_NORMAL * 2 + WidgetDimensions::scaled.vsep_normal; break; } } @@ -2221,11 +2226,12 @@ struct ScanProgressWindow : public Window { switch (widget) { case WID_SP_PROGRESS_BAR: { /* Draw the % complete with a bar and a text */ - DrawFrameRect(r.left, r.top, r.right, r.bottom, COLOUR_GREY, FR_BORDERONLY); + DrawFrameRect(r, COLOUR_GREY, FR_BORDERONLY | FR_LOWERED); + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); uint percent = scanned * 100 / std::max(1U, _settings_client.gui.last_newgrf_count); - DrawFrameRect(r.left + 1, r.top + 1, (int)((r.right - r.left - 2) * percent / 100) + r.left + 1, r.bottom - 1, COLOUR_MAUVE, FR_NONE); + DrawFrameRect(ir.WithWidth(ir.Width() * percent / 100, false), COLOUR_MAUVE, FR_NONE); SetDParam(0, percent); - DrawString(r.left, r.right, r.top + 5, STR_GENERATION_PROGRESS, TC_FROMSTRING, SA_HOR_CENTER); + DrawString(ir.left, ir.right, CenterBounds(ir.top, ir.bottom, FONT_HEIGHT_NORMAL), STR_GENERATION_PROGRESS, TC_FROMSTRING, SA_HOR_CENTER); break; } @@ -2234,7 +2240,7 @@ struct ScanProgressWindow : public Window { SetDParam(1, _settings_client.gui.last_newgrf_count); DrawString(r.left, r.right, r.top, STR_NEWGRF_SCAN_STATUS, TC_FROMSTRING, SA_HOR_CENTER); - DrawString(r.left, r.right, r.top + FONT_HEIGHT_NORMAL + WD_PAR_VSEP_NORMAL, this->last_name == nullptr ? "" : this->last_name, TC_BLACK, SA_HOR_CENTER); + DrawString(r.left, r.right, r.top + FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal, this->last_name == nullptr ? "" : this->last_name, TC_BLACK, SA_HOR_CENTER); break; } } diff --git a/src/newgrf_sound.cpp b/src/newgrf_sound.cpp index 48f2105517..fce0ba9e11 100644 --- a/src/newgrf_sound.cpp +++ b/src/newgrf_sound.cpp @@ -181,11 +181,12 @@ SoundID GetNewGRFSoundID(const GRFFile *file, SoundID sound_id) * Checks whether a NewGRF wants to play a different vehicle sound effect. * @param v Vehicle to play sound effect for. * @param event Trigger for the sound effect. + * @param force Should we play the sound effect even if vehicle sound effects are muted? * @return false if the default sound effect shall be played instead. */ -bool PlayVehicleSound(const Vehicle *v, VehicleSoundEvent event) +bool PlayVehicleSound(const Vehicle *v, VehicleSoundEvent event, bool force) { - if (!_settings_client.sound.vehicle) return true; + if (!_settings_client.sound.vehicle && !force) return true; const GRFFile *file = v->GetGRF(); uint16 callback; diff --git a/src/newgrf_sound.h b/src/newgrf_sound.h index d908173ac8..5b1d1cbc57 100644 --- a/src/newgrf_sound.h +++ b/src/newgrf_sound.h @@ -34,7 +34,7 @@ bool LoadNewGRFSound(SoundEntry *sound); SoundID GetNewGRFSoundID(const struct GRFFile *file, SoundID sound_id); SoundEntry *GetSound(SoundID sound_id); uint GetNumSounds(); -bool PlayVehicleSound(const Vehicle *v, VehicleSoundEvent event); +bool PlayVehicleSound(const Vehicle *v, VehicleSoundEvent event, bool force = false); void PlayTileSound(const struct GRFFile *file, SoundID sound_id, TileIndex tile); #endif /* NEWGRF_SOUND_H */ diff --git a/src/newgrf_spritegroup.h b/src/newgrf_spritegroup.h index b172667612..af28950a88 100644 --- a/src/newgrf_spritegroup.h +++ b/src/newgrf_spritegroup.h @@ -50,7 +50,7 @@ struct ResolverObject; /* SPRITE_WIDTH is 24. ECS has roughly 30 sprite groups per real sprite. * Adding an 'extra' margin would be assuming 64 sprite groups per real * sprite. 64 = 2^6, so 2^30 should be enough (for now) */ -typedef Pool SpriteGroupPool; +typedef Pool SpriteGroupPool; extern SpriteGroupPool _spritegroup_pool; /* Common wrapper for all the different sprite group types */ diff --git a/src/newgrf_station.cpp b/src/newgrf_station.cpp index 698d360a0c..bf938eab0f 100644 --- a/src/newgrf_station.cpp +++ b/src/newgrf_station.cpp @@ -683,7 +683,7 @@ int AllocateSpecToStation(const StationSpec *statspec, BaseStation *st, bool exe if (statspec == nullptr || st == nullptr) return 0; - for (i = 1; i < st->num_specs && i < NUM_STATIONSSPECS_PER_STATION; i++) { + for (i = 1; i < st->speclist.size() && i < NUM_STATIONSSPECS_PER_STATION; i++) { if (st->speclist[i].spec == nullptr && st->speclist[i].grfid == 0) break; } @@ -693,7 +693,7 @@ int AllocateSpecToStation(const StationSpec *statspec, BaseStation *st, bool exe * result in slightly "wrong" (as per specs) looking stations, * but it's fairly unlikely that one reaches the limit anyways. */ - for (i = 1; i < st->num_specs && i < NUM_STATIONSSPECS_PER_STATION; i++) { + for (i = 1; i < st->speclist.size() && i < NUM_STATIONSSPECS_PER_STATION; i++) { if (st->speclist[i].spec == statspec) return i; } @@ -701,18 +701,7 @@ int AllocateSpecToStation(const StationSpec *statspec, BaseStation *st, bool exe } if (exec) { - if (i >= st->num_specs) { - st->num_specs = i + 1; - st->speclist = ReallocT(st->speclist, st->num_specs); - - if (st->num_specs == 2) { - /* Initial allocation */ - st->speclist[0].spec = nullptr; - st->speclist[0].grfid = 0; - st->speclist[0].localidx = 0; - } - } - + if (i >= st->speclist.size()) st->speclist.resize(i + 1); st->speclist[i].spec = statspec; st->speclist[i].grfid = statspec->grf_prop.grffile->grfid; st->speclist[i].localidx = statspec->grf_prop.local_id; @@ -749,15 +738,16 @@ void DeallocateSpecFromStation(BaseStation *st, byte specindex) st->speclist[specindex].localidx = 0; /* If this was the highest spec index, reallocate */ - if (specindex == st->num_specs - 1) { - for (; st->speclist[st->num_specs - 1].grfid == 0 && st->num_specs > 1; st->num_specs--) {} + if (specindex == st->speclist.size() - 1) { + size_t num_specs; + for (num_specs = st->speclist.size() - 1; num_specs > 0; num_specs--) { + if (st->speclist[num_specs].grfid != 0) break; + } - if (st->num_specs > 1) { - st->speclist = ReallocT(st->speclist, st->num_specs); + if (num_specs > 0) { + st->speclist.resize(num_specs + 1); } else { - free(st->speclist); - st->num_specs = 0; - st->speclist = nullptr; + st->speclist.clear(); st->cached_anim_triggers = 0; st->cached_cargo_triggers = 0; return; @@ -854,7 +844,7 @@ const StationSpec *GetStationSpec(TileIndex t) const BaseStation *st = BaseStation::GetByTile(t); uint specindex = GetCustomStationSpecIndex(t); - return specindex < st->num_specs ? st->speclist[specindex].spec : nullptr; + return specindex < st->speclist.size() ? st->speclist[specindex].spec : nullptr; } @@ -1050,7 +1040,7 @@ void StationUpdateCachedTriggers(BaseStation *st) /* Combine animation trigger bitmask for all station specs * of this station. */ - for (uint i = 0; i < st->num_specs; i++) { + for (uint i = 0; i < st->speclist.size(); i++) { const StationSpec *ss = st->speclist[i].spec; if (ss != nullptr) { st->cached_anim_triggers |= ss->animation.triggers; diff --git a/src/news_gui.cpp b/src/news_gui.cpp index 1a12dad803..cd53aaf7d9 100644 --- a/src/news_gui.cpp +++ b/src/news_gui.cpp @@ -329,12 +329,14 @@ struct NewsWindow : Window { void DrawNewsBorder(const Rect &r) const { - GfxFillRect(r.left, r.top, r.right, r.bottom, PC_WHITE); + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); + GfxFillRect(ir, PC_WHITE); - GfxFillRect(r.left, r.top, r.left, r.bottom, PC_BLACK); - GfxFillRect(r.right, r.top, r.right, r.bottom, PC_BLACK); - GfxFillRect(r.left, r.top, r.right, r.top, PC_BLACK); - GfxFillRect(r.left, r.bottom, r.right, r.bottom, PC_BLACK); + ir = ir.Expand(1); + GfxFillRect( r.left, r.top, ir.left, r.bottom, PC_BLACK); + GfxFillRect(ir.right, r.top, r.right, r.bottom, PC_BLACK); + GfxFillRect( r.left, r.top, r.right, ir.top, PC_BLACK); + GfxFillRect( r.left, ir.bottom, r.right, r.bottom, PC_BLACK); } Point OnInitialPosition(int16 sm_width, int16 sm_height, int window_number) override @@ -351,7 +353,7 @@ struct NewsWindow : Window { /* Caption is not a real caption (so that the window cannot be moved) * thus it doesn't get the default sizing of a caption. */ Dimension d2 = GetStringBoundingBox(STR_NEWS_MESSAGE_CAPTION); - d2.height += WD_CAPTIONTEXT_TOP + WD_CAPTIONTEXT_BOTTOM; + d2.height += WidgetDimensions::scaled.captiontext.Vertical(); *size = maxdim(*size, d2); return; } @@ -389,8 +391,8 @@ struct NewsWindow : Window { case WID_N_SHOW_GROUP: if (this->ni->reftype1 == NR_VEHICLE) { Dimension d2 = GetStringBoundingBox(this->GetWidget(WID_N_SHOW_GROUP)->widget_data); - d2.height += WD_CAPTIONTEXT_TOP + WD_CAPTIONTEXT_BOTTOM; - d2.width += WD_CAPTIONTEXT_LEFT + WD_CAPTIONTEXT_RIGHT; + d2.height += WidgetDimensions::scaled.captiontext.Vertical(); + d2.width += WidgetDimensions::scaled.captiontext.Horizontal(); *size = d2; } else { /* Hide 'Show group window' button if this news is not about a vehicle. */ @@ -466,7 +468,7 @@ struct NewsWindow : Window { case WID_N_VEH_SPR: { assert(this->ni->reftype1 == NR_ENGINE); EngineID engine = this->ni->ref1; - DrawVehicleEngine(r.left, r.right, (r.left + r.right) / 2, (r.top + r.bottom) / 2, engine, GetEnginePalette(engine, _local_company), EIT_PREVIEW); + DrawVehicleEngine(r.left, r.right, CenterBounds(r.left, r.right, 0), CenterBounds(r.top, r.bottom, 0), engine, GetEnginePalette(engine, _local_company), EIT_PREVIEW); GfxFillRect(r.left, r.top, r.right, r.bottom, PALETTE_NEWSPAPER, FILLRECT_RECOLOUR); break; } @@ -1135,9 +1137,6 @@ static void DrawNewsString(uint left, uint right, int y, TextColour colour, cons } struct MessageHistoryWindow : Window { - static const int top_spacing; ///< Additional spacing at the top of the #WID_MH_BACKGROUND widget. - static const int bottom_spacing; ///< Additional spacing at the bottom of the #WID_MH_BACKGROUND widget. - int line_height; /// < Height of a single line in the news history window including spacing. int date_width; /// < Width needed for the date part. @@ -1154,15 +1153,15 @@ struct MessageHistoryWindow : Window { void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override { if (widget == WID_MH_BACKGROUND) { - this->line_height = FONT_HEIGHT_NORMAL + 2; + this->line_height = FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; resize->height = this->line_height; /* Months are off-by-one, so it's actually 8. Not using * month 12 because the 1 is usually less wide. */ SetDParam(0, ConvertYMDToDate(ORIGINAL_MAX_YEAR, 7, 30)); - this->date_width = GetStringBoundingBox(STR_SHORT_DATE).width; + this->date_width = GetStringBoundingBox(STR_SHORT_DATE).width + WidgetDimensions::scaled.hsep_wide; - size->height = 4 * resize->height + this->top_spacing + this->bottom_spacing; // At least 4 lines are visible. + size->height = 4 * resize->height + WidgetDimensions::scaled.framerect.Vertical(); // At least 4 lines are visible. size->width = std::max(200u, size->width); // At least 200 pixels wide. } } @@ -1185,17 +1184,15 @@ struct MessageHistoryWindow : Window { } /* Fill the widget with news items. */ - int y = r.top + this->top_spacing; bool rtl = _current_text_dir == TD_RTL; - uint date_left = rtl ? r.right - WD_FRAMERECT_RIGHT - this->date_width : r.left + WD_FRAMERECT_LEFT; - uint date_right = rtl ? r.right - WD_FRAMERECT_RIGHT : r.left + WD_FRAMERECT_LEFT + this->date_width; - uint news_left = rtl ? r.left + WD_FRAMERECT_LEFT : r.left + WD_FRAMERECT_LEFT + this->date_width + WD_FRAMERECT_RIGHT + ScaleFontTrad(5); - uint news_right = rtl ? r.right - WD_FRAMERECT_RIGHT - this->date_width - WD_FRAMERECT_RIGHT - ScaleFontTrad(5) : r.right - WD_FRAMERECT_RIGHT; + Rect news = r.Shrink(WidgetDimensions::scaled.framerect).Indent(this->date_width + WidgetDimensions::scaled.hsep_wide, rtl); + Rect date = r.Shrink(WidgetDimensions::scaled.framerect).WithWidth(this->date_width, rtl); + int y = news.top; for (int n = this->vscroll->GetCapacity(); n > 0; n--) { SetDParam(0, ni->date); - DrawString(date_left, date_right, y, STR_SHORT_DATE); + DrawString(date.left, date.right, y, STR_SHORT_DATE); - DrawNewsString(news_left, news_right, y, TC_WHITE, ni); + DrawNewsString(news.left, news.right, y, TC_WHITE, ni); y += this->line_height; ni = ni->prev; @@ -1220,7 +1217,7 @@ struct MessageHistoryWindow : Window { NewsItem *ni = _latest_news; if (ni == nullptr) return; - for (int n = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_MH_BACKGROUND, WD_FRAMERECT_TOP); n > 0; n--) { + for (int n = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_MH_BACKGROUND, WidgetDimensions::scaled.framerect.top); n > 0; n--) { ni = ni->prev; if (ni == nullptr) return; } @@ -1235,9 +1232,6 @@ struct MessageHistoryWindow : Window { } }; -const int MessageHistoryWindow::top_spacing = WD_FRAMERECT_TOP + 4; -const int MessageHistoryWindow::bottom_spacing = WD_FRAMERECT_BOTTOM; - static const NWidgetPart _nested_message_history[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), diff --git a/src/object_cmd.cpp b/src/object_cmd.cpp index 41278ca81d..3eced27ef6 100644 --- a/src/object_cmd.cpp +++ b/src/object_cmd.cpp @@ -408,7 +408,7 @@ CommandCost CmdBuildObjectArea(DoCommandFlag flags, TileIndex tile, TileIndex st CommandCost ret = Command::Do(flags & ~DC_EXEC, t, type, view); /* If we've reached the limit, stop building (or testing). */ - if (c != nullptr && --limit <= 0) break; + if (c != nullptr && limit-- <= 0) break; if (ret.Failed()) { last_error = ret; diff --git a/src/object_cmd.h b/src/object_cmd.h index 5a51102e8e..43ba045925 100644 --- a/src/object_cmd.h +++ b/src/object_cmd.h @@ -17,6 +17,6 @@ CommandCost CmdBuildObject(DoCommandFlag flags, TileIndex tile, ObjectType type, CommandCost CmdBuildObjectArea(DoCommandFlag flags, TileIndex tile, TileIndex start_tile, ObjectType type, uint8 view, bool diagonal); DEF_CMD_TRAIT(CMD_BUILD_OBJECT, CmdBuildObject, CMD_DEITY | CMD_NO_WATER | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_BUILD_OBJECT_AREA, CmdBuildObjectArea, CMD_DEITY | CMD_NO_WATER | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION) +DEF_CMD_TRAIT(CMD_BUILD_OBJECT_AREA, CmdBuildObjectArea, CMD_DEITY | CMD_NO_WATER | CMD_NO_TEST | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION) #endif /* OBJECT_CMD_H */ diff --git a/src/object_gui.cpp b/src/object_gui.cpp index 53fb47323e..31b7df2d25 100644 --- a/src/object_gui.cpp +++ b/src/object_gui.cpp @@ -48,8 +48,8 @@ class BuildObjectWindow : public Window { typedef GUIList GUIObjectClassList; ///< Type definition for the list to hold available object classes. static const uint EDITBOX_MAX_SIZE = 16; ///< The maximum number of characters for the filter edit box. - static const int OBJECT_MARGIN = 4; ///< The margin (in pixels) around an object. + int object_margin; ///< The margin (in pixels) around an object. int line_height; ///< The height of a single line. int info_height; ///< The height of the info box. Scrollbar *vscroll; ///< The scrollbar. @@ -229,6 +229,11 @@ public: } } + void OnInit() override + { + this->object_margin = ScaleGUITrad(4); + } + void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override { switch (widget) { @@ -239,7 +244,7 @@ public: size->width = std::max(size->width, GetStringBoundingBox(objclass->name).width); } size->width += padding.width; - this->line_height = FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM; + this->line_height = FONT_HEIGHT_NORMAL + padding.height; resize->height = this->line_height; size->height = 5 * this->line_height; break; @@ -266,7 +271,7 @@ public: case WID_BO_OBJECT_SPRITE: { bool two_wide = false; // Whether there will be two widgets next to each other in the matrix or not. - int height[2] = {0, 0}; // The height for the different views; in this case views 1/2 and 4. + uint height[2] = {0, 0}; // The height for the different views; in this case views 1/2 and 4. /* Get the height and view information. */ for (int i = 0; i < NUM_OBJECTS; i++) { @@ -279,26 +284,28 @@ public: /* Determine the pixel heights. */ for (size_t i = 0; i < lengthof(height); i++) { height[i] *= ScaleGUITrad(TILE_HEIGHT); - height[i] += ScaleGUITrad(TILE_PIXELS) + 2 * OBJECT_MARGIN; + height[i] += ScaleGUITrad(TILE_PIXELS) + 2 * this->object_margin; } /* Now determine the size of the minimum widgets. When there are two columns, then * we want these columns to be slightly less wide. When there are two rows, then * determine the size of the widgets based on the maximum size for a single row * of widgets, or just the twice the widget height of the two row ones. */ - size->height = std::max(height[0], height[1] * 2 + 2); + size->height = std::max(height[0], height[1] * 2); if (two_wide) { - size->width = (3 * ScaleGUITrad(TILE_PIXELS) + 2 * OBJECT_MARGIN) * 2 + 2; + size->width = (3 * ScaleGUITrad(TILE_PIXELS) + 2 * this->object_margin) * 2; } else { - size->width = 4 * ScaleGUITrad(TILE_PIXELS) + 2 * OBJECT_MARGIN; + size->width = 4 * ScaleGUITrad(TILE_PIXELS) + 2 * this->object_margin; } /* Get the right size for the single widget based on the current spec. */ ObjectClass *objclass = ObjectClass::Get(_selected_object_class); const ObjectSpec *spec = objclass->GetSpec(_selected_object_index); if (spec != nullptr) { - if (spec->views >= 2) size->width = size->width / 2 - 1; - if (spec->views >= 4) size->height = size->height / 2 - 1; + if (spec->views <= 1) size->width += WidgetDimensions::scaled.hsep_normal; + if (spec->views <= 2) size->height += WidgetDimensions::scaled.vsep_normal; + if (spec->views >= 2) size->width /= 2; + if (spec->views >= 4) size->height /= 2; } break; } @@ -313,8 +320,8 @@ public: break; case WID_BO_SELECT_IMAGE: - size->width = ScaleGUITrad(64) + 2; - size->height = ScaleGUITrad(58) + 2; + size->width = ScaleGUITrad(64) + WidgetDimensions::scaled.fullbevel.Horizontal(); + size->height = ScaleGUITrad(58) + WidgetDimensions::scaled.fullbevel.Vertical(); break; default: break; @@ -325,15 +332,15 @@ public: { switch (GB(widget, 0, 16)) { case WID_BO_CLASS_LIST: { - int y = r.top; + Rect mr = r.Shrink(WidgetDimensions::scaled.matrix); uint pos = 0; for (auto object_class_id : this->object_classes) { ObjectClass *objclass = ObjectClass::Get(object_class_id); if (objclass->GetUISpecCount() == 0) continue; if (!this->vscroll->IsVisible(pos++)) continue; - DrawString(r.left + WD_MATRIX_LEFT, r.right - WD_MATRIX_RIGHT, y + WD_MATRIX_TOP, objclass->name, + DrawString(mr, objclass->name, (object_class_id == _selected_object_class) ? TC_WHITE : TC_BLACK); - y += this->line_height; + mr.top += this->line_height; } break; } @@ -354,15 +361,15 @@ public: DrawPixelInfo tmp_dpi; /* Set up a clipping area for the preview. */ - if (FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.right - r.left + 1, r.bottom - r.top + 1)) { + if (FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.Width(), r.Height())) { DrawPixelInfo *old_dpi = _cur_dpi; _cur_dpi = &tmp_dpi; if (spec->grf_prop.grffile == nullptr) { extern const DrawTileSprites _objects[]; const DrawTileSprites *dts = &_objects[spec->grf_prop.local_id]; - DrawOrigTileSeqInGUI((r.right - r.left) / 2 - 1, (r.bottom - r.top + matrix_height / 2) / 2 - OBJECT_MARGIN - ScaleGUITrad(TILE_PIXELS), dts, PAL_NONE); + DrawOrigTileSeqInGUI(r.Width() / 2 - 1, (r.Height() + matrix_height / 2) / 2 - this->object_margin - ScaleSpriteTrad(TILE_PIXELS), dts, PAL_NONE); } else { - DrawNewObjectTileInGUI((r.right - r.left) / 2 - 1, (r.bottom - r.top + matrix_height / 2) / 2 - OBJECT_MARGIN - ScaleGUITrad(TILE_PIXELS), spec, GB(widget, 16, 16)); + DrawNewObjectTileInGUI(r.Width() / 2 - 1, (r.Height() + matrix_height / 2) / 2 - this->object_margin - ScaleSpriteTrad(TILE_PIXELS), spec, GB(widget, 16, 16)); } _cur_dpi = old_dpi; } @@ -377,19 +384,19 @@ public: if (spec == nullptr) break; if (!spec->IsAvailable()) { - GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, PC_BLACK, FILLRECT_CHECKER); + GfxFillRect(r.Shrink(WidgetDimensions::scaled.bevel), PC_BLACK, FILLRECT_CHECKER); } DrawPixelInfo tmp_dpi; /* Set up a clipping area for the preview. */ - if (FillDrawPixelInfo(&tmp_dpi, r.left + 1, r.top, (r.right - 1) - (r.left + 1) + 1, r.bottom - r.top + 1)) { + if (FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.Width(), r.Height())) { DrawPixelInfo *old_dpi = _cur_dpi; _cur_dpi = &tmp_dpi; if (spec->grf_prop.grffile == nullptr) { extern const DrawTileSprites _objects[]; const DrawTileSprites *dts = &_objects[spec->grf_prop.local_id]; - DrawOrigTileSeqInGUI((r.right - r.left) / 2 - 1, r.bottom - r.top - OBJECT_MARGIN - ScaleGUITrad(TILE_PIXELS), dts, PAL_NONE); + DrawOrigTileSeqInGUI(r.Width() / 2 - 1, r.Height() - this->object_margin - ScaleSpriteTrad(TILE_PIXELS), dts, PAL_NONE); } else { - DrawNewObjectTileInGUI((r.right - r.left) / 2 - 1, r.bottom - r.top - OBJECT_MARGIN - ScaleGUITrad(TILE_PIXELS), spec, + DrawNewObjectTileInGUI(r.Width() / 2 - 1, r.Height() - this->object_margin - ScaleSpriteTrad(TILE_PIXELS), spec, std::min(_selected_object_view, spec->views - 1)); } _cur_dpi = old_dpi; @@ -415,11 +422,11 @@ public: /* Use all the available space left from where we stand up to the * end of the window. We ALSO enlarge the window if needed, so we * can 'go' wild with the bottom of the window. */ - int y = DrawStringMultiLine(r.left, r.right, r.top, UINT16_MAX, message, TC_ORANGE) - r.top; + int y = DrawStringMultiLine(r.left, r.right, r.top, UINT16_MAX, message, TC_ORANGE) - r.top - 1; StopTextRefStackUsage(); if (y > this->info_height) { BuildObjectWindow *bow = const_cast(this); - bow->info_height = y + 2; + bow->info_height = y; bow->ReInit(); } } @@ -724,7 +731,7 @@ static const NWidgetPart _nested_build_object_widgets[] = { EndContainer(), EndContainer(), NWidget(NWID_HORIZONTAL), - NWidget(WWT_EMPTY, INVALID_COLOUR, WID_BO_INFO), SetPadding(0, 5, 0, 1), SetFill(1, 0), SetResize(1, 0), + NWidget(WWT_EMPTY, INVALID_COLOUR, WID_BO_INFO), SetPadding(0, 5, 2, 2), SetFill(1, 0), SetResize(1, 0), NWidget(NWID_VERTICAL), NWidget(WWT_PANEL, COLOUR_DARK_GREEN), SetFill(0, 1), EndContainer(), NWidget(WWT_RESIZEBOX, COLOUR_DARK_GREEN), diff --git a/src/openttd.cpp b/src/openttd.cpp index 4ba83620f9..20401892be 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -13,6 +13,7 @@ #include "sound/sound_driver.hpp" #include "music/music_driver.hpp" #include "video/video_driver.hpp" +#include "mixer.h" #include "fontcache.h" #include "error.h" @@ -176,7 +177,7 @@ static void ShowHelp() "\n" "Command line options:\n" " -v drv = Set video driver (see below)\n" - " -s drv = Set sound driver (see below) (param bufsize,hz)\n" + " -s drv = Set sound driver (see below)\n" " -m drv = Set music driver (see below)\n" " -b drv = Set the blitter to use (see below)\n" " -r res = Set resolution (for instance 800x600)\n" @@ -452,8 +453,9 @@ struct AfterNewGRFScan : NewGRFScanCallback { /* We have loaded the config, so we may possibly save it. */ _save_config = save_config; - /* restore saved music volume */ + /* restore saved music and effects volumes */ MusicDriver::GetInstance()->SetVolume(_settings_client.music.music_vol); + SetEffectVolume(_settings_client.music.effect_vol); if (startyear != INVALID_YEAR) IConsoleSetSetting("game_creation.starting_year", startyear); if (generation_seed != GENERATE_NEW_SEED) _settings_newgame.game_creation.generation_seed = generation_seed; @@ -754,7 +756,9 @@ int openttd_main(int argc, char *argv[]) /* Initialize the zoom level of the screen to normal */ _screen.zoom = ZOOM_LVL_NORMAL; - UpdateGUIZoom(); + + /* The video driver is now selected, now initialise GUI zoom */ + AdjustGUIZoom(false); NetworkStartUp(); // initialize network-core diff --git a/src/order_gui.cpp b/src/order_gui.cpp index 16f5d49447..816a1b85b3 100644 --- a/src/order_gui.cpp +++ b/src/order_gui.cpp @@ -29,6 +29,9 @@ #include "aircraft.h" #include "engine_func.h" #include "vehicle_func.h" +#include "vehiclelist.h" +#include "vehicle_func.h" +#include "error.h" #include "order_cmd.h" #include "company_cmd.h" @@ -550,7 +553,7 @@ private: VehicleOrderID GetOrderFromPt(int y) { NWidgetBase *nwid = this->GetWidget(WID_O_ORDER_LIST); - uint sel = (y - nwid->pos_y - WD_FRAMERECT_TOP) / nwid->resize_y; // Selected line in the WID_O_ORDER_LIST panel. + uint sel = (y - nwid->pos_y - WidgetDimensions::scaled.framerect.top) / nwid->resize_y; // Selected line in the WID_O_ORDER_LIST panel. if (sel >= this->vscroll->GetCapacity()) return INVALID_VEH_ORDER_ID; @@ -793,7 +796,7 @@ public: switch (widget) { case WID_O_ORDER_LIST: resize->height = FONT_HEIGHT_NORMAL; - size->height = 6 * resize->height + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; + size->height = 6 * resize->height + padding.height; break; case WID_O_COND_VARIABLE: { @@ -1074,12 +1077,13 @@ public: { if (widget != WID_O_ORDER_LIST) return; + Rect ir = r.Shrink(WidgetDimensions::scaled.frametext, WidgetDimensions::scaled.framerect); bool rtl = _current_text_dir == TD_RTL; SetDParamMaxValue(0, this->vehicle->GetNumOrders(), 2); - int index_column_width = GetStringBoundingBox(STR_ORDER_INDEX).width + 2 * GetSpriteSize(rtl ? SPR_ARROW_RIGHT : SPR_ARROW_LEFT).width + 3; - int middle = rtl ? r.right - WD_FRAMETEXT_RIGHT - index_column_width : r.left + WD_FRAMETEXT_LEFT + index_column_width; + int index_column_width = GetStringBoundingBox(STR_ORDER_INDEX).width + 2 * GetSpriteSize(rtl ? SPR_ARROW_RIGHT : SPR_ARROW_LEFT).width + WidgetDimensions::scaled.hsep_normal; + int middle = rtl ? ir.right - index_column_width : ir.left + index_column_width; - int y = r.top + WD_FRAMERECT_TOP; + int y = ir.top; int line_height = this->GetWidget(WID_O_ORDER_LIST)->resize_y; int i = this->vscroll->GetPosition(); @@ -1092,10 +1096,10 @@ public: if (i != this->selected_order && i == this->order_over) { /* Highlight dragged order destination. */ - int top = (this->order_over < this->selected_order ? y : y + line_height) - WD_FRAMERECT_TOP; - int bottom = std::min(top + 2, r.bottom - WD_FRAMERECT_BOTTOM); - top = std::max(top - 3, r.top + WD_FRAMERECT_TOP); - GfxFillRect(r.left + WD_FRAMETEXT_LEFT, top, r.right - WD_FRAMETEXT_RIGHT, bottom, _colour_gradient[COLOUR_GREY][7]); + int top = (this->order_over < this->selected_order ? y : y + line_height) - WidgetDimensions::scaled.framerect.top; + int bottom = std::min(top + 2, ir.bottom); + top = std::max(top - 3, ir.top); + GfxFillRect(ir.left, top, ir.right, bottom, _colour_gradient[COLOUR_GREY][7]); break; } y += line_height; @@ -1105,7 +1109,7 @@ public: } /* Reset counters for drawing the orders. */ - y = r.top + WD_FRAMERECT_TOP; + y = ir.top; i = this->vscroll->GetPosition(); order = this->vehicle->GetOrder(i); } @@ -1115,7 +1119,7 @@ public: /* Don't draw anything if it extends past the end of the window. */ if (!this->vscroll->IsVisible(i)) break; - DrawOrderString(this->vehicle, order, i, y, i == this->selected_order, false, r.left + WD_FRAMETEXT_LEFT, middle, r.right - WD_FRAMETEXT_RIGHT); + DrawOrderString(this->vehicle, order, i, y, i == this->selected_order, false, ir.left, middle, ir.right); y += line_height; i++; @@ -1124,7 +1128,7 @@ public: if (this->vscroll->IsVisible(i)) { StringID str = this->vehicle->IsOrderListShared() ? STR_ORDERS_END_OF_SHARED_ORDERS : STR_ORDERS_END_OF_ORDERS; - DrawString(rtl ? r.left + WD_FRAMETEXT_LEFT : middle, rtl ? middle : r.right - WD_FRAMETEXT_RIGHT, y, str, (i == this->selected_order) ? TC_WHITE : TC_BLACK); + DrawString(rtl ? ir.left : middle, rtl ? middle : ir.right, y, str, (i == this->selected_order) ? TC_WHITE : TC_BLACK); } } @@ -1465,6 +1469,40 @@ public: return true; } + /** + * Clones an order list from a vehicle list. If this doesn't make sense (because not all vehicles in the list have the same orders), then it displays an error. + * @return This always returns true, which indicates that the contextual action handled the mouse click. + * Note that it's correct behaviour to always handle the click even though an error is displayed, + * because users aren't going to expect the default action to be performed just because they overlooked that cloning doesn't make sense. + */ + bool OnVehicleSelect(VehicleList::const_iterator begin, VehicleList::const_iterator end) override + { + bool share_order = _ctrl_pressed || this->goto_type == OPOS_SHARE; + if (this->vehicle->GetNumOrders() != 0 && !share_order) return false; + + if (!share_order) { + /* If CTRL is not pressed: If all the vehicles in this list have the same orders, then copy orders */ + if (AllEqual(begin, end, [](const Vehicle *v1, const Vehicle *v2) { + return VehiclesHaveSameOrderList(v1, v2); + })) { + OnVehicleSelect(*begin); + } else { + ShowErrorMessage(STR_ERROR_CAN_T_COPY_ORDER_LIST, STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST, WL_INFO); + } + } else { + /* If CTRL is pressed: If all the vehicles in this list share orders, then copy orders */ + if (AllEqual(begin, end, [](const Vehicle *v1, const Vehicle *v2) { + return v1->FirstShared() == v2->FirstShared(); + })) { + OnVehicleSelect(*begin); + } else { + ShowErrorMessage(STR_ERROR_CAN_T_SHARE_ORDER_LIST, STR_ERROR_CAN_T_SHARE_ORDER_VEHICLE_LIST, WL_INFO); + } + } + + return true; + } + void OnPlaceObjectAbort() override { this->goto_type = OPOS_NONE; diff --git a/src/os/macosx/font_osx.cpp b/src/os/macosx/font_osx.cpp index 90888c2015..4152c7da0f 100644 --- a/src/os/macosx/font_osx.cpp +++ b/src/os/macosx/font_osx.cpp @@ -173,7 +173,7 @@ void CoreTextFontCache::SetFontSize(int pixels) { if (pixels == 0) { /* Try to determine a good height based on the height recommended by the font. */ - int scaled_height = ScaleFontTrad(this->GetDefaultFontHeight(this->fs)); + int scaled_height = ScaleGUITrad(FontCache::GetDefaultFontHeight(this->fs)); pixels = scaled_height; CFAutoRelease font(CTFontCreateWithFontDescriptor(this->font_desc.get(), 0.0f, nullptr)); @@ -197,11 +197,12 @@ void CoreTextFontCache::SetFontSize(int pixels) /* Font height is minimum height plus the difference between the default * height for this font size and the small size. */ - int diff = scaled_height - ScaleFontTrad(this->GetDefaultFontHeight(FS_SMALL)); - pixels = Clamp(std::min(min_size, MAX_FONT_MIN_REC_SIZE) + diff, scaled_height, MAX_FONT_SIZE); + int diff = scaled_height - ScaleGUITrad(FontCache::GetDefaultFontHeight(FS_SMALL)); + /* Clamp() is not used as scaled_height could be greater than MAX_FONT_SIZE, which is not permitted in Clamp(). */ + pixels = std::min(std::max(std::min(min_size, MAX_FONT_MIN_REC_SIZE) + diff, scaled_height), MAX_FONT_SIZE); } } else { - pixels = ScaleFontTrad(pixels); + pixels = ScaleGUITrad(pixels); } this->used_size = pixels; @@ -276,9 +277,10 @@ const Sprite *CoreTextFontCache::InternalGetGlyph(GlyphID key, bool use_aa) uint bb_width = (uint)std::ceil(bounds.size.width) + 1; // Sometimes the glyph bounds are too tight and cut of the last pixel after rounding. uint bb_height = (uint)std::ceil(bounds.size.height); - /* Add 1 pixel for the shadow on the medium font. Our sprite must be at least 1x1 pixel. */ - uint width = std::max(1U, bb_width + (this->fs == FS_NORMAL ? 1 : 0)); - uint height = std::max(1U, bb_height + (this->fs == FS_NORMAL ? 1 : 0)); + /* Add 1 scaled pixel for the shadow on the medium font. Our sprite must be at least 1x1 pixel. */ + uint shadow = (this->fs == FS_NORMAL) ? ScaleGUITrad(1) : 0; + uint width = std::max(1U, bb_width + shadow); + uint height = std::max(1U, bb_height + shadow); /* Limit glyph size to prevent overflows later on. */ if (width > MAX_GLYPH_DIM || height > MAX_GLYPH_DIM) usererror("Font glyph is too large"); @@ -314,8 +316,8 @@ const Sprite *CoreTextFontCache::InternalGetGlyph(GlyphID key, bool use_aa) for (uint y = 0; y < bb_height; y++) { for (uint x = 0; x < bb_width; x++) { if (bmp[y * pitch + x] > 0) { - sprite.data[1 + x + (1 + y) * sprite.width].m = SHADOW_COLOUR; - sprite.data[1 + x + (1 + y) * sprite.width].a = use_aa ? bmp[x + y * pitch] : 0xFF; + sprite.data[shadow + x + (shadow + y) * sprite.width].m = SHADOW_COLOUR; + sprite.data[shadow + x + (shadow + y) * sprite.width].a = use_aa ? bmp[x + y * pitch] : 0xFF; } } } @@ -348,16 +350,7 @@ const Sprite *CoreTextFontCache::InternalGetGlyph(GlyphID key, bool use_aa) */ void LoadCoreTextFont(FontSize fs) { - static const char *SIZE_TO_NAME[] = { "medium", "small", "large", "mono" }; - - FontCacheSubSetting *settings = nullptr; - switch (fs) { - default: NOT_REACHED(); - case FS_SMALL: settings = &_fcsettings.small; break; - case FS_NORMAL: settings = &_fcsettings.medium; break; - case FS_LARGE: settings = &_fcsettings.large; break; - case FS_MONO: settings = &_fcsettings.mono; break; - } + FontCacheSubSetting *settings = GetFontCacheSubSetting(fs); if (settings->font.empty()) return; @@ -393,7 +386,7 @@ void LoadCoreTextFont(FontSize fs) font_ref.reset((CTFontDescriptorRef)CFArrayGetValueAtIndex(descs.get(), 0)); CFRetain(font_ref.get()); } else { - ShowInfoF("Unable to load file '%s' for %s font, using default OS font selection instead", settings->font.c_str(), SIZE_TO_NAME[fs]); + ShowInfoF("Unable to load file '%s' for %s font, using default OS font selection instead", settings->font.c_str(), FontSizeToName(fs)); } } } @@ -417,7 +410,7 @@ void LoadCoreTextFont(FontSize fs) } if (!font_ref) { - ShowInfoF("Unable to use '%s' for %s font, using sprite font instead", settings->font.c_str(), SIZE_TO_NAME[fs]); + ShowInfoF("Unable to use '%s' for %s font, using sprite font instead", settings->font.c_str(), FontSizeToName(fs)); return; } diff --git a/src/os/macosx/string_osx.cpp b/src/os/macosx/string_osx.cpp index 5cd14e8e1e..c79ca88894 100644 --- a/src/os/macosx/string_osx.cpp +++ b/src/os/macosx/string_osx.cpp @@ -13,6 +13,7 @@ #include "../../strings_func.h" #include "../../table/control_codes.h" #include "../../fontcache.h" +#include "../../zoom_func.h" #include "macos.h" #include @@ -245,7 +246,7 @@ CoreTextParagraphLayout::CoreTextVisualRun::CoreTextVisualRun(CTRunRef run, Font if (buff[this->glyph_to_char[i]] >= SCC_SPRITE_START && buff[this->glyph_to_char[i]] <= SCC_SPRITE_END) { this->glyphs[i] = font->fc->MapCharToGlyph(buff[this->glyph_to_char[i]]); this->positions[i * 2 + 0] = pts[i].x; - this->positions[i * 2 + 1] = font->fc->GetAscender() - font->fc->GetGlyph(this->glyphs[i])->height - 1; // Align sprite glyphs to font baseline. + this->positions[i * 2 + 1] = (font->fc->GetHeight() - ScaleSpriteTrad(FontCache::GetDefaultFontHeight(font->fc->GetSize()))) / 2; // Align sprite font to centre } else { this->glyphs[i] = gl[i]; this->positions[i * 2 + 0] = pts[i].x; diff --git a/src/os/windows/font_win32.cpp b/src/os/windows/font_win32.cpp index 21fa808ae3..093d466954 100644 --- a/src/os/windows/font_win32.cpp +++ b/src/os/windows/font_win32.cpp @@ -378,7 +378,6 @@ Win32FontCache::Win32FontCache(FontSize fs, const LOGFONT &logfont, int pixels) { this->dc = CreateCompatibleDC(nullptr); this->SetFontSize(fs, pixels); - this->fontname = FS2OTTD(this->logfont.lfFaceName); } Win32FontCache::~Win32FontCache() @@ -392,7 +391,7 @@ void Win32FontCache::SetFontSize(FontSize fs, int pixels) { if (pixels == 0) { /* Try to determine a good height based on the minimal height recommended by the font. */ - int scaled_height = ScaleFontTrad(this->GetDefaultFontHeight(this->fs)); + int scaled_height = ScaleGUITrad(FontCache::GetDefaultFontHeight(this->fs)); pixels = scaled_height; HFONT temp = CreateFontIndirect(&this->logfont); @@ -405,14 +404,15 @@ void Win32FontCache::SetFontSize(FontSize fs, int pixels) /* Font height is minimum height plus the difference between the default * height for this font size and the small size. */ - int diff = scaled_height - ScaleFontTrad(this->GetDefaultFontHeight(FS_SMALL)); - pixels = Clamp(std::min(otm->otmusMinimumPPEM, MAX_FONT_MIN_REC_SIZE) + diff, scaled_height, MAX_FONT_SIZE); + int diff = scaled_height - ScaleGUITrad(FontCache::GetDefaultFontHeight(FS_SMALL)); + /* Clamp() is not used as scaled_height could be greater than MAX_FONT_SIZE, which is not permitted in Clamp(). */ + pixels = std::min(std::max(std::min(otm->otmusMinimumPPEM, MAX_FONT_MIN_REC_SIZE) + diff, scaled_height), MAX_FONT_SIZE); SelectObject(dc, old); DeleteObject(temp); } } else { - pixels = ScaleFontTrad(pixels); + pixels = ScaleGUITrad(pixels); } this->used_size = pixels; @@ -440,7 +440,9 @@ void Win32FontCache::SetFontSize(FontSize fs, int pixels) this->glyph_size.cx = otm->otmTextMetrics.tmMaxCharWidth; this->glyph_size.cy = otm->otmTextMetrics.tmHeight; - Debug(fontcache, 2, "Loaded font '{}' with size {}", FS2OTTD((LPWSTR)((BYTE *)otm + (ptrdiff_t)otm->otmpFullName)), pixels); + this->fontname = FS2OTTD((LPWSTR)((BYTE *)otm + (ptrdiff_t)otm->otmpFaceName)); + + Debug(fontcache, 2, "Loaded font '{}' with size {}", this->fontname, pixels); } /** @@ -476,9 +478,10 @@ void Win32FontCache::ClearFontCache() GetGlyphOutline(this->dc, key, GGO_GLYPH_INDEX | (aa ? GGO_GRAY8_BITMAP : GGO_BITMAP), &gm, size, bmp, &mat); } - /* Add 1 pixel for the shadow on the medium font. Our sprite must be at least 1x1 pixel. */ - uint width = std::max(1U, (uint)gm.gmBlackBoxX + (this->fs == FS_NORMAL)); - uint height = std::max(1U, (uint)gm.gmBlackBoxY + (this->fs == FS_NORMAL)); + /* Add 1 scaled pixel for the shadow on the medium font. Our sprite must be at least 1x1 pixel. */ + uint shadow = (this->fs == FS_NORMAL) ? ScaleGUITrad(1) : 0; + uint width = std::max(1U, (uint)gm.gmBlackBoxX + shadow); + uint height = std::max(1U, (uint)gm.gmBlackBoxY + shadow); /* Limit glyph size to prevent overflows later on. */ if (width > MAX_GLYPH_DIM || height > MAX_GLYPH_DIM) usererror("Font glyph is too large"); @@ -506,8 +509,8 @@ void Win32FontCache::ClearFontCache() for (uint y = 0; y < gm.gmBlackBoxY; y++) { for (uint x = 0; x < gm.gmBlackBoxX; x++) { if (aa ? (bmp[x + y * pitch] > 0) : HasBit(bmp[(x / 8) + y * pitch], 7 - (x % 8))) { - sprite.data[1 + x + (1 + y) * sprite.width].m = SHADOW_COLOUR; - sprite.data[1 + x + (1 + y) * sprite.width].a = aa ? (bmp[x + y * pitch] << 2) - 1 : 0xFF; + sprite.data[shadow + x + (shadow + y) * sprite.width].m = SHADOW_COLOUR; + sprite.data[shadow + x + (shadow + y) * sprite.width].a = aa ? (bmp[x + y * pitch] << 2) - 1 : 0xFF; } } } @@ -578,16 +581,7 @@ void Win32FontCache::ClearFontCache() */ void LoadWin32Font(FontSize fs) { - static const char *SIZE_TO_NAME[] = { "medium", "small", "large", "mono" }; - - FontCacheSubSetting *settings = nullptr; - switch (fs) { - case FS_SMALL: settings = &_fcsettings.small; break; - case FS_NORMAL: settings = &_fcsettings.medium; break; - case FS_LARGE: settings = &_fcsettings.large; break; - case FS_MONO: settings = &_fcsettings.mono; break; - default: NOT_REACHED(); - } + FontCacheSubSetting *settings = GetFontCacheSubSetting(fs); if (settings->font.empty()) return; @@ -645,7 +639,7 @@ void LoadWin32Font(FontSize fs) logfont.lfWeight = strcasestr(font_name, " bold") != nullptr || strcasestr(font_name, "-bold") != nullptr ? FW_BOLD : FW_NORMAL; // Poor man's way to allow selecting bold fonts. } } else { - ShowInfoF("Unable to load file '%s' for %s font, using default windows font selection instead", font_name, SIZE_TO_NAME[fs]); + ShowInfoF("Unable to load file '%s' for %s font, using default windows font selection instead", font_name, FontSizeToName(fs)); } } } @@ -657,7 +651,7 @@ void LoadWin32Font(FontSize fs) HFONT font = CreateFontIndirect(&logfont); if (font == nullptr) { - ShowInfoF("Unable to use '%s' for %s font, Win32 reported error 0x%lX, using sprite font instead", font_name, SIZE_TO_NAME[fs], GetLastError()); + ShowInfoF("Unable to use '%s' for %s font, Win32 reported error 0x%lX, using sprite font instead", font_name, FontSizeToName(fs), GetLastError()); return; } DeleteObject(font); diff --git a/src/os/windows/font_win32.h b/src/os/windows/font_win32.h index 070c6eb35e..b83b2c5f35 100644 --- a/src/os/windows/font_win32.h +++ b/src/os/windows/font_win32.h @@ -21,7 +21,7 @@ private: HDC dc = nullptr; ///< Cached GDI device context. HGDIOBJ old_font; ///< Old font selected into the GDI context. SIZE glyph_size; ///< Maximum size of regular glyphs. - std::string fontname; ///< Cached copy of this->logfont.lfFaceName + std::string fontname; ///< Cached copy of loaded font facename void SetFontSize(FontSize fs, int pixels); diff --git a/src/os/windows/string_uniscribe.cpp b/src/os/windows/string_uniscribe.cpp index 7c70557b61..d4b122346a 100644 --- a/src/os/windows/string_uniscribe.cpp +++ b/src/os/windows/string_uniscribe.cpp @@ -14,6 +14,7 @@ #include "../../strings_func.h" #include "../../string_func.h" #include "../../table/control_codes.h" +#include "../../zoom_func.h" #include "win32.h" #include @@ -195,7 +196,7 @@ static bool UniscribeShapeRun(const UniscribeParagraphLayoutFactory::CharType *b if (buff[range.pos + i] >= SCC_SPRITE_START && buff[range.pos + i] <= SCC_SPRITE_END) { auto pos = range.char_to_glyph[i]; range.ft_glyphs[pos] = range.font->fc->MapCharToGlyph(buff[range.pos + i]); - range.offsets[pos].dv = range.font->fc->GetAscender() - range.font->fc->GetGlyph(range.ft_glyphs[pos])->height - 1; // Align sprite glyphs to font baseline. + range.offsets[pos].dv = (range.font->fc->GetHeight() - ScaleSpriteTrad(FontCache::GetDefaultFontHeight(range.font->fc->GetSize()))) / 2; // Align sprite font to centre range.advances[pos] = range.font->fc->GetGlyphWidth(range.ft_glyphs[pos]); } } diff --git a/src/pbs.cpp b/src/pbs.cpp index c4dfcbce54..df3a5cf339 100644 --- a/src/pbs.cpp +++ b/src/pbs.cpp @@ -105,8 +105,7 @@ bool TryReserveRailTrack(TileIndex tile, Track t, bool trigger_stations) case MP_ROAD: if (IsLevelCrossing(tile) && !HasCrossingReservation(tile)) { SetCrossingReservation(tile, true); - BarCrossing(tile); - MarkTileDirtyByTile(tile); // crossing barred, make tile dirty + UpdateLevelCrossing(tile, false); return true; } break; diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index f61a2860f9..7ee5813606 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -548,6 +548,7 @@ CommandCost CmdBuildSingleRail(DoCommandFlag flags, TileIndex tile, RailType rai if (flags & DC_EXEC) { MakeRoadCrossing(tile, road_owner, tram_owner, _current_company, (track == TRACK_X ? AXIS_Y : AXIS_X), railtype, roadtype_road, roadtype_tram, GetTownIndex(tile)); UpdateLevelCrossing(tile, false); + MarkDirtyAdjacentLevelCrossingTiles(tile, GetCrossingRoadAxis(tile)); Company::Get(_current_company)->infrastructure.rail[railtype] += LEVELCROSSING_TRACKBIT_FACTOR; DirtyCompanyInfrastructureWindows(_current_company); if (num_new_road_pieces > 0 && Company::IsValidID(road_owner)) { @@ -649,6 +650,8 @@ CommandCost CmdRemoveSingleRail(DoCommandFlag flags, TileIndex tile, Track track cost.AddCost(RailClearCost(GetRailType(tile))); if (flags & DC_EXEC) { + MarkDirtyAdjacentLevelCrossingTiles(tile, GetCrossingRoadAxis(tile)); + if (HasReservedTracks(tile, trackbit)) { v = GetTrainForReservation(tile, track); if (v != nullptr) FreeTrainTrackReservation(v); diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index 8089c939cb..20679dfb44 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -968,7 +968,7 @@ private: public: BuildRailStationWindow(WindowDesc *desc, Window *parent, bool newstation) : PickerWindowBase(desc, parent), filter_editbox(EDITBOX_MAX_SIZE * MAX_CHAR_LENGTH, EDITBOX_MAX_SIZE) { - this->coverage_height = 2 * FONT_HEIGHT_NORMAL + 3 * WD_PAR_VSEP_NORMAL; + this->coverage_height = 2 * FONT_HEIGHT_NORMAL + 3 * WidgetDimensions::scaled.vsep_normal; this->vscroll = nullptr; _railstation.newstations = newstation; @@ -1180,9 +1180,9 @@ public: if (this->IsShaded()) return; /* 'Accepts' and 'Supplies' texts. */ Rect r = this->GetWidget(WID_BRAS_COVERAGE_TEXTS)->GetCurrentRect(); - int top = r.top + ScaleGUITrad(WD_PAR_VSEP_NORMAL); - top = DrawStationCoverageAreaText(r.left, r.right, top, SCT_ALL, rad, false) + ScaleGUITrad(WD_PAR_VSEP_NORMAL); - top = DrawStationCoverageAreaText(r.left, r.right, top, SCT_ALL, rad, true) + ScaleGUITrad(WD_PAR_VSEP_NORMAL); + int top = r.top + WidgetDimensions::scaled.vsep_normal; + top = DrawStationCoverageAreaText(r.left, r.right, top, SCT_ALL, rad, false) + WidgetDimensions::scaled.vsep_normal; + top = DrawStationCoverageAreaText(r.left, r.right, top, SCT_ALL, rad, true) + WidgetDimensions::scaled.vsep_normal; /* Resize background if the window is too small. * Never make the window smaller to avoid oscillating if the size change affects the acceptance. * (This is the case, if making the window bigger moves the mouse into the window.) */ @@ -1201,7 +1201,7 @@ public: d = maxdim(d, GetStringBoundingBox(StationClass::Get(station_class)->name)); } size->width = std::max(size->width, d.width + padding.width); - this->line_height = FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM; + this->line_height = FONT_HEIGHT_NORMAL + padding.height; size->height = 5 * this->line_height; resize->height = this->line_height; break; @@ -1232,8 +1232,8 @@ public: case WID_BRAS_PLATFORM_DIR_X: case WID_BRAS_PLATFORM_DIR_Y: case WID_BRAS_IMAGE: - size->width = ScaleGUITrad(64) + 2; - size->height = ScaleGUITrad(58) + 2; + size->width = ScaleGUITrad(64) + WidgetDimensions::scaled.fullbevel.Horizontal(); + size->height = ScaleGUITrad(58) + WidgetDimensions::scaled.fullbevel.Vertical(); break; case WID_BRAS_COVERAGE_TEXTS: @@ -1254,11 +1254,11 @@ public: switch (GB(widget, 0, 16)) { case WID_BRAS_PLATFORM_DIR_X: /* Set up a clipping area for the '/' station preview */ - if (FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.right - r.left + 1, r.bottom - r.top + 1)) { + if (FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.Width(), r.Height())) { DrawPixelInfo *old_dpi = _cur_dpi; _cur_dpi = &tmp_dpi; - int x = ScaleGUITrad(31) + 1; - int y = r.bottom - r.top - ScaleGUITrad(31); + int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); + int y = (r.Height() + ScaleSpriteTrad(58)) / 2 - ScaleSpriteTrad(31); if (!DrawStationTile(x, y, _cur_railtype, AXIS_X, _railstation.station_class, _railstation.station_type)) { StationPickerDrawSprite(x, y, STATION_RAIL, _cur_railtype, INVALID_ROADTYPE, 2); } @@ -1268,11 +1268,11 @@ public: case WID_BRAS_PLATFORM_DIR_Y: /* Set up a clipping area for the '\' station preview */ - if (FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.right - r.left + 1, r.bottom - r.top + 1)) { + if (FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.Width(), r.Height())) { DrawPixelInfo *old_dpi = _cur_dpi; _cur_dpi = &tmp_dpi; - int x = ScaleGUITrad(31) + 1; - int y = r.bottom - r.top - ScaleGUITrad(31); + int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); + int y = (r.Height() + ScaleSpriteTrad(58)) / 2 - ScaleSpriteTrad(31); if (!DrawStationTile(x, y, _cur_railtype, AXIS_Y, _railstation.station_class, _railstation.station_type)) { StationPickerDrawSprite(x, y, STATION_RAIL, _cur_railtype, INVALID_ROADTYPE, 3); } @@ -1281,14 +1281,14 @@ public: break; case WID_BRAS_NEWST_LIST: { + Rect ir = r.Shrink(WidgetDimensions::scaled.matrix); uint statclass = 0; - uint row = 0; for (auto station_class : this->station_classes) { if (this->vscroll->IsVisible(statclass)) { - DrawString(r.left + WD_MATRIX_LEFT, r.right - WD_MATRIX_RIGHT, row * this->line_height + r.top + WD_MATRIX_TOP, + DrawString(ir, StationClass::Get(station_class)->name, station_class == _railstation.station_class ? TC_WHITE : TC_BLACK); - row++; + ir.top += this->line_height; } statclass++; } @@ -1301,15 +1301,15 @@ public: /* Check station availability callback */ const StationSpec *statspec = StationClass::Get(_railstation.station_class)->GetSpec(type); if (!IsStationAvailable(statspec)) { - GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, PC_BLACK, FILLRECT_CHECKER); + GfxFillRect(r.Shrink(WidgetDimensions::scaled.bevel), PC_BLACK, FILLRECT_CHECKER); } /* Set up a clipping area for the station preview. */ - if (FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.right - r.left + 1, r.bottom - r.top + 1)) { + if (FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.Width(), r.Height())) { DrawPixelInfo *old_dpi = _cur_dpi; _cur_dpi = &tmp_dpi; - int x = ScaleGUITrad(31) + 1; - int y = r.bottom - r.top - ScaleGUITrad(31); + int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); + int y = (r.Height() + ScaleSpriteTrad(58)) / 2 - ScaleSpriteTrad(31); if (!DrawStationTile(x, y, _cur_railtype, _railstation.orientation, _railstation.station_class, type)) { StationPickerDrawSprite(x, y, STATION_RAIL, _cur_railtype, INVALID_ROADTYPE, 2 + _railstation.orientation); } @@ -1609,7 +1609,7 @@ static const NWidgetPart _nested_station_builder_widgets[] = { NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BRAS_PLATFORM_DRAG_N_DROP), SetMinimalSize(75, 12), SetDataTip(STR_STATION_BUILD_DRAG_DROP, STR_STATION_BUILD_DRAG_DROP_TOOLTIP), NWidget(NWID_SPACER), SetMinimalSize(2, 0), SetFill(1, 0), EndContainer(), - NWidget(WWT_LABEL, COLOUR_DARK_GREEN), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), SetPadding(WD_FRAMERECT_TOP, WD_FRAMERECT_RIGHT, WD_FRAMERECT_BOTTOM, WD_FRAMERECT_LEFT), SetFill(1, 0), + NWidget(WWT_LABEL, COLOUR_DARK_GREEN), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), SetPadding(WidgetDimensions::unscaled.framerect), SetFill(1, 0), NWidget(NWID_HORIZONTAL), NWidget(NWID_SPACER), SetMinimalSize(2, 0), SetFill(1, 0), NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BRAS_HIGHLIGHT_OFF), SetMinimalSize(60, 12), @@ -1634,7 +1634,7 @@ static const NWidgetPart _nested_station_builder_widgets[] = { EndContainer(), EndContainer(), NWidget(NWID_HORIZONTAL), - NWidget(WWT_EMPTY, INVALID_COLOUR, WID_BRAS_COVERAGE_TEXTS), SetPadding(0, WD_FRAMERECT_RIGHT, 0, WD_FRAMERECT_LEFT), SetFill(1, 1), SetResize(1, 0), + NWidget(WWT_EMPTY, INVALID_COLOUR, WID_BRAS_COVERAGE_TEXTS), SetPadding(WidgetDimensions::unscaled.framerect), SetFill(1, 1), SetResize(1, 0), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_BRAS_SHOW_NEWST_RESIZE), NWidget(NWID_VERTICAL), NWidget(WWT_PANEL, COLOUR_DARK_GREEN), SetFill(0, 1), EndContainer(), @@ -1673,15 +1673,14 @@ private: * @param widget_index index of this widget in the window * @param image the sprite to draw */ - void DrawSignalSprite(byte widget_index, SpriteID image) const + void DrawSignalSprite(const Rect &r, int widget_index, SpriteID image) const { Point offset; Dimension sprite_size = GetSpriteSize(image, &offset); - const NWidgetBase *widget = this->GetWidget(widget_index); - int x = widget->pos_x - offset.x + - (widget->current_x - sprite_size.width + offset.x) / 2; // centered - int y = widget->pos_y - sig_sprite_bottom_offset + WD_IMGBTN_TOP + - (widget->current_y - WD_IMGBTN_TOP - WD_IMGBTN_BOTTOM + sig_sprite_size.height) / 2; // aligned to bottom + Rect ir = r.Shrink(WidgetDimensions::scaled.imgbtn); + int x = CenterBounds(ir.left, ir.right, sprite_size.width - offset.x) - offset.x; // centered + int y = ir.top - sig_sprite_bottom_offset + + (ir.Height() + sig_sprite_size.height) / 2; // aligned to bottom DrawSprite(image, PAL_NONE, x + this->IsWidgetLowered(widget_index), @@ -1742,12 +1741,12 @@ public: { if (widget == WID_BS_DRAG_SIGNALS_DENSITY_LABEL) { /* Two digits for signals density. */ - size->width = std::max(size->width, 2 * GetDigitWidth() + padding.width + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT); + size->width = std::max(size->width, 2 * GetDigitWidth() + padding.width + WidgetDimensions::scaled.framerect.Horizontal()); } else if (IsInsideMM(widget, WID_BS_SEMAPHORE_NORM, WID_BS_ELECTRIC_PBS_OWAY + 1)) { - size->width = std::max(size->width, this->sig_sprite_size.width + WD_IMGBTN_LEFT + WD_IMGBTN_RIGHT); - size->height = std::max(size->height, this->sig_sprite_size.height + WD_IMGBTN_TOP + WD_IMGBTN_BOTTOM); + size->width = std::max(size->width, this->sig_sprite_size.width + padding.width); + size->height = std::max(size->height, this->sig_sprite_size.height + padding.height); } else if (widget == WID_BS_CAPTION) { - size->width += WD_FRAMETEXT_LEFT + WD_FRAMETEXT_RIGHT; + size->width += WidgetDimensions::scaled.frametext.Horizontal(); } } @@ -1768,7 +1767,7 @@ public: int var = SIG_SEMAPHORE - (widget - WID_BS_SEMAPHORE_NORM) / SIGTYPE_END; // SignalVariant order is reversed compared to the widgets. SpriteID sprite = GetRailTypeInfo(_cur_railtype)->gui_sprites.signals[type][var][this->IsWidgetLowered(widget)]; - this->DrawSignalSprite(widget, sprite); + this->DrawSignalSprite(r, widget, sprite); } } @@ -1931,15 +1930,23 @@ struct BuildRailDepotWindow : public PickerWindowBase { { if (!IsInsideMM(widget, WID_BRAD_DEPOT_NE, WID_BRAD_DEPOT_NW + 1)) return; - size->width = ScaleGUITrad(64) + 2; - size->height = ScaleGUITrad(48) + 2; + size->width = ScaleGUITrad(64) + WidgetDimensions::scaled.fullbevel.Horizontal(); + size->height = ScaleGUITrad(48) + WidgetDimensions::scaled.fullbevel.Vertical(); } void DrawWidget(const Rect &r, int widget) const override { if (!IsInsideMM(widget, WID_BRAD_DEPOT_NE, WID_BRAD_DEPOT_NW + 1)) return; - DrawTrainDepotSprite(r.left + 1 + ScaleGUITrad(31), r.bottom - ScaleGUITrad(31), widget - WID_BRAD_DEPOT_NE + DIAGDIR_NE, _cur_railtype); + DrawPixelInfo tmp_dpi; + if (FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.Width(), r.Height())) { + DrawPixelInfo *old_dpi = _cur_dpi; + _cur_dpi = &tmp_dpi; + int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); + int y = (r.Height() + ScaleSpriteTrad(48)) / 2 - ScaleSpriteTrad(31); + DrawTrainDepotSprite(x, y, widget - WID_BRAD_DEPOT_NE + DIAGDIR_NE, _cur_railtype); + _cur_dpi = old_dpi; + } } void OnClick(Point pt, int widget, int click_count) override @@ -2030,8 +2037,8 @@ struct BuildRailWaypointWindow : PickerWindowBase { break; case WID_BRW_WAYPOINT: - size->width = ScaleGUITrad(64) + 2; - size->height = ScaleGUITrad(58) + 2; + size->width = ScaleGUITrad(64) + WidgetDimensions::scaled.fullbevel.Horizontal(); + size->height = ScaleGUITrad(58) + WidgetDimensions::scaled.fullbevel.Vertical(); break; } } @@ -2042,10 +2049,19 @@ struct BuildRailWaypointWindow : PickerWindowBase { case WID_BRW_WAYPOINT: { byte type = GB(widget, 16, 16); const StationSpec *statspec = StationClass::Get(STAT_CLASS_WAYP)->GetSpec(type); - DrawWaypointSprite(r.left + 1 + ScaleGUITrad(31), r.bottom - ScaleGUITrad(31), type, _cur_railtype); + + DrawPixelInfo tmp_dpi; + if (FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.Width(), r.Height())) { + DrawPixelInfo *old_dpi = _cur_dpi; + _cur_dpi = &tmp_dpi; + int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); + int y = (r.Height() + ScaleSpriteTrad(58)) / 2 - ScaleSpriteTrad(31); + DrawWaypointSprite(x, y, type, _cur_railtype); + _cur_dpi = old_dpi; + } if (!IsStationAvailable(statspec)) { - GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, PC_BLACK, FILLRECT_CHECKER); + GfxFillRect(r.Shrink(WidgetDimensions::scaled.bevel), PC_BLACK, FILLRECT_CHECKER); } } } diff --git a/src/rev.cpp.in b/src/rev.cpp.in index a93a0df33b..0fd5b09a32 100644 --- a/src/rev.cpp.in +++ b/src/rev.cpp.in @@ -35,7 +35,7 @@ bool IsReleasedVersion() * * shows a "M", if the binary is made from modified source code. */ -const char _openttd_revision[] = "13.0-beta1"; +const char _openttd_revision[] = "13.0-RC1"; /** * The text version of OpenTTD's build date. @@ -48,12 +48,12 @@ const char _openttd_build_date[] = __DATE__ " " __TIME__; /** * The git revision hash of this version. */ -const char _openttd_revision_hash[] = "c4e655b1d4fa83b8f192d2df0062f6dd7f346aad"; +const char _openttd_revision_hash[] = "4b123394cf5102688d9635d2988a13dbc9018d4d"; /** * The year of this version. */ -const char _openttd_revision_year[] = "2022"; +const char _openttd_revision_year[] = "2023"; /** * Let us know if current build was modified. This detection diff --git a/src/road.h b/src/road.h index 6a2af6698f..c3fcc30ca9 100644 --- a/src/road.h +++ b/src/road.h @@ -58,7 +58,7 @@ enum RoadTypeSpriteGroup { ROTSG_CURSORS, ///< Optional: Cursor and toolbar icon images ROTSG_OVERLAY, ///< Optional: Images for overlaying track ROTSG_GROUND, ///< Required: Main group of ground images - ROTSG_reserved1, ///< Placeholder, if we need specific tunnel sprites. + ROTSG_TUNNEL, ///< Optional: Ground images for tunnels ROTSG_CATENARY_FRONT, ///< Optional: Catenary front ROTSG_CATENARY_BACK, ///< Optional: Catenary back ROTSG_BRIDGE, ///< Required: Bridge surface images @@ -66,6 +66,7 @@ enum RoadTypeSpriteGroup { ROTSG_DEPOT, ///< Optional: Depot images ROTSG_reserved3, ///< Placeholder, if we add road fences (for highways). ROTSG_ROADSTOP, ///< Required: Drive-in stop surface + ROTSG_ONEWAY, ///< Optional: One-way indicator images ROTSG_END, }; diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index 8d2461c48f..94b4423a15 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -502,6 +502,8 @@ static CommandCost RemoveRoad(TileIndex tile, DoCommandFlag flags, RoadBits piec } if (flags & DC_EXEC) { + MarkDirtyAdjacentLevelCrossingTiles(tile, GetCrossingRoadAxis(tile)); + /* A full diagonal road tile has two road bits. */ UpdateCompanyRoadInfrastructure(existing_rt, GetRoadOwner(tile, rtt), -2); @@ -780,6 +782,7 @@ CommandCost CmdBuildRoad(DoCommandFlag flags, TileIndex tile, RoadBits pieces, R MakeRoadCrossing(tile, company, company, GetTileOwner(tile), roaddir, GetRailType(tile), rtt == RTT_ROAD ? rt : INVALID_ROADTYPE, (rtt == RTT_TRAM) ? rt : INVALID_ROADTYPE, town_id); SetCrossingReservation(tile, reserved); UpdateLevelCrossing(tile, false); + MarkDirtyAdjacentLevelCrossingTiles(tile, GetCrossingRoadAxis(tile)); MarkTileDirtyByTile(tile); } return CommandCost(EXPENSES_CONSTRUCTION, 2 * RoadBuildCost(rt)); @@ -1486,21 +1489,24 @@ static void DrawRoadDetail(SpriteID img, const TileInfo *ti, int dx, int dy, int * @param tram_rti Tram road type information * @param road_offset Road sprite offset (based on road bits) * @param tram_offset Tram sprite offset (based on road bits) + * @param draw_underlay Whether to draw underlays */ -void DrawRoadOverlays(const TileInfo *ti, PaletteID pal, const RoadTypeInfo *road_rti, const RoadTypeInfo *tram_rti, uint road_offset, uint tram_offset) +void DrawRoadOverlays(const TileInfo *ti, PaletteID pal, const RoadTypeInfo *road_rti, const RoadTypeInfo *tram_rti, uint road_offset, uint tram_offset, bool draw_underlay) { - /* Road underlay takes precedence over tram */ - if (road_rti != nullptr) { - if (road_rti->UsesOverlay()) { - SpriteID ground = GetCustomRoadSprite(road_rti, ti->tile, ROTSG_GROUND); - DrawGroundSprite(ground + road_offset, pal); - } - } else { - if (tram_rti->UsesOverlay()) { - SpriteID ground = GetCustomRoadSprite(tram_rti, ti->tile, ROTSG_GROUND); - DrawGroundSprite(ground + tram_offset, pal); + if (draw_underlay) { + /* Road underlay takes precedence over tram */ + if (road_rti != nullptr) { + if (road_rti->UsesOverlay()) { + SpriteID ground = GetCustomRoadSprite(road_rti, ti->tile, ROTSG_GROUND); + DrawGroundSprite(ground + road_offset, pal); + } } else { - DrawGroundSprite(SPR_TRAMWAY_TRAM + tram_offset, pal); + if (tram_rti->UsesOverlay()) { + SpriteID ground = GetCustomRoadSprite(tram_rti, ti->tile, ROTSG_GROUND); + DrawGroundSprite(ground + tram_offset, pal); + } else { + DrawGroundSprite(SPR_TRAMWAY_TRAM + tram_offset, pal); + } } } @@ -1600,7 +1606,17 @@ static void DrawRoadBits(TileInfo *ti) if (road_rti != nullptr) { DisallowedRoadDirections drd = GetDisallowedRoadDirections(ti->tile); if (drd != DRD_NONE) { - DrawGroundSpriteAt(SPR_ONEWAY_BASE + drd - 1 + ((road == ROAD_X) ? 0 : 3), PAL_NONE, 8, 8, GetPartialPixelZ(8, 8, ti->tileh)); + SpriteID oneway = GetCustomRoadSprite(road_rti, ti->tile, ROTSG_ONEWAY); + + if (oneway == 0) oneway = SPR_ONEWAY_BASE; + + if ((ti->tileh == SLOPE_NE) || (ti->tileh == SLOPE_NW)) { + oneway += SPR_ONEWAY_SLOPE_N_OFFSET; + } else if ((ti->tileh == SLOPE_SE) || (ti->tileh == SLOPE_SW)) { + oneway += SPR_ONEWAY_SLOPE_S_OFFSET; + } + + DrawGroundSpriteAt(oneway + drd - 1 + ((road == ROAD_X) ? 0 : 3), PAL_NONE, 8, 8, GetPartialPixelZ(8, 8, ti->tileh)); } } @@ -1703,7 +1719,42 @@ static void DrawTile_Road(TileInfo *ti) SpriteID rail = GetCustomRailSprite(rti, ti->tile, RTSG_CROSSING) + axis; DrawGroundSprite(rail, pal); - DrawRailTileSeq(ti, &_crossing_layout, TO_CATENARY, rail, 0, PAL_NONE); + const Axis road_axis = GetCrossingRoadAxis(ti->tile); + const DiagDirection dir1 = AxisToDiagDir(road_axis); + const DiagDirection dir2 = ReverseDiagDir(dir1); + uint adjacent_diagdirs = 0; + for (DiagDirection dir : { dir1, dir2 }) { + const TileIndex t = TileAddByDiagDir(ti->tile, dir); + if (t < MapSize() && IsLevelCrossingTile(t) && GetCrossingRoadAxis(t) == road_axis) { + SetBit(adjacent_diagdirs, dir); + } + } + + switch (adjacent_diagdirs) { + case 0: + DrawRailTileSeq(ti, &_crossing_layout, TO_CATENARY, rail, 0, PAL_NONE); + break; + + case (1 << DIAGDIR_NE): + DrawRailTileSeq(ti, &_crossing_layout_SW, TO_CATENARY, rail, 0, PAL_NONE); + break; + + case (1 << DIAGDIR_SE): + DrawRailTileSeq(ti, &_crossing_layout_NW, TO_CATENARY, rail, 0, PAL_NONE); + break; + + case (1 << DIAGDIR_SW): + DrawRailTileSeq(ti, &_crossing_layout_NE, TO_CATENARY, rail, 0, PAL_NONE); + break; + + case (1 << DIAGDIR_NW): + DrawRailTileSeq(ti, &_crossing_layout_SE, TO_CATENARY, rail, 0, PAL_NONE); + break; + + default: + /* Show no sprites */ + break; + } } else if (draw_pbs || tram_rti != nullptr || road_rti->UsesOverlay()) { /* Add another rail overlay, unless there is only the base road sprite. */ PaletteID pal = draw_pbs ? PALETTE_CRASH : PAL_NONE; @@ -2033,7 +2084,16 @@ static TrackStatus GetTileTrackStatus_Road(TileIndex tile, TransportType mode, u if (side != INVALID_DIAGDIR && axis != DiagDirToAxis(side)) break; trackdirbits = TrackBitsToTrackdirBits(AxisToTrackBits(axis)); - if (IsCrossingBarred(tile)) red_signals = trackdirbits; + if (IsCrossingBarred(tile)) { + red_signals = trackdirbits; + auto mask_red_signal_bits_if_crossing_barred = [&](TileIndex t, TrackdirBits mask) { + if (IsLevelCrossingTile(t) && IsCrossingBarred(t)) red_signals &= mask; + }; + /* Check for blocked adjacent crossing to south, keep only southbound red signal trackdirs, allow northbound traffic */ + mask_red_signal_bits_if_crossing_barred(TileAddByDiagDir(tile, AxisToDiagDir(axis)), TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_SE); + /* Check for blocked adjacent crossing to north, keep only northbound red signal trackdirs, allow southbound traffic */ + mask_red_signal_bits_if_crossing_barred(TileAddByDiagDir(tile, ReverseDiagDir(AxisToDiagDir(axis))), TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_NW); + } break; } diff --git a/src/road_func.h b/src/road_func.h index 9376460575..2db2f24fe3 100644 --- a/src/road_func.h +++ b/src/road_func.h @@ -153,10 +153,11 @@ RoadTypes GetCompanyRoadTypes(CompanyID company, bool introduces = true); RoadTypes GetRoadTypes(bool introduces); RoadTypes AddDateIntroducedRoadTypes(RoadTypes current, Date date); -void UpdateLevelCrossing(TileIndex tile, bool sound = true); +void UpdateLevelCrossing(TileIndex tile, bool sound = true, bool force_bar = false); +void MarkDirtyAdjacentLevelCrossingTiles(TileIndex tile, Axis road_axis); void UpdateCompanyRoadInfrastructure(RoadType rt, Owner o, int count); struct TileInfo; -void DrawRoadOverlays(const TileInfo *ti, PaletteID pal, const RoadTypeInfo *road_rti, const RoadTypeInfo *tram_rit, uint road_offset, uint tram_offset); +void DrawRoadOverlays(const TileInfo *ti, PaletteID pal, const RoadTypeInfo *road_rti, const RoadTypeInfo *tram_rit, uint road_offset, uint tram_offset, bool draw_underlay = true); #endif /* ROAD_FUNC_H */ diff --git a/src/road_gui.cpp b/src/road_gui.cpp index cb49688d5d..ca3d91f183 100644 --- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -974,15 +974,23 @@ struct BuildRoadDepotWindow : public PickerWindowBase { { if (!IsInsideMM(widget, WID_BROD_DEPOT_NE, WID_BROD_DEPOT_NW + 1)) return; - size->width = ScaleGUITrad(64) + 2; - size->height = ScaleGUITrad(48) + 2; + size->width = ScaleGUITrad(64) + WidgetDimensions::scaled.fullbevel.Horizontal(); + size->height = ScaleGUITrad(48) + WidgetDimensions::scaled.fullbevel.Vertical(); } void DrawWidget(const Rect &r, int widget) const override { if (!IsInsideMM(widget, WID_BROD_DEPOT_NE, WID_BROD_DEPOT_NW + 1)) return; - DrawRoadDepotSprite(r.left + 1 + ScaleGUITrad(31), r.bottom - ScaleGUITrad(31), (DiagDirection)(widget - WID_BROD_DEPOT_NE + DIAGDIR_NE), _cur_roadtype); + DrawPixelInfo tmp_dpi; + if (FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.Width(), r.Height())) { + DrawPixelInfo *old_dpi = _cur_dpi; + _cur_dpi = &tmp_dpi; + int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); + int y = (r.Height() + ScaleSpriteTrad(48)) / 2 - ScaleSpriteTrad(31); + DrawRoadDepotSprite(x, y, (DiagDirection)(widget - WID_BROD_DEPOT_NE + DIAGDIR_NE), _cur_roadtype); + _cur_dpi = old_dpi; + } } void OnClick(Point pt, int widget, int click_count) override @@ -1011,27 +1019,20 @@ static const NWidgetPart _nested_build_road_depot_widgets[] = { NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_BROD_CAPTION), SetDataTip(STR_BUILD_DEPOT_ROAD_ORIENTATION_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), EndContainer(), NWidget(WWT_PANEL, COLOUR_DARK_GREEN), - NWidget(NWID_SPACER), SetMinimalSize(0, 3), - NWidget(NWID_HORIZONTAL_LTR), - NWidget(NWID_SPACER), SetMinimalSize(3, 0), SetFill(1, 0), - NWidget(NWID_VERTICAL), - NWidget(WWT_PANEL, COLOUR_GREY, WID_BROD_DEPOT_NW), SetMinimalSize(66, 50), SetDataTip(0x0, STR_BUILD_DEPOT_ROAD_ORIENTATION_SELECT_TOOLTIP), + NWidget(NWID_HORIZONTAL), SetPadding(3), + NWidget(NWID_SPACER), SetFill(1, 0), + NWidget(NWID_VERTICAL), SetPIP(0, 2, 0), + NWidget(NWID_HORIZONTAL_LTR), SetPIP(0, 2, 0), + NWidget(WWT_PANEL, COLOUR_GREY, WID_BROD_DEPOT_NW), SetMinimalSize(66, 50), SetFill(0, 0), SetDataTip(0x0, STR_BUILD_DEPOT_ROAD_ORIENTATION_SELECT_TOOLTIP), EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY, WID_BROD_DEPOT_NE), SetMinimalSize(66, 50), SetFill(0, 0), SetDataTip(0x0, STR_BUILD_DEPOT_ROAD_ORIENTATION_SELECT_TOOLTIP), EndContainer(), EndContainer(), - NWidget(NWID_SPACER), SetMinimalSize(0, 2), - NWidget(WWT_PANEL, COLOUR_GREY, WID_BROD_DEPOT_SW), SetMinimalSize(66, 50), SetDataTip(0x0, STR_BUILD_DEPOT_ROAD_ORIENTATION_SELECT_TOOLTIP), + NWidget(NWID_HORIZONTAL_LTR), SetPIP(0, 2, 0), + NWidget(WWT_PANEL, COLOUR_GREY, WID_BROD_DEPOT_SW), SetMinimalSize(66, 50), SetFill(0, 0), SetDataTip(0x0, STR_BUILD_DEPOT_ROAD_ORIENTATION_SELECT_TOOLTIP), EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY, WID_BROD_DEPOT_SE), SetMinimalSize(66, 50), SetFill(0, 0), SetDataTip(0x0, STR_BUILD_DEPOT_ROAD_ORIENTATION_SELECT_TOOLTIP), EndContainer(), EndContainer(), EndContainer(), - NWidget(NWID_SPACER), SetMinimalSize(2, 0), - NWidget(NWID_VERTICAL), - NWidget(WWT_PANEL, COLOUR_GREY, WID_BROD_DEPOT_NE), SetMinimalSize(66, 50), SetDataTip(0x0, STR_BUILD_DEPOT_ROAD_ORIENTATION_SELECT_TOOLTIP), - EndContainer(), - NWidget(NWID_SPACER), SetMinimalSize(0, 2), - NWidget(WWT_PANEL, COLOUR_GREY, WID_BROD_DEPOT_SE), SetMinimalSize(66, 50), SetDataTip(0x0, STR_BUILD_DEPOT_ROAD_ORIENTATION_SELECT_TOOLTIP), - EndContainer(), - EndContainer(), - NWidget(NWID_SPACER), SetMinimalSize(3, 0), SetFill(1, 0), + NWidget(NWID_SPACER), SetFill(1, 0), EndContainer(), - NWidget(NWID_SPACER), SetMinimalSize(0, 3), EndContainer(), }; @@ -1091,9 +1092,9 @@ struct BuildRoadStationWindow : public PickerWindowBase { /* 'Accepts' and 'Supplies' texts. */ StationCoverageType sct = (this->window_class == WC_BUS_STATION) ? SCT_PASSENGERS_ONLY : SCT_NON_PASSENGERS_ONLY; Rect r = this->GetWidget(WID_BROS_ACCEPTANCE)->GetCurrentRect(); - int top = r.top + ScaleGUITrad(WD_PAR_VSEP_NORMAL); - top = DrawStationCoverageAreaText(r.left, r.right, top, sct, rad, false) + ScaleGUITrad(WD_PAR_VSEP_NORMAL); - top = DrawStationCoverageAreaText(r.left, r.right, top, sct, rad, true) + ScaleGUITrad(WD_PAR_VSEP_NORMAL); + int top = r.top + WidgetDimensions::scaled.vsep_normal; + top = DrawStationCoverageAreaText(r.left, r.right, top, sct, rad, false) + WidgetDimensions::scaled.vsep_normal; + top = DrawStationCoverageAreaText(r.left, r.right, top, sct, rad, true) + WidgetDimensions::scaled.vsep_normal; /* Resize background if the window is too small. * Never make the window smaller to avoid oscillating if the size change affects the acceptance. * (This is the case, if making the window bigger moves the mouse into the window.) */ @@ -1106,8 +1107,8 @@ struct BuildRoadStationWindow : public PickerWindowBase { { if (!IsInsideMM(widget, WID_BROS_STATION_NE, WID_BROS_STATION_Y + 1)) return; - size->width = ScaleGUITrad(64) + 2; - size->height = ScaleGUITrad(48) + 2; + size->width = ScaleGUITrad(64) + WidgetDimensions::scaled.fullbevel.Horizontal(); + size->height = ScaleGUITrad(48) + WidgetDimensions::scaled.fullbevel.Vertical(); } void DrawWidget(const Rect &r, int widget) const override @@ -1115,7 +1116,16 @@ struct BuildRoadStationWindow : public PickerWindowBase { if (!IsInsideMM(widget, WID_BROS_STATION_NE, WID_BROS_STATION_Y + 1)) return; StationType st = (this->window_class == WC_BUS_STATION) ? STATION_BUS : STATION_TRUCK; - StationPickerDrawSprite(r.left + 1 + ScaleGUITrad(31), r.bottom - ScaleGUITrad(31), st, INVALID_RAILTYPE, _cur_roadtype, widget - WID_BROS_STATION_NE); + + DrawPixelInfo tmp_dpi; + if (FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.Width(), r.Height())) { + DrawPixelInfo *old_dpi = _cur_dpi; + _cur_dpi = &tmp_dpi; + int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); + int y = (r.Height() + ScaleSpriteTrad(48)) / 2 - ScaleSpriteTrad(31); + StationPickerDrawSprite(x, y, st, INVALID_RAILTYPE, _cur_roadtype, widget - WID_BROS_STATION_NE); + _cur_dpi = old_dpi; + } } void OnClick(Point pt, int widget, int click_count) override @@ -1163,24 +1173,24 @@ static const NWidgetPart _nested_road_station_picker_widgets[] = { NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_BROS_CAPTION), EndContainer(), NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BROS_BACKGROUND), - NWidget(NWID_SPACER), SetMinimalSize(0, 3), - NWidget(NWID_HORIZONTAL), SetPIP(0, 2, 0), + NWidget(NWID_HORIZONTAL), SetPadding(3), NWidget(NWID_SPACER), SetFill(1, 0), - NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_NW), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(), - NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_NE), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(), - NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_X), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(), + NWidget(NWID_VERTICAL), SetPIP(0, 2, 0), + NWidget(NWID_HORIZONTAL), SetPIP(0, 2, 0), + NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_NW), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_NE), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_X), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(), + EndContainer(), + NWidget(NWID_HORIZONTAL), SetPIP(0, 2, 0), + NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_SW), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_SE), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_Y), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(), + EndContainer(), + EndContainer(), NWidget(NWID_SPACER), SetFill(1, 0), EndContainer(), - NWidget(NWID_SPACER), SetMinimalSize(0, 2), - NWidget(NWID_HORIZONTAL), SetPIP(0, 2, 0), - NWidget(NWID_SPACER), SetFill(1, 0), - NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_SW), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(), - NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_SE), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(), - NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_Y), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(), - NWidget(NWID_SPACER), SetFill(1, 0), - EndContainer(), - NWidget(WWT_LABEL, COLOUR_DARK_GREEN, WID_BROS_INFO), SetPadding(WD_FRAMERECT_TOP, WD_FRAMERECT_RIGHT, WD_FRAMERECT_BOTTOM, WD_FRAMERECT_LEFT), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), SetFill(1, 0), - NWidget(NWID_HORIZONTAL), SetPIP(2, 0, 2), + NWidget(WWT_LABEL, COLOUR_DARK_GREEN, WID_BROS_INFO), SetPadding(WidgetDimensions::unscaled.framerect), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), SetFill(1, 0), + NWidget(NWID_HORIZONTAL), SetPadding(3), NWidget(NWID_SPACER), SetFill(1, 0), NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BROS_LT_OFF), SetMinimalSize(60, 12), SetDataTip(STR_STATION_BUILD_COVERAGE_OFF, STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP), @@ -1188,7 +1198,7 @@ static const NWidgetPart _nested_road_station_picker_widgets[] = { SetDataTip(STR_STATION_BUILD_COVERAGE_ON, STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP), NWidget(NWID_SPACER), SetFill(1, 0), EndContainer(), - NWidget(WWT_EMPTY, COLOUR_DARK_GREEN, WID_BROS_ACCEPTANCE), SetPadding(0, WD_FRAMERECT_RIGHT, 0, WD_FRAMERECT_LEFT), SetResize(0, 1), + NWidget(WWT_EMPTY, COLOUR_DARK_GREEN, WID_BROS_ACCEPTANCE), SetPadding(WidgetDimensions::unscaled.framerect), SetResize(0, 1), EndContainer(), }; @@ -1206,15 +1216,18 @@ static const NWidgetPart _nested_tram_station_picker_widgets[] = { NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_BROS_CAPTION), EndContainer(), NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BROS_BACKGROUND), - NWidget(NWID_SPACER), SetMinimalSize(0, 3), - NWidget(NWID_HORIZONTAL), SetPIP(0, 2, 0), + NWidget(NWID_HORIZONTAL), SetPadding(3), NWidget(NWID_SPACER), SetFill(1, 0), - NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_X), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(), - NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_Y), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(), + NWidget(NWID_VERTICAL), SetPIP(0, 2, 0), + NWidget(NWID_HORIZONTAL), SetPIP(0, 2, 0), + NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_X), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_Y), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(), + EndContainer(), + EndContainer(), NWidget(NWID_SPACER), SetFill(1, 0), EndContainer(), - NWidget(WWT_LABEL, COLOUR_DARK_GREEN, WID_BROS_INFO), SetPadding(WD_FRAMERECT_TOP, WD_FRAMERECT_RIGHT, WD_FRAMERECT_BOTTOM, WD_FRAMERECT_LEFT), SetMinimalSize(140, 14), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), SetFill(1, 0), - NWidget(NWID_HORIZONTAL), SetPIP(2, 0, 2), + NWidget(WWT_LABEL, COLOUR_DARK_GREEN, WID_BROS_INFO), SetPadding(WidgetDimensions::unscaled.framerect), SetMinimalSize(140, 14), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), SetFill(1, 0), + NWidget(NWID_HORIZONTAL), SetPadding(3), NWidget(NWID_SPACER), SetFill(1, 0), NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BROS_LT_OFF), SetMinimalSize(60, 12), SetDataTip(STR_STATION_BUILD_COVERAGE_OFF, STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP), @@ -1222,7 +1235,7 @@ static const NWidgetPart _nested_tram_station_picker_widgets[] = { SetDataTip(STR_STATION_BUILD_COVERAGE_ON, STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP), NWidget(NWID_SPACER), SetFill(1, 0), EndContainer(), - NWidget(WWT_EMPTY, COLOUR_DARK_GREEN, WID_BROS_ACCEPTANCE), SetPadding(0, WD_FRAMERECT_RIGHT, 0, WD_FRAMERECT_LEFT), SetResize(0, 1), + NWidget(WWT_EMPTY, COLOUR_DARK_GREEN, WID_BROS_ACCEPTANCE), SetPadding(WidgetDimensions::unscaled.framerect), SetResize(0, 1), EndContainer(), }; diff --git a/src/roadveh.h b/src/roadveh.h index 3ef17dfdac..8dac7b5d51 100644 --- a/src/roadveh.h +++ b/src/roadveh.h @@ -124,28 +124,28 @@ struct RoadVehicle FINAL : public GroundVehicle { friend struct GroundVehicle; // GroundVehicle needs to use the acceleration functions defined at RoadVehicle. - void MarkDirty(); - void UpdateDeltaXY(); - ExpensesType GetExpenseType(bool income) const { return income ? EXPENSES_ROADVEH_REVENUE : EXPENSES_ROADVEH_RUN; } - bool IsPrimaryVehicle() const { return this->IsFrontEngine(); } - void GetImage(Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) const; - int GetDisplaySpeed() const { return this->gcache.last_speed / 2; } - int GetDisplayMaxSpeed() const { return this->vcache.cached_max_speed / 2; } - Money GetRunningCost() const; + void MarkDirty() override; + void UpdateDeltaXY() override; + ExpensesType GetExpenseType(bool income) const override { return income ? EXPENSES_ROADVEH_REVENUE : EXPENSES_ROADVEH_RUN; } + bool IsPrimaryVehicle() const override { return this->IsFrontEngine(); } + void GetImage(Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) const override; + int GetDisplaySpeed() const override { return this->gcache.last_speed / 2; } + int GetDisplayMaxSpeed() const override { return this->vcache.cached_max_speed / 2; } + Money GetRunningCost() const override; int GetDisplayImageWidth(Point *offset = nullptr) const; - bool IsInDepot() const { return this->state == RVSB_IN_DEPOT; } - bool Tick(); - void OnNewDay(); - uint Crash(bool flooded = false); - Trackdir GetVehicleTrackdir() const; - TileIndex GetOrderStationLocation(StationID station); - bool FindClosestDepot(TileIndex *location, DestinationID *destination, bool *reverse); + bool IsInDepot() const override { return this->state == RVSB_IN_DEPOT; } + bool Tick() override; + void OnNewDay() override; + uint Crash(bool flooded = false) override; + Trackdir GetVehicleTrackdir() const override; + TileIndex GetOrderStationLocation(StationID station) override; + bool FindClosestDepot(TileIndex *location, DestinationID *destination, bool *reverse) override; bool IsBus() const; - int GetCurrentMaxSpeed() const; + int GetCurrentMaxSpeed() const override; int UpdateSpeed(); - void SetDestTile(TileIndex tile); + void SetDestTile(TileIndex tile) override; protected: // These functions should not be called outside acceleration code. @@ -178,7 +178,7 @@ protected: // These functions should not be called outside acceleration code. */ inline uint16 GetWeight() const { - uint16 weight = (CargoSpec::Get(this->cargo_type)->weight * this->cargo.StoredCount()) / 16; + uint16 weight = CargoSpec::Get(this->cargo_type)->WeightOfNUnits(this->cargo.StoredCount()); /* Vehicle weight is not added for articulated parts. */ if (!this->IsArticulatedPart()) { @@ -189,6 +189,12 @@ protected: // These functions should not be called outside acceleration code. return weight; } + /** + * Calculates the weight value that this vehicle will have when fully loaded with its current cargo. + * @return Weight value in tonnes. + */ + uint16 GetMaxWeight() const override; + /** * Allows to know the tractive effort value that this vehicle will use. * @return Tractive effort value from the engine. diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp index 69e92f789f..8ac7c55fa0 100644 --- a/src/roadveh_cmd.cpp +++ b/src/roadveh_cmd.cpp @@ -94,10 +94,10 @@ int RoadVehicle::GetDisplayImageWidth(Point *offset) const int reference_width = ROADVEHINFO_DEFAULT_VEHICLE_WIDTH; if (offset != nullptr) { - offset->x = ScaleGUITrad(reference_width) / 2; + offset->x = ScaleSpriteTrad(reference_width) / 2; offset->y = 0; } - return ScaleGUITrad(this->gcache.cached_veh_length * reference_width / VEHICLE_LENGTH); + return ScaleSpriteTrad(this->gcache.cached_veh_length * reference_width / VEHICLE_LENGTH); } static void GetRoadVehIcon(EngineID engine, EngineImageType image_type, VehicleSpriteSeq *result) @@ -175,8 +175,8 @@ void GetRoadVehSpriteSize(EngineID engine, uint &width, uint &height, int &xoffs Rect rect; seq.GetBounds(&rect); - width = UnScaleGUI(rect.right - rect.left + 1); - height = UnScaleGUI(rect.bottom - rect.top + 1); + width = UnScaleGUI(rect.Width()); + height = UnScaleGUI(rect.Height()); xoffs = UnScaleGUI(rect.left); yoffs = UnScaleGUI(rect.top); } @@ -1004,7 +1004,7 @@ struct RoadDriveEntry { #include "table/roadveh_movement.h" -static bool RoadVehLeaveDepot(RoadVehicle *v, bool first) +bool RoadVehLeaveDepot(RoadVehicle *v, bool first) { /* Don't leave unless v and following wagons are in the depot. */ for (const RoadVehicle *u = v; u != nullptr; u = u->Next()) { @@ -1753,3 +1753,16 @@ Trackdir RoadVehicle::GetVehicleTrackdir() const * otherwise transform it into a valid track direction */ return (Trackdir)((IsReversingRoadTrackdir((Trackdir)this->state)) ? (this->state - 6) : this->state); } + +uint16 RoadVehicle::GetMaxWeight() const +{ + uint16 weight = CargoSpec::Get(this->cargo_type)->WeightOfNUnits(this->GetEngine()->DetermineCapacity(this)); + + /* Vehicle weight is not added for articulated parts. */ + if (!this->IsArticulatedPart()) { + /* Road vehicle weight is in units of 1/4 t. */ + weight += GetVehicleProperty(this, PROP_ROADVEH_WEIGHT, RoadVehInfo(this->engine_type)->weight) / 4; + } + + return weight; +} diff --git a/src/roadveh_cmd.h b/src/roadveh_cmd.h index 3d71abce73..b168675f98 100644 --- a/src/roadveh_cmd.h +++ b/src/roadveh_cmd.h @@ -14,6 +14,8 @@ #include "engine_type.h" #include "vehicle_type.h" +bool RoadVehLeaveDepot(RoadVehicle *v, bool first); + CommandCost CmdBuildRoadVehicle(DoCommandFlag flags, TileIndex tile, const Engine *e, Vehicle **v); CommandCost CmdTurnRoadVeh(DoCommandFlag flags, VehicleID veh_id); diff --git a/src/roadveh_gui.cpp b/src/roadveh_gui.cpp index f25bd734f9..8b3ee04775 100644 --- a/src/roadveh_gui.cpp +++ b/src/roadveh_gui.cpp @@ -23,20 +23,19 @@ * Draw the details for the given vehicle at the given position * * @param v current vehicle - * @param left The left most coordinate to draw - * @param right The right most coordinate to draw - * @param y The y coordinate + * @param r the Rect to draw within */ -void DrawRoadVehDetails(const Vehicle *v, int left, int right, int y) +void DrawRoadVehDetails(const Vehicle *v, const Rect &r) { - uint y_offset = v->HasArticulatedPart() ? ScaleGUITrad(15) : 0; // Draw the first line below the sprite of an articulated RV instead of after it. + int y = r.top + (v->HasArticulatedPart() ? ScaleSpriteTrad(15) : 0); // Draw the first line below the sprite of an articulated RV instead of after it. StringID str; Money feeder_share = 0; SetDParam(0, v->engine_type); SetDParam(1, v->build_year); SetDParam(2, v->value); - DrawString(left, right, y + y_offset, STR_VEHICLE_INFO_BUILT_VALUE); + DrawString(r.left, r.right, y, STR_VEHICLE_INFO_BUILT_VALUE); + y += FONT_HEIGHT_NORMAL; if (v->HasArticulatedPart()) { CargoArray max_cargo; @@ -76,7 +75,8 @@ void DrawRoadVehDetails(const Vehicle *v, int left, int right, int y) } } - DrawString(left, right, y + FONT_HEIGHT_NORMAL + y_offset, capacity, TC_BLUE); + DrawString(r.left, r.right, y, capacity, TC_BLUE); + y += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; for (const Vehicle *u = v; u != nullptr; u = u->Next()) { if (u->cargo_cap == 0) continue; @@ -89,17 +89,16 @@ void DrawRoadVehDetails(const Vehicle *v, int left, int right, int y) str = STR_VEHICLE_DETAILS_CARGO_FROM; feeder_share += u->cargo.FeederShare(); } - DrawString(left, right, y + 2 * FONT_HEIGHT_NORMAL + 1 + y_offset, str); - - y_offset += FONT_HEIGHT_NORMAL + 1; + DrawString(r.left, r.right, y, str); + y += FONT_HEIGHT_NORMAL; } - - y_offset -= FONT_HEIGHT_NORMAL + 1; + y += WidgetDimensions::scaled.vsep_normal; } else { SetDParam(0, v->cargo_type); SetDParam(1, v->cargo_cap); SetDParam(4, GetCargoSubtypeText(v)); - DrawString(left, right, y + FONT_HEIGHT_NORMAL + y_offset, STR_VEHICLE_INFO_CAPACITY); + DrawString(r.left, r.right, y, STR_VEHICLE_INFO_CAPACITY); + y += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; str = STR_VEHICLE_DETAILS_CARGO_EMPTY; if (v->cargo.StoredCount() > 0) { @@ -109,39 +108,40 @@ void DrawRoadVehDetails(const Vehicle *v, int left, int right, int y) str = STR_VEHICLE_DETAILS_CARGO_FROM; feeder_share += v->cargo.FeederShare(); } - DrawString(left, right, y + 2 * FONT_HEIGHT_NORMAL + 1 + y_offset, str); + DrawString(r.left, r.right, y, str); + y += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; } /* Draw Transfer credits text */ SetDParam(0, feeder_share); - DrawString(left, right, y + 3 * FONT_HEIGHT_NORMAL + 3 + y_offset, STR_VEHICLE_INFO_FEEDER_CARGO_VALUE); + DrawString(r.left, r.right, y, STR_VEHICLE_INFO_FEEDER_CARGO_VALUE); } /** * Draws an image of a road vehicle chain * @param v Front vehicle - * @param left The minimum horizontal position - * @param right The maximum horizontal position - * @param y Vertical position to draw at + * @param r Rect to draw at * @param selection Selected vehicle to draw a frame around * @param skip Number of pixels to skip at the front (for scrolling) */ -void DrawRoadVehImage(const Vehicle *v, int left, int right, int y, VehicleID selection, EngineImageType image_type, int skip) +void DrawRoadVehImage(const Vehicle *v, const Rect &r, VehicleID selection, EngineImageType image_type, int skip) { bool rtl = _current_text_dir == TD_RTL; Direction dir = rtl ? DIR_E : DIR_W; const RoadVehicle *u = RoadVehicle::From(v); DrawPixelInfo tmp_dpi, *old_dpi; - int max_width = right - left + 1; + int max_width = r.Width(); - if (!FillDrawPixelInfo(&tmp_dpi, left, y, max_width, ScaleGUITrad(14))) return; + if (!FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.Width(), r.Height())) return; old_dpi = _cur_dpi; _cur_dpi = &tmp_dpi; int px = rtl ? max_width + skip : -skip; - for (; u != nullptr && (rtl ? px > 0 : px < max_width); u = u->Next()) { + int y = r.Height() / 2; + for (; u != nullptr && (rtl ? px > 0 : px < max_width); u = u->Next()) + { Point offset; int width = u->GetDisplayImageWidth(&offset); @@ -149,15 +149,17 @@ void DrawRoadVehImage(const Vehicle *v, int left, int right, int y, VehicleID se PaletteID pal = (u->vehstatus & VS_CRASHED) ? PALETTE_CRASH : GetVehiclePalette(u); VehicleSpriteSeq seq; u->GetImage(dir, image_type, &seq); - seq.Draw(px + (rtl ? -offset.x : offset.x), ScaleGUITrad(6) + offset.y, pal, (u->vehstatus & VS_CRASHED) != 0); + seq.Draw(px + (rtl ? -offset.x : offset.x), y + offset.y, pal, (u->vehstatus & VS_CRASHED) != 0); } px += rtl ? -width : width; } - if (v->index == selection) { - DrawFrameRect((rtl ? px : 0), 0, (rtl ? max_width : px) - 1, ScaleGUITrad(13) - 1, COLOUR_WHITE, FR_BORDERONLY); - } - _cur_dpi = old_dpi; + + if (v->index == selection) { + int height = ScaleSpriteTrad(12); + Rect hr = {(rtl ? px : 0), 0, (rtl ? max_width : px) - 1, height - 1}; + DrawFrameRect(hr.Translate(r.left, CenterBounds(r.top, r.bottom, height)).Expand(WidgetDimensions::scaled.bevel), COLOUR_WHITE, FR_BORDERONLY); + } } diff --git a/src/saveload/CMakeLists.txt b/src/saveload/CMakeLists.txt index 32bcc57ac1..3eea5b6741 100644 --- a/src/saveload/CMakeLists.txt +++ b/src/saveload/CMakeLists.txt @@ -19,6 +19,7 @@ add_files( group_sl.cpp industry_sl.cpp labelmaps_sl.cpp + league_sl.cpp linkgraph_sl.cpp map_sl.cpp misc_sl.cpp diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index a68a6accc6..dfbfef5def 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -24,6 +24,7 @@ #include "../string_func.h" #include "../date_func.h" #include "../roadveh.h" +#include "../roadveh_cmd.h" #include "../train.h" #include "../station_base.h" #include "../waypoint_base.h" @@ -40,6 +41,7 @@ #include "../road_cmd.h" #include "../ai/ai.hpp" #include "../ai/ai_gui.hpp" +#include "../game/game.hpp" #include "../town.h" #include "../economy_base.h" #include "../animated_tile_func.h" @@ -57,7 +59,6 @@ #include "../ship.h" #include "../water.h" - #include "saveload_internal.h" #include @@ -302,7 +303,6 @@ static void InitializeWindowsAndCaches() CheckTrainsLengths(); ShowNewGRFError(); - ShowAIDebugWindowIfAIError(); /* Rebuild the smallmap list of owners. */ BuildOwnerLegend(); @@ -537,6 +537,22 @@ static inline bool MayHaveBridgeAbove(TileIndex t) IsTileType(t, MP_WATER) || IsTileType(t, MP_TUNNELBRIDGE) || IsTileType(t, MP_OBJECT); } +/** + * Start the scripts. + */ +static void StartScripts() +{ + /* Start the GameScript. */ + Game::StartNew(); + + /* Start the AIs. */ + for (const Company *c : Company::Iterate()) { + if (Company::IsValidAiID(c->index)) AI::StartNew(c->index, false); + } + + ShowAIDebugWindowIfAIError(); +} + /** * Perform a (large) amount of savegame conversion *magic* in order to * load older savegames and to fill the caches for various purposes. @@ -798,13 +814,6 @@ bool AfterLoadGame() /* Update all vehicles */ AfterLoadVehicles(true); - /* Make sure there is an AI attached to an AI company */ - { - for (const Company *c : Company::Iterate()) { - if (c->is_ai && c->ai_instance == nullptr) AI::StartNew(c->index); - } - } - /* make sure there is a town in the game */ if (_game_mode == GM_NORMAL && Town::GetNumItems() == 0) { SetSaveLoadError(STR_ERROR_NO_TOWN_IN_SCENARIO); @@ -3155,6 +3164,56 @@ bool AfterLoadGame() } } + /* Road stops is 'only' updating some caches, but they are needed for PF calls in SLV_MULTITRACK_LEVEL_CROSSINGS teleporting. */ + AfterLoadRoadStops(); + + /* Road vehicles stopped on multitrack level crossings need teleporting to a depot + * to avoid crashing into the side of the train they're waiting for. */ + if (IsSavegameVersionBefore(SLV_MULTITRACK_LEVEL_CROSSINGS)) { + /* Teleport road vehicles to the nearest depot. */ + for (RoadVehicle *rv : RoadVehicle::Iterate()) { + /* Ignore trailers of articulated vehicles. */ + if (rv->IsArticulatedPart()) continue; + + /* Ignore moving vehicles. */ + if (rv->cur_speed > 0) continue; + + /* Ignore crashed vehicles. */ + if (rv->vehstatus & VS_CRASHED) continue; + + /* Ignore vehicles not on level crossings. */ + TileIndex cur_tile = rv->tile; + if (!IsLevelCrossingTile(cur_tile)) continue; + + TileIndex location; + DestinationID destination; + bool reverse = true; + + /* Try to find a depot with a distance limit of 512 tiles (Manhattan distance). */ + if (rv->FindClosestDepot(&location, &destination, &reverse) && DistanceManhattan(rv->tile, location) < 512u) { + /* Teleport all parts of articulated vehicles. */ + for (RoadVehicle *u = rv; u != nullptr; u = u->Next()) { + u->tile = location; + int x = TileX(location) * TILE_SIZE + TILE_SIZE / 2; + int y = TileY(location) * TILE_SIZE + TILE_SIZE / 2; + u->x_pos = x; + u->y_pos = y; + u->z_pos = GetSlopePixelZ(x, y); + + u->vehstatus |= VS_HIDDEN; + u->state = RVSB_IN_DEPOT; + u->UpdatePosition(); + } + RoadVehLeaveDepot(rv, false); + } + } + + /* Refresh all level crossings to bar adjacent crossing tiles. */ + for (TileIndex tile = 0; tile < MapSize(); tile++) { + if (IsLevelCrossingTile(tile)) UpdateLevelCrossing(tile, false, true); + } + } + /* Compute station catchment areas. This is needed here in case UpdateStationAcceptance is called below. */ Station::RecomputeCatchmentForAll(); @@ -3163,8 +3222,6 @@ bool AfterLoadGame() for (Station *st : Station::Iterate()) UpdateStationAcceptance(st, false); } - /* Road stops is 'only' updating some caches */ - AfterLoadRoadStops(); AfterLoadLabelMaps(); AfterLoadCompanyStats(); AfterLoadStoryBook(); @@ -3176,6 +3233,10 @@ bool AfterLoadGame() ResetSignalHandlers(); AfterLoadLinkGraphs(); + + /* Start the scripts. This MUST happen after everything else. */ + StartScripts(); + return true; } diff --git a/src/saveload/ai_sl.cpp b/src/saveload/ai_sl.cpp index 51a67b14aa..90e96ba9a2 100644 --- a/src/saveload/ai_sl.cpp +++ b/src/saveload/ai_sl.cpp @@ -77,7 +77,7 @@ struct AIPLChunkHandler : ChunkHandler { _ai_saveload_version = -1; SlObject(nullptr, slt); - if (_networking && !_network_server) { + if (_game_mode == GM_MENU || (_networking && !_network_server)) { if (Company::IsValidAiID(index)) AIInstance::LoadEmpty(); continue; } @@ -112,11 +112,8 @@ struct AIPLChunkHandler : ChunkHandler { config->StringToSettings(_ai_saveload_settings); - /* Start the AI directly if it was active in the savegame */ - if (Company::IsValidAiID(index)) { - AI::StartNew(index, false); - AI::Load(index, _ai_saveload_version); - } + /* Load the AI saved data */ + if (Company::IsValidAiID(index)) config->SetToLoadData(AIInstance::Load(_ai_saveload_version)); } } diff --git a/src/saveload/game_sl.cpp b/src/saveload/game_sl.cpp index bfd0b910c2..9e938bafb3 100644 --- a/src/saveload/game_sl.cpp +++ b/src/saveload/game_sl.cpp @@ -69,7 +69,7 @@ struct GSDTChunkHandler : ChunkHandler { _game_saveload_version = -1; SlObject(nullptr, slt); - if (_networking && !_network_server) { + if (_game_mode == GM_MENU || (_networking && !_network_server)) { GameInstance::LoadEmpty(); if (SlIterateArray() != -1) SlErrorCorrupt("Too many GameScript configs"); return; @@ -102,9 +102,8 @@ struct GSDTChunkHandler : ChunkHandler { config->StringToSettings(_game_saveload_settings); - /* Start the GameScript directly if it was active in the savegame */ - Game::StartNew(); - Game::Load(_game_saveload_version); + /* Load the GameScript saved data */ + config->SetToLoadData(GameInstance::Load(_game_saveload_version)); if (SlIterateArray() != -1) SlErrorCorrupt("Too many GameScript configs"); } diff --git a/src/saveload/league_sl.cpp b/src/saveload/league_sl.cpp new file mode 100644 index 0000000000..122d7ccee5 --- /dev/null +++ b/src/saveload/league_sl.cpp @@ -0,0 +1,91 @@ +/* + * 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 league_sl.cpp Code handling saving and loading of league tables */ + +#include "../stdafx.h" + +#include "saveload.h" + +#include "../league_base.h" + +#include "../safeguards.h" + +static const SaveLoad _league_table_elements_desc[] = { + SLE_VAR(LeagueTableElement, table, SLE_UINT8), + SLE_VAR(LeagueTableElement, rating, SLE_UINT64), + SLE_VAR(LeagueTableElement, company, SLE_UINT8), + SLE_SSTR(LeagueTableElement, text, SLE_STR | SLF_ALLOW_CONTROL), + SLE_SSTR(LeagueTableElement, score, SLE_STR | SLF_ALLOW_CONTROL), + SLE_VAR(LeagueTableElement, link.type, SLE_UINT8), + SLE_VAR(LeagueTableElement, link.target, SLE_UINT32), +}; + +struct LEAEChunkHandler : ChunkHandler { + LEAEChunkHandler() : ChunkHandler('LEAE', CH_TABLE) {} + + void Save() const override + { + SlTableHeader(_league_table_elements_desc); + + for (LeagueTableElement *lte : LeagueTableElement::Iterate()) { + SlSetArrayIndex(lte->index); + SlObject(lte, _league_table_elements_desc); + } + } + + void Load() const override + { + const std::vector slt = SlTableHeader(_league_table_elements_desc); + + int index; + while ((index = SlIterateArray()) != -1) { + LeagueTableElement *lte = new (index) LeagueTableElement(); + SlObject(lte, slt); + } + } +}; + +static const SaveLoad _league_tables_desc[] = { + SLE_SSTR(LeagueTable, title, SLE_STR | SLF_ALLOW_CONTROL), + SLE_SSTR(LeagueTable, header, SLE_STR | SLF_ALLOW_CONTROL), + SLE_SSTR(LeagueTable, footer, SLE_STR | SLF_ALLOW_CONTROL), +}; + +struct LEATChunkHandler : ChunkHandler { + LEATChunkHandler() : ChunkHandler('LEAT', CH_TABLE) {} + + void Save() const override + { + SlTableHeader(_league_tables_desc); + + for (LeagueTable *lt : LeagueTable::Iterate()) { + SlSetArrayIndex(lt->index); + SlObject(lt, _league_tables_desc); + } + } + + void Load() const override + { + const std::vector slt = SlTableHeader(_league_tables_desc); + + int index; + while ((index = SlIterateArray()) != -1) { + LeagueTable *lt = new (index) LeagueTable(); + SlObject(lt, slt); + } + } +}; + +static const LEAEChunkHandler LEAE; +static const LEATChunkHandler LEAT; +static const ChunkHandlerRef league_chunk_handlers[] = { + LEAE, + LEAT, +}; + +extern const ChunkHandlerTable _league_chunk_handlers(league_chunk_handlers); diff --git a/src/saveload/oldloader_sl.cpp b/src/saveload/oldloader_sl.cpp index a419e4b344..fc09c7e787 100644 --- a/src/saveload/oldloader_sl.cpp +++ b/src/saveload/oldloader_sl.cpp @@ -401,7 +401,8 @@ static bool FixTTOEngines() if (oi == 255) { /* Default engine is used */ _date += DAYS_TILL_ORIGINAL_BASE_YEAR; - StartupOneEngine(e, aging_date); + StartupOneEngine(e, aging_date, 0); + CalcEngineReliability(e, false); e->intro_date -= DAYS_TILL_ORIGINAL_BASE_YEAR; _date -= DAYS_TILL_ORIGINAL_BASE_YEAR; diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index c8a1a0d29c..04e8113820 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -210,7 +210,6 @@ struct SaveLoadParams { StringID error_str; ///< the translatable error message to show char *extra_msg; ///< the error message - uint16 game_speed; ///< The game speed when saving started. bool saveinprogress; ///< Whether there is currently a save in progress. }; @@ -240,6 +239,7 @@ static const std::vector &ChunkHandlers() extern const ChunkHandlerTable _cargomonitor_chunk_handlers; extern const ChunkHandlerTable _goal_chunk_handlers; extern const ChunkHandlerTable _story_page_chunk_handlers; + extern const ChunkHandlerTable _league_chunk_handlers; extern const ChunkHandlerTable _ai_chunk_handlers; extern const ChunkHandlerTable _game_chunk_handlers; extern const ChunkHandlerTable _animated_tile_chunk_handlers; @@ -271,6 +271,7 @@ static const std::vector &ChunkHandlers() _cargomonitor_chunk_handlers, _goal_chunk_handlers, _story_page_chunk_handlers, + _league_chunk_handlers, _engine_chunk_handlers, _town_chunk_handlers, _sign_chunk_handlers, @@ -2911,15 +2912,9 @@ static inline void ClearSaveLoadState() _sl.lf = nullptr; } -/** - * Update the gui accordingly when starting saving - * and set locks on saveload. Also turn off fast-forward cause with that - * saving takes Aaaaages - */ +/** Update the gui accordingly when starting saving and set locks on saveload. */ static void SaveFileStart() { - _sl.game_speed = _game_speed; - _game_speed = 100; SetMouseCursorBusy(true); InvalidateWindowData(WC_STATUS_BAR, 0, SBI_SAVELOAD_START); @@ -2929,7 +2924,6 @@ static void SaveFileStart() /** Update the gui accordingly when saving is done and release locks on saveload. */ static void SaveFileDone() { - if (_game_mode != GM_MENU) _game_speed = _sl.game_speed; SetMouseCursorBusy(false); InvalidateWindowData(WC_STATUS_BAR, 0, SBI_SAVELOAD_FINISH); @@ -3316,7 +3310,7 @@ SaveOrLoadResult SaveOrLoad(const std::string &filename, SaveLoadOperation fop, ClearSaveLoadState(); /* Skip the "colour" character */ - if (fop != SLO_CHECK) Debug(sl, 0, "{}", GetSaveLoadErrorString()); + if (fop != SLO_CHECK) Debug(sl, 0, "{}", GetSaveLoadErrorString() + 3); /* A saver/loader exception!! reinitialize all variables to prevent crash! */ return (fop == SLO_LOAD) ? SL_REINIT : SL_ERROR; diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index 19e1089430..16352cc749 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -342,6 +342,7 @@ enum SaveLoadVersion : uint16 { SLV_REPAIR_OBJECT_DOCKING_TILES, ///< 299 PR#9594 v12.0 Fixing issue with docking tiles overlapping objects. SLV_U64_TICK_COUNTER, ///< 300 PR#10035 Make _tick_counter 64bit to avoid wrapping. SLV_LAST_LOADING_TICK, ///< 301 PR#9693 Store tick of last loading for vehicles. + SLV_MULTITRACK_LEVEL_CROSSINGS, ///< 302 PR#9931 Multi-track level crossings. SL_MAX_VERSION, ///< Highest possible saveload version }; diff --git a/src/saveload/station_sl.cpp b/src/saveload/station_sl.cpp index 20d70066e9..b5f4cbcd13 100644 --- a/src/saveload/station_sl.cpp +++ b/src/saveload/station_sl.cpp @@ -109,7 +109,7 @@ void AfterLoadStations() { /* Update the speclists of all stations to point to the currently loaded custom stations. */ for (BaseStation *st : BaseStation::Iterate()) { - for (uint i = 0; i < st->num_specs; i++) { + for (uint i = 0; i < st->speclist.size(); i++) { if (st->speclist[i].grfid == 0) continue; st->speclist[i].spec = StationClass::GetByGrf(st->speclist[i].grfid, st->speclist[i].localidx, nullptr); @@ -201,30 +201,29 @@ public: }; inline const static SaveLoadCompatTable compat_description = _station_spec_list_sl_compat; + static uint8 last_num_specs; ///< Number of specs of the last loaded station. + void Save(BaseStation *bst) const override { - SlSetStructListLength(bst->num_specs); - for (uint i = 0; i < bst->num_specs; i++) { + SlSetStructListLength(bst->speclist.size()); + for (uint i = 0; i < bst->speclist.size(); i++) { SlObject(&bst->speclist[i], this->GetDescription()); } } void Load(BaseStation *bst) const override { - if (!IsSavegameVersionBefore(SLV_SAVELOAD_LIST_LENGTH)) { - bst->num_specs = (uint8)SlGetStructListLength(UINT8_MAX); - } + uint8 num_specs = IsSavegameVersionBefore(SLV_SAVELOAD_LIST_LENGTH) ? last_num_specs : (uint8)SlGetStructListLength(UINT8_MAX); - if (bst->num_specs != 0) { - /* Allocate speclist memory when loading a game */ - bst->speclist = CallocT(bst->num_specs); - for (uint i = 0; i < bst->num_specs; i++) { - SlObject(&bst->speclist[i], this->GetLoadDescription()); - } + bst->speclist.resize(num_specs); + for (uint i = 0; i < num_specs; i++) { + SlObject(&bst->speclist[i], this->GetLoadDescription()); } } }; +uint8 SlStationSpecList::last_num_specs; + class SlStationCargo : public DefaultSaveLoadHandler { public: inline static const SaveLoad description[] = { @@ -476,7 +475,7 @@ static const SaveLoad _old_station_desc[] = { /* Used by newstations for graphic variations */ SLE_CONDVAR(Station, random_bits, SLE_UINT16, SLV_27, SL_MAX_VERSION), SLE_CONDVAR(Station, waiting_triggers, SLE_UINT8, SLV_27, SL_MAX_VERSION), - SLE_CONDVAR(Station, num_specs, SLE_UINT8, SLV_27, SL_MAX_VERSION), + SLEG_CONDVAR("num_specs", SlStationSpecList::last_num_specs, SLE_UINT8, SLV_27, SL_MAX_VERSION), SLE_CONDREFLIST(Station, loading_vehicles, REF_VEHICLE, SLV_57, SL_MAX_VERSION), @@ -536,7 +535,7 @@ public: /* Used by newstations for graphic variations */ SLE_VAR(BaseStation, random_bits, SLE_UINT16), SLE_VAR(BaseStation, waiting_triggers, SLE_UINT8), - SLE_CONDVAR(BaseStation, num_specs, SLE_UINT8, SL_MIN_VERSION, SLV_SAVELOAD_LIST_LENGTH), + SLEG_CONDVAR("num_specs", SlStationSpecList::last_num_specs, SLE_UINT8, SL_MIN_VERSION, SLV_SAVELOAD_LIST_LENGTH), }; inline const static SaveLoadCompatTable compat_description = _station_base_sl_compat; diff --git a/src/screenshot.cpp b/src/screenshot.cpp index e4cce7e1ed..bec7cc7c6b 100644 --- a/src/screenshot.cpp +++ b/src/screenshot.cpp @@ -681,8 +681,16 @@ static const char *MakeScreenshotName(const char *default_fn, const char *ext, b } } - /* Add extension to screenshot file */ size_t len = strlen(_screenshot_name); + + /* Handle user-specified filenames ending in # with automatic numbering */ + if (StrEndsWith(_screenshot_name, "#")) { + generate = true; + len -= 1; + _screenshot_name[len] = '\0'; + } + + /* Add extension to screenshot file */ seprintf(&_screenshot_name[len], lastof(_screenshot_name), ".%s", ext); const char *screenshot_dir = crashlog ? _personal_dir.c_str() : FiosGetScreenshotDir(); diff --git a/src/script/api/CMakeLists.txt b/src/script/api/CMakeLists.txt index 594d3c46a7..de559d2229 100644 --- a/src/script/api/CMakeLists.txt +++ b/src/script/api/CMakeLists.txt @@ -177,6 +177,7 @@ add_files( script_industrytypelist.hpp script_info_docs.hpp script_infrastructure.hpp + script_league.hpp script_list.hpp script_log.hpp script_map.hpp @@ -247,6 +248,7 @@ add_files( script_industrytype.cpp script_industrytypelist.cpp script_infrastructure.cpp + script_league.cpp script_list.cpp script_log.cpp script_map.cpp diff --git a/src/script/api/game_changelog.hpp b/src/script/api/game_changelog.hpp index 592550ec1b..69773edeeb 100644 --- a/src/script/api/game_changelog.hpp +++ b/src/script/api/game_changelog.hpp @@ -21,6 +21,7 @@ * \li GSCargo::GetWeight * \li GSIndustryType::ResolveNewGRFID * \li GSObjectType::ResolveNewGRFID + * \li GSLeagueTable * * Other changes: * \li GSRoad::HasRoadType now correctly checks RoadType against RoadType diff --git a/src/script/api/script_cargo.cpp b/src/script/api/script_cargo.cpp index e5a80023f7..49fdc4f294 100644 --- a/src/script/api/script_cargo.cpp +++ b/src/script/api/script_cargo.cpp @@ -85,5 +85,5 @@ /* static */ int64 ScriptCargo::GetWeight(CargoID cargo_type, uint32 amount) { if (!IsValidCargo(cargo_type)) return -1; - return ::CargoSpec::Get(cargo_type)->weight * static_cast(amount) / 16; + return ::CargoSpec::Get(cargo_type)->WeightOfNUnits(amount); } diff --git a/src/script/api/script_league.cpp b/src/script/api/script_league.cpp new file mode 100644 index 0000000000..d50eff8446 --- /dev/null +++ b/src/script/api/script_league.cpp @@ -0,0 +1,122 @@ +/* + * This file is part of OpenTTD. + * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. + * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . + */ + +/** @file script_league.cpp Implementation of ScriptLeagueTable. */ + +#include "../../stdafx.h" + +#include "script_league.hpp" + +#include "../script_instance.hpp" +#include "script_error.hpp" +#include "../../league_base.h" +#include "../../league_cmd.h" + +#include "../../safeguards.h" + + +/* static */ bool ScriptLeagueTable::IsValidLeagueTable(LeagueTableID table_id) +{ + return ::LeagueTable::IsValidID(table_id); +} + +/* static */ ScriptLeagueTable::LeagueTableID ScriptLeagueTable::New(Text *title, Text *header, Text *footer) +{ + CCountedPtr title_counter(title); + CCountedPtr header_counter(header); + CCountedPtr footer_counter(footer); + + EnforcePrecondition(LEAGUE_TABLE_INVALID, ScriptObject::GetCompany() == OWNER_DEITY); + EnforcePrecondition(LEAGUE_TABLE_INVALID, title != nullptr); + const char *encoded_title = title->GetEncodedText(); + EnforcePreconditionEncodedText(LEAGUE_TABLE_INVALID, encoded_title); + + auto encoded_header = (header != nullptr ? std::string{ header->GetEncodedText() } : std::string{}); + auto encoded_footer = (footer != nullptr ? std::string{ footer->GetEncodedText() } : std::string{}); + + if (!ScriptObject::Command::Do(&ScriptInstance::DoCommandReturnLeagueTableID, encoded_title, encoded_header, encoded_footer)) return LEAGUE_TABLE_INVALID; + + /* In case of test-mode, we return LeagueTableID 0 */ + return (ScriptLeagueTable::LeagueTableID)0; +} + +/* static */ bool ScriptLeagueTable::IsValidLeagueTableElement(LeagueTableElementID element_id) +{ + return ::LeagueTableElement::IsValidID(element_id); +} + +/* static */ ScriptLeagueTable::LeagueTableElementID ScriptLeagueTable::NewElement(ScriptLeagueTable::LeagueTableID table, int64 rating, ScriptCompany::CompanyID company, Text *text, Text *score, LinkType link_type, uint32 link_target) +{ + CCountedPtr text_counter(text); + CCountedPtr score_counter(score); + + EnforcePrecondition(LEAGUE_TABLE_ELEMENT_INVALID, ScriptObject::GetCompany() == OWNER_DEITY); + + EnforcePrecondition(LEAGUE_TABLE_ELEMENT_INVALID, IsValidLeagueTable(table)); + + EnforcePrecondition(LEAGUE_TABLE_ELEMENT_INVALID, company == ScriptCompany::COMPANY_INVALID || ScriptCompany::ResolveCompanyID(company) != ScriptCompany::COMPANY_INVALID); + CompanyID c = (::CompanyID)company; + if (company == ScriptCompany::COMPANY_INVALID) c = INVALID_COMPANY; + + EnforcePrecondition(LEAGUE_TABLE_ELEMENT_INVALID, text != nullptr); + const char *encoded_text_ptr = text->GetEncodedText(); + EnforcePreconditionEncodedText(LEAGUE_TABLE_ELEMENT_INVALID, encoded_text_ptr); + std::string encoded_text = encoded_text_ptr; // save into string so GetEncodedText can reuse the internal buffer + + EnforcePrecondition(LEAGUE_TABLE_ELEMENT_INVALID, score != nullptr); + const char *encoded_score = score->GetEncodedText(); + EnforcePreconditionEncodedText(LEAGUE_TABLE_ELEMENT_INVALID, encoded_score); + + EnforcePrecondition(LEAGUE_TABLE_ELEMENT_INVALID, IsValidLink(Link((::LinkType)link_type, link_target))); + + if (!ScriptObject::Command::Do(&ScriptInstance::DoCommandReturnLeagueTableElementID, table, rating, c, encoded_text, encoded_score, (::LinkType)link_type, (::LinkTargetID)link_target)) return LEAGUE_TABLE_ELEMENT_INVALID; + + /* In case of test-mode, we return LeagueTableElementID 0 */ + return (ScriptLeagueTable::LeagueTableElementID)0; +} + +/* static */ bool ScriptLeagueTable::UpdateElementData(LeagueTableElementID element, ScriptCompany::CompanyID company, Text *text, LinkType link_type, LinkTargetID link_target) +{ + CCountedPtr text_counter(text); + + EnforcePrecondition(false, ScriptObject::GetCompany() == OWNER_DEITY); + EnforcePrecondition(false, IsValidLeagueTableElement(element)); + + EnforcePrecondition(false, company == ScriptCompany::COMPANY_INVALID || ScriptCompany::ResolveCompanyID(company) != ScriptCompany::COMPANY_INVALID); + CompanyID c = (::CompanyID)company; + if (company == ScriptCompany::COMPANY_INVALID) c = INVALID_COMPANY; + + EnforcePrecondition(false, text != nullptr); + const char *encoded_text = text->GetEncodedText(); + EnforcePreconditionEncodedText(false, encoded_text); + + EnforcePrecondition(false, IsValidLink(Link((::LinkType)link_type, link_target))); + + return ScriptObject::Command::Do(element, c, encoded_text, (::LinkType)link_type, (::LinkTargetID)link_target); +} + +/* static */ bool ScriptLeagueTable::UpdateElementScore(LeagueTableElementID element, int64 rating, Text *score) +{ + CCountedPtr score_counter(score); + + EnforcePrecondition(false, ScriptObject::GetCompany() == OWNER_DEITY); + EnforcePrecondition(false, IsValidLeagueTableElement(element)); + + EnforcePrecondition(false, score != nullptr); + const char *encoded_score = score->GetEncodedText(); + EnforcePreconditionEncodedText(false, encoded_score); + + return ScriptObject::Command::Do(element, rating, encoded_score); +} + +/* static */ bool ScriptLeagueTable::RemoveElement(LeagueTableElementID element) +{ + EnforcePrecondition(false, ScriptObject::GetCompany() == OWNER_DEITY); + EnforcePrecondition(false, IsValidLeagueTableElement(element)); + + return ScriptObject::Command::Do(element); +} diff --git a/src/script/api/script_league.hpp b/src/script/api/script_league.hpp new file mode 100644 index 0000000000..d6fc2bbfea --- /dev/null +++ b/src/script/api/script_league.hpp @@ -0,0 +1,134 @@ +/* + * This file is part of OpenTTD. + * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. + * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . + */ + +/** @file script_league.hpp Everything to manipulate league tables. */ + +#ifndef SCRIPT_LEAGUE_HPP +#define SCRIPT_LEAGUE_HPP + +#include "script_company.hpp" +#include "script_text.hpp" +#include "../../league_type.h" + +/** + * Class that handles league table related functions. + * + * To create a league table: + * 1. Create the league table + * 2. Create league table elements that will be shown in the table in the order of their rating (higher=better). + * + * @api game + */ +class ScriptLeagueTable : public ScriptObject { +public: + /** + * The league table IDs. + */ + enum LeagueTableID { + LEAGUE_TABLE_INVALID = ::INVALID_LEAGUE_TABLE, ///< An invalid league table id. + }; + + /** + * The league table element IDs. + */ + enum LeagueTableElementID { + LEAGUE_TABLE_ELEMENT_INVALID = ::INVALID_LEAGUE_TABLE_ELEMENT, ///< An invalid league table element id. + }; + + /** + * The type of a link. + */ + enum LinkType : byte { + LINK_NONE = ::LT_NONE, ///< No link + LINK_TILE = ::LT_TILE, ///< Link a tile + LINK_INDUSTRY = ::LT_INDUSTRY, ///< Link an industry + LINK_TOWN = ::LT_TOWN, ///< Link a town + LINK_COMPANY = ::LT_COMPANY, ///< Link a company + LINK_STORY_PAGE = ::LT_STORY_PAGE, ///< Link a story page + }; + + /** + * Check whether this is a valid league table ID. + * @param table_id The LeagueTableID to check. + * @return true iff this league table is valid. + */ + static bool IsValidLeagueTable(LeagueTableID table_id); + + /** + * Check whether this is a valid league table element ID. + * @param element_id The LeagueTableElementID to check. + * @return true iff this league table element is valid. + */ + static bool IsValidLeagueTableElement(LeagueTableElementID element_id); + + /** + * Create a new league table. + * @param title League table title (can be either a raw string, or ScriptText object). + * @return The new LeagueTableID, or LEAGUE_TABLE_INVALID if it failed. + * @pre No ScriptCompanyMode may be in scope. + * @pre title != nullptr && len(title) != 0. + */ + static LeagueTableID New(Text *title, Text *header, Text *footer); + + /** + * Create a new league table element. + * @param table Id of the league table this element belongs to. + * @param rating Value that elements are ordered by. + * @param company Company to show the color blob for or INVALID_COMPANY. + * @param text Text of the element (can be either a raw string, or ScriptText object). + * @param score String representation of the score associated with the element (can be either a raw string, or ScriptText object). + * @param link_type Type of the referenced object. + * @param link_target Id of the referenced object. + * @return The new LeagueTableElementID, or LEAGUE_TABLE_ELEMENT_INVALID if it failed. + * @pre No ScriptCompanyMode may be in scope. + * @pre IsValidLeagueTable(table). + * @pre text != nullptr && len(text) != 0. + * @pre score != nullptr && len(score) != 0. + * @pre IsValidLink(Link(link_type, link_target)). + */ + static LeagueTableElementID NewElement(LeagueTableID table, int64 rating, ScriptCompany::CompanyID company, Text *text, Text *score, LinkType link_type, LinkTargetID link_target); + + /** + * Update the attributes of a league table element. + * @param element Id of the element to update + * @param company Company to show the color blob for or INVALID_COMPANY. + * @param text Text of the element (can be either a raw string, or ScriptText object). + * @param link_type Type of the referenced object. + * @param link_target Id of the referenced object. + * @return True if the action succeeded. + * @pre No ScriptCompanyMode may be in scope. + * @pre IsValidLeagueTableElement(element). + * @pre text != nullptr && len(text) != 0. + * @pre IsValidLink(Link(link_type, link_target)). + */ + static bool UpdateElementData(LeagueTableElementID element, ScriptCompany::CompanyID company, Text *text, LinkType link_type, LinkTargetID link_target); + + /** + * Create a new league table element. + * @param element Id of the element to update + * @param rating Value that elements are ordered by. + * @param score String representation of the score associated with the element (can be either a raw string, or ScriptText object). + * @return True if the action succeeded. + * @pre No ScriptCompanyMode may be in scope. + * @pre IsValidLeagueTableElement(element). + * @pre score != nullptr && len(score) != 0. + */ + static bool UpdateElementScore(LeagueTableElementID element, int64 rating, Text *score); + + + /** + * Remove a league table element. + * @param element Id of the element to update + * @return True if the action succeeded. + * @pre No ScriptCompanyMode may be in scope. + * @pre IsValidLeagueTableElement(element). + */ + static bool RemoveElement(LeagueTableElementID element); +}; + + +#endif /* SCRIPT_LEAGUE_HPP */ diff --git a/src/script/api/script_object.cpp b/src/script/api/script_object.cpp index 3cddb12f83..7d1042156c 100644 --- a/src/script/api/script_object.cpp +++ b/src/script/api/script_object.cpp @@ -103,7 +103,7 @@ ScriptObject::ActiveInstance::~ActiveInstance() /* static */ void ScriptObject::SetDoCommandCosts(Money value) { - GetStorage()->costs = CommandCost(value); + GetStorage()->costs = CommandCost(INVALID_EXPENSES, value); // Expense type is never read. } /* static */ void ScriptObject::IncreaseDoCommandCosts(Money value) diff --git a/src/script/api/script_object.hpp b/src/script/api/script_object.hpp index 5fffe783b2..96c78acb7f 100644 --- a/src/script/api/script_object.hpp +++ b/src/script/api/script_object.hpp @@ -333,6 +333,9 @@ bool ScriptObject::ScriptDoCommandHelper tile = std::get<0>(args); } + /* Do not even think about executing out-of-bounds tile-commands. */ + if (tile != 0 && (tile >= MapSize() || (!IsValidTile(tile) && (GetCommandFlags() & CMD_ALL_TILES) == 0))) return false; + /* Only set ClientID parameters when the command does not come from the network. */ if constexpr ((::GetCommandFlags() & CMD_CLIENT_ID) != 0) ScriptObjectInternal::SetClientIds(args, std::index_sequence_for{}); diff --git a/src/script/api/script_tilelist.cpp b/src/script/api/script_tilelist.cpp index 8266f46ff9..2050644ff5 100644 --- a/src/script/api/script_tilelist.cpp +++ b/src/script/api/script_tilelist.cpp @@ -155,7 +155,7 @@ ScriptTileList_StationType::ScriptTileList_StationType(StationID station_id, Scr if ((station_type & ScriptStation::STATION_AIRPORT) != 0) station_type_value |= (1 << ::STATION_AIRPORT) | (1 << ::STATION_OILRIG); if ((station_type & ScriptStation::STATION_DOCK) != 0) station_type_value |= (1 << ::STATION_DOCK) | (1 << ::STATION_OILRIG); - TileArea ta(::TileXY(rect->left, rect->top), rect->right - rect->left + 1, rect->bottom - rect->top + 1); + TileArea ta(::TileXY(rect->left, rect->top), rect->Width(), rect->Height()); for (TileIndex cur_tile : ta) { if (!::IsTileType(cur_tile, MP_STATION)) continue; if (::GetStationIndex(cur_tile) != station_id) continue; diff --git a/src/script/api/script_town.cpp b/src/script/api/script_town.cpp index 78a1734441..afa309c92b 100644 --- a/src/script/api/script_town.cpp +++ b/src/script/api/script_town.cpp @@ -258,7 +258,7 @@ if (ScriptObject::GetCompany() == OWNER_DEITY) return false; if (!IsValidTown(town_id)) return false; - return HasBit(::GetMaskOfTownActions(nullptr, ScriptObject::GetCompany(), ::Town::Get(town_id)), town_action); + return HasBit(::GetMaskOfTownActions(ScriptObject::GetCompany(), ::Town::Get(town_id)), town_action); } /* static */ bool ScriptTown::PerformTownAction(TownID town_id, TownAction town_action) diff --git a/src/script/script_config.cpp b/src/script/script_config.cpp index 340b3b3f13..07be966052 100644 --- a/src/script/script_config.cpp +++ b/src/script/script_config.cpp @@ -26,6 +26,7 @@ void ScriptConfig::Change(const char *name, int version, bool force_exact_match, if (this->config_list != nullptr) delete this->config_list; this->config_list = (info == nullptr) ? nullptr : new ScriptConfigItemList(); if (this->config_list != nullptr) this->PushExtraConfigList(); + this->to_load_data.reset(); this->ClearConfigList(); @@ -49,6 +50,7 @@ ScriptConfig::ScriptConfig(const ScriptConfig *config) this->version = config->version; this->config_list = nullptr; this->is_random = config->is_random; + this->to_load_data.reset(); for (const auto &item : config->settings) { this->settings[stredup(item.first)] = item.second; @@ -63,6 +65,7 @@ ScriptConfig::~ScriptConfig() free(this->name); this->ResetSettings(); if (this->config_list != nullptr) delete this->config_list; + this->to_load_data.reset(); } ScriptInfo *ScriptConfig::GetInfo() const @@ -238,3 +241,14 @@ const char *ScriptConfig::GetTextfile(TextfileType type, CompanyID slot) const return ::GetTextfile(type, (slot == OWNER_DEITY) ? GAME_DIR : AI_DIR, this->GetInfo()->GetMainScript()); } + +void ScriptConfig::SetToLoadData(ScriptInstance::ScriptData *data) +{ + this->to_load_data.reset(data); +} + +ScriptInstance::ScriptData *ScriptConfig::GetToLoadData() +{ + return this->to_load_data.get(); +} + diff --git a/src/script/script_config.hpp b/src/script/script_config.hpp index 13a136cbbf..f8b2a43dc9 100644 --- a/src/script/script_config.hpp +++ b/src/script/script_config.hpp @@ -16,6 +16,7 @@ #include "../core/string_compare_type.hpp" #include "../company_type.h" #include "../textfile_gui.h" +#include "script_instance.hpp" /** Bitmask of flags for Script settings. */ enum ScriptConfigFlags { @@ -63,7 +64,8 @@ public: version(-1), info(nullptr), config_list(nullptr), - is_random(false) + is_random(false), + to_load_data(nullptr) {} /** @@ -185,13 +187,17 @@ public: */ const char *GetTextfile(TextfileType type, CompanyID slot) const; + void SetToLoadData(ScriptInstance::ScriptData *data); + ScriptInstance::ScriptData *GetToLoadData(); + protected: - const char *name; ///< Name of the Script - int version; ///< Version of the Script - class ScriptInfo *info; ///< ScriptInfo object for related to this Script version - SettingValueList settings; ///< List with all setting=>value pairs that are configure for this Script - ScriptConfigItemList *config_list; ///< List with all settings defined by this Script - bool is_random; ///< True if the AI in this slot was randomly chosen. + const char *name; ///< Name of the Script + int version; ///< Version of the Script + class ScriptInfo *info; ///< ScriptInfo object for related to this Script version + SettingValueList settings; ///< List with all setting=>value pairs that are configure for this Script + ScriptConfigItemList *config_list; ///< List with all settings defined by this Script + bool is_random; ///< True if the AI in this slot was randomly chosen. + std::unique_ptr to_load_data; ///< Data to load after the Script start. /** * In case you have mandatory non-Script-definable config entries in your diff --git a/src/script/script_instance.cpp b/src/script/script_instance.cpp index bcd8b2d4bd..9bd2d78718 100644 --- a/src/script/script_instance.cpp +++ b/src/script/script_instance.cpp @@ -26,6 +26,7 @@ #include "../company_base.h" #include "../company_func.h" #include "../fileio_func.h" +#include "../league_type.h" #include "../misc/endian_buffer.hpp" #include "../safeguards.h" @@ -298,6 +299,17 @@ void ScriptInstance::CollectGarbage() instance->engine->InsertResult(EndianBufferReader::ToValue(ScriptObject::GetLastCommandResData())); } +/* static */ void ScriptInstance::DoCommandReturnLeagueTableElementID(ScriptInstance *instance) +{ + instance->engine->InsertResult(EndianBufferReader::ToValue(ScriptObject::GetLastCommandResData())); +} + +/* static */ void ScriptInstance::DoCommandReturnLeagueTableID(ScriptInstance *instance) +{ + instance->engine->InsertResult(EndianBufferReader::ToValue(ScriptObject::GetLastCommandResData())); +} + + ScriptStorage *ScriptInstance::GetStorage() { return this->storage; @@ -331,17 +343,6 @@ void *ScriptInstance::GetLogPointer() * - null: No data. */ -/** The type of the data that follows in the savegame. */ -enum SQSaveLoadType { - SQSL_INT = 0x00, ///< The following data is an integer. - SQSL_STRING = 0x01, ///< The following data is an string. - SQSL_ARRAY = 0x02, ///< The following data is an array. - SQSL_TABLE = 0x03, ///< The following data is an table. - SQSL_BOOL = 0x04, ///< The following data is a boolean. - SQSL_NULL = 0x05, ///< A null variable. - SQSL_ARRAY_TABLE_END = 0xFF, ///< Marks the end of an array or table, no data follows. -}; - static byte _script_sl_byte; ///< Used as source/target by the script saveload code to store/load a single byte. /** SaveLoad array that saves/loads exactly one byte. */ @@ -560,14 +561,14 @@ bool ScriptInstance::IsPaused() return this->is_paused; } -/* static */ bool ScriptInstance::LoadObjects(HSQUIRRELVM vm) +/* static */ bool ScriptInstance::LoadObjects(ScriptData *data) { SlObject(nullptr, _script_byte); switch (_script_sl_byte) { case SQSL_INT: { int64 value; SlCopy(&value, 1, IsSavegameVersionBefore(SLV_SCRIPT_INT64) ? SLE_FILE_I32 | SLE_VAR_I64 : SLE_INT64); - if (vm != nullptr) sq_pushinteger(vm, (SQInteger)value); + if (data != nullptr) data->push_back((SQInteger)value); return true; } @@ -576,37 +577,79 @@ bool ScriptInstance::IsPaused() static char buf[std::numeric_limits::max()]; SlCopy(buf, _script_sl_byte, SLE_CHAR); StrMakeValidInPlace(buf, buf + _script_sl_byte); - if (vm != nullptr) sq_pushstring(vm, buf, -1); + if (data != nullptr) data->push_back(std::string(buf)); return true; } + case SQSL_ARRAY: + case SQSL_TABLE: { + if (data != nullptr) data->push_back((SQSaveLoadType)_script_sl_byte); + while (LoadObjects(data)); + return true; + } + + case SQSL_BOOL: { + SlObject(nullptr, _script_byte); + if (data != nullptr) data->push_back((SQBool)(_script_sl_byte != 0)); + return true; + } + + case SQSL_NULL: { + if (data != nullptr) data->push_back((SQSaveLoadType)_script_sl_byte); + return true; + } + + case SQSL_ARRAY_TABLE_END: { + if (data != nullptr) data->push_back((SQSaveLoadType)_script_sl_byte); + return false; + } + + default: SlErrorCorrupt("Invalid script data type"); + } +} + +/* static */ bool ScriptInstance::LoadObjects(HSQUIRRELVM vm, ScriptData *data) +{ + ScriptDataVariant value = data->front(); + data->pop_front(); + + if (std::holds_alternative(value)) { + sq_pushinteger(vm, std::get(value)); + return true; + } + + if (std::holds_alternative(value)) { + sq_pushstring(vm, std::get(value).c_str(), -1); + return true; + } + + if (std::holds_alternative(value)) { + sq_pushbool(vm, std::get(value)); + return true; + } + + switch (std::get(value)) { case SQSL_ARRAY: { - if (vm != nullptr) sq_newarray(vm, 0); - while (LoadObjects(vm)) { - if (vm != nullptr) sq_arrayappend(vm, -2); + sq_newarray(vm, 0); + while (LoadObjects(vm, data)) { + sq_arrayappend(vm, -2); /* The value is popped from the stack by squirrel. */ } return true; } case SQSL_TABLE: { - if (vm != nullptr) sq_newtable(vm); - while (LoadObjects(vm)) { - LoadObjects(vm); - if (vm != nullptr) sq_rawset(vm, -3); + sq_newtable(vm); + while (LoadObjects(vm, data)) { + LoadObjects(vm, data); + sq_rawset(vm, -3); /* The key (-2) and value (-1) are popped from the stack by squirrel. */ } return true; } - case SQSL_BOOL: { - SlObject(nullptr, _script_byte); - if (vm != nullptr) sq_pushbool(vm, (SQBool)(_script_sl_byte != 0)); - return true; - } - case SQSL_NULL: { - if (vm != nullptr) sq_pushnull(vm); + sq_pushnull(vm); return true; } @@ -627,22 +670,35 @@ bool ScriptInstance::IsPaused() LoadObjects(nullptr); } -void ScriptInstance::Load(int version) +/* static */ ScriptInstance::ScriptData *ScriptInstance::Load(int version) { - ScriptObject::ActiveInstance active(this); - - if (this->engine == nullptr || version == -1) { + if (version == -1) { LoadEmpty(); - return; + return nullptr; } - HSQUIRRELVM vm = this->engine->GetVM(); SlObject(nullptr, _script_byte); /* Check if there was anything saved at all. */ - if (_script_sl_byte == 0) return; + if (_script_sl_byte == 0) return nullptr; - sq_pushinteger(vm, version); - LoadObjects(vm); + ScriptData *data = new ScriptData(); + data->push_back((SQInteger)version); + LoadObjects(data); + return data; +} + +void ScriptInstance::LoadOnStack(ScriptData *data) +{ + ScriptObject::ActiveInstance active(this); + + if (data == nullptr) return; + + HSQUIRRELVM vm = this->engine->GetVM(); + + ScriptDataVariant version = data->front(); + data->pop_front(); + sq_pushinteger(vm, std::get(version)); + LoadObjects(vm, data); this->is_save_data_on_stack = true; } diff --git a/src/script/script_instance.hpp b/src/script/script_instance.hpp index 57f8dcc72f..ea7fcf1ed8 100644 --- a/src/script/script_instance.hpp +++ b/src/script/script_instance.hpp @@ -10,6 +10,8 @@ #ifndef SCRIPT_INSTANCE_HPP #define SCRIPT_INSTANCE_HPP +#include +#include #include #include "script_suspend.hpp" @@ -21,10 +23,25 @@ static const uint SQUIRREL_MAX_DEPTH = 25; ///< The maximum recursive depth for /** Runtime information about a script like a pointer to the squirrel vm and the current state. */ class ScriptInstance { +private: + /** The type of the data that follows in the savegame. */ + enum SQSaveLoadType { + SQSL_INT = 0x00, ///< The following data is an integer. + SQSL_STRING = 0x01, ///< The following data is an string. + SQSL_ARRAY = 0x02, ///< The following data is an array. + SQSL_TABLE = 0x03, ///< The following data is an table. + SQSL_BOOL = 0x04, ///< The following data is a boolean. + SQSL_NULL = 0x05, ///< A null variable. + SQSL_ARRAY_TABLE_END = 0xFF, ///< Marks the end of an array or table, no data follows. + }; + public: friend class ScriptObject; friend class ScriptController; + typedef std::variant ScriptDataVariant; + typedef std::list ScriptData; + /** * Create a new script. */ @@ -115,6 +132,16 @@ public: */ static void DoCommandReturnStoryPageElementID(ScriptInstance *instance); + /** + * Return a LeagueTableID reply for a DoCommand. + */ + static void DoCommandReturnLeagueTableID(ScriptInstance *instance); + + /** + * Return a LeagueTableElementID reply for a DoCommand. + */ + static void DoCommandReturnLeagueTableElementID(ScriptInstance *instance); + /** * Get the controller attached to the instance. */ @@ -136,11 +163,18 @@ public: static void SaveEmpty(); /** - * Load data from a savegame and store it on the stack. + * Load data from a savegame. * @param version The version of the script when saving, or -1 if this was * not the original script saving the game. + * @return a pointer to loaded data. */ - void Load(int version); + static ScriptData *Load(int version); + + /** + * Store loaded data on the stack. + * @param data The loaded data to store on the stack. + */ + void LoadOnStack(ScriptData *data); /** * Load and discard data from a savegame. @@ -279,7 +313,9 @@ private: * Load all objects from a savegame. * @return True if the loading was successful. */ - static bool LoadObjects(HSQUIRRELVM vm); + static bool LoadObjects(ScriptData *data); + + static bool LoadObjects(HSQUIRRELVM vm, ScriptData *data); }; #endif /* SCRIPT_INSTANCE_HPP */ diff --git a/src/settings.cpp b/src/settings.cpp index 4decfecf34..edf4e2441d 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -1016,7 +1016,7 @@ static GRFConfig *GRFLoadConfig(IniFile &ini, const char *grpname, bool is_stati SetDParam(1, STR_CONFIG_ERROR_INVALID_GRF_UNKNOWN); } - SetDParamStr(0, StrEmpty(filename) ? item->name : filename); + SetDParamStr(0, StrEmpty(filename) ? item->name.c_str() : filename); ShowErrorMessage(STR_CONFIG_ERROR, STR_CONFIG_ERROR_INVALID_GRF, WL_CRITICAL); delete c; continue; @@ -1602,8 +1602,8 @@ void SyncCompanySettings() const void *new_object = &_settings_client.company; for (auto &desc : _company_settings) { const SettingDesc *sd = GetSettingDesc(desc); - uint32 old_value = (uint32)sd->AsIntSetting()->Read(new_object); - uint32 new_value = (uint32)sd->AsIntSetting()->Read(old_object); + uint32 old_value = (uint32)sd->AsIntSetting()->Read(old_object); + uint32 new_value = (uint32)sd->AsIntSetting()->Read(new_object); if (old_value != new_value) Command::SendNet(STR_NULL, _local_company, sd->GetName(), new_value); } } diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 34bb961da0..5d14637e64 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -39,6 +39,8 @@ #include "rev.h" #include "video/video_driver.hpp" #include "music/music_driver.hpp" +#include "gui.h" +#include "mixer.h" #include #include @@ -56,22 +58,6 @@ static const StringID _autosave_dropdown[] = { INVALID_STRING_ID, }; -static const StringID _gui_zoom_dropdown[] = { - STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO, - STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL, - STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM, - STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM, - INVALID_STRING_ID, -}; - -static const StringID _font_zoom_dropdown[] = { - STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO, - STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL, - STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM, - STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM, - INVALID_STRING_ID, -}; - static Dimension _circle_size; ///< Dimension of the circle +/- icon. This is here as not all users are within the class of the settings window. static const void *ResolveObject(const GameSettings *settings_ptr, const IntSettingDesc *sd); @@ -157,14 +143,36 @@ static void AddCustomRefreshRates() std::copy(monitorRates.begin(), monitorRates.end(), std::inserter(_refresh_rates, _refresh_rates.end())); } +static const std::map _scale_labels = { + { 100, STR_GAME_OPTIONS_GUI_SCALE_1X }, + { 125, STR_NULL }, + { 150, STR_NULL }, + { 175, STR_NULL }, + { 200, STR_GAME_OPTIONS_GUI_SCALE_2X }, + { 225, STR_NULL }, + { 250, STR_NULL }, + { 275, STR_NULL }, + { 300, STR_GAME_OPTIONS_GUI_SCALE_3X }, + { 325, STR_NULL }, + { 350, STR_NULL }, + { 375, STR_NULL }, + { 400, STR_GAME_OPTIONS_GUI_SCALE_4X }, + { 425, STR_NULL }, + { 450, STR_NULL }, + { 475, STR_NULL }, + { 500, STR_GAME_OPTIONS_GUI_SCALE_5X }, +}; + struct GameOptionsWindow : Window { GameSettings *opt; bool reload; + int gui_scale; GameOptionsWindow(WindowDesc *desc) : Window(desc) { this->opt = &GetGameSettings(); this->reload = false; + this->gui_scale = _gui_scale; AddCustomRefreshRates(); @@ -263,24 +271,6 @@ struct GameOptionsWindow : Window { } break; - case WID_GO_GUI_ZOOM_DROPDOWN: { - *selected_index = _gui_zoom_cfg != ZOOM_LVL_CFG_AUTO ? ZOOM_LVL_OUT_4X - _gui_zoom + 1 : 0; - const StringID *items = _gui_zoom_dropdown; - for (int i = 0; *items != INVALID_STRING_ID; items++, i++) { - list.emplace_back(new DropDownListStringItem(*items, i, i != 0 && _settings_client.gui.zoom_min > ZOOM_LVL_OUT_4X - i + 1)); - } - break; - } - - case WID_GO_FONT_ZOOM_DROPDOWN: { - *selected_index = _font_zoom_cfg != ZOOM_LVL_CFG_AUTO ? ZOOM_LVL_OUT_4X - _font_zoom + 1 : 0; - const StringID *items = _font_zoom_dropdown; - for (int i = 0; *items != INVALID_STRING_ID; items++, i++) { - list.emplace_back(new DropDownListStringItem(*items, i, false)); - } - break; - } - case WID_GO_BASE_GRF_DROPDOWN: list = BuildSetDropDownList(selected_index, (_game_mode == GM_MENU)); break; @@ -303,8 +293,6 @@ struct GameOptionsWindow : Window { case WID_GO_CURRENCY_DROPDOWN: SetDParam(0, _currency_specs[this->opt->locale.currency].name); break; case WID_GO_AUTOSAVE_DROPDOWN: SetDParam(0, _autosave_dropdown[_settings_client.gui.autosave]); break; case WID_GO_LANG_DROPDOWN: SetDParamStr(0, _current_language->own_name); break; - case WID_GO_GUI_ZOOM_DROPDOWN: SetDParam(0, _gui_zoom_dropdown[_gui_zoom_cfg != ZOOM_LVL_CFG_AUTO ? ZOOM_LVL_OUT_4X - _gui_zoom_cfg + 1 : 0]); break; - case WID_GO_FONT_ZOOM_DROPDOWN: SetDParam(0, _font_zoom_dropdown[_font_zoom_cfg != ZOOM_LVL_CFG_AUTO ? ZOOM_LVL_OUT_4X - _font_zoom_cfg + 1 : 0]); break; case WID_GO_BASE_GRF_DROPDOWN: SetDParamStr(0, BaseGraphics::GetUsedSet()->name); break; case WID_GO_BASE_GRF_STATUS: SetDParam(0, BaseGraphics::GetUsedSet()->GetNumInvalid()); break; case WID_GO_BASE_SFX_DROPDOWN: SetDParamStr(0, BaseSounds::GetUsedSet()->name); break; @@ -345,12 +333,16 @@ struct GameOptionsWindow : Window { DrawStringMultiLine(r.left, r.right, r.top, UINT16_MAX, STR_BLACK_RAW_STRING); break; + case WID_GO_GUI_SCALE: + DrawSliderWidget(r, MIN_INTERFACE_SCALE, MAX_INTERFACE_SCALE, this->gui_scale, _scale_labels); + break; + case WID_GO_BASE_SFX_VOLUME: - DrawVolumeSliderWidget(r, _settings_client.music.effect_vol); + DrawSliderWidget(r, 0, INT8_MAX, _settings_client.music.effect_vol, {}); break; case WID_GO_BASE_MUSIC_VOLUME: - DrawVolumeSliderWidget(r, _settings_client.music.music_vol); + DrawSliderWidget(r, 0, INT8_MAX, _settings_client.music.music_vol, {}); break; } } @@ -474,11 +466,50 @@ struct GameOptionsWindow : Window { this->SetWidgetDirty(WID_GO_REFRESH_RATE_DROPDOWN); break; + case WID_GO_GUI_SCALE_BEVEL_BUTTON: { + _settings_client.gui.scale_bevels = !_settings_client.gui.scale_bevels; + + this->SetWidgetLoweredState(WID_GO_GUI_SCALE_BEVEL_BUTTON, _settings_client.gui.scale_bevels); + this->SetDirty(); + + SetupWidgetDimensions(); + ReInitAllWindows(true); + break; + } + + case WID_GO_GUI_SCALE: + if (ClickSliderWidget(this->GetWidget(widget)->GetCurrentRect(), pt, MIN_INTERFACE_SCALE, MAX_INTERFACE_SCALE, this->gui_scale)) { + if (!_ctrl_pressed) this->gui_scale = ((this->gui_scale + 12) / 25) * 25; + this->SetWidgetDirty(widget); + } + + if (click_count > 0) this->mouse_capture_widget = widget; + break; + + case WID_GO_GUI_SCALE_AUTO: + { + if (_gui_scale_cfg == -1) { + _gui_scale_cfg = _gui_scale; + this->SetWidgetLoweredState(WID_GO_GUI_SCALE_AUTO, false); + } else { + _gui_scale_cfg = -1; + this->SetWidgetLoweredState(WID_GO_GUI_SCALE_AUTO, true); + if (AdjustGUIZoom(false)) ReInitAllWindows(true); + this->gui_scale = _gui_scale; + } + this->SetWidgetDirty(widget); + break; + } + case WID_GO_BASE_SFX_VOLUME: case WID_GO_BASE_MUSIC_VOLUME: { byte &vol = (widget == WID_GO_BASE_MUSIC_VOLUME) ? _settings_client.music.music_vol : _settings_client.music.effect_vol; - if (ClickVolumeSliderWidget(this->GetWidget(widget)->GetCurrentRect(), pt, vol)) { - if (widget == WID_GO_BASE_MUSIC_VOLUME) MusicDriver::GetInstance()->SetVolume(vol); + if (ClickSliderWidget(this->GetWidget(widget)->GetCurrentRect(), pt, 0, INT8_MAX, vol)) { + if (widget == WID_GO_BASE_MUSIC_VOLUME) { + MusicDriver::GetInstance()->SetVolume(vol); + } else { + SetEffectVolume(vol); + } this->SetWidgetDirty(widget); SetWindowClassesDirty(WC_MUSIC_WINDOW); } @@ -487,6 +518,11 @@ struct GameOptionsWindow : Window { break; } + case WID_GO_BASE_MUSIC_JUKEBOX: { + ShowMusicWindow(); + break; + } + default: { int selected; DropDownList list = this->BuildDropDownList(widget, &selected); @@ -500,6 +536,19 @@ struct GameOptionsWindow : Window { } } + void OnMouseLoop() override + { + if (_left_button_down || this->gui_scale == _gui_scale) return; + + _gui_scale_cfg = this->gui_scale; + + if (AdjustGUIZoom(false)) { + ReInitAllWindows(true); + this->SetWidgetLoweredState(WID_GO_GUI_SCALE_AUTO, false); + this->SetDirty(); + } + } + /** * Set the base media set. * @param index the index of the media set @@ -559,34 +608,6 @@ struct GameOptionsWindow : Window { break; } - case WID_GO_GUI_ZOOM_DROPDOWN: { - int8 new_zoom = index > 0 ? ZOOM_LVL_OUT_4X - index + 1 : ZOOM_LVL_CFG_AUTO; - if (new_zoom != _gui_zoom_cfg) { - GfxClearSpriteCache(); - _gui_zoom_cfg = new_zoom; - UpdateGUIZoom(); - UpdateCursorSize(); - UpdateAllVirtCoords(); - FixTitleGameZoom(); - ReInitAllWindows(true); - } - break; - } - - case WID_GO_FONT_ZOOM_DROPDOWN: { - int8 new_zoom = index > 0 ? ZOOM_LVL_OUT_4X - index + 1 : ZOOM_LVL_CFG_AUTO; - if (new_zoom != _font_zoom_cfg) { - GfxClearSpriteCache(); - _font_zoom_cfg = new_zoom; - UpdateGUIZoom(); - ClearFontCache(); - LoadStringWidthTable(); - UpdateAllVirtCoords(); - ReInitAllWindows(true); - } - break; - } - case WID_GO_BASE_GRF_DROPDOWN: this->SetMediaSet(index); break; @@ -618,6 +639,9 @@ struct GameOptionsWindow : Window { this->SetWidgetDisabledState(WID_GO_VIDEO_VSYNC_BUTTON, !_video_hw_accel); #endif + this->SetWidgetLoweredState(WID_GO_GUI_SCALE_AUTO, _gui_scale_cfg == -1); + this->SetWidgetLoweredState(WID_GO_GUI_SCALE_BEVEL_BUTTON, _settings_client.gui.scale_bevels); + bool missing_files = BaseGraphics::GetUsedSet()->GetNumMissing() == 0; this->GetWidget(WID_GO_BASE_GRF_STATUS)->SetDataTip(missing_files ? STR_EMPTY : STR_GAME_OPTIONS_BASE_GRF_STATUS, STR_NULL); @@ -643,9 +667,6 @@ static const NWidgetPart _nested_game_options_widgets[] = { NWidget(WWT_FRAME, COLOUR_GREY), SetDataTip(STR_GAME_OPTIONS_AUTOSAVE_FRAME, STR_NULL), NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GO_AUTOSAVE_DROPDOWN), SetMinimalSize(150, 12), SetDataTip(STR_BLACK_STRING, STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP), SetFill(1, 0), EndContainer(), - NWidget(WWT_FRAME, COLOUR_GREY), SetDataTip(STR_GAME_OPTIONS_GUI_ZOOM_FRAME, STR_NULL), - NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GO_GUI_ZOOM_DROPDOWN), SetMinimalSize(150, 12), SetDataTip(STR_BLACK_STRING, STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP), SetFill(1, 0), - EndContainer(), NWidget(WWT_FRAME, COLOUR_GREY), SetDataTip(STR_GAME_OPTIONS_CURRENCY_UNITS_FRAME, STR_NULL), NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GO_CURRENCY_DROPDOWN), SetMinimalSize(150, 12), SetDataTip(STR_BLACK_STRING, STR_GAME_OPTIONS_CURRENCY_UNITS_DROPDOWN_TOOLTIP), SetFill(1, 0), EndContainer(), @@ -655,8 +676,20 @@ static const NWidgetPart _nested_game_options_widgets[] = { NWidget(WWT_FRAME, COLOUR_GREY), SetDataTip(STR_GAME_OPTIONS_LANGUAGE, STR_NULL), NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GO_LANG_DROPDOWN), SetMinimalSize(150, 12), SetDataTip(STR_BLACK_RAW_STRING, STR_GAME_OPTIONS_LANGUAGE_TOOLTIP), SetFill(1, 0), EndContainer(), - NWidget(WWT_FRAME, COLOUR_GREY), SetDataTip(STR_GAME_OPTIONS_FONT_ZOOM, STR_NULL), - NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GO_FONT_ZOOM_DROPDOWN), SetMinimalSize(150, 12), SetDataTip(STR_BLACK_STRING, STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP), SetFill(1, 0), + NWidget(WWT_FRAME, COLOUR_GREY), SetDataTip(STR_GAME_OPTIONS_GUI_SCALE_FRAME, STR_NULL), + NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_normal, 0), + NWidget(WWT_EMPTY, COLOUR_GREY, WID_GO_GUI_SCALE), SetMinimalSize(67, 0), SetMinimalTextLines(1, 12 + WidgetDimensions::unscaled.vsep_normal, FS_SMALL), SetFill(0, 0), SetDataTip(0x0, STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP), + NWidget(NWID_HORIZONTAL), + NWidget(WWT_TEXT, COLOUR_GREY), SetMinimalSize(0, 12), SetDataTip(STR_GAME_OPTIONS_GUI_SCALE_AUTO, STR_NULL), + NWidget(NWID_SPACER), SetMinimalSize(1, 0), SetFill(1, 0), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_GO_GUI_SCALE_AUTO), SetMinimalSize(21, 9), SetDataTip(STR_EMPTY, STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP), + EndContainer(), + NWidget(NWID_HORIZONTAL), + NWidget(WWT_TEXT, COLOUR_GREY), SetMinimalSize(0, 12), SetDataTip(STR_GAME_OPTIONS_GUI_SCALE_BEVELS, STR_NULL), + NWidget(NWID_SPACER), SetMinimalSize(1, 0), SetFill(1, 0), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_GO_GUI_SCALE_BEVEL_BUTTON), SetMinimalSize(21, 9), SetDataTip(STR_EMPTY, STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP), + EndContainer(), + EndContainer(), EndContainer(), EndContainer(), EndContainer(), @@ -731,7 +764,12 @@ static const NWidgetPart _nested_game_options_widgets[] = { NWidget(WWT_TEXT, COLOUR_GREY, WID_GO_BASE_MUSIC_STATUS), SetMinimalSize(150, 12), SetDataTip(STR_EMPTY, STR_NULL), SetFill(1, 0), NWidget(WWT_EMPTY, COLOUR_GREY, WID_GO_BASE_MUSIC_VOLUME), SetMinimalSize(67, 12), SetFill(0, 0), SetDataTip(0x0, STR_MUSIC_TOOLTIP_DRAG_SLIDERS_TO_SET_MUSIC), EndContainer(), - NWidget(WWT_TEXT, COLOUR_GREY, WID_GO_BASE_MUSIC_DESCRIPTION), SetMinimalSize(330, 0), SetDataTip(STR_EMPTY, STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP), SetFill(1, 0), SetPadding(6, 0, 6, 0), + NWidget(NWID_HORIZONTAL), SetPIP(0, 30, 7), + NWidget(WWT_TEXT, COLOUR_GREY, WID_GO_BASE_MUSIC_DESCRIPTION), SetMinimalSize(330, 0), SetDataTip(STR_EMPTY, STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP), SetFill(1, 0), SetPadding(6, 0, 6, 0), + NWidget(NWID_VERTICAL), SetPIP(0, 0, 0), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_GO_BASE_MUSIC_JUKEBOX), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_MUSIC, STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW), SetPadding(6, 0, 6, 0), + EndContainer(), + EndContainer(), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(7, 0, 7), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_MUSIC_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_NULL), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_MUSIC_TEXTFILE + TFT_CHANGELOG), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_NULL), @@ -756,7 +794,6 @@ void ShowGameOptions() } static int SETTING_HEIGHT = 11; ///< Height of a single setting in the tree view in pixels -static const int LEVEL_WIDTH = 15; ///< Indenting width of a sub-page in pixels /** * Flags for #SettingEntry @@ -989,8 +1026,8 @@ uint BaseSettingEntry::Draw(GameSettings *settings_ptr, int left, int right, int if (cur_row >= max_row) return cur_row; bool rtl = _current_text_dir == TD_RTL; - int offset = rtl ? -4 : 4; - int level_width = rtl ? -LEVEL_WIDTH : LEVEL_WIDTH; + int offset = (rtl ? -(int)_circle_size.width : _circle_size.width) / 2; + int level_width = rtl ? -WidgetDimensions::scaled.hsep_indent : WidgetDimensions::scaled.hsep_indent; int x = rtl ? right : left; if (cur_row >= first_row) { @@ -1007,7 +1044,7 @@ uint BaseSettingEntry::Draw(GameSettings *settings_ptr, int left, int right, int int bottom_y = (flags & SEF_LAST_FIELD) ? halfway_y : y + SETTING_HEIGHT - 1; GfxDrawLine(x + offset, y, x + offset, bottom_y, colour); /* Small horizontal line from the last vertical line */ - GfxDrawLine(x + offset, halfway_y, x + level_width - offset, halfway_y, colour); + GfxDrawLine(x + offset, halfway_y, x + level_width - WidgetDimensions::scaled.hsep_normal, halfway_y, colour); x += level_width; this->DrawSetting(settings_ptr, rtl ? left : x, rtl ? x : right, y, this == selected); @@ -1199,8 +1236,8 @@ void SettingEntry::DrawSetting(GameSettings *settings_ptr, int left, int right, bool rtl = _current_text_dir == TD_RTL; uint buttons_left = rtl ? right + 1 - SETTING_BUTTON_WIDTH : left; - uint text_left = left + (rtl ? 0 : SETTING_BUTTON_WIDTH + 5); - uint text_right = right - (rtl ? SETTING_BUTTON_WIDTH + 5 : 0); + uint text_left = left + (rtl ? 0 : SETTING_BUTTON_WIDTH + WidgetDimensions::scaled.hsep_wide); + uint text_right = right - (rtl ? SETTING_BUTTON_WIDTH + WidgetDimensions::scaled.hsep_wide : 0); uint button_y = y + (SETTING_HEIGHT - SETTING_BUTTON_HEIGHT) / 2; /* We do not allow changes of some items when we are a client in a networkgame */ @@ -1547,7 +1584,7 @@ void SettingsPage::DrawSetting(GameSettings *settings_ptr, int left, int right, { bool rtl = _current_text_dir == TD_RTL; DrawSprite((this->folded ? SPR_CIRCLE_FOLDED : SPR_CIRCLE_UNFOLDED), PAL_NONE, rtl ? right - _circle_size.width : left, y + (SETTING_HEIGHT - _circle_size.height) / 2); - DrawString(rtl ? left : left + _circle_size.width + 2, rtl ? right - _circle_size.width - 2 : right, y + (SETTING_HEIGHT - FONT_HEIGHT_NORMAL) / 2, this->title); + DrawString(rtl ? left : left + _circle_size.width + WidgetDimensions::scaled.hsep_normal, rtl ? right - _circle_size.width - WidgetDimensions::scaled.hsep_normal : right, y + (SETTING_HEIGHT - FONT_HEIGHT_NORMAL) / 2, this->title); } /** Construct settings tree */ @@ -1644,6 +1681,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.show_newgrf_name")); + interface->Add(new SettingEntry("gui.show_cargo_in_vehicle_lists")); } SettingsPage *advisors = main->Add(new SettingsPage(STR_CONFIG_SETTING_ADVISORS)); @@ -1896,11 +1934,6 @@ static void ResetAllSettingsConfirmationCallback(Window *w, bool confirmed) /** Window to edit settings of the game. */ struct GameSettingsWindow : Window { - static const int SETTINGTREE_LEFT_OFFSET = 5; ///< Position of left edge of setting values - static const int SETTINGTREE_RIGHT_OFFSET = 5; ///< Position of right edge of setting values - static const int SETTINGTREE_TOP_OFFSET = 5; ///< Position of top edge of setting values - static const int SETTINGTREE_BOTTOM_OFFSET = 5; ///< Position of bottom edge of setting values - static GameSettings *settings_ptr; ///< Pointer to the game settings being displayed and modified. SettingEntry *valuewindow_entry; ///< If non-nullptr, pointer to setting for which a value-entering window has been opened. @@ -1927,7 +1960,6 @@ struct GameSettingsWindow : Window { this->filter.type_hides = false; this->settings_ptr = &GetGameSettings(); - _circle_size = maxdim(GetSpriteSize(SPR_CIRCLE_FOLDED), GetSpriteSize(SPR_CIRCLE_UNFOLDED)); GetSettingsTree().FoldAll(); // Close all sub-pages this->valuewindow_entry = nullptr; // No setting entry for which a entry window is opened @@ -1948,14 +1980,19 @@ struct GameSettingsWindow : Window { this->InvalidateData(); } + void OnInit() override + { + _circle_size = maxdim(GetSpriteSize(SPR_CIRCLE_FOLDED), GetSpriteSize(SPR_CIRCLE_UNFOLDED)); + } + void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override { switch (widget) { case WID_GS_OPTIONSPANEL: - resize->height = SETTING_HEIGHT = std::max({(int)_circle_size.height, SETTING_BUTTON_HEIGHT, FONT_HEIGHT_NORMAL}) + 1; - resize->width = 1; + resize->height = SETTING_HEIGHT = std::max({(int)_circle_size.height, SETTING_BUTTON_HEIGHT, FONT_HEIGHT_NORMAL}) + WidgetDimensions::scaled.vsep_normal; + resize->width = 1; - size->height = 5 * resize->height + SETTINGTREE_TOP_OFFSET + SETTINGTREE_BOTTOM_OFFSET; + size->height = 5 * resize->height + WidgetDimensions::scaled.framerect.Vertical(); break; case WID_GS_HELP_TEXT: { @@ -1968,7 +2005,7 @@ struct GameSettingsWindow : Window { SetDParam(0, setting_types[i]); size->width = std::max(size->width, GetStringBoundingBox(STR_CONFIG_SETTING_TYPE).width); } - size->height = 2 * FONT_HEIGHT_NORMAL + WD_PAR_VSEP_NORMAL + + size->height = 2 * FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal + std::max(size->height, GetSettingsTree().GetMaxHelpHeight(size->width)); break; } @@ -1993,14 +2030,14 @@ struct GameSettingsWindow : Window { } /* Reserve the correct number of lines for the 'some search results are hidden' notice in the central settings display panel. */ - const NWidgetBase *panel = this->GetWidget(WID_GS_OPTIONSPANEL); + const Rect panel = this->GetWidget(WID_GS_OPTIONSPANEL)->GetCurrentRect().Shrink(WidgetDimensions::scaled.frametext); StringID warn_str = STR_CONFIG_SETTING_CATEGORY_HIDES - 1 + this->warn_missing; int new_warn_lines; if (this->warn_missing == WHR_NONE) { new_warn_lines = 0; } else { SetDParam(0, _game_settings_restrict_dropdown[this->filter.min_cat]); - new_warn_lines = GetStringLineCount(warn_str, panel->current_x); + new_warn_lines = GetStringLineCount(warn_str, panel.Width()); } if (this->warn_lines != new_warn_lines) { this->vscroll->SetCount(this->vscroll->GetCount() - this->warn_lines + new_warn_lines); @@ -2011,16 +2048,8 @@ struct GameSettingsWindow : Window { /* Draw the 'some search results are hidden' notice. */ if (this->warn_missing != WHR_NONE) { - const int left = panel->pos_x; - const int right = left + panel->current_x - 1; - const int top = panel->pos_y + WD_FRAMETEXT_TOP + (SETTING_HEIGHT - FONT_HEIGHT_NORMAL) * this->warn_lines / 2; SetDParam(0, _game_settings_restrict_dropdown[this->filter.min_cat]); - if (this->warn_lines == 1) { - /* If the warning fits at one line, center it. */ - DrawString(left + WD_FRAMETEXT_LEFT, right - WD_FRAMETEXT_RIGHT, top, warn_str, TC_FROMSTRING, SA_HOR_CENTER); - } else { - DrawStringMultiLine(left + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, top, INT32_MAX, warn_str, TC_FROMSTRING, SA_HOR_CENTER); - } + DrawStringMultiLine(panel.WithHeight(this->warn_lines * FONT_HEIGHT_NORMAL), warn_str, TC_FROMSTRING, SA_CENTER); } } @@ -2070,11 +2099,12 @@ struct GameSettingsWindow : Window { { switch (widget) { case WID_GS_OPTIONSPANEL: { - int top_pos = r.top + SETTINGTREE_TOP_OFFSET + 1 + this->warn_lines * SETTING_HEIGHT; + Rect tr = r.Shrink(WidgetDimensions::scaled.frametext, WidgetDimensions::scaled.framerect); + tr.top += this->warn_lines * SETTING_HEIGHT; uint last_row = this->vscroll->GetPosition() + this->vscroll->GetCapacity() - this->warn_lines; - int next_row = GetSettingsTree().Draw(settings_ptr, r.left + SETTINGTREE_LEFT_OFFSET, r.right - SETTINGTREE_RIGHT_OFFSET, top_pos, + int next_row = GetSettingsTree().Draw(settings_ptr, tr.left, tr.right, tr.top, this->vscroll->GetPosition(), last_row, this->last_clicked); - if (next_row == 0) DrawString(r.left + SETTINGTREE_LEFT_OFFSET, r.right - SETTINGTREE_RIGHT_OFFSET, top_pos, STR_CONFIG_SETTINGS_NONE); + if (next_row == 0) DrawString(tr, STR_CONFIG_SETTINGS_NONE); break; } @@ -2082,21 +2112,21 @@ struct GameSettingsWindow : Window { if (this->last_clicked != nullptr) { const IntSettingDesc *sd = this->last_clicked->setting; - int y = r.top; + Rect tr = r; switch (sd->GetType()) { case ST_COMPANY: SetDParam(0, _game_mode == GM_MENU ? STR_CONFIG_SETTING_TYPE_COMPANY_MENU : STR_CONFIG_SETTING_TYPE_COMPANY_INGAME); break; case ST_CLIENT: SetDParam(0, STR_CONFIG_SETTING_TYPE_CLIENT); break; case ST_GAME: SetDParam(0, _game_mode == GM_MENU ? STR_CONFIG_SETTING_TYPE_GAME_MENU : STR_CONFIG_SETTING_TYPE_GAME_INGAME); break; default: NOT_REACHED(); } - DrawString(r.left, r.right, y, STR_CONFIG_SETTING_TYPE); - y += FONT_HEIGHT_NORMAL; + DrawString(tr, STR_CONFIG_SETTING_TYPE); + tr.top += FONT_HEIGHT_NORMAL; this->last_clicked->SetValueDParams(0, sd->def); - DrawString(r.left, r.right, y, STR_CONFIG_SETTING_DEFAULT_VALUE); - y += FONT_HEIGHT_NORMAL + WD_PAR_VSEP_NORMAL; + DrawString(tr, STR_CONFIG_SETTING_DEFAULT_VALUE); + tr.top += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; - DrawStringMultiLine(r.left, r.right, y, r.bottom, this->last_clicked->GetHelpText(), TC_WHITE); + DrawStringMultiLine(tr, this->last_clicked->GetHelpText(), TC_WHITE); } break; @@ -2158,7 +2188,7 @@ struct GameSettingsWindow : Window { if (widget != WID_GS_OPTIONSPANEL) return; - uint btn = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_GS_OPTIONSPANEL, SETTINGTREE_TOP_OFFSET); + uint btn = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_GS_OPTIONSPANEL, WidgetDimensions::scaled.framerect.top); if (btn == INT_MAX || (int)btn < this->warn_lines) return; btn -= this->warn_lines; @@ -2167,7 +2197,7 @@ struct GameSettingsWindow : Window { if (clicked_entry == nullptr) return; // Clicked below the last setting of the page - int x = (_current_text_dir == TD_RTL ? this->width - 1 - pt.x : pt.x) - SETTINGTREE_LEFT_OFFSET - (clicked_entry->level + 1) * LEVEL_WIDTH; // Shift x coordinate + int x = (_current_text_dir == TD_RTL ? this->width - 1 - pt.x : pt.x) - WidgetDimensions::scaled.frametext.left - (clicked_entry->level + 1) * WidgetDimensions::scaled.hsep_indent; // Shift x coordinate if (x < 0) return; // Clicked left of the entry SettingsPage *clicked_page = dynamic_cast(clicked_entry); @@ -2208,7 +2238,7 @@ struct GameSettingsWindow : Window { this->closing_dropdown = false; const NWidgetBase *wid = this->GetWidget(WID_GS_OPTIONSPANEL); - int rel_y = (pt.y - (int)wid->pos_y - SETTINGTREE_TOP_OFFSET) % wid->resize_y; + int rel_y = (pt.y - (int)wid->pos_y - WidgetDimensions::scaled.framerect.top) % wid->resize_y; Rect wi_rect; wi_rect.left = pt.x - (_current_text_dir == TD_RTL ? SETTING_BUTTON_WIDTH - 1 - x : x); @@ -2288,10 +2318,13 @@ struct GameSettingsWindow : Window { /* Show the correct currency-translated value */ if (sd->flags & SF_GUI_CURRENCY) value64 *= _currency->rate; + CharSetFilter charset_filter = CS_NUMERAL; //default, only numeric input allowed + if (sd->min < 0) charset_filter = CS_NUMERAL_SIGNED; // special case, also allow '-' sign for negative input + this->valuewindow_entry = pe; SetDParam(0, value64); /* Limit string length to 14 so that MAX_INT32 * max currency rate doesn't exceed MAX_INT64. */ - ShowQueryString(STR_JUST_INT, STR_CONFIG_SETTING_QUERY_CAPTION, 15, this, CS_NUMERAL, QSF_ENABLE_DEFAULT); + ShowQueryString(STR_JUST_INT, STR_CONFIG_SETTING_QUERY_CAPTION, 15, this, charset_filter, QSF_ENABLE_DEFAULT); } this->SetDisplayedHelpText(pe); } @@ -2433,7 +2466,7 @@ struct GameSettingsWindow : Window { void OnResize() override { - this->vscroll->SetCapacityFromWidget(this, WID_GS_OPTIONSPANEL, SETTINGTREE_TOP_OFFSET + SETTINGTREE_BOTTOM_OFFSET); + this->vscroll->SetCapacityFromWidget(this, WID_GS_OPTIONSPANEL, WidgetDimensions::scaled.framerect.Vertical()); } }; @@ -2446,16 +2479,16 @@ static const NWidgetPart _nested_settings_selection_widgets[] = { NWidget(WWT_DEFSIZEBOX, COLOUR_MAUVE), EndContainer(), NWidget(WWT_PANEL, COLOUR_MAUVE), - NWidget(NWID_VERTICAL), SetPIP(WD_TEXTPANEL_TOP, WD_PAR_VSEP_NORMAL, WD_TEXTPANEL_BOTTOM), - NWidget(NWID_HORIZONTAL), SetPIP(WD_FRAMETEXT_LEFT, WD_FRAMETEXT_RIGHT, WD_FRAMETEXT_RIGHT), + NWidget(NWID_VERTICAL), SetPIP(WidgetDimensions::unscaled.frametext.top, WidgetDimensions::unscaled.vsep_normal, WidgetDimensions::unscaled.frametext.bottom), + NWidget(NWID_HORIZONTAL), SetPIP(WidgetDimensions::unscaled.frametext.left, WidgetDimensions::unscaled.hsep_wide, WidgetDimensions::unscaled.frametext.right), NWidget(WWT_TEXT, COLOUR_MAUVE, WID_GS_RESTRICT_CATEGORY), SetDataTip(STR_CONFIG_SETTING_RESTRICT_CATEGORY, STR_NULL), NWidget(WWT_DROPDOWN, COLOUR_MAUVE, WID_GS_RESTRICT_DROPDOWN), SetMinimalSize(100, 12), SetDataTip(STR_BLACK_STRING, STR_CONFIG_SETTING_RESTRICT_DROPDOWN_HELPTEXT), SetFill(1, 0), SetResize(1, 0), EndContainer(), - NWidget(NWID_HORIZONTAL), SetPIP(WD_FRAMETEXT_LEFT, WD_FRAMETEXT_RIGHT, WD_FRAMETEXT_RIGHT), + NWidget(NWID_HORIZONTAL), SetPIP(WidgetDimensions::unscaled.frametext.left, WidgetDimensions::unscaled.hsep_wide, WidgetDimensions::unscaled.frametext.right), NWidget(WWT_TEXT, COLOUR_MAUVE, WID_GS_RESTRICT_TYPE), SetDataTip(STR_CONFIG_SETTING_RESTRICT_TYPE, STR_NULL), NWidget(WWT_DROPDOWN, COLOUR_MAUVE, WID_GS_TYPE_DROPDOWN), SetMinimalSize(100, 12), SetDataTip(STR_BLACK_STRING, STR_CONFIG_SETTING_TYPE_DROPDOWN_HELPTEXT), SetFill(1, 0), SetResize(1, 0), EndContainer(), - NWidget(NWID_HORIZONTAL), SetPIP(WD_FRAMETEXT_LEFT, WD_FRAMETEXT_RIGHT, WD_FRAMETEXT_RIGHT), + NWidget(NWID_HORIZONTAL), SetPIP(WidgetDimensions::unscaled.frametext.left, WidgetDimensions::unscaled.hsep_wide, WidgetDimensions::unscaled.frametext.right), NWidget(WWT_TEXT, COLOUR_MAUVE), SetFill(0, 1), SetDataTip(STR_CONFIG_SETTING_FILTER_TITLE, STR_NULL), NWidget(WWT_EDITBOX, COLOUR_MAUVE, WID_GS_FILTER), SetMinimalSize(50, 12), SetDataTip(STR_LIST_FILTER_OSKTITLE, STR_LIST_FILTER_TOOLTIP), SetFill(1, 0), SetResize(1, 0), EndContainer(), @@ -2467,7 +2500,7 @@ static const NWidgetPart _nested_settings_selection_widgets[] = { EndContainer(), NWidget(WWT_PANEL, COLOUR_MAUVE), NWidget(WWT_EMPTY, INVALID_COLOUR, WID_GS_HELP_TEXT), SetMinimalSize(300, 25), SetFill(1, 1), SetResize(1, 0), - SetPadding(WD_FRAMETEXT_TOP, WD_FRAMETEXT_RIGHT, WD_FRAMETEXT_BOTTOM, WD_FRAMETEXT_LEFT), + SetPadding(WidgetDimensions::unscaled.frametext), EndContainer(), NWidget(NWID_HORIZONTAL), NWidget(WWT_PUSHTXTBTN, COLOUR_MAUVE, WID_GS_EXPAND_ALL), SetDataTip(STR_CONFIG_SETTING_EXPAND_ALL, STR_NULL), @@ -2508,18 +2541,21 @@ void DrawArrowButtons(int x, int y, Colours button_colour, byte state, bool clic int colour = _colour_gradient[button_colour][2]; Dimension dim = NWidgetScrollbar::GetHorizontalDimension(); - DrawFrameRect(x, y, x + dim.width - 1, y + dim.height - 1, button_colour, (state == 1) ? FR_LOWERED : FR_NONE); - DrawFrameRect(x + dim.width, y, x + dim.width + dim.width - 1, y + dim.height - 1, button_colour, (state == 2) ? FR_LOWERED : FR_NONE); - DrawSprite(SPR_ARROW_LEFT, PAL_NONE, x + WD_IMGBTN_LEFT, y + WD_IMGBTN_TOP); - DrawSprite(SPR_ARROW_RIGHT, PAL_NONE, x + WD_IMGBTN_LEFT + dim.width, y + WD_IMGBTN_TOP); + Rect lr = {x, y, x + (int)dim.width - 1, y + (int)dim.height - 1}; + Rect rr = {x + (int)dim.width, y, x + (int)dim.width * 2 - 1, y + (int)dim.height - 1}; + + DrawFrameRect(lr, button_colour, (state == 1) ? FR_LOWERED : FR_NONE); + DrawFrameRect(rr, button_colour, (state == 2) ? FR_LOWERED : FR_NONE); + DrawSpriteIgnorePadding(SPR_ARROW_LEFT, PAL_NONE, lr, (state == 1), SA_CENTER); + DrawSpriteIgnorePadding(SPR_ARROW_RIGHT, PAL_NONE, rr, (state == 2), SA_CENTER); /* Grey out the buttons that aren't clickable */ bool rtl = _current_text_dir == TD_RTL; if (rtl ? !clickable_right : !clickable_left) { - GfxFillRect(x + 1, y, x + dim.width - 1, y + dim.height - 2, colour, FILLRECT_CHECKER); + GfxFillRect(lr.Shrink(WidgetDimensions::scaled.bevel), colour, FILLRECT_CHECKER); } if (rtl ? !clickable_left : !clickable_right) { - GfxFillRect(x + dim.width + 1, y, x + dim.width + dim.width - 1, y + dim.height - 2, colour, FILLRECT_CHECKER); + GfxFillRect(rr.Shrink(WidgetDimensions::scaled.bevel), colour, FILLRECT_CHECKER); } } @@ -2535,11 +2571,13 @@ void DrawDropDownButton(int x, int y, Colours button_colour, bool state, bool cl { int colour = _colour_gradient[button_colour][2]; - DrawFrameRect(x, y, x + SETTING_BUTTON_WIDTH - 1, y + SETTING_BUTTON_HEIGHT - 1, button_colour, state ? FR_LOWERED : FR_NONE); - DrawSprite(SPR_ARROW_DOWN, PAL_NONE, x + (SETTING_BUTTON_WIDTH - NWidgetScrollbar::GetVerticalDimension().width) / 2 + state, y + 2 + state); + Rect r = {x, y, x + SETTING_BUTTON_WIDTH - 1, y + SETTING_BUTTON_HEIGHT - 1}; + + DrawFrameRect(r, button_colour, state ? FR_LOWERED : FR_NONE); + DrawSpriteIgnorePadding(SPR_ARROW_DOWN, PAL_NONE, r, state, SA_CENTER); if (!clickable) { - GfxFillRect(x + 1, y, x + SETTING_BUTTON_WIDTH - 1, y + SETTING_BUTTON_HEIGHT - 2, colour, FILLRECT_CHECKER); + GfxFillRect(r.Shrink(WidgetDimensions::scaled.bevel), colour, FILLRECT_CHECKER); } } @@ -2553,7 +2591,9 @@ void DrawDropDownButton(int x, int y, Colours button_colour, bool state, bool cl void DrawBoolButton(int x, int y, bool state, bool clickable) { static const Colours _bool_ctabs[2][2] = {{COLOUR_CREAM, COLOUR_RED}, {COLOUR_DARK_GREEN, COLOUR_GREEN}}; - DrawFrameRect(x, y, x + SETTING_BUTTON_WIDTH - 1, y + SETTING_BUTTON_HEIGHT - 1, _bool_ctabs[state][clickable], state ? FR_LOWERED : FR_NONE); + + Rect r = {x, y, x + SETTING_BUTTON_WIDTH - 1, y + SETTING_BUTTON_HEIGHT - 1}; + DrawFrameRect(r, _bool_ctabs[state][clickable], state ? FR_LOWERED : FR_NONE); } struct CustomCurrencyWindow : Window { diff --git a/src/settings_type.h b/src/settings_type.h index 2c3dea7b92..a83384cdb3 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -170,6 +170,7 @@ struct GUISettings { 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 + bool show_cargo_in_vehicle_lists; ///< Show the cargoes the vehicles can carry in the list windows bool auto_remove_signals; ///< automatically remove signals when in the way during rail construction uint16 refresh_rate; ///< How often we refresh the screen (time between draw-ticks). uint16 fast_forward_speed_limit; ///< Game speed to use when fast-forward is enabled. @@ -187,12 +188,14 @@ struct GUISettings { uint8 developer; ///< print non-fatal warnings in console (>= 1), copy debug output to console (== 2) bool show_date_in_logs; ///< whether to show dates in console logs bool newgrf_developer_tools; ///< activate NewGRF developer tools and allow modifying NewGRFs in an existing game - bool ai_developer_tools; ///< activate AI developer tools + bool ai_developer_tools; ///< activate AI/GS developer tools bool scenario_developer; ///< activate scenario developer: allow modifying NewGRFs in an existing game uint8 settings_restriction_mode; ///< selected restriction mode in adv. settings GUI. @see RestrictionMode bool newgrf_show_old_versions; ///< whether to show old versions in the NewGRF list uint8 newgrf_default_palette; ///< default palette to use for NewGRFs without action 14 palette information + bool scale_bevels; ///< bevels are scaled with GUI scale. + /** * Returns true when the user has sufficient privileges to edit newgrfs on a running game * @return whether the user has sufficient privileges to edit newgrfs in an existing game diff --git a/src/ship.h b/src/ship.h index 66e29f4c3c..990e3cd8b4 100644 --- a/src/ship.h +++ b/src/ship.h @@ -38,7 +38,7 @@ struct Ship FINAL : public SpecializedVehicle { void MarkDirty(); void UpdateDeltaXY(); ExpensesType GetExpenseType(bool income) const { return income ? EXPENSES_SHIP_REVENUE : EXPENSES_SHIP_RUN; } - void PlayLeaveStationSound() const; + void PlayLeaveStationSound(bool force = false) const; bool IsPrimaryVehicle() const { return true; } void GetImage(Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) const; int GetDisplaySpeed() const { return this->cur_speed / 2; } diff --git a/src/ship_cmd.cpp b/src/ship_cmd.cpp index 873d45e688..e1b05835bb 100644 --- a/src/ship_cmd.cpp +++ b/src/ship_cmd.cpp @@ -119,8 +119,8 @@ void GetShipSpriteSize(EngineID engine, uint &width, uint &height, int &xoffs, i Rect rect; seq.GetBounds(&rect); - width = UnScaleGUI(rect.right - rect.left + 1); - height = UnScaleGUI(rect.bottom - rect.top + 1); + width = UnScaleGUI(rect.Width()); + height = UnScaleGUI(rect.Height()); xoffs = UnScaleGUI(rect.left); yoffs = UnScaleGUI(rect.top); } @@ -272,16 +272,10 @@ void Ship::MarkDirty() this->UpdateCache(); } -static void PlayShipSound(const Vehicle *v) +void Ship::PlayLeaveStationSound(bool force) const { - if (!PlayVehicleSound(v, VSE_START)) { - SndPlayVehicleFx(ShipVehInfo(v->engine_type)->sfx, v); - } -} - -void Ship::PlayLeaveStationSound() const -{ - PlayShipSound(this); + if (PlayVehicleSound(this, VSE_START, force)) return; + SndPlayVehicleFx(ShipVehInfo(this->engine_type)->sfx, this); } TileIndex Ship::GetOrderStationLocation(StationID station) @@ -398,7 +392,7 @@ static bool CheckShipLeaveDepot(Ship *v) v->UpdateViewport(true, true); SetWindowDirty(WC_VEHICLE_DEPOT, v->tile); - PlayShipSound(v); + v->PlayLeaveStationSound(); VehicleServiceInDepot(v); InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile); SetWindowClassesDirty(WC_SHIPS_LIST); diff --git a/src/ship_gui.cpp b/src/ship_gui.cpp index aff7077f07..93c4a4a9c5 100644 --- a/src/ship_gui.cpp +++ b/src/ship_gui.cpp @@ -24,12 +24,10 @@ /** * Draws an image of a ship * @param v Front vehicle - * @param left The minimum horizontal position - * @param right The maximum horizontal position - * @param y Vertical position to draw at + * @param r Rect to draw at * @param selection Selected vehicle to draw a frame around */ -void DrawShipImage(const Vehicle *v, int left, int right, int y, VehicleID selection, EngineImageType image_type) +void DrawShipImage(const Vehicle *v, const Rect &r, VehicleID selection, EngineImageType image_type) { bool rtl = _current_text_dir == TD_RTL; @@ -39,17 +37,19 @@ void DrawShipImage(const Vehicle *v, int left, int right, int y, VehicleID selec Rect rect; seq.GetBounds(&rect); - int width = UnScaleGUI(rect.right - rect.left + 1); + int width = UnScaleGUI(rect.Width()); int x_offs = UnScaleGUI(rect.left); - int x = rtl ? right - width - x_offs : left - x_offs; + int x = rtl ? r.right - width - x_offs : r.left - x_offs; + /* This magic -1 offset is related to the sprite_y_offsets in build_vehicle_gui.cpp */ + int y = ScaleSpriteTrad(-1) + CenterBounds(r.top, r.bottom, 0); - y += ScaleGUITrad(10); seq.Draw(x, y, GetVehiclePalette(v), false); if (v->index == selection) { x += x_offs; y += UnScaleGUI(rect.top); - DrawFrameRect(x - 1, y - 1, x + width + 1, y + UnScaleGUI(rect.bottom - rect.top + 1) + 1, COLOUR_WHITE, FR_BORDERONLY); + Rect hr = {x, y, x + width - 1, y + UnScaleGUI(rect.Height()) - 1}; + DrawFrameRect(hr.Expand(WidgetDimensions::scaled.bevel), COLOUR_WHITE, FR_BORDERONLY); } } @@ -57,21 +57,23 @@ void DrawShipImage(const Vehicle *v, int left, int right, int y, VehicleID selec * Draw the details for the given vehicle at the given position * * @param v current vehicle - * @param left The left most coordinate to draw - * @param right The right most coordinate to draw - * @param y The y coordinate + * @param r the Rect to draw within */ -void DrawShipDetails(const Vehicle *v, int left, int right, int y) +void DrawShipDetails(const Vehicle *v, const Rect &r) { + int y = r.top; + SetDParam(0, v->engine_type); SetDParam(1, v->build_year); SetDParam(2, v->value); - DrawString(left, right, y, STR_VEHICLE_INFO_BUILT_VALUE); + DrawString(r.left, r.right, y, STR_VEHICLE_INFO_BUILT_VALUE); + y += FONT_HEIGHT_NORMAL; SetDParam(0, v->cargo_type); SetDParam(1, v->cargo_cap); SetDParam(4, GetCargoSubtypeText(v)); - DrawString(left, right, y + FONT_HEIGHT_NORMAL, STR_VEHICLE_INFO_CAPACITY); + DrawString(r.left, r.right, y, STR_VEHICLE_INFO_CAPACITY); + y += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; StringID str = STR_VEHICLE_DETAILS_CARGO_EMPTY; if (v->cargo.StoredCount() > 0) { @@ -80,9 +82,10 @@ void DrawShipDetails(const Vehicle *v, int left, int right, int y) SetDParam(2, v->cargo.Source()); str = STR_VEHICLE_DETAILS_CARGO_FROM; } - DrawString(left, right, y + 2 * FONT_HEIGHT_NORMAL + 1, str); + DrawString(r.left, r.right, y, str); + y += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; /* Draw Transfer credits text */ SetDParam(0, v->cargo.FeederShare()); - DrawString(left, right, y + 3 * FONT_HEIGHT_NORMAL + 3, STR_VEHICLE_INFO_FEEDER_CARGO_VALUE); + DrawString(r.left, r.right, y, STR_VEHICLE_INFO_FEEDER_CARGO_VALUE); } diff --git a/src/signs_gui.cpp b/src/signs_gui.cpp index a3685c5c50..911e0c9363 100644 --- a/src/signs_gui.cpp +++ b/src/signs_gui.cpp @@ -194,30 +194,30 @@ struct SignListWindow : Window, SignList { { switch (widget) { case WID_SIL_LIST: { - uint y = r.top + WD_FRAMERECT_TOP; // Offset from top of widget. + Rect tr = r.Shrink(WidgetDimensions::scaled.framerect); uint text_offset_y = (this->resize.step_height - FONT_HEIGHT_NORMAL + 1) / 2; /* No signs? */ if (this->vscroll->GetCount() == 0) { - DrawString(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, y + text_offset_y, STR_STATION_LIST_NONE); + DrawString(tr.left, tr.right, tr.top + text_offset_y, STR_STATION_LIST_NONE); return; } Dimension d = GetSpriteSize(SPR_COMPANY_ICON); bool rtl = _current_text_dir == TD_RTL; int sprite_offset_y = (this->resize.step_height - d.height + 1) / 2; - uint icon_left = 4 + (rtl ? r.right - this->text_offset : r.left); - uint text_left = r.left + (rtl ? WD_FRAMERECT_LEFT : this->text_offset); - uint text_right = r.right - (rtl ? this->text_offset : WD_FRAMERECT_RIGHT); + uint icon_left = rtl ? tr.right - this->text_offset : tr.left; + tr = tr.Indent(this->text_offset, rtl); /* At least one sign available. */ - for (uint16 i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < this->vscroll->GetCount(); i++) { + for (uint16 i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < this->vscroll->GetCount(); i++) + { const Sign *si = this->signs[i]; - if (si->owner != OWNER_NONE) DrawCompanyIcon(si->owner, icon_left, y + sprite_offset_y); + if (si->owner != OWNER_NONE) DrawCompanyIcon(si->owner, icon_left, tr.top + sprite_offset_y); SetDParam(0, si->index); - DrawString(text_left, text_right, y + text_offset_y, STR_SIGN_NAME, TC_YELLOW); - y += this->resize.step_height; + DrawString(tr.left, tr.right, tr.top + text_offset_y, STR_SIGN_NAME, TC_YELLOW); + tr.top += this->resize.step_height; } break; } @@ -233,7 +233,7 @@ struct SignListWindow : Window, SignList { { switch (widget) { case WID_SIL_LIST: { - uint id_v = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_SIL_LIST, WD_FRAMERECT_TOP); + uint id_v = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_SIL_LIST, WidgetDimensions::scaled.framerect.top); if (id_v == INT_MAX) return; const Sign *si = this->signs[id_v]; @@ -258,7 +258,7 @@ struct SignListWindow : Window, SignList { void OnResize() override { - this->vscroll->SetCapacityFromWidget(this, WID_SIL_LIST, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM); + this->vscroll->SetCapacityFromWidget(this, WID_SIL_LIST, WidgetDimensions::scaled.framerect.Vertical()); } void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override @@ -266,9 +266,9 @@ struct SignListWindow : Window, SignList { switch (widget) { case WID_SIL_LIST: { Dimension spr_dim = GetSpriteSize(SPR_COMPANY_ICON); - this->text_offset = WD_FRAMETEXT_LEFT + spr_dim.width + 2; // 2 pixels space between icon and the sign text. + this->text_offset = WidgetDimensions::scaled.frametext.left + spr_dim.width + 2; // 2 pixels space between icon and the sign text. resize->height = std::max(FONT_HEIGHT_NORMAL, spr_dim.height + 2); - Dimension d = {(uint)(this->text_offset + WD_FRAMETEXT_RIGHT), WD_FRAMERECT_TOP + 5 * resize->height + WD_FRAMERECT_BOTTOM}; + Dimension d = {(uint)(this->text_offset + WidgetDimensions::scaled.frametext.right), padding.height + 5 * resize->height}; *size = maxdim(*size, d); break; } @@ -368,7 +368,7 @@ static const NWidgetPart _nested_sign_list_widgets[] = { EndContainer(), NWidget(NWID_HORIZONTAL), NWidget(NWID_VERTICAL), - NWidget(WWT_PANEL, COLOUR_BROWN, WID_SIL_LIST), SetMinimalSize(WD_FRAMETEXT_LEFT + 16 + 255 + WD_FRAMETEXT_RIGHT, 0), + NWidget(WWT_PANEL, COLOUR_BROWN, WID_SIL_LIST), SetMinimalSize(WidgetDimensions::unscaled.frametext.Horizontal() + 16 + 255, 0), SetResize(1, 1), SetFill(1, 0), SetScrollbar(WID_SIL_SCROLLBAR), EndContainer(), NWidget(NWID_HORIZONTAL), NWidget(WWT_PANEL, COLOUR_BROWN), SetFill(1, 1), diff --git a/src/slope_type.h b/src/slope_type.h index ea2ed1aca5..86faa7bb68 100644 --- a/src/slope_type.h +++ b/src/slope_type.h @@ -81,7 +81,7 @@ DECLARE_ENUM_AS_BIT_SET(Slope) * Helper for creating a bitset of slopes. * @param x The slope to convert into a bitset. */ -#define M(x) (1 << (x)) +#define M(x) (1U << (x)) /** Constant bitset with safe slopes for building a level crossing. */ static const uint32 VALID_LEVEL_CROSSING_SLOPES = M(SLOPE_SEN) | M(SLOPE_ENW) | M(SLOPE_NWS) | M(SLOPE_NS) | M(SLOPE_WSE) | M(SLOPE_EW) | M(SLOPE_FLAT); #undef M diff --git a/src/smallmap_gui.cpp b/src/smallmap_gui.cpp index e0045efb0a..67aec0e430 100644 --- a/src/smallmap_gui.cpp +++ b/src/smallmap_gui.cpp @@ -1188,10 +1188,10 @@ void SmallMapWindow::RebuildColourIndexIfNecessary() } /* Width of the legend blob. */ - this->legend_width = (FONT_HEIGHT_SMALL - ScaleFontTrad(1)) * 8 / 5; + this->legend_width = (FONT_HEIGHT_SMALL - ScaleGUITrad(1)) * 8 / 5; /* The width of a column is the minimum width of all texts + the size of the blob + some spacing */ - this->column_width = min_width + this->legend_width + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; + this->column_width = min_width + this->legend_width + WidgetDimensions::scaled.framerect.Horizontal(); } /* virtual */ void SmallMapWindow::OnPaint() @@ -1214,27 +1214,24 @@ void SmallMapWindow::RebuildColourIndexIfNecessary() { switch (widget) { case WID_SM_MAP: { + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); DrawPixelInfo new_dpi; - if (!FillDrawPixelInfo(&new_dpi, r.left + 1, r.top + 1, r.right - r.left - 1, r.bottom - r.top - 1)) return; + if (!FillDrawPixelInfo(&new_dpi, ir.left, ir.top, ir.Width(), ir.Height())) return; this->DrawSmallMap(&new_dpi); break; } case WID_SM_LEGEND: { - uint columns = this->GetNumberColumnsLegend(r.right - r.left + 1); + uint columns = this->GetNumberColumnsLegend(r.Width()); uint number_of_rows = this->GetNumberRowsLegend(columns); bool rtl = _current_text_dir == TD_RTL; - uint y_org = r.top + WD_FRAMERECT_TOP; - uint x = rtl ? r.right - this->column_width - WD_FRAMERECT_RIGHT : r.left + WD_FRAMERECT_LEFT; - uint y = y_org; uint i = 0; // Row counter for industry legend. uint row_height = FONT_HEIGHT_SMALL; - int padding = ScaleFontTrad(1); + int padding = WidgetDimensions::scaled.hsep_normal; - uint text_left = rtl ? 0 : this->legend_width + WD_FRAMERECT_LEFT; - uint text_right = this->column_width - padding - (rtl ? this->legend_width + WD_FRAMERECT_RIGHT : 0); - uint blob_left = rtl ? this->column_width - padding - this->legend_width : 0; - uint blob_right = rtl ? this->column_width - padding : this->legend_width; + Rect origin = r.WithWidth(this->column_width, rtl).Shrink(WidgetDimensions::scaled.framerect).WithHeight(row_height); + Rect text = origin.Indent(this->legend_width + WidgetDimensions::scaled.hsep_normal, rtl); + Rect icon = origin.WithWidth(this->legend_width, rtl).Shrink(0, padding, 0, 0); StringID string = STR_NULL; switch (this->map_type) { @@ -1255,8 +1252,10 @@ void SmallMapWindow::RebuildColourIndexIfNecessary() if (tbl->col_break || ((this->map_type == SMT_INDUSTRY || this->map_type == SMT_OWNER || this->map_type == SMT_LINKSTATS) && i++ >= number_of_rows)) { /* Column break needed, continue at top, COLUMN_WIDTH pixels * (one "row") to the right. */ - x += rtl ? -(int)this->column_width : this->column_width; - y = y_org; + int x = rtl ? -(int)this->column_width : this->column_width; + int y = origin.top - text.top; + text = text.Translate(x, y); + icon = icon.Translate(x, y); i = 1; } @@ -1283,10 +1282,10 @@ void SmallMapWindow::RebuildColourIndexIfNecessary() if (!tbl->show_on_map) { /* Simply draw the string, not the black border of the legend colour. * This will enforce the idea of the disabled item */ - DrawString(x + text_left, x + text_right, y, string, TC_GREY); + DrawString(text, string, TC_GREY); } else { - DrawString(x + text_left, x + text_right, y, string, TC_BLACK); - GfxFillRect(x + blob_left, y + padding, x + blob_right, y + row_height - 1, PC_BLACK); // Outer border of the legend colour + DrawString(text, string, TC_BLACK); + GfxFillRect(icon, PC_BLACK); // Outer border of the legend colour } break; } @@ -1295,13 +1294,14 @@ void SmallMapWindow::RebuildColourIndexIfNecessary() default: if (this->map_type == SMT_CONTOUR) SetDParam(0, tbl->height * TILE_HEIGHT_STEP); /* Anything that is not an industry or a company is using normal process */ - GfxFillRect(x + blob_left, y + padding, x + blob_right, y + row_height - 1, PC_BLACK); - DrawString(x + text_left, x + text_right, y, tbl->legend); + GfxFillRect(icon, PC_BLACK); + DrawString(text, tbl->legend); break; } - GfxFillRect(x + blob_left + 1, y + padding + 1, x + blob_right - 1, y + row_height - 2, legend_colour); // Legend colour + GfxFillRect(icon.Shrink(WidgetDimensions::scaled.bevel), legend_colour); // Legend colour - y += row_height; + text = text.Translate(0, row_height); + icon = icon.Translate(0, row_height); } } } @@ -1396,7 +1396,7 @@ void SmallMapWindow::SetOverlayCargoMask() int SmallMapWindow::GetPositionOnLegend(Point pt) { const NWidgetBase *wi = this->GetWidget(WID_SM_LEGEND); - uint line = (pt.y - wi->pos_y - WD_FRAMERECT_TOP) / FONT_HEIGHT_SMALL; + uint line = (pt.y - wi->pos_y - WidgetDimensions::scaled.framerect.top) / FONT_HEIGHT_SMALL; uint columns = this->GetNumberColumnsLegend(wi->current_x); uint number_of_rows = this->GetNumberRowsLegend(columns); if (line >= number_of_rows) return -1; @@ -1404,7 +1404,7 @@ int SmallMapWindow::GetPositionOnLegend(Point pt) bool rtl = _current_text_dir == TD_RTL; int x = pt.x - wi->pos_x; if (rtl) x = wi->current_x - x; - uint column = (x - WD_FRAMERECT_LEFT) / this->column_width; + uint column = (x - WidgetDimensions::scaled.framerect.left) / this->column_width; return (column * number_of_rows) + line; } @@ -1683,8 +1683,8 @@ void SmallMapWindow::SmallMapCenterOnCurrentPos() */ Point SmallMapWindow::GetStationMiddle(const Station *st) const { - int x = (st->rect.right + st->rect.left + 1) / 2; - int y = (st->rect.bottom + st->rect.top + 1) / 2; + int x = CenterBounds(st->rect.left, st->rect.right, 0); + int y = CenterBounds(st->rect.top, st->rect.bottom, 0); Point ret = this->RemapTile(x, y); /* Same magic 3 as in DrawVehicles; that's where I got it from. diff --git a/src/smallmap_gui.h b/src/smallmap_gui.h index d585ed7b8d..cb2992bbae 100644 --- a/src/smallmap_gui.h +++ b/src/smallmap_gui.h @@ -123,7 +123,7 @@ protected: */ inline uint GetMinLegendWidth() const { - return WD_FRAMERECT_LEFT + this->min_number_of_columns * this->column_width; + return WidgetDimensions::scaled.framerect.left + this->min_number_of_columns * this->column_width; } /** @@ -142,7 +142,7 @@ protected: */ inline uint GetLegendHeight(uint num_columns) const { - return WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM + + return WidgetDimensions::scaled.framerect.Vertical() + this->GetNumberRowsLegend(num_columns) * FONT_HEIGHT_SMALL; } diff --git a/src/sound.cpp b/src/sound.cpp index 1d0f7e8417..34807a1d3c 100644 --- a/src/sound.cpp +++ b/src/sound.cpp @@ -235,6 +235,7 @@ void SndCopyToPool() /** * Decide 'where' (between left and right speaker) to play the sound effect. + * Note: Callers must determine if sound effects are enabled. This plays a sound regardless of the setting. * @param sound Sound effect to play * @param left Left edge of virtual coordinates where the sound is produced * @param right Right edge of virtual coordinates where the sound is produced @@ -243,8 +244,6 @@ void SndCopyToPool() */ static void SndPlayScreenCoordFx(SoundID sound, int left, int right, int top, int bottom) { - if (_settings_client.music.effect_vol == 0) return; - /* Iterate from back, so that main viewport is checked first */ for (const Window *w : Window::IterateFromBack()) { const Viewport *vp = w->viewport; diff --git a/src/sound/allegro_s.h b/src/sound/allegro_s.h index 6d40c58760..de609f647f 100644 --- a/src/sound/allegro_s.h +++ b/src/sound/allegro_s.h @@ -26,7 +26,7 @@ public: /** Factory for the allegro sound driver. */ class FSoundDriver_Allegro : public DriverFactoryBase { public: - FSoundDriver_Allegro() : DriverFactoryBase(Driver::DT_SOUND, 4, "allegro", "Allegro Sound Driver") {} + FSoundDriver_Allegro() : DriverFactoryBase(Driver::DT_SOUND, 4, "allegro", "Allegro Sound Driver (param hz,samples)") {} /* virtual */ Driver *CreateInstance() const { return new SoundDriver_Allegro(); } }; diff --git a/src/sound/cocoa_s.h b/src/sound/cocoa_s.h index dca5421915..f1e623ce5a 100644 --- a/src/sound/cocoa_s.h +++ b/src/sound/cocoa_s.h @@ -22,7 +22,7 @@ public: class FSoundDriver_Cocoa : public DriverFactoryBase { public: - FSoundDriver_Cocoa() : DriverFactoryBase(Driver::DT_SOUND, 10, "cocoa", "Cocoa Sound Driver") {} + FSoundDriver_Cocoa() : DriverFactoryBase(Driver::DT_SOUND, 10, "cocoa", "Cocoa Sound Driver (param hz)") {} Driver *CreateInstance() const override { return new SoundDriver_Cocoa(); } }; diff --git a/src/sound/sdl_s.h b/src/sound/sdl_s.h index 2b3be4d14c..fbe7d77d84 100644 --- a/src/sound/sdl_s.h +++ b/src/sound/sdl_s.h @@ -24,7 +24,7 @@ public: /** Factory for the SDL sound driver. */ class FSoundDriver_SDL : public DriverFactoryBase { public: - FSoundDriver_SDL() : DriverFactoryBase(Driver::DT_SOUND, 5, "sdl", "SDL Sound Driver") {} + FSoundDriver_SDL() : DriverFactoryBase(Driver::DT_SOUND, 5, "sdl", "SDL Sound Driver (param hz,samples)") {} Driver *CreateInstance() const override { return new SoundDriver_SDL(); } }; diff --git a/src/sound/win32_s.h b/src/sound/win32_s.h index 6f8f9791db..5722b2089d 100644 --- a/src/sound/win32_s.h +++ b/src/sound/win32_s.h @@ -24,7 +24,7 @@ public: /** Factory for the sound driver for Windows. */ class FSoundDriver_Win32 : public DriverFactoryBase { public: - FSoundDriver_Win32() : DriverFactoryBase(Driver::DT_SOUND, 9, "win32", "Win32 WaveOut Sound Driver") {} + FSoundDriver_Win32() : DriverFactoryBase(Driver::DT_SOUND, 9, "win32", "Win32 WaveOut Sound Driver (param bufsize,hz)") {} Driver *CreateInstance() const override { return new SoundDriver_Win32(); } }; diff --git a/src/sound/xaudio2_s.h b/src/sound/xaudio2_s.h index 9fcd26fd0a..621655d8d5 100644 --- a/src/sound/xaudio2_s.h +++ b/src/sound/xaudio2_s.h @@ -24,7 +24,7 @@ public: /** Factory for the XAudio2 sound driver. */ class FSoundDriver_XAudio2 : public DriverFactoryBase { public: - FSoundDriver_XAudio2() : DriverFactoryBase(Driver::DT_SOUND, 10, "xaudio2", "XAudio2 Sound Driver") {} + FSoundDriver_XAudio2() : DriverFactoryBase(Driver::DT_SOUND, 10, "xaudio2", "XAudio2 Sound Driver (param bufsize,hz)") {} Driver *CreateInstance() const override { return new SoundDriver_XAudio2(); } }; diff --git a/src/sprite.cpp b/src/sprite.cpp index a6ff4c9224..7f2bfb1bb9 100644 --- a/src/sprite.cpp +++ b/src/sprite.cpp @@ -125,7 +125,7 @@ void DrawCommonTileSeqInGUI(int x, int y, const DrawTileSprites *dts, int32 orig } else { int offs_x = child_offset_is_unsigned ? (uint8)dtss->delta_x : dtss->delta_x; int offs_y = child_offset_is_unsigned ? (uint8)dtss->delta_y : dtss->delta_y; - DrawSprite(image, pal, x + child_offset.x + ScaleGUITrad(offs_x), y + child_offset.y + ScaleGUITrad(offs_y)); + DrawSprite(image, pal, x + child_offset.x + ScaleSpriteTrad(offs_x), y + child_offset.y + ScaleSpriteTrad(offs_y)); } } } diff --git a/src/spritecache.cpp b/src/spritecache.cpp index e3dd33dfc9..a62d2e29ad 100644 --- a/src/spritecache.cpp +++ b/src/spritecache.cpp @@ -517,14 +517,14 @@ static void *ReadSprite(const SpriteCache *sc, SpriteID id, SpriteType sprite_ty return (void*)GetRawSprite(SPR_IMG_QUERY, ST_NORMAL, allocator, encoder); } - if (sprite->type == ST_FONT && ZOOM_LVL_FONT != ZOOM_LVL_NORMAL) { - /* Make ZOOM_LVL_NORMAL be ZOOM_LVL_FONT */ - sprite[ZOOM_LVL_NORMAL].width = sprite[ZOOM_LVL_FONT].width; - sprite[ZOOM_LVL_NORMAL].height = sprite[ZOOM_LVL_FONT].height; - sprite[ZOOM_LVL_NORMAL].x_offs = sprite[ZOOM_LVL_FONT].x_offs; - sprite[ZOOM_LVL_NORMAL].y_offs = sprite[ZOOM_LVL_FONT].y_offs; - sprite[ZOOM_LVL_NORMAL].data = sprite[ZOOM_LVL_FONT].data; - sprite[ZOOM_LVL_NORMAL].colours = sprite[ZOOM_LVL_FONT].colours; + if (sprite->type == ST_FONT && ZOOM_LVL_GUI != ZOOM_LVL_NORMAL) { + /* Make ZOOM_LVL_NORMAL be ZOOM_LVL_GUI */ + sprite[ZOOM_LVL_NORMAL].width = sprite[ZOOM_LVL_GUI].width; + sprite[ZOOM_LVL_NORMAL].height = sprite[ZOOM_LVL_GUI].height; + sprite[ZOOM_LVL_NORMAL].x_offs = sprite[ZOOM_LVL_GUI].x_offs; + sprite[ZOOM_LVL_NORMAL].y_offs = sprite[ZOOM_LVL_GUI].y_offs; + sprite[ZOOM_LVL_NORMAL].data = sprite[ZOOM_LVL_GUI].data; + sprite[ZOOM_LVL_NORMAL].colours = sprite[ZOOM_LVL_GUI].colours; } return encoder->Encode(sprite, allocator); diff --git a/src/station.cpp b/src/station.cpp index fc258fcc92..9c96b9b002 100644 --- a/src/station.cpp +++ b/src/station.cpp @@ -51,8 +51,6 @@ void RebuildStationKdtree() BaseStation::~BaseStation() { - free(this->speclist); - if (CleaningPool()) return; CloseWindowById(WC_TRAINS_LIST, VehicleListIdentifier(VL_STATION_LIST, VEH_TRAIN, this->owner, this->index).Pack()); @@ -227,7 +225,7 @@ void Station::MarkTilesDirty(bool cargo_change) const /* Don't waste time updating if there are no custom station graphics * that might change. Even if there are custom graphics, they might * not change. Unfortunately we have no way of telling. */ - if (this->num_specs == 0) return; + if (this->speclist.size() == 0) return; } for (h = 0; h < train_station.h; h++) { @@ -551,8 +549,8 @@ CommandCost StationRect::BeforeAddTile(TileIndex tile, StationRectMode mode) Rect new_rect = {std::min(x, this->left), std::min(y, this->top), std::max(x, this->right), std::max(y, this->bottom)}; /* check new rect dimensions against preset max */ - int w = new_rect.right - new_rect.left + 1; - int h = new_rect.bottom - new_rect.top + 1; + int w = new_rect.Width(); + int h = new_rect.Height(); if (mode != ADD_FORCE && (w > _settings_game.station.station_spread || h > _settings_game.station.station_spread)) { assert(mode != ADD_TRY); return_cmd_error(STR_ERROR_STATION_TOO_SPREAD_OUT); diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 56486be4df..01bcc68ed8 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -1910,18 +1910,15 @@ CommandCost CmdBuildRoadStop(DoCommandFlag flags, TileIndex tile, uint8 width, u if (road_rt == INVALID_ROADTYPE && RoadTypeIsRoad(rt)) road_rt = rt; if (tram_rt == INVALID_ROADTYPE && RoadTypeIsTram(rt)) tram_rt = rt; - UpdateCompanyRoadInfrastructure(road_rt, road_owner, ROAD_STOP_TRACKBIT_FACTOR); - UpdateCompanyRoadInfrastructure(tram_rt, tram_owner, ROAD_STOP_TRACKBIT_FACTOR); - MakeDriveThroughRoadStop(cur_tile, st->owner, road_owner, tram_owner, st->index, rs_type, road_rt, tram_rt, axis); road_stop->MakeDriveThrough(); } else { if (road_rt == INVALID_ROADTYPE && RoadTypeIsRoad(rt)) road_rt = rt; if (tram_rt == INVALID_ROADTYPE && RoadTypeIsTram(rt)) tram_rt = rt; - /* Non-drive-through stop never overbuild and always count as two road bits. */ - Company::Get(st->owner)->infrastructure.road[rt] += ROAD_STOP_TRACKBIT_FACTOR; MakeRoadStop(cur_tile, st->owner, st->index, rs_type, road_rt, tram_rt, ddir); } + UpdateCompanyRoadInfrastructure(road_rt, road_owner, ROAD_STOP_TRACKBIT_FACTOR); + UpdateCompanyRoadInfrastructure(tram_rt, tram_owner, ROAD_STOP_TRACKBIT_FACTOR); Company::Get(st->owner)->infrastructure.station++; MarkTileDirtyByTile(cur_tile); @@ -2503,7 +2500,7 @@ CommandCost CmdBuildDock(DoCommandFlag flags, TileIndex tile, StationID station_ TileIndex tile_cur = tile + TileOffsByDiagDir(direction); - if (!IsTileType(tile_cur, MP_WATER) || !IsTileFlat(tile_cur)) { + if (!HasTileWaterGround(tile_cur) || !IsTileFlat(tile_cur)) { return_cmd_error(STR_ERROR_SITE_UNSUITABLE); } @@ -2512,8 +2509,10 @@ CommandCost CmdBuildDock(DoCommandFlag flags, TileIndex tile, StationID station_ /* Get the water class of the water tile before it is cleared.*/ WaterClass wc = GetWaterClass(tile_cur); + bool add_cost = !IsWaterTile(tile_cur); ret = Command::Do(flags, tile_cur); if (ret.Failed()) return ret; + if (add_cost) cost.AddCost(ret); tile_cur += TileOffsByDiagDir(direction); if (!IsTileType(tile_cur, MP_WATER) || !IsTileFlat(tile_cur)) { @@ -2922,7 +2921,7 @@ static void DrawTile_Station(TileInfo *ti) EndSpriteCombine(); } - OffsetGroundSprite(31, 1); + OffsetGroundSprite(0, -8); ti->z += ApplyPixelFoundationToSlope(FOUNDATION_LEVELED, &ti->tileh); } else { draw_default_foundation: diff --git a/src/station_gui.cpp b/src/station_gui.cpp index 965b7e04f2..82575909c5 100644 --- a/src/station_gui.cpp +++ b/src/station_gui.cpp @@ -163,7 +163,7 @@ static void StationsWndShowStationRating(int left, int right, int y, CargoID typ const CargoSpec *cs = CargoSpec::Get(type); if (!cs->IsValid()) return; - int padding = ScaleFontTrad(1); + int padding = ScaleGUITrad(1); int width = right - left; int colour = cs->rating_colour; TextColour tc = GetContrastColour(colour); @@ -177,7 +177,7 @@ static void StationsWndShowStationRating(int left, int right, int y, CargoID typ } else { /* Draw a (scaled) one pixel-wide bar of additional cargo meter, useful * for stations with only a small amount (<=30) */ - uint rest = ScaleFontTrad(amount) / 5; + uint rest = ScaleGUITrad(amount) / 5; if (rest != 0) { GfxFillRect(left, y + height - rest, left + padding - 1, y + height, colour); } @@ -391,8 +391,8 @@ public: } case WID_STL_LIST: - resize->height = std::max(FONT_HEIGHT_NORMAL, FONT_HEIGHT_SMALL + ScaleFontTrad(3)); - size->height = WD_FRAMERECT_TOP + 5 * resize->height + WD_FRAMERECT_BOTTOM; + resize->height = std::max(FONT_HEIGHT_NORMAL, FONT_HEIGHT_SMALL + ScaleGUITrad(3)); + size->height = padding.height + 5 * resize->height; /* Determine appropriate width for mini station rating graph */ this->rating_width = 0; @@ -433,12 +433,12 @@ public: case WID_STL_LIST: { bool rtl = _current_text_dir == TD_RTL; int max = std::min(this->vscroll->GetPosition() + this->vscroll->GetCapacity(), this->stations.size()); - int y = r.top + WD_FRAMERECT_TOP; + Rect tr = r.Shrink(WidgetDimensions::scaled.framerect); uint line_height = this->GetWidget(widget)->resize_y; /* Spacing between station name and first rating graph. */ - int text_spacing = ScaleFontTrad(5); + int text_spacing = WidgetDimensions::scaled.hsep_wide; /* Spacing between additional rating graphs. */ - int rating_spacing = ScaleFontTrad(4); + int rating_spacing = WidgetDimensions::scaled.hsep_normal; for (int i = this->vscroll->GetPosition(); i < max; ++i) { // do until max number of stations of owner const Station *st = this->stations[i]; @@ -450,7 +450,7 @@ public: SetDParam(0, st->index); SetDParam(1, st->facilities); - int x = DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y + (line_height - FONT_HEIGHT_NORMAL) / 2, STR_STATION_LIST_STATION); + int x = DrawString(tr.left, tr.right, tr.top + (line_height - FONT_HEIGHT_NORMAL) / 2, STR_STATION_LIST_STATION); x += rtl ? -text_spacing : text_spacing; /* show cargo waiting and station ratings */ @@ -463,20 +463,20 @@ public: * the space. */ if (rtl) { x -= rating_width + rating_spacing; - if (x < r.left + WD_FRAMERECT_LEFT) break; + if (x < tr.left) break; } - StationsWndShowStationRating(x, x + rating_width, y, cid, st->goods[cid].cargo.TotalCount(), st->goods[cid].rating); + StationsWndShowStationRating(x, x + rating_width, tr.top, cid, st->goods[cid].cargo.TotalCount(), st->goods[cid].rating); if (!rtl) { x += rating_width + rating_spacing; - if (x > r.right - WD_FRAMERECT_RIGHT) break; + if (x > tr.right) break; } } } - y += line_height; + tr.top += line_height; } if (this->vscroll->GetCount() == 0) { // company has no stations - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_STATION_LIST_NONE); + DrawString(tr.left, tr.right, tr.top + (line_height - FONT_HEIGHT_NORMAL) / 2, STR_STATION_LIST_NONE); return; } break; @@ -484,11 +484,13 @@ public: default: if (widget >= WID_STL_CARGOSTART) { + Rect br = r.Shrink(WidgetDimensions::scaled.bevel); const CargoSpec *cs = _sorted_cargo_specs[widget - WID_STL_CARGOSTART]; - int cg_ofst = HasBit(this->cargo_filter, cs->Index()) ? 1 : 0; - GfxFillRect(r.left + cg_ofst + 1, r.top + cg_ofst + 1, r.right - 1 + cg_ofst, r.bottom - 1 + cg_ofst, cs->rating_colour); + int cg_ofst = HasBit(this->cargo_filter, cs->Index()) ? WidgetDimensions::scaled.pressed : 0; + br = br.Translate(cg_ofst, cg_ofst); + GfxFillRect(br, cs->rating_colour); TextColour tc = GetContrastColour(cs->rating_colour); - DrawString(r.left + cg_ofst, r.right + cg_ofst, r.top + (r.bottom - r.top - FONT_HEIGHT_SMALL) / 2 + cg_ofst, cs->abbrev, tc, SA_HOR_CENTER); + DrawString(br.left, br.right, CenterBounds(br.top, br.bottom, FONT_HEIGHT_SMALL), cs->abbrev, tc, SA_HOR_CENTER); } break; } @@ -639,7 +641,7 @@ public: void OnResize() override { - this->vscroll->SetCapacityFromWidget(this, WID_STL_LIST, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM); + this->vscroll->SetCapacityFromWidget(this, WID_STL_LIST, WidgetDimensions::scaled.framerect.Vertical()); } /** @@ -809,7 +811,7 @@ static const NWidgetPart _nested_station_view_widgets[] = { */ static void DrawCargoIcons(CargoID i, uint waiting, int left, int right, int y) { - int width = ScaleGUITrad(10); + int width = ScaleSpriteTrad(10); uint num = std::min((waiting + (width / 2)) / width, (right - left) / width); // maximum is width / 10 icons so it won't overflow if (num == 0) return; @@ -1366,12 +1368,12 @@ struct StationViewWindow : public Window { switch (widget) { case WID_SV_WAITING: resize->height = FONT_HEIGHT_NORMAL; - size->height = WD_FRAMERECT_TOP + 4 * resize->height + WD_FRAMERECT_BOTTOM; - this->expand_shrink_width = std::max(GetStringBoundingBox("-").width, GetStringBoundingBox("+").width) + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; + size->height = 4 * resize->height + padding.height; + this->expand_shrink_width = std::max(GetStringBoundingBox("-").width, GetStringBoundingBox("+").width); break; case WID_SV_ACCEPT_RATING_LIST: - size->height = WD_FRAMERECT_TOP + ((this->GetWidget(WID_SV_ACCEPTS_RATINGS)->widget_data == STR_STATION_VIEW_RATINGS_BUTTON) ? this->accepts_lines : this->rating_lines) * FONT_HEIGHT_NORMAL + WD_FRAMERECT_BOTTOM; + size->height = ((this->GetWidget(WID_SV_ACCEPTS_RATINGS)->widget_data == STR_STATION_VIEW_RATINGS_BUTTON) ? this->accepts_lines : this->rating_lines) * FONT_HEIGHT_NORMAL + padding.height; break; case WID_SV_CLOSE_AIRPORT: @@ -1439,7 +1441,7 @@ struct StationViewWindow : public Window { /* Draw waiting cargo. */ NWidgetBase *nwi = this->GetWidget(WID_SV_WAITING); - Rect waiting_rect = nwi->GetCurrentRect(); + Rect waiting_rect = nwi->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect); this->DrawEntries(&cargo, waiting_rect, pos, maxrows, 0); scroll_to_row = INT_MAX; } @@ -1711,7 +1713,7 @@ struct StationViewWindow : public Window { * @param cargo Current cargo being drawn (if cargo column has been passed). * @return row (in "pos" counting) after the one we have last drawn to. */ - int DrawEntries(CargoDataEntry *entry, Rect &r, int pos, int maxrows, int column, CargoID cargo = CT_INVALID) + int DrawEntries(CargoDataEntry *entry, const Rect &r, int pos, int maxrows, int column, CargoID cargo = CT_INVALID) { if (this->sortings[column] == ST_AS_GROUPING) { if (this->groupings[column] != GR_CARGO) { @@ -1729,13 +1731,13 @@ struct StationViewWindow : public Window { if (pos > -maxrows && pos <= 0) { StringID str = STR_EMPTY; - int y = r.top + WD_FRAMERECT_TOP - pos * FONT_HEIGHT_NORMAL; + int y = r.top - pos * FONT_HEIGHT_NORMAL; SetDParam(0, cargo); SetDParam(1, cd->GetCount()); if (this->groupings[column] == GR_CARGO) { str = STR_STATION_VIEW_WAITING_CARGO; - DrawCargoIcons(cd->GetCargo(), cd->GetCount(), r.left + WD_FRAMERECT_LEFT + this->expand_shrink_width, r.right - WD_FRAMERECT_RIGHT - this->expand_shrink_width, y); + DrawCargoIcons(cd->GetCargo(), cd->GetCount(), r.left + this->expand_shrink_width, r.right - this->expand_shrink_width, y); } else { if (!auto_distributed) grouping = GR_SOURCE; StationID station = cd->GetStation(); @@ -1760,12 +1762,10 @@ struct StationViewWindow : public Window { } bool rtl = _current_text_dir == TD_RTL; - int text_left = rtl ? r.left + this->expand_shrink_width : r.left + WD_FRAMERECT_LEFT + column * this->expand_shrink_width; - int text_right = rtl ? r.right - WD_FRAMERECT_LEFT - column * this->expand_shrink_width : r.right - this->expand_shrink_width; - int shrink_left = rtl ? r.left + WD_FRAMERECT_LEFT : r.right - this->expand_shrink_width + WD_FRAMERECT_LEFT; - int shrink_right = rtl ? r.left + this->expand_shrink_width - WD_FRAMERECT_RIGHT : r.right - WD_FRAMERECT_RIGHT; + Rect text = r.Indent(column * WidgetDimensions::scaled.hsep_indent, rtl).Indent(this->expand_shrink_width, !rtl); + Rect shrink = r.WithWidth(this->expand_shrink_width, !rtl); - DrawString(text_left, text_right, y, str); + DrawString(text.left, text.right, y, str); if (column < NUM_COLUMNS - 1) { const char *sym = nullptr; @@ -1780,7 +1780,7 @@ struct StationViewWindow : public Window { sym = "+"; } } - if (sym) DrawString(shrink_left, shrink_right, y, sym, TC_YELLOW); + if (sym != nullptr) DrawString(shrink.left, shrink.right, y, sym, TC_YELLOW); } this->SetDisplayedRow(cd); } @@ -1800,14 +1800,15 @@ struct StationViewWindow : public Window { int DrawAcceptedCargo(const Rect &r) const { const Station *st = Station::Get(this->window_number); + Rect tr = r.Shrink(WidgetDimensions::scaled.framerect); CargoTypes cargo_mask = 0; for (CargoID i = 0; i < NUM_CARGO; i++) { if (HasBit(st->goods[i].status, GoodsEntry::GES_ACCEPTANCE)) SetBit(cargo_mask, i); } SetDParam(0, cargo_mask); - int bottom = DrawStringMultiLine(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, INT32_MAX, STR_STATION_VIEW_ACCEPTS_CARGO); - return CeilDiv(bottom - r.top - WD_FRAMERECT_TOP, FONT_HEIGHT_NORMAL); + int bottom = DrawStringMultiLine(tr.left, tr.right, tr.top, INT32_MAX, STR_STATION_VIEW_ACCEPTS_CARGO); + return CeilDiv(bottom - r.top - WidgetDimensions::scaled.framerect.top, FONT_HEIGHT_NORMAL); } /** @@ -1818,16 +1819,17 @@ struct StationViewWindow : public Window { int DrawCargoRatings(const Rect &r) const { const Station *st = Station::Get(this->window_number); - int y = r.top + WD_FRAMERECT_TOP; + bool rtl = _current_text_dir == TD_RTL; + Rect tr = r.Shrink(WidgetDimensions::scaled.framerect); if (st->town->exclusive_counter > 0) { SetDParam(0, st->town->exclusivity); - y = DrawStringMultiLine(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, r.bottom, st->town->exclusivity == st->owner ? STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF : STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY); - y += WD_PAR_VSEP_WIDE; + tr.top = DrawStringMultiLine(tr, st->town->exclusivity == st->owner ? STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF : STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY); + tr.top += WidgetDimensions::scaled.vsep_wide; } - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_STATION_VIEW_SUPPLY_RATINGS_TITLE); - y += FONT_HEIGHT_NORMAL; + DrawString(tr, STR_STATION_VIEW_SUPPLY_RATINGS_TITLE); + tr.top += FONT_HEIGHT_NORMAL; for (const CargoSpec *cs : _sorted_standard_cargo_specs) { const GoodsEntry *ge = &st->goods[cs->Index()]; @@ -1838,10 +1840,10 @@ struct StationViewWindow : public Window { SetDParam(1, lg != nullptr ? lg->Monthly((*lg)[ge->node].Supply()) : 0); SetDParam(2, STR_CARGO_RATING_APPALLING + (ge->rating >> 5)); SetDParam(3, ToPercent8(ge->rating)); - DrawString(r.left + WD_FRAMERECT_LEFT + 6, r.right - WD_FRAMERECT_RIGHT - 6, y, STR_STATION_VIEW_CARGO_SUPPLY_RATING); - y += FONT_HEIGHT_NORMAL; + DrawString(tr.Indent(WidgetDimensions::scaled.hsep_indent, rtl), STR_STATION_VIEW_CARGO_SUPPLY_RATING); + tr.top += FONT_HEIGHT_NORMAL; } - return CeilDiv(y - r.top - WD_FRAMERECT_TOP, FONT_HEIGHT_NORMAL); + return CeilDiv(tr.top - r.top - WidgetDimensions::scaled.framerect.top, FONT_HEIGHT_NORMAL); } /** @@ -1883,7 +1885,7 @@ struct StationViewWindow : public Window { { switch (widget) { case WID_SV_WAITING: - this->HandleCargoWaitingClick(this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_SV_WAITING, WD_FRAMERECT_TOP) - this->vscroll->GetPosition()); + this->HandleCargoWaitingClick(this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_SV_WAITING, WidgetDimensions::scaled.framerect.top) - this->vscroll->GetPosition()); break; case WID_SV_CATCHMENT: @@ -2062,7 +2064,7 @@ struct StationViewWindow : public Window { void OnResize() override { - this->vscroll->SetCapacityFromWidget(this, WID_SV_WAITING, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM); + this->vscroll->SetCapacityFromWidget(this, WID_SV_WAITING, WidgetDimensions::scaled.framerect.Vertical()); } /** @@ -2278,8 +2280,8 @@ struct SelectStationWindow : Window { resize->height = d.height; d.height *= 5; - d.width += WD_FRAMERECT_RIGHT + WD_FRAMERECT_LEFT; - d.height += WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; + d.width += padding.width; + d.height += padding.height; *size = d; } @@ -2287,20 +2289,20 @@ struct SelectStationWindow : Window { { if (widget != WID_JS_PANEL) return; - uint y = r.top + WD_FRAMERECT_TOP; + Rect tr = r.Shrink(WidgetDimensions::scaled.framerect); if (this->vscroll->GetPosition() == 0) { - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, T::EXPECTED_FACIL == FACIL_WAYPOINT ? STR_JOIN_WAYPOINT_CREATE_SPLITTED_WAYPOINT : STR_JOIN_STATION_CREATE_SPLITTED_STATION); - y += this->resize.step_height; + DrawString(tr, T::EXPECTED_FACIL == FACIL_WAYPOINT ? STR_JOIN_WAYPOINT_CREATE_SPLITTED_WAYPOINT : STR_JOIN_STATION_CREATE_SPLITTED_STATION); + tr.top += this->resize.step_height; } - for (uint i = std::max(1, this->vscroll->GetPosition()); i <= _stations_nearby_list.size(); ++i, y += this->resize.step_height) { + for (uint i = std::max(1, this->vscroll->GetPosition()); i <= _stations_nearby_list.size(); ++i, tr.top += this->resize.step_height) { /* Don't draw anything if it extends past the end of the window. */ if (i - this->vscroll->GetPosition() >= this->vscroll->GetCapacity()) break; const T *st = T::Get(_stations_nearby_list[i - 1]); SetDParam(0, st->index); SetDParam(1, st->facilities); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, T::EXPECTED_FACIL == FACIL_WAYPOINT ? STR_STATION_LIST_WAYPOINT : STR_STATION_LIST_STATION); + DrawString(tr, T::EXPECTED_FACIL == FACIL_WAYPOINT ? STR_STATION_LIST_WAYPOINT : STR_STATION_LIST_STATION); } } @@ -2308,7 +2310,7 @@ struct SelectStationWindow : Window { { if (widget != WID_JS_PANEL) return; - uint st_index = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_JS_PANEL, WD_FRAMERECT_TOP); + uint st_index = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_JS_PANEL, WidgetDimensions::scaled.framerect.top); bool distant_join = (st_index > 0); if (distant_join) st_index--; @@ -2331,7 +2333,7 @@ struct SelectStationWindow : Window { void OnResize() override { - this->vscroll->SetCapacityFromWidget(this, WID_JS_PANEL, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM); + this->vscroll->SetCapacityFromWidget(this, WID_JS_PANEL, WidgetDimensions::scaled.framerect.Vertical()); } /** @@ -2355,7 +2357,7 @@ struct SelectStationWindow : Window { } /* Show coverage area of station under cursor */ - uint st_index = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_JS_PANEL, WD_FRAMERECT_TOP); + uint st_index = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_JS_PANEL, WidgetDimensions::scaled.framerect.top); if (st_index == 0 || st_index > _stations_nearby_list.size()) { SetViewportCatchmentStation(nullptr, true); } else { diff --git a/src/statusbar_gui.cpp b/src/statusbar_gui.cpp index 9031ccf303..5f53e731bc 100644 --- a/src/statusbar_gui.cpp +++ b/src/statusbar_gui.cpp @@ -137,24 +137,24 @@ struct StatusBarWindow : Window { void DrawWidget(const Rect &r, int widget) const override { - int text_offset = std::max(0, ((int)(r.bottom - r.top + 1) - FONT_HEIGHT_NORMAL) / 2); // Offset for rendering the text vertically centered - int text_top = r.top + text_offset; + Rect tr = r.Shrink(WidgetDimensions::scaled.framerect, RectPadding::zero); + tr.top = CenterBounds(r.top, r.bottom, FONT_HEIGHT_NORMAL); switch (widget) { case WID_S_LEFT: /* Draw the date */ SetDParam(0, _date); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, text_top, STR_WHITE_DATE_LONG, TC_FROMSTRING, SA_HOR_CENTER); + DrawString(tr, STR_WHITE_DATE_LONG, TC_FROMSTRING, SA_HOR_CENTER); break; case WID_S_RIGHT: { if (_local_company == COMPANY_SPECTATOR) { - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, text_top, STR_STATUSBAR_SPECTATOR, TC_FROMSTRING, SA_HOR_CENTER); + DrawString(tr, STR_STATUSBAR_SPECTATOR, TC_FROMSTRING, SA_HOR_CENTER); } else { /* Draw company money, if any */ const Company *c = Company::GetIfValid(_local_company); if (c != nullptr) { SetDParam(0, c->money); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, text_top, STR_COMPANY_MONEY, TC_FROMSTRING, SA_HOR_CENTER); + DrawString(tr, STR_COMPANY_MONEY, TC_FROMSTRING, SA_HOR_CENTER); } } break; @@ -163,33 +163,33 @@ struct StatusBarWindow : Window { case WID_S_MIDDLE: /* Draw status bar */ if (this->saving) { // true when saving is active - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, text_top, STR_STATUSBAR_SAVING_GAME, TC_FROMSTRING, SA_HOR_CENTER | SA_VERT_CENTER); + DrawString(tr, STR_STATUSBAR_SAVING_GAME, TC_FROMSTRING, SA_HOR_CENTER | SA_VERT_CENTER); } else if (_do_autosave) { - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, text_top, STR_STATUSBAR_AUTOSAVE, TC_FROMSTRING, SA_HOR_CENTER); + DrawString(tr, STR_STATUSBAR_AUTOSAVE, TC_FROMSTRING, SA_HOR_CENTER); } else if (_pause_mode != PM_UNPAUSED) { StringID msg = (_pause_mode & PM_PAUSED_LINK_GRAPH) ? STR_STATUSBAR_PAUSED_LINK_GRAPH : STR_STATUSBAR_PAUSED; - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, text_top, msg, TC_FROMSTRING, SA_HOR_CENTER); + DrawString(tr, msg, TC_FROMSTRING, SA_HOR_CENTER); } else if (this->ticker_scroll < TICKER_STOP && _statusbar_news_item != nullptr && _statusbar_news_item->string_id != 0) { /* Draw the scrolling news text */ - if (!DrawScrollingStatusText(_statusbar_news_item, ScaleGUITrad(this->ticker_scroll), r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, r.bottom)) { + if (!DrawScrollingStatusText(_statusbar_news_item, ScaleGUITrad(this->ticker_scroll), tr.left, tr.right, tr.top, tr.bottom)) { InvalidateWindowData(WC_STATUS_BAR, 0, SBI_NEWS_DELETED); if (Company::IsValidID(_local_company)) { /* This is the default text */ SetDParam(0, _local_company); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, text_top, STR_STATUSBAR_COMPANY_NAME, TC_FROMSTRING, SA_HOR_CENTER); + DrawString(tr, STR_STATUSBAR_COMPANY_NAME, TC_FROMSTRING, SA_HOR_CENTER); } } } else { if (Company::IsValidID(_local_company)) { /* This is the default text */ SetDParam(0, _local_company); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, text_top, STR_STATUSBAR_COMPANY_NAME, TC_FROMSTRING, SA_HOR_CENTER); + DrawString(tr, STR_STATUSBAR_COMPANY_NAME, TC_FROMSTRING, SA_HOR_CENTER); } } if (!this->reminder_timeout.HasElapsed()) { Dimension icon_size = GetSpriteSize(SPR_UNREAD_NEWS); - DrawSprite(SPR_UNREAD_NEWS, PAL_NONE, r.right - WD_FRAMERECT_RIGHT - icon_size.width, r.top + std::max(0, ((int)(r.bottom - r.top + 1) - (int)icon_size.height) / 2)); + DrawSprite(SPR_UNREAD_NEWS, PAL_NONE, tr.right - icon_size.width, CenterBounds(r.top, r.bottom, icon_size.height)); } break; } diff --git a/src/story_gui.cpp b/src/story_gui.cpp index 255b084bec..bc62aff730 100644 --- a/src/story_gui.cpp +++ b/src/story_gui.cpp @@ -278,7 +278,7 @@ protected: */ uint GetAvailablePageContentWidth() const { - return this->GetWidget(WID_SB_PAGE_PANEL)->current_x - WD_FRAMETEXT_LEFT - WD_FRAMETEXT_RIGHT - 1; + return this->GetWidget(WID_SB_PAGE_PANEL)->current_x - WidgetDimensions::scaled.frametext.Horizontal() - 1; } /** @@ -346,7 +346,7 @@ protected: case SPET_BUTTON_TILE: case SPET_BUTTON_VEHICLE: { Dimension dim = GetStringBoundingBox(pe.text, FS_NORMAL); - return dim.height + WD_BEVEL_TOP + WD_BEVEL_BOTTOM + WD_FRAMETEXT_TOP + WD_FRAMETEXT_BOTTOM; + return dim.height + WidgetDimensions::scaled.framerect.Vertical() + WidgetDimensions::scaled.frametext.Vertical(); } default: @@ -389,7 +389,7 @@ protected: case SPET_BUTTON_TILE: case SPET_BUTTON_VEHICLE: { Dimension dim = GetStringBoundingBox(pe.text, FS_NORMAL); - return dim.width + WD_BEVEL_LEFT + WD_BEVEL_RIGHT + WD_FRAMETEXT_LEFT + WD_FRAMETEXT_RIGHT; + return dim.width + WidgetDimensions::scaled.framerect.Vertical() + WidgetDimensions::scaled.frametext.Vertical(); } default: @@ -533,7 +533,7 @@ protected: uint text_top = y_offset + (element_height - line_height) / 2; DrawSprite(action_sprite, PAL_NONE, 0, sprite_top); - DrawString(sprite_dim.width + WD_FRAMETEXT_LEFT, width, text_top, string_id, TC_BLACK); + DrawString(sprite_dim.width + WidgetDimensions::scaled.frametext.left, width, text_top, string_id, TC_BLACK); y_offset += element_height; } @@ -692,19 +692,17 @@ public: StoryPage *page = this->GetSelPage(); if (page == nullptr) return; - const int x = r.left + WD_FRAMETEXT_LEFT; - const int y = r.top + WD_FRAMETEXT_TOP; - const int right = r.right - WD_FRAMETEXT_RIGHT; - const int bottom = r.bottom - WD_FRAMETEXT_BOTTOM; + Rect fr = r.Shrink(WidgetDimensions::scaled.frametext); /* Set up a clipping region for the panel. */ DrawPixelInfo tmp_dpi; - if (!FillDrawPixelInfo(&tmp_dpi, x, y, right - x + 1, bottom - y + 1)) return; + if (!FillDrawPixelInfo(&tmp_dpi, fr.left, fr.top, fr.Width(), fr.Height())) return; DrawPixelInfo *old_dpi = _cur_dpi; _cur_dpi = &tmp_dpi; /* Draw content (now coordinates given to Draw** are local to the new clipping region). */ + fr = fr.Translate(-fr.left, -fr.top); int line_height = FONT_HEIGHT_NORMAL; const int scrollpos = this->vscroll->GetPosition(); int y_offset = -scrollpos; @@ -712,13 +710,13 @@ public: /* Date */ if (page->date != INVALID_DATE) { SetDParam(0, page->date); - DrawString(0, right - x, y_offset, STR_JUST_DATE_LONG, TC_BLACK); + DrawString(0, fr.right, y_offset, STR_JUST_DATE_LONG, TC_BLACK); } y_offset += line_height; /* Title */ SetDParamStr(0, page->title != nullptr ? page->title : this->selected_generic_title); - y_offset = DrawStringMultiLine(0, right - x, y_offset, bottom - y, STR_STORY_BOOK_TITLE, TC_BLACK, SA_TOP | SA_HOR_CENTER); + y_offset = DrawStringMultiLine(0, fr.right, y_offset, fr.bottom, STR_STORY_BOOK_TITLE, TC_BLACK, SA_TOP | SA_HOR_CENTER); /* Page elements */ this->EnsureStoryPageElementLayout(); @@ -746,14 +744,14 @@ public: case SPET_BUTTON_PUSH: case SPET_BUTTON_TILE: case SPET_BUTTON_VEHICLE: { - const int tmargin = WD_BEVEL_TOP + WD_FRAMETEXT_TOP; + const int tmargin = WidgetDimensions::scaled.bevel.top + WidgetDimensions::scaled.frametext.top; const FrameFlags frame = this->active_button_id == ce.pe->index ? FR_LOWERED : FR_NONE; const Colours bgcolour = StoryPageButtonData{ ce.pe->referenced_id }.GetColour(); DrawFrameRect(ce.bounds.left, ce.bounds.top - scrollpos, ce.bounds.right, ce.bounds.bottom - scrollpos - 1, bgcolour, frame); SetDParamStr(0, ce.pe->text); - DrawString(ce.bounds.left + WD_BEVEL_LEFT, ce.bounds.right - WD_BEVEL_RIGHT, ce.bounds.top + tmargin - scrollpos, STR_JUST_RAW_STRING, TC_WHITE, SA_CENTER); + DrawString(ce.bounds.left + WidgetDimensions::scaled.bevel.left, ce.bounds.right - WidgetDimensions::scaled.bevel.right, ce.bounds.top + tmargin - scrollpos, STR_JUST_RAW_STRING, TC_WHITE, SA_CENTER); break; } @@ -800,7 +798,7 @@ public: case WID_SB_PAGE_PANEL: { d.height *= 5; - d.height += padding.height + WD_FRAMETEXT_TOP + WD_FRAMETEXT_BOTTOM; + d.height += padding.height + WidgetDimensions::scaled.frametext.Vertical(); *size = maxdim(*size, d); break; } @@ -811,7 +809,7 @@ public: void OnResize() override { this->InvalidateStoryPageElementLayout(); - this->vscroll->SetCapacityFromWidget(this, WID_SB_PAGE_PANEL, WD_FRAMETEXT_TOP + WD_FRAMETEXT_BOTTOM); + this->vscroll->SetCapacityFromWidget(this, WID_SB_PAGE_PANEL, WidgetDimensions::scaled.frametext.Vertical()); this->vscroll->SetCount(this->GetContentHeight()); } @@ -843,7 +841,7 @@ public: break; case WID_SB_PAGE_PANEL: { - int clicked_y = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_SB_PAGE_PANEL, WD_FRAMETEXT_TOP); + int clicked_y = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_SB_PAGE_PANEL, WidgetDimensions::scaled.frametext.top); this->EnsureStoryPageElementLayout(); for (const LayoutCacheElement &ce : this->layout_cache) { diff --git a/src/string.cpp b/src/string.cpp index aeac4fe84f..2e14b4208e 100644 --- a/src/string.cpp +++ b/src/string.cpp @@ -494,11 +494,12 @@ bool strtolower(std::string &str, std::string::size_type offs) bool IsValidChar(WChar key, CharSetFilter afilter) { switch (afilter) { - case CS_ALPHANUMERAL: return IsPrintable(key); - case CS_NUMERAL: return (key >= '0' && key <= '9'); - case CS_NUMERAL_SPACE: return (key >= '0' && key <= '9') || key == ' '; - case CS_ALPHA: return IsPrintable(key) && !(key >= '0' && key <= '9'); - case CS_HEXADECIMAL: return (key >= '0' && key <= '9') || (key >= 'a' && key <= 'f') || (key >= 'A' && key <= 'F'); + case CS_ALPHANUMERAL: return IsPrintable(key); + case CS_NUMERAL: return (key >= '0' && key <= '9'); + case CS_NUMERAL_SPACE: return (key >= '0' && key <= '9') || key == ' '; + case CS_NUMERAL_SIGNED: return (key >= '0' && key <= '9') || key == '-'; + case CS_ALPHA: return IsPrintable(key) && !(key >= '0' && key <= '9'); + case CS_HEXADECIMAL: return (key >= '0' && key <= '9') || (key >= 'a' && key <= 'f') || (key >= 'A' && key <= 'F'); default: NOT_REACHED(); } } diff --git a/src/string_type.h b/src/string_type.h index 25ea65598e..b8705e403f 100644 --- a/src/string_type.h +++ b/src/string_type.h @@ -27,6 +27,7 @@ enum CharSetFilter { CS_ALPHANUMERAL, ///< Both numeric and alphabetic and spaces and stuff CS_NUMERAL, ///< Only numeric ones CS_NUMERAL_SPACE, ///< Only numbers and spaces + CS_NUMERAL_SIGNED, ///< Only numbers and '-' for negative values CS_ALPHA, ///< Only alphabetic values CS_HEXADECIMAL, ///< Only hexadecimal characters }; diff --git a/src/strings.cpp b/src/strings.cpp index c589b0eef5..4c78e0fe7b 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -708,13 +708,26 @@ static const Units _units_velocity[] = { { {37888, 16}, STR_UNITS_VELOCITY_GAMEUNITS, 1 }, }; -/** Unit conversions for velocity. */ +/** Unit conversions for power. */ static const Units _units_power[] = { { { 1, 0}, STR_UNITS_POWER_IMPERIAL, 0 }, { {4153, 12}, STR_UNITS_POWER_METRIC, 0 }, { {6109, 13}, STR_UNITS_POWER_SI, 0 }, }; +/** Unit conversions for power to weight. */ +static const Units _units_power_to_weight[] = { + { { 29, 5}, STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_IMPERIAL, 1}, + { { 1, 0}, STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_METRIC, 1}, + { { 1, 0}, STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_SI, 1}, + { { 59, 6}, STR_UNITS_POWER_METRIC_TO_WEIGHT_IMPERIAL, 1}, + { { 65, 6}, STR_UNITS_POWER_METRIC_TO_WEIGHT_METRIC, 1}, + { { 65, 6}, STR_UNITS_POWER_METRIC_TO_WEIGHT_SI, 1}, + { { 173, 8}, STR_UNITS_POWER_SI_TO_WEIGHT_IMPERIAL, 1}, + { { 3, 2}, STR_UNITS_POWER_SI_TO_WEIGHT_METRIC, 1}, + { { 3, 2}, STR_UNITS_POWER_SI_TO_WEIGHT_SI, 1}, +}; + /** Unit conversions for weight. */ static const UnitsLong _units_weight[] = { { {4515, 12}, STR_UNITS_WEIGHT_SHORT_IMPERIAL, STR_UNITS_WEIGHT_LONG_IMPERIAL }, @@ -1252,6 +1265,19 @@ static char *FormatString(char *buff, const char *str_arg, StringParameters *arg break; } + case SCC_POWER_TO_WEIGHT: { // {POWER_TO_WEIGHT} + auto setting = _settings_game.locale.units_power * 3u + _settings_game.locale.units_weight; + assert(setting < lengthof(_units_power_to_weight)); + + auto const &x = _units_power_to_weight[setting]; + + int64 args_array[] = {x.c.ToDisplay(args->GetInt64()), x.decimal_places}; + + StringParameters tmp_params(args_array); + buff = FormatString(buff, GetStringPtr(x.s), &tmp_params, last); + break; + } + case SCC_VELOCITY: { // {VELOCITY} assert(_settings_game.locale.units_velocity < lengthof(_units_velocity)); unsigned int decimal_places = _units_velocity[_settings_game.locale.units_velocity].decimal_places; diff --git a/src/strings_func.h b/src/strings_func.h index 9d41ecd28a..bdb4fc6cd6 100644 --- a/src/strings_func.h +++ b/src/strings_func.h @@ -203,6 +203,7 @@ void SetDParamMaxDigits(uint n, uint count, FontSize size = FS_NORMAL); void SetDParamStr(uint n, const char *str); void SetDParamStr(uint n, const std::string &str); +void SetDParamStr(uint n, std::string &&str) = delete; // block passing temporaries to SetDParamStr void CopyInDParam(int offs, const uint64 *src, int num); void CopyOutDParam(uint64 *dst, int offs, int num); diff --git a/src/subsidy_gui.cpp b/src/subsidy_gui.cpp index b46ca4da29..1a87e1b00b 100644 --- a/src/subsidy_gui.cpp +++ b/src/subsidy_gui.cpp @@ -40,7 +40,7 @@ struct SubsidyListWindow : Window { { if (widget != WID_SUL_PANEL) return; - int y = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_SUL_PANEL, WD_FRAMERECT_TOP); + int y = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_SUL_PANEL, WidgetDimensions::scaled.framerect.top); int num = 0; for (const Subsidy *s : Subsidy::Iterate()) { if (!s->IsAwarded()) { @@ -130,11 +130,11 @@ struct SubsidyListWindow : Window { if (widget != WID_SUL_PANEL) return; Dimension d = maxdim(GetStringBoundingBox(STR_SUBSIDIES_OFFERED_TITLE), GetStringBoundingBox(STR_SUBSIDIES_SUBSIDISED_TITLE)); - resize->height = d.height; + resize->height = FONT_HEIGHT_NORMAL; d.height *= 5; - d.width += padding.width + WD_FRAMERECT_RIGHT + WD_FRAMERECT_LEFT; - d.height += padding.height + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; + d.width += WidgetDimensions::scaled.framerect.Horizontal(); + d.height += WidgetDimensions::scaled.framerect.Vertical(); *size = maxdim(*size, d); } @@ -145,15 +145,13 @@ struct SubsidyListWindow : Window { YearMonthDay ymd; ConvertDateToYMD(_date, &ymd); - int right = r.right - WD_FRAMERECT_RIGHT; - int y = r.top + WD_FRAMERECT_TOP; - int x = r.left + WD_FRAMERECT_LEFT; + Rect tr = r.Shrink(WidgetDimensions::scaled.framerect); int pos = -this->vscroll->GetPosition(); const int cap = this->vscroll->GetCapacity(); /* Section for drawing the offered subsidies */ - if (IsInsideMM(pos, 0, cap)) DrawString(x, right, y + pos * FONT_HEIGHT_NORMAL, STR_SUBSIDIES_OFFERED_TITLE); + if (IsInsideMM(pos, 0, cap)) DrawString(tr.left, tr.right, tr.top + pos * FONT_HEIGHT_NORMAL, STR_SUBSIDIES_OFFERED_TITLE); pos++; uint num = 0; @@ -163,7 +161,7 @@ struct SubsidyListWindow : Window { /* Displays the two offered towns */ SetupSubsidyDecodeParam(s, SubsidyDecodeParamType::Gui); SetDParam(7, _date - ymd.day + s->remaining * 32); - DrawString(x, right, y + pos * FONT_HEIGHT_NORMAL, STR_SUBSIDIES_OFFERED_FROM_TO); + DrawString(tr.left, tr.right, tr.top + pos * FONT_HEIGHT_NORMAL, STR_SUBSIDIES_OFFERED_FROM_TO); } pos++; num++; @@ -171,13 +169,13 @@ struct SubsidyListWindow : Window { } if (num == 0) { - if (IsInsideMM(pos, 0, cap)) DrawString(x, right, y + pos * FONT_HEIGHT_NORMAL, STR_SUBSIDIES_NONE); + if (IsInsideMM(pos, 0, cap)) DrawString(tr.left, tr.right, tr.top + pos * FONT_HEIGHT_NORMAL, STR_SUBSIDIES_NONE); pos++; } /* Section for drawing the already granted subsidies */ pos++; - if (IsInsideMM(pos, 0, cap)) DrawString(x, right, y + pos * FONT_HEIGHT_NORMAL, STR_SUBSIDIES_SUBSIDISED_TITLE); + if (IsInsideMM(pos, 0, cap)) DrawString(tr.left, tr.right, tr.top + pos * FONT_HEIGHT_NORMAL, STR_SUBSIDIES_SUBSIDISED_TITLE); pos++; num = 0; @@ -189,7 +187,7 @@ struct SubsidyListWindow : Window { SetDParam(8, _date - ymd.day + s->remaining * 32); /* Displays the two connected stations */ - DrawString(x, right, y + pos * FONT_HEIGHT_NORMAL, STR_SUBSIDIES_SUBSIDISED_FROM_TO); + DrawString(tr.left, tr.right, tr.top + pos * FONT_HEIGHT_NORMAL, STR_SUBSIDIES_SUBSIDISED_FROM_TO); } pos++; num++; @@ -197,7 +195,7 @@ struct SubsidyListWindow : Window { } if (num == 0) { - if (IsInsideMM(pos, 0, cap)) DrawString(x, right, y + pos * FONT_HEIGHT_NORMAL, STR_SUBSIDIES_NONE); + if (IsInsideMM(pos, 0, cap)) DrawString(tr.left, tr.right, tr.top + pos * FONT_HEIGHT_NORMAL, STR_SUBSIDIES_NONE); pos++; } } diff --git a/src/table/control_codes.h b/src/table/control_codes.h index 7f42d2c4f6..ef3f8ff268 100644 --- a/src/table/control_codes.h +++ b/src/table/control_codes.h @@ -56,6 +56,7 @@ enum StringControlCode { SCC_CARGO_TINY, SCC_CARGO_LIST, SCC_POWER, + SCC_POWER_TO_WEIGHT, SCC_VOLUME_LONG, SCC_VOLUME_SHORT, SCC_WEIGHT_LONG, diff --git a/src/table/elrail_data.h b/src/table/elrail_data.h index 12132848b8..5e1b9e792f 100644 --- a/src/table/elrail_data.h +++ b/src/table/elrail_data.h @@ -327,7 +327,9 @@ struct SortableSpriteStruct { /** Distance between wire and rail */ static const uint ELRAIL_ELEVATION = 10; /** Wires that a draw one level higher than the north corner. */ -static const uint ELRAIL_ELEVRAISE = ELRAIL_ELEVATION + TILE_HEIGHT; +static const uint ELRAIL_ELEVRAISE = ELRAIL_ELEVATION + TILE_HEIGHT + 1; +/** Wires that a draw one level lower than the north corner. */ +static const uint ELRAIL_ELEVLOWER = ELRAIL_ELEVATION - 1; static const SortableSpriteStruct RailCatenarySpriteData[] = { /* X direction @@ -345,9 +347,9 @@ static const SortableSpriteStruct RailCatenarySpriteData[] = { /* "down" tiles * Wires */ - { WSO_X_SW_DOWN, 0, 7, 15, 8, 1, ELRAIL_ELEVATION }, //! 6: Wire in X pitch down, pylon on the SW end - { WSO_X_NE_DOWN, 0, 7, 15, 8, 1, ELRAIL_ELEVATION }, //! 7: Wire in X pitch down, pylon on the NE end - { WSO_X_SHORT_DOWN, 0, 7, 15, 8, 1, ELRAIL_ELEVATION }, //! 8: Wire in X pitch down, pylon on both ends + { WSO_X_SW_DOWN, 0, 7, 15, 8, 1, ELRAIL_ELEVLOWER }, //! 6: Wire in X pitch down, pylon on the SW end + { WSO_X_NE_DOWN, 0, 7, 15, 8, 1, ELRAIL_ELEVLOWER }, //! 7: Wire in X pitch down, pylon on the NE end + { WSO_X_SHORT_DOWN, 0, 7, 15, 8, 1, ELRAIL_ELEVLOWER }, //! 8: Wire in X pitch down, pylon on both ends /* Y direction @@ -365,9 +367,9 @@ static const SortableSpriteStruct RailCatenarySpriteData[] = { /* "down" tiles * Wires */ - { WSO_Y_SE_DOWN, 7, 0, 8, 15, 1, ELRAIL_ELEVATION }, //!15: Wire in Y pitch down, pylon on the SE end - { WSO_Y_NW_DOWN, 7, 0, 8, 15, 1, ELRAIL_ELEVATION }, //!16: Wire in Y pitch down, pylon on the NW end - { WSO_Y_SHORT_DOWN, 7, 0, 8, 15, 1, ELRAIL_ELEVATION }, //!17: Wire in Y pitch down, pylon on both ends + { WSO_Y_SE_DOWN, 7, 0, 8, 15, 1, ELRAIL_ELEVLOWER }, //!15: Wire in Y pitch down, pylon on the SE end + { WSO_Y_NW_DOWN, 7, 0, 8, 15, 1, ELRAIL_ELEVLOWER }, //!16: Wire in Y pitch down, pylon on the NW end + { WSO_Y_SHORT_DOWN, 7, 0, 8, 15, 1, ELRAIL_ELEVLOWER }, //!17: Wire in Y pitch down, pylon on both ends /* NS Direction */ { WSO_NS_SHORT, 8, 0, 8, 8, 1, ELRAIL_ELEVATION }, //!18: LEFT trackbit wire, pylon on both ends diff --git a/src/table/engines.h b/src/table/engines.h index ab6ba77467..e3b1481d7f 100644 --- a/src/table/engines.h +++ b/src/table/engines.h @@ -24,7 +24,7 @@ * @param f Bitmask of the climates * @note the 5 between b and f is the load amount */ -#define MT(a, b, c, d, e, f) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 5, f, e, 0, 8, 1 << EF_RAIL_FLIPS, 0, 0, STR_EMPTY, CARGO_AGING_TICKS } +#define MT(a, b, c, d, e, f) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 5, f, e, 0, 8, 0, 0, 0, STR_EMPTY, CARGO_AGING_TICKS, INVALID_ENGINE, ExtraEngineFlags::None } /** * Writes the properties of a multiple-unit train into the EngineInfo struct. @@ -37,7 +37,7 @@ * @param f Bitmask of the climates * @note the 5 between b and f is the load amount */ -#define MM(a, b, c, d, e, f) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 5, f, e, 0, 8, 1 << EF_RAIL_FLIPS | 1 << EF_RAIL_IS_MU, 0, 0, STR_EMPTY, CARGO_AGING_TICKS } +#define MM(a, b, c, d, e, f) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 5, f, e, 0, 8, 1 << EF_RAIL_IS_MU, 0, 0, STR_EMPTY, CARGO_AGING_TICKS, INVALID_ENGINE, ExtraEngineFlags::None } /** * Writes the properties of a train carriage into the EngineInfo struct. @@ -50,7 +50,7 @@ * @see MT * @note the 5 between b and f is the load amount */ -#define MW(a, b, c, d, e, f) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 5, f, e, 0, 8, 1 << EF_RAIL_FLIPS, 0, 0, STR_EMPTY, CARGO_AGING_TICKS } +#define MW(a, b, c, d, e, f) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 5, f, e, 0, 8, 0, 0, 0, STR_EMPTY, CARGO_AGING_TICKS, INVALID_ENGINE, ExtraEngineFlags::None } /** * Writes the properties of a road vehicle into the EngineInfo struct. @@ -63,7 +63,7 @@ * @param f Bitmask of the climates * @note the 5 between b and f is the load amount */ -#define MR(a, b, c, d, e, f) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 5, f, e, 0, 8, 0, 0, 0, STR_EMPTY, CARGO_AGING_TICKS } +#define MR(a, b, c, d, e, f) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 5, f, e, 0, 8, 0, 0, 0, STR_EMPTY, CARGO_AGING_TICKS, INVALID_ENGINE, ExtraEngineFlags::None } /** * Writes the properties of a ship into the EngineInfo struct. @@ -75,7 +75,7 @@ * @param f Bitmask of the climates * @note the 10 between b and f is the load amount */ -#define MS(a, b, c, d, e, f) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 10, f, e, 0, 8, 0, 0, 0, STR_EMPTY, CARGO_AGING_TICKS } +#define MS(a, b, c, d, e, f) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 10, f, e, 0, 8, 0, 0, 0, STR_EMPTY, CARGO_AGING_TICKS, INVALID_ENGINE, ExtraEngineFlags::None } /** * Writes the properties of an aeroplane into the EngineInfo struct. @@ -86,7 +86,7 @@ * @param e Bitmask of the climates * @note the 20 between b and e is the load amount */ -#define MA(a, b, c, d, e) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 20, e, CT_INVALID, 0, 8, 0, 0, 0, STR_EMPTY, CARGO_AGING_TICKS } +#define MA(a, b, c, d, e) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 20, e, CT_INVALID, 0, 8, 0, 0, 0, STR_EMPTY, CARGO_AGING_TICKS, INVALID_ENGINE, ExtraEngineFlags::None } /* Climates * T = Temperate diff --git a/src/table/opengl_shader.h b/src/table/opengl_shader.h index 5f4244ef1b..b644123d14 100644 --- a/src/table/opengl_shader.h +++ b/src/table/opengl_shader.h @@ -1,5 +1,3 @@ -/* $Id$ */ - /* * This file is part of OpenTTD. * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. diff --git a/src/table/road_land.h b/src/table/road_land.h index df38f935d5..0f84ebf183 100644 --- a/src/table/road_land.h +++ b/src/table/road_land.h @@ -53,6 +53,46 @@ static const DrawTileSprites _crossing_layout = { {0, PAL_NONE}, _crossing_layout_ALL }; +static const DrawTileSeqStruct _crossing_layout_SW_ALL[] = { + TILE_SEQ_LINE(6, PAL_NONE, 13, 0, 3, 3) + TILE_SEQ_LINE(8, PAL_NONE, 13, 13, 3, 3) + TILE_SEQ_END() +}; + +static const DrawTileSprites _crossing_layout_SW = { + {0, PAL_NONE}, _crossing_layout_SW_ALL +}; + +static const DrawTileSeqStruct _crossing_layout_NW_ALL[] = { + TILE_SEQ_LINE(2, PAL_NONE, 0, 0, 3, 3) + TILE_SEQ_LINE(6, PAL_NONE, 13, 0, 3, 3) + TILE_SEQ_END() +}; + +static const DrawTileSprites _crossing_layout_NW = { + {0, PAL_NONE}, _crossing_layout_NW_ALL +}; + +static const DrawTileSeqStruct _crossing_layout_NE_ALL[] = { + TILE_SEQ_LINE(2, PAL_NONE, 0, 0, 3, 3) + TILE_SEQ_LINE(4, PAL_NONE, 0, 13, 3, 3) + TILE_SEQ_END() +}; + +static const DrawTileSprites _crossing_layout_NE = { + {0, PAL_NONE}, _crossing_layout_NE_ALL +}; + +static const DrawTileSeqStruct _crossing_layout_SE_ALL[] = { + TILE_SEQ_LINE(4, PAL_NONE, 0, 13, 3, 3) + TILE_SEQ_LINE(8, PAL_NONE, 13, 13, 3, 3) + TILE_SEQ_END() +}; + +static const DrawTileSprites _crossing_layout_SE = { + {0, PAL_NONE}, _crossing_layout_SE_ALL +}; + #undef TILE_SEQ_LINE #undef TILE_SEQ_END diff --git a/src/table/settings/economy_settings.ini b/src/table/settings/economy_settings.ini index 0101e1bf98..ad2a74319d 100644 --- a/src/table/settings/economy_settings.ini +++ b/src/table/settings/economy_settings.ini @@ -123,7 +123,7 @@ var = economy.bribe def = true str = STR_CONFIG_SETTING_BRIBE strhelp = STR_CONFIG_SETTING_BRIBE_HELPTEXT -post_cb = [](auto) { SetWindowClassesDirty(WC_TOWN_AUTHORITY); } +post_cb = [](auto) { InvalidateWindowClassesData(WC_TOWN_AUTHORITY); } cat = SC_BASIC [SDT_BOOL] @@ -132,7 +132,7 @@ from = SLV_79 def = true str = STR_CONFIG_SETTING_ALLOW_EXCLUSIVE strhelp = STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT -post_cb = [](auto) { SetWindowClassesDirty(WC_TOWN_AUTHORITY); } +post_cb = [](auto) { InvalidateWindowClassesData(WC_TOWN_AUTHORITY); } cat = SC_BASIC [SDT_BOOL] @@ -141,7 +141,7 @@ from = SLV_165 def = true str = STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS strhelp = STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT -post_cb = [](auto) { SetWindowClassesDirty(WC_TOWN_AUTHORITY); } +post_cb = [](auto) { InvalidateWindowClassesData(WC_TOWN_AUTHORITY); } cat = SC_BASIC [SDT_BOOL] @@ -150,7 +150,7 @@ from = SLV_160 def = true str = STR_CONFIG_SETTING_ALLOW_FUND_ROAD strhelp = STR_CONFIG_SETTING_ALLOW_FUND_ROAD_HELPTEXT -post_cb = [](auto) { SetWindowClassesDirty(WC_TOWN_AUTHORITY); } +post_cb = [](auto) { InvalidateWindowClassesData(WC_TOWN_AUTHORITY); } cat = SC_BASIC [SDT_BOOL] diff --git a/src/table/settings/game_settings.ini b/src/table/settings/game_settings.ini index 79fac75136..b937960b82 100644 --- a/src/table/settings/game_settings.ini +++ b/src/table/settings/game_settings.ini @@ -144,7 +144,7 @@ max = 1 full = _roadsides str = STR_CONFIG_SETTING_ROAD_SIDE strhelp = STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT -strval = STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT +strval = STR_CONFIG_SETTING_ROAD_SIDE_LEFT pre_cb = CheckRoadSide cat = SC_BASIC diff --git a/src/table/settings/gui_settings.ini b/src/table/settings/gui_settings.ini index cf4ef71aba..a521408be7 100644 --- a/src/table/settings/gui_settings.ini +++ b/src/table/settings/gui_settings.ini @@ -728,6 +728,15 @@ strhelp = STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT post_cb = [](auto) { MarkWholeScreenDirty(); } cat = SC_ADVANCED +[SDTC_BOOL] +var = gui.show_cargo_in_vehicle_lists +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC +def = false +str = STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS +strhelp = STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS_HELPTEXT +post_cb = [](auto) { MarkWholeScreenDirty(); } +cat = SC_ADVANCED + ; For the dedicated build we'll enable dates in logs by default. [SDTC_BOOL] ifdef = DEDICATED @@ -861,3 +870,11 @@ min = 1 max = 65535 cat = SC_EXPERT +[SDTC_BOOL] +var = gui.scale_bevels +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC +def = true +post_cb = [](auto) { SetupWidgetDimensions(); ReInitAllWindows(true); } +cat = SC_BASIC +startup = true + diff --git a/src/table/settings/misc_settings.ini b/src/table/settings/misc_settings.ini index 15e9413ed2..dd3a58e24e 100644 --- a/src/table/settings/misc_settings.ini +++ b/src/table/settings/misc_settings.ini @@ -334,21 +334,12 @@ max = UINT32_MAX cat = SC_EXPERT [SDTG_VAR] -name = ""gui_zoom"" -type = SLE_INT8 -var = _gui_zoom_cfg -def = ZOOM_LVL_CFG_AUTO -min = ZOOM_LVL_CFG_AUTO -max = ZOOM_LVL_OUT_4X -cat = SC_BASIC - -[SDTG_VAR] -name = ""font_zoom"" -type = SLE_INT8 -var = _font_zoom_cfg -def = ZOOM_LVL_CFG_AUTO -min = ZOOM_LVL_CFG_AUTO -max = ZOOM_LVL_OUT_4X +name = ""gui_scale"" +type = SLE_INT32 +var = _gui_scale_cfg +def = -1 +min = -1 +max = MAX_INTERFACE_SCALE cat = SC_BASIC [SDTG_BOOL] diff --git a/src/table/settings/world_settings.ini b/src/table/settings/world_settings.ini index de5ce376c7..479f1e7442 100644 --- a/src/table/settings/world_settings.ini +++ b/src/table/settings/world_settings.ini @@ -65,7 +65,7 @@ full = _climates load = ConvertLandscape str = STR_CONFIG_SETTING_LANDSCAPE strhelp = STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT -strval = STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE +strval = STR_CLIMATE_TEMPERATE_LANDSCAPE cat = SC_BASIC [SDT_VAR] diff --git a/src/table/sprites.h b/src/table/sprites.h index 16240d4bbc..407a7a2d87 100644 --- a/src/table/sprites.h +++ b/src/table/sprites.h @@ -290,8 +290,10 @@ static const SpriteID SPR_TRAMWAY_DEPOT_NO_TRACK = SPR_TRAMWAY_BASE + 113; static const uint16 TRAMWAY_SPRITE_COUNT = 119; /** One way road sprites */ -static const SpriteID SPR_ONEWAY_BASE = SPR_TRAMWAY_BASE + TRAMWAY_SPRITE_COUNT; -static const uint16 ONEWAY_SPRITE_COUNT = 6; +static const SpriteID SPR_ONEWAY_BASE = SPR_TRAMWAY_BASE + TRAMWAY_SPRITE_COUNT; +static const SpriteID SPR_ONEWAY_SLOPE_N_OFFSET = 6; +static const SpriteID SPR_ONEWAY_SLOPE_S_OFFSET = 12; +static const uint16 ONEWAY_SPRITE_COUNT = 18; /** Tunnel sprites with grass only for custom railtype tunnel. */ static const SpriteID SPR_RAILTYPE_TUNNEL_BASE = SPR_ONEWAY_BASE + ONEWAY_SPRITE_COUNT; @@ -1542,18 +1544,18 @@ enum Modifiers { * @see SpriteSetup */ enum SpriteMasks { - MAX_SPRITES = 1 << SPRITE_WIDTH, ///< Maximum number of sprites that can be loaded at a given time + MAX_SPRITES = 1U << SPRITE_WIDTH, ///< Maximum number of sprites that can be loaded at a given time SPRITE_MASK = MAX_SPRITES - 1, ///< The mask to for the main sprite - MAX_PALETTES = 1 << PALETTE_WIDTH, + MAX_PALETTES = 1U << PALETTE_WIDTH, PALETTE_MASK = MAX_PALETTES - 1, ///< The mask for the auxiliary sprite (the one that takes care of recolouring) }; -static_assert( (1 << TRANSPARENT_BIT & SPRITE_MASK) == 0 ); -static_assert( (1 << RECOLOUR_BIT & SPRITE_MASK) == 0 ); +static_assert( (1U << TRANSPARENT_BIT & SPRITE_MASK) == 0 ); +static_assert( (1U << RECOLOUR_BIT & SPRITE_MASK) == 0 ); static_assert( TRANSPARENT_BIT != RECOLOUR_BIT ); -static_assert( (1 << TRANSPARENT_BIT & PALETTE_MASK) == 0); -static_assert( (1 << RECOLOUR_BIT & PALETTE_MASK) == 0 ); +static_assert( (1U << TRANSPARENT_BIT & PALETTE_MASK) == 0 ); +static_assert( (1U << RECOLOUR_BIT & PALETTE_MASK) == 0 ); static const PaletteID PAL_NONE = 0; diff --git a/src/table/strgen_tables.h b/src/table/strgen_tables.h index 7ce480f6fa..19ce4b0a7d 100644 --- a/src/table/strgen_tables.h +++ b/src/table/strgen_tables.h @@ -78,6 +78,7 @@ static const CmdStruct _cmd_structs[] = { {"CARGO_TINY", EmitSingleChar, SCC_CARGO_TINY, 2, 1, C_NONE}, // tiny cargo description with only the amount, not a specifier for the amount or the actual cargo name {"CARGO_LIST", EmitSingleChar, SCC_CARGO_LIST, 1, -1, C_CASE}, {"POWER", EmitSingleChar, SCC_POWER, 1, 0, C_NONE}, + {"POWER_TO_WEIGHT", EmitSingleChar, SCC_POWER_TO_WEIGHT, 1, 0, C_NONE}, {"VOLUME_LONG", EmitSingleChar, SCC_VOLUME_LONG, 1, 0, C_NONE}, {"VOLUME_SHORT", EmitSingleChar, SCC_VOLUME_SHORT, 1, 0, C_NONE}, {"WEIGHT_LONG", EmitSingleChar, SCC_WEIGHT_LONG, 1, 0, C_NONE}, diff --git a/src/textfile_gui.cpp b/src/textfile_gui.cpp index 2e8ff58515..e490491f50 100644 --- a/src/textfile_gui.cpp +++ b/src/textfile_gui.cpp @@ -88,7 +88,7 @@ uint TextfileWindow::ReflowContent() line.bottom = height; } } else { - int max_width = this->GetWidget(WID_TF_BACKGROUND)->current_x - WD_FRAMETEXT_LEFT - WD_FRAMERECT_RIGHT; + int max_width = this->GetWidget(WID_TF_BACKGROUND)->current_x - WidgetDimensions::scaled.frametext.Horizontal(); for (auto &line : this->lines) { line.top = height; height += GetStringHeight(line.text, max_width, FS_MONO) / FONT_HEIGHT_MONO; @@ -111,7 +111,7 @@ uint TextfileWindow::GetContentHeight() case WID_TF_BACKGROUND: resize->height = FONT_HEIGHT_MONO; - size->height = 4 * resize->height + TOP_SPACING + BOTTOM_SPACING; // At least 4 lines are visible. + size->height = 4 * resize->height + WidgetDimensions::scaled.frametext.Vertical(); // At least 4 lines are visible. size->width = std::max(200u, size->width); // At least 200 pixels wide. break; } @@ -128,7 +128,7 @@ void TextfileWindow::SetupScrollbars(bool force_reflow) } else { uint height = force_reflow ? this->ReflowContent() : this->GetContentHeight(); this->vscroll->SetCount(std::min(UINT16_MAX, height)); - this->hscroll->SetCount(this->max_length + WD_FRAMETEXT_LEFT + WD_FRAMETEXT_RIGHT); + this->hscroll->SetCount(this->max_length + WidgetDimensions::scaled.frametext.Horizontal()); } this->SetWidgetDisabledState(WID_TF_HSCROLLBAR, IsWidgetLowered(WID_TF_WRAPTEXT)); @@ -148,17 +148,15 @@ void TextfileWindow::SetupScrollbars(bool force_reflow) { if (widget != WID_TF_BACKGROUND) return; - const int x = r.left + WD_FRAMETEXT_LEFT; - const int y = r.top + WD_FRAMETEXT_TOP; - const int right = r.right - WD_FRAMETEXT_RIGHT; - const int bottom = r.bottom - WD_FRAMETEXT_BOTTOM; + Rect fr = r.Shrink(WidgetDimensions::scaled.frametext); DrawPixelInfo new_dpi; - if (!FillDrawPixelInfo(&new_dpi, x, y, right - x + 1, bottom - y + 1)) return; + if (!FillDrawPixelInfo(&new_dpi, fr.left, fr.top, fr.Width(), fr.Height())) return; DrawPixelInfo *old_dpi = _cur_dpi; _cur_dpi = &new_dpi; /* Draw content (now coordinates given to DrawString* are local to the new clipping region). */ + fr = fr.Translate(-fr.left, -fr.top); int line_height = FONT_HEIGHT_MONO; int pos = this->vscroll->GetPosition(); int cap = this->vscroll->GetCapacity(); @@ -169,9 +167,9 @@ void TextfileWindow::SetupScrollbars(bool force_reflow) int y_offset = (line.top - pos) * line_height; if (IsWidgetLowered(WID_TF_WRAPTEXT)) { - DrawStringMultiLine(0, right - x, y_offset, bottom - y, line.text, TC_WHITE, SA_TOP | SA_LEFT, false, FS_MONO); + DrawStringMultiLine(0, fr.right, y_offset, fr.bottom, line.text, TC_BLACK, SA_TOP | SA_LEFT, false, FS_MONO); } else { - DrawString(-this->hscroll->GetPosition(), right - x, y_offset, line.text, TC_WHITE, SA_TOP | SA_LEFT, false, FS_MONO); + DrawString(-this->hscroll->GetPosition(), fr.right, y_offset, line.text, TC_BLACK, SA_TOP | SA_LEFT, false, FS_MONO); } } @@ -180,7 +178,7 @@ void TextfileWindow::SetupScrollbars(bool force_reflow) /* virtual */ void TextfileWindow::OnResize() { - this->vscroll->SetCapacityFromWidget(this, WID_TF_BACKGROUND, TOP_SPACING + BOTTOM_SPACING); + this->vscroll->SetCapacityFromWidget(this, WID_TF_BACKGROUND, WidgetDimensions::scaled.frametext.Vertical()); this->hscroll->SetCapacityFromWidget(this, WID_TF_BACKGROUND); this->SetupScrollbars(false); diff --git a/src/textfile_gui.h b/src/textfile_gui.h index f2ec9346b2..cdcae73888 100644 --- a/src/textfile_gui.h +++ b/src/textfile_gui.h @@ -36,9 +36,6 @@ struct TextfileWindow : public Window, MissingGlyphSearcher { uint max_length; ///< Maximum length of unwrapped text line. - static const int TOP_SPACING = WD_FRAMETEXT_TOP; ///< Additional spacing at the top of the #WID_TF_BACKGROUND widget. - static const int BOTTOM_SPACING = WD_FRAMETEXT_BOTTOM; ///< Additional spacing at the bottom of the #WID_TF_BACKGROUND widget. - TextfileWindow(TextfileType file_type); ~TextfileWindow(); diff --git a/src/timetable_cmd.cpp b/src/timetable_cmd.cpp index 6f7dcca55b..f800b25ae6 100644 --- a/src/timetable_cmd.cpp +++ b/src/timetable_cmd.cpp @@ -173,6 +173,39 @@ CommandCost CmdChangeTimetable(DoCommandFlag flags, VehicleID veh, VehicleOrderI return CommandCost(); } +/** + * Change timetable data of all orders of a vehicle. + * @param flags Operation to perform. + * @param veh Vehicle with the orders to change. + * @param mtf Timetable data to change (@see ModifyTimetableFlags) + * @param data The data to modify as specified by \c mtf. + * 0 to clear times, UINT16_MAX to clear speed limit. + * @return the cost of this operation or an error + */ +CommandCost CmdBulkChangeTimetable(DoCommandFlag flags, VehicleID veh, ModifyTimetableFlags mtf, uint16 data) +{ + Vehicle *v = Vehicle::GetIfValid(veh); + if (v == nullptr || !v->IsPrimaryVehicle()) return CMD_ERROR; + + CommandCost ret = CheckOwnership(v->owner); + if (ret.Failed()) return ret; + + if (mtf >= MTF_END) return CMD_ERROR; + + if (v->GetNumOrders() == 0) return CMD_ERROR; + + if (flags & DC_EXEC) { + for (VehicleOrderID order_number = 0; order_number < v->GetNumOrders(); order_number++) { + Order *order = v->GetOrder(order_number); + if (order == nullptr || order->IsType(OT_IMPLICIT)) continue; + + Command::Do(DC_EXEC, v->index, order_number, mtf, data); + } + } + + return CommandCost(); +} + /** * Clear the lateness counter to make the vehicle on time. * @param flags Operation to perform. diff --git a/src/timetable_cmd.h b/src/timetable_cmd.h index ddf1277372..7be7982320 100644 --- a/src/timetable_cmd.h +++ b/src/timetable_cmd.h @@ -13,13 +13,15 @@ #include "command_type.h" CommandCost CmdChangeTimetable(DoCommandFlag flags, VehicleID veh, VehicleOrderID order_number, ModifyTimetableFlags mtf, uint16 data); +CommandCost CmdBulkChangeTimetable(DoCommandFlag flags, VehicleID veh, ModifyTimetableFlags mtf, uint16 data); CommandCost CmdSetVehicleOnTime(DoCommandFlag flags, VehicleID veh); CommandCost CmdAutofillTimetable(DoCommandFlag flags, VehicleID veh, bool autofill, bool preserve_wait_time); CommandCost CmdSetTimetableStart(DoCommandFlag flags, VehicleID veh_id, bool timetable_all, Date start_date); -DEF_CMD_TRAIT(CMD_CHANGE_TIMETABLE, CmdChangeTimetable, 0, CMDT_ROUTE_MANAGEMENT) -DEF_CMD_TRAIT(CMD_SET_VEHICLE_ON_TIME, CmdSetVehicleOnTime, 0, CMDT_ROUTE_MANAGEMENT) -DEF_CMD_TRAIT(CMD_AUTOFILL_TIMETABLE, CmdAutofillTimetable, 0, CMDT_ROUTE_MANAGEMENT) -DEF_CMD_TRAIT(CMD_SET_TIMETABLE_START, CmdSetTimetableStart, 0, CMDT_ROUTE_MANAGEMENT) +DEF_CMD_TRAIT(CMD_CHANGE_TIMETABLE, CmdChangeTimetable, 0, CMDT_ROUTE_MANAGEMENT) +DEF_CMD_TRAIT(CMD_BULK_CHANGE_TIMETABLE, CmdBulkChangeTimetable, 0, CMDT_ROUTE_MANAGEMENT) +DEF_CMD_TRAIT(CMD_SET_VEHICLE_ON_TIME, CmdSetVehicleOnTime, 0, CMDT_ROUTE_MANAGEMENT) +DEF_CMD_TRAIT(CMD_AUTOFILL_TIMETABLE, CmdAutofillTimetable, 0, CMDT_ROUTE_MANAGEMENT) +DEF_CMD_TRAIT(CMD_SET_TIMETABLE_START, CmdSetTimetableStart, 0, CMDT_ROUTE_MANAGEMENT) #endif /* TIMETABLE_CMD_H */ diff --git a/src/timetable_gui.cpp b/src/timetable_gui.cpp index 662919829f..f6b1e3da93 100644 --- a/src/timetable_gui.cpp +++ b/src/timetable_gui.cpp @@ -156,6 +156,8 @@ struct TimetableWindow : Window { uint deparr_abbr_width; ///< The width of the departure/arrival abbreviation Scrollbar *vscroll; bool query_is_speed_query; ///< The currently open query window is a speed query and not a time query. + bool set_start_date_all; ///< Set start date using minutes text entry for all timetable entries (ctrl-click) action + bool change_timetable_all; ///< Set wait time or speed for all timetable entries (ctrl-click) action TimetableWindow(WindowDesc *desc, WindowNumber window_number) : Window(desc), @@ -196,24 +198,24 @@ struct TimetableWindow : Window { SetDParamMaxValue(0, MAX_YEAR * DAYS_IN_YEAR, 0, FS_SMALL); this->deparr_time_width = GetStringBoundingBox(STR_JUST_DATE_TINY).width; this->deparr_abbr_width = std::max(GetStringBoundingBox(STR_TIMETABLE_ARRIVAL_ABBREVIATION).width, GetStringBoundingBox(STR_TIMETABLE_DEPARTURE_ABBREVIATION).width); - size->width = WD_FRAMERECT_LEFT + this->deparr_abbr_width + 10 + this->deparr_time_width + WD_FRAMERECT_RIGHT; + size->width = this->deparr_abbr_width + WidgetDimensions::scaled.hsep_wide + this->deparr_time_width + padding.width; FALLTHROUGH; case WID_VT_ARRIVAL_DEPARTURE_SELECTION: case WID_VT_TIMETABLE_PANEL: resize->height = FONT_HEIGHT_NORMAL; - size->height = WD_FRAMERECT_TOP + 8 * resize->height + WD_FRAMERECT_BOTTOM; + size->height = 8 * resize->height + padding.height; break; case WID_VT_SUMMARY_PANEL: - size->height = WD_FRAMERECT_TOP + 2 * FONT_HEIGHT_NORMAL + WD_FRAMERECT_BOTTOM; + size->height = 2 * FONT_HEIGHT_NORMAL + padding.height; break; } } int GetOrderFromTimetableWndPt(int y, const Vehicle *v) { - uint sel = (y - this->GetWidget(WID_VT_TIMETABLE_PANEL)->pos_y - WD_FRAMERECT_TOP) / FONT_HEIGHT_NORMAL; + uint sel = (y - this->GetWidget(WID_VT_TIMETABLE_PANEL)->pos_y - WidgetDimensions::scaled.framerect.top) / FONT_HEIGHT_NORMAL; if (sel >= this->vscroll->GetCapacity()) return INVALID_ORDER; @@ -356,15 +358,15 @@ struct TimetableWindow : Window { switch (widget) { case WID_VT_TIMETABLE_PANEL: { - int y = r.top + WD_FRAMERECT_TOP; + Rect tr = r.Shrink(WidgetDimensions::scaled.framerect); int i = this->vscroll->GetPosition(); VehicleOrderID order_id = (i + 1) / 2; bool final_order = false; bool rtl = _current_text_dir == TD_RTL; SetDParamMaxValue(0, v->GetNumOrders(), 2); - int index_column_width = GetStringBoundingBox(STR_ORDER_INDEX).width + 2 * GetSpriteSize(rtl ? SPR_ARROW_RIGHT : SPR_ARROW_LEFT).width + 3; - int middle = rtl ? r.right - WD_FRAMERECT_RIGHT - index_column_width : r.left + WD_FRAMERECT_LEFT + index_column_width; + int index_column_width = GetStringBoundingBox(STR_ORDER_INDEX).width + 2 * GetSpriteSize(rtl ? SPR_ARROW_RIGHT : SPR_ARROW_LEFT).width + WidgetDimensions::scaled.hsep_normal; + int middle = rtl ? tr.right - index_column_width : tr.left + index_column_width; const Order *order = v->GetOrder(order_id); while (order != nullptr) { @@ -372,7 +374,7 @@ struct TimetableWindow : Window { if (!this->vscroll->IsVisible(i)) break; if (i % 2 == 0) { - DrawOrderString(v, order, order_id, y, i == selected, true, r.left + WD_FRAMERECT_LEFT, middle, r.right - WD_FRAMERECT_RIGHT); + DrawOrderString(v, order, order_id, tr.top, i == selected, true, tr.left, middle, tr.right); order_id++; @@ -408,13 +410,13 @@ struct TimetableWindow : Window { } SetDParam(2, order->GetMaxSpeed()); - DrawString(rtl ? r.left + WD_FRAMERECT_LEFT : middle, rtl ? middle : r.right - WD_FRAMERECT_LEFT, y, string, colour); + DrawString(rtl ? tr.left : middle, rtl ? middle : tr.right, tr.top, string, colour); if (final_order) break; } i++; - y += FONT_HEIGHT_NORMAL; + tr.top += FONT_HEIGHT_NORMAL; } break; } @@ -432,16 +434,13 @@ struct TimetableWindow : Window { VehicleOrderID earlyID = BuildArrivalDepartureList(v, arr_dep) ? cur_order : (VehicleOrderID)INVALID_VEH_ORDER_ID; - int y = r.top + WD_FRAMERECT_TOP; - + Rect tr = r.Shrink(WidgetDimensions::scaled.framerect); bool show_late = this->show_expected && v->lateness_counter > DAY_TICKS; Ticks offset = show_late ? 0 : -v->lateness_counter; bool rtl = _current_text_dir == TD_RTL; - int abbr_left = rtl ? r.right - WD_FRAMERECT_RIGHT - this->deparr_abbr_width : r.left + WD_FRAMERECT_LEFT; - int abbr_right = rtl ? r.right - WD_FRAMERECT_RIGHT : r.left + WD_FRAMERECT_LEFT + this->deparr_abbr_width; - int time_left = rtl ? r.left + WD_FRAMERECT_LEFT : r.right - WD_FRAMERECT_RIGHT - this->deparr_time_width; - int time_right = rtl ? r.left + WD_FRAMERECT_LEFT + this->deparr_time_width : r.right - WD_FRAMERECT_RIGHT; + Rect abbr = tr.WithWidth(this->deparr_abbr_width, rtl); + Rect time = tr.WithWidth(this->deparr_time_width, !rtl); for (int i = this->vscroll->GetPosition(); i / 2 < v->GetNumOrders(); ++i) { // note: i is also incremented in the loop /* Don't draw anything if it extends past the end of the window. */ @@ -449,54 +448,54 @@ struct TimetableWindow : Window { if (i % 2 == 0) { if (arr_dep[i / 2].arrival != INVALID_TICKS) { - DrawString(abbr_left, abbr_right, y, STR_TIMETABLE_ARRIVAL_ABBREVIATION, i == selected ? TC_WHITE : TC_BLACK); + DrawString(abbr.left, abbr.right, tr.top, STR_TIMETABLE_ARRIVAL_ABBREVIATION, i == selected ? TC_WHITE : TC_BLACK); if (this->show_expected && i / 2 == earlyID) { SetDParam(0, _date + arr_dep[i / 2].arrival / DAY_TICKS); - DrawString(time_left, time_right, y, STR_JUST_DATE_TINY, TC_GREEN); + DrawString(time.left, time.right, tr.top, STR_JUST_DATE_TINY, TC_GREEN); } else { SetDParam(0, _date + (arr_dep[i / 2].arrival + offset) / DAY_TICKS); - DrawString(time_left, time_right, y, STR_JUST_DATE_TINY, + DrawString(time.left, time.right, tr.top, STR_JUST_DATE_TINY, show_late ? TC_RED : i == selected ? TC_WHITE : TC_BLACK); } } } else { if (arr_dep[i / 2].departure != INVALID_TICKS) { - DrawString(abbr_left, abbr_right, y, STR_TIMETABLE_DEPARTURE_ABBREVIATION, i == selected ? TC_WHITE : TC_BLACK); + DrawString(abbr.left, abbr.right, tr.top, STR_TIMETABLE_DEPARTURE_ABBREVIATION, i == selected ? TC_WHITE : TC_BLACK); SetDParam(0, _date + (arr_dep[i/2].departure + offset) / DAY_TICKS); - DrawString(time_left, time_right, y, STR_JUST_DATE_TINY, + DrawString(time.left, time.right, tr.top, STR_JUST_DATE_TINY, show_late ? TC_RED : i == selected ? TC_WHITE : TC_BLACK); } } - y += FONT_HEIGHT_NORMAL; + tr.top += FONT_HEIGHT_NORMAL; } break; } case WID_VT_SUMMARY_PANEL: { - int y = r.top + WD_FRAMERECT_TOP; + Rect tr = r.Shrink(WidgetDimensions::scaled.framerect); Ticks total_time = v->orders != nullptr ? v->orders->GetTimetableDurationIncomplete() : 0; if (total_time != 0) { SetTimetableParams(0, 1, total_time); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, v->orders->IsCompleteTimetable() ? STR_TIMETABLE_TOTAL_TIME : STR_TIMETABLE_TOTAL_TIME_INCOMPLETE); + DrawString(tr, v->orders->IsCompleteTimetable() ? STR_TIMETABLE_TOTAL_TIME : STR_TIMETABLE_TOTAL_TIME_INCOMPLETE); } - y += FONT_HEIGHT_NORMAL; + tr.top += FONT_HEIGHT_NORMAL; if (v->timetable_start != 0) { /* We are running towards the first station so we can start the * timetable at the given time. */ SetDParam(0, STR_JUST_DATE_TINY); SetDParam(1, v->timetable_start); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_TIMETABLE_STATUS_START_AT); + DrawString(tr, STR_TIMETABLE_STATUS_START_AT); } else if (!HasBit(v->vehicle_flags, VF_TIMETABLE_STARTED)) { /* We aren't running on a timetable yet, so how can we be "on time" * when we aren't even "on service"/"on duty"? */ - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_TIMETABLE_STATUS_NOT_STARTED); + DrawString(tr, STR_TIMETABLE_STATUS_NOT_STARTED); } else if (v->lateness_counter == 0 || (!_settings_client.gui.timetable_in_ticks && v->lateness_counter / DAY_TICKS == 0)) { - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_TIMETABLE_STATUS_ON_TIME); + DrawString(tr, STR_TIMETABLE_STATUS_ON_TIME); } else { SetTimetableParams(0, 1, abs(v->lateness_counter)); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, v->lateness_counter < 0 ? STR_TIMETABLE_STATUS_EARLY : STR_TIMETABLE_STATUS_LATE); + DrawString(tr, v->lateness_counter < 0 ? STR_TIMETABLE_STATUS_EARLY : STR_TIMETABLE_STATUS_LATE); } break; } @@ -554,6 +553,7 @@ struct TimetableWindow : Window { } this->query_is_speed_query = false; + this->change_timetable_all = _ctrl_pressed && (order != nullptr); ShowQueryString(current, STR_TIMETABLE_CHANGE_TIME, 31, this, CS_NUMERAL, QSF_ACCEPT_UNCHANGED); break; } @@ -574,19 +574,28 @@ struct TimetableWindow : Window { } this->query_is_speed_query = true; + this->change_timetable_all = _ctrl_pressed && (order != nullptr); ShowQueryString(current, STR_TIMETABLE_CHANGE_SPEED, 31, this, CS_NUMERAL, QSF_NONE); break; } case WID_VT_CLEAR_TIME: { // Clear waiting time. auto [order_id, mtf] = PackTimetableArgs(v, this->sel_index, false); - Command::Post(STR_ERROR_CAN_T_TIMETABLE_VEHICLE, v->index, order_id, mtf, 0); + if (_ctrl_pressed) { + Command::Post(STR_ERROR_CAN_T_TIMETABLE_VEHICLE, v->index, mtf, 0); + } else { + Command::Post(STR_ERROR_CAN_T_TIMETABLE_VEHICLE, v->index, order_id, mtf, 0); + } break; } case WID_VT_CLEAR_SPEED: { // Clear max speed button. auto [order_id, mtf] = PackTimetableArgs(v, this->sel_index, true); - Command::Post(STR_ERROR_CAN_T_TIMETABLE_VEHICLE, v->index, order_id, mtf, UINT16_MAX); + if (_ctrl_pressed) { + Command::Post(STR_ERROR_CAN_T_TIMETABLE_VEHICLE, v->index, mtf, UINT16_MAX); + } else { + Command::Post(STR_ERROR_CAN_T_TIMETABLE_VEHICLE, v->index, order_id, mtf, UINT16_MAX); + } break; } @@ -625,13 +634,18 @@ struct TimetableWindow : Window { } auto [order_id, mtf] = PackTimetableArgs(v, this->sel_index, this->query_is_speed_query); - Command::Post(STR_ERROR_CAN_T_TIMETABLE_VEHICLE, v->index, order_id, mtf, std::min(val, UINT16_MAX)); + + if (this->change_timetable_all) { + Command::Post(STR_ERROR_CAN_T_TIMETABLE_VEHICLE, v->index, mtf, std::min(val, UINT16_MAX)); + } else { + Command::Post(STR_ERROR_CAN_T_TIMETABLE_VEHICLE, v->index, order_id, mtf, std::min(val, UINT16_MAX)); + } } void OnResize() override { /* Update the scroll bar */ - this->vscroll->SetCapacityFromWidget(this, WID_VT_TIMETABLE_PANEL, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM); + this->vscroll->SetCapacityFromWidget(this, WID_VT_TIMETABLE_PANEL, WidgetDimensions::scaled.framerect.Vertical()); } /** diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index 8c2db4d887..c0967054b7 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -33,6 +33,7 @@ #include "console_gui.h" #include "news_gui.h" #include "ai/ai_gui.hpp" +#include "game/game_gui.hpp" #include "tilehighlight_func.h" #include "smallmap_gui.h" #include "graph_gui.h" @@ -50,6 +51,8 @@ #include "guitimer_func.h" #include "screenshot_gui.h" #include "misc_cmd.h" +#include "league_gui.h" +#include "league_base.h" #include "widgets/toolbar_widget.h" @@ -94,21 +97,22 @@ public: DropDownListCheckedItem(StringID string, int result, bool masked, bool checked) : DropDownListStringItem(string, result, masked), checked(checked) { - this->checkmark_width = GetStringBoundingBox(STR_JUST_CHECKMARK).width + 3; + this->checkmark_width = GetStringBoundingBox(STR_JUST_CHECKMARK).width + WidgetDimensions::scaled.hsep_wide; } - uint Width() const + uint Width() const override { return DropDownListStringItem::Width() + this->checkmark_width; } - void Draw(int left, int right, int top, int bottom, bool sel, Colours bg_colour) const + void Draw(const Rect &r, bool sel, Colours bg_colour) const override { bool rtl = _current_text_dir == TD_RTL; + Rect tr = r.Shrink(WidgetDimensions::scaled.dropdowntext, RectPadding::zero); if (this->checked) { - DrawString(left + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, top, STR_JUST_CHECKMARK, sel ? TC_WHITE : TC_BLACK); + DrawString(tr, STR_JUST_CHECKMARK, sel ? TC_WHITE : TC_BLACK); } - DrawString(left + WD_FRAMERECT_LEFT + (rtl ? 0 : this->checkmark_width), right - WD_FRAMERECT_RIGHT - (rtl ? this->checkmark_width : 0), top, this->String(), sel ? TC_WHITE : TC_BLACK); + DrawString(tr.Indent(this->checkmark_width, rtl), this->String(), sel ? TC_WHITE : TC_BLACK); } }; @@ -137,15 +141,15 @@ public: CompanyID company = (CompanyID)this->result; SetDParam(0, company); SetDParam(1, company); - return GetStringBoundingBox(STR_COMPANY_NAME_COMPANY_NUM).width + this->icon_size.width + this->lock_size.width + 6; + return GetStringBoundingBox(STR_COMPANY_NAME_COMPANY_NUM).width + this->icon_size.width + this->lock_size.width + WidgetDimensions::scaled.dropdowntext.Horizontal() + WidgetDimensions::scaled.hsep_wide; } uint Height(uint width) const override { - return std::max(std::max(this->icon_size.height, this->lock_size.height) + 2U, (uint)FONT_HEIGHT_NORMAL); + return std::max(std::max(this->icon_size.height, this->lock_size.height) + WidgetDimensions::scaled.imgbtn.Vertical(), (uint)FONT_HEIGHT_NORMAL); } - void Draw(int left, int right, int top, int bottom, bool sel, Colours bg_colour) const override + void Draw(const Rect &r, bool sel, Colours bg_colour) const override { CompanyID company = (CompanyID)this->result; bool rtl = _current_text_dir == TD_RTL; @@ -153,13 +157,14 @@ public: /* It's possible the company is deleted while the dropdown is open */ if (!Company::IsValidID(company)) return; - int icon_offset = (bottom - top - icon_size.height) / 2; - int text_offset = (bottom - top - FONT_HEIGHT_NORMAL) / 2; - int lock_offset = (bottom - top - lock_size.height) / 2; + Rect tr = r.Shrink(WidgetDimensions::scaled.dropdowntext, RectPadding::zero); + int icon_y = CenterBounds(r.top, r.bottom, icon_size.height); + int text_y = CenterBounds(r.top, r.bottom, FONT_HEIGHT_NORMAL); + int lock_y = CenterBounds(r.top, r.bottom, lock_size.height); - DrawCompanyIcon(company, rtl ? right - this->icon_size.width - WD_FRAMERECT_RIGHT : left + WD_FRAMERECT_LEFT, top + icon_offset); + DrawCompanyIcon(company, tr.WithWidth(this->icon_size.width, rtl).left, icon_y); if (NetworkCompanyIsPassworded(company)) { - DrawSprite(SPR_LOCK, PAL_NONE, rtl ? left + WD_FRAMERECT_LEFT : right - this->lock_size.width - WD_FRAMERECT_RIGHT, top + lock_offset); + DrawSprite(SPR_LOCK, PAL_NONE, tr.WithWidth(this->lock_size.width, !rtl).left, lock_y); } SetDParam(0, company); @@ -170,7 +175,8 @@ public: } else { col = sel ? TC_WHITE : TC_BLACK; } - DrawString(left + WD_FRAMERECT_LEFT + (rtl ? 3 + this->lock_size.width : 3 + this->icon_size.width), right - WD_FRAMERECT_RIGHT - (rtl ? 3 + this->icon_size.width : 3 + this->lock_size.width), top + text_offset, STR_COMPANY_NAME_COMPANY_NUM, col); + tr = tr.Indent(this->icon_size.width + WidgetDimensions::scaled.hsep_normal, rtl).Indent(this->lock_size.width + WidgetDimensions::scaled.hsep_normal, !rtl); + DrawString(tr.left, tr.right, text_y, STR_COMPANY_NAME_COMPANY_NUM, col); } }; @@ -246,7 +252,6 @@ static void PopupMainCompanyToolbMenu(Window *w, int widget, int grey = 0) PopupMainToolbMenu(w, widget, std::move(list), _local_company == COMPANY_SPECTATOR ? (widget == WID_TN_COMPANIES ? CTMN_CLIENT_LIST : CTMN_SPECTATOR) : (int)_local_company); } - static ToolbarMode _toolbar_mode; static CallBackFunction SelectSignTool() @@ -292,7 +297,8 @@ static CallBackFunction ToolbarFastForwardClick(Window *w) enum OptionMenuEntries { OME_GAMEOPTIONS, OME_SETTINGS, - OME_SCRIPT_SETTINGS, + OME_AI_SETTINGS, + OME_GAMESCRIPT_SETTINGS, OME_NEWGRFSETTINGS, OME_TRANSPARENCIES, OME_SHOW_TOWNNAMES, @@ -320,7 +326,10 @@ static CallBackFunction ToolbarOptionsClick(Window *w) /* Changes to the per-AI settings don't get send from the server to the clients. Clients get * the settings once they join but never update it. As such don't show the window at all * to network clients. */ - if (!_networking || _network_server) list.emplace_back(new DropDownListStringItem(STR_SETTINGS_MENU_SCRIPT_SETTINGS, OME_SCRIPT_SETTINGS, false)); + if (!_networking || _network_server) { + list.emplace_back(new DropDownListStringItem(STR_SETTINGS_MENU_AI_SETTINGS, OME_AI_SETTINGS, false)); + list.emplace_back(new DropDownListStringItem(STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS, OME_GAMESCRIPT_SETTINGS, false)); + } list.emplace_back(new DropDownListStringItem(STR_SETTINGS_MENU_NEWGRF_SETTINGS, OME_NEWGRFSETTINGS, false)); list.emplace_back(new DropDownListStringItem(STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS, OME_TRANSPARENCIES, false)); list.emplace_back(new DropDownListItem(-1, false)); @@ -350,7 +359,8 @@ static CallBackFunction MenuClickSettings(int index) switch (index) { case OME_GAMEOPTIONS: ShowGameOptions(); return CBF_NONE; case OME_SETTINGS: ShowGameSettings(); return CBF_NONE; - case OME_SCRIPT_SETTINGS: ShowAIConfigWindow(); return CBF_NONE; + case OME_AI_SETTINGS: ShowAIConfigWindow(); return CBF_NONE; + case OME_GAMESCRIPT_SETTINGS: ShowGSConfigWindow(); return CBF_NONE; case OME_NEWGRFSETTINGS: ShowNewGRFSettings(!_networking && _settings_client.gui.UserIsAllowedToChangeNewGRFs(), true, true, &_grfconfig); return CBF_NONE; case OME_TRANSPARENCIES: ShowTransparencyToolbar(); break; @@ -663,59 +673,96 @@ static CallBackFunction MenuClickGoal(int index) return CBF_NONE; } -/* --- Graphs button menu --- */ +/* --- Graphs and League Table button menu --- */ + +/** + * Enum for the League Toolbar's and Graph Toolbar's related buttons. + * Use continuous numbering as League Toolbar can be combined into the Graph Toolbar. + */ +static const int GRMN_OPERATING_PROFIT_GRAPH = -1; ///< Show operating profit graph +static const int GRMN_INCOME_GRAPH = -2; ///< Show income graph +static const int GRMN_DELIVERED_CARGO_GRAPH = -3; ///< Show delivered cargo graph +static const int GRMN_PERFORMANCE_HISTORY_GRAPH = -4; ///< Show performance history graph +static const int GRMN_COMPANY_VALUE_GRAPH = -5; ///< Show company value graph +static const int GRMN_CARGO_PAYMENT_RATES = -6; ///< Show cargo payment rates graph +static const int LTMN_PERFORMANCE_LEAGUE = -7; ///< Show default league table +static const int LTMN_PERFORMANCE_RATING = -8; ///< Show detailed performance rating +static const int LTMN_HIGHSCORE = -9; ///< Show highscrore table + +static void AddDropDownLeagueTableOptions(DropDownList &list) { + if (LeagueTable::GetNumItems() > 0) { + for (LeagueTable *lt : LeagueTable::Iterate()) { + list.emplace_back(new DropDownListCharStringItem(lt->title, lt->index, false)); + } + } else { + list.emplace_back(new DropDownListStringItem(STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE, LTMN_PERFORMANCE_LEAGUE, false)); + list.emplace_back(new DropDownListStringItem(STR_GRAPH_MENU_DETAILED_PERFORMANCE_RATING, LTMN_PERFORMANCE_RATING, false)); + if (!_networking) { + list.emplace_back(new DropDownListStringItem(STR_GRAPH_MENU_HIGHSCORE, LTMN_HIGHSCORE, false)); + } + } +} static CallBackFunction ToolbarGraphsClick(Window *w) { - PopupMainToolbMenu(w, WID_TN_GRAPHS, STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH, (_toolbar_mode == TB_NORMAL) ? 6 : 8); + DropDownList list; + + list.emplace_back(new DropDownListStringItem(STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH, GRMN_OPERATING_PROFIT_GRAPH, false)); + list.emplace_back(new DropDownListStringItem(STR_GRAPH_MENU_INCOME_GRAPH, GRMN_INCOME_GRAPH, false)); + list.emplace_back(new DropDownListStringItem(STR_GRAPH_MENU_DELIVERED_CARGO_GRAPH, GRMN_DELIVERED_CARGO_GRAPH, false)); + list.emplace_back(new DropDownListStringItem(STR_GRAPH_MENU_PERFORMANCE_HISTORY_GRAPH, GRMN_PERFORMANCE_HISTORY_GRAPH, false)); + list.emplace_back(new DropDownListStringItem(STR_GRAPH_MENU_COMPANY_VALUE_GRAPH, GRMN_COMPANY_VALUE_GRAPH, false)); + list.emplace_back(new DropDownListStringItem(STR_GRAPH_MENU_CARGO_PAYMENT_RATES, GRMN_CARGO_PAYMENT_RATES, false)); + + if (_toolbar_mode != TB_NORMAL) AddDropDownLeagueTableOptions(list); + + ShowDropDownList(w, std::move(list), GRMN_OPERATING_PROFIT_GRAPH, WID_TN_GRAPHS, 140, true, true); + if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP); + + return CBF_NONE; +} + +static CallBackFunction ToolbarLeagueClick(Window *w) +{ + DropDownList list; + + AddDropDownLeagueTableOptions(list); + + int selected = list[0]->result; + ShowDropDownList(w, std::move(list), selected, WID_TN_LEAGUE, 140, true, true); + if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP); + return CBF_NONE; } /** - * Handle click on the entry in the Graphs menu. + * Handle click on the entry in the Graphs or CompanyLeague. * * @param index Graph to show. * @return #CBF_NONE */ -static CallBackFunction MenuClickGraphs(int index) +static CallBackFunction MenuClickGraphsOrLeague(int index) { switch (index) { - case 0: ShowOperatingProfitGraph(); break; - case 1: ShowIncomeGraph(); break; - case 2: ShowDeliveredCargoGraph(); break; - case 3: ShowPerformanceHistoryGraph(); break; - case 4: ShowCompanyValueGraph(); break; - case 5: ShowCargoPaymentRates(); break; - /* functions for combined graphs/league button */ - case 6: ShowCompanyLeagueTable(); break; - case 7: ShowPerformanceRatingDetail(); break; + case GRMN_OPERATING_PROFIT_GRAPH: ShowOperatingProfitGraph(); break; + case GRMN_INCOME_GRAPH: ShowIncomeGraph(); break; + case GRMN_DELIVERED_CARGO_GRAPH: ShowDeliveredCargoGraph(); break; + case GRMN_PERFORMANCE_HISTORY_GRAPH: ShowPerformanceHistoryGraph(); break; + case GRMN_COMPANY_VALUE_GRAPH: ShowCompanyValueGraph(); break; + case GRMN_CARGO_PAYMENT_RATES: ShowCargoPaymentRates(); break; + case LTMN_PERFORMANCE_LEAGUE: ShowPerformanceLeagueTable(); break; + case LTMN_PERFORMANCE_RATING: ShowPerformanceRatingDetail(); break; + case LTMN_HIGHSCORE: ShowHighscoreTable(); break; + default: { + if (LeagueTable::IsValidID(index)) { + ShowScriptLeagueTable((LeagueTableID)index); + } + } } return CBF_NONE; } -/* --- League button menu --- */ -static CallBackFunction ToolbarLeagueClick(Window *w) -{ - PopupMainToolbMenu(w, WID_TN_LEAGUE, STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE, _networking ? 2 : 3); - return CBF_NONE; -} - -/** - * Handle click on the entry in the CompanyLeague menu. - * - * @param index Menu entry number. - * @return #CBF_NONE - */ -static CallBackFunction MenuClickLeague(int index) -{ - switch (index) { - case 0: ShowCompanyLeagueTable(); break; - case 1: ShowPerformanceRatingDetail(); break; - case 2: ShowHighscoreTable(); break; - } - return CBF_NONE; -} /* --- Industries button menu --- */ @@ -1290,8 +1337,8 @@ static MenuClickedProc * const _menu_clicked_procs[] = { MenuClickCompany, // 9 MenuClickStory, // 10 MenuClickGoal, // 11 - MenuClickGraphs, // 12 - MenuClickLeague, // 13 + MenuClickGraphsOrLeague, // 12 + MenuClickGraphsOrLeague, // 13 MenuClickIndustry, // 14 MenuClickShowTrains, // 15 MenuClickShowRoad, // 16 @@ -1345,10 +1392,10 @@ public: /* First initialise some variables... */ for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) { child_wid->SetupSmallestSize(w, init_array); - this->smallest_y = std::max(this->smallest_y, child_wid->smallest_y + child_wid->padding_top + child_wid->padding_bottom); + this->smallest_y = std::max(this->smallest_y, child_wid->smallest_y + child_wid->padding.Vertical()); if (this->IsButton(child_wid->type)) { nbuttons++; - this->smallest_x = std::max(this->smallest_x, child_wid->smallest_x + child_wid->padding_left + child_wid->padding_right); + this->smallest_x = std::max(this->smallest_x, child_wid->smallest_x + child_wid->padding.Horizontal()); } else if (child_wid->type == NWID_SPACER) { this->spacers++; } @@ -2011,7 +2058,7 @@ struct MainToolbarWindow : Window { case MTHK_STORY: ShowStoryBook(_local_company); break; case MTHK_GOAL: ShowGoalsList(_local_company); break; case MTHK_GRAPHS: ShowOperatingProfitGraph(); break; - case MTHK_LEAGUE: ShowCompanyLeagueTable(); break; + case MTHK_LEAGUE: ShowFirstLeagueTable(); break; case MTHK_INDUSTRIES: ShowBuildIndustryWindow(); break; case MTHK_TRAIN_LIST: ShowVehicleListWindow(_local_company, VEH_TRAIN); break; case MTHK_ROADVEH_LIST: ShowVehicleListWindow(_local_company, VEH_ROAD); break; @@ -2349,10 +2396,10 @@ struct ScenarioEditorToolbarWindow : Window { { switch (widget) { case WID_TE_SPACER: { - int height = r.bottom - r.top; + int height = r.Height(); if (height > 2 * FONT_HEIGHT_NORMAL) { - DrawString(r.left, r.right, (height + 1) / 2 - FONT_HEIGHT_NORMAL, STR_SCENEDIT_TOOLBAR_OPENTTD, TC_FROMSTRING, SA_HOR_CENTER); - DrawString(r.left, r.right, (height + 1) / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, SA_HOR_CENTER); + DrawString(r.left, r.right, height / 2 - FONT_HEIGHT_NORMAL, STR_SCENEDIT_TOOLBAR_OPENTTD, TC_FROMSTRING, SA_HOR_CENTER); + DrawString(r.left, r.right, height / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, SA_HOR_CENTER); } else { DrawString(r.left, r.right, (height - FONT_HEIGHT_NORMAL) / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, SA_HOR_CENTER); } @@ -2365,7 +2412,7 @@ struct ScenarioEditorToolbarWindow : Window { { switch (widget) { case WID_TE_SPACER: - size->width = std::max(GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_OPENTTD).width, GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR).width) + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; + size->width = std::max(GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_OPENTTD).width, GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR).width) + padding.width; break; case WID_TE_DATE: diff --git a/src/town.h b/src/town.h index 76b6e9c15c..2dda7cf2e9 100644 --- a/src/town.h +++ b/src/town.h @@ -200,18 +200,6 @@ Town *CalcClosestTownFromTile(TileIndex tile, uint threshold = UINT_MAX); void ResetHouses(); -void ClearTownHouse(Town *t, TileIndex tile); -void UpdateTownMaxPass(Town *t); -void UpdateTownRadius(Town *t); -CommandCost CheckIfAuthorityAllowsNewStation(TileIndex tile, DoCommandFlag flags); -Town *ClosestTownFromTile(TileIndex tile, uint threshold); -void ChangeTownRating(Town *t, int add, int max, DoCommandFlag flags); -HouseZonesBits GetTownRadiusGroup(const Town *t, TileIndex tile); -void SetTownRatingTestMode(bool mode); -uint GetMaskOfTownActions(int *nump, CompanyID cid, const Town *t); -bool GenerateTowns(TownLayout layout); -const CargoSpec *FindFirstCargoWithTownEffect(TownEffect effect); - /** Town actions of a company. */ enum TownActions { TACT_NONE = 0x00, ///< Empty action set. @@ -234,6 +222,18 @@ enum TownActions { }; DECLARE_ENUM_AS_BIT_SET(TownActions) +void ClearTownHouse(Town *t, TileIndex tile); +void UpdateTownMaxPass(Town *t); +void UpdateTownRadius(Town *t); +CommandCost CheckIfAuthorityAllowsNewStation(TileIndex tile, DoCommandFlag flags); +Town *ClosestTownFromTile(TileIndex tile, uint threshold); +void ChangeTownRating(Town *t, int add, int max, DoCommandFlag flags); +HouseZonesBits GetTownRadiusGroup(const Town *t, TileIndex tile); +void SetTownRatingTestMode(bool mode); +TownActions GetMaskOfTownActions(CompanyID cid, const Town *t); +bool GenerateTowns(TownLayout layout); +const CargoSpec *FindFirstCargoWithTownEffect(TownEffect effect); + extern const byte _town_action_costs[TACT_COUNT]; /** diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index a07946029c..280fa4efea 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -408,7 +408,7 @@ void Town::UpdateVirtCoord() SetDParam(1, this->cache.population); this->cache.sign.UpdatePosition(pt.x, pt.y - 24 * ZOOM_LVL_BASE, _settings_client.gui.population_in_label ? STR_VIEWPORT_TOWN_POP : STR_VIEWPORT_TOWN, - STR_VIEWPORT_TOWN); + STR_VIEWPORT_TOWN_TINY_WHITE); _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeTown(this->index)); @@ -3293,21 +3293,19 @@ static TownActionProc * const _town_action_proc[] = { /** * Get a list of available actions to do at a town. - * @param nump if not nullptr add put the number of available actions in it * @param cid the company that is querying the town * @param t the town that is queried * @return bitmasked value of enabled actions */ -uint GetMaskOfTownActions(int *nump, CompanyID cid, const Town *t) +TownActions GetMaskOfTownActions(CompanyID cid, const Town *t) { - int num = 0; TownActions buttons = TACT_NONE; /* Spectators and unwanted have no options */ if (cid != COMPANY_SPECTATOR && !(_settings_game.economy.bribe && t->unwanted[cid])) { - /* Things worth more than this are not shown */ - Money avail = Company::Get(cid)->money + _price[PR_STATION_VALUE] * 200; + /* Actions worth more than this are not able to be performed */ + Money avail = Company::Get(cid)->money; /* Check the action bits for validity and * if they are valid add them */ @@ -3331,12 +3329,10 @@ uint GetMaskOfTownActions(int *nump, CompanyID cid, const Town *t) if (avail >= _town_action_costs[i] * _price[PR_TOWN_ACTION] >> 8) { buttons |= cur; - num++; } } } - if (nump != nullptr) *nump = num; return buttons; } @@ -3354,7 +3350,7 @@ CommandCost CmdDoTownAction(DoCommandFlag flags, TownID town_id, uint8 action) Town *t = Town::GetIfValid(town_id); if (t == nullptr || action >= lengthof(_town_action_proc)) return CMD_ERROR; - if (!HasBit(GetMaskOfTownActions(nullptr, _current_company, t), action)) return CMD_ERROR; + if (!HasBit(GetMaskOfTownActions(_current_company, t), action)) return CMD_ERROR; CommandCost cost(EXPENSES_OTHER, _price[PR_TOWN_ACTION] * _town_action_costs[action] >> 8); diff --git a/src/town_gui.cpp b/src/town_gui.cpp index 216de7e79a..e44531a5cb 100644 --- a/src/town_gui.cpp +++ b/src/town_gui.cpp @@ -50,16 +50,13 @@ static const NWidgetPart _nested_town_authority_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN, WID_TA_CAPTION), SetDataTip(STR_LOCAL_AUTHORITY_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), - NWidget(WWT_TEXTBTN, COLOUR_BROWN, WID_TA_ZONE_BUTTON), SetMinimalSize(50, 0), SetMinimalTextLines(1, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM + 2), SetDataTip(STR_LOCAL_AUTHORITY_ZONE, STR_LOCAL_AUTHORITY_ZONE_TOOLTIP), + NWidget(WWT_TEXTBTN, COLOUR_BROWN, WID_TA_ZONE_BUTTON), SetMinimalSize(50, 0), SetMinimalTextLines(1, WidgetDimensions::unscaled.framerect.Vertical() + 2), SetDataTip(STR_LOCAL_AUTHORITY_ZONE, STR_LOCAL_AUTHORITY_ZONE_TOOLTIP), NWidget(WWT_SHADEBOX, COLOUR_BROWN), NWidget(WWT_DEFSIZEBOX, COLOUR_BROWN), NWidget(WWT_STICKYBOX, COLOUR_BROWN), EndContainer(), NWidget(WWT_PANEL, COLOUR_BROWN, WID_TA_RATING_INFO), SetMinimalSize(317, 92), SetResize(1, 1), EndContainer(), - NWidget(NWID_HORIZONTAL), - NWidget(WWT_PANEL, COLOUR_BROWN, WID_TA_COMMAND_LIST), SetMinimalSize(305, 52), SetResize(1, 0), SetDataTip(0x0, STR_LOCAL_AUTHORITY_ACTIONS_TOOLTIP), SetScrollbar(WID_TA_SCROLLBAR), EndContainer(), - NWidget(NWID_VSCROLLBAR, COLOUR_BROWN, WID_TA_SCROLLBAR), - EndContainer(), + NWidget(WWT_PANEL, COLOUR_BROWN, WID_TA_COMMAND_LIST), SetMinimalSize(317, 52), SetResize(1, 0), SetDataTip(0x0, STR_LOCAL_AUTHORITY_ACTIONS_TOOLTIP), EndContainer(), NWidget(WWT_PANEL, COLOUR_BROWN, WID_TA_ACTION_INFO), SetMinimalSize(317, 52), SetResize(1, 0), EndContainer(), NWidget(NWID_HORIZONTAL), NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_TA_EXECUTE), SetMinimalSize(317, 12), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_LOCAL_AUTHORITY_DO_IT_BUTTON, STR_LOCAL_AUTHORITY_DO_IT_TOOLTIP), @@ -72,22 +69,25 @@ struct TownAuthorityWindow : Window { private: Town *town; ///< Town being displayed. int sel_index; ///< Currently selected town action, \c 0 to \c TACT_COUNT-1, \c -1 means no action selected. - Scrollbar *vscroll; uint displayed_actions_on_previous_painting; ///< Actions that were available on the previous call to OnPaint() + TownActions enabled_actions; ///< Actions that are enabled in settings. + TownActions available_actions; ///< Actions that are available to execute for the current company. + + Dimension icon_size; ///< Dimensions of company icon + Dimension exclusive_size; ///< Dimensions of exlusive icon /** * Get the position of the Nth set bit. * * If there is no Nth bit set return -1 * - * @param bits The value to search in * @param n The Nth set bit from which we want to know the position - * @return The position of the Nth set bit + * @return The position of the Nth set bit, or -1 if no Nth bit set. */ - static int GetNthSetBit(uint32 bits, int n) + int GetNthSetBit(int n) { if (n >= 0) { - for (uint i : SetBitIterator(bits)) { + for (uint i : SetBitIterator(this->enabled_actions)) { n--; if (n < 0) return i; } @@ -95,93 +95,126 @@ private: return -1; } + /** + * Gets all town authority actions enabled in settings. + * + * @return Bitmask of actions enabled in the settings. + */ + static TownActions GetEnabledActions() + { + TownActions enabled = TACT_ALL; + + if (!_settings_game.economy.fund_roads) CLRBITS(enabled, TACT_ROAD_REBUILD); + if (!_settings_game.economy.fund_buildings) CLRBITS(enabled, TACT_FUND_BUILDINGS); + if (!_settings_game.economy.exclusive_rights) CLRBITS(enabled, TACT_BUY_RIGHTS); + if (!_settings_game.economy.bribe) CLRBITS(enabled, TACT_BRIBE); + + return enabled; + } + public: - TownAuthorityWindow(WindowDesc *desc, WindowNumber window_number) : Window(desc), sel_index(-1), displayed_actions_on_previous_painting(0) + TownAuthorityWindow(WindowDesc *desc, WindowNumber window_number) : Window(desc), sel_index(-1), displayed_actions_on_previous_painting(0), available_actions(TACT_NONE) { this->town = Town::Get(window_number); + this->enabled_actions = GetEnabledActions(); this->InitNested(window_number); - this->vscroll = this->GetScrollbar(WID_TA_SCROLLBAR); - this->vscroll->SetCapacity((this->GetWidget(WID_TA_COMMAND_LIST)->current_y - WD_FRAMERECT_TOP - WD_FRAMERECT_BOTTOM) / FONT_HEIGHT_NORMAL); + } + + void OnInit() override + { + this->icon_size = GetSpriteSize(SPR_COMPANY_ICON); + this->exclusive_size = GetSpriteSize(SPR_EXCLUSIVE_TRANSPORT); } void OnPaint() override { - int numact; - uint buttons = GetMaskOfTownActions(&numact, _local_company, this->town); - if (buttons != displayed_actions_on_previous_painting) this->SetDirty(); - displayed_actions_on_previous_painting = buttons; - - this->vscroll->SetCount(numact + 1); - - if (this->sel_index != -1 && !HasBit(buttons, this->sel_index)) { - this->sel_index = -1; - } + this->available_actions = GetMaskOfTownActions(_local_company, this->town); + if (this->available_actions != displayed_actions_on_previous_painting) this->SetDirty(); + displayed_actions_on_previous_painting = this->available_actions; this->SetWidgetLoweredState(WID_TA_ZONE_BUTTON, this->town->show_zone); - this->SetWidgetDisabledState(WID_TA_EXECUTE, this->sel_index == -1); + this->SetWidgetDisabledState(WID_TA_EXECUTE, (this->sel_index == -1) || !HasBit(this->available_actions, this->sel_index)); this->DrawWidgets(); - if (!this->IsShaded()) this->DrawRatings(); + if (!this->IsShaded()) + { + this->DrawRatings(); + this->DrawActions(); + } } /** Draw the contents of the ratings panel. May request a resize of the window if the contents does not fit. */ void DrawRatings() { - NWidgetBase *nwid = this->GetWidget(WID_TA_RATING_INFO); - uint left = nwid->pos_x + WD_FRAMERECT_LEFT; - uint right = nwid->pos_x + nwid->current_x - 1 - WD_FRAMERECT_RIGHT; + Rect r = this->GetWidget(WID_TA_RATING_INFO)->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect); - uint y = nwid->pos_y + WD_FRAMERECT_TOP; + int text_y_offset = (this->resize.step_height - FONT_HEIGHT_NORMAL) / 2; + int icon_y_offset = (this->resize.step_height - this->icon_size.height) / 2; + int exclusive_y_offset = (this->resize.step_height - this->exclusive_size.height) / 2; - DrawString(left, right, y, STR_LOCAL_AUTHORITY_COMPANY_RATINGS); - y += FONT_HEIGHT_NORMAL; - - Dimension icon_size = GetSpriteSize(SPR_COMPANY_ICON); - int icon_width = icon_size.width; - int icon_y_offset = (FONT_HEIGHT_NORMAL - icon_size.height) / 2; - - Dimension exclusive_size = GetSpriteSize(SPR_EXCLUSIVE_TRANSPORT); - int exclusive_width = exclusive_size.width; - int exclusive_y_offset = (FONT_HEIGHT_NORMAL - exclusive_size.height) / 2; + DrawString(r.left, r.right, r.top + text_y_offset, STR_LOCAL_AUTHORITY_COMPANY_RATINGS); + r.top += this->resize.step_height; bool rtl = _current_text_dir == TD_RTL; - uint text_left = left + (rtl ? 0 : icon_width + exclusive_width + 4); - uint text_right = right - (rtl ? icon_width + exclusive_width + 4 : 0); - uint icon_left = rtl ? right - icon_width : left; - uint exclusive_left = rtl ? right - icon_width - exclusive_width - 2 : left + icon_width + 2; + Rect icon = r.WithWidth(this->icon_size.width, rtl); + Rect exclusive = r.Indent(this->icon_size.width + WidgetDimensions::scaled.hsep_normal, rtl).WithWidth(this->exclusive_size.width, rtl); + Rect text = r.Indent(this->icon_size.width + WidgetDimensions::scaled.hsep_normal + this->exclusive_size.width + WidgetDimensions::scaled.hsep_normal, rtl); /* Draw list of companies */ for (const Company *c : Company::Iterate()) { if ((HasBit(this->town->have_ratings, c->index) || this->town->exclusivity == c->index)) { - DrawCompanyIcon(c->index, icon_left, y + icon_y_offset); + DrawCompanyIcon(c->index, icon.left, text.top + icon_y_offset); SetDParam(0, c->index); SetDParam(1, c->index); - int r = this->town->ratings[c->index]; + int rating = this->town->ratings[c->index]; StringID str = STR_CARGO_RATING_APPALLING; - if (r > RATING_APPALLING) str++; - if (r > RATING_VERYPOOR) str++; - if (r > RATING_POOR) str++; - if (r > RATING_MEDIOCRE) str++; - if (r > RATING_GOOD) str++; - if (r > RATING_VERYGOOD) str++; - if (r > RATING_EXCELLENT) str++; + if (rating > RATING_APPALLING) str++; + if (rating > RATING_VERYPOOR) str++; + if (rating > RATING_POOR) str++; + if (rating > RATING_MEDIOCRE) str++; + if (rating > RATING_GOOD) str++; + if (rating > RATING_VERYGOOD) str++; + if (rating > RATING_EXCELLENT) str++; SetDParam(2, str); if (this->town->exclusivity == c->index) { - DrawSprite(SPR_EXCLUSIVE_TRANSPORT, COMPANY_SPRITE_COLOUR(c->index), exclusive_left, y + exclusive_y_offset); + DrawSprite(SPR_EXCLUSIVE_TRANSPORT, COMPANY_SPRITE_COLOUR(c->index), exclusive.left, text.top + exclusive_y_offset); } - DrawString(text_left, text_right, y, STR_LOCAL_AUTHORITY_COMPANY_RATING); - y += FONT_HEIGHT_NORMAL; + DrawString(text.left, text.right, text.top + text_y_offset, STR_LOCAL_AUTHORITY_COMPANY_RATING); + text.top += this->resize.step_height; } } - y = y + WD_FRAMERECT_BOTTOM - nwid->pos_y; // Compute needed size of the widget. - if (y > nwid->current_y) { + text.bottom = text.top - 1; + if (text.bottom > r.bottom) { /* If the company list is too big to fit, mark ourself dirty and draw again. */ - ResizeWindow(this, 0, y - nwid->current_y, false); + ResizeWindow(this, 0, text.bottom - r.bottom, false); + } + } + + /** Draws the contents of the actions panel. May re-initialise window to resize panel, if the list does not fit. */ + void DrawActions() + { + Rect r = this->GetWidget(WID_TA_COMMAND_LIST)->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect); + + DrawString(r, STR_LOCAL_AUTHORITY_ACTIONS_TITLE); + r.top += FONT_HEIGHT_NORMAL; + + /* Draw list of actions */ + for (int i = 0; i < TACT_COUNT; i++) { + /* Don't show actions if disabled in settings. */ + if (!HasBit(this->enabled_actions, i)) continue; + + /* Set colour of action based on ability to execute and if selected. */ + TextColour action_colour = TC_GREY | TC_NO_SHADE; + if (HasBit(this->available_actions, i)) action_colour = TC_ORANGE; + if (this->sel_index == i) action_colour = TC_WHITE; + + DrawString(r, STR_LOCAL_AUTHORITY_ACTION_SMALL_ADVERTISING_CAMPAIGN + i, action_colour); + r.top += FONT_HEIGHT_NORMAL; } } @@ -195,33 +228,15 @@ public: switch (widget) { case WID_TA_ACTION_INFO: if (this->sel_index != -1) { - SetDParam(0, _price[PR_TOWN_ACTION] * _town_action_costs[this->sel_index] >> 8); - DrawStringMultiLine(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, r.bottom - WD_FRAMERECT_BOTTOM, - STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING + this->sel_index); + Money action_cost = _price[PR_TOWN_ACTION] * _town_action_costs[this->sel_index] >> 8; + bool affordable = action_cost < Company::GetIfValid(_local_company)->money; + + SetDParam(0, action_cost); + DrawStringMultiLine(r.Shrink(WidgetDimensions::scaled.framerect), + STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING + this->sel_index, + affordable ? TC_YELLOW : TC_RED); } break; - case WID_TA_COMMAND_LIST: { - int numact; - uint buttons = GetMaskOfTownActions(&numact, _local_company, this->town); - int y = r.top + WD_FRAMERECT_TOP; - int pos = this->vscroll->GetPosition(); - - if (--pos < 0) { - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_LOCAL_AUTHORITY_ACTIONS_TITLE); - y += FONT_HEIGHT_NORMAL; - } - - for (int i = 0; buttons; i++, buttons >>= 1) { - if (pos <= -5) break; ///< Draw only the 5 fitting lines - - if ((buttons & 1) && --pos < 0) { - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, - STR_LOCAL_AUTHORITY_ACTION_SMALL_ADVERTISING_CAMPAIGN + i, this->sel_index == i ? TC_WHITE : TC_ORANGE); - y += FONT_HEIGHT_NORMAL; - } - } - break; - } } } @@ -230,31 +245,29 @@ public: switch (widget) { case WID_TA_ACTION_INFO: { assert(size->width > padding.width && size->height > padding.height); - size->width -= WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; - size->height -= WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; Dimension d = {0, 0}; for (int i = 0; i < TACT_COUNT; i++) { SetDParam(0, _price[PR_TOWN_ACTION] * _town_action_costs[i] >> 8); d = maxdim(d, GetStringMultiLineBoundingBox(STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING + i, *size)); } + d.width += padding.width; + d.height += padding.height; *size = maxdim(*size, d); - size->width += WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; - size->height += WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; break; } case WID_TA_COMMAND_LIST: - size->height = WD_FRAMERECT_TOP + 5 * FONT_HEIGHT_NORMAL + WD_FRAMERECT_BOTTOM; + size->height = (TACT_COUNT + 1) * FONT_HEIGHT_NORMAL + padding.height; size->width = GetStringBoundingBox(STR_LOCAL_AUTHORITY_ACTIONS_TITLE).width; for (uint i = 0; i < TACT_COUNT; i++ ) { size->width = std::max(size->width, GetStringBoundingBox(STR_LOCAL_AUTHORITY_ACTION_SMALL_ADVERTISING_CAMPAIGN + i).width); } - size->width += WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; + size->width += padding.width; break; case WID_TA_RATING_INFO: - resize->height = FONT_HEIGHT_NORMAL; - size->height = WD_FRAMERECT_TOP + 9 * FONT_HEIGHT_NORMAL + WD_FRAMERECT_BOTTOM; + resize->height = std::max({this->icon_size.height + WidgetDimensions::scaled.vsep_normal, this->exclusive_size.height + WidgetDimensions::scaled.vsep_normal, (uint)FONT_HEIGHT_NORMAL}); + size->height = 9 * resize->height + padding.height; break; } } @@ -275,14 +288,14 @@ public: } case WID_TA_COMMAND_LIST: { - int y = this->GetRowFromWidget(pt.y, WID_TA_COMMAND_LIST, 1, FONT_HEIGHT_NORMAL); - if (!IsInsideMM(y, 0, 5)) return; + int y = this->GetRowFromWidget(pt.y, WID_TA_COMMAND_LIST, 1, FONT_HEIGHT_NORMAL) - 1; - y = GetNthSetBit(GetMaskOfTownActions(nullptr, _local_company, this->town), y + this->vscroll->GetPosition() - 1); + y = GetNthSetBit(y); if (y >= 0) { this->sel_index = y; this->SetDirty(); } + /* When double-clicking, continue */ if (click_count == 1 || y < 0) break; FALLTHROUGH; @@ -298,6 +311,16 @@ public: { this->SetDirty(); } + + void OnInvalidateData(int data = 0, bool gui_scope = true) override + { + if (!gui_scope) return; + + this->enabled_actions = this->GetEnabledActions(); + if (!HasBit(this->enabled_actions, this->sel_index)) { + this->sel_index = -1; + } + } }; static WindowDesc _town_authority_desc( @@ -361,21 +384,24 @@ public: { if (widget != WID_TV_INFO) return; - uint y = r.top + WD_FRAMERECT_TOP; + Rect tr = r.Shrink(WidgetDimensions::scaled.framerect); SetDParam(0, this->town->cache.population); SetDParam(1, this->town->cache.num_houses); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_LEFT, y, STR_TOWN_VIEW_POPULATION_HOUSES); + DrawString(tr, STR_TOWN_VIEW_POPULATION_HOUSES); + tr.top += FONT_HEIGHT_NORMAL; SetDParam(0, 1 << CT_PASSENGERS); SetDParam(1, this->town->supplied[CT_PASSENGERS].old_act); SetDParam(2, this->town->supplied[CT_PASSENGERS].old_max); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_LEFT, y += FONT_HEIGHT_NORMAL, STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX); + DrawString(tr, STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX); + tr.top += FONT_HEIGHT_NORMAL; SetDParam(0, 1 << CT_MAIL); SetDParam(1, this->town->supplied[CT_MAIL].old_act); SetDParam(2, this->town->supplied[CT_MAIL].old_max); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_LEFT, y += FONT_HEIGHT_NORMAL, STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX); + DrawString(tr, STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX); + tr.top += FONT_HEIGHT_NORMAL; bool first = true; for (int i = TE_BEGIN; i < TE_END; i++) { @@ -384,13 +410,12 @@ public: if (this->town->goal[i] == TOWN_GROWTH_DESERT && (GetTropicZone(this->town->xy) != TROPICZONE_DESERT || this->town->cache.population <= 60)) continue; if (first) { - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_LEFT, y += FONT_HEIGHT_NORMAL, STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH); + DrawString(tr, STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH); + tr.top += FONT_HEIGHT_NORMAL; first = false; } bool rtl = _current_text_dir == TD_RTL; - uint cargo_text_left = r.left + WD_FRAMERECT_LEFT + (rtl ? 0 : 20); - uint cargo_text_right = r.right - WD_FRAMERECT_RIGHT - (rtl ? 20 : 0); const CargoSpec *cargo = FindFirstCargoWithTownEffect((TownEffect)i); assert(cargo != nullptr); @@ -420,26 +445,30 @@ public: SetDParam(2, cargo->Index()); SetDParam(3, this->town->goal[i]); } - DrawString(cargo_text_left, cargo_text_right, y += FONT_HEIGHT_NORMAL, string); + DrawString(tr.Indent(20, rtl), string); + tr.top += FONT_HEIGHT_NORMAL; } if (HasBit(this->town->flags, TOWN_IS_GROWING)) { SetDParam(0, RoundDivSU(this->town->growth_rate + 1, DAY_TICKS)); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_LEFT, y += FONT_HEIGHT_NORMAL, this->town->fund_buildings_months == 0 ? STR_TOWN_VIEW_TOWN_GROWS_EVERY : STR_TOWN_VIEW_TOWN_GROWS_EVERY_FUNDED); + DrawString(tr, this->town->fund_buildings_months == 0 ? STR_TOWN_VIEW_TOWN_GROWS_EVERY : STR_TOWN_VIEW_TOWN_GROWS_EVERY_FUNDED); + tr.top += FONT_HEIGHT_NORMAL; } else { - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_LEFT, y += FONT_HEIGHT_NORMAL, STR_TOWN_VIEW_TOWN_GROW_STOPPED); + DrawString(tr, STR_TOWN_VIEW_TOWN_GROW_STOPPED); + tr.top += FONT_HEIGHT_NORMAL; } /* only show the town noise, if the noise option is activated. */ if (_settings_game.economy.station_noise_level) { SetDParam(0, this->town->noise_reached); SetDParam(1, this->town->MaxTownNoise()); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_LEFT, y += FONT_HEIGHT_NORMAL, STR_TOWN_VIEW_NOISE_IN_TOWN); + DrawString(tr, STR_TOWN_VIEW_NOISE_IN_TOWN); + tr.top += FONT_HEIGHT_NORMAL; } if (!this->town->text.empty()) { SetDParamStr(0, this->town->text); - DrawStringMultiLine(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y += FONT_HEIGHT_NORMAL, UINT16_MAX, STR_JUST_RAW_STRING, TC_BLACK); + tr.top = DrawStringMultiLine(tr, STR_JUST_RAW_STRING, TC_BLACK); } } @@ -490,7 +519,7 @@ public: { switch (widget) { case WID_TV_INFO: - size->height = GetDesiredInfoHeight(size->width); + size->height = GetDesiredInfoHeight(size->width) + padding.height; break; } } @@ -501,7 +530,7 @@ public: */ uint GetDesiredInfoHeight(int width) const { - uint aimed_height = 3 * FONT_HEIGHT_NORMAL + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; + uint aimed_height = 3 * FONT_HEIGHT_NORMAL; bool first = true; for (int i = TE_BEGIN; i < TE_END; i++) { @@ -521,7 +550,7 @@ public: if (!this->town->text.empty()) { SetDParamStr(0, this->town->text); - aimed_height += GetStringHeight(STR_JUST_RAW_STRING, width - WD_FRAMERECT_LEFT - WD_FRAMERECT_RIGHT); + aimed_height += GetStringHeight(STR_JUST_RAW_STRING, width - WidgetDimensions::scaled.framerect.Horizontal()); } return aimed_height; @@ -793,18 +822,17 @@ public: case WID_TD_LIST: { int n = 0; - int y = r.top + WD_FRAMERECT_TOP; + Rect tr = r.Shrink(WidgetDimensions::scaled.framerect); if (this->towns.size() == 0) { // No towns available. - DrawString(r.left + WD_FRAMERECT_LEFT, r.right, y, STR_TOWN_DIRECTORY_NONE); + DrawString(tr, STR_TOWN_DIRECTORY_NONE); break; } /* At least one town available. */ bool rtl = _current_text_dir == TD_RTL; Dimension icon_size = GetSpriteSize(SPR_TOWN_RATING_GOOD); - int text_left = r.left + WD_FRAMERECT_LEFT + (rtl ? 0 : icon_size.width + 2); - int text_right = r.right - WD_FRAMERECT_RIGHT - (rtl ? icon_size.width + 2 : 0); - int icon_x = rtl ? r.right - WD_FRAMERECT_RIGHT - icon_size.width : r.left + WD_FRAMERECT_LEFT; + int icon_x = tr.WithWidth(icon_size.width, rtl).left; + tr = tr.Indent(icon_size.width + WidgetDimensions::scaled.hsep_normal, rtl); for (uint i = this->vscroll->GetPosition(); i < this->towns.size(); i++) { const Town *t = this->towns[i]; @@ -812,19 +840,19 @@ public: /* Draw rating icon. */ if (_game_mode == GM_EDITOR || !HasBit(t->have_ratings, _local_company)) { - DrawSprite(SPR_TOWN_RATING_NA, PAL_NONE, icon_x, y + (this->resize.step_height - icon_size.height) / 2); + DrawSprite(SPR_TOWN_RATING_NA, PAL_NONE, icon_x, tr.top + (this->resize.step_height - icon_size.height) / 2); } else { SpriteID icon = SPR_TOWN_RATING_APALLING; if (t->ratings[_local_company] > RATING_VERYPOOR) icon = SPR_TOWN_RATING_MEDIOCRE; if (t->ratings[_local_company] > RATING_GOOD) icon = SPR_TOWN_RATING_GOOD; - DrawSprite(icon, PAL_NONE, icon_x, y + (this->resize.step_height - icon_size.height) / 2); + DrawSprite(icon, PAL_NONE, icon_x, tr.top + (this->resize.step_height - icon_size.height) / 2); } SetDParam(0, t->index); SetDParam(1, t->cache.population); - DrawString(text_left, text_right, y + (this->resize.step_height - FONT_HEIGHT_NORMAL) / 2, GetTownString(t)); + DrawString(tr.left, tr.right, tr.top + (this->resize.step_height - FONT_HEIGHT_NORMAL) / 2, GetTownString(t)); - y += this->resize.step_height; + tr.top += this->resize.step_height; if (++n == this->vscroll->GetCapacity()) break; // max number of towns in 1 window } break; @@ -868,8 +896,8 @@ public: d.height = std::max(d.height, icon_size.height); resize->height = d.height; d.height *= 5; - d.width += padding.width + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; - d.height += padding.height + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; + d.width += padding.width; + d.height += padding.height; *size = maxdim(*size, d); break; } @@ -906,7 +934,7 @@ public: break; case WID_TD_LIST: { // Click on Town Matrix - uint id_v = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_TD_LIST, WD_FRAMERECT_TOP); + uint id_v = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_TD_LIST, WidgetDimensions::scaled.framerect.top); if (id_v >= this->towns.size()) return; // click out of town bounds const Town *t = this->towns[id_v]; @@ -1038,7 +1066,9 @@ static const NWidgetPart _nested_found_town_widgets[] = { NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_TF_RANDOM_TOWN), SetMinimalSize(156, 12), SetFill(1, 0), SetDataTip(STR_FOUND_TOWN_RANDOM_TOWN_BUTTON, STR_FOUND_TOWN_RANDOM_TOWN_TOOLTIP), SetPadding(0, 2, 1, 2), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_TF_MANY_RANDOM_TOWNS), SetMinimalSize(156, 12), SetFill(1, 0), - SetDataTip(STR_FOUND_TOWN_MANY_RANDOM_TOWNS, STR_FOUND_TOWN_RANDOM_TOWNS_TOOLTIP), SetPadding(0, 2, 0, 2), + SetDataTip(STR_FOUND_TOWN_MANY_RANDOM_TOWNS, STR_FOUND_TOWN_RANDOM_TOWNS_TOOLTIP), SetPadding(0, 2, 1, 2), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_TF_EXPAND_ALL_TOWNS), SetMinimalSize(156, 12), SetFill(1, 0), + SetDataTip(STR_FOUND_TOWN_EXPAND_ALL_TOWNS, STR_FOUND_TOWN_EXPAND_ALL_TOWNS_TOOLTIP), SetPadding(0, 2, 0, 2), /* Town name selection. */ NWidget(WWT_LABEL, COLOUR_DARK_GREEN), SetMinimalSize(156, 14), SetPadding(0, 2, 0, 2), SetDataTip(STR_FOUND_TOWN_NAME_TITLE, STR_NULL), NWidget(WWT_EDITBOX, COLOUR_GREY, WID_TF_TOWN_NAME_EDITBOX), SetMinimalSize(156, 12), SetPadding(0, 2, 3, 2), @@ -1132,7 +1162,7 @@ public: void UpdateButtons(bool check_availability) { if (check_availability && _game_mode != GM_EDITOR) { - this->SetWidgetsDisabledState(true, WID_TF_RANDOM_TOWN, WID_TF_MANY_RANDOM_TOWNS, WID_TF_SIZE_LARGE, WIDGET_LIST_END); + this->SetWidgetsDisabledState(true, WID_TF_RANDOM_TOWN, WID_TF_MANY_RANDOM_TOWNS, WID_TF_EXPAND_ALL_TOWNS, WID_TF_SIZE_LARGE, WIDGET_LIST_END); this->SetWidgetsDisabledState(_settings_game.economy.found_town != TF_CUSTOM_LAYOUT, WID_TF_LAYOUT_ORIGINAL, WID_TF_LAYOUT_BETTER, WID_TF_LAYOUT_GRID2, WID_TF_LAYOUT_GRID3, WID_TF_LAYOUT_RANDOM, WIDGET_LIST_END); if (_settings_game.economy.found_town != TF_CUSTOM_LAYOUT) town_layout = _settings_game.economy.town_layout; @@ -1199,6 +1229,12 @@ public: break; } + case WID_TF_EXPAND_ALL_TOWNS: + for (Town *t : Town::Iterate()) { + Command::Do(DC_EXEC, t->index, 0); + } + break; + case WID_TF_SIZE_SMALL: case WID_TF_SIZE_MEDIUM: case WID_TF_SIZE_LARGE: case WID_TF_SIZE_RANDOM: this->town_size = (TownSize)(widget - WID_TF_SIZE_SMALL); this->UpdateButtons(false); diff --git a/src/train.h b/src/train.h index c2d311878c..4592d32bd8 100644 --- a/src/train.h +++ b/src/train.h @@ -107,23 +107,24 @@ struct Train FINAL : public GroundVehicle { friend struct GroundVehicle; // GroundVehicle needs to use the acceleration functions defined at Train. - void MarkDirty(); - void UpdateDeltaXY(); - ExpensesType GetExpenseType(bool income) const { return income ? EXPENSES_TRAIN_REVENUE : EXPENSES_TRAIN_RUN; } - void PlayLeaveStationSound() const; - bool IsPrimaryVehicle() const { return this->IsFrontEngine(); } - void GetImage(Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) const; - int GetDisplaySpeed() const { return this->gcache.last_speed; } - int GetDisplayMaxSpeed() const { return this->vcache.cached_max_speed; } - Money GetRunningCost() const; + void MarkDirty() override; + void UpdateDeltaXY() override; + ExpensesType GetExpenseType(bool income) const override { return income ? EXPENSES_TRAIN_REVENUE : EXPENSES_TRAIN_RUN; } + void PlayLeaveStationSound(bool force = false) const override; + bool IsPrimaryVehicle() const override { return this->IsFrontEngine(); } + void GetImage(Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) const override; + int GetDisplaySpeed() const override { return this->gcache.last_speed; } + int GetDisplayMaxSpeed() const override { return this->vcache.cached_max_speed; } + Money GetRunningCost() const override; + int GetCursorImageOffset() const; int GetDisplayImageWidth(Point *offset = nullptr) const; - bool IsInDepot() const { return this->track == TRACK_BIT_DEPOT; } - bool Tick(); - void OnNewDay(); - uint Crash(bool flooded = false); - Trackdir GetVehicleTrackdir() const; - TileIndex GetOrderStationLocation(StationID station); - bool FindClosestDepot(TileIndex *location, DestinationID *destination, bool *reverse); + bool IsInDepot() const override { return this->track == TRACK_BIT_DEPOT; } + bool Tick() override; + void OnNewDay() override; + uint Crash(bool flooded = false) override; + Trackdir GetVehicleTrackdir() const override; + TileIndex GetOrderStationLocation(StationID station) override; + bool FindClosestDepot(TileIndex *location, DestinationID *destination, bool *reverse) override; void ReserveTrackUnderConsist() const; @@ -135,7 +136,7 @@ struct Train FINAL : public GroundVehicle { void UpdateAcceleration(); - int GetCurrentMaxSpeed() const; + int GetCurrentMaxSpeed() const override; /** * Get the next real (non-articulated part and non rear part of dualheaded engine) vehicle in the consist. @@ -213,7 +214,7 @@ protected: // These functions should not be called outside acceleration code. */ inline uint16 GetWeight() const { - uint16 weight = (CargoSpec::Get(this->cargo_type)->weight * this->cargo.StoredCount() * FreightWagonMult(this->cargo_type)) / 16; + uint16 weight = CargoSpec::Get(this->cargo_type)->WeightOfNUnitsInTrain(this->cargo.StoredCount()); /* Vehicle weight is not added for articulated parts. */ if (!this->IsArticulatedPart()) { @@ -228,6 +229,12 @@ protected: // These functions should not be called outside acceleration code. return weight; } + /** + * Calculates the weight value that this vehicle will have when fully loaded with its current cargo. + * @return Weight value in tonnes. + */ + uint16 GetMaxWeight() const override; + /** * Allows to know the tractive effort value that this vehicle will use. * @return Tractive effort value from the engine. diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index bb23f4b34f..f30e4d5f6e 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -434,6 +434,21 @@ void Train::UpdateAcceleration() this->acceleration = Clamp(power / weight * 4, 1, 255); } +int Train::GetCursorImageOffset() const +{ + if (this->gcache.cached_veh_length != 8 && HasBit(this->flags, VRF_REVERSE_DIRECTION) && !HasBit(EngInfo(this->engine_type)->misc_flags, EF_RAIL_FLIPS)) { + int reference_width = TRAININFO_DEFAULT_VEHICLE_WIDTH; + + const Engine *e = this->GetEngine(); + if (e->GetGRF() != nullptr && is_custom_sprite(e->u.rail.image_index)) { + reference_width = e->GetGRF()->traininfo_vehicle_width; + } + + return ScaleSpriteTrad((this->gcache.cached_veh_length - (int)VEHICLE_LENGTH) * reference_width / (int)VEHICLE_LENGTH); + } + return 0; +} + /** * Get the width of a train vehicle image in the GUI. * @param offset Additional offset for positioning the sprite; set to nullptr if not needed @@ -451,10 +466,14 @@ int Train::GetDisplayImageWidth(Point *offset) const } if (offset != nullptr) { - offset->x = ScaleGUITrad(reference_width) / 2; - offset->y = ScaleGUITrad(vehicle_pitch); + if (HasBit(this->flags, VRF_REVERSE_DIRECTION) && !HasBit(EngInfo(this->engine_type)->misc_flags, EF_RAIL_FLIPS)) { + offset->x = ScaleSpriteTrad((this->gcache.cached_veh_length - VEHICLE_LENGTH / 2) * reference_width / VEHICLE_LENGTH); + } else { + offset->x = ScaleSpriteTrad(reference_width) / 2; + } + offset->y = ScaleSpriteTrad(vehicle_pitch); } - return ScaleGUITrad(this->gcache.cached_veh_length * reference_width / VEHICLE_LENGTH); + return ScaleSpriteTrad(this->gcache.cached_veh_length * reference_width / VEHICLE_LENGTH); } static SpriteID GetDefaultTrainSprite(uint8 spritenum, Direction direction) @@ -500,7 +519,7 @@ static void GetRailIcon(EngineID engine, bool rear_head, int &y, EngineImageType GetCustomVehicleIcon(engine, dir, image_type, result); if (result->IsValid()) { if (e->GetGRF() != nullptr) { - y += ScaleGUITrad(e->GetGRF()->traininfo_vehicle_pitch); + y += ScaleSpriteTrad(e->GetGRF()->traininfo_vehicle_pitch); } return; } @@ -528,11 +547,11 @@ void DrawTrainEngine(int left, int right, int preferred_x, int y, EngineID engin seqr.GetBounds(&rectr); preferred_x = Clamp(preferred_x, - left - UnScaleGUI(rectf.left) + ScaleGUITrad(14), - right - UnScaleGUI(rectr.right) - ScaleGUITrad(15)); + left - UnScaleGUI(rectf.left) + ScaleSpriteTrad(14), + right - UnScaleGUI(rectr.right) - ScaleSpriteTrad(15)); - seqf.Draw(preferred_x - ScaleGUITrad(14), yf, pal, pal == PALETTE_CRASH); - seqr.Draw(preferred_x + ScaleGUITrad(15), yr, pal, pal == PALETTE_CRASH); + seqf.Draw(preferred_x - ScaleSpriteTrad(14), yf, pal, pal == PALETTE_CRASH); + seqr.Draw(preferred_x + ScaleSpriteTrad(15), yr, pal, pal == PALETTE_CRASH); } else { VehicleSpriteSeq seq; GetRailIcon(engine, false, y, image_type, &seq); @@ -566,8 +585,8 @@ void GetTrainSpriteSize(EngineID engine, uint &width, uint &height, int &xoffs, Rect rect; seq.GetBounds(&rect); - width = UnScaleGUI(rect.right - rect.left + 1); - height = UnScaleGUI(rect.bottom - rect.top + 1); + width = UnScaleGUI(rect.Width()); + height = UnScaleGUI(rect.Height()); xoffs = UnScaleGUI(rect.left); yoffs = UnScaleGUI(rect.top); @@ -576,9 +595,9 @@ void GetTrainSpriteSize(EngineID engine, uint &width, uint &height, int &xoffs, seq.GetBounds(&rect); /* Calculate values relative to an imaginary center between the two sprites. */ - width = ScaleGUITrad(TRAININFO_DEFAULT_VEHICLE_WIDTH) + UnScaleGUI(rect.right) - xoffs; - height = std::max(height, UnScaleGUI(rect.bottom - rect.top + 1)); - xoffs = xoffs - ScaleGUITrad(TRAININFO_DEFAULT_VEHICLE_WIDTH) / 2; + width = ScaleSpriteTrad(TRAININFO_DEFAULT_VEHICLE_WIDTH) + UnScaleGUI(rect.right) - xoffs; + height = std::max(height, UnScaleGUI(rect.Height())); + xoffs = xoffs - ScaleSpriteTrad(TRAININFO_DEFAULT_VEHICLE_WIDTH) / 2; yoffs = std::min(yoffs, UnScaleGUI(rect.top)); } } @@ -1438,7 +1457,15 @@ void Train::UpdateDeltaXY() this->x_bb_offs = 0; this->y_bb_offs = 0; - if (!IsDiagonalDirection(this->direction)) { + /* Set if flipped and engine is NOT flagged with custom flip handling. */ + int flipped = HasBit(this->flags, VRF_REVERSE_DIRECTION) && !HasBit(EngInfo(this->engine_type)->misc_flags, EF_RAIL_FLIPS); + /* If flipped and vehicle length is odd, we need to adjust the bounding box offset slightly. */ + int flip_offs = flipped && (this->gcache.cached_veh_length & 1); + + Direction dir = this->direction; + if (flipped) dir = ReverseDir(dir); + + if (!IsDiagonalDirection(dir)) { static const int _sign_table[] = { /* x, y */ @@ -1448,25 +1475,25 @@ void Train::UpdateDeltaXY() 1, -1, // DIR_W }; - int half_shorten = (VEHICLE_LENGTH - this->gcache.cached_veh_length) / 2; + int half_shorten = (VEHICLE_LENGTH - this->gcache.cached_veh_length + flipped) / 2; /* For all straight directions, move the bound box to the centre of the vehicle, but keep the size. */ - this->x_offs -= half_shorten * _sign_table[this->direction]; - this->y_offs -= half_shorten * _sign_table[this->direction + 1]; - this->x_extent += this->x_bb_offs = half_shorten * _sign_table[direction]; - this->y_extent += this->y_bb_offs = half_shorten * _sign_table[direction + 1]; + this->x_offs -= half_shorten * _sign_table[dir]; + this->y_offs -= half_shorten * _sign_table[dir + 1]; + this->x_extent += this->x_bb_offs = half_shorten * _sign_table[dir]; + this->y_extent += this->y_bb_offs = half_shorten * _sign_table[dir + 1]; } else { - switch (this->direction) { + switch (dir) { /* Shorten southern corner of the bounding box according the vehicle length * and center the bounding box on the vehicle. */ case DIR_NE: - this->x_offs = 1 - (this->gcache.cached_veh_length + 1) / 2; + this->x_offs = 1 - (this->gcache.cached_veh_length + 1) / 2 + flip_offs; this->x_extent = this->gcache.cached_veh_length - 1; this->x_bb_offs = -1; break; case DIR_NW: - this->y_offs = 1 - (this->gcache.cached_veh_length + 1) / 2; + this->y_offs = 1 - (this->gcache.cached_veh_length + 1) / 2 + flip_offs; this->y_extent = this->gcache.cached_veh_length - 1; this->y_bb_offs = -1; break; @@ -1474,13 +1501,13 @@ void Train::UpdateDeltaXY() /* Move northern corner of the bounding box down according to vehicle length * and center the bounding box on the vehicle. */ case DIR_SW: - this->x_offs = 1 + (this->gcache.cached_veh_length + 1) / 2 - VEHICLE_LENGTH; + this->x_offs = 1 + (this->gcache.cached_veh_length + 1) / 2 - VEHICLE_LENGTH - flip_offs; this->x_extent = VEHICLE_LENGTH - 1; this->x_bb_offs = VEHICLE_LENGTH - this->gcache.cached_veh_length - 1; break; case DIR_SE: - this->y_offs = 1 + (this->gcache.cached_veh_length + 1) / 2 - VEHICLE_LENGTH; + this->y_offs = 1 + (this->gcache.cached_veh_length + 1) / 2 - VEHICLE_LENGTH - flip_offs; this->y_extent = VEHICLE_LENGTH - 1; this->y_bb_offs = VEHICLE_LENGTH - this->gcache.cached_veh_length - 1; break; @@ -1674,29 +1701,88 @@ static bool TrainApproachingCrossing(TileIndex tile) return HasVehicleOnPos(tile_from, &tile, &TrainApproachingCrossingEnum); } +/** + * Check if a level crossing should be barred. + * @param tile The tile to check. + * @return True if the crossing should be barred, else false. + */ +static inline bool CheckLevelCrossing(TileIndex tile) +{ + /* reserved || train on crossing || train approaching crossing */ + return HasCrossingReservation(tile) || HasVehicleOnPos(tile, NULL, &TrainOnTileEnum) || TrainApproachingCrossing(tile); +} /** - * Sets correct crossing state - * @param tile tile to update - * @param sound should we play sound? - * @pre tile is a rail-road crossing + * Sets a level crossing tile to the correct state. + * @param tile Tile to update. + * @param sound Should we play sound? + * @param force_barred Should we set the crossing to barred? + * @pre tile is a rail-road crossing. */ -void UpdateLevelCrossing(TileIndex tile, bool sound) +static void UpdateLevelCrossingTile(TileIndex tile, bool sound, bool force_barred) { assert(IsLevelCrossingTile(tile)); + bool set_barred; - /* reserved || train on crossing || train approaching crossing */ - bool new_state = HasCrossingReservation(tile) || HasVehicleOnPos(tile, nullptr, &TrainOnTileEnum) || TrainApproachingCrossing(tile); + /* We force the crossing to be barred when an adjacent crossing is barred, otherwise let it decide for itself. */ + set_barred = force_barred || CheckLevelCrossing(tile); - if (new_state != IsCrossingBarred(tile)) { - if (new_state && sound) { - if (_settings_client.sound.ambient) SndPlayTileFx(SND_0E_LEVEL_CROSSING, tile); - } - SetCrossingBarred(tile, new_state); + /* The state has changed */ + if (set_barred != IsCrossingBarred(tile)) { + if (set_barred && sound && _settings_client.sound.ambient) SndPlayTileFx(SND_0E_LEVEL_CROSSING, tile); + SetCrossingBarred(tile, set_barred); MarkTileDirtyByTile(tile); } } +/** + * Update a level crossing to barred or open (crossing may include multiple adjacent tiles). + * @param tile Tile which causes the update. + * @param sound Should we play sound? + * @param force_bar Should we force the crossing to be barred? + */ +void UpdateLevelCrossing(TileIndex tile, bool sound, bool force_bar) +{ + if (!IsLevelCrossingTile(tile)) return; + + bool forced_state = force_bar; + + const Axis axis = GetCrossingRoadAxis(tile); + const DiagDirection dir1 = AxisToDiagDir(axis); + const DiagDirection dir2 = ReverseDiagDir(dir1); + + /* Check if an adjacent crossing is barred. */ + for (DiagDirection dir : { dir1, dir2 }) { + for (TileIndex t = tile; !forced_state && t < MapSize() && IsLevelCrossingTile(t) && GetCrossingRoadAxis(t) == axis; t = TileAddByDiagDir(t, dir)) { + forced_state |= CheckLevelCrossing(t); + } + } + + /* Now that we know whether all tiles in this crossing should be barred or open, + * we need to update those tiles. We start with the tile itself, then look along the road axis. */ + UpdateLevelCrossingTile(tile, sound, forced_state); + for (DiagDirection dir : { dir1, dir2 }) { + for (TileIndex t = TileAddByDiagDir(tile, dir); t < MapSize() && IsLevelCrossingTile(t) && GetCrossingRoadAxis(t) == axis; t = TileAddByDiagDir(t, dir)) { + UpdateLevelCrossingTile(t, sound, forced_state); + } + } +} + +/** + * Find adjacent level crossing tiles in this multi-track crossing and mark them dirty. + * @param The tile which causes the update. + */ +void MarkDirtyAdjacentLevelCrossingTiles(TileIndex tile, Axis road_axis) +{ + const DiagDirection dir1 = AxisToDiagDir(road_axis); + const DiagDirection dir2 = ReverseDiagDir(dir1); + for (DiagDirection dir : { dir1, dir2 }) { + const TileIndex t = TileAddByDiagDir(tile, dir); + if (t < MapSize() && IsLevelCrossingTile(t) && GetCrossingRoadAxis(t) == road_axis) { + MarkTileDirtyByTile(t); + } + } +} /** * Bars crossing and plays ding-ding sound if not barred already @@ -1706,9 +1792,8 @@ void UpdateLevelCrossing(TileIndex tile, bool sound) static inline void MaybeBarCrossingWithSound(TileIndex tile) { if (!IsCrossingBarred(tile)) { - BarCrossing(tile); - if (_settings_client.sound.ambient) SndPlayTileFx(SND_0E_LEVEL_CROSSING, tile); - MarkTileDirtyByTile(tile); + SetCrossingReservation(tile, true); + UpdateLevelCrossing(tile, true); } } @@ -1917,7 +2002,6 @@ CommandCost CmdReverseTrainDirection(DoCommandFlag flags, VehicleID veh_id, bool if (v->IsMultiheaded() || HasBit(EngInfo(v->engine_type)->callback_mask, CBM_VEHICLE_ARTIC_ENGINE)) { return_cmd_error(STR_ERROR_CAN_T_REVERSE_DIRECTION_RAIL_VEHICLE_MULTIPLE_UNITS); } - if (!HasBit(EngInfo(v->engine_type)->misc_flags, EF_RAIL_FLIPS)) return CMD_ERROR; Train *front = v->First(); /* make sure the vehicle is stopped in the depot */ @@ -2042,7 +2126,7 @@ bool Train::FindClosestDepot(TileIndex *location, DestinationID *destination, bo } /** Play a sound for a train leaving the station. */ -void Train::PlayLeaveStationSound() const +void Train::PlayLeaveStationSound(bool force) const { static const SoundFx sfx[] = { SND_04_DEPARTURE_STEAM, @@ -2052,10 +2136,9 @@ void Train::PlayLeaveStationSound() const SND_41_DEPARTURE_MAGLEV }; - if (PlayVehicleSound(this, VSE_START)) return; + if (PlayVehicleSound(this, VSE_START, force)) return; - EngineID engtype = this->engine_type; - SndPlayVehicleFx(sfx[RailVehInfo(engtype)->engclass], this); + SndPlayVehicleFx(sfx[RailVehInfo(this->engine_type)->engclass], this); } /** @@ -4061,3 +4144,20 @@ Trackdir Train::GetVehicleTrackdir() const return TrackDirectionToTrackdir(FindFirstTrack(this->track), this->direction); } + +uint16 Train::GetMaxWeight() const +{ + uint16 weight = CargoSpec::Get(this->cargo_type)->WeightOfNUnitsInTrain(this->GetEngine()->DetermineCapacity(this)); + + /* Vehicle weight is not added for articulated parts. */ + if (!this->IsArticulatedPart()) { + weight += GetVehicleProperty(this, PROP_TRAIN_WEIGHT, RailVehInfo(this->engine_type)->weight); + } + + /* Powered wagons have extra weight added. */ + if (HasBit(this->flags, VRF_POWEREDWAGON)) { + weight += RailVehInfo(this->gcache.first_engine)->pow_wag_weight; + } + + return weight; +} diff --git a/src/train_gui.cpp b/src/train_gui.cpp index 9fe06a9383..53130e134b 100644 --- a/src/train_gui.cpp +++ b/src/train_gui.cpp @@ -53,11 +53,12 @@ void CcBuildWagon(Commands cmd, const CommandCost &result, VehicleID new_veh_id, * Highlight the position where a rail vehicle is dragged over by drawing a light gray background. * @param px The current x position to draw from. * @param max_width The maximum space available to draw. + * @param y The vertical centre position to draw from. * @param selection Selected vehicle that is dragged. * @param chain Whether a whole chain is dragged. * @return The width of the highlight mark. */ -static int HighlightDragPosition(int px, int max_width, VehicleID selection, bool chain) +static int HighlightDragPosition(int px, int max_width, int y, VehicleID selection, bool chain) { bool rtl = _current_text_dir == TD_RTL; @@ -72,8 +73,11 @@ static int HighlightDragPosition(int px, int max_width, VehicleID selection, boo int drag_hlight_width = std::max(drag_hlight_right - drag_hlight_left + 1, 0); if (drag_hlight_width > 0) { - GfxFillRect(drag_hlight_left + WD_FRAMERECT_LEFT, WD_FRAMERECT_TOP + 1, - drag_hlight_right - WD_FRAMERECT_RIGHT, ScaleGUITrad(13) - WD_FRAMERECT_BOTTOM, _colour_gradient[COLOUR_GREY][7]); + int height = ScaleSpriteTrad(12); + int top = y - height / 2; + Rect r = {drag_hlight_left, top, drag_hlight_right, top + height - 1}; + /* Sprite-scaling is used here as the area is from sprite size */ + GfxFillRect(r.Shrink(ScaleSpriteTrad(1)), _colour_gradient[COLOUR_GREY][7]); } return drag_hlight_width; @@ -82,14 +86,12 @@ static int HighlightDragPosition(int px, int max_width, VehicleID selection, boo /** * Draws an image of a whole train * @param v Front vehicle - * @param left The minimum horizontal position - * @param right The maximum horizontal position - * @param y Vertical position to draw at + * @param r Rect to draw at * @param selection Selected vehicle to draw a frame around * @param skip Number of pixels to skip at the front (for scrolling) * @param drag_dest The vehicle another one is dragged over, \c INVALID_VEHICLE if none. */ -void DrawTrainImage(const Train *v, int left, int right, int y, VehicleID selection, EngineImageType image_type, int skip, VehicleID drag_dest) +void DrawTrainImage(const Train *v, const Rect &r, VehicleID selection, EngineImageType image_type, int skip, VehicleID drag_dest) { bool rtl = _current_text_dir == TD_RTL; Direction dir = rtl ? DIR_E : DIR_W; @@ -98,22 +100,22 @@ void DrawTrainImage(const Train *v, int left, int right, int y, VehicleID select /* Position of highlight box */ int highlight_l = 0; int highlight_r = 0; - int max_width = right - left + 1; - int height = ScaleGUITrad(14); + int max_width = r.Width(); - if (!FillDrawPixelInfo(&tmp_dpi, left, y, max_width, height)) return; + if (!FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.Width(), r.Height())) return; old_dpi = _cur_dpi; _cur_dpi = &tmp_dpi; int px = rtl ? max_width + skip : -skip; + int y = r.Height() / 2; bool sel_articulated = false; bool dragging = (drag_dest != INVALID_VEHICLE); bool drag_at_end_of_train = (drag_dest == v->index); // Head index is used to mark dragging at end of train. for (; v != nullptr && (rtl ? px > 0 : px < max_width); v = v->Next()) { if (dragging && !drag_at_end_of_train && drag_dest == v->index) { /* Highlight the drag-and-drop destination inside the train. */ - int drag_hlight_width = HighlightDragPosition(px, max_width, selection, _cursor.vehchain); + int drag_hlight_width = HighlightDragPosition(px, max_width, y, selection, _cursor.vehchain); px += rtl ? -drag_hlight_width : drag_hlight_width; } @@ -124,7 +126,7 @@ void DrawTrainImage(const Train *v, int left, int right, int y, VehicleID select PaletteID pal = (v->vehstatus & VS_CRASHED) ? PALETTE_CRASH : GetVehiclePalette(v); VehicleSpriteSeq seq; v->GetImage(dir, image_type, &seq); - seq.Draw(px + (rtl ? -offset.x : offset.x), height / 2 + offset.y, pal, (v->vehstatus & VS_CRASHED) != 0); + seq.Draw(px + (rtl ? -offset.x : offset.x), y + offset.y, pal, (v->vehstatus & VS_CRASHED) != 0); } if (!v->IsArticulatedPart()) sel_articulated = false; @@ -147,16 +149,18 @@ void DrawTrainImage(const Train *v, int left, int right, int y, VehicleID select if (dragging && drag_at_end_of_train) { /* Highlight the drag-and-drop destination at the end of the train. */ - HighlightDragPosition(px, max_width, selection, _cursor.vehchain); + HighlightDragPosition(px, max_width, y, selection, _cursor.vehchain); } + _cur_dpi = old_dpi; + if (highlight_l != highlight_r) { /* Draw the highlight. Now done after drawing all the engines, as * the next engine after the highlight could overlap it. */ - DrawFrameRect(highlight_l, 0, highlight_r, height - 1, COLOUR_WHITE, FR_BORDERONLY); + int height = ScaleSpriteTrad(12); + Rect hr = {highlight_l, 0, highlight_r, height - 1}; + DrawFrameRect(hr.Translate(r.left, CenterBounds(r.top, r.bottom, height)).Expand(WidgetDimensions::scaled.bevel), COLOUR_WHITE, FR_BORDERONLY); } - - _cur_dpi = old_dpi; } /** Helper struct for the cargo details information */ @@ -182,7 +186,6 @@ struct CargoSummaryItem { static const uint TRAIN_DETAILS_MIN_INDENT = 32; ///< Minimum indent level in the train details window static const uint TRAIN_DETAILS_MAX_INDENT = 72; ///< Maximum indent level in the train details window; wider than this and we start on a new line -static const int TRAIN_DETAILS_LIST_INDENT = 10; ///< Indent for list items in the Total Cargo window /** Container for the cargo summary information. */ typedef std::vector CargoSummary; @@ -341,7 +344,7 @@ int GetTrainDetailsWndVScroll(VehicleID veh_id, TrainDetailsWindowTabs det_tab) num += std::max(1u, (unsigned)_cargo_summary.size()); uint length = GetLengthOfArticulatedVehicle(v); - if (length > TRAIN_DETAILS_MAX_INDENT) num++; + if (length > (uint)ScaleSpriteTrad(TRAIN_DETAILS_MAX_INDENT)) num++; } } @@ -352,32 +355,22 @@ int GetTrainDetailsWndVScroll(VehicleID veh_id, TrainDetailsWindowTabs det_tab) * Draw the details for the given vehicle at the given position * * @param v current vehicle - * @param left The left most coordinate to draw - * @param right The right most coordinate to draw - * @param y The y coordinate + * @param r the Rect to draw within * @param vscroll_pos Position of scrollbar * @param vscroll_cap Number of lines currently displayed * @param det_tab Selected details tab */ -void DrawTrainDetails(const Train *v, int left, int right, int y, int vscroll_pos, uint16 vscroll_cap, TrainDetailsWindowTabs det_tab) +void DrawTrainDetails(const Train *v, const Rect &r, int vscroll_pos, uint16 vscroll_cap, TrainDetailsWindowTabs det_tab) { - /* get rid of awkward offset */ - y -= WD_MATRIX_TOP; - - /* Indent the total cargo capacity details */ - int offs_left = _current_text_dir == TD_LTR ? TRAIN_DETAILS_LIST_INDENT : 0; - int offs_right = _current_text_dir == TD_LTR ? 0 : TRAIN_DETAILS_LIST_INDENT; - - int sprite_height = ScaleGUITrad(GetVehicleHeight(VEH_TRAIN)); - int line_height = std::max(sprite_height, WD_MATRIX_TOP + FONT_HEIGHT_NORMAL + WD_MATRIX_BOTTOM); + bool rtl = _current_text_dir == TD_RTL; + int line_height = r.Height(); int sprite_y_offset = line_height / 2; int text_y_offset = (line_height - FONT_HEIGHT_NORMAL) / 2; /* draw the first 3 details tabs */ if (det_tab != TDW_TAB_TOTALS) { - bool rtl = _current_text_dir == TD_RTL; Direction dir = rtl ? DIR_E : DIR_W; - int x = rtl ? right : left; + int x = rtl ? r.right : r.left; for (; v != nullptr && vscroll_pos > -vscroll_cap; v = v->GetNextVehicle()) { GetCargoSummaryOfArticulatedVehicle(v, &_cargo_summary); @@ -392,53 +385,52 @@ void DrawTrainDetails(const Train *v, int left, int right, int y, int vscroll_po int pitch = 0; const Engine *e = Engine::Get(v->engine_type); if (e->GetGRF() != nullptr) { - pitch = ScaleGUITrad(e->GetGRF()->traininfo_vehicle_pitch); + pitch = ScaleSpriteTrad(e->GetGRF()->traininfo_vehicle_pitch); } PaletteID pal = (v->vehstatus & VS_CRASHED) ? PALETTE_CRASH : GetVehiclePalette(v); VehicleSpriteSeq seq; u->GetImage(dir, EIT_IN_DETAILS, &seq); - seq.Draw(px + (rtl ? -offset.x : offset.x), y - line_height * vscroll_pos + sprite_y_offset + pitch, pal, (v->vehstatus & VS_CRASHED) != 0); + seq.Draw(px + (rtl ? -offset.x : offset.x), r.top - line_height * vscroll_pos + sprite_y_offset + pitch, pal, (v->vehstatus & VS_CRASHED) != 0); } px += rtl ? -width : width; dx += width; u = u->Next(); } while (u != nullptr && u->IsArticulatedPart()); - bool separate_sprite_row = (dx > (uint)ScaleGUITrad(TRAIN_DETAILS_MAX_INDENT)); + bool separate_sprite_row = (dx > (uint)ScaleSpriteTrad(TRAIN_DETAILS_MAX_INDENT)); if (separate_sprite_row) { vscroll_pos--; dx = 0; } + int sprite_width = std::max(dx, ScaleSpriteTrad(TRAIN_DETAILS_MIN_INDENT)) + WidgetDimensions::scaled.hsep_normal; + Rect dr = r.Indent(sprite_width, rtl); uint num_lines = std::max(1u, (unsigned)_cargo_summary.size()); for (uint i = 0; i < num_lines; i++) { - int sprite_width = std::max(dx, ScaleGUITrad(TRAIN_DETAILS_MIN_INDENT)) + 3; - int data_left = left + (rtl ? 0 : sprite_width); - int data_right = right - (rtl ? sprite_width : 0); if (vscroll_pos <= 0 && vscroll_pos > -vscroll_cap) { - int py = y - line_height * vscroll_pos + text_y_offset; + int py = r.top - line_height * vscroll_pos + text_y_offset; if (i > 0 || separate_sprite_row) { - if (vscroll_pos != 0) GfxFillRect(left, py - WD_MATRIX_TOP - 1, right, py - WD_MATRIX_TOP, _colour_gradient[COLOUR_GREY][5]); + if (vscroll_pos != 0) GfxFillRect(r.left, py - WidgetDimensions::scaled.matrix.top - 1, r.right, py - WidgetDimensions::scaled.matrix.top, _colour_gradient[COLOUR_GREY][5]); } switch (det_tab) { case TDW_TAB_CARGO: if (i < _cargo_summary.size()) { - TrainDetailsCargoTab(&_cargo_summary[i], data_left, data_right, py); + TrainDetailsCargoTab(&_cargo_summary[i], dr.left, dr.right, py); } else { - DrawString(data_left, data_right, py, STR_QUANTITY_N_A, TC_LIGHT_BLUE); + DrawString(dr.left, dr.right, py, STR_QUANTITY_N_A, TC_LIGHT_BLUE); } break; case TDW_TAB_INFO: - if (i == 0) TrainDetailsInfoTab(v, data_left, data_right, py); + if (i == 0) TrainDetailsInfoTab(v, dr.left, dr.right, py); break; case TDW_TAB_CAPACITY: if (i < _cargo_summary.size()) { - TrainDetailsCapacityTab(&_cargo_summary[i], data_left, data_right, py); + TrainDetailsCapacityTab(&_cargo_summary[i], dr.left, dr.right, py); } else { SetDParam(0, STR_EMPTY); - DrawString(data_left, data_right, py, STR_VEHICLE_INFO_NO_CAPACITY); + DrawString(dr.left, dr.right, py, STR_VEHICLE_INFO_NO_CAPACITY); } break; @@ -449,6 +441,7 @@ void DrawTrainDetails(const Train *v, int left, int right, int y, int vscroll_po } } } else { + int y = r.top; CargoArray act_cargo; CargoArray max_cargo; Money feeder_share = 0; @@ -460,9 +453,11 @@ void DrawTrainDetails(const Train *v, int left, int right, int y, int vscroll_po } /* draw total cargo tab */ - DrawString(left, right, y + text_y_offset, STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY_TEXT); + DrawString(r.left, r.right, y + text_y_offset, STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY_TEXT); y += line_height; + /* Indent the total cargo capacity details */ + Rect ir = r.Indent(WidgetDimensions::scaled.hsep_indent, rtl); for (CargoID i = 0; i < NUM_CARGO; i++) { if (max_cargo[i] > 0 && --vscroll_pos < 0 && vscroll_pos > -vscroll_cap) { SetDParam(0, i); // {CARGO} #1 @@ -470,11 +465,11 @@ void DrawTrainDetails(const Train *v, int left, int right, int y, int vscroll_po SetDParam(2, i); // {SHORTCARGO} #1 SetDParam(3, max_cargo[i]); // {SHORTCARGO} #2 SetDParam(4, _settings_game.vehicle.freight_trains); - DrawString(left + offs_left, right - offs_right, y + text_y_offset, FreightWagonMult(i) > 1 ? STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY_MULT : STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY); + DrawString(ir.left, ir.right, y + text_y_offset, FreightWagonMult(i) > 1 ? STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY_MULT : STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY); y += line_height; } } SetDParam(0, feeder_share); - DrawString(left, right, y + text_y_offset, STR_VEHICLE_INFO_FEEDER_CARGO_VALUE); + DrawString(r.left, r.right, y + text_y_offset, STR_VEHICLE_INFO_FEEDER_CARGO_VALUE); } } diff --git a/src/transparency_gui.cpp b/src/transparency_gui.cpp index 153dcb5d03..479e0f8b7a 100644 --- a/src/transparency_gui.cpp +++ b/src/transparency_gui.cpp @@ -52,18 +52,20 @@ public: case WID_TT_CATENARY: case WID_TT_LOADING: { uint i = widget - WID_TT_BEGIN; - if (HasBit(_transparency_lock, i)) DrawSprite(SPR_LOCK, PAL_NONE, r.left + 1, r.top + 1); + if (HasBit(_transparency_lock, i)) DrawSprite(SPR_LOCK, PAL_NONE, r.left + WidgetDimensions::scaled.fullbevel.left, r.top + WidgetDimensions::scaled.fullbevel.top); break; } - case WID_TT_BUTTONS: + case WID_TT_BUTTONS: { + const Rect fr = r.Shrink(WidgetDimensions::scaled.framerect); for (uint i = WID_TT_BEGIN; i < WID_TT_END; i++) { if (i == WID_TT_LOADING) continue; // Do not draw button for invisible loading indicators. - const NWidgetBase *wi = this->GetWidget(i); - DrawFrameRect(wi->pos_x + 1, r.top + 2, wi->pos_x + wi->current_x - 2, r.bottom - 2, COLOUR_PALE_GREEN, + const Rect wr = this->GetWidget(i)->GetCurrentRect().Shrink(WidgetDimensions::scaled.fullbevel); + DrawFrameRect(wr.left, fr.top, wr.right, fr.bottom, COLOUR_PALE_GREEN, HasBit(_invisibility_opt, i - WID_TT_BEGIN) ? FR_LOWERED : FR_NONE); } break; + } } } diff --git a/src/tree_gui.cpp b/src/tree_gui.cpp index 0b0eeda22b..f3d3603fbd 100644 --- a/src/tree_gui.cpp +++ b/src/tree_gui.cpp @@ -58,8 +58,8 @@ static Dimension GetMaxTreeSpriteSize() Dimension size, this_size; Point offset; /* Avoid to use it uninitialized */ - size.width = 32; // default width - WD_FRAMERECT_LEFT - size.height = 39; // default height - BUTTON_BOTTOM_OFFSET + size.width = ScaleGUITrad(32); // default width - WD_FRAMERECT_LEFT + size.height = ScaleGUITrad(39); // default height - BUTTON_BOTTOM_OFFSET offset.x = 0; offset.y = 0; @@ -159,8 +159,8 @@ public: if (widget >= WID_BT_TYPE_BUTTON_FIRST) { /* Ensure tree type buttons are sized after the largest tree type */ Dimension d = GetMaxTreeSpriteSize(); - size->width = d.width + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; - size->height = d.height + WD_FRAMERECT_RIGHT + WD_FRAMERECT_BOTTOM + ScaleGUITrad(BUTTON_BOTTOM_OFFSET); // we need some more space + size->width = d.width + padding.width; + size->height = d.height + padding.height + ScaleGUITrad(BUTTON_BOTTOM_OFFSET); // we need some more space } } @@ -169,7 +169,7 @@ public: if (widget >= WID_BT_TYPE_BUTTON_FIRST) { const int index = widget - WID_BT_TYPE_BUTTON_FIRST; /* Trees "grow" in the centre on the bottom line of the buttons */ - DrawSprite(tree_sprites[index].sprite, tree_sprites[index].pal, (r.left + r.right) / 2 + WD_FRAMERECT_LEFT, r.bottom - ScaleGUITrad(BUTTON_BOTTOM_OFFSET)); + DrawSprite(tree_sprites[index].sprite, tree_sprites[index].pal, CenterBounds(r.left, r.right, 0), r.bottom - ScaleGUITrad(BUTTON_BOTTOM_OFFSET)); } } diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index 9d3868c86d..c22168476b 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -1307,8 +1307,28 @@ static void DrawTile_TunnelBridge(TileInfo *ti) const RoadTypeInfo *road_rti = road_rt == INVALID_ROADTYPE ? nullptr : GetRoadTypeInfo(road_rt); const RoadTypeInfo *tram_rti = tram_rt == INVALID_ROADTYPE ? nullptr : GetRoadTypeInfo(tram_rt); uint sprite_offset = DiagDirToAxis(tunnelbridge_direction) == AXIS_X ? 1 : 0; + bool draw_underlay = true; - DrawRoadOverlays(ti, PAL_NONE, road_rti, tram_rti, sprite_offset, sprite_offset); + /* Road underlay takes precedence over tram */ + if (road_rti != nullptr) { + if (road_rti->UsesOverlay()) { + SpriteID ground = GetCustomRoadSprite(road_rti, ti->tile, ROTSG_TUNNEL); + if (ground != 0) { + DrawGroundSprite(ground + tunnelbridge_direction, PAL_NONE); + draw_underlay = false; + } + } + } else { + if (tram_rti->UsesOverlay()) { + SpriteID ground = GetCustomRoadSprite(tram_rti, ti->tile, ROTSG_TUNNEL); + if (ground != 0) { + DrawGroundSprite(ground + tunnelbridge_direction, PAL_NONE); + draw_underlay = false; + } + } + } + + DrawRoadOverlays(ti, PAL_NONE, road_rti, tram_rti, sprite_offset, sprite_offset, draw_underlay); /* Road catenary takes precedence over tram */ SpriteID catenary_sprite_base = 0; diff --git a/src/vehicle.cpp b/src/vehicle.cpp index af4d4d9ff1..eab9c1ccaa 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -2987,3 +2987,65 @@ void GetVehicleSet(VehicleSet &set, Vehicle *v, uint8 num_vehicles) } } } + +/** + * Calculates the maximum weight of the ground vehicle when loaded. + * @return Weight in tonnes + */ +uint32 Vehicle::GetDisplayMaxWeight() const +{ + uint32 max_weight = 0; + + for (const Vehicle* u = this; u != nullptr; u = u->Next()) { + max_weight += u->GetMaxWeight(); + } + + return max_weight; +} + +/** + * Calculates the minimum power-to-weight ratio using the maximum weight of the ground vehicle + * @return power-to-weight ratio in 10ths of hp(I) per tonne + */ +uint32 Vehicle::GetDisplayMinPowerToWeight() const +{ + uint32 max_weight = GetDisplayMaxWeight(); + if (max_weight == 0) return 0; + return GetGroundVehicleCache()->cached_power * 10u / max_weight; +} + +/** + * Checks if two vehicle chains have the same list of engines. + * @param v1 First vehicle chain. + * @param v1 Second vehicle chain. + * @return True if same, false if different. + */ +bool VehiclesHaveSameEngineList(const Vehicle *v1, const Vehicle *v2) +{ + while (true) { + if (v1 == nullptr && v2 == nullptr) return true; + if (v1 == nullptr || v2 == nullptr) return false; + if (v1->GetEngine() != v2->GetEngine()) return false; + v1 = v1->GetNextVehicle(); + v2 = v2->GetNextVehicle(); + } +} + +/** + * Checks if two vehicles have the same list of orders. + * @param v1 First vehicles. + * @param v1 Second vehicles. + * @return True if same, false if different. + */ +bool VehiclesHaveSameOrderList(const Vehicle *v1, const Vehicle *v2) +{ + const Order *o1 = v1->GetFirstOrder(); + const Order *o2 = v2->GetFirstOrder(); + while (true) { + if (o1 == nullptr && o2 == nullptr) return true; + if (o1 == nullptr || o2 == nullptr) return false; + if (!o1->Equals(*o2)) return false; + o1 = o1->next; + o2 = o2->next; + } +} diff --git a/src/vehicle_base.h b/src/vehicle_base.h index 9316a76477..c643cff859 100644 --- a/src/vehicle_base.h +++ b/src/vehicle_base.h @@ -346,6 +346,15 @@ public: mutable MutableSpriteCache sprite_cache; ///< Cache of sprites and values related to recalculating them, see #MutableSpriteCache + /** + * Calculates the weight value that this vehicle will have when fully loaded with its current cargo. + * @return Weight value in tonnes. + */ + virtual uint16 GetMaxWeight() const + { + return 0; + } + Vehicle(VehicleType type = VEH_INVALID); void PreDestructor(); @@ -441,8 +450,9 @@ public: /** * Play the sound associated with leaving the station + * @param force Should we play the sound even if sound effects are muted? (horn hotkey) */ - virtual void PlayLeaveStationSound() const {} + virtual void PlayLeaveStationSound(bool force = false) const {} /** * Whether this is the primary vehicle in the chain. @@ -1040,6 +1050,9 @@ public: * @return an iterable ensemble of orders of a vehicle */ IterateWrapper Orders() const { return IterateWrapper(this->orders); } + + uint32 GetDisplayMaxWeight() const; + uint32 GetDisplayMinPowerToWeight() const; }; /** diff --git a/src/vehicle_cmd.cpp b/src/vehicle_cmd.cpp index 373a92cdbf..ed7cf56689 100644 --- a/src/vehicle_cmd.cpp +++ b/src/vehicle_cmd.cpp @@ -958,7 +958,7 @@ std::tuple CmdCloneVehicle(DoCommandFlag flags, TileInde if (result.Failed()) { /* The vehicle has already been bought, so now it must be sold again. */ Command::Do(flags, w_front->index, true, false, INVALID_CLIENT_ID); - return { total_cost, INVALID_VEHICLE }; + return { result, INVALID_VEHICLE }; } /* Now clone the vehicle's name, if it has one. */ diff --git a/src/vehicle_func.h b/src/vehicle_func.h index aa3a027dfb..13fc352e46 100644 --- a/src/vehicle_func.h +++ b/src/vehicle_func.h @@ -174,4 +174,7 @@ void GetVehicleSet(VehicleSet &set, Vehicle *v, uint8 num_vehicles); void CheckCargoCapacity(Vehicle *v); +bool VehiclesHaveSameEngineList(const Vehicle *v1, const Vehicle *v2); +bool VehiclesHaveSameOrderList(const Vehicle *v1, const Vehicle *v2); + #endif /* VEHICLE_FUNC_H */ diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 49e57c605e..c7273a885a 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -41,6 +41,7 @@ #include "order_cmd.h" #include "roadveh_cmd.h" #include "train_cmd.h" +#include "hotkeys.h" #include "safeguards.h" @@ -139,6 +140,7 @@ const StringID BaseVehicleListWindow::vehicle_depot_name[] = { BaseVehicleListWindow::BaseVehicleListWindow(WindowDesc *desc, WindowNumber wno) : Window(desc), vli(VehicleListIdentifier::UnPack(wno)) { + this->vehicle_sel = INVALID_VEHICLE; this->grouping = _grouping[vli.type][vli.vtype]; this->UpdateSortingFromGrouping(); } @@ -195,6 +197,8 @@ void BaseVehicleListWindow::BuildVehicleList() max_unitnumber = std::max(max_unitnumber, (*it)->unitnumber); } this->unitnumber_digits = CountDigitsForAllocatingSpace(max_unitnumber); + + this->FilterVehicleList(); } else { /* Sort by the primary vehicle; we just want all vehicles that share the same orders to form a contiguous range. */ std::stable_sort(this->vehicles.begin(), this->vehicles.end(), [](const Vehicle * const &u, const Vehicle * const &v) { @@ -223,6 +227,118 @@ void BaseVehicleListWindow::BuildVehicleList() this->vscroll->SetCount(static_cast(this->vehgroups.size())); } + +/** Cargo filter functions */ +/** + * Check whether a vehicle can carry a specific cargo. + * @param vehgroup The vehicle group which contains the vehicle to be checked + * @param cid The cargo what we are looking for + * @return Whether the vehicle can carry the specified cargo or not + */ +static bool CDECL CargoFilter(const GUIVehicleGroup *vehgroup, const CargoID cid) +{ + const Vehicle *v = (*vehgroup).GetSingleVehicle(); + if (cid == BaseVehicleListWindow::CF_ANY) { + return true; + } else if (cid == BaseVehicleListWindow::CF_NONE) { + for (const Vehicle *w = v; w != nullptr; w = w->Next()) { + if (w->cargo_cap > 0) { + return false; + } + } + return true; + } else if (cid == BaseVehicleListWindow::CF_FREIGHT) { + bool have_capacity = false; + for (const Vehicle *w = v; w != nullptr; w = w->Next()) { + if (w->cargo_cap > 0) { + if (IsCargoInClass(w->cargo_type, CC_PASSENGERS)) { + return false; + } else { + have_capacity = true; + } + } + } + return have_capacity; + } else { + for (const Vehicle *w = v; w != nullptr; w = w->Next()) { + if (w->cargo_cap > 0 && w->cargo_type == cid) { + return true; + } + } + return false; + } +} + +static GUIVehicleGroupList::FilterFunction * const _filter_funcs[] = { + &CargoFilter, +}; + +/** + * Set cargo filter list item index. + * @param index The index to be set + */ +void BaseVehicleListWindow::SetCargoFilterIndex(byte index) +{ + if (this->cargo_filter_criteria != index) { + this->cargo_filter_criteria = index; + /* Deactivate filter if criteria is 'Show All', activate it otherwise. */ + this->vehgroups.SetFilterState(this->cargo_filter[this->cargo_filter_criteria] != CF_ANY); + this->vehgroups.SetFilterType(0); + this->vehgroups.ForceRebuild(); + } +} + +/** + *Populate the filter list and set the cargo filter criteria. + */ +void BaseVehicleListWindow::SetCargoFilterArray() +{ + byte filter_items = 0; + + /* Add item for disabling filtering. */ + this->cargo_filter[filter_items] = CF_ANY; + this->cargo_filter_texts[filter_items] = STR_CARGO_TYPE_FILTER_ALL; + this->cargo_filter_criteria = filter_items; + filter_items++; + + /* Add item for freight (i.e. vehicles with cargo capacity and with no passenger capacity). */ + this->cargo_filter[filter_items] = CF_FREIGHT; + this->cargo_filter_texts[filter_items] = STR_CARGO_TYPE_FILTER_FREIGHT; + filter_items++; + + /* Add item for vehicles not carrying anything, e.g. train engines. */ + this->cargo_filter[filter_items] = CF_NONE; + this->cargo_filter_texts[filter_items] = STR_CARGO_TYPE_FILTER_NONE; + filter_items++; + + /* Collect available cargo types for filtering. */ + for (const auto &cs : _sorted_cargo_specs) { + 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->vehgroups.SetFilterFuncs(_filter_funcs); + this->vehgroups.SetFilterState(this->cargo_filter[this->cargo_filter_criteria] != CF_ANY); +} + +/** + *Filter the engine list against the currently selected cargo filter. + */ +void BaseVehicleListWindow::FilterVehicleList() +{ + this->vehgroups.Filter(this->cargo_filter[this->cargo_filter_criteria]); + if (this->vehicles.size() == 0) { + /* No vehicle passed through the filter, invalidate the previously selected vehicle */ + this->vehicle_sel = INVALID_VEHICLE; + } else if (this->vehicle_sel != INVALID_VEHICLE && std::find(this->vehicles.begin(), this->vehicles.end(), Vehicle::Get(this->vehicle_sel)) == this->vehicles.end()) { // previously selected engine didn't pass the filter, remove selection + this->vehicle_sel = INVALID_VEHICLE; + } +} + /** * Compute the size for the Action dropdown. * @param show_autoreplace If true include the autoreplace item. @@ -248,6 +364,7 @@ Dimension BaseVehicleListWindow::GetActionDropdownSize(bool show_autoreplace, bo void BaseVehicleListWindow::OnInit() { this->order_arrow_width = GetStringBoundingBox(STR_TINY_RIGHT_ARROW).width; + this->SetCargoFilterArray(); } /** @@ -422,7 +539,7 @@ typedef std::vector SubtypeList; ///< List of refit subtypes associ */ static void DrawVehicleRefitWindow(const SubtypeList list[NUM_CARGO], const int sel[2], uint pos, uint rows, uint delta, const Rect &r) { - uint y = r.top + WD_MATRIX_TOP; + Rect ir = r.Shrink(WidgetDimensions::scaled.matrix); uint current = 0; bool rtl = _current_text_dir == TD_RTL; @@ -430,12 +547,11 @@ static void DrawVehicleRefitWindow(const SubtypeList list[NUM_CARGO], const int uint iconheight = GetSpriteSize(SPR_CIRCLE_FOLDED).height; int linecolour = _colour_gradient[COLOUR_ORANGE][4]; - int iconleft = rtl ? r.right - WD_MATRIX_RIGHT - iconwidth : r.left + WD_MATRIX_LEFT; - int iconcenter = rtl ? r.right - WD_MATRIX_RIGHT - iconwidth / 2 : r.left + WD_MATRIX_LEFT + iconwidth / 2; - int iconinner = rtl ? r.right - WD_MATRIX_RIGHT - iconwidth : r.left + WD_MATRIX_LEFT + iconwidth; + int iconleft = rtl ? ir.right - iconwidth : ir.left; + int iconcenter = rtl ? ir.right - iconwidth / 2 : ir.left + iconwidth / 2; + int iconinner = rtl ? ir.right - iconwidth : ir.left + iconwidth; - int textleft = r.left + WD_MATRIX_LEFT + (rtl ? 0 : iconwidth + 4); - int textright = r.right - WD_MATRIX_RIGHT - (rtl ? iconwidth + 4 : 0); + Rect tr = ir.Indent(iconwidth + WidgetDimensions::scaled.hsep_wide, rtl); /* Draw the list of subtypes for each cargo, and find the selected refit option (by its position). */ for (uint i = 0; current < pos + rows && i < NUM_CARGO; i++) { @@ -454,12 +570,12 @@ static void DrawVehicleRefitWindow(const SubtypeList list[NUM_CARGO], const int if (list[i].size() > 1) { if (refit.subtype != 0xFF) { /* Draw tree lines */ - int ycenter = y + FONT_HEIGHT_NORMAL / 2; - GfxDrawLine(iconcenter, y - WD_MATRIX_TOP, iconcenter, j == list[i].size() - 1 ? ycenter : y - WD_MATRIX_TOP + delta - 1, linecolour); + int ycenter = tr.top + FONT_HEIGHT_NORMAL / 2; + GfxDrawLine(iconcenter, tr.top - WidgetDimensions::scaled.matrix.top, iconcenter, j == list[i].size() - 1 ? ycenter : tr.top - WidgetDimensions::scaled.matrix.top + delta - 1, linecolour); GfxDrawLine(iconcenter, ycenter, iconinner, ycenter, linecolour); } else { /* Draw expand/collapse icon */ - DrawSprite(sel[0] == (int)i ? SPR_CIRCLE_UNFOLDED : SPR_CIRCLE_FOLDED, PAL_NONE, iconleft, y + (FONT_HEIGHT_NORMAL - iconheight) / 2); + DrawSprite(sel[0] == (int)i ? SPR_CIRCLE_UNFOLDED : SPR_CIRCLE_FOLDED, PAL_NONE, iconleft, tr.top + (FONT_HEIGHT_NORMAL - iconheight) / 2); } } @@ -467,9 +583,9 @@ static void DrawVehicleRefitWindow(const SubtypeList list[NUM_CARGO], const int /* Get the cargo name. */ SetDParam(0, CargoSpec::Get(refit.cargo)->name); SetDParam(1, refit.string); - DrawString(textleft, textright, y, STR_JUST_STRING_STRING, colour); + DrawString(tr, STR_JUST_STRING_STRING, colour); - y += delta; + tr.top += delta; current++; } } @@ -748,7 +864,7 @@ struct RefitWindow : public Window { { switch (widget) { case WID_VR_MATRIX: - resize->height = WD_MATRIX_TOP + FONT_HEIGHT_NORMAL + WD_MATRIX_BOTTOM; + resize->height = FONT_HEIGHT_NORMAL + padding.height; size->height = resize->height * 8; break; @@ -757,7 +873,7 @@ struct RefitWindow : public Window { break; case WID_VR_INFO: - size->width = WD_FRAMERECT_LEFT + this->information_width + WD_FRAMERECT_RIGHT; + size->width = this->information_width + padding.height; break; } } @@ -817,8 +933,8 @@ struct RefitWindow : public Window { switch (widget) { case WID_VR_VEHICLE_PANEL_DISPLAY: { Vehicle *v = Vehicle::Get(this->window_number); - DrawVehicleImage(v, this->sprite_left + WD_FRAMERECT_LEFT, this->sprite_right - WD_FRAMERECT_RIGHT, - r.top + WD_FRAMERECT_TOP, INVALID_VEHICLE, EIT_IN_DETAILS, this->hscroll != nullptr ? this->hscroll->GetPosition() : 0); + DrawVehicleImage(v, {this->sprite_left, r.top, this->sprite_right, r.bottom}, + INVALID_VEHICLE, EIT_IN_DETAILS, this->hscroll != nullptr ? this->hscroll->GetPosition() : 0); /* Highlight selected vehicles. */ if (this->order != INVALID_VEH_ORDER_ID) break; @@ -831,6 +947,11 @@ struct RefitWindow : public Window { int left = INT32_MIN; int width = 0; + /* Determine top & bottom position of the highlight.*/ + const int height = ScaleSpriteTrad(12); + const int highlight_top = CenterBounds(r.top, r.bottom, height); + const int highlight_bottom = highlight_top + height - 1; + for (Train *u = Train::From(v); u != nullptr; u = u->Next()) { /* Start checking. */ const bool contained = std::find(vehicles_to_refit.begin(), vehicles_to_refit.end(), u->index) != vehicles_to_refit.end(); @@ -851,12 +972,13 @@ struct RefitWindow : public Window { left = std::max(0, left); if (_current_text_dir == TD_RTL) { - right = this->GetWidget(WID_VR_VEHICLE_PANEL_DISPLAY)->current_x - left; + right = r.Width() - left; left = right - width; } if (left != right) { - DrawFrameRect(left, r.top + WD_FRAMERECT_TOP, right, r.top + WD_FRAMERECT_TOP + ScaleGUITrad(14) - 1, COLOUR_WHITE, FR_BORDERONLY); + Rect hr = {left, highlight_top, right, highlight_bottom}; + DrawFrameRect(hr.Expand(WidgetDimensions::scaled.bevel), COLOUR_WHITE, FR_BORDERONLY); } left = INT32_MIN; @@ -882,8 +1004,7 @@ struct RefitWindow : public Window { if (this->cargo != nullptr) { StringID string = this->GetCapacityString(this->cargo); if (string != INVALID_STRING_ID) { - DrawStringMultiLine(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, - r.top + WD_FRAMERECT_TOP, r.bottom - WD_FRAMERECT_BOTTOM, string); + DrawStringMultiLine(r.Shrink(WidgetDimensions::scaled.framerect), string); } } break; @@ -1098,7 +1219,7 @@ static const NWidgetPart _nested_vehicle_refit_widgets[] = { NWidget(WWT_MATRIX, COLOUR_GREY, WID_VR_MATRIX), SetMinimalSize(228, 112), SetResize(1, 14), SetFill(1, 1), SetMatrixDataTip(1, 0, STR_NULL), SetScrollbar(WID_VR_SCROLLBAR), NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_VR_SCROLLBAR), EndContainer(), - NWidget(WWT_PANEL, COLOUR_GREY, WID_VR_INFO), SetMinimalTextLines(2, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM), SetResize(1, 0), EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY, WID_VR_INFO), SetMinimalTextLines(2, WidgetDimensions::unscaled.framerect.Vertical()), SetResize(1, 0), EndContainer(), NWidget(NWID_HORIZONTAL), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_VR_REFIT), SetFill(1, 0), SetResize(1, 0), NWidget(WWT_RESIZEBOX, COLOUR_GREY), @@ -1383,15 +1504,23 @@ static const NWidgetPart _nested_vehicle_list[] = { EndContainer(), NWidget(NWID_HORIZONTAL), - NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_VL_GROUP_ORDER), SetMinimalSize(81, 12), SetFill(0, 1), SetDataTip(STR_STATION_VIEW_GROUP, STR_TOOLTIP_GROUP_ORDER), - NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_VL_GROUP_BY_PULLDOWN), SetMinimalSize(167, 12), SetFill(0, 1), SetDataTip(0x0, STR_TOOLTIP_GROUP_ORDER), - NWidget(WWT_PANEL, COLOUR_GREY), SetMinimalSize(12, 12), SetFill(1, 1), SetResize(1, 0), EndContainer(), - EndContainer(), - - NWidget(NWID_HORIZONTAL), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_VL_SORT_ORDER), SetMinimalSize(81, 12), SetFill(0, 1), SetDataTip(STR_BUTTON_SORT_BY, STR_TOOLTIP_SORT_ORDER), - NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_VL_SORT_BY_PULLDOWN), SetMinimalSize(167, 12), SetFill(0, 1), SetDataTip(0x0, STR_TOOLTIP_SORT_CRITERIA), - NWidget(WWT_PANEL, COLOUR_GREY), SetMinimalSize(12, 12), SetFill(1, 1), SetResize(1, 0), EndContainer(), + NWidget(NWID_VERTICAL), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_VL_GROUP_ORDER), SetMinimalSize(0, 12), SetFill(1, 0), SetDataTip(STR_STATION_VIEW_GROUP, STR_TOOLTIP_GROUP_ORDER), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_VL_SORT_ORDER), SetMinimalSize(0, 12), SetFill(1, 0), SetDataTip(STR_BUTTON_SORT_BY, STR_TOOLTIP_SORT_ORDER), + EndContainer(), + NWidget(NWID_VERTICAL), + NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_VL_GROUP_BY_PULLDOWN), SetMinimalSize(0, 12), SetFill(1, 0), SetDataTip(0x0, STR_TOOLTIP_GROUP_ORDER), + NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_VL_SORT_BY_PULLDOWN), SetMinimalSize(0, 12), SetFill(1, 0), SetDataTip(0x0, STR_TOOLTIP_SORT_CRITERIA), + EndContainer(), + NWidget(NWID_VERTICAL), + NWidget(WWT_PANEL, COLOUR_GREY), SetMinimalSize(0, 12), SetFill(1, 1), SetResize(1, 0), EndContainer(), + NWidget(NWID_HORIZONTAL), + NWidget(NWID_SELECTION, INVALID_COLOUR, WID_VL_FILTER_BY_CARGO_SEL), + NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_VL_FILTER_BY_CARGO), SetMinimalSize(0, 12), SetFill(0, 0), SetDataTip(STR_JUST_STRING, STR_TOOLTIP_FILTER_CRITERIA), + EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY), SetMinimalSize(0, 12), SetFill(1, 1), SetResize(1, 0), EndContainer(), + EndContainer(), + EndContainer(), EndContainer(), NWidget(NWID_HORIZONTAL), @@ -1472,19 +1601,17 @@ static void DrawSmallOrderList(const Order *order, int left, int right, int y, u /** * Draws an image of a vehicle chain * @param v Front vehicle - * @param left The minimum horizontal position - * @param right The maximum horizontal position - * @param y Vertical position to draw at + * @param r Rect to draw at * @param selection Selected vehicle to draw a frame around * @param skip Number of pixels to skip at the front (for scrolling) */ -void DrawVehicleImage(const Vehicle *v, int left, int right, int y, VehicleID selection, EngineImageType image_type, int skip) +void DrawVehicleImage(const Vehicle *v, const Rect &r, VehicleID selection, EngineImageType image_type, int skip) { switch (v->type) { - case VEH_TRAIN: DrawTrainImage(Train::From(v), left, right, y, selection, image_type, skip); break; - case VEH_ROAD: DrawRoadVehImage(v, left, right, y, selection, image_type, skip); break; - case VEH_SHIP: DrawShipImage(v, left, right, y, selection, image_type); break; - case VEH_AIRCRAFT: DrawAircraftImage(v, left, right, y, selection, image_type); break; + case VEH_TRAIN: DrawTrainImage(Train::From(v), r, selection, image_type, skip); break; + case VEH_ROAD: DrawRoadVehImage(v, r, selection, image_type, skip); break; + case VEH_SHIP: DrawShipImage(v, r, selection, image_type); break; + case VEH_AIRCRAFT: DrawAircraftImage(v, r, selection, image_type); break; default: NOT_REACHED(); } } @@ -1498,9 +1625,9 @@ void DrawVehicleImage(const Vehicle *v, int left, int right, int y, VehicleID se uint GetVehicleListHeight(VehicleType type, uint divisor) { /* Name + vehicle + profit */ - uint base = ScaleGUITrad(GetVehicleHeight(type)) + 2 * FONT_HEIGHT_SMALL; + uint base = ScaleGUITrad(GetVehicleHeight(type)) + 2 * FONT_HEIGHT_SMALL + WidgetDimensions::scaled.matrix.Vertical(); /* Drawing of the 4 small orders + profit*/ - if (type >= VEH_SHIP) base = std::max(base, 5U * FONT_HEIGHT_SMALL); + if (type >= VEH_SHIP) base = std::max(base, 5U * FONT_HEIGHT_SMALL + WidgetDimensions::scaled.matrix.Vertical()); if (divisor == 1) return base; @@ -1517,25 +1644,21 @@ uint GetVehicleListHeight(VehicleType type, uint divisor) */ void BaseVehicleListWindow::DrawVehicleListItems(VehicleID selected_vehicle, int line_height, const Rect &r) const { - int left = r.left + WD_MATRIX_LEFT; - int right = r.right - WD_MATRIX_RIGHT; - int width = right - left; + Rect ir = r.WithHeight(line_height).Shrink(WidgetDimensions::scaled.matrix, RectPadding::zero); bool rtl = _current_text_dir == TD_RTL; - int text_offset = std::max(GetSpriteSize(SPR_PROFIT_LOT).width, GetDigitWidth() * this->unitnumber_digits) + WD_FRAMERECT_RIGHT; - int text_left = left + (rtl ? 0 : text_offset); - int text_right = right - (rtl ? text_offset : 0); + Dimension profit = GetSpriteSize(SPR_PROFIT_LOT); + int text_offset = std::max(profit.width, GetDigitWidth() * this->unitnumber_digits) + WidgetDimensions::scaled.hsep_normal; + Rect tr = ir.Indent(text_offset, rtl); bool show_orderlist = this->vli.vtype >= VEH_SHIP; - int orderlist_left = left + (rtl ? 0 : std::max(ScaleGUITrad(100) + text_offset, width / 2)); - int orderlist_right = right - (rtl ? std::max(ScaleGUITrad(100) + text_offset, width / 2) : 0); + Rect olr = ir.Indent(std::max(ScaleGUITrad(100) + text_offset, ir.Width() / 2), rtl); - int image_left = (rtl && show_orderlist) ? orderlist_right : text_left; - int image_right = (!rtl && show_orderlist) ? orderlist_left : text_right; + int image_left = (rtl && show_orderlist) ? olr.right : tr.left; + int image_right = (!rtl && show_orderlist) ? olr.left : tr.right; - int vehicle_button_x = rtl ? right - GetSpriteSize(SPR_PROFIT_LOT).width : left; + int vehicle_button_x = rtl ? ir.right - profit.width : ir.left; - int y = r.top; uint max = static_cast(std::min(this->vscroll->GetPosition() + this->vscroll->GetCapacity(), this->vehgroups.size())); for (uint i = this->vscroll->GetPosition(); i < max; ++i) { @@ -1543,31 +1666,60 @@ void BaseVehicleListWindow::DrawVehicleListItems(VehicleID selected_vehicle, int SetDParam(0, vehgroup.GetDisplayProfitThisYear()); SetDParam(1, vehgroup.GetDisplayProfitLastYear()); - DrawString(text_left, text_right, y + line_height - FONT_HEIGHT_SMALL - WD_FRAMERECT_BOTTOM - 1, STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR); + DrawString(tr.left, tr.right, ir.bottom - FONT_HEIGHT_SMALL - WidgetDimensions::scaled.framerect.bottom, STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR); - DrawVehicleProfitButton(vehgroup.GetOldestVehicleAge(), vehgroup.GetDisplayProfitLastYear(), vehgroup.NumVehicles(), vehicle_button_x, y + FONT_HEIGHT_NORMAL + 3); + DrawVehicleProfitButton(vehgroup.GetOldestVehicleAge(), vehgroup.GetDisplayProfitLastYear(), vehgroup.NumVehicles(), vehicle_button_x, ir.top + FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal); switch (this->grouping) { case GB_NONE: { const Vehicle *v = vehgroup.GetSingleVehicle(); if (HasBit(v->vehicle_flags, VF_PATHFINDER_LOST)) { - DrawSprite(SPR_WARNING_SIGN, PAL_NONE, vehicle_button_x, y + FONT_HEIGHT_NORMAL + 3 + GetSpriteSize(SPR_PROFIT_LOT).height); + DrawSprite(SPR_WARNING_SIGN, PAL_NONE, vehicle_button_x, ir.top + FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal + profit.height); } - DrawVehicleImage(v, image_left, image_right, y + FONT_HEIGHT_SMALL - 1, selected_vehicle, EIT_IN_LIST, 0); + DrawVehicleImage(v, {image_left, ir.top, image_right, ir.bottom}, selected_vehicle, EIT_IN_LIST, 0); - if (!v->name.empty()) { + if (_settings_client.gui.show_cargo_in_vehicle_lists) { + /* Get the cargoes the vehicle can carry */ + CargoTypes vehicle_cargoes = 0; + + for (auto u = v; u != nullptr; u = u->Next()) { + if (u->cargo_cap == 0) continue; + + SetBit(vehicle_cargoes, u->cargo_type); + } + + if (!v->name.empty()) { + /* The vehicle got a name so we will print it and the cargoes */ + SetDParam(0, STR_TINY_BLACK_VEHICLE); + SetDParam(1, v->index); + SetDParam(2, STR_VEHICLE_LIST_CARGO); + SetDParam(3, vehicle_cargoes); + DrawString(tr.left, tr.right, ir.top, STR_VEHICLE_LIST_NAME_AND_CARGO); + } else if (v->group_id != DEFAULT_GROUP) { + /* The vehicle has no name, but is member of a group, so print group name and the cargoes */ + SetDParam(0, STR_TINY_GROUP); + SetDParam(1, v->group_id); + SetDParam(2, STR_VEHICLE_LIST_CARGO); + SetDParam(3, vehicle_cargoes); + DrawString(tr.left, tr.right, ir.top, STR_VEHICLE_LIST_NAME_AND_CARGO); + } else { + /* The vehicle has no name, and is not a member of a group, so just print the cargoes */ + SetDParam(0, vehicle_cargoes); + DrawString(tr.left, tr.right, ir.top, STR_VEHICLE_LIST_CARGO); + } + } else if (!v->name.empty()) { /* The vehicle got a name so we will print it */ SetDParam(0, v->index); - DrawString(text_left, text_right, y, STR_TINY_BLACK_VEHICLE); + DrawString(tr.left, tr.right, ir.top, STR_TINY_BLACK_VEHICLE); } else if (v->group_id != DEFAULT_GROUP) { /* The vehicle has no name, but is member of a group, so print group name */ SetDParam(0, v->group_id); - DrawString(text_left, text_right, y, STR_TINY_GROUP, TC_BLACK); + DrawString(tr.left, tr.right, ir.top, STR_TINY_GROUP, TC_BLACK); } - if (show_orderlist) DrawSmallOrderList(v, orderlist_left, orderlist_right, y, this->order_arrow_width, v->cur_real_order_index); + if (show_orderlist) DrawSmallOrderList(v, olr.left, olr.right, ir.top, this->order_arrow_width, v->cur_real_order_index); StringID str; if (v->IsChainInDepot()) { @@ -1577,7 +1729,7 @@ void BaseVehicleListWindow::DrawVehicleListItems(VehicleID selected_vehicle, int } SetDParam(0, v->unitnumber); - DrawString(left, right, y + 2, str); + DrawString(ir.left, ir.right, ir.top + WidgetDimensions::scaled.framerect.top, str); break; } @@ -1585,21 +1737,21 @@ void BaseVehicleListWindow::DrawVehicleListItems(VehicleID selected_vehicle, int assert(vehgroup.NumVehicles() > 0); for (int i = 0; i < static_cast(vehgroup.NumVehicles()); ++i) { - if (image_left + 8 * i >= image_right) break; // Break if there is no more space to draw any more vehicles anyway. - DrawVehicleImage(vehgroup.vehicles_begin[i], image_left + 8 * i, image_right, y + FONT_HEIGHT_SMALL - 1, selected_vehicle, EIT_IN_LIST, 0); + if (image_left + WidgetDimensions::scaled.hsep_wide * i >= image_right) break; // Break if there is no more space to draw any more vehicles anyway. + DrawVehicleImage(vehgroup.vehicles_begin[i], {image_left + WidgetDimensions::scaled.hsep_wide * i, ir.top, image_right, ir.bottom}, selected_vehicle, EIT_IN_LIST, 0); } - if (show_orderlist) DrawSmallOrderList((vehgroup.vehicles_begin[0])->GetFirstOrder(), orderlist_left, orderlist_right, y, this->order_arrow_width); + if (show_orderlist) DrawSmallOrderList((vehgroup.vehicles_begin[0])->GetFirstOrder(), olr.left, olr.right, ir.top, this->order_arrow_width); SetDParam(0, vehgroup.NumVehicles()); - DrawString(left, right, y + 2, STR_BLACK_COMMA); + DrawString(ir.left, ir.right, ir.top + WidgetDimensions::scaled.framerect.top, STR_BLACK_COMMA); break; default: NOT_REACHED(); } - y += line_height; + ir = ir.Translate(0, line_height); } } @@ -1662,6 +1814,8 @@ public: { this->CreateNestedTree(); + this->GetWidget(WID_VL_FILTER_BY_CARGO_SEL)->SetDisplayedPlane((this->vli.type == VL_SHARED_ORDERS) ? SZSP_NONE : 0); + this->vscroll = this->GetScrollbar(WID_VL_SCROLLBAR); this->BuildVehicleList(); @@ -1719,6 +1873,20 @@ public: break; } + case WID_VL_GROUP_BY_PULLDOWN: + size->width = GetStringListWidth(this->vehicle_group_by_names) + padding.width; + break; + + case WID_VL_SORT_BY_PULLDOWN: + size->width = GetStringListWidth(this->vehicle_group_none_sorter_names); + size->width = std::max(size->width, GetStringListWidth(this->vehicle_group_shared_orders_sorter_names)); + size->width += padding.width; + break; + + case WID_VL_FILTER_BY_CARGO: + size->width = GetStringListWidth(this->cargo_filter_texts) + padding.width; + break; + case WID_VL_MANAGE_VEHICLES_DROPDOWN: { Dimension d = this->GetActionDropdownSize(this->vli.type == VL_STANDARD, false); d.height += padding.height; @@ -1736,6 +1904,10 @@ public: SetDParam(0, STR_VEHICLE_LIST_AVAILABLE_TRAINS + this->vli.vtype); break; + case WID_VL_FILTER_BY_CARGO: + SetDParam(0, this->cargo_filter_texts[this->cargo_filter_criteria]); + break; + case WID_VL_CAPTION: case WID_VL_CAPTION_SHARED_ORDERS: { switch (this->vli.type) { @@ -1819,6 +1991,8 @@ public: /* Set text of sort by dropdown widget. */ this->GetWidget(WID_VL_SORT_BY_PULLDOWN)->widget_data = this->GetVehicleSorterNames()[this->vehgroups.SortType()]; + this->GetWidget(WID_VL_FILTER_BY_CARGO)->widget_data = this->cargo_filter_texts[this->cargo_filter_criteria]; + this->DrawWidgets(); } @@ -1845,6 +2019,10 @@ public: (this->vli.vtype == VEH_TRAIN || this->vli.vtype == VEH_ROAD) ? 0 : (1 << 10)); return; + case WID_VL_FILTER_BY_CARGO: // Cargo filter dropdown + ShowDropDownMenu(this, this->cargo_filter_texts, this->cargo_filter_criteria, WID_VL_FILTER_BY_CARGO, 0, 0); + break; + case WID_VL_LIST: { // Matrix to show vehicles uint id_v = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_VL_LIST); if (id_v >= this->vehgroups.size()) return; // click out of list bound @@ -1865,16 +2043,16 @@ public: case GB_SHARED_ORDERS: { assert(vehgroup.NumVehicles() > 0); - const Vehicle *v = vehgroup.vehicles_begin[0]; - /* We do not support VehicleClicked() here since the contextual action may only make sense for individual vehicles */ - - if (_ctrl_pressed) { - ShowOrdersWindow(v); - } else { - if (vehgroup.NumVehicles() == 1) { - ShowVehicleViewWindow(v); + if (!VehicleClicked(vehgroup)) { + const Vehicle *v = vehgroup.vehicles_begin[0]; + if (_ctrl_pressed) { + ShowOrdersWindow(v); } else { - ShowVehicleListWindow(v); + if (vehgroup.NumVehicles() == 1) { + ShowVehicleViewWindow(v); + } else { + ShowVehicleListWindow(v); + } } } break; @@ -1913,6 +2091,10 @@ public: this->vehgroups.SetSortType(index); break; + case WID_VL_FILTER_BY_CARGO: + this->SetCargoFilterIndex(index); + break; + case WID_VL_MANAGE_VEHICLES_DROPDOWN: assert(this->vehicles.size() != 0); @@ -2105,10 +2287,10 @@ static const NWidgetPart _nested_train_vehicle_details_widgets[] = { extern int GetTrainDetailsWndVScroll(VehicleID veh_id, TrainDetailsWindowTabs det_tab); -extern void DrawTrainDetails(const Train *v, int left, int right, int y, int vscroll_pos, uint16 vscroll_cap, TrainDetailsWindowTabs det_tab); -extern void DrawRoadVehDetails(const Vehicle *v, int left, int right, int y); -extern void DrawShipDetails(const Vehicle *v, int left, int right, int y); -extern void DrawAircraftDetails(const Aircraft *v, int left, int right, int y); +extern void DrawTrainDetails(const Train *v, const Rect &r, int vscroll_pos, uint16 vscroll_cap, TrainDetailsWindowTabs det_tab); +extern void DrawRoadVehDetails(const Vehicle *v, const Rect &r); +extern void DrawShipDetails(const Vehicle *v, const Rect &r); +extern void DrawAircraftDetails(const Aircraft *v, const Rect &r); static StringID _service_interval_dropdown[] = { STR_VEHICLE_DETAILS_DEFAULT, @@ -2169,13 +2351,13 @@ struct VehicleDetailsWindow : Window { uint desired_height; if (v->HasArticulatedPart()) { /* An articulated RV has its text drawn under the sprite instead of after it, hence 15 pixels extra. */ - desired_height = WD_FRAMERECT_TOP + ScaleGUITrad(15) + 3 * FONT_HEIGHT_NORMAL + 2 + WD_FRAMERECT_BOTTOM; + desired_height = ScaleGUITrad(15) + 3 * FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal * 2; /* Add space for the cargo amount for each part. */ for (const Vehicle *u = v; u != nullptr; u = u->Next()) { - if (u->cargo_cap != 0) desired_height += FONT_HEIGHT_NORMAL + 1; + if (u->cargo_cap != 0) desired_height += FONT_HEIGHT_NORMAL; } } else { - desired_height = WD_FRAMERECT_TOP + 4 * FONT_HEIGHT_NORMAL + 3 + WD_FRAMERECT_BOTTOM; + desired_height = 4 * FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal * 2; } return desired_height; } @@ -2185,7 +2367,7 @@ struct VehicleDetailsWindow : Window { switch (widget) { case WID_VD_TOP_DETAILS: { Dimension dim = { 0, 0 }; - size->height = WD_FRAMERECT_TOP + 4 * FONT_HEIGHT_NORMAL + WD_FRAMERECT_BOTTOM; + size->height = 4 * FONT_HEIGHT_NORMAL + padding.height; for (uint i = 0; i < 4; i++) SetDParamMaxValue(i, INT16_MAX); static const StringID info_strings[] = { @@ -2200,7 +2382,7 @@ struct VehicleDetailsWindow : Window { } SetDParam(0, STR_VEHICLE_INFO_AGE); dim = maxdim(dim, GetStringBoundingBox(STR_VEHICLE_INFO_AGE_RUNNING_COST_YR)); - size->width = dim.width + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; + size->width = dim.width + padding.width; break; } @@ -2208,15 +2390,15 @@ struct VehicleDetailsWindow : Window { const Vehicle *v = Vehicle::Get(this->window_number); switch (v->type) { case VEH_ROAD: - size->height = this->GetRoadVehDetailsHeight(v); + size->height = this->GetRoadVehDetailsHeight(v) + padding.height; break; case VEH_SHIP: - size->height = WD_FRAMERECT_TOP + 4 * FONT_HEIGHT_NORMAL + 3 + WD_FRAMERECT_BOTTOM; + size->height = 4 * FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal * 2 + padding.height; break; case VEH_AIRCRAFT: - size->height = WD_FRAMERECT_TOP + 5 * FONT_HEIGHT_NORMAL + 4 + WD_FRAMERECT_BOTTOM; + size->height = 5 * FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal * 2 + padding.height; break; default: @@ -2226,7 +2408,7 @@ struct VehicleDetailsWindow : Window { } case WID_VD_MATRIX: - resize->height = std::max(ScaleGUITrad(14), WD_MATRIX_TOP + FONT_HEIGHT_NORMAL + WD_MATRIX_BOTTOM); + resize->height = std::max(ScaleGUITrad(14), FONT_HEIGHT_NORMAL + padding.height); size->height = 4 * resize->height; break; @@ -2236,7 +2418,7 @@ struct VehicleDetailsWindow : Window { *size = maxdim(*size, GetStringBoundingBox(*strs++)); } size->width += padding.width; - size->height = FONT_HEIGHT_NORMAL + WD_DROPDOWNTEXT_TOP + WD_DROPDOWNTEXT_BOTTOM; + size->height = FONT_HEIGHT_NORMAL + padding.height; break; } @@ -2246,8 +2428,8 @@ struct VehicleDetailsWindow : Window { size->width = std::max( GetStringBoundingBox(STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT).width, GetStringBoundingBox(STR_VEHICLE_DETAILS_SERVICING_INTERVAL_DAYS).width - ) + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; - size->height = WD_FRAMERECT_TOP + FONT_HEIGHT_NORMAL + WD_FRAMERECT_BOTTOM; + ) + padding.width; + size->height = FONT_HEIGHT_NORMAL + padding.height; break; } } @@ -2269,20 +2451,18 @@ struct VehicleDetailsWindow : Window { * Draw the details for the given vehicle at the position of the Details windows * * @param v current vehicle - * @param left The left most coordinate to draw - * @param right The right most coordinate to draw - * @param y The y coordinate + * @param r the Rect to draw within * @param vscroll_pos Position of scrollbar (train only) * @param vscroll_cap Number of lines currently displayed (train only) * @param det_tab Selected details tab (train only) */ - static void DrawVehicleDetails(const Vehicle *v, int left, int right, int y, int vscroll_pos, uint vscroll_cap, TrainDetailsWindowTabs det_tab) + static void DrawVehicleDetails(const Vehicle *v, const Rect &r, int vscroll_pos, uint vscroll_cap, TrainDetailsWindowTabs det_tab) { switch (v->type) { - case VEH_TRAIN: DrawTrainDetails(Train::From(v), left, right, y, vscroll_pos, vscroll_cap, det_tab); break; - case VEH_ROAD: DrawRoadVehDetails(v, left, right, y); break; - case VEH_SHIP: DrawShipDetails(v, left, right, y); break; - case VEH_AIRCRAFT: DrawAircraftDetails(Aircraft::From(v), left, right, y); break; + case VEH_TRAIN: DrawTrainDetails(Train::From(v), r, vscroll_pos, vscroll_cap, det_tab); break; + case VEH_ROAD: DrawRoadVehDetails(v, r); break; + case VEH_SHIP: DrawShipDetails(v, r); break; + case VEH_AIRCRAFT: DrawAircraftDetails(Aircraft::From(v), r); break; default: NOT_REACHED(); } } @@ -2298,15 +2478,15 @@ struct VehicleDetailsWindow : Window { switch (widget) { case WID_VD_TOP_DETAILS: { - int y = r.top + WD_FRAMERECT_TOP; + Rect tr = r.Shrink(WidgetDimensions::scaled.framerect); /* Draw running cost */ SetDParam(1, v->age / DAYS_IN_LEAP_YEAR); SetDParam(0, (v->age + DAYS_IN_YEAR < v->max_age) ? STR_VEHICLE_INFO_AGE : STR_VEHICLE_INFO_AGE_RED); SetDParam(2, v->max_age / DAYS_IN_LEAP_YEAR); SetDParam(3, v->GetDisplayRunningCost()); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_VEHICLE_INFO_AGE_RUNNING_COST_YR); - y += FONT_HEIGHT_NORMAL; + DrawString(tr, STR_VEHICLE_INFO_AGE_RUNNING_COST_YR); + tr.top += FONT_HEIGHT_NORMAL; /* Draw max speed */ StringID string; @@ -2337,55 +2517,60 @@ struct VehicleDetailsWindow : Window { string = STR_VEHICLE_INFO_MAX_SPEED; } } - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, string); - y += FONT_HEIGHT_NORMAL; + DrawString(tr, string); + tr.top += FONT_HEIGHT_NORMAL; /* Draw profit */ SetDParam(0, v->GetDisplayProfitThisYear()); SetDParam(1, v->GetDisplayProfitLastYear()); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR); - y += FONT_HEIGHT_NORMAL; + if (v->IsGroundVehicle()) { + SetDParam(2, v->GetDisplayMinPowerToWeight()); + DrawString(tr, STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE); + } else { + DrawString(tr, STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR); + } + tr.top += FONT_HEIGHT_NORMAL; /* Draw breakdown & reliability */ SetDParam(0, ToPercent16(v->reliability)); SetDParam(1, v->breakdowns_since_last_service); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS); + DrawString(tr, STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS); break; } - case WID_VD_MATRIX: + case WID_VD_MATRIX: { /* For trains only. */ - DrawVehicleDetails(v, r.left + WD_MATRIX_LEFT, r.right - WD_MATRIX_RIGHT, r.top + WD_MATRIX_TOP, this->vscroll->GetPosition(), this->vscroll->GetCapacity(), this->tab); + DrawVehicleDetails(v, r.Shrink(WidgetDimensions::scaled.matrix, RectPadding::zero).WithHeight(this->resize.step_height), this->vscroll->GetPosition(), this->vscroll->GetCapacity(), this->tab); break; + } case WID_VD_MIDDLE_DETAILS: { /* For other vehicles, at the place of the matrix. */ bool rtl = _current_text_dir == TD_RTL; - uint sprite_width = GetSingleVehicleWidth(v, EIT_IN_DETAILS) + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; - - uint text_left = r.left + (rtl ? 0 : sprite_width); - uint text_right = r.right - (rtl ? sprite_width : 0); + uint sprite_width = GetSingleVehicleWidth(v, EIT_IN_DETAILS) + WidgetDimensions::scaled.framerect.Horizontal(); + Rect tr = r.Shrink(WidgetDimensions::scaled.framerect); /* Articulated road vehicles use a complete line. */ if (v->type == VEH_ROAD && v->HasArticulatedPart()) { - DrawVehicleImage(v, r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, INVALID_VEHICLE, EIT_IN_DETAILS, 0); + DrawVehicleImage(v, tr.WithHeight(ScaleGUITrad(GetVehicleHeight(v->type)), false), INVALID_VEHICLE, EIT_IN_DETAILS, 0); } else { - uint sprite_left = rtl ? text_right : r.left; - uint sprite_right = rtl ? r.right : text_left; - - DrawVehicleImage(v, sprite_left + WD_FRAMERECT_LEFT, sprite_right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, INVALID_VEHICLE, EIT_IN_DETAILS, 0); + Rect sr = tr.WithWidth(sprite_width, rtl); + DrawVehicleImage(v, sr.WithHeight(ScaleGUITrad(GetVehicleHeight(v->type)), false), INVALID_VEHICLE, EIT_IN_DETAILS, 0); } - DrawVehicleDetails(v, text_left + WD_FRAMERECT_LEFT, text_right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, 0, 0, this->tab); + + DrawVehicleDetails(v, tr.Indent(sprite_width, rtl), 0, 0, this->tab); break; } - case WID_VD_SERVICING_INTERVAL: + case WID_VD_SERVICING_INTERVAL: { /* Draw service interval text */ + Rect tr = r.Shrink(WidgetDimensions::scaled.framerect); SetDParam(0, v->GetServiceInterval()); SetDParam(1, v->date_of_last_service); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + (r.bottom - r.top + 1 - FONT_HEIGHT_NORMAL) / 2, + DrawString(tr.left, tr.right, CenterBounds(r.top, r.bottom, FONT_HEIGHT_NORMAL), v->ServiceIntervalIsPercent() ? STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT : STR_VEHICLE_DETAILS_SERVICING_INTERVAL_DAYS); break; + } } } @@ -2395,7 +2580,7 @@ struct VehicleDetailsWindow : Window { const Vehicle *v = Vehicle::Get(this->window_number); if (v->type == VEH_TRAIN) { - this->DisableWidget(this->tab + WID_VD_DETAILS_CARGO_CARRIED); + this->LowerWidget(this->tab + WID_VD_DETAILS_CARGO_CARRIED); this->vscroll->SetCount(GetTrainDetailsWndVScroll(v->index, this->tab)); } @@ -2439,7 +2624,7 @@ struct VehicleDetailsWindow : Window { case WID_VD_DETAILS_TRAIN_VEHICLES: case WID_VD_DETAILS_CAPACITY_OF_EACH: case WID_VD_DETAILS_TOTAL_CARGO: - this->SetWidgetsDisabledState(false, + this->SetWidgetsLoweredState(false, WID_VD_DETAILS_CARGO_CARRIED, WID_VD_DETAILS_TRAIN_VEHICLES, WID_VD_DETAILS_CAPACITY_OF_EACH, @@ -2540,32 +2725,12 @@ static const NWidgetPart _nested_vehicle_view_widgets[] = { EndContainer(), EndContainer(), NWidget(NWID_HORIZONTAL), - NWidget(WWT_PUSHBTN, COLOUR_GREY, WID_VV_START_STOP), SetMinimalTextLines(1, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM + 2), SetResize(1, 0), SetFill(1, 0), + NWidget(WWT_PUSHBTN, COLOUR_GREY, WID_VV_START_STOP), SetResize(1, 0), SetFill(1, 0), NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_VV_ORDER_LOCATION), SetMinimalSize(12, 14), SetDataTip(SPR_GOTO_LOCATION, STR_VEHICLE_VIEW_ORDER_LOCATION_TOOLTIP), NWidget(WWT_RESIZEBOX, COLOUR_GREY), EndContainer(), }; -/** Vehicle view window descriptor for all vehicles but trains. */ -static WindowDesc _vehicle_view_desc( - WDP_AUTO, "view_vehicle", 250, 116, - WC_VEHICLE_VIEW, WC_NONE, - 0, - _nested_vehicle_view_widgets, lengthof(_nested_vehicle_view_widgets) -); - -/** - * Vehicle view window descriptor for trains. Only minimum_height and - * default_height are different for train view. - */ -static WindowDesc _train_view_desc( - WDP_AUTO, "view_vehicle_train", 250, 134, - WC_VEHICLE_VIEW, WC_NONE, - 0, - _nested_vehicle_view_widgets, lengthof(_nested_vehicle_view_widgets) -); - - /* Just to make sure, nobody has changed the vehicle type constants, as we are using them for array indexing in a number of places here. */ static_assert(VEH_TRAIN == 0); @@ -2764,7 +2929,7 @@ public: const Vehicle *v = Vehicle::Get(this->window_number); switch (widget) { case WID_VV_START_STOP: - size->height = std::max({size->height, GetSpriteSize(SPR_WARNING_SIGN).height, GetSpriteSize(SPR_FLAG_VEH_STOPPED).height, GetSpriteSize(SPR_FLAG_VEH_RUNNING).height}) + WD_IMGBTN_TOP + WD_IMGBTN_BOTTOM; + size->height = std::max({size->height, (uint)FONT_HEIGHT_NORMAL, GetScaledSpriteSize(SPR_WARNING_SIGN).height, GetScaledSpriteSize(SPR_FLAG_VEH_STOPPED).height, GetScaledSpriteSize(SPR_FLAG_VEH_RUNNING).height}) + padding.height; break; case WID_VV_FORCE_PROCEED: @@ -2911,17 +3076,13 @@ public: /* Draw the flag plus orders. */ bool rtl = (_current_text_dir == TD_RTL); - uint text_offset = std::max({GetSpriteSize(SPR_WARNING_SIGN).width, GetSpriteSize(SPR_FLAG_VEH_STOPPED).width, GetSpriteSize(SPR_FLAG_VEH_RUNNING).width}) + WD_IMGBTN_LEFT + WD_IMGBTN_RIGHT; - int height = r.bottom - r.top; - int text_left = r.left + (rtl ? (uint)WD_FRAMERECT_LEFT : text_offset); - int text_right = r.right - (rtl ? text_offset : (uint)WD_FRAMERECT_RIGHT); - int text_top = r.top + WD_FRAMERECT_TOP + (height - WD_FRAMERECT_TOP - WD_FRAMERECT_BOTTOM - FONT_HEIGHT_NORMAL) / 2; - int image = ((v->vehstatus & VS_STOPPED) != 0) ? SPR_FLAG_VEH_STOPPED : (HasBit(v->vehicle_flags, VF_PATHFINDER_LOST)) ? SPR_WARNING_SIGN : SPR_FLAG_VEH_RUNNING; - int image_left = (rtl ? text_right + 1 : r.left) + WD_IMGBTN_LEFT; - int image_top = r.top + WD_IMGBTN_TOP + (height - WD_IMGBTN_TOP + WD_IMGBTN_BOTTOM - GetSpriteSize(image).height) / 2; - int lowered = this->IsWidgetLowered(WID_VV_START_STOP) ? 1 : 0; - DrawSprite(image, PAL_NONE, image_left + lowered, image_top + lowered); - DrawString(text_left + lowered, text_right + lowered, text_top + lowered, str, text_colour, SA_HOR_CENTER); + uint icon_width = std::max({GetScaledSpriteSize(SPR_WARNING_SIGN).width, GetScaledSpriteSize(SPR_FLAG_VEH_STOPPED).width, GetScaledSpriteSize(SPR_FLAG_VEH_RUNNING).width}); + int lowered = this->IsWidgetLowered(widget) ? WidgetDimensions::scaled.pressed : 0; + Rect tr = r.Shrink(WidgetDimensions::scaled.framerect).Translate(lowered, lowered); + SpriteID image = ((v->vehstatus & VS_STOPPED) != 0) ? SPR_FLAG_VEH_STOPPED : (HasBit(v->vehicle_flags, VF_PATHFINDER_LOST)) ? SPR_WARNING_SIGN : SPR_FLAG_VEH_RUNNING; + DrawSpriteIgnorePadding(image, PAL_NONE, tr.WithWidth(icon_width, rtl), false, SA_CENTER); + tr = tr.Indent(icon_width + WidgetDimensions::scaled.imgbtn.Horizontal(), rtl); + DrawString(tr.left, tr.right, CenterBounds(tr.top, tr.bottom, FONT_HEIGHT_NORMAL), str, text_colour, SA_HOR_CENTER); } void OnClick(Point pt, int widget, int click_count) override @@ -3011,6 +3172,20 @@ public: } } + EventState OnHotkey(int hotkey) override + { + /* If the hotkey is not for any widget in the UI (i.e. for honking) */ + if (hotkey == WID_VV_HONK_HORN) { + const Window* mainwindow = FindWindowById(WC_MAIN_WINDOW, 0); + const Vehicle* v = Vehicle::Get(window_number); + /*Only play the sound if we're following this vehicle */ + if (mainwindow->viewport->follow_vehicle == v->index) { + v->PlayLeaveStationSound(true); + } + } + return Window::OnHotkey(hotkey); + } + void OnQueryTextFinished(char *str) override { if (str == nullptr) return; @@ -3085,8 +3260,36 @@ public: { ::ShowNewGRFInspectWindow(GetGrfSpecFeature(Vehicle::Get(this->window_number)->type), this->window_number); } + + static HotkeyList hotkeys; }; +static Hotkey vehicleview_hotkeys[] = { + Hotkey('H', "honk", WID_VV_HONK_HORN), + HOTKEY_LIST_END +}; +HotkeyList VehicleViewWindow::hotkeys("vehicleview", vehicleview_hotkeys); + +/** Vehicle view window descriptor for all vehicles but trains. */ +static WindowDesc _vehicle_view_desc( + WDP_AUTO, "view_vehicle", 250, 116, + WC_VEHICLE_VIEW, WC_NONE, + 0, + _nested_vehicle_view_widgets, lengthof(_nested_vehicle_view_widgets), + &VehicleViewWindow::hotkeys +); + +/** + * Vehicle view window descriptor for trains. Only minimum_height and + * default_height are different for train view. + */ +static WindowDesc _train_view_desc( + WDP_AUTO, "view_vehicle_train", 250, 134, + WC_VEHICLE_VIEW, WC_NONE, + 0, + _nested_vehicle_view_widgets, lengthof(_nested_vehicle_view_widgets), + &VehicleViewWindow::hotkeys +); /** Shows the vehicle view window of the given vehicle. */ void ShowVehicleViewWindow(const Vehicle *v) @@ -3110,6 +3313,33 @@ bool VehicleClicked(const Vehicle *v) return _thd.GetCallbackWnd()->OnVehicleSelect(v); } +/** + * Dispatch a "vehicle group selected" event if any window waits for it. + * @param begin iterator to the start of the range of vehicles + * @param end iterator to the end of the range of vehicles + * @return did any window accept vehicle group selection? + */ +bool VehicleClicked(VehicleList::const_iterator begin, VehicleList::const_iterator end) +{ + assert(begin != end); + if (!(_thd.place_mode & HT_VEHICLE)) return false; + + /* If there is only one vehicle in the group, act as if we clicked a single vehicle */ + if (begin + 1 == end) return _thd.GetCallbackWnd()->OnVehicleSelect(*begin); + + return _thd.GetCallbackWnd()->OnVehicleSelect(begin, end); +} + +/** + * Dispatch a "vehicle group selected" event if any window waits for it. + * @param vehgroup the GUIVehicleGroup representing the vehicle group + * @return did any window accept vehicle group selection? + */ +bool VehicleClicked(const GUIVehicleGroup &vehgroup) +{ + return VehicleClicked(vehgroup.vehicles_begin, vehgroup.vehicles_end); +} + void StopGlobalFollowVehicle(const Vehicle *v) { Window *w = FindWindowById(WC_MAIN_WINDOW, 0); @@ -3154,7 +3384,7 @@ int GetSingleVehicleWidth(const Vehicle *v, EngineImageType image_type) v->GetImage(rtl ? DIR_E : DIR_W, image_type, &seq); Rect rec; seq.GetBounds(&rec); - return UnScaleGUI(rec.right - rec.left + 1); + return UnScaleGUI(rec.Width()); } } @@ -3192,7 +3422,7 @@ void SetMouseCursorVehicle(const Vehicle *v, EngineImageType image_type) bool is_ground_vehicle = v->IsGroundVehicle(); while (v != nullptr) { - if (total_width >= ScaleGUITrad(2 * (int)VEHICLEINFO_FULL_VEHICLE_WIDTH)) break; + if (total_width >= ScaleSpriteTrad(2 * (int)VEHICLEINFO_FULL_VEHICLE_WIDTH)) break; PaletteID pal = (v->vehstatus & VS_CRASHED) ? PALETTE_CRASH : GetVehiclePalette(v); VehicleSpriteSeq seq; @@ -3200,18 +3430,21 @@ void SetMouseCursorVehicle(const Vehicle *v, EngineImageType image_type) if (rotor_seq) { GetCustomRotorSprite(Aircraft::From(v), image_type, &seq); if (!seq.IsValid()) seq.Set(SPR_ROTOR_STOPPED); - y_offset = - ScaleGUITrad(5); + y_offset = -ScaleSpriteTrad(5); } else { v->GetImage(rtl ? DIR_E : DIR_W, image_type, &seq); } if (_cursor.sprite_count + seq.count > lengthof(_cursor.sprite_seq)) break; + int x_offs = 0; + if (v->type == VEH_TRAIN) x_offs = Train::From(v)->GetCursorImageOffset(); + for (uint i = 0; i < seq.count; ++i) { PaletteID pal2 = (v->vehstatus & VS_CRASHED) || !seq.seq[i].pal ? pal : seq.seq[i].pal; _cursor.sprite_seq[_cursor.sprite_count].sprite = seq.seq[i].sprite; _cursor.sprite_seq[_cursor.sprite_count].pal = pal2; - _cursor.sprite_pos[_cursor.sprite_count].x = rtl ? -total_width : total_width; + _cursor.sprite_pos[_cursor.sprite_count].x = rtl ? (-total_width + x_offs) : (total_width + x_offs); _cursor.sprite_pos[_cursor.sprite_count].y = y_offset; _cursor.sprite_count++; } @@ -3227,7 +3460,7 @@ void SetMouseCursorVehicle(const Vehicle *v, EngineImageType image_type) if (is_ground_vehicle) { /* Center trains and road vehicles on the front vehicle */ - int offs = (ScaleGUITrad(VEHICLEINFO_FULL_VEHICLE_WIDTH) - total_width) / 2; + int offs = (ScaleSpriteTrad(VEHICLEINFO_FULL_VEHICLE_WIDTH) - total_width) / 2; if (rtl) offs = -offs; for (uint i = 0; i < _cursor.sprite_count; ++i) { _cursor.sprite_pos[i].x += offs; diff --git a/src/vehicle_gui.h b/src/vehicle_gui.h index f4c044393a..af8a354e6f 100644 --- a/src/vehicle_gui.h +++ b/src/vehicle_gui.h @@ -12,6 +12,8 @@ #include "window_type.h" #include "vehicle_type.h" +#include "vehicle_gui_base.h" +#include "vehiclelist.h" #include "order_type.h" #include "station_type.h" #include "engine_type.h" @@ -45,10 +47,10 @@ struct TestedEngineDetails { int DrawVehiclePurchaseInfo(int left, int right, int y, EngineID engine_number, TestedEngineDetails &te); -void DrawTrainImage(const Train *v, int left, int right, int y, VehicleID selection, EngineImageType image_type, int skip, VehicleID drag_dest = INVALID_VEHICLE); -void DrawRoadVehImage(const Vehicle *v, int left, int right, int y, VehicleID selection, EngineImageType image_type, int skip = 0); -void DrawShipImage(const Vehicle *v, int left, int right, int y, VehicleID selection, EngineImageType image_type); -void DrawAircraftImage(const Vehicle *v, int left, int right, int y, VehicleID selection, EngineImageType image_type); +void DrawTrainImage(const Train *v, const Rect &r, VehicleID selection, EngineImageType image_type, int skip, VehicleID drag_dest = INVALID_VEHICLE); +void DrawRoadVehImage(const Vehicle *v, const Rect &r, VehicleID selection, EngineImageType image_type, int skip = 0); +void DrawShipImage(const Vehicle *v, const Rect &r, VehicleID selection, EngineImageType image_type); +void DrawAircraftImage(const Vehicle *v, const Rect &r, VehicleID selection, EngineImageType image_type); void ShowBuildVehicleWindow(TileIndex tile, VehicleType type); @@ -102,11 +104,13 @@ static inline WindowClass GetWindowClassForVehicleType(VehicleType vt) /* Unified window procedure */ void ShowVehicleViewWindow(const Vehicle *v); bool VehicleClicked(const Vehicle *v); +bool VehicleClicked(VehicleList::const_iterator begin, VehicleList::const_iterator end); +bool VehicleClicked(const GUIVehicleGroup &vehgroup); void StartStopVehicle(const Vehicle *v, bool texteffect); Vehicle *CheckClickOnVehicle(const struct Viewport *vp, int x, int y); -void DrawVehicleImage(const Vehicle *v, int left, int right, int y, VehicleID selection, EngineImageType image_type, int skip); +void DrawVehicleImage(const Vehicle *v, const Rect &r, VehicleID selection, EngineImageType image_type, int skip); void SetMouseCursorVehicle(const Vehicle *v, EngineImageType image_type); #endif /* VEHICLE_GUI_H */ diff --git a/src/vehicle_gui_base.h b/src/vehicle_gui_base.h index d724bc3433..73f2159d39 100644 --- a/src/vehicle_gui_base.h +++ b/src/vehicle_gui_base.h @@ -11,6 +11,7 @@ #define VEHICLE_GUI_BASE_H #include "core/smallvec_type.hpp" +#include "cargo_type.h" #include "date_type.h" #include "economy_type.h" #include "sortlist_type.h" @@ -22,7 +23,7 @@ #include #include -typedef GUIList GUIVehicleList; +typedef GUIList GUIVehicleList; struct GUIVehicleGroup { VehicleList::const_iterator vehicles_begin; ///< Pointer to beginning element of this vehicle group. @@ -65,7 +66,7 @@ struct GUIVehicleGroup { } }; -typedef GUIList GUIVehicleGroupList; +typedef GUIList GUIVehicleGroupList; struct BaseVehicleListWindow : public Window { @@ -76,14 +77,25 @@ struct BaseVehicleListWindow : public Window { GB_END, }; - GroupBy grouping; ///< How we want to group the list. - VehicleList vehicles; ///< List of vehicles. This is the buffer for `vehgroups` to point into; if this is structurally modified, `vehgroups` must be rebuilt. - GUIVehicleGroupList vehgroups; ///< List of (groups of) vehicles. This stores iterators of `vehicles`, and should be rebuilt if `vehicles` is structurally changed. - Listing *sorting; ///< Pointer to the vehicle type related sorting. - byte unitnumber_digits; ///< The number of digits of the highest unit number. + /** Special cargo filter criteria */ + enum CargoFilterSpecialType { + CF_NONE = CT_INVALID, ///< Show only vehicles which do not carry cargo (e.g. train engines) + CF_ANY = CT_NO_REFIT, ///< Show all vehicles independent of carried cargo (i.e. no filtering) + CF_FREIGHT = CT_AUTO_REFIT, ///< Show only vehicles which carry any freight (non-passenger) cargo + }; + + GroupBy grouping; ///< How we want to group the list. + VehicleList vehicles; ///< List of vehicles. This is the buffer for `vehgroups` to point into; if this is structurally modified, `vehgroups` must be rebuilt. + GUIVehicleGroupList vehgroups; ///< List of (groups of) vehicles. This stores iterators of `vehicles`, and should be rebuilt if `vehicles` is structurally changed. + Listing *sorting; ///< Pointer to the vehicle type related sorting. + byte unitnumber_digits; ///< The number of digits of the highest unit number. Scrollbar *vscroll; - VehicleListIdentifier vli; ///< Identifier of the vehicle list we want to currently show. - uint order_arrow_width; ///< Width of the arrow in the small order list. + VehicleListIdentifier vli; ///< Identifier of the vehicle list we want to currently show. + VehicleID vehicle_sel; ///< Selected vehicle + CargoID cargo_filter[NUM_CARGO + 3]; ///< Available cargo filters; CargoID or CF_ANY or CF_FREIGHT or CF_NONE + StringID cargo_filter_texts[NUM_CARGO + 4]; ///< Texts for filter_cargo, terminated by INVALID_STRING_ID + byte cargo_filter_criteria; ///< Selected cargo filter index + uint order_arrow_width; ///< Width of the arrow in the small order list. typedef GUIVehicleGroupList::SortFunction VehicleGroupSortFunction; typedef GUIVehicleList::SortFunction VehicleIndividualSortFunction; @@ -113,6 +125,9 @@ struct BaseVehicleListWindow : public Window { void UpdateVehicleGroupBy(GroupBy group_by); void SortVehicleList(); void BuildVehicleList(); + void SetCargoFilterIndex(byte index); + void SetCargoFilterArray(); + void FilterVehicleList(); Dimension GetActionDropdownSize(bool show_autoreplace, bool show_group); DropDownList BuildActionDropdownList(bool show_autoreplace, bool show_group); diff --git a/src/video/cocoa/cocoa_wnd.mm b/src/video/cocoa/cocoa_wnd.mm index 36d010177d..d4fc5b292e 100644 --- a/src/video/cocoa/cocoa_wnd.mm +++ b/src/video/cocoa/cocoa_wnd.mm @@ -1269,7 +1269,7 @@ void CocoaDialog(const char *title, const char *message, const char *buttonLabel /** Screen the window is on changed. */ - (void)windowDidChangeBackingProperties:(NSNotification *)notification { - bool did_adjust = AdjustGUIZoom(); + bool did_adjust = AdjustGUIZoom(true); /* Reallocate screen buffer if necessary. */ driver->AllocateBackingStore(); diff --git a/src/video/opengl.cpp b/src/video/opengl.cpp index 01ef24c555..68ceea98f0 100644 --- a/src/video/opengl.cpp +++ b/src/video/opengl.cpp @@ -1,5 +1,3 @@ -/* $Id$ */ - /* * This file is part of OpenTTD. * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. diff --git a/src/video/opengl.h b/src/video/opengl.h index b1d9080ba7..49fade6b02 100644 --- a/src/video/opengl.h +++ b/src/video/opengl.h @@ -1,5 +1,3 @@ -/* $Id$ */ - /* * This file is part of OpenTTD. * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. diff --git a/src/video/video_driver.hpp b/src/video/video_driver.hpp index 6ef06c45f6..b81ec6e2fb 100644 --- a/src/video/video_driver.hpp +++ b/src/video/video_driver.hpp @@ -167,15 +167,13 @@ public: } /** - * Get a suggested default GUI zoom taking screen DPI into account. + * Get a suggested default GUI scale taking screen DPI into account. */ - virtual ZoomLevel GetSuggestedUIZoom() + virtual int GetSuggestedUIScale() { float dpi_scale = this->GetDPIScale(); - if (dpi_scale >= 3.0f) return ZOOM_LVL_NORMAL; - if (dpi_scale >= 1.5f) return ZOOM_LVL_OUT_2X; - return ZOOM_LVL_OUT_4X; + return Clamp(dpi_scale * 100, MIN_INTERFACE_SCALE, MAX_INTERFACE_SCALE); } virtual const char *GetInfoString() const diff --git a/src/video/win32_v.cpp b/src/video/win32_v.cpp index 49c967bfa4..8d8a78a0ca 100644 --- a/src/video/win32_v.cpp +++ b/src/video/win32_v.cpp @@ -675,7 +675,7 @@ LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) } case WM_DPICHANGED: { - auto did_adjust = AdjustGUIZoom(); + auto did_adjust = AdjustGUIZoom(true); /* Resize the window to match the new DPI setting. */ RECT *prcNewWindow = (RECT *)lParam; diff --git a/src/viewport.cpp b/src/viewport.cpp index 3819266c54..b32bca80d2 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -134,6 +134,7 @@ struct ChildScreenSpriteToDraw { const SubSprite *sub; ///< only draw a rectangular part of the sprite int32 x; int32 y; + bool relative; int next; ///< next child to draw (-1 at the end) }; @@ -537,7 +538,7 @@ static void AddChildSpriteToFoundation(SpriteID image, PaletteID pal, const SubS int *old_child = _vd.last_child; _vd.last_child = _vd.last_foundation_child[foundation_part]; - AddChildSpriteScreen(image, pal, offs.x + extra_offs_x, offs.y + extra_offs_y, false, sub, false); + AddChildSpriteScreen(image, pal, offs.x + extra_offs_x, offs.y + extra_offs_y, false, sub, false, false); /* Switch back to last ChildSprite list */ _vd.last_child = old_child; @@ -816,8 +817,10 @@ bool IsInsideRotatedRectangle(int x, int y) * @param y sprite y-offset (screen coordinates) relative to parent sprite. * @param transparent if true, switch the palette between the provided palette and the transparent palette, * @param sub Only draw a part of the sprite. + * @param scale if true, scale offsets to base zoom level. + * @param relative if true, draw sprite relative to parent sprite offsets. */ -void AddChildSpriteScreen(SpriteID image, PaletteID pal, int x, int y, bool transparent, const SubSprite *sub, bool scale) +void AddChildSpriteScreen(SpriteID image, PaletteID pal, int x, int y, bool transparent, const SubSprite *sub, bool scale, bool relative) { assert((image & SPRITE_MASK) < MAX_SPRITES); @@ -838,6 +841,7 @@ void AddChildSpriteScreen(SpriteID image, PaletteID pal, int x, int y, bool tran cs.sub = sub; cs.x = scale ? x * ZOOM_LVL_BASE : x; cs.y = scale ? y * ZOOM_LVL_BASE : y; + cs.relative = relative; cs.next = -1; /* Append the sprite to the active ChildSprite list. @@ -872,16 +876,18 @@ static void AddStringToDraw(int x, int y, StringID string, uint64 params_1, uint * @param ti TileInfo Tile that is being drawn * @param z_offset Z offset relative to the groundsprite. Only used for the sprite position, not for sprite sorting. * @param foundation_part Foundation part the sprite belongs to. + * @param extra_offs_x Pixel X offset for the sprite position. + * @param extra_offs_y Pixel Y offset for the sprite position. */ -static void DrawSelectionSprite(SpriteID image, PaletteID pal, const TileInfo *ti, int z_offset, FoundationPart foundation_part) +static void DrawSelectionSprite(SpriteID image, PaletteID pal, const TileInfo *ti, int z_offset, FoundationPart foundation_part, int extra_offs_x = 0, int extra_offs_y = 0) { /* FIXME: This is not totally valid for some autorail highlights that extend over the edges of the tile. */ if (_vd.foundation[foundation_part] == -1) { /* draw on real ground */ - AddTileSpriteToDraw(image, pal, ti->x, ti->y, ti->z + z_offset); + AddTileSpriteToDraw(image, pal, ti->x, ti->y, ti->z + z_offset, nullptr, extra_offs_x, extra_offs_y); } else { /* draw on top of foundation */ - AddChildSpriteToFoundation(image, pal, nullptr, foundation_part, 0, -z_offset * ZOOM_LVL_BASE); + AddChildSpriteToFoundation(image, pal, nullptr, foundation_part, extra_offs_x, extra_offs_y - z_offset * ZOOM_LVL_BASE); } } @@ -1301,7 +1307,7 @@ void ViewportAddString(const DrawPixelInfo *dpi, ZoomLevel small_from, const Vie int right = left + dpi->width; int bottom = top + dpi->height; - int sign_height = ScaleByZoom(VPSM_TOP + FONT_HEIGHT_NORMAL + VPSM_BOTTOM, dpi->zoom); + int sign_height = ScaleByZoom(WidgetDimensions::scaled.fullbevel.top + FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.fullbevel.bottom, dpi->zoom); int sign_half_width = ScaleByZoom((small ? sign->width_small : sign->width_normal) / 2, dpi->zoom); if (bottom < sign->top || @@ -1317,7 +1323,7 @@ void ViewportAddString(const DrawPixelInfo *dpi, ZoomLevel small_from, const Vie int shadow_offset = 0; if (string_small_shadow != STR_NULL) { shadow_offset = 4; - AddStringToDraw(sign->center - sign_half_width + shadow_offset, sign->top, string_small_shadow, params_1, params_2, INVALID_COLOUR, sign->width_small); + AddStringToDraw(sign->center - sign_half_width + shadow_offset, sign->top, string_small_shadow, params_1, params_2, INVALID_COLOUR, sign->width_small | 0x8000); } AddStringToDraw(sign->center - sign_half_width, sign->top - shadow_offset, string_small, params_1, params_2, colour, sign->width_small | 0x8000); @@ -1329,8 +1335,8 @@ static Rect ExpandRectWithViewportSignMargins(Rect r, ZoomLevel zoom) /* Pessimistically always use normal font, but also assume small font is never larger in either dimension */ const int fh = FONT_HEIGHT_NORMAL; const int max_tw = _viewport_sign_maxwidth / 2 + 1; - const int expand_y = ScaleByZoom(VPSM_TOP + fh + VPSM_BOTTOM, zoom); - const int expand_x = ScaleByZoom(VPSM_LEFT + max_tw + VPSM_RIGHT, zoom); + const int expand_y = ScaleByZoom(WidgetDimensions::scaled.fullbevel.top + fh + WidgetDimensions::scaled.fullbevel.bottom, zoom); + const int expand_x = ScaleByZoom(WidgetDimensions::scaled.fullbevel.left + max_tw + WidgetDimensions::scaled.fullbevel.right, zoom); r.left -= expand_x; r.right += expand_x; @@ -1451,14 +1457,14 @@ void ViewportSign::UpdatePosition(int center, int top, StringID str, StringID st char buffer[DRAW_STRING_BUFFER]; GetString(buffer, str, lastof(buffer)); - this->width_normal = VPSM_LEFT + Align(GetStringBoundingBox(buffer).width, 2) + VPSM_RIGHT; + this->width_normal = WidgetDimensions::scaled.fullbevel.left + Align(GetStringBoundingBox(buffer).width, 2) + WidgetDimensions::scaled.fullbevel.right; this->center = center; /* zoomed out version */ if (str_small != STR_NULL) { GetString(buffer, str_small, lastof(buffer)); } - this->width_small = VPSM_LEFT + Align(GetStringBoundingBox(buffer, FS_SMALL).width, 2) + VPSM_RIGHT; + this->width_small = WidgetDimensions::scaled.fullbevel.left + Align(GetStringBoundingBox(buffer, FS_SMALL).width, 2) + WidgetDimensions::scaled.fullbevel.right; this->MarkDirty(); } @@ -1478,7 +1484,7 @@ void ViewportSign::MarkDirty(ZoomLevel maxzoom) const zoomlevels[zoom].left = this->center - ScaleByZoom(this->width_normal / 2 + 1, zoom); zoomlevels[zoom].top = this->top - ScaleByZoom(1, zoom); zoomlevels[zoom].right = this->center + ScaleByZoom(this->width_normal / 2 + 1, zoom); - zoomlevels[zoom].bottom = this->top + ScaleByZoom(VPSM_TOP + FONT_HEIGHT_NORMAL + VPSM_BOTTOM + 1, zoom); + zoomlevels[zoom].bottom = this->top + ScaleByZoom(WidgetDimensions::scaled.fullbevel.top + FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.fullbevel.bottom + 1, zoom); } for (const Window *w : Window::Iterate()) { @@ -1634,7 +1640,11 @@ static void ViewportDrawParentSprites(const ParentSpriteToSortVector *psd, const while (child_idx >= 0) { const ChildScreenSpriteToDraw *cs = csstdv->data() + child_idx; child_idx = cs->next; - DrawSpriteViewport(cs->image, cs->pal, ps->left + cs->x, ps->top + cs->y, cs->sub); + if (cs->relative) { + DrawSpriteViewport(cs->image, cs->pal, ps->left + cs->x, ps->top + cs->y, cs->sub); + } else { + DrawSpriteViewport(cs->image, cs->pal, ps->x + cs->x, ps->y + cs->y, cs->sub); + } } } } @@ -1688,7 +1698,7 @@ static void ViewportDrawStrings(ZoomLevel zoom, const StringSpriteToDrawVector * int w = GB(ss.width, 0, 15); int x = UnScaleByZoom(ss.x, zoom); int y = UnScaleByZoom(ss.y, zoom); - int h = VPSM_TOP + (small ? FONT_HEIGHT_SMALL : FONT_HEIGHT_NORMAL) + VPSM_BOTTOM; + int h = WidgetDimensions::scaled.fullbevel.top + (small ? FONT_HEIGHT_SMALL : FONT_HEIGHT_NORMAL) + WidgetDimensions::scaled.fullbevel.bottom; SetDParam(0, ss.params[0]); SetDParam(1, ss.params[1]); @@ -1706,13 +1716,13 @@ static void ViewportDrawStrings(ZoomLevel zoom, const StringSpriteToDrawVector * /* Draw the rectangle if 'transparent station signs' is off, * or if we are drawing a general text sign (STR_WHITE_SIGN). */ DrawFrameRect( - x, y, x + w, y + h, ss.colour, + x, y, x + w - 1, y + h - 1, ss.colour, IsTransparencySet(TO_SIGNS) ? FR_TRANSPARENT : FR_NONE ); } } - DrawString(x + VPSM_LEFT, x + w - 1 - VPSM_RIGHT, y + VPSM_TOP, ss.string, colour, SA_HOR_CENTER); + DrawString(x + WidgetDimensions::scaled.fullbevel.left, x + w - 1 - WidgetDimensions::scaled.fullbevel.right, y + WidgetDimensions::scaled.fullbevel.top, ss.string, colour, SA_HOR_CENTER, false, small ? FS_SMALL : FS_NORMAL); } } @@ -2131,7 +2141,7 @@ static bool CheckClickOnViewportSign(const Viewport *vp, int x, int y, const Vie { bool small = (vp->zoom >= ZOOM_LVL_OUT_16X); int sign_half_width = ScaleByZoom((small ? sign->width_small : sign->width_normal) / 2, vp->zoom); - int sign_height = ScaleByZoom(VPSM_TOP + (small ? FONT_HEIGHT_SMALL : FONT_HEIGHT_NORMAL) + VPSM_BOTTOM, vp->zoom); + int sign_height = ScaleByZoom(WidgetDimensions::scaled.fullbevel.top + (small ? FONT_HEIGHT_SMALL : FONT_HEIGHT_NORMAL) + WidgetDimensions::scaled.fullbevel.bottom, vp->zoom); return y >= sign->top && y < sign->top + sign_height && x >= sign->center - sign_half_width && x < sign->center + sign_half_width; diff --git a/src/viewport_func.h b/src/viewport_func.h index e60df4d31e..16a8fdc5ec 100644 --- a/src/viewport_func.h +++ b/src/viewport_func.h @@ -51,7 +51,7 @@ void OffsetGroundSprite(int x, int y); void DrawGroundSprite(SpriteID image, PaletteID pal, const SubSprite *sub = nullptr, int extra_offs_x = 0, int extra_offs_y = 0); void DrawGroundSpriteAt(SpriteID image, PaletteID pal, int32 x, int32 y, int z, const SubSprite *sub = nullptr, int extra_offs_x = 0, int extra_offs_y = 0); void AddSortableSpriteToDraw(SpriteID image, PaletteID pal, int x, int y, int w, int h, int dz, int z, bool transparent = false, int bb_offset_x = 0, int bb_offset_y = 0, int bb_offset_z = 0, const SubSprite *sub = nullptr); -void AddChildSpriteScreen(SpriteID image, PaletteID pal, int x, int y, bool transparent = false, const SubSprite *sub = nullptr, bool scale = true); +void AddChildSpriteScreen(SpriteID image, PaletteID pal, int x, int y, bool transparent = false, const SubSprite *sub = nullptr, bool scale = true, bool relative = true); void ViewportAddString(const DrawPixelInfo *dpi, ZoomLevel small_from, const ViewportSign *sign, StringID string_normal, StringID string_small, StringID string_small_shadow, uint64 params_1, uint64 params_2 = 0, Colours colour = INVALID_COLOUR); diff --git a/src/viewport_type.h b/src/viewport_type.h index 03374aef96..5200514403 100644 --- a/src/viewport_type.h +++ b/src/viewport_type.h @@ -34,14 +34,6 @@ struct Viewport { LinkGraphOverlay *overlay; }; -/** Margins for the viewport sign */ -enum ViewportSignMargin { - VPSM_LEFT = 1, ///< Left margin - VPSM_RIGHT = 1, ///< Right margin - VPSM_TOP = 1, ///< Top margin - VPSM_BOTTOM = 1, ///< Bottom margin -}; - /** Location information about a sign as seen on the viewport */ struct ViewportSign { int32 center; ///< The center position of the sign diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp index 4f3ed30620..44be4dc367 100644 --- a/src/water_cmd.cpp +++ b/src/water_cmd.cpp @@ -443,12 +443,6 @@ CommandCost CmdBuildCanal(DoCommandFlag flags, TileIndex tile, TileIndex start_t /* Outside of the editor you can only build canals, not oceans */ if (wc != WATER_CLASS_CANAL && _game_mode != GM_EDITOR) return CMD_ERROR; - /* Outside the editor you can only drag canals, and not areas */ - if (_game_mode != GM_EDITOR) { - TileArea ta(tile, start_tile); - if (ta.w != 1 && ta.h != 1) return CMD_ERROR; - } - CommandCost cost(EXPENSES_CONSTRUCTION); std::unique_ptr iter; diff --git a/src/widget.cpp b/src/widget.cpp index 36c58748bf..da85271fd6 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -24,6 +24,211 @@ #include "safeguards.h" +/** Distances used in drawing widgets. */ +enum WidgetDrawDistances { + /* WWT_IMGBTN(_2) */ + WD_IMGBTN_LEFT = 1, ///< Left offset of the image in the button. + WD_IMGBTN_RIGHT = 2, ///< Right offset of the image in the button. + WD_IMGBTN_TOP = 1, ///< Top offset of image in the button. + WD_IMGBTN_BOTTOM = 2, ///< Bottom offset of image in the button. + + /* WWT_INSET */ + WD_INSET_LEFT = 2, ///< Left offset of string. + WD_INSET_RIGHT = 2, ///< Right offset of string. + WD_INSET_TOP = 1, ///< Top offset of string. + + WD_VSCROLLBAR_LEFT = 2, ///< Left offset of vertical scrollbar. + WD_VSCROLLBAR_RIGHT = 2, ///< Right offset of vertical scrollbar. + WD_VSCROLLBAR_TOP = 3, ///< Top offset of vertical scrollbar. + WD_VSCROLLBAR_BOTTOM = 3, ///< Bottom offset of vertical scrollbar. + + WD_HSCROLLBAR_LEFT = 3, ///< Left offset of horizontal scrollbar. + WD_HSCROLLBAR_RIGHT = 3, ///< Right offset of horizontal scrollbar. + WD_HSCROLLBAR_TOP = 2, ///< Top offset of horizontal scrollbar. + WD_HSCROLLBAR_BOTTOM = 2, ///< Bottom offset of horizontal scrollbar. + + /* Size of the pure frame bevel without any padding. */ + WD_BEVEL_LEFT = 1, ///< Width of left bevel border. + WD_BEVEL_RIGHT = 1, ///< Width of right bevel border. + WD_BEVEL_TOP = 1, ///< Height of top bevel border. + WD_BEVEL_BOTTOM = 1, ///< Height of bottom bevel border. + + /* FrameRect widgets, all text buttons, panel, editbox */ + WD_FRAMERECT_LEFT = 2, ///< Offset at left to draw the frame rectangular area + WD_FRAMERECT_RIGHT = 2, ///< Offset at right to draw the frame rectangular area + WD_FRAMERECT_TOP = 1, ///< Offset at top to draw the frame rectangular area + WD_FRAMERECT_BOTTOM = 1, ///< Offset at bottom to draw the frame rectangular area + + /* WWT_FRAME */ + WD_FRAMETEXT_LEFT = 6, ///< Left offset of the text of the frame. + WD_FRAMETEXT_RIGHT = 6, ///< Right offset of the text of the frame. + WD_FRAMETEXT_TOP = 6, ///< Top offset of the text of the frame + WD_FRAMETEXT_BOTTOM = 6, ///< Bottom offset of the text of the frame + + /* WWT_MATRIX */ + WD_MATRIX_LEFT = 2, ///< Offset at left of a matrix cell. + WD_MATRIX_RIGHT = 2, ///< Offset at right of a matrix cell. + WD_MATRIX_TOP = 3, ///< Offset at top of a matrix cell. + WD_MATRIX_BOTTOM = 1, ///< Offset at bottom of a matrix cell. + + /* WWT_SHADEBOX */ + WD_SHADEBOX_WIDTH = 12, ///< Width of a standard shade box widget. + WD_SHADEBOX_LEFT = 2, ///< Left offset of shade sprite. + WD_SHADEBOX_RIGHT = 2, ///< Right offset of shade sprite. + WD_SHADEBOX_TOP = 3, ///< Top offset of shade sprite. + WD_SHADEBOX_BOTTOM = 3, ///< Bottom offset of shade sprite. + + /* WWT_STICKYBOX */ + WD_STICKYBOX_WIDTH = 12, ///< Width of a standard sticky box widget. + WD_STICKYBOX_LEFT = 2, ///< Left offset of sticky sprite. + WD_STICKYBOX_RIGHT = 2, ///< Right offset of sticky sprite. + WD_STICKYBOX_TOP = 3, ///< Top offset of sticky sprite. + WD_STICKYBOX_BOTTOM = 3, ///< Bottom offset of sticky sprite. + + /* WWT_DEBUGBOX */ + WD_DEBUGBOX_WIDTH = 12, ///< Width of a standard debug box widget. + WD_DEBUGBOX_LEFT = 2, ///< Left offset of debug sprite. + WD_DEBUGBOX_RIGHT = 2, ///< Right offset of debug sprite. + WD_DEBUGBOX_TOP = 3, ///< Top offset of debug sprite. + WD_DEBUGBOX_BOTTOM = 3, ///< Bottom offset of debug sprite. + + /* WWT_DEFSIZEBOX */ + WD_DEFSIZEBOX_WIDTH = 12, ///< Width of a standard defsize box widget. + WD_DEFSIZEBOX_LEFT = 2, ///< Left offset of defsize sprite. + WD_DEFSIZEBOX_RIGHT = 2, ///< Right offset of defsize sprite. + WD_DEFSIZEBOX_TOP = 3, ///< Top offset of defsize sprite. + WD_DEFSIZEBOX_BOTTOM = 3, ///< Bottom offset of defsize sprite. + + /* WWT_RESIZEBOX */ + WD_RESIZEBOX_WIDTH = 12, ///< Width of a resize box widget. + WD_RESIZEBOX_LEFT = 2, ///< Left offset of resize sprite. + WD_RESIZEBOX_RIGHT = 2, ///< Right offset of resize sprite. + WD_RESIZEBOX_TOP = 2, ///< Top offset of resize sprite. + WD_RESIZEBOX_BOTTOM = 2, ///< Bottom offset of resize sprite. + + /* WWT_CLOSEBOX */ + WD_CLOSEBOX_WIDTH = 11, ///< Width of a close box widget. + WD_CLOSEBOX_LEFT = 2, ///< Left offset of closebox string. + WD_CLOSEBOX_RIGHT = 1, ///< Right offset of closebox string. + WD_CLOSEBOX_TOP = 2, ///< Top offset of closebox string. + WD_CLOSEBOX_BOTTOM = 2, ///< Bottom offset of closebox string. + + /* WWT_CAPTION */ + WD_CAPTION_HEIGHT = 14, ///< Height of a title bar. + WD_CAPTIONTEXT_LEFT = 2, ///< Offset of the caption text at the left. + WD_CAPTIONTEXT_RIGHT = 2, ///< Offset of the caption text at the right. + WD_CAPTIONTEXT_TOP = 2, ///< Offset of the caption text at the top. + WD_CAPTIONTEXT_BOTTOM = 2, ///< Offset of the caption text at the bottom. + + /* Dropdown widget. */ + WD_DROPDOWN_HEIGHT = 12, ///< Height of a drop down widget. + WD_DROPDOWNTEXT_LEFT = 2, ///< Left offset of the dropdown widget string. + WD_DROPDOWNTEXT_RIGHT = 2, ///< Right offset of the dropdown widget string. + WD_DROPDOWNTEXT_TOP = 1, ///< Top offset of the dropdown widget string. + WD_DROPDOWNTEXT_BOTTOM = 1, ///< Bottom offset of the dropdown widget string. + + WD_PAR_VSEP_NORMAL = 2, ///< Normal amount of vertical space between two paragraphs of text. + WD_PAR_VSEP_WIDE = 8, ///< Large amount of vertical space between two paragraphs of text. +}; + +const WidgetDimensions WidgetDimensions::unscaled = { + {WD_IMGBTN_LEFT, WD_IMGBTN_TOP, WD_IMGBTN_RIGHT, WD_IMGBTN_BOTTOM}, ///< imgbtn + {WD_INSET_LEFT, WD_INSET_TOP, WD_INSET_RIGHT, WD_BEVEL_BOTTOM}, ///< inset + {WD_VSCROLLBAR_LEFT, WD_VSCROLLBAR_TOP, WD_VSCROLLBAR_RIGHT, WD_VSCROLLBAR_BOTTOM}, ///< vscrollbar + {WD_HSCROLLBAR_LEFT, WD_HSCROLLBAR_TOP, WD_HSCROLLBAR_RIGHT, WD_HSCROLLBAR_BOTTOM}, ///< hscrollbar + {WD_BEVEL_LEFT, WD_BEVEL_TOP, WD_BEVEL_RIGHT, WD_BEVEL_BOTTOM}, ///< bevel + {WD_BEVEL_LEFT, WD_BEVEL_TOP, WD_BEVEL_RIGHT, WD_BEVEL_BOTTOM}, ///< fullbevel + {WD_FRAMERECT_LEFT, WD_FRAMERECT_TOP, WD_FRAMERECT_RIGHT, WD_FRAMERECT_BOTTOM}, ///< framerect + {WD_FRAMETEXT_LEFT, WD_FRAMETEXT_TOP, WD_FRAMETEXT_RIGHT, WD_FRAMETEXT_BOTTOM}, ///< frametext + {WD_MATRIX_LEFT, WD_MATRIX_TOP, WD_MATRIX_RIGHT, WD_MATRIX_BOTTOM}, ///< matrix + {WD_SHADEBOX_LEFT, WD_SHADEBOX_TOP, WD_SHADEBOX_RIGHT, WD_SHADEBOX_BOTTOM}, ///< shadebox + {WD_STICKYBOX_LEFT, WD_STICKYBOX_TOP, WD_STICKYBOX_RIGHT, WD_STICKYBOX_BOTTOM}, ///< stickybox + {WD_DEBUGBOX_LEFT, WD_DEBUGBOX_TOP, WD_DEBUGBOX_RIGHT, WD_DEBUGBOX_BOTTOM}, ///< debugbox + {WD_DEFSIZEBOX_LEFT, WD_DEFSIZEBOX_TOP, WD_DEFSIZEBOX_RIGHT, WD_DEFSIZEBOX_BOTTOM}, ///< defsizebox + {WD_RESIZEBOX_LEFT, WD_RESIZEBOX_TOP, WD_RESIZEBOX_RIGHT, WD_RESIZEBOX_BOTTOM}, ///< resizebox + {WD_CLOSEBOX_LEFT, WD_CLOSEBOX_TOP, WD_CLOSEBOX_RIGHT, WD_CLOSEBOX_BOTTOM}, ///< closebox + {WD_CAPTIONTEXT_LEFT, WD_CAPTIONTEXT_TOP, WD_CAPTIONTEXT_RIGHT, WD_CAPTIONTEXT_BOTTOM}, ///< captiontext + {WD_DROPDOWNTEXT_LEFT, WD_DROPDOWNTEXT_TOP, WD_DROPDOWNTEXT_RIGHT, WD_DROPDOWNTEXT_BOTTOM}, ///< dropdowntext + {20, 10, 20, 10}, ///< modalpopup + 1, ///< pressed + WD_PAR_VSEP_NORMAL, ///< vsep_normal + WD_PAR_VSEP_WIDE, ///< vsep_wide + 2, ///< hsep_normal + 6, ///< hsep_wide + 10, ///< hsep_indent +}; + +WidgetDimensions WidgetDimensions::scaled = {}; + +/** + * Scale a RectPadding to GUI zoom level. + * @param r RectPadding at ZOOM_LVL_BASE (traditional "normal" interface size). + * @return RectPadding at #ZOOM_LVL_GUI (current interface size). + */ +static inline RectPadding ScaleGUITrad(const RectPadding &r) +{ + return {(uint8)ScaleGUITrad(r.left), (uint8)ScaleGUITrad(r.top), (uint8)ScaleGUITrad(r.right), (uint8)ScaleGUITrad(r.bottom)}; +} + +/** + * Scale a Dimension to GUI zoom level. + * @param d Dimension at ZOOM_LVL_BASE (traditional "normal" interface size). + * @return Dimension at #ZOOM_LVL_GUI (current interface size). + */ +static inline Dimension ScaleGUITrad(const Dimension &dim) +{ + return {(uint)ScaleGUITrad(dim.width), (uint)ScaleGUITrad(dim.height)}; +} + +/** + * Scale sprite size for GUI. + * Offset is ignored. + */ +Dimension GetScaledSpriteSize(SpriteID sprid) +{ + Point offset; + Dimension d = GetSpriteSize(sprid, &offset, ZOOM_LVL_OUT_4X); + d.width -= offset.x; + d.height -= offset.y; + return ScaleGUITrad(d); +} + +/** + * Set up pre-scaled versions of Widget Dimensions. + */ +void SetupWidgetDimensions() +{ + WidgetDimensions::scaled.imgbtn = ScaleGUITrad(WidgetDimensions::unscaled.imgbtn); + WidgetDimensions::scaled.inset = ScaleGUITrad(WidgetDimensions::unscaled.inset); + WidgetDimensions::scaled.vscrollbar = ScaleGUITrad(WidgetDimensions::unscaled.vscrollbar); + WidgetDimensions::scaled.hscrollbar = ScaleGUITrad(WidgetDimensions::unscaled.hscrollbar); + if (_settings_client.gui.scale_bevels) { + WidgetDimensions::scaled.bevel = ScaleGUITrad(WidgetDimensions::unscaled.bevel); + } else { + WidgetDimensions::scaled.bevel = WidgetDimensions::unscaled.bevel; + } + WidgetDimensions::scaled.fullbevel = ScaleGUITrad(WidgetDimensions::unscaled.fullbevel); + WidgetDimensions::scaled.framerect = ScaleGUITrad(WidgetDimensions::unscaled.framerect); + WidgetDimensions::scaled.frametext = ScaleGUITrad(WidgetDimensions::unscaled.frametext); + WidgetDimensions::scaled.matrix = ScaleGUITrad(WidgetDimensions::unscaled.matrix); + WidgetDimensions::scaled.shadebox = ScaleGUITrad(WidgetDimensions::unscaled.shadebox); + WidgetDimensions::scaled.stickybox = ScaleGUITrad(WidgetDimensions::unscaled.stickybox); + WidgetDimensions::scaled.debugbox = ScaleGUITrad(WidgetDimensions::unscaled.debugbox); + WidgetDimensions::scaled.defsizebox = ScaleGUITrad(WidgetDimensions::unscaled.defsizebox); + WidgetDimensions::scaled.resizebox = ScaleGUITrad(WidgetDimensions::unscaled.resizebox); + WidgetDimensions::scaled.closebox = ScaleGUITrad(WidgetDimensions::unscaled.closebox); + WidgetDimensions::scaled.captiontext = ScaleGUITrad(WidgetDimensions::unscaled.captiontext); + WidgetDimensions::scaled.dropdowntext = ScaleGUITrad(WidgetDimensions::unscaled.dropdowntext); + WidgetDimensions::scaled.modalpopup = ScaleGUITrad(WidgetDimensions::unscaled.modalpopup); + + WidgetDimensions::scaled.pressed = ScaleGUITrad(WidgetDimensions::unscaled.pressed); + WidgetDimensions::scaled.vsep_normal = ScaleGUITrad(WidgetDimensions::unscaled.vsep_normal); + WidgetDimensions::scaled.vsep_wide = ScaleGUITrad(WidgetDimensions::unscaled.vsep_wide); + WidgetDimensions::scaled.hsep_normal = ScaleGUITrad(WidgetDimensions::unscaled.hsep_normal); + WidgetDimensions::scaled.hsep_wide = ScaleGUITrad(WidgetDimensions::unscaled.hsep_wide); + WidgetDimensions::scaled.hsep_indent = ScaleGUITrad(WidgetDimensions::unscaled.hsep_indent); +} + /** * Calculate x and y coordinates for an aligned object within a window. * @param r Rectangle of the widget to be drawn in. @@ -39,13 +244,13 @@ static inline Point GetAlignedPosition(const Rect &r, const Dimension &d, String switch (align & SA_HOR_MASK) { case SA_LEFT: p.x = r.left; break; case SA_HOR_CENTER: p.x = CenterBounds(r.left, r.right, d.width); break; - case SA_RIGHT: p.x = r.right - d.width; break; + case SA_RIGHT: p.x = r.right + 1 - d.width; break; default: NOT_REACHED(); } switch (align & SA_VERT_MASK) { case SA_TOP: p.y = r.top; break; case SA_VERT_CENTER: p.y = CenterBounds(r.top, r.bottom, d.height); break; - case SA_BOTTOM: p.y = r.bottom - d.height; break; + case SA_BOTTOM: p.y = r.bottom + 1 - d.height; break; default: NOT_REACHED(); } return p; @@ -220,25 +425,40 @@ void DrawFrameRect(int left, int top, int right, int bottom, Colours colour, Fra } else { uint interior; + Rect outer = {left, top, right, bottom}; // Outside rectangle + Rect inner = outer.Shrink(WidgetDimensions::scaled.bevel); // Inside rectangle + if (flags & FR_LOWERED) { - GfxFillRect(left, top, left, bottom, dark); - GfxFillRect(left + WD_BEVEL_LEFT, top, right, top, dark); - GfxFillRect(right, top + WD_BEVEL_TOP, right, bottom - WD_BEVEL_BOTTOM, light); - GfxFillRect(left + WD_BEVEL_LEFT, bottom, right, bottom, light); + GfxFillRect(outer.left, outer.top, inner.left - 1, outer.bottom, dark); // Left + GfxFillRect(inner.left, outer.top, outer.right, inner.top - 1, dark); // Top + GfxFillRect(inner.right + 1, inner.top, outer.right, inner.bottom, light); // Right + GfxFillRect(inner.left, inner.bottom + 1, outer.right, outer.bottom, light); // Bottom interior = (flags & FR_DARKENED ? medium_dark : medium_light); } else { - GfxFillRect(left, top, left, bottom - WD_BEVEL_BOTTOM, light); - GfxFillRect(left + WD_BEVEL_LEFT, top, right - WD_BEVEL_RIGHT, top, light); - GfxFillRect(right, top, right, bottom - WD_BEVEL_BOTTOM, dark); - GfxFillRect(left, bottom, right, bottom, dark); + GfxFillRect(outer.left, outer.top, inner.left - 1, inner.bottom, light); // Left + GfxFillRect(inner.left, outer.top, inner.right, inner.top - 1, light); // Top + GfxFillRect(inner.right + 1, outer.top, outer.right, inner.bottom, dark); // Right + GfxFillRect(outer.left, inner.bottom + 1, outer.right, outer.bottom, dark); // Bottom interior = medium_dark; } if (!(flags & FR_BORDERONLY)) { - GfxFillRect(left + WD_BEVEL_LEFT, top + WD_BEVEL_TOP, right - WD_BEVEL_RIGHT, bottom - WD_BEVEL_BOTTOM, interior); + GfxFillRect(inner.left, inner.top, inner.right, inner.bottom, interior); // Inner } } } +void DrawSpriteIgnorePadding(SpriteID img, PaletteID pal, const Rect &r, bool clicked, StringAlignment align) +{ + Point offset; + Dimension d = GetSpriteSize(img, &offset); + d.width -= offset.x; + d.height -= offset.y; + + Point p = GetAlignedPosition(r, d, align); + int o = clicked ? WidgetDimensions::scaled.pressed : 0; + DrawSprite(img, pal, p.x + o - offset.x, p.y + o - offset.y); +} + /** * Draw an image button. * @param r Rectangle of the button. @@ -254,9 +474,7 @@ static inline void DrawImageButtons(const Rect &r, WidgetType type, Colours colo DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, (clicked) ? FR_LOWERED : FR_NONE); if ((type & WWT_MASK) == WWT_IMGBTN_2 && clicked) img++; // Show different image when clicked for #WWT_IMGBTN_2. - Dimension d = GetSpriteSize(img); - Point p = GetAlignedPosition(r, d, align); - DrawSprite(img, PAL_NONE, p.x + clicked, p.y + clicked); + DrawSpriteIgnorePadding(img, PAL_NONE, r, clicked, align); } /** @@ -274,7 +492,8 @@ static inline void DrawLabel(const Rect &r, WidgetType type, bool clicked, TextC if ((type & WWT_MASK) == WWT_TEXTBTN_2 && clicked) str++; Dimension d = GetStringBoundingBox(str); Point p = GetAlignedPosition(r, d, align); - DrawString(r.left + clicked, r.right + clicked, p.y + clicked, str, colour, align); + int o = clicked ? WidgetDimensions::scaled.pressed : 0; + DrawString(r.left + o, r.right + o, p.y + o, str, colour, align); } /** @@ -302,7 +521,7 @@ static inline void DrawText(const Rect &r, TextColour colour, StringID str, Stri static inline void DrawInset(const Rect &r, Colours colour, TextColour text_colour, StringID str, StringAlignment align) { DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, FR_LOWERED | FR_DARKENED); - if (str != STR_NULL) DrawString(r.left + WD_INSET_LEFT, r.right - WD_INSET_RIGHT, r.top + WD_INSET_TOP, str, text_colour, align); + if (str != STR_NULL) DrawString(r.Shrink(WidgetDimensions::scaled.inset), str, text_colour, align); } /** @@ -322,18 +541,18 @@ static inline void DrawMatrix(const Rect &r, Colours colour, bool clicked, uint1 int column_width; // Width of a single column in the matrix. if (num_columns == 0) { column_width = resize_x; - num_columns = (r.right - r.left + 1) / column_width; + num_columns = r.Width() / column_width; } else { - column_width = (r.right - r.left + 1) / num_columns; + column_width = r.Width() / num_columns; } int num_rows = GB(data, MAT_ROW_START, MAT_ROW_BITS); // Upper 8 bits of the widget data: Number of rows in the matrix. int row_height; // Height of a single row in the matrix. if (num_rows == 0) { row_height = resize_y; - num_rows = (r.bottom - r.top + 1) / row_height; + num_rows = r.Height() / row_height; } else { - row_height = (r.bottom - r.top + 1) / num_rows; + row_height = r.Height() / num_rows; } int col = _colour_gradient[colour & 0xF][6]; @@ -341,13 +560,13 @@ static inline void DrawMatrix(const Rect &r, Colours colour, bool clicked, uint1 int x = r.left; for (int ctr = num_columns; ctr > 1; ctr--) { x += column_width; - GfxFillRect(x, r.top + 1, x, r.bottom - 1, col); + GfxFillRect(x, r.top + WidgetDimensions::scaled.bevel.top, x + WidgetDimensions::scaled.bevel.left - 1, r.bottom - WidgetDimensions::scaled.bevel.bottom, col); } x = r.top; for (int ctr = num_rows; ctr > 1; ctr--) { x += row_height; - GfxFillRect(r.left + 1, x, r.right - 1, x, col); + GfxFillRect(r.left + WidgetDimensions::scaled.bevel.left, x, r.right - WidgetDimensions::scaled.bevel.right, x + WidgetDimensions::scaled.bevel.top - 1, col); } col = _colour_gradient[colour & 0xF][4]; @@ -355,13 +574,13 @@ static inline void DrawMatrix(const Rect &r, Colours colour, bool clicked, uint1 x = r.left - 1; for (int ctr = num_columns; ctr > 1; ctr--) { x += column_width; - GfxFillRect(x, r.top + 1, x, r.bottom - 1, col); + GfxFillRect(x - WidgetDimensions::scaled.bevel.right + 1, r.top + WidgetDimensions::scaled.bevel.top, x, r.bottom - WidgetDimensions::scaled.bevel.bottom, col); } x = r.top - 1; for (int ctr = num_rows; ctr > 1; ctr--) { x += row_height; - GfxFillRect(r.left + 1, x, r.right - 1, x, col); + GfxFillRect(r.left + WidgetDimensions::scaled.bevel.left, x - WidgetDimensions::scaled.bevel.bottom + 1, r.right - WidgetDimensions::scaled.bevel.right, x, col); } } @@ -376,15 +595,11 @@ static inline void DrawMatrix(const Rect &r, Colours colour, bool clicked, uint1 */ static inline void DrawVerticalScrollbar(const Rect &r, Colours colour, bool up_clicked, bool bar_dragged, bool down_clicked, const Scrollbar *scrollbar) { - int centre = (r.right - r.left) / 2; int height = NWidgetScrollbar::GetVerticalDimension().height; /* draw up/down buttons */ - DrawFrameRect(r.left, r.top, r.right, r.top + height - 1, colour, (up_clicked) ? FR_LOWERED : FR_NONE); - DrawSprite(SPR_ARROW_UP, PAL_NONE, r.left + 1 + up_clicked, r.top + 1 + up_clicked); - - DrawFrameRect(r.left, r.bottom - (height - 1), r.right, r.bottom, colour, (down_clicked) ? FR_LOWERED : FR_NONE); - DrawSprite(SPR_ARROW_DOWN, PAL_NONE, r.left + 1 + down_clicked, r.bottom - (height - 2) + down_clicked); + DrawImageButtons(r.WithHeight(height, false), NWID_VSCROLLBAR, colour, up_clicked, SPR_ARROW_UP, SA_CENTER); + DrawImageButtons(r.WithHeight(height, true), NWID_VSCROLLBAR, colour, down_clicked, SPR_ARROW_DOWN, SA_CENTER); int c1 = _colour_gradient[colour & 0xF][3]; int c2 = _colour_gradient[colour & 0xF][7]; @@ -393,11 +608,17 @@ static inline void DrawVerticalScrollbar(const Rect &r, Colours colour, bool up_ GfxFillRect(r.left, r.top + height, r.right, r.bottom - height, c2); GfxFillRect(r.left, r.top + height, r.right, r.bottom - height, c1, FILLRECT_CHECKER); + /* track positions. These fractions are based on original 1x dimensions, but scale better. */ + int left = r.left + r.Width() * 3 / 11; /* left track is positioned 3/11ths from the left */ + int right = r.left + r.Width() * 8 / 11; /* right track is positioned 8/11ths from the left */ + const uint8 bl = WidgetDimensions::scaled.bevel.left; + const uint8 br = WidgetDimensions::scaled.bevel.right; + /* draw shaded lines */ - GfxFillRect(r.left + centre - 3, r.top + height, r.left + centre - 3, r.bottom - height, c1); - GfxFillRect(r.left + centre - 2, r.top + height, r.left + centre - 2, r.bottom - height, c2); - GfxFillRect(r.left + centre + 2, r.top + height, r.left + centre + 2, r.bottom - height, c1); - GfxFillRect(r.left + centre + 3, r.top + height, r.left + centre + 3, r.bottom - height, c2); + GfxFillRect(left - bl, r.top + height, left - 1, r.bottom - height, c1); + GfxFillRect(left, r.top + height, left + br - 1, r.bottom - height, c2); + GfxFillRect(right - bl, r.top + height, right - 1, r.bottom - height, c1); + GfxFillRect(right, r.top + height, right + br - 1, r.bottom - height, c2); Point pt = HandleScrollbarHittest(scrollbar, r.top, r.bottom, false); DrawFrameRect(r.left, pt.x, r.right, pt.y, colour, bar_dragged ? FR_LOWERED : FR_NONE); @@ -414,14 +635,10 @@ static inline void DrawVerticalScrollbar(const Rect &r, Colours colour, bool up_ */ static inline void DrawHorizontalScrollbar(const Rect &r, Colours colour, bool left_clicked, bool bar_dragged, bool right_clicked, const Scrollbar *scrollbar) { - int centre = (r.bottom - r.top) / 2; int width = NWidgetScrollbar::GetHorizontalDimension().width; - DrawFrameRect(r.left, r.top, r.left + width - 1, r.bottom, colour, left_clicked ? FR_LOWERED : FR_NONE); - DrawSprite(SPR_ARROW_LEFT, PAL_NONE, r.left + 1 + left_clicked, r.top + 1 + left_clicked); - - DrawFrameRect(r.right - (width - 1), r.top, r.right, r.bottom, colour, right_clicked ? FR_LOWERED : FR_NONE); - DrawSprite(SPR_ARROW_RIGHT, PAL_NONE, r.right - (width - 2) + right_clicked, r.top + 1 + right_clicked); + DrawImageButtons(r.WithWidth(width, false), NWID_HSCROLLBAR, colour, left_clicked, SPR_ARROW_LEFT, SA_CENTER); + DrawImageButtons(r.WithWidth(width, true), NWID_HSCROLLBAR, colour, right_clicked, SPR_ARROW_RIGHT, SA_CENTER); int c1 = _colour_gradient[colour & 0xF][3]; int c2 = _colour_gradient[colour & 0xF][7]; @@ -430,11 +647,17 @@ static inline void DrawHorizontalScrollbar(const Rect &r, Colours colour, bool l GfxFillRect(r.left + width, r.top, r.right - width, r.bottom, c2); GfxFillRect(r.left + width, r.top, r.right - width, r.bottom, c1, FILLRECT_CHECKER); + /* track positions. These fractions are based on original 1x dimensions, but scale better. */ + int top = r.top + r.Height() * 3 / 11; /* top track is positioned 3/11ths from the top */ + int bottom = r.top + r.Height() * 8 / 11; /* bottom track is positioned 8/11ths from the top */ + const uint8 bt = WidgetDimensions::scaled.bevel.top; + const uint8 bb = WidgetDimensions::scaled.bevel.bottom; + /* draw shaded lines */ - GfxFillRect(r.left + width, r.top + centre - 3, r.right - width, r.top + centre - 3, c1); - GfxFillRect(r.left + width, r.top + centre - 2, r.right - width, r.top + centre - 2, c2); - GfxFillRect(r.left + width, r.top + centre + 2, r.right - width, r.top + centre + 2, c1); - GfxFillRect(r.left + width, r.top + centre + 3, r.right - width, r.top + centre + 3, c2); + GfxFillRect(r.left + width, top - bt, r.right - width, top - 1, c1); + GfxFillRect(r.left + width, top, r.right - width, top + bb - 1, c2); + GfxFillRect(r.left + width, bottom - bt, r.right - width, bottom - 1, c1); + GfxFillRect(r.left + width, bottom, r.right - width, bottom + bb - 1, c2); /* draw actual scrollbar */ Point pt = HandleScrollbarHittest(scrollbar, r.left, r.right, true); @@ -453,44 +676,47 @@ static inline void DrawFrame(const Rect &r, Colours colour, TextColour text_colo { int x2 = r.left; // by default the left side is the left side of the widget - if (str != STR_NULL) x2 = DrawString(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, r.top, str, text_colour, align); + if (str != STR_NULL) x2 = DrawString(r.left + WidgetDimensions::scaled.frametext.left, r.right - WidgetDimensions::scaled.frametext.right, r.top, str, text_colour, align); int c1 = _colour_gradient[colour][3]; int c2 = _colour_gradient[colour][7]; /* If the frame has text, adjust the top bar to fit half-way through */ - int dy1 = 4; - if (str != STR_NULL) dy1 = FONT_HEIGHT_NORMAL / 2 - 1; - int dy2 = dy1 + 1; + Rect inner = r.Shrink(ScaleGUITrad(1)); + if (str != STR_NULL) inner.top = r.top + FONT_HEIGHT_NORMAL / 2; + + Rect outer = inner.Expand(WidgetDimensions::scaled.bevel); + Rect inside = inner.Shrink(WidgetDimensions::scaled.bevel); if (_current_text_dir == TD_LTR) { /* Line from upper left corner to start of text */ - GfxFillRect(r.left, r.top + dy1, r.left + 4, r.top + dy1, c1); - GfxFillRect(r.left + 1, r.top + dy2, r.left + 4, r.top + dy2, c2); + GfxFillRect(outer.left, outer.top, r.left + WidgetDimensions::scaled.frametext.left - WidgetDimensions::scaled.bevel.left - 1, inner.top - 1, c1); + GfxFillRect(inner.left, inner.top, r.left + WidgetDimensions::scaled.frametext.left - WidgetDimensions::scaled.bevel.left - 1, inside.top - 1, c2); /* Line from end of text to upper right corner */ - GfxFillRect(x2, r.top + dy1, r.right - 1, r.top + dy1, c1); - GfxFillRect(x2, r.top + dy2, r.right - 2, r.top + dy2, c2); + GfxFillRect(x2 + WidgetDimensions::scaled.bevel.right, outer.top, inner.right, inner.top - 1, c1); + GfxFillRect(x2 + WidgetDimensions::scaled.bevel.right, inner.top, inside.right, inside.top - 1, c2); } else { /* Line from upper left corner to start of text */ - GfxFillRect(r.left, r.top + dy1, x2 - 2, r.top + dy1, c1); - GfxFillRect(r.left + 1, r.top + dy2, x2 - 2, r.top + dy2, c2); + GfxFillRect(outer.left, outer.top, x2 - WidgetDimensions::scaled.bevel.left - 1, inner.top - 1, c1); + GfxFillRect(inner.left, inner.top, x2 - WidgetDimensions::scaled.bevel.left - 1, inside.top - 1, c2); /* Line from end of text to upper right corner */ - GfxFillRect(r.right - 5, r.top + dy1, r.right - 1, r.top + dy1, c1); - GfxFillRect(r.right - 5, r.top + dy2, r.right - 2, r.top + dy2, c2); + GfxFillRect(r.right - WidgetDimensions::scaled.frametext.right + WidgetDimensions::scaled.bevel.right, outer.top, inner.right, inner.top - 1, c1); + GfxFillRect(r.right - WidgetDimensions::scaled.frametext.right + WidgetDimensions::scaled.bevel.right, inner.top, inside.right, inside.top - 1, c2); } /* Line from upper left corner to bottom left corner */ - GfxFillRect(r.left, r.top + dy2, r.left, r.bottom - 1, c1); - GfxFillRect(r.left + 1, r.top + dy2 + 1, r.left + 1, r.bottom - 2, c2); + GfxFillRect(outer.left, inner.top, inner.left - 1, inner.bottom, c1); + GfxFillRect(inner.left, inside.top, inside.left - 1, inside.bottom, c2); /* Line from upper right corner to bottom right corner */ - GfxFillRect(r.right - 1, r.top + dy2, r.right - 1, r.bottom - 2, c1); - GfxFillRect(r.right, r.top + dy1, r.right, r.bottom - 1, c2); + GfxFillRect(inside.right + 1, inner.top, inner.right, inside.bottom, c1); + GfxFillRect(inner.right + 1, outer.top, outer.right, inner.bottom, c2); - GfxFillRect(r.left + 1, r.bottom - 1, r.right - 1, r.bottom - 1, c1); - GfxFillRect(r.left, r.bottom, r.right, r.bottom, c2); + /* Line from bottom left corner to bottom right corner */ + GfxFillRect(inner.left, inside.bottom + 1, inner.right, inner.bottom, c1); + GfxFillRect(outer.left, inner.bottom + 1, outer.right, outer.bottom, c2); } /** @@ -547,28 +773,23 @@ static inline void DrawDebugBox(const Rect &r, Colours colour, bool clicked) static inline void DrawResizeBox(const Rect &r, Colours colour, bool at_left, bool clicked) { DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, (clicked) ? FR_LOWERED : FR_NONE); - if (at_left) { - Dimension d = GetSpriteSize(SPR_WINDOW_RESIZE_LEFT); - DrawSprite(SPR_WINDOW_RESIZE_LEFT, PAL_NONE, r.left + WD_RESIZEBOX_RIGHT + clicked, - r.bottom + 1 - WD_RESIZEBOX_BOTTOM - d.height + clicked); - } else { - Dimension d = GetSpriteSize(SPR_WINDOW_RESIZE_RIGHT); - DrawSprite(SPR_WINDOW_RESIZE_RIGHT, PAL_NONE, r.right + 1 - WD_RESIZEBOX_RIGHT - d.width + clicked, - r.bottom + 1 - WD_RESIZEBOX_BOTTOM - d.height + clicked); - } + DrawSpriteIgnorePadding(at_left ? SPR_WINDOW_RESIZE_LEFT : SPR_WINDOW_RESIZE_RIGHT, PAL_NONE, r.Shrink(ScaleGUITrad(2)), clicked, at_left ? (SA_LEFT | SA_BOTTOM | SA_FORCE) : (SA_RIGHT | SA_BOTTOM | SA_FORCE)); } /** * Draw a close box. - * @param r Rectangle of the box. + * @param r Rectangle of the box.` * @param colour Colour of the close box. */ static inline void DrawCloseBox(const Rect &r, Colours colour) { if (colour != COLOUR_WHITE) DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, FR_NONE); - Dimension d = GetSpriteSize(SPR_CLOSEBOX); - int s = UnScaleGUI(1); /* Offset to account for shadow of SPR_CLOSEBOX */ - DrawSprite(SPR_CLOSEBOX, (colour != COLOUR_WHITE ? TC_BLACK : TC_SILVER) | (1 << PALETTE_TEXT_RECOLOUR), CenterBounds(r.left, r.right, d.width - s), CenterBounds(r.top, r.bottom, d.height - s)); + Point offset; + Dimension d = GetSpriteSize(SPR_CLOSEBOX, &offset); + d.width -= offset.x; + d.height -= offset.y; + int s = ScaleSpriteTrad(1); /* Offset to account for shadow of SPR_CLOSEBOX */ + DrawSprite(SPR_CLOSEBOX, (colour != COLOUR_WHITE ? TC_BLACK : TC_SILVER) | (1U << PALETTE_TEXT_RECOLOUR), CenterBounds(r.left, r.right, d.width - s) - offset.x, CenterBounds(r.top, r.bottom, d.height - s) - offset.y); } /** @@ -584,17 +805,18 @@ void DrawCaption(const Rect &r, Colours colour, Owner owner, TextColour text_col { bool company_owned = owner < MAX_COMPANIES; - DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, FR_BORDERONLY); - DrawFrameRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, colour, company_owned ? FR_LOWERED | FR_DARKENED | FR_BORDERONLY : FR_LOWERED | FR_DARKENED); + DrawFrameRect(r, colour, FR_BORDERONLY); + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); + DrawFrameRect(ir, colour, company_owned ? FR_LOWERED | FR_DARKENED | FR_BORDERONLY : FR_LOWERED | FR_DARKENED); if (company_owned) { - GfxFillRect(r.left + 2, r.top + 2, r.right - 2, r.bottom - 2, _colour_gradient[_company_colours[owner]][4]); + GfxFillRect(ir.Shrink(WidgetDimensions::scaled.bevel), _colour_gradient[_company_colours[owner]][4]); } if (str != STR_NULL) { Dimension d = GetStringBoundingBox(str); Point p = GetAlignedPosition(r, d, align); - DrawString(r.left + WD_CAPTIONTEXT_LEFT, r.right - WD_CAPTIONTEXT_RIGHT, p.y, str, text_colour, align); + DrawString(r.left + WidgetDimensions::scaled.captiontext.left, r.right - WidgetDimensions::scaled.captiontext.left, p.y, str, text_colour, align); } } @@ -611,22 +833,22 @@ void DrawCaption(const Rect &r, Colours colour, Owner owner, TextColour text_col */ static inline void DrawButtonDropdown(const Rect &r, Colours colour, bool clicked_button, bool clicked_dropdown, StringID str, StringAlignment align) { - int text_offset = std::max(0, ((int)(r.bottom - r.top + 1) - FONT_HEIGHT_NORMAL) / 2); // Offset for rendering the text vertically centered - int dd_width = NWidgetLeaf::dropdown_dimension.width; - int dd_height = NWidgetLeaf::dropdown_dimension.height; - int image_offset = std::max(0, ((int)(r.bottom - r.top + 1) - dd_height) / 2); if (_current_text_dir == TD_LTR) { DrawFrameRect(r.left, r.top, r.right - dd_width, r.bottom, colour, clicked_button ? FR_LOWERED : FR_NONE); - DrawFrameRect(r.right + 1 - dd_width, r.top, r.right, r.bottom, colour, clicked_dropdown ? FR_LOWERED : FR_NONE); - DrawSprite(SPR_ARROW_DOWN, PAL_NONE, r.right - (dd_width - 2) + clicked_dropdown, r.top + image_offset + clicked_dropdown); - if (str != STR_NULL) DrawString(r.left + WD_DROPDOWNTEXT_LEFT + clicked_button, r.right - dd_width - WD_DROPDOWNTEXT_RIGHT + clicked_button, r.top + text_offset + clicked_button, str, TC_BLACK, align); + DrawImageButtons(r.WithWidth(dd_width, true), WWT_DROPDOWN, colour, clicked_dropdown, SPR_ARROW_DOWN, SA_CENTER); + if (str != STR_NULL) { + int o = clicked_button ? WidgetDimensions::scaled.pressed : 0; + DrawString(r.left + WidgetDimensions::scaled.dropdowntext.left + o, r.right - dd_width - WidgetDimensions::scaled.dropdowntext.right + o, CenterBounds(r.top, r.bottom, FONT_HEIGHT_NORMAL) + o, str, TC_BLACK, align); + } } else { DrawFrameRect(r.left + dd_width, r.top, r.right, r.bottom, colour, clicked_button ? FR_LOWERED : FR_NONE); - DrawFrameRect(r.left, r.top, r.left + dd_width - 1, r.bottom, colour, clicked_dropdown ? FR_LOWERED : FR_NONE); - DrawSprite(SPR_ARROW_DOWN, PAL_NONE, r.left + 1 + clicked_dropdown, r.top + image_offset + clicked_dropdown); - if (str != STR_NULL) DrawString(r.left + dd_width + WD_DROPDOWNTEXT_LEFT + clicked_button, r.right - WD_DROPDOWNTEXT_RIGHT + clicked_button, r.top + text_offset + clicked_button, str, TC_BLACK, align); + DrawImageButtons(r.WithWidth(dd_width, false), WWT_DROPDOWN, colour, clicked_dropdown, SPR_ARROW_DOWN, SA_CENTER); + if (str != STR_NULL) { + int o = clicked_button ? WidgetDimensions::scaled.pressed : 0; + DrawString(r.left + dd_width + WidgetDimensions::scaled.dropdowntext.left + o, r.right - WidgetDimensions::scaled.dropdowntext.right + o, CenterBounds(r.top, r.bottom, FONT_HEIGHT_NORMAL) + o, str, TC_BLACK, align); + } } } @@ -647,17 +869,15 @@ void Window::DrawWidgets() const const NWidgetBase *widget = this->GetWidget(i); if (widget == nullptr || !widget->IsHighlighted()) continue; - int left = widget->pos_x; - int top = widget->pos_y; - int right = left + widget->current_x - 1; - int bottom = top + widget->current_y - 1; + Rect outer = widget->GetCurrentRect(); + Rect inner = outer.Shrink(WidgetDimensions::scaled.bevel).Expand(1); int colour = _string_colourmap[_window_highlight_colour ? widget->GetHighlightColour() : TC_WHITE]; - GfxFillRect(left, top, left, bottom - WD_BEVEL_BOTTOM, colour); - GfxFillRect(left + WD_BEVEL_LEFT, top, right - WD_BEVEL_RIGHT, top, colour); - GfxFillRect(right, top, right, bottom - WD_BEVEL_BOTTOM, colour); - GfxFillRect(left, bottom, right, bottom, colour); + GfxFillRect(outer.left, outer.top, inner.left, inner.bottom, colour); + GfxFillRect(inner.left + 1, outer.top, inner.right - 1, inner.top, colour); + GfxFillRect(inner.right, outer.top, outer.right, inner.bottom, colour); + GfxFillRect(outer.left + 1, inner.bottom, outer.right - 1, outer.bottom, colour); } } } @@ -672,15 +892,12 @@ void Window::DrawSortButtonState(int widget, SortButtonState state) const if (state == SBS_OFF) return; assert(this->nested_array != nullptr); - const NWidgetBase *nwid = this->GetWidget(widget); + Rect r = this->GetWidget(widget)->GetCurrentRect(); /* Sort button uses the same sprites as vertical scrollbar */ Dimension dim = NWidgetScrollbar::GetVerticalDimension(); - int offset = this->IsWidgetLowered(widget) ? 1 : 0; - int x = offset + nwid->pos_x + (_current_text_dir == TD_LTR ? nwid->current_x - dim.width : 0); - int y = offset + nwid->pos_y + (nwid->current_y - dim.height) / 2; - DrawSprite(state == SBS_DOWN ? SPR_ARROW_DOWN : SPR_ARROW_UP, PAL_NONE, x, y); + DrawSpriteIgnorePadding(state == SBS_DOWN ? SPR_ARROW_DOWN : SPR_ARROW_UP, PAL_NONE, r.WithWidth(dim.width, _current_text_dir == TD_LTR), this->IsWidgetLowered(widget), SA_CENTER); } /** @@ -831,10 +1048,7 @@ NWidgetBase *NWidgetBase::GetWidgetOfType(WidgetType tp) void NWidgetBase::AdjustPaddingForZoom() { - this->padding_top = ScaleGUITrad(this->uz_padding_top); - this->padding_right = ScaleGUITrad(this->uz_padding_right); - this->padding_bottom = ScaleGUITrad(this->uz_padding_bottom); - this->padding_left = ScaleGUITrad(this->uz_padding_left); + this->padding = ScaleGUITrad(this->uz_padding); } /** @@ -886,7 +1100,7 @@ void NWidgetResizeBase::SetMinimalSizeAbsolute(uint min_x, uint min_y) /** * Set minimal text lines for the widget. * @param min_lines Number of text lines of the widget. - * @param spacing Extra spacing (eg WD_FRAMERECT_TOP + _BOTTOM) of the widget. + * @param spacing Extra unscaled spacing (eg WidgetDimensions::unscaled.framerect.Vertical()) of the widget. * @param size Font size of text. */ void NWidgetResizeBase::SetMinimalTextLines(uint8 min_lines, uint8 spacing, FontSize size) @@ -1124,8 +1338,8 @@ void NWidgetStacked::SetupSmallestSize(Window *w, bool init_array) for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) { child_wid->SetupSmallestSize(w, init_array); - this->smallest_x = std::max(this->smallest_x, child_wid->smallest_x + child_wid->padding_left + child_wid->padding_right); - this->smallest_y = std::max(this->smallest_y, child_wid->smallest_y + child_wid->padding_top + child_wid->padding_bottom); + this->smallest_x = std::max(this->smallest_x, child_wid->smallest_x + child_wid->padding.Horizontal()); + this->smallest_y = std::max(this->smallest_y, child_wid->smallest_y + child_wid->padding.Vertical()); this->fill_x = LeastCommonMultiple(this->fill_x, child_wid->fill_x); this->fill_y = LeastCommonMultiple(this->fill_y, child_wid->fill_y); this->resize_x = LeastCommonMultiple(this->resize_x, child_wid->resize_x); @@ -1142,12 +1356,12 @@ void NWidgetStacked::AssignSizePosition(SizingType sizing, uint x, uint y, uint for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) { uint hor_step = (sizing == ST_SMALLEST) ? 1 : child_wid->GetHorizontalStepSize(sizing); - uint child_width = ComputeMaxSize(child_wid->smallest_x, given_width - child_wid->padding_left - child_wid->padding_right, hor_step); - uint child_pos_x = (rtl ? child_wid->padding_right : child_wid->padding_left); + uint child_width = ComputeMaxSize(child_wid->smallest_x, given_width - child_wid->padding.Horizontal(), hor_step); + uint child_pos_x = (rtl ? child_wid->padding.right : child_wid->padding.left); uint vert_step = (sizing == ST_SMALLEST) ? 1 : child_wid->GetVerticalStepSize(sizing); - uint child_height = ComputeMaxSize(child_wid->smallest_y, given_height - child_wid->padding_top - child_wid->padding_bottom, vert_step); - uint child_pos_y = child_wid->padding_top; + uint child_height = ComputeMaxSize(child_wid->smallest_y, given_height - child_wid->padding.Vertical(), vert_step); + uint child_pos_y = child_wid->padding.top; child_wid->AssignSizePosition(sizing, x + child_pos_x, y + child_pos_y, child_width, child_height, rtl); } @@ -1269,7 +1483,7 @@ void NWidgetHorizontal::SetupSmallestSize(Window *w, bool init_array) child_wid->SetupSmallestSize(w, init_array); longest = std::max(longest, child_wid->smallest_x); max_vert_fill = std::max(max_vert_fill, child_wid->GetVerticalStepSize(ST_SMALLEST)); - this->smallest_y = std::max(this->smallest_y, child_wid->smallest_y + child_wid->padding_top + child_wid->padding_bottom); + this->smallest_y = std::max(this->smallest_y, child_wid->smallest_y + child_wid->padding.Vertical()); } /* 1b. Make the container higher if needed to accommodate all children nicely. */ [[maybe_unused]] uint max_smallest = this->smallest_y + 3 * max_vert_fill; // Upper limit to computing smallest height. @@ -1277,7 +1491,7 @@ void NWidgetHorizontal::SetupSmallestSize(Window *w, bool init_array) for (;;) { for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) { uint step_size = child_wid->GetVerticalStepSize(ST_SMALLEST); - uint child_height = child_wid->smallest_y + child_wid->padding_top + child_wid->padding_bottom; + uint child_height = child_wid->smallest_y + child_wid->padding.Vertical(); if (step_size > 1 && child_height < cur_height) { // Small step sizes or already fitting children are not interesting. uint remainder = (cur_height - child_height) % step_size; if (remainder > 0) { // Child did not fit entirely, widen the container. @@ -1297,15 +1511,15 @@ void NWidgetHorizontal::SetupSmallestSize(Window *w, bool init_array) } } /* 3. Move PIP space to the children, compute smallest, fill, and resize values of the container. */ - if (this->head != nullptr) this->head->padding_left += this->pip_pre; + if (this->head != nullptr) this->head->padding.left += this->pip_pre; for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) { if (child_wid->next != nullptr) { - child_wid->padding_right += this->pip_inter; + child_wid->padding.right += this->pip_inter; } else { - child_wid->padding_right += this->pip_post; + child_wid->padding.right += this->pip_post; } - this->smallest_x += child_wid->smallest_x + child_wid->padding_left + child_wid->padding_right; + this->smallest_x += child_wid->smallest_x + child_wid->padding.Horizontal(); if (child_wid->fill_x > 0) { if (this->fill_x == 0 || this->fill_x > child_wid->fill_x) this->fill_x = child_wid->fill_x; } @@ -1329,7 +1543,7 @@ void NWidgetHorizontal::AssignSizePosition(SizingType sizing, uint x, uint y, ui if (sizing == ST_SMALLEST && (this->flags & NC_EQUALSIZE)) { /* For EQUALSIZE containers this does not sum to smallest_x during initialisation */ for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) { - additional_length -= child_wid->smallest_x + child_wid->padding_right + child_wid->padding_left; + additional_length -= child_wid->smallest_x + child_wid->padding.Horizontal(); } } else { additional_length -= this->smallest_x; @@ -1363,7 +1577,7 @@ void NWidgetHorizontal::AssignSizePosition(SizingType sizing, uint x, uint y, ui } uint vert_step = (sizing == ST_SMALLEST) ? 1 : child_wid->GetVerticalStepSize(sizing); - child_wid->current_y = ComputeMaxSize(child_wid->smallest_y, given_height - child_wid->padding_top - child_wid->padding_bottom, vert_step); + child_wid->current_y = ComputeMaxSize(child_wid->smallest_y, given_height - child_wid->padding.Vertical(), vert_step); } /* First.5 loop: count how many children are of the biggest step size. */ @@ -1411,11 +1625,11 @@ void NWidgetHorizontal::AssignSizePosition(SizingType sizing, uint x, uint y, ui NWidgetBase *child_wid = this->head; while (child_wid != nullptr) { uint child_width = child_wid->current_x; - uint child_x = x + (rtl ? position - child_width - child_wid->padding_left : position + child_wid->padding_left); - uint child_y = y + child_wid->padding_top; + uint child_x = x + (rtl ? position - child_width - child_wid->padding.left : position + child_wid->padding.left); + uint child_y = y + child_wid->padding.top; child_wid->AssignSizePosition(sizing, child_x, child_y, child_width, child_wid->current_y, rtl); - uint padded_child_width = child_width + child_wid->padding_right + child_wid->padding_left; + uint padded_child_width = child_width + child_wid->padding.Horizontal(); position = rtl ? position - padded_child_width : position + padded_child_width; child_wid = child_wid->next; @@ -1454,7 +1668,7 @@ void NWidgetVertical::SetupSmallestSize(Window *w, bool init_array) child_wid->SetupSmallestSize(w, init_array); highest = std::max(highest, child_wid->smallest_y); max_hor_fill = std::max(max_hor_fill, child_wid->GetHorizontalStepSize(ST_SMALLEST)); - this->smallest_x = std::max(this->smallest_x, child_wid->smallest_x + child_wid->padding_left + child_wid->padding_right); + this->smallest_x = std::max(this->smallest_x, child_wid->smallest_x + child_wid->padding.Horizontal()); } /* 1b. Make the container wider if needed to accommodate all children nicely. */ [[maybe_unused]] uint max_smallest = this->smallest_x + 3 * max_hor_fill; // Upper limit to computing smallest height. @@ -1462,7 +1676,7 @@ void NWidgetVertical::SetupSmallestSize(Window *w, bool init_array) for (;;) { for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) { uint step_size = child_wid->GetHorizontalStepSize(ST_SMALLEST); - uint child_width = child_wid->smallest_x + child_wid->padding_left + child_wid->padding_right; + uint child_width = child_wid->smallest_x + child_wid->padding.Horizontal(); if (step_size > 1 && child_width < cur_width) { // Small step sizes or already fitting children are not interesting. uint remainder = (cur_width - child_width) % step_size; if (remainder > 0) { // Child did not fit entirely, widen the container. @@ -1482,15 +1696,15 @@ void NWidgetVertical::SetupSmallestSize(Window *w, bool init_array) } } /* 3. Move PIP space to the child, compute smallest, fill, and resize values of the container. */ - if (this->head != nullptr) this->head->padding_top += this->pip_pre; + if (this->head != nullptr) this->head->padding.top += this->pip_pre; for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) { if (child_wid->next != nullptr) { - child_wid->padding_bottom += this->pip_inter; + child_wid->padding.bottom += this->pip_inter; } else { - child_wid->padding_bottom += this->pip_post; + child_wid->padding.bottom += this->pip_post; } - this->smallest_y += child_wid->smallest_y + child_wid->padding_top + child_wid->padding_bottom; + this->smallest_y += child_wid->smallest_y + child_wid->padding.Vertical(); if (child_wid->fill_y > 0) { if (this->fill_y == 0 || this->fill_y > child_wid->fill_y) this->fill_y = child_wid->fill_y; } @@ -1514,7 +1728,7 @@ void NWidgetVertical::AssignSizePosition(SizingType sizing, uint x, uint y, uint if (sizing == ST_SMALLEST && (this->flags & NC_EQUALSIZE)) { /* For EQUALSIZE containers this does not sum to smallest_y during initialisation */ for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) { - additional_length -= child_wid->smallest_y + child_wid->padding_top + child_wid->padding_bottom; + additional_length -= child_wid->smallest_y + child_wid->padding.Vertical(); } } else { additional_length -= this->smallest_y; @@ -1539,7 +1753,7 @@ void NWidgetVertical::AssignSizePosition(SizingType sizing, uint x, uint y, uint } uint hor_step = (sizing == ST_SMALLEST) ? 1 : child_wid->GetHorizontalStepSize(sizing); - child_wid->current_x = ComputeMaxSize(child_wid->smallest_x, given_width - child_wid->padding_left - child_wid->padding_right, hor_step); + child_wid->current_x = ComputeMaxSize(child_wid->smallest_x, given_width - child_wid->padding.Horizontal(), hor_step); } /* First.5 loop: count how many children are of the biggest step size. */ @@ -1585,11 +1799,11 @@ void NWidgetVertical::AssignSizePosition(SizingType sizing, uint x, uint y, uint /* Third loop: Compute position and call the child. */ uint position = 0; // Place to put next child relative to origin of the container. for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) { - uint child_x = x + (rtl ? child_wid->padding_right : child_wid->padding_left); + uint child_x = x + (rtl ? child_wid->padding.right : child_wid->padding.left); uint child_height = child_wid->current_y; - child_wid->AssignSizePosition(sizing, child_x, y + position + child_wid->padding_top, child_wid->current_x, child_height, rtl); - position += child_height + child_wid->padding_top + child_wid->padding_bottom; + child_wid->AssignSizePosition(sizing, child_x, y + position + child_wid->padding.top, child_wid->current_x, child_height, rtl); + position += child_height + child_wid->padding.Vertical(); } } @@ -1945,25 +2159,20 @@ void NWidgetBackground::SetupSmallestSize(Window *w, bool init_array) if (this->type == WWT_FRAME) { /* Account for the size of the frame's text if that exists */ - this->child->padding_left = WD_FRAMETEXT_LEFT; - this->child->padding_right = WD_FRAMETEXT_RIGHT; - this->child->padding_top = std::max((int)WD_FRAMETEXT_TOP, this->widget_data != STR_NULL ? FONT_HEIGHT_NORMAL + WD_FRAMETEXT_TOP / 2 : 0); - this->child->padding_bottom = WD_FRAMETEXT_BOTTOM; + this->child->padding = WidgetDimensions::scaled.frametext; + this->child->padding.top = std::max(WidgetDimensions::scaled.frametext.top, this->widget_data != STR_NULL ? FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.frametext.top / 2 : 0); - this->smallest_x += this->child->padding_left + this->child->padding_right; - this->smallest_y += this->child->padding_top + this->child->padding_bottom; + this->smallest_x += this->child->padding.Horizontal(); + this->smallest_y += this->child->padding.Vertical(); if (this->index >= 0) w->SetStringParameters(this->index); - this->smallest_x = std::max(this->smallest_x, GetStringBoundingBox(this->widget_data).width + WD_FRAMETEXT_LEFT + WD_FRAMETEXT_RIGHT); + this->smallest_x = std::max(this->smallest_x, GetStringBoundingBox(this->widget_data).width + WidgetDimensions::scaled.frametext.Horizontal()); } else if (this->type == WWT_INSET) { /* Apply automatic padding for bevel thickness. */ - this->child->padding_left = WD_BEVEL_LEFT; - this->child->padding_right = WD_BEVEL_RIGHT; - this->child->padding_top = WD_BEVEL_TOP; - this->child->padding_bottom = WD_BEVEL_BOTTOM; + this->child->padding = WidgetDimensions::scaled.bevel; - this->smallest_x += this->child->padding_left + this->child->padding_right; - this->smallest_y += this->child->padding_top + this->child->padding_bottom; + this->smallest_x += this->child->padding.Horizontal(); + this->smallest_y += this->child->padding.Vertical(); } } else { Dimension d = {this->min_x, this->min_y}; @@ -1973,11 +2182,17 @@ void NWidgetBackground::SetupSmallestSize(Window *w, bool init_array) if (this->type == WWT_FRAME || this->type == WWT_INSET) { if (this->index >= 0) w->SetStringParameters(this->index); Dimension background = GetStringBoundingBox(this->widget_data); - background.width += (this->type == WWT_FRAME) ? (WD_FRAMETEXT_LEFT + WD_FRAMERECT_RIGHT) : (WD_INSET_LEFT + WD_INSET_RIGHT); + background.width += (this->type == WWT_FRAME) ? (WidgetDimensions::scaled.frametext.Horizontal()) : (WidgetDimensions::scaled.inset.Horizontal()); d = maxdim(d, background); } if (this->index >= 0) { - static const Dimension padding = {0, 0}; + Dimension padding; + switch (this->type) { + default: NOT_REACHED(); + case WWT_PANEL: padding = {WidgetDimensions::scaled.framerect.Horizontal(), WidgetDimensions::scaled.framerect.Vertical()}; break; + case WWT_FRAME: padding = {WidgetDimensions::scaled.frametext.Horizontal(), WidgetDimensions::scaled.frametext.Vertical()}; break; + case WWT_INSET: padding = {WidgetDimensions::scaled.inset.Horizontal(), WidgetDimensions::scaled.inset.Vertical()}; break; + } w->UpdateWidgetSize(this->index, &d, padding, &fill, &resize); } } @@ -1995,10 +2210,10 @@ void NWidgetBackground::AssignSizePosition(SizingType sizing, uint x, uint y, ui this->StoreSizePosition(sizing, x, y, given_width, given_height); if (this->child != nullptr) { - uint x_offset = (rtl ? this->child->padding_right : this->child->padding_left); - uint width = given_width - this->child->padding_right - this->child->padding_left; - uint height = given_height - this->child->padding_top - this->child->padding_bottom; - this->child->AssignSizePosition(sizing, x + x_offset, y + this->child->padding_top, width, height, rtl); + uint x_offset = (rtl ? this->child->padding.right : this->child->padding.left); + uint width = given_width - this->child->padding.Horizontal(); + uint height = given_height - this->child->padding.Vertical(); + this->child->AssignSizePosition(sizing, x + x_offset, y + this->child->padding.top, width, height, rtl); } } @@ -2041,7 +2256,7 @@ void NWidgetBackground::Draw(const Window *w) if (this->child != nullptr) this->child->Draw(w); if (this->IsDisabled()) { - GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, _colour_gradient[this->colour & 0xF][2], FILLRECT_CHECKER); + GfxFillRect(r.Shrink(WidgetDimensions::scaled.bevel), _colour_gradient[this->colour & 0xF][2], FILLRECT_CHECKER); } } @@ -2292,7 +2507,7 @@ void NWidgetScrollbar::Draw(const Window *w) } if (this->IsDisabled()) { - GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, _colour_gradient[this->colour & 0xF][2], FILLRECT_CHECKER); + GfxFillRect(r.Shrink(WidgetDimensions::scaled.bevel), _colour_gradient[this->colour & 0xF][2], FILLRECT_CHECKER); } } @@ -2304,22 +2519,20 @@ void NWidgetScrollbar::Draw(const Window *w) /* static */ Dimension NWidgetScrollbar::GetVerticalDimension() { - static const Dimension extra = {WD_SCROLLBAR_LEFT + WD_SCROLLBAR_RIGHT, WD_SCROLLBAR_TOP + WD_SCROLLBAR_BOTTOM}; if (vertical_dimension.width == 0) { - vertical_dimension = maxdim(GetSpriteSize(SPR_ARROW_UP), GetSpriteSize(SPR_ARROW_DOWN)); - vertical_dimension.width += extra.width; - vertical_dimension.height += extra.height; + vertical_dimension = maxdim(GetScaledSpriteSize(SPR_ARROW_UP), GetScaledSpriteSize(SPR_ARROW_DOWN)); + vertical_dimension.width += WidgetDimensions::scaled.vscrollbar.Horizontal(); + vertical_dimension.height += WidgetDimensions::scaled.vscrollbar.Vertical(); } return vertical_dimension; } /* static */ Dimension NWidgetScrollbar::GetHorizontalDimension() { - static const Dimension extra = {WD_SCROLLBAR_LEFT + WD_SCROLLBAR_RIGHT, WD_SCROLLBAR_TOP + WD_SCROLLBAR_BOTTOM}; if (horizontal_dimension.width == 0) { - horizontal_dimension = maxdim(GetSpriteSize(SPR_ARROW_LEFT), GetSpriteSize(SPR_ARROW_RIGHT)); - horizontal_dimension.width += extra.width; - horizontal_dimension.height += extra.height; + horizontal_dimension = maxdim(GetScaledSpriteSize(SPR_ARROW_LEFT), GetScaledSpriteSize(SPR_ARROW_RIGHT)); + horizontal_dimension.width += WidgetDimensions::scaled.hscrollbar.Horizontal(); + horizontal_dimension.height += WidgetDimensions::scaled.hscrollbar.Vertical(); } return horizontal_dimension; } @@ -2396,7 +2609,7 @@ NWidgetLeaf::NWidgetLeaf(WidgetType tp, Colours colour, int index, uint32 data, this->SetFill(1, 0); this->SetResize(1, 0); this->SetMinimalSize(0, WD_CAPTION_HEIGHT); - this->SetMinimalTextLines(1, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM, FS_NORMAL); + this->SetMinimalTextLines(1, WidgetDimensions::unscaled.framerect.Vertical(), FS_NORMAL); this->SetDataTip(data, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS); break; @@ -2454,41 +2667,35 @@ void NWidgetLeaf::SetupSmallestSize(Window *w, bool init_array) w->nested_array[this->index] = this; } + Dimension padding = {0, 0}; Dimension size = {this->min_x, this->min_y}; Dimension fill = {this->fill_x, this->fill_y}; Dimension resize = {this->resize_x, this->resize_y}; - /* Get padding, and update size with the real content size if appropriate. */ - const Dimension *padding = nullptr; switch (this->type) { case WWT_EMPTY: { - static const Dimension extra = {0, 0}; - padding = &extra; break; } case WWT_MATRIX: { - static const Dimension extra = {WD_MATRIX_LEFT + WD_MATRIX_RIGHT, WD_MATRIX_TOP + WD_MATRIX_BOTTOM}; - padding = &extra; + padding = {WidgetDimensions::scaled.matrix.Horizontal(), WidgetDimensions::scaled.matrix.Vertical()}; break; } case WWT_SHADEBOX: { - static const Dimension extra = {WD_SHADEBOX_LEFT + WD_SHADEBOX_RIGHT, WD_SHADEBOX_TOP + WD_SHADEBOX_BOTTOM}; - padding = &extra; + padding = {WidgetDimensions::scaled.shadebox.Horizontal(), WidgetDimensions::scaled.shadebox.Vertical()}; if (NWidgetLeaf::shadebox_dimension.width == 0) { - NWidgetLeaf::shadebox_dimension = maxdim(GetSpriteSize(SPR_WINDOW_SHADE), GetSpriteSize(SPR_WINDOW_UNSHADE)); - NWidgetLeaf::shadebox_dimension.width += extra.width; - NWidgetLeaf::shadebox_dimension.height += extra.height; + NWidgetLeaf::shadebox_dimension = maxdim(GetScaledSpriteSize(SPR_WINDOW_SHADE), GetScaledSpriteSize(SPR_WINDOW_UNSHADE)); + NWidgetLeaf::shadebox_dimension.width += padding.width; + NWidgetLeaf::shadebox_dimension.height += padding.height; } size = maxdim(size, NWidgetLeaf::shadebox_dimension); break; } case WWT_DEBUGBOX: if (_settings_client.gui.newgrf_developer_tools && w->IsNewGRFInspectable()) { - static const Dimension extra = {WD_DEBUGBOX_LEFT + WD_DEBUGBOX_RIGHT, WD_DEBUGBOX_TOP + WD_DEBUGBOX_BOTTOM}; - padding = &extra; + padding = {WidgetDimensions::scaled.debugbox.Horizontal(), WidgetDimensions::scaled.debugbox.Vertical()}; if (NWidgetLeaf::debugbox_dimension.width == 0) { - NWidgetLeaf::debugbox_dimension = GetSpriteSize(SPR_WINDOW_DEBUG); - NWidgetLeaf::debugbox_dimension.width += extra.width; - NWidgetLeaf::debugbox_dimension.height += extra.height; + NWidgetLeaf::debugbox_dimension = GetScaledSpriteSize(SPR_WINDOW_DEBUG); + NWidgetLeaf::debugbox_dimension.width += padding.width; + NWidgetLeaf::debugbox_dimension.height += padding.height; } size = maxdim(size, NWidgetLeaf::debugbox_dimension); } else { @@ -2500,81 +2707,74 @@ void NWidgetLeaf::SetupSmallestSize(Window *w, bool init_array) break; case WWT_STICKYBOX: { - static const Dimension extra = {WD_STICKYBOX_LEFT + WD_STICKYBOX_RIGHT, WD_STICKYBOX_TOP + WD_STICKYBOX_BOTTOM}; - padding = &extra; + padding = {WidgetDimensions::scaled.stickybox.Horizontal(), WidgetDimensions::scaled.stickybox.Vertical()}; if (NWidgetLeaf::stickybox_dimension.width == 0) { - NWidgetLeaf::stickybox_dimension = maxdim(GetSpriteSize(SPR_PIN_UP), GetSpriteSize(SPR_PIN_DOWN)); - NWidgetLeaf::stickybox_dimension.width += extra.width; - NWidgetLeaf::stickybox_dimension.height += extra.height; + NWidgetLeaf::stickybox_dimension = maxdim(GetScaledSpriteSize(SPR_PIN_UP), GetScaledSpriteSize(SPR_PIN_DOWN)); + NWidgetLeaf::stickybox_dimension.width += padding.width; + NWidgetLeaf::stickybox_dimension.height += padding.height; } size = maxdim(size, NWidgetLeaf::stickybox_dimension); break; } case WWT_DEFSIZEBOX: { - static const Dimension extra = {WD_DEFSIZEBOX_LEFT + WD_DEFSIZEBOX_RIGHT, WD_DEFSIZEBOX_TOP + WD_DEFSIZEBOX_BOTTOM}; - padding = &extra; + padding = {WidgetDimensions::scaled.defsizebox.Horizontal(), WidgetDimensions::scaled.defsizebox.Vertical()}; if (NWidgetLeaf::defsizebox_dimension.width == 0) { - NWidgetLeaf::defsizebox_dimension = GetSpriteSize(SPR_WINDOW_DEFSIZE); - NWidgetLeaf::defsizebox_dimension.width += extra.width; - NWidgetLeaf::defsizebox_dimension.height += extra.height; + NWidgetLeaf::defsizebox_dimension = GetScaledSpriteSize(SPR_WINDOW_DEFSIZE); + NWidgetLeaf::defsizebox_dimension.width += padding.width; + NWidgetLeaf::defsizebox_dimension.height += padding.height; } size = maxdim(size, NWidgetLeaf::defsizebox_dimension); break; } case WWT_RESIZEBOX: { - static const Dimension extra = {WD_RESIZEBOX_LEFT + WD_RESIZEBOX_RIGHT, WD_RESIZEBOX_TOP + WD_RESIZEBOX_BOTTOM}; - padding = &extra; + padding = {WidgetDimensions::scaled.resizebox.Horizontal(), WidgetDimensions::scaled.resizebox.Vertical()}; if (NWidgetLeaf::resizebox_dimension.width == 0) { - NWidgetLeaf::resizebox_dimension = maxdim(GetSpriteSize(SPR_WINDOW_RESIZE_LEFT), GetSpriteSize(SPR_WINDOW_RESIZE_RIGHT)); - NWidgetLeaf::resizebox_dimension.width += extra.width; - NWidgetLeaf::resizebox_dimension.height += extra.height; + NWidgetLeaf::resizebox_dimension = maxdim(GetScaledSpriteSize(SPR_WINDOW_RESIZE_LEFT), GetScaledSpriteSize(SPR_WINDOW_RESIZE_RIGHT)); + NWidgetLeaf::resizebox_dimension.width += padding.width; + NWidgetLeaf::resizebox_dimension.height += padding.height; } size = maxdim(size, NWidgetLeaf::resizebox_dimension); break; } case WWT_EDITBOX: { - Dimension sprite_size = GetSpriteSize(_current_text_dir == TD_RTL ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT); - size.width = std::max(size.width, 30 + sprite_size.width); - size.height = std::max(sprite_size.height, GetStringBoundingBox("_").height + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM); + Dimension sprite_size = GetScaledSpriteSize(_current_text_dir == TD_RTL ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT); + size.width = std::max(size.width, ScaleGUITrad(30) + sprite_size.width); + size.height = std::max(sprite_size.height, GetStringBoundingBox("_").height + WidgetDimensions::scaled.framerect.Vertical()); } FALLTHROUGH; case WWT_PUSHBTN: { - static const Dimension extra = {WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM}; - padding = &extra; + padding = {WidgetDimensions::scaled.frametext.Horizontal(), WidgetDimensions::scaled.framerect.Vertical()}; break; } case WWT_IMGBTN: case WWT_IMGBTN_2: case WWT_PUSHIMGBTN: { - static const Dimension extra = {WD_IMGBTN_LEFT + WD_IMGBTN_RIGHT, WD_IMGBTN_TOP + WD_IMGBTN_BOTTOM}; - padding = &extra; - Dimension d2 = GetSpriteSize(this->widget_data); - if (this->type == WWT_IMGBTN_2) d2 = maxdim(d2, GetSpriteSize(this->widget_data + 1)); - d2.width += extra.width; - d2.height += extra.height; + padding = {WidgetDimensions::scaled.imgbtn.Horizontal(), WidgetDimensions::scaled.imgbtn.Vertical()}; + Dimension d2 = GetScaledSpriteSize(this->widget_data); + if (this->type == WWT_IMGBTN_2) d2 = maxdim(d2, GetScaledSpriteSize(this->widget_data + 1)); + d2.width += padding.width; + d2.height += padding.height; size = maxdim(size, d2); break; } case WWT_ARROWBTN: case WWT_PUSHARROWBTN: { - static const Dimension extra = {WD_IMGBTN_LEFT + WD_IMGBTN_RIGHT, WD_IMGBTN_TOP + WD_IMGBTN_BOTTOM}; - padding = &extra; - Dimension d2 = maxdim(GetSpriteSize(SPR_ARROW_LEFT), GetSpriteSize(SPR_ARROW_RIGHT)); - d2.width += extra.width; - d2.height += extra.height; + padding = {WidgetDimensions::scaled.imgbtn.Horizontal(), WidgetDimensions::scaled.imgbtn.Vertical()}; + Dimension d2 = maxdim(GetScaledSpriteSize(SPR_ARROW_LEFT), GetScaledSpriteSize(SPR_ARROW_RIGHT)); + d2.width += padding.width; + d2.height += padding.height; size = maxdim(size, d2); break; } case WWT_CLOSEBOX: { - static const Dimension extra = {WD_CLOSEBOX_LEFT + WD_CLOSEBOX_RIGHT, WD_CLOSEBOX_TOP + WD_CLOSEBOX_BOTTOM}; - padding = &extra; + padding = {WidgetDimensions::scaled.closebox.Horizontal(), WidgetDimensions::scaled.closebox.Vertical()}; if (NWidgetLeaf::closebox_dimension.width == 0) { - NWidgetLeaf::closebox_dimension = GetSpriteSize(SPR_CLOSEBOX); - NWidgetLeaf::closebox_dimension.width += extra.width; - NWidgetLeaf::closebox_dimension.height += extra.height; + NWidgetLeaf::closebox_dimension = GetScaledSpriteSize(SPR_CLOSEBOX); + NWidgetLeaf::closebox_dimension.width += padding.width; + NWidgetLeaf::closebox_dimension.height += padding.height; } size = maxdim(size, NWidgetLeaf::closebox_dimension); break; @@ -2582,48 +2782,42 @@ void NWidgetLeaf::SetupSmallestSize(Window *w, bool init_array) case WWT_TEXTBTN: case WWT_PUSHTXTBTN: case WWT_TEXTBTN_2: { - static const Dimension extra = {WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM}; - padding = &extra; + padding = {WidgetDimensions::scaled.framerect.Horizontal(), WidgetDimensions::scaled.framerect.Vertical()}; if (this->index >= 0) w->SetStringParameters(this->index); Dimension d2 = GetStringBoundingBox(this->widget_data); - d2.width += extra.width; - d2.height += extra.height; + d2.width += padding.width; + d2.height += padding.height; size = maxdim(size, d2); break; } case WWT_LABEL: case WWT_TEXT: { - static const Dimension extra = {0, 0}; - padding = &extra; if (this->index >= 0) w->SetStringParameters(this->index); size = maxdim(size, GetStringBoundingBox(this->widget_data)); break; } case WWT_CAPTION: { - static const Dimension extra = {WD_CAPTIONTEXT_LEFT + WD_CAPTIONTEXT_RIGHT, WD_CAPTIONTEXT_TOP + WD_CAPTIONTEXT_BOTTOM}; - padding = &extra; + padding = {WidgetDimensions::scaled.captiontext.Horizontal(), WidgetDimensions::scaled.captiontext.Vertical()}; if (this->index >= 0) w->SetStringParameters(this->index); Dimension d2 = GetStringBoundingBox(this->widget_data); - d2.width += extra.width; - d2.height += extra.height; + d2.width += padding.width; + d2.height += padding.height; size = maxdim(size, d2); break; } case WWT_DROPDOWN: case NWID_BUTTON_DROPDOWN: case NWID_PUSHBUTTON_DROPDOWN: { - static Dimension extra = {WD_DROPDOWNTEXT_LEFT + WD_DROPDOWNTEXT_RIGHT, WD_DROPDOWNTEXT_TOP + WD_DROPDOWNTEXT_BOTTOM}; - padding = &extra; if (NWidgetLeaf::dropdown_dimension.width == 0) { - NWidgetLeaf::dropdown_dimension = GetSpriteSize(SPR_ARROW_DOWN); - NWidgetLeaf::dropdown_dimension.width += WD_DROPDOWNTEXT_LEFT + WD_DROPDOWNTEXT_RIGHT; - NWidgetLeaf::dropdown_dimension.height += WD_DROPDOWNTEXT_TOP + WD_DROPDOWNTEXT_BOTTOM; - extra.width = WD_DROPDOWNTEXT_LEFT + WD_DROPDOWNTEXT_RIGHT + NWidgetLeaf::dropdown_dimension.width; + NWidgetLeaf::dropdown_dimension = GetScaledSpriteSize(SPR_ARROW_DOWN); + NWidgetLeaf::dropdown_dimension.width += WidgetDimensions::scaled.vscrollbar.Horizontal(); + NWidgetLeaf::dropdown_dimension.height += WidgetDimensions::scaled.vscrollbar.Vertical(); } + padding = {WidgetDimensions::scaled.dropdowntext.Horizontal() + NWidgetLeaf::dropdown_dimension.width, WidgetDimensions::scaled.dropdowntext.Vertical()}; if (this->index >= 0) w->SetStringParameters(this->index); Dimension d2 = GetStringBoundingBox(this->widget_data); - d2.width += extra.width; - d2.height = std::max(d2.height, NWidgetLeaf::dropdown_dimension.height) + extra.height; + d2.width += padding.width; + d2.height = std::max(d2.height + padding.height, NWidgetLeaf::dropdown_dimension.height); size = maxdim(size, d2); break; } @@ -2631,7 +2825,7 @@ void NWidgetLeaf::SetupSmallestSize(Window *w, bool init_array) NOT_REACHED(); } - if (this->index >= 0) w->UpdateWidgetSize(this->index, &size, *padding, &fill, &resize); + if (this->index >= 0) w->UpdateWidgetSize(this->index, &size, padding, &fill, &resize); this->smallest_x = size.width; this->smallest_y = size.height; @@ -2645,9 +2839,10 @@ void NWidgetLeaf::Draw(const Window *w) { if (this->current_x == 0 || this->current_y == 0) return; - /* Setup a clipping rectangle... */ + /* Setup a clipping rectangle... for WWT_EMPTY or WWT_TEXT, an extra scaled pixel is allowed vertically in case text shadow encroaches. */ + int extra_y = (this->type == WWT_EMPTY || this->type == WWT_TEXT) ? ScaleGUITrad(1) : 0; DrawPixelInfo new_dpi; - if (!FillDrawPixelInfo(&new_dpi, this->pos_x, this->pos_y, this->current_x, this->current_y)) return; + if (!FillDrawPixelInfo(&new_dpi, this->pos_x, this->pos_y, this->current_x, this->current_y + extra_y)) return; /* ...but keep coordinates relative to the window. */ new_dpi.left += this->pos_x; new_dpi.top += this->pos_y; @@ -2765,7 +2960,7 @@ void NWidgetLeaf::Draw(const Window *w) if (this->index >= 0) w->DrawWidget(r, this->index); if (this->IsDisabled()) { - GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, _colour_gradient[this->colour & 0xF][2], FILLRECT_CHECKER); + GfxFillRect(r.Shrink(WidgetDimensions::scaled.bevel), _colour_gradient[this->colour & 0xF][2], FILLRECT_CHECKER); } _cur_dpi = old_dpi; @@ -2927,7 +3122,7 @@ static int MakeNWidget(const NWidgetPart *parts, int count, NWidgetBase **dest, } case WPT_PADDING: - if (*dest != nullptr) (*dest)->SetPadding(parts->u.padding.top, parts->u.padding.right, parts->u.padding.bottom, parts->u.padding.left); + if (*dest != nullptr) (*dest)->SetPadding(parts->u.padding); break; case WPT_PIPSPACE: { @@ -3133,8 +3328,8 @@ NWidgetBase *MakeCompanyButtonRows(int *biggest_index, int widget_first, int wid int hor_length = 0; Dimension sprite_size = GetSpriteSize(SPR_COMPANY_ICON, nullptr, ZOOM_LVL_OUT_4X); - sprite_size.width += WD_MATRIX_LEFT + WD_MATRIX_RIGHT; - sprite_size.height += WD_MATRIX_TOP + WD_MATRIX_BOTTOM + 1; // 1 for the 'offset' of being pressed + sprite_size.width += WidgetDimensions::unscaled.matrix.Horizontal(); + sprite_size.height += WidgetDimensions::unscaled.matrix.Vertical() + 1; // 1 for the 'offset' of being pressed for (int widnum = widget_first; widnum <= widget_last; widnum++) { /* Ensure there is room in 'hor' for another button. */ diff --git a/src/widget_type.h b/src/widget_type.h index 4c812e42f1..8c05a321f7 100644 --- a/src/widget_type.h +++ b/src/widget_type.h @@ -149,10 +149,20 @@ public: */ inline void SetPadding(uint8 top, uint8 right, uint8 bottom, uint8 left) { - this->uz_padding_top = top; - this->uz_padding_right = right; - this->uz_padding_bottom = bottom; - this->uz_padding_left = left; + this->uz_padding.top = top; + this->uz_padding.right = right; + this->uz_padding.bottom = bottom; + this->uz_padding.left = left; + this->AdjustPaddingForZoom(); + } + + /** + * Set additional space (padding) around the widget. + * @param padding Amount of padding around the widget. + */ + inline void SetPadding(const RectPadding &padding) + { + this->uz_padding = padding; this->AdjustPaddingForZoom(); } @@ -192,15 +202,8 @@ public: NWidgetBase *next; ///< Pointer to next widget in container. Managed by parent container widget. NWidgetBase *prev; ///< Pointer to previous widget in container. Managed by parent container widget. - uint8 padding_top; ///< Paddings added to the top of the widget. Managed by parent container widget. - uint8 padding_right; ///< Paddings added to the right of the widget. Managed by parent container widget. (parent container may swap this with padding_left for RTL) - uint8 padding_bottom; ///< Paddings added to the bottom of the widget. Managed by parent container widget. - uint8 padding_left; ///< Paddings added to the left of the widget. Managed by parent container widget. (parent container may swap this with padding_right for RTL) - - uint8 uz_padding_top; ///< Unscaled top padding, for resize calculation. - uint8 uz_padding_right; ///< Unscaled right padding, for resize calculation. - uint8 uz_padding_bottom; ///< Unscaled bottom padding, for resize calculation. - uint8 uz_padding_left; ///< Unscaled left padding, for resize calculation. + RectPadding padding; ///< Padding added to the widget. Managed by parent container widget. (parent container may swap left and right for RTL) + RectPadding uz_padding; ///< Unscaled padding, for resize calculation. protected: inline void StoreSizePosition(SizingType sizing, uint x, uint y, uint given_width, uint given_height); @@ -920,8 +923,7 @@ struct NWidgetPartWidget { * Widget part for storing padding. * @ingroup NestedWidgetParts */ -struct NWidgetPartPaddings { - uint8 top, right, bottom, left; ///< Paddings for all directions. +struct NWidgetPartPaddings : RectPadding { }; /** @@ -1151,6 +1153,24 @@ static inline NWidgetPart SetPadding(uint8 top, uint8 right, uint8 bottom, uint8 return part; } +/** + * Widget part function for setting additional space around a widget. + * @param r The padding around the widget. + * @ingroup NestedWidgetParts + */ +static inline NWidgetPart SetPadding(const RectPadding &padding) +{ + NWidgetPart part; + + part.type = WPT_PADDING; + part.u.padding.left = padding.left; + part.u.padding.top = padding.top; + part.u.padding.right = padding.right; + part.u.padding.bottom = padding.bottom; + + return part; +} + /** * Widget part function for setting a padding. * @param padding The padding to use for all directions. @@ -1253,4 +1273,6 @@ NWidgetContainer *MakeWindowNWidgetTree(const NWidgetPart *parts, int count, int NWidgetBase *MakeCompanyButtonRows(int *biggest_index, int widget_first, int widget_last, Colours button_colour, int max_length, StringID button_tooltip); +void SetupWidgetDimensions(); + #endif /* WIDGET_TYPE_H */ diff --git a/src/widgets/CMakeLists.txt b/src/widgets/CMakeLists.txt index 5586870a3a..f766d1cff7 100644 --- a/src/widgets/CMakeLists.txt +++ b/src/widgets/CMakeLists.txt @@ -19,6 +19,7 @@ add_files( error_widget.h fios_widget.h framerate_widget.h + game_widget.h genworld_widget.h goal_widget.h graph_widget.h @@ -26,6 +27,7 @@ add_files( highscore_widget.h industry_widget.h intro_widget.h + league_widget.h link_graph_legend_widget.h main_widget.h misc_widget.h diff --git a/src/widgets/ai_widget.h b/src/widgets/ai_widget.h index 163894df4c..f09ab21210 100644 --- a/src/widgets/ai_widget.h +++ b/src/widgets/ai_widget.h @@ -38,7 +38,6 @@ enum AIConfigWidgets { WID_AIC_DECREASE, ///< Decrease the number of AIs. WID_AIC_INCREASE, ///< Increase the number of AIs. WID_AIC_NUMBER, ///< Number of AIs. - WID_AIC_GAMELIST, ///< List with current selected GameScript. WID_AIC_LIST, ///< List with currently selected AIs. WID_AIC_SCROLLBAR, ///< Scrollbar to scroll through the selected AIs. WID_AIC_MOVE_UP, ///< Move up button. diff --git a/src/widgets/dropdown.cpp b/src/widgets/dropdown.cpp index f104be68c8..b9cc1c8b9b 100644 --- a/src/widgets/dropdown.cpp +++ b/src/widgets/dropdown.cpp @@ -13,6 +13,7 @@ #include "../strings_func.h" #include "../window_func.h" #include "../guitimer_func.h" +#include "../zoom_func.h" #include "dropdown_type.h" #include "dropdown_widget.h" @@ -20,26 +21,27 @@ #include "../safeguards.h" -void DropDownListItem::Draw(int left, int right, int top, int bottom, bool sel, Colours bg_colour) const +void DropDownListItem::Draw(const Rect &r, bool sel, Colours bg_colour) const { int c1 = _colour_gradient[bg_colour][3]; int c2 = _colour_gradient[bg_colour][7]; - int mid = top + this->Height(0) / 2; - GfxFillRect(left + 1, mid - 2, right - 1, mid - 2, c1); - GfxFillRect(left + 1, mid - 1, right - 1, mid - 1, c2); + int mid = CenterBounds(r.top, r.bottom, 0); + GfxFillRect(r.left, mid - WidgetDimensions::scaled.bevel.bottom, r.right, mid - 1, c1); + GfxFillRect(r.left, mid, r.right, mid + WidgetDimensions::scaled.bevel.top - 1, c2); } uint DropDownListStringItem::Width() const { char buffer[512]; GetString(buffer, this->String(), lastof(buffer)); - return GetStringBoundingBox(buffer).width; + return GetStringBoundingBox(buffer).width + WidgetDimensions::scaled.dropdowntext.Horizontal(); } -void DropDownListStringItem::Draw(int left, int right, int top, int bottom, bool sel, Colours bg_colour) const +void DropDownListStringItem::Draw(const Rect &r, bool sel, Colours bg_colour) const { - DrawString(left + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, top, this->String(), sel ? TC_WHITE : TC_BLACK); + Rect ir = r.Shrink(WidgetDimensions::scaled.dropdowntext); + DrawString(ir.left, ir.right, r.top, this->String(), sel ? TC_WHITE : TC_BLACK); } /** @@ -82,14 +84,16 @@ uint DropDownListIconItem::Height(uint width) const uint DropDownListIconItem::Width() const { - return DropDownListStringItem::Width() + this->dim.width + WD_FRAMERECT_LEFT; + return DropDownListParamStringItem::Width() + this->dim.width + WidgetDimensions::scaled.hsep_wide; } -void DropDownListIconItem::Draw(int left, int right, int top, int bottom, bool sel, Colours bg_colour) const +void DropDownListIconItem::Draw(const Rect &r, bool sel, Colours bg_colour) const { bool rtl = _current_text_dir == TD_RTL; - DrawSprite(this->sprite, this->pal, rtl ? right - this->dim.width - WD_FRAMERECT_RIGHT : left + WD_FRAMERECT_LEFT, CenterBounds(top, bottom, this->sprite_y)); - DrawString(left + WD_FRAMERECT_LEFT + (rtl ? 0 : (this->dim.width + WD_FRAMERECT_LEFT)), right - WD_FRAMERECT_RIGHT - (rtl ? (this->dim.width + WD_FRAMERECT_RIGHT) : 0), CenterBounds(top, bottom, FONT_HEIGHT_NORMAL), this->String(), sel ? TC_WHITE : TC_BLACK); + Rect ir = r.Shrink(WidgetDimensions::scaled.dropdowntext); + Rect tr = ir.Indent(this->dim.width + WidgetDimensions::scaled.hsep_normal, rtl); + DrawSprite(this->sprite, this->pal, ir.WithWidth(this->dim.width, rtl).left, CenterBounds(r.top, r.bottom, this->sprite_y)); + DrawString(tr.left, tr.right, CenterBounds(r.top, r.bottom, FONT_HEIGHT_NORMAL), this->String(), sel ? TC_WHITE : TC_BLACK); } void DropDownListIconItem::SetDimension(Dimension d) @@ -153,7 +157,7 @@ struct DropdownWindow : Window { uint items_width = size.width - (scroll ? NWidgetScrollbar::GetVerticalDimension().width : 0); NWidgetCore *nwi = this->GetWidget(WID_DM_ITEMS); - nwi->SetMinimalSizeAbsolute(items_width, size.height + 4); + nwi->SetMinimalSizeAbsolute(items_width, size.height + WidgetDimensions::scaled.fullbevel.Vertical() * 2); nwi->colour = wi_colour; nwi = this->GetWidget(WID_DM_SCROLL); @@ -213,9 +217,9 @@ struct DropdownWindow : Window { { if (GetWidgetFromPos(this, _cursor.pos.x - this->left, _cursor.pos.y - this->top) < 0) return false; - NWidgetBase *nwi = this->GetWidget(WID_DM_ITEMS); - int y = _cursor.pos.y - this->top - nwi->pos_y - 2; - int width = nwi->current_x - 4; + const Rect &r = this->GetWidget(WID_DM_ITEMS)->GetCurrentRect().Shrink(WidgetDimensions::scaled.fullbevel); + int y = _cursor.pos.y - this->top - r.top - WidgetDimensions::scaled.fullbevel.top; + int width = r.Width(); int pos = this->vscroll->GetPosition(); for (const auto &item : this->list) { @@ -242,22 +246,23 @@ struct DropdownWindow : Window { Colours colour = this->GetWidget(widget)->colour; - int y = r.top + 2; + Rect ir = r.Shrink(WidgetDimensions::scaled.fullbevel).Shrink(RectPadding::zero, WidgetDimensions::scaled.fullbevel); + int y = ir.top; int pos = this->vscroll->GetPosition(); for (const auto &item : this->list) { - int item_height = item->Height(r.right - r.left + 1); + int item_height = item->Height(ir.Width()); /* Skip items that are scrolled up */ if (--pos >= 0) continue; - if (y + item_height < r.bottom) { + if (y + item_height - 1 <= ir.bottom) { bool selected = (this->selected_index == item->result); - if (selected) GfxFillRect(r.left + 2, y, r.right - 1, y + item_height - 1, PC_BLACK); + if (selected) GfxFillRect(ir.left, y, ir.right, y + item_height - 1, PC_BLACK); - item->Draw(r.left, r.right, y, y + item_height, selected, colour); + item->Draw({ir.left, y, ir.right, y + item_height - 1}, selected, colour); if (item->masked) { - GfxFillRect(r.left + 1, y, r.right - 1, y + item_height - 1, _colour_gradient[colour][5], FILLRECT_CHECKER); + GfxFillRect(ir.left, y, ir.right, y + item_height - 1, _colour_gradient[colour][5], FILLRECT_CHECKER); } } y += item_height; @@ -361,7 +366,7 @@ void ShowDropDownListAt(Window *w, DropDownList &&list, int selected, int button int top = w->top + wi_rect.bottom + 1; /* The preferred width equals the calling widget */ - uint width = wi_rect.right - wi_rect.left + 1; + uint width = wi_rect.Width(); /* Longest item in the list, if auto_width is enabled */ uint max_item_width = 0; @@ -371,9 +376,11 @@ void ShowDropDownListAt(Window *w, DropDownList &&list, int selected, int button for (const auto &item : list) { height += item->Height(width); - if (auto_width) max_item_width = std::max(max_item_width, item->Width() + 5); + if (auto_width) max_item_width = std::max(max_item_width, item->Width()); } + if (auto_width) max_item_width += WidgetDimensions::scaled.fullbevel.Horizontal(); + /* Scrollbar needed? */ bool scroll = false; @@ -381,12 +388,12 @@ void ShowDropDownListAt(Window *w, DropDownList &&list, int selected, int button bool above = false; /* Available height below (or above, if the dropdown is placed above the widget). */ - uint available_height = std::max(GetMainViewBottom() - top - 4, 0); + uint available_height = std::max(GetMainViewBottom() - top - (int)WidgetDimensions::scaled.fullbevel.Vertical() * 2, 0); /* If the dropdown doesn't fully fit below the widget... */ if (height > available_height) { - uint available_height_above = std::max(w->top + wi_rect.top - GetMainViewTop() - 4, 0); + uint available_height_above = std::max(w->top + wi_rect.top - GetMainViewTop() - (int)WidgetDimensions::scaled.fullbevel.Vertical() * 2, 0); /* Put the dropdown above if there is more available space. */ if (available_height_above > available_height) { @@ -412,7 +419,7 @@ void ShowDropDownListAt(Window *w, DropDownList &&list, int selected, int button /* Set the top position if needed. */ if (above) { - top = w->top + wi_rect.top - height - 4; + top = w->top + wi_rect.top - height - WidgetDimensions::scaled.fullbevel.Vertical() * 2; } } @@ -457,9 +464,9 @@ void ShowDropDownList(Window *w, DropDownList &&list, int selected, int button, if (width != 0) { if (_current_text_dir == TD_RTL) { - wi_rect.left = wi_rect.right + 1 - width; + wi_rect.left = wi_rect.right + 1 - ScaleGUITrad(width); } else { - wi_rect.right = wi_rect.left + width - 1; + wi_rect.right = wi_rect.left + ScaleGUITrad(width) - 1; } } diff --git a/src/widgets/dropdown_type.h b/src/widgets/dropdown_type.h index 5dfa9ed58b..2e95b407d7 100644 --- a/src/widgets/dropdown_type.h +++ b/src/widgets/dropdown_type.h @@ -30,7 +30,7 @@ public: virtual bool Selectable() const { return false; } virtual uint Height(uint width) const { return FONT_HEIGHT_NORMAL; } virtual uint Width() const { return 0; } - virtual void Draw(int left, int right, int top, int bottom, bool sel, Colours bg_colour) const; + virtual void Draw(const Rect &r, bool sel, Colours bg_colour) const; }; /** @@ -44,7 +44,7 @@ public: bool Selectable() const override { return true; } uint Width() const override; - void Draw(int left, int right, int top, int bottom, bool sel, Colours bg_colour) const override; + void Draw(const Rect &r, bool sel, Colours bg_colour) const override; virtual StringID String() const { return this->string; } static bool NatSortFunc(std::unique_ptr const &first, std::unique_ptr const &second); @@ -89,7 +89,7 @@ public: uint Height(uint width) const override; uint Width() const override; - void Draw(int left, int right, int top, int bottom, bool sel, Colours bg_colour) const override; + void Draw(const Rect &r, bool sel, Colours bg_colour) const override; void SetDimension(Dimension d); }; diff --git a/src/widgets/game_widget.h b/src/widgets/game_widget.h new file mode 100644 index 0000000000..0d2d0950b3 --- /dev/null +++ b/src/widgets/game_widget.h @@ -0,0 +1,28 @@ +/* + * 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 ai_widget.h Types related to the ai widgets. */ + +#ifndef WIDGETS_GS_WIDGET_H +#define WIDGETS_GS_WIDGET_H + +#include "../textfile_type.h" + +/** Widgets of the #GSConfigWindow class. */ +enum GSConfigWidgets { + WID_GSC_BACKGROUND, ///< Window background. + WID_GSC_GSLIST, ///< List with current selected Game Script. + WID_GSC_SETTINGS, ///< Panel to draw the Game Script settings on + WID_GSC_SCROLLBAR, ///< Scrollbar to scroll through the selected AIs. + WID_GSC_CHANGE, ///< Select another Game Script button. + WID_GSC_TEXTFILE, ///< Open GS readme, changelog (+1) or license (+2). + WID_GSC_CONTENT_DOWNLOAD = WID_GSC_TEXTFILE + TFT_END, ///< Download content button. + WID_GSC_ACCEPT, ///< Accept ("Close") button + WID_GSC_RESET, ///< Reset button. +}; + +#endif /* WIDGETS_GS_WIDGET_H */ diff --git a/src/widgets/genworld_widget.h b/src/widgets/genworld_widget.h index 6644dc1aa7..34d2f149d8 100644 --- a/src/widgets/genworld_widget.h +++ b/src/widgets/genworld_widget.h @@ -60,6 +60,10 @@ enum GenerateLandscapeWidgets { WID_GL_WATER_SE, ///< SE 'Water'/'Freeform'. WID_GL_WATER_SW, ///< SW 'Water'/'Freeform'. + WID_GL_AI_BUTTON, ///< 'AI Settings' button. + WID_GL_GS_BUTTON, ///< 'Game Script Settings' button. + WID_GL_NEWGRF_BUTTON, ///< 'NewGRF Settings' button. + WID_GL_CLIMATE_SEL_LABEL, ///< NWID_SELECTION for snow or desert coverage label WID_GL_CLIMATE_SEL_SELECTOR, ///< NWID_SELECTION for snow or desert coverage selector }; diff --git a/src/widgets/graph_widget.h b/src/widgets/graph_widget.h index 7c6478f640..2548c990cd 100644 --- a/src/widgets/graph_widget.h +++ b/src/widgets/graph_widget.h @@ -51,11 +51,6 @@ enum CargoPaymentRatesWidgets { WID_CPR_MATRIX_SCROLLBAR,///< Cargo list scrollbar. }; -/** Widget of the #CompanyLeagueWindow class. */ -enum CompanyLeagueWidgets { - WID_CL_BACKGROUND, ///< Background of the window. -}; - /** Widget of the #PerformanceRatingDetailWindow class. */ enum PerformanceRatingDetailsWidgets { WID_PRD_SCORE_FIRST, ///< First entry in the score list. diff --git a/src/widgets/group_widget.h b/src/widgets/group_widget.h index 03ac61a48e..e097b5314e 100644 --- a/src/widgets/group_widget.h +++ b/src/widgets/group_widget.h @@ -17,6 +17,7 @@ enum GroupListWidgets { WID_GL_GROUP_BY_DROPDOWN, ///< Group by dropdown list. WID_GL_SORT_BY_ORDER, ///< Sort order. WID_GL_SORT_BY_DROPDOWN, ///< Sort by dropdown list. + WID_GL_FILTER_BY_CARGO, ///< Filter vehicles by cargo type. WID_GL_LIST_VEHICLE, ///< List of the vehicles. WID_GL_LIST_VEHICLE_SCROLLBAR, ///< Scrollbar for the list. WID_GL_AVAILABLE_VEHICLES, ///< Available vehicles. diff --git a/src/widgets/intro_widget.h b/src/widgets/intro_widget.h index d2eeacf64a..dc152a488b 100644 --- a/src/widgets/intro_widget.h +++ b/src/widgets/intro_widget.h @@ -32,6 +32,7 @@ enum SelectGameIntroWidgets { WID_SGI_GRF_SETTINGS, ///< NewGRF button. WID_SGI_CONTENT_DOWNLOAD, ///< Content Download button. WID_SGI_AI_SETTINGS, ///< AI button. + WID_SGI_GS_SETTINGS, ///< Game Script button. WID_SGI_EXIT, ///< Exit button. }; diff --git a/src/widgets/league_widget.h b/src/widgets/league_widget.h new file mode 100644 index 0000000000..381d379a7e --- /dev/null +++ b/src/widgets/league_widget.h @@ -0,0 +1,24 @@ +/* + * 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 league_widget.h Types related to the graph widgets. */ + +#ifndef WIDGETS_LEAGUE_WIDGET_H +#define WIDGETS_LEAGUE_WIDGET_H + +/** Widget of the #PerformanceLeagueWindow class. */ +enum PerformanceLeagueWidgets { + WID_PLT_BACKGROUND, ///< Background of the window. +}; + +/** Widget of the #ScriptLeagueWindow class. */ +enum ScriptLeagueWidgets { + WID_SLT_CAPTION, ///< Caption of the window. + WID_SLT_BACKGROUND, ///< Background of the window. +}; + +#endif /* WIDGETS_LEAGUE_WIDGET_H */ diff --git a/src/widgets/network_content_widget.h b/src/widgets/network_content_widget.h index fd77f90aaf..49c8153d4a 100644 --- a/src/widgets/network_content_widget.h +++ b/src/widgets/network_content_widget.h @@ -14,8 +14,9 @@ /** Widgets of the #NetworkContentDownloadStatusWindow class. */ enum NetworkContentDownloadStatusWidgets { - WID_NCDS_BACKGROUND, ///< Background of the window. - WID_NCDS_CANCELOK, ///< (Optional) Cancel/OK button. + WID_NCDS_PROGRESS_BAR, ///< Simple progress bar. + WID_NCDS_PROGRESS_TEXT, ///< Text explaining what is happening. + WID_NCDS_CANCELOK, ///< (Optional) Cancel/OK button. }; /** Widgets of the #NetworkContentListWindow class. */ diff --git a/src/widgets/network_widget.h b/src/widgets/network_widget.h index f50bf04e93..058cb090b0 100644 --- a/src/widgets/network_widget.h +++ b/src/widgets/network_widget.h @@ -94,8 +94,9 @@ enum ClientListWidgets { /** Widgets of the #NetworkJoinStatusWindow class. */ enum NetworkJoinStatusWidgets { - WID_NJS_BACKGROUND, ///< Background of the window. - WID_NJS_CANCELOK, ///< Cancel / OK button. + WID_NJS_PROGRESS_BAR, ///< Simple progress bar. + WID_NJS_PROGRESS_TEXT, ///< Text explaining what is happening. + WID_NJS_CANCELOK, ///< Cancel / OK button. }; /** Widgets of the #NetworkCompanyPasswordWindow class. */ diff --git a/src/widgets/newgrf_debug_widget.h b/src/widgets/newgrf_debug_widget.h index 6ae41de348..bed87dc2c1 100644 --- a/src/widgets/newgrf_debug_widget.h +++ b/src/widgets/newgrf_debug_widget.h @@ -38,6 +38,8 @@ enum SpriteAlignerWidgets { WID_SA_LIST, ///< Queried sprite list. WID_SA_SCROLLBAR, ///< Scrollbar for sprite list. WID_SA_RESET_REL, ///< Reset relative sprite offset + WID_SA_CENTRE, ///< Toggle centre sprite. + WID_SA_CROSSHAIR, ///< Toggle crosshair. }; #endif /* WIDGETS_NEWGRF_DEBUG_WIDGET_H */ diff --git a/src/widgets/settings_widget.h b/src/widgets/settings_widget.h index 2a83ec657a..8f655d945a 100644 --- a/src/widgets/settings_widget.h +++ b/src/widgets/settings_widget.h @@ -19,7 +19,9 @@ enum GameOptionsWidgets { WID_GO_LANG_DROPDOWN, ///< Language dropdown. WID_GO_RESOLUTION_DROPDOWN, ///< Dropdown for the resolution. WID_GO_FULLSCREEN_BUTTON, ///< Toggle fullscreen. - WID_GO_GUI_ZOOM_DROPDOWN, ///< Dropdown for the GUI zoom level. + WID_GO_GUI_SCALE, ///< GUI Scale slider. + WID_GO_GUI_SCALE_AUTO, ///< Autodetect GUI scale button. + WID_GO_GUI_SCALE_BEVEL_BUTTON, ///< Toggle for chunky bevels. WID_GO_BASE_GRF_DROPDOWN, ///< Use to select a base GRF. WID_GO_BASE_GRF_STATUS, ///< Info about missing files etc. WID_GO_BASE_GRF_TEXTFILE, ///< Open base GRF readme, changelog (+1) or license (+2). @@ -30,10 +32,10 @@ enum GameOptionsWidgets { WID_GO_BASE_SFX_DESCRIPTION = WID_GO_BASE_SFX_TEXTFILE + TFT_END, ///< Description of selected base SFX. WID_GO_BASE_MUSIC_DROPDOWN, ///< Use to select a base music set. WID_GO_BASE_MUSIC_VOLUME, ///< Change music volume. + WID_GO_BASE_MUSIC_JUKEBOX, ///< Open the jukebox. WID_GO_BASE_MUSIC_STATUS, ///< Info about corrupted files etc. WID_GO_BASE_MUSIC_TEXTFILE, ///< Open base music readme, changelog (+1) or license (+2). WID_GO_BASE_MUSIC_DESCRIPTION = WID_GO_BASE_MUSIC_TEXTFILE + TFT_END, ///< Description of selected base music set. - WID_GO_FONT_ZOOM_DROPDOWN, ///< Dropdown for the font zoom level. WID_GO_VIDEO_ACCEL_BUTTON, ///< Toggle for video acceleration. WID_GO_VIDEO_VSYNC_BUTTON, ///< Toggle for video vsync. WID_GO_REFRESH_RATE_DROPDOWN, ///< Dropdown for all available refresh rates. diff --git a/src/widgets/slider.cpp b/src/widgets/slider.cpp index 67c4c372d2..59d0483668 100644 --- a/src/widgets/slider.cpp +++ b/src/widgets/slider.cpp @@ -19,47 +19,74 @@ static const int SLIDER_WIDTH = 3; /** - * Draw a volume slider widget with know at given value - * @param r Rectangle to draw the widget in + * Draw a slider widget with knob at given value + * @param r Rectangle to draw the widget in + * @param min_value Minimum value of slider + * @param max_value Maximum value of slider * @param value Value to put the slider at + * @param labels List of positions and labels to draw along the slider. */ -void DrawVolumeSliderWidget(Rect r, byte value) +void DrawSliderWidget(Rect r, int min_value, int max_value, int value, const std::map &labels) { - /* Draw a wedge indicating low to high volume level. */ + /* Allow space for labels. We assume they are in the small font. */ + if (labels.size() > 0) r.bottom -= FONT_HEIGHT_SMALL + WidgetDimensions::scaled.hsep_normal; + + max_value -= min_value; + + /* Draw a wedge indicating low to high value. */ const int ha = (r.bottom - r.top) / 5; - int wx1 = r.left, wx2 = r.right; + const int sw = ScaleGUITrad(SLIDER_WIDTH); + const int t = WidgetDimensions::scaled.bevel.top; /* Thickness of lines */ + int wx1 = r.left + sw / 2; + int wx2 = r.right - sw / 2; 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); + GfxDrawLine(wedge[0].x, wedge[0].y, wedge[2].x, wedge[2].y, light, t); + GfxDrawLine(wedge[1].x, wedge[1].y, wedge[2].x, wedge[2].y, _current_text_dir == TD_RTL ? shadow : light, t); + GfxDrawLine(wedge[0].x, wedge[0].y, wedge[1].x, wedge[1].y, shadow, t); - /* Draw a slider handle indicating current volume level. */ - const int sw = ScaleGUITrad(SLIDER_WIDTH); - if (_current_text_dir == TD_RTL) value = 127 - value; - const int x = r.left + (value * (r.right - r.left - sw) / 127); + int x; + for (auto label : labels) { + x = label.first - min_value; + if (_current_text_dir == TD_RTL) x = max_value - x; + x = r.left + (x * (r.right - r.left - sw) / max_value) + sw / 2; + GfxDrawLine(x, r.bottom - ha + 1, x, r.bottom + (label.second == STR_NULL ? 0 : WidgetDimensions::scaled.hsep_normal), shadow, t); + if (label.second != STR_NULL) { + Dimension d = GetStringBoundingBox(label.second, FS_SMALL); + x = Clamp(x - d.width / 2, r.left, r.right - d.width); + DrawString(x, x + d.width, r.bottom + 1 + WidgetDimensions::scaled.hsep_normal, label.second, TC_BLACK, SA_CENTER, false, FS_SMALL); + } + } + + /* Draw a slider handle indicating current value. */ + value -= min_value; + if (_current_text_dir == TD_RTL) value = max_value - value; + x = r.left + (value * (r.right - r.left - sw) / max_value); DrawFrameRect(x, r.top, x + sw, r.bottom, COLOUR_GREY, FR_NONE); } /** - * Handle click on a volume slider widget to change the value + * Handle click on a slider widget to change the value * @param r Rectangle of the widget * @param pt Clicked point - * @param value[in,out] Volume value to modify - * @return True if the volume setting was modified + * @param value[in,out] Value to modify + * @return True if the value setting was modified */ -bool ClickVolumeSliderWidget(Rect r, Point pt, byte &value) +bool ClickSliderWidget(Rect r, Point pt, int min_value, int max_value, int &value) { - const int sw = ScaleGUITrad(SLIDER_WIDTH); - byte new_vol = Clamp((pt.x - r.left - sw / 2) * 127 / (r.right - r.left - sw), 0, 127); - if (_current_text_dir == TD_RTL) new_vol = 127 - new_vol; + max_value -= min_value; - if (new_vol != value) { - value = new_vol; + const int sw = ScaleGUITrad(SLIDER_WIDTH); + int new_value = Clamp((pt.x - r.left - sw / 2) * max_value / (r.right - r.left - sw), 0, max_value); + if (_current_text_dir == TD_RTL) new_value = max_value - new_value; + new_value += min_value; + + if (new_value != value) { + value = new_value; return true; } diff --git a/src/widgets/slider_func.h b/src/widgets/slider_func.h index 1aa1fa10c6..7de929512c 100644 --- a/src/widgets/slider_func.h +++ b/src/widgets/slider_func.h @@ -13,9 +13,17 @@ #include "../window_type.h" #include "../gfx_func.h" +#include -void DrawVolumeSliderWidget(Rect r, byte value); -bool ClickVolumeSliderWidget(Rect r, Point pt, byte &value); +void DrawSliderWidget(Rect r, int min_value, int max_value, int value, const std::map &labels); +bool ClickSliderWidget(Rect r, Point pt, int min_value, int max_value, int &value); +inline bool ClickSliderWidget(Rect r, Point pt, int min_value, int max_value, byte &value) +{ + int tmp_value = value; + if (!ClickSliderWidget(r, pt, min_value, max_value, tmp_value)) return false; + value = tmp_value; + return true; +} #endif /* WIDGETS_SLIDER_TYPE_H */ diff --git a/src/widgets/town_widget.h b/src/widgets/town_widget.h index 1a3291a3db..f16a8a585e 100644 --- a/src/widgets/town_widget.h +++ b/src/widgets/town_widget.h @@ -49,6 +49,7 @@ enum TownFoundingWidgets { WID_TF_NEW_TOWN, ///< Create a new town. WID_TF_RANDOM_TOWN, ///< Randomly place a town. WID_TF_MANY_RANDOM_TOWNS, ///< Randomly place many towns. + WID_TF_EXPAND_ALL_TOWNS, ///< Make all towns grow slightly. WID_TF_TOWN_NAME_EDITBOX, ///< Editor for the town name. WID_TF_TOWN_NAME_RANDOM, ///< Generate a random town name. WID_TF_SIZE_SMALL, ///< Selection for a small town. diff --git a/src/widgets/vehicle_widget.h b/src/widgets/vehicle_widget.h index 954e72f70e..8e960bcb79 100644 --- a/src/widgets/vehicle_widget.h +++ b/src/widgets/vehicle_widget.h @@ -27,6 +27,7 @@ enum VehicleViewWidgets { WID_VV_SELECT_REFIT_TURN, ///< Selection widget between 'refit' and 'turn around' buttons. WID_VV_TURN_AROUND, ///< Turn this vehicle around. WID_VV_FORCE_PROCEED, ///< Force this vehicle to pass a signal at danger. + WID_VV_HONK_HORN, ///< Honk the vehicles horn (not drawn on UI, only used for hotkey). }; /** Widgets of the #RefitWindow class. */ @@ -69,6 +70,8 @@ enum VehicleListWidgets { WID_VL_GROUP_BY_PULLDOWN, ///< Group by dropdown list. WID_VL_SORT_ORDER, ///< Sort order. WID_VL_SORT_BY_PULLDOWN, ///< Sort by dropdown list. + WID_VL_FILTER_BY_CARGO, ///< Cargo filter dropdown list. + WID_VL_FILTER_BY_CARGO_SEL, ///< Cargo filter dropdown list panel selector. WID_VL_LIST, ///< List of the vehicles. WID_VL_SCROLLBAR, ///< Scrollbar for the list. WID_VL_HIDE_BUTTONS, ///< Selection to hide the buttons. diff --git a/src/window.cpp b/src/window.cpp index 6d94dacfb3..81952d27db 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -354,6 +354,17 @@ QueryString *Window::GetQueryString(uint widnum) return query != this->querystrings.End() ? query->second : nullptr; } +/** + * Update size of all QueryStrings of this window. + */ +void Window::UpdateQueryStringSize() +{ + for (auto &qs : this->querystrings) + { + qs.second->text.UpdateSize(); + } +} + /** * Get the current input text if an edit box has the focus. * @return The currently focused input text or nullptr if no input focused. @@ -1639,7 +1650,7 @@ static Point GetAutoPlacePosition(int width, int height) */ int left = rtl ? _screen.width - width : 0, top = toolbar_y; int offset_x = rtl ? -(int)NWidgetLeaf::closebox_dimension.width : (int)NWidgetLeaf::closebox_dimension.width; - int offset_y = std::max(NWidgetLeaf::closebox_dimension.height, FONT_HEIGHT_NORMAL + WD_CAPTIONTEXT_TOP + WD_CAPTIONTEXT_BOTTOM); + int offset_y = std::max(NWidgetLeaf::closebox_dimension.height, FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.captiontext.Vertical()); restart: for (const Window *w : Window::Iterate()) { @@ -1705,7 +1716,7 @@ static Point LocalGetWindowPlacement(const WindowDesc *desc, int16 sm_width, int * - Y position: closebox of parent + closebox of child + statusbar * - X position: closebox on left/right, resizebox on right/left (depending on ltr/rtl) */ - int indent_y = std::max(NWidgetLeaf::closebox_dimension.height, FONT_HEIGHT_NORMAL + WD_CAPTIONTEXT_TOP + WD_CAPTIONTEXT_BOTTOM); + int indent_y = std::max(NWidgetLeaf::closebox_dimension.height, FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.captiontext.Vertical()); if (w->top + 3 * indent_y < _screen.height) { pt.y = w->top + indent_y; int indent_close = NWidgetLeaf::closebox_dimension.width; @@ -1996,28 +2007,30 @@ static void PreventHiding(int *nx, int *ny, const Rect &rect, const Window *v, i { if (v == nullptr) return; + const int min_visible = ScaleGUITrad(MIN_VISIBLE_TITLE_BAR); + int v_bottom = v->top + v->height; int v_right = v->left + v->width; - int safe_y = (dir == PHD_UP) ? (v->top - MIN_VISIBLE_TITLE_BAR - rect.top) : (v_bottom + MIN_VISIBLE_TITLE_BAR - rect.bottom); // Compute safe vertical position. + int safe_y = (dir == PHD_UP) ? (v->top - min_visible - rect.top) : (v_bottom + min_visible - rect.bottom); // Compute safe vertical position. - if (*ny + rect.top <= v->top - MIN_VISIBLE_TITLE_BAR) return; // Above v is enough space - if (*ny + rect.bottom >= v_bottom + MIN_VISIBLE_TITLE_BAR) return; // Below v is enough space + if (*ny + rect.top <= v->top - min_visible) return; // Above v is enough space + if (*ny + rect.bottom >= v_bottom + min_visible) return; // Below v is enough space /* Vertically, the rectangle is hidden behind v. */ - if (*nx + rect.left + MIN_VISIBLE_TITLE_BAR < v->left) { // At left of v. - if (v->left < MIN_VISIBLE_TITLE_BAR) *ny = safe_y; // But enough room, force it to a safe position. + if (*nx + rect.left + min_visible < v->left) { // At left of v. + if (v->left < min_visible) *ny = safe_y; // But enough room, force it to a safe position. return; } - if (*nx + rect.right - MIN_VISIBLE_TITLE_BAR > v_right) { // At right of v. - if (v_right > _screen.width - MIN_VISIBLE_TITLE_BAR) *ny = safe_y; // Not enough room, force it to a safe position. + if (*nx + rect.right - min_visible > v_right) { // At right of v. + if (v_right > _screen.width - min_visible) *ny = safe_y; // Not enough room, force it to a safe position. return; } /* Horizontally also hidden, force movement to a safe area. */ - if (px + rect.left < v->left && v->left >= MIN_VISIBLE_TITLE_BAR) { // Coming from the left, and enough room there. - *nx = v->left - MIN_VISIBLE_TITLE_BAR - rect.left; - } else if (px + rect.right > v_right && v_right <= _screen.width - MIN_VISIBLE_TITLE_BAR) { // Coming from the right, and enough room there. - *nx = v_right + MIN_VISIBLE_TITLE_BAR - rect.right; + if (px + rect.left < v->left && v->left >= min_visible) { // Coming from the left, and enough room there. + *nx = v->left - min_visible - rect.left; + } else if (px + rect.right > v_right && v_right <= _screen.width - min_visible) { // Coming from the right, and enough room there. + *nx = v_right + min_visible - rect.right; } else { *ny = safe_y; } @@ -2038,9 +2051,11 @@ static void EnsureVisibleCaption(Window *w, int nx, int ny) if (caption != nullptr) { caption_rect = caption->GetCurrentRect(); + const int min_visible = ScaleGUITrad(MIN_VISIBLE_TITLE_BAR); + /* Make sure the window doesn't leave the screen */ - nx = Clamp(nx, MIN_VISIBLE_TITLE_BAR - caption_rect.right, _screen.width - MIN_VISIBLE_TITLE_BAR - caption_rect.left); - ny = Clamp(ny, 0, _screen.height - MIN_VISIBLE_TITLE_BAR); + nx = Clamp(nx, min_visible - caption_rect.right, _screen.width - min_visible - caption_rect.left); + ny = Clamp(ny, 0, _screen.height - min_visible); /* Make sure the title bar isn't hidden behind the main tool bar or the status bar. */ PreventHiding(&nx, &ny, caption_rect, FindWindowById(WC_MAIN_TOOLBAR, 0), w->left, PHD_DOWN); @@ -3067,6 +3082,9 @@ void UpdateWindows() PerformanceMeasurer framerate(PFE_DRAWING); PerformanceAccumulator::Reset(PFE_DRAWWORLD); + extern void ProcessPendingPerformanceMeasurements(); + ProcessPendingPerformanceMeasurements(); + CallWindowRealtimeTickEvent(delta_ms); static GUITimer network_message_timer = GUITimer(1); @@ -3346,13 +3364,17 @@ void HideVitalWindows() void ReInitWindow(Window *w, bool zoom_changed) { if (w == nullptr) return; - if (zoom_changed) w->nested_root->AdjustPaddingForZoom(); + if (zoom_changed) { + w->nested_root->AdjustPaddingForZoom(); + w->UpdateQueryStringSize(); + } w->ReInit(); } /** Re-initialize all windows. */ void ReInitAllWindows(bool zoom_changed) { + SetupWidgetDimensions(); NWidgetLeaf::InvalidateDimensionCache(); // Reset cached sizes of several widgets. NWidgetScrollbar::InvalidateDimensionCache(); diff --git a/src/window_gui.h b/src/window_gui.h index 58d14a54e7..00dfd9960a 100644 --- a/src/window_gui.h +++ b/src/window_gui.h @@ -11,7 +11,10 @@ #define WINDOW_GUI_H #include +#include +#include +#include "vehiclelist.h" #include "vehicle_type.h" #include "viewport_type.h" #include "company_type.h" @@ -34,114 +37,45 @@ enum FrameFlags { DECLARE_ENUM_AS_BIT_SET(FrameFlags) -/** Distances used in drawing widgets. */ -enum WidgetDrawDistances { - /* WWT_IMGBTN(_2) */ - WD_IMGBTN_LEFT = 1, ///< Left offset of the image in the button. - WD_IMGBTN_RIGHT = 2, ///< Right offset of the image in the button. - WD_IMGBTN_TOP = 1, ///< Top offset of image in the button. - WD_IMGBTN_BOTTOM = 2, ///< Bottom offset of image in the button. +struct WidgetDimensions { + RectPadding imgbtn; + RectPadding inset; + RectPadding vscrollbar; + RectPadding hscrollbar; + RectPadding bevel; ///< Widths of bevel border. + RectPadding fullbevel; ///< Always-scaled bevel border. + RectPadding framerect; ///< Offsets within frame area. + RectPadding frametext; ///< Offsets within a text frame area. + RectPadding matrix; ///< Offsets within a matrix cell. + RectPadding shadebox; + RectPadding stickybox; + RectPadding debugbox; + RectPadding defsizebox; + RectPadding resizebox; + RectPadding closebox; + RectPadding captiontext; ///< Offsets of text within a caption. + RectPadding dropdowntext; ///< Offsets of text within a dropdown widget. + RectPadding modalpopup; ///< Padding for a modal popup. - /* WWT_INSET */ - WD_INSET_LEFT = 2, ///< Left offset of string. - WD_INSET_RIGHT = 2, ///< Right offset of string. - WD_INSET_TOP = 1, ///< Top offset of string. + int pressed; ///< Offset for contents of depressed widget. + int vsep_normal; ///< Normal vertical spacing. + int vsep_wide; ///< Wide vertical spacing. + int hsep_normal; ///< Normal horizontal spacing. + int hsep_wide; ///< Wide horizontal spacing. + int hsep_indent; ///< Width of identation for tree layouts. - WD_SCROLLBAR_LEFT = 2, ///< Left offset of scrollbar. - WD_SCROLLBAR_RIGHT = 2, ///< Right offset of scrollbar. - WD_SCROLLBAR_TOP = 2, ///< Top offset of scrollbar. - WD_SCROLLBAR_BOTTOM = 2, ///< Bottom offset of scrollbar. - - /* Size of the pure frame bevel without any padding. */ - WD_BEVEL_LEFT = 1, ///< Width of left bevel border. - WD_BEVEL_RIGHT = 1, ///< Width of right bevel border. - WD_BEVEL_TOP = 1, ///< Height of top bevel border. - WD_BEVEL_BOTTOM = 1, ///< Height of bottom bevel border. - - /* FrameRect widgets, all text buttons, panel, editbox */ - WD_FRAMERECT_LEFT = 2, ///< Offset at left to draw the frame rectangular area - WD_FRAMERECT_RIGHT = 2, ///< Offset at right to draw the frame rectangular area - WD_FRAMERECT_TOP = 1, ///< Offset at top to draw the frame rectangular area - WD_FRAMERECT_BOTTOM = 1, ///< Offset at bottom to draw the frame rectangular area - - /* Extra space at top/bottom of text panels */ - WD_TEXTPANEL_TOP = 6, ///< Offset at top to draw above the text - WD_TEXTPANEL_BOTTOM = 6, ///< Offset at bottom to draw below the text - - /* WWT_FRAME */ - WD_FRAMETEXT_LEFT = 6, ///< Left offset of the text of the frame. - WD_FRAMETEXT_RIGHT = 6, ///< Right offset of the text of the frame. - WD_FRAMETEXT_TOP = 6, ///< Top offset of the text of the frame - WD_FRAMETEXT_BOTTOM = 6, ///< Bottom offset of the text of the frame - - /* WWT_MATRIX */ - WD_MATRIX_LEFT = 2, ///< Offset at left of a matrix cell. - WD_MATRIX_RIGHT = 2, ///< Offset at right of a matrix cell. - WD_MATRIX_TOP = 3, ///< Offset at top of a matrix cell. - WD_MATRIX_BOTTOM = 1, ///< Offset at bottom of a matrix cell. - - /* WWT_SHADEBOX */ - WD_SHADEBOX_WIDTH = 12, ///< Width of a standard shade box widget. - WD_SHADEBOX_LEFT = 2, ///< Left offset of shade sprite. - WD_SHADEBOX_RIGHT = 2, ///< Right offset of shade sprite. - WD_SHADEBOX_TOP = 3, ///< Top offset of shade sprite. - WD_SHADEBOX_BOTTOM = 3, ///< Bottom offset of shade sprite. - - /* WWT_STICKYBOX */ - WD_STICKYBOX_WIDTH = 12, ///< Width of a standard sticky box widget. - WD_STICKYBOX_LEFT = 2, ///< Left offset of sticky sprite. - WD_STICKYBOX_RIGHT = 2, ///< Right offset of sticky sprite. - WD_STICKYBOX_TOP = 3, ///< Top offset of sticky sprite. - WD_STICKYBOX_BOTTOM = 3, ///< Bottom offset of sticky sprite. - - /* WWT_DEBUGBOX */ - WD_DEBUGBOX_WIDTH = 12, ///< Width of a standard debug box widget. - WD_DEBUGBOX_LEFT = 2, ///< Left offset of debug sprite. - WD_DEBUGBOX_RIGHT = 2, ///< Right offset of debug sprite. - WD_DEBUGBOX_TOP = 3, ///< Top offset of debug sprite. - WD_DEBUGBOX_BOTTOM = 3, ///< Bottom offset of debug sprite. - - /* WWT_DEFSIZEBOX */ - WD_DEFSIZEBOX_WIDTH = 12, ///< Width of a standard defsize box widget. - WD_DEFSIZEBOX_LEFT = 2, ///< Left offset of defsize sprite. - WD_DEFSIZEBOX_RIGHT = 2, ///< Right offset of defsize sprite. - WD_DEFSIZEBOX_TOP = 3, ///< Top offset of defsize sprite. - WD_DEFSIZEBOX_BOTTOM = 3, ///< Bottom offset of defsize sprite. - - /* WWT_RESIZEBOX */ - WD_RESIZEBOX_WIDTH = 12, ///< Width of a resize box widget. - WD_RESIZEBOX_LEFT = 3, ///< Left offset of resize sprite. - WD_RESIZEBOX_RIGHT = 2, ///< Right offset of resize sprite. - WD_RESIZEBOX_TOP = 3, ///< Top offset of resize sprite. - WD_RESIZEBOX_BOTTOM = 2, ///< Bottom offset of resize sprite. - - /* WWT_CLOSEBOX */ - WD_CLOSEBOX_WIDTH = 11, ///< Width of a close box widget. - WD_CLOSEBOX_LEFT = 2, ///< Left offset of closebox string. - WD_CLOSEBOX_RIGHT = 1, ///< Right offset of closebox string. - WD_CLOSEBOX_TOP = 2, ///< Top offset of closebox string. - WD_CLOSEBOX_BOTTOM = 2, ///< Bottom offset of closebox string. - - /* WWT_CAPTION */ - WD_CAPTION_HEIGHT = 14, ///< Height of a title bar. - WD_CAPTIONTEXT_LEFT = 2, ///< Offset of the caption text at the left. - WD_CAPTIONTEXT_RIGHT = 2, ///< Offset of the caption text at the right. - WD_CAPTIONTEXT_TOP = 2, ///< Offset of the caption text at the top. - WD_CAPTIONTEXT_BOTTOM = 2, ///< Offset of the caption text at the bottom. - - /* Dropdown widget. */ - WD_DROPDOWN_HEIGHT = 12, ///< Height of a drop down widget. - WD_DROPDOWNTEXT_LEFT = 2, ///< Left offset of the dropdown widget string. - WD_DROPDOWNTEXT_RIGHT = 2, ///< Right offset of the dropdown widget string. - WD_DROPDOWNTEXT_TOP = 1, ///< Top offset of the dropdown widget string. - WD_DROPDOWNTEXT_BOTTOM = 1, ///< Bottom offset of the dropdown widget string. - - WD_PAR_VSEP_NORMAL = 2, ///< Normal amount of vertical space between two paragraphs of text. - WD_PAR_VSEP_WIDE = 8, ///< Large amount of vertical space between two paragraphs of text. + static const WidgetDimensions unscaled; ///< Unscaled widget dimensions. + static WidgetDimensions scaled; ///< Widget dimensions scaled for current zoom level. }; /* widget.cpp */ void DrawFrameRect(int left, int top, int right, int bottom, Colours colour, FrameFlags flags); + +static inline void DrawFrameRect(const Rect &r, Colours colour, FrameFlags flags) +{ + DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, flags); +} + void DrawCaption(const Rect &r, Colours colour, Owner owner, TextColour text_colour, StringID str, StringAlignment align); /* window.cpp */ @@ -342,6 +276,7 @@ public: const QueryString *GetQueryString(uint widnum) const; QueryString *GetQueryString(uint widnum); + void UpdateQueryStringSize(); virtual const char *GetFocusedText() const; virtual const char *GetCaret() const; @@ -750,11 +685,20 @@ public: /** * The user clicked on a vehicle while HT_VEHICLE has been set. - * @param v clicked vehicle. It is guaranteed to be v->IsPrimaryVehicle() == true - * @return True if the click is handled, false if it is ignored. + * @param v clicked vehicle + * @return true if the click is handled, false if it is ignored + * @pre v->IsPrimaryVehicle() == true */ virtual bool OnVehicleSelect(const struct Vehicle *v) { return false; } + /** + * The user clicked on a vehicle while HT_VEHICLE has been set. + * @param v clicked vehicle + * @return True if the click is handled, false if it is ignored + * @pre v->IsPrimaryVehicle() == true + */ + virtual bool OnVehicleSelect(VehicleList::const_iterator begin, VehicleList::const_iterator end) { return false; } + /** * The user cancelled a tile highlight mode that has been set. */ @@ -875,6 +819,19 @@ public: using IterateFromFront = AllWindows; //!< Iterate all windows in Z order from front to back. }; +/** + * Generic helper function that checks if all elements of the range are equal with respect to the given predicate. + * @param begin The start of the range. + * @param end The end of the range. + * @param pred The predicate to use. + * @return True if all elements are equal, false otherwise. + */ +template +inline bool AllEqual(It begin, It end, Pred pred) +{ + return std::adjacent_find(begin, end, std::not_fn(pred)) == end; +} + /** * Get the nested widget with number \a widnum from the nested widget tree. * @tparam NWID Type of the nested widget. diff --git a/src/window_type.h b/src/window_type.h index 6eb9573b60..8b1c0cd80a 100644 --- a/src/window_type.h +++ b/src/window_type.h @@ -13,6 +13,7 @@ /** %Window numbers. */ enum WindowNumberEnum { WN_GAME_OPTIONS_AI = 0, ///< AI settings. + WN_GAME_OPTIONS_GS, ///< GS settings. WN_GAME_OPTIONS_ABOUT, ///< About window. WN_GAME_OPTIONS_NEWGRF_STATE, ///< NewGRF settings. WN_GAME_OPTIONS_GAME_OPTIONS, ///< Game options. @@ -596,6 +597,7 @@ enum WindowClass { /** * Game options window; %Window numbers: * - #WN_GAME_OPTIONS_AI = #AIConfigWidgets + * - #WN_GAME_OPTIONS_GS = #GSConfigWidgets * - #WN_GAME_OPTIONS_ABOUT = #AboutWidgets * - #WN_GAME_OPTIONS_NEWGRF_STATE = #NewGRFStateWidgets * - #WN_GAME_OPTIONS_GAME_OPTIONS = #GameOptionsWidgets diff --git a/src/zoom_func.h b/src/zoom_func.h index f72c7abae4..abcc050d25 100644 --- a/src/zoom_func.h +++ b/src/zoom_func.h @@ -99,6 +99,16 @@ static inline ZoomLevel UnScaleZoomGUI(ZoomLevel value) return std::clamp(ZoomLevel(value - (ZOOM_LVL_GUI - ZOOM_LVL_OUT_4X)), ZOOM_LVL_MIN, ZOOM_LVL_MAX); } +/** + * Scale traditional pixel dimensions to GUI zoom level, for drawing sprites. + * @param value Pixel amount at #ZOOM_LVL_BASE (traditional "normal" interface size). + * @return Pixel amount at #ZOOM_LVL_GUI (current interface size). + */ +static inline int ScaleSpriteTrad(int value) +{ + return UnScaleGUI(value * ZOOM_LVL_BASE); +} + /** * Scale traditional pixel dimensions to GUI zoom level. * @param value Pixel amount at #ZOOM_LVL_BASE (traditional "normal" interface size). @@ -106,27 +116,7 @@ static inline ZoomLevel UnScaleZoomGUI(ZoomLevel value) */ static inline int ScaleGUITrad(int value) { - return UnScaleGUI(value * ZOOM_LVL_BASE); -} - -/** - * Short-hand to apply font zoom level. - * @param value Pixel amount at #ZOOM_LVL_BEGIN (full zoom in). - * @return Pixel amount at #ZOOM_LVL_FONT (current interface size). - */ -static inline int UnScaleFont(int value) -{ - return UnScaleByZoom(value, ZOOM_LVL_FONT); -} - -/** - * Scale traditional pixel dimensions to Font zoom level. - * @param value Pixel amount at #ZOOM_LVL_BASE (traditional "normal" interface size). - * @return Pixel amount at #ZOOM_LVL_FONT (current interface size). - */ -static inline int ScaleFontTrad(int value) -{ - return UnScaleFont(value * ZOOM_LVL_BASE); + return value * _gui_scale / 100; } #endif /* ZOOM_FUNC_H */ diff --git a/src/zoom_type.h b/src/zoom_type.h index ffa70f7611..7ccc142ef3 100644 --- a/src/zoom_type.h +++ b/src/zoom_type.h @@ -15,8 +15,6 @@ static uint const ZOOM_LVL_SHIFT = 2; static uint const ZOOM_LVL_BASE = 1 << ZOOM_LVL_SHIFT; -static const int8 ZOOM_LVL_CFG_AUTO = -1; - /** All zoom levels we know. */ enum ZoomLevel : byte { /* Our possible zoom-levels */ @@ -50,12 +48,13 @@ enum ZoomLevel : byte { }; DECLARE_POSTFIX_INCREMENT(ZoomLevel) -extern int8 _gui_zoom_cfg; -extern int8 _font_zoom_cfg; +extern int _gui_scale; +extern int _gui_scale_cfg; extern ZoomLevel _gui_zoom; -extern ZoomLevel _font_zoom; #define ZOOM_LVL_GUI (_gui_zoom) -#define ZOOM_LVL_FONT (_font_zoom) + +static const int MIN_INTERFACE_SCALE = 100; +static const int MAX_INTERFACE_SCALE = 500; #endif /* ZOOM_TYPE_H */