From 5881c752f56a2d3119f469c4c42d7e0309168012 Mon Sep 17 00:00:00 2001 From: dP Date: Mon, 19 Apr 2021 00:52:41 +0300 Subject: [PATCH] Update to 1.11.1 --- .changelog | 243 ++------------ .github/workflows/release.yml | 2 + .ottdrev | 2 +- .release_date | 2 +- .version | 2 +- CMakeLists.txt | 5 +- bin/CMakeLists.txt | 2 + bin/ai/CMakeLists.txt | 39 +++ bin/game/CMakeLists.txt | 36 ++ changelog.txt | 32 ++ cmake/CompileFlags.cmake | 30 +- cmake/InstallAndPackage.cmake | 4 +- docs/multiplayer.md | 7 + src/3rdparty/squirrel/squirrel/sqarray.h | 12 +- src/3rdparty/squirrel/squirrel/sqclass.h | 18 +- src/3rdparty/squirrel/squirrel/sqclosure.h | 6 +- src/3rdparty/squirrel/squirrel/sqobject.cpp | 131 +++----- src/3rdparty/squirrel/squirrel/sqobject.h | 46 ++- src/3rdparty/squirrel/squirrel/sqstate.cpp | 98 ++++-- src/3rdparty/squirrel/squirrel/sqstate.h | 9 +- src/3rdparty/squirrel/squirrel/sqtable.h | 10 +- src/3rdparty/squirrel/squirrel/squserdata.h | 2 +- src/3rdparty/squirrel/squirrel/sqvm.cpp | 14 +- src/3rdparty/squirrel/squirrel/sqvm.h | 2 +- src/ai/ai_gui.cpp | 10 +- src/console_cmds.cpp | 4 +- src/core/pool_type.hpp | 2 +- src/disaster_vehicle.cpp | 2 +- src/engine.cpp | 6 +- src/group_gui.cpp | 48 ++- src/landscape.cpp | 2 +- src/lang/afrikaans.txt | 1 + src/lang/arabic_egypt.txt | 1 + src/lang/basque.txt | 1 + src/lang/belarusian.txt | 1 + src/lang/brazilian_portuguese.txt | 3 + src/lang/bulgarian.txt | 1 + src/lang/catalan.txt | 5 +- src/lang/croatian.txt | 1 + src/lang/czech.txt | 1 + src/lang/danish.txt | 1 + src/lang/dutch.txt | 1 + src/lang/english.txt | 3 + src/lang/english_AU.txt | 1 + src/lang/english_US.txt | 3 + src/lang/esperanto.txt | 1 + src/lang/estonian.txt | 1 + src/lang/faroese.txt | 1 + src/lang/finnish.txt | 3 + src/lang/french.txt | 7 +- src/lang/gaelic.txt | 1 + src/lang/galician.txt | 1 + src/lang/german.txt | 3 + src/lang/greek.txt | 1 + src/lang/hebrew.txt | 1 + src/lang/hungarian.txt | 3 + src/lang/icelandic.txt | 1 + src/lang/indonesian.txt | 26 ++ src/lang/irish.txt | 1 + src/lang/italian.txt | 1 + src/lang/japanese.txt | 1 + src/lang/korean.txt | 71 ++-- src/lang/latin.txt | 1 + src/lang/latvian.txt | 1 + src/lang/lithuanian.txt | 1 + src/lang/luxembourgish.txt | 1 + src/lang/malay.txt | 1 + src/lang/norwegian_bokmal.txt | 3 + src/lang/norwegian_nynorsk.txt | 1 + src/lang/polish.txt | 9 +- src/lang/portuguese.txt | 35 +- src/lang/romanian.txt | 346 +++++++++++++------- src/lang/russian.txt | 37 ++- src/lang/serbian.txt | 1 + src/lang/simplified_chinese.txt | 15 +- src/lang/slovak.txt | 1 + src/lang/slovenian.txt | 1 + src/lang/spanish.txt | 27 +- src/lang/spanish_MX.txt | 1 + src/lang/swedish.txt | 1 + src/lang/tamil.txt | 4 + src/lang/thai.txt | 1 + src/lang/traditional_chinese.txt | 1 + src/lang/turkish.txt | 1 + src/lang/ukrainian.txt | 1 + src/lang/unfinished/chuvash.txt | 1 + src/lang/unfinished/frisian.txt | 1 + src/lang/unfinished/ido.txt | 1 + src/lang/unfinished/macedonian.txt | 1 + src/lang/unfinished/maltese.txt | 1 + src/lang/unfinished/marathi.txt | 1 + src/lang/unfinished/persian.txt | 1 + src/lang/unfinished/urdu.txt | 1 + src/lang/vietnamese.txt | 1 + src/lang/welsh.txt | 1 + src/linkgraph/linkgraphjob.h | 1 + src/misc_gui.cpp | 15 +- src/mixer.cpp | 27 +- src/music/dmusic.cpp | 2 +- src/music/fluidsynth.cpp | 30 +- src/music_gui.cpp | 45 +-- src/network/core/address.cpp | 11 + src/network/network.cpp | 10 +- src/network/network_gui.cpp | 3 +- src/network/network_internal.h | 5 - src/network/network_server.cpp | 14 +- src/network/network_udp.cpp | 103 ++++-- src/network/network_udp.h | 1 + src/newgrf.cpp | 7 + src/object.h | 2 +- src/object_gui.cpp | 69 +++- src/openttd.cpp | 8 +- src/openttd.h | 2 +- src/os/windows/font_win32.cpp | 2 +- src/os/windows/win32.cpp | 9 +- src/rail_gui.cpp | 66 +++- src/rev.cpp.in | 4 +- src/saveload/gamelog_sl.cpp | 15 +- src/saveload/linkgraph_sl.cpp | 1 + src/script/script_fatalerror.hpp | 6 +- src/script/script_instance.cpp | 8 +- src/script/script_scanner.cpp | 2 +- src/script/squirrel.cpp | 71 +++- src/settings_gui.cpp | 90 ++++- src/sound.cpp | 4 +- src/spritecache.cpp | 2 +- src/stdafx.h | 10 +- src/strings.cpp | 6 + src/table/misc_settings.ini | 6 + src/table/settings.ini | 4 +- src/table/strgen_tables.h | 1 + src/tgp.cpp | 4 +- src/town_cmd.cpp | 2 +- src/townname.cpp | 2 +- src/vehicle.cpp | 2 +- src/vehicle_gui.cpp | 10 +- src/video/cocoa/cocoa_ogl.mm | 2 +- src/video/cocoa/cocoa_v.mm | 2 +- src/video/opengl.cpp | 45 ++- src/video/opengl.h | 8 + src/video/sdl2_opengl_v.cpp | 16 +- src/video/sdl2_opengl_v.h | 2 + src/video/sdl2_v.h | 2 +- src/video/video_driver.cpp | 1 + src/video/video_driver.hpp | 9 +- src/video/win32_v.cpp | 62 ++-- src/video/win32_v.h | 5 +- src/viewport.cpp | 2 +- src/widget.cpp | 4 +- src/widget_type.h | 10 + src/widgets/CMakeLists.txt | 2 + src/widgets/settings_widget.h | 3 + src/widgets/slider.cpp | 70 ++++ src/widgets/slider_func.h | 21 ++ src/window_gui.h | 1 + 155 files changed, 1581 insertions(+), 845 deletions(-) create mode 100644 bin/CMakeLists.txt create mode 100644 bin/ai/CMakeLists.txt create mode 100644 bin/game/CMakeLists.txt create mode 100644 src/widgets/slider.cpp create mode 100644 src/widgets/slider_func.h diff --git a/.changelog b/.changelog index bd0efd59..3fe0caa3 100644 --- a/.changelog +++ b/.changelog @@ -1,217 +1,32 @@ -1.11.0 (2021-04-01) +1.11.1 (2021-04-18) ------------------------------------------------------------------------ -Feature: Allow setting a custom terrain type to define highest peak (#8891) -Feature: Auto-detect map height limit based on generated map (#8891) -Feature: Setting to indicate desert coverage for tropic climate and snow coverage for arctic climate (replaces snow line height) (#8891) -Add: Allow setting the highest mountain for heightmaps (#8891) -Change: Scale exported heightmaps to highest peak and inform the user of this value (#8891) -Change: Remove "maximum map height" from the New Game GUI (#8891) -Fix #8803: Only auto-remove signals when rail can be built (#8904) -Fix #8565: Stopped road vehicle displays a speed different than 0 (#8901) -Fix #8886: Don't try to resolve folders within tars named '.' (#8893) -Fix: Placing random trees in SE crashes the game (#8892) -Fix #8875: Filter string in station window breaks flow in user interface (#8885) -Fix #8871: [OpenGL] Initialize all buffers after resize and clear back buffer (#8877) -Fix: OpenGL performance with some AMD GPUs (#8876) -Fix: Recompute road/railtype availability after disabling the engine (#8872) -Fix: OSK layout not scaled for 2x or 4x GUI scale (#8868) - - -1.11.0-RC1 (2021-03-14) ------------------------------------------------------------------------- -Feature: Option to (dis-)allow hardware accelerated video drivers (#8819) -Feature: Option to set display refresh rate (#8813) -Feature: Allow custom width/height of screenshot and making heightmap screenshots via console (#8804) -Feature: Allow filtering on name in rail station window (#8706) -Feature: Setting for highest resolution of sprites to use (#8604) -Add: Make NewGRF Scanner / World Generation update smoother and make aborting it react faster (#8830) -Add: Malaysia Ringgit as Currency (#8783) -Add: "Engines only" filter in build train window (#8733) -Change: De-limit framerate window's framerate (#8772) -Change: Clarify what effect town interactions have (#8744) -Change: Don't show global goals in company goal windows (#8709) -Change: Recolour graph windows to brown (#8700) -Fix #8855: Bootstrap could result in an empty screen when bootstrap fails (#8856) -Fix #8851: Don't allow infinite "exec" depth in script, but limit to 10 deep (#8852) -Fix #8647: Incorrect drawing order of tram catenary sprites (#8843) -Fix #8711: Having gui_zoom lower than zoom_min causes a crash (#8835) -Fix #8810: "aircraft out of fuel" news shows the wrong place (#8832) -Fix #8833: Don't reload NewGRFs when we are shutting down (#8830) -Fix: Scale padding between elements the same as other padding (#8829) -Fix #8808: [OSX, OpenGL] Crash on switching blitters due to double-mapping the video buffer (#8822) -Fix #8784: Using Alt+Enter doesn't update the fullscreen toggle visibly (#8820) -Fix #8817: Keep NewGRF order for object class sorting (#8818) -Fix #8809: Crash when removing airport when hangar window open (#8815) -Fix #8799: Crash when Search Internet in Multiplayer (#8801) -Fix #8775: [Win32] Don't create the main window when Alt-Tabbing back into fullscreen (#8792) -Fix #8774: Black screenshots when using 40bpp-blitter (#8791) -Fix: [OSX] Hide dock when entering fullscreen (#8789) -Fix: Bootstrap fails to start on clean install (#8788) -Fix: Terraform limit acts random when maxing out per_64k_frames setting (#8782) -Fix: Max-value of fast-forward-speed-limit can be outside its storage size (#8769) - - -1.11.0-beta2 (2021-02-28) ------------------------------------------------------------------------- -Feature: Add setting to limit fast-forward speed (#8766) -Feature: Significant performance improvements to all video drivers (#8605, #8652, #8660, #8685, #8702, #8703, #8707, #8726, #8740) -Feature: Configurable display refresh-rate, default to 60fps (#8680) -Feature: Automatically upload releases to Steam (#8644) -Feature: Generic Linux builds (#8641) -Feature: [GS] Allow non-question type windows to have no buttons (#8638) -Feature: [macOS] ZIP build (#8614) -Feature: Object class selection string filtering (#8603) -Feature: 'Remove all industries' button in scenario editor (#8550) -Feature: Automatic UI and font zoom levels when supported by the OS (#8537) -Feature: [macOS] Render screen at native resolution by default for HiDPI screens (#8519) -Feature: OpenGL video driver (#7744) -Add: Indonesia Rupiah currency (#8616) -Change: Improve graph period markings (#8732) -Change: Make pathfinder account for maximum order speed, if set (#8722) -Change: Darken graph grid lines for legibility (#8690) -Change: Make order window hotkeys toggle for load & unload variants (#8669) -Change: Use a more specific error message when attempting to bulldoze your own HQ (#8667) -Change: Convert .md to .rtf for Windows/Mac packages (#8617) -Change: Move the 'tree placer algorithm' & 'road drive side' settings to the Settings window (#8566) -Change: Move town name generator selection to mapgen GUI (#8566) -Change: [macOS] Native font rendering (#8518) -Fix: Display of network lobby windows for different GUI sizes (#8765) -Fix: Don't desync if client leaves before you finish downloading map (#8755) -Fix: Allow estimating vehicle clone cost even if short on money (#8748) -Fix: Don't notify twice that a client left because of a timeout (#8746) -Fix: Vehicle cursor size did not account for the interface zoom level (#8739) -Fix #8123: Trams on half-tiles couldn't find depots (#8738) -Fix #8276: [NewGRF] Crash when an object's size was not set (#8719) -Fix #8349: Close depot vehicle list windows when closing the depot window (#8717) -Fix #8594: [NRT] Road pathfinder did not account for roadtype speed limits or lengths of tunnels/bridges (#8710) -Fix: Whole status bar instead of money widget refreshed on money change (#8692) -Fix: Unnecessary status bar redraws when there is no news to show (#8691) -Fix: New orders are non-stop by default (#8689) -Fix: Framerate window showed a slightly higher rate than actually measured (#8682) -Fix: Autorenew failure advice due to bad refit being shown to all companies (#8681) -Fix #8625: Wrong ending year was displayed in highscore table (#8672) -Fix #8620: Scale spacing between date & news in history window according to font scaling (#8671) -Fix: [Win32] Set minimum resolution for timers to 1ms (#8660) -Fix: Mention our websites with https:// (instead of http://) (#8657) -Fix: [Emscripten] Open links in browser (#8655) -Fix: Don't crash when towns upgrade road tiles during expansion (#8651) -Fix #8029: [SDL2] Blank display when under Wayland (#8648) -Fix: Default Network Server List sorter put compatible servers in wrong order (#8626) -Fix: Use non-pulsating red highlight for coverage (#8622) -Fix: Center text and image in vehicle statusbar vertically (#8602) -Fix: Don't walk out of the map when trying to build tunnels (#8600) -Fix: Off-by-one error in desert/rainforest positioning at world gen (#8588) -Fix #8037: Crash when restarting AI that is controlling the same company as the player (#8587) -Fix: Stopped ships shouldn't block depots (#8578) - - -1.11.0-beta1 (2021-01-22) ------------------------------------------------------------------------- -Feature: [GS] Ability to set some extra text in the industry window (#8576) -Feature: Show rainforest under vegetation on smallmap (#8562) -Feature: Automatically determine window size on new install (#8536) -Feature: Towns can build tunnels (#8473) -Feature: Make maximum length of town bridges depend on population (with a minimum limit of 4) (#8439) -Feature: New icons for renaming and go-to-location on GUI windows, and improve consistency of usage (#8455) -Feature: Support for ARM64 on Apple Silicon and Windows (#8340, #8577, #8583) -Feature: Add an option to disable tree growth completely (#8415) -Feature: Support for Emscripten (play-OpenTTD-in-the-browser!) (#8355) -Feature: Show group name as part of the default vehicle name (#8307) -Feature: "Frozen" economy setting that stops production changes and industry closures (#8282) -Feature: New velocity unit "tiles/day" (#8278) -Feature: Option to automatically remove signals when placing rail (#8274) -Feature: Increase max possible distance from border for oil refineries and rigs (#8237) -Feature: Improve tree planting window, and allow planting 'clumps' of trees by dragging in the scenario editor (#8234) -Feature: Indian Rupee (INR) currency (#8136) -Feature: [GS] Ability to give a company exclusive access to an industry (#8115) -Feature: Hotkeys for Land Info window, News window & close error window (#8053, #8266) -Feature: Improve rendering of large viewports (#7962) -Feature: [GS] Influence industry production changes from GameScript (#7912) -Feature: [GS] Push-buttons on storybook pages (#7896) -Feature: Option to group vehicle lists by shared orders (#7028) -Feature: Drag-and-drop vehicles in group GUI for shared order groups (#7028) -Add: [GS] A tile parameter to GSCompany::ChangeBankBalance for showing changes more visually (#8573) -Add: [NewGRF] Allow NewGRF vehicles to query the current rail/road/tram type (#8554) -Add: [Script] ScriptCargo::GetName for the human readable name of cargoes (#8544) -Add: "reload" console command to reload the current scenario or heightmap (#8527) -Add: [NewGRF] Flag to test if inflation is on or off (#8427) -Add: [Script] Native priority queue (useful for things like pathfinders) (#8091) -Add: [NewGRF] Industry behaviour flag to override second cargo production clamping for water industries when using smooth economy (#8079) -Change: [SDL2] Start game on the screen where the cursor is (#8572) -Change: Use a dark background for all profit graphs to increase contrast (#8557) -Change: Reword warning in cheat window (#8538) -Change: Enable the toolbar for road/rail/dock/airport, regardless of vehicle availability (#8521) -Change: For arctic and tropical climates, make sure at least a few hills are generated (#8513) -Change: Destroying a tunnel/bridge now sells the tracks before destroying the tunnel/bridge (#8508) -Change: Move "give money" from client-list to company window (#8500) -Change: [MacOS] Hide Dock and menu when in fullscreen mode (#8487) -Change: Improve performance for complex vehicle chains by resolving sprites less frequently (#8485) -Change: Make engine reliability independent of introduction date (#8470) -Change: Some default settings to improve gameplay for new players - default non-stop orders on, disable inflation, quick goto orders, show track reservations, and more (#8463) -Change: Converting town-owned road types now requires a positive town rating (#8457) -Change: Rework server list buttons for searching LAN/internet servers (#8426) -Change: Add some styling to GS question windows depending on the type (#8422) -Change: [Linkgraph] Speed up game exit by allowing job threads to be aborted early (#8416) -Change: Prevent towns from building dead-end road bridges (#8401) -Change: Send network error to the server before making an emergency save (#8387) -Change: Extend the allowed range for max loan setting up to £2 billion (#8386) -Change: Don't display OS name when exiting the game (#8366) -Change: Save openttd.cfg immediately on changing a setting (#8358) -Change: Autorenew now defaults to on (#8352) -Change: [NewGRF] Also use aircraft property 12 for helicopters (#8347) -Change: Service at depot also resets breakdown chance (#8317) -Change: Use key names instead of characters in hotkey.cfg (#8291) -Change: Allow command cost-estimation while paused (#8222) -Change: Always apply inflation from 1920 to 2090, no matter the game start year (#7589) -Change: Use CMake for build system (#7270) -Change: [Linkgraph] Pause the game when linkgraph jobs lag (#7081) -Change: Place "Group by" above "Sort by" in station window for consistency (#7028) -Fix #8589: Prevent desyncs with vehicle motion counters and NewGRFs (#8591) -Fix #7670: Improve pathfinder performance when lost vehicles are blocked from moving (#8568) -Fix: Inform user if a custom font failed to load due to missing glyphs (#8559) -Fix: Don't allow wagon chains (without an engine) to exceed maximum train length (#8533) -Fix #7619: Super fast NewGRF aircraft could be unable to land (#8531) -Fix: Improve connection retries for the content server in cases of broken networking (#8530) -Fix #7972: Show invalid orders to stations that don't accept the vehicle (#8516) -Fix: Error when trying to clone a vehicle with invalid orders (#8515) -Fix #8050: Various off-by-one errors in how the end-year of the game was used (#8512) -Fix #8332: Aborting vehicle group drag & drop could cause crashes (#8511) -Fix #8168: Allow relocating HQ partially over an existing HQ (#8510) -Fix #8068: Allow selling tram track regardless of bank balance (#8509) -Fix #7604: Prevent houses from wandering away from roads (#8507) -Fix: Make the "password" button the same size as the other buttons in the Company window (#8500) -Fix #7611: Keep news about vehicle accidents around after the vehicle is cleaned up (#8497) -Fix: [MacOS] Full animation in fullscreen mode was reducing the height of the window (#8491) -Fix: [MacOS] Loading custom fonts (#8484) -Fix: Network client makes emergency saves twice if the server is disconnected (#8477) -Fix #8462: Stop towns from trying to build roads on water (#8471) -Fix: [NewGRF] GetCurveSpeedLimit should use the railtype from the current tile (#8466) -Fix #8437: Crash when using certain heliports with certain rotated airports (#8458) -Fix #8437: Planes would land at the wrong height if the top corner of the airport was lowered (#8458) -Fix #8297: Infrastructure counters for road tunnels, bridges & depots (#8454) -Fix #6468: Don't store the version of AIs that are started via console (#8430) -Fix: Don't lower tree density if spreading is not enabled (#8413) -Fix: Prevent savegame version conflicts with certain old patchpacks (#8411) -Fix: [NewGRF] Variable 0x44 was always HZB_TOWN_EDGE for road stops (#8400) -Fix #8313: Use correct capitalization for TTO / DOS music files in the baseset metadata (#8385) -Fix: [NewGRF] Action 7/9 conditions 0x0F to 0x12 failed, if 'param' was 0x88 (#8382) -Fix: Change the working-dir searchpath when using '-c' (#8367) -Fix: Useless warning with -snull and no BaseSounds available (#8361) -Fix: Crash trying to load TTO/TTD savegames. (#8356) -Fix: [Script] Don't echo script exceptions to console (#8331) -Fix: Slovak ownname was using the wrong form (#8326) -Fix #8311: [NewGRF] Industry probability at map generation was scaled differently when set via property or callback (#8312) -Fix: Only check houses for cargo when generating subsidies with towns (#8305) -Fix: Sprite preview in sprite aligner was too small with scaled UI (#8288) -Fix: Spell 'Viewport' consistently (#8260) -Fix #7772: Show vehicle destination on mouseover when vehicle stopped (#8236, #8543) -Fix #8232: Huge screenshot warning was shown incorrectly (#8224) -Fix #8153: Report incompatible cargo/order when autoreplace fails (#8169) -Fix: [Script] ScriptMarine::AreWaterTilesConnected did not work for aqueducts (#8074) -Fix #7645: Add cost of clearing the sloped tile to the price of a dock (#7947) -Fix #6452: Reset only editable and visible settings from GUI (#7890) -Fix: Original terrain generator did not keep a single gap of water at the borders (#7883) -Remove: In-game console command "content select all" (#8363) -Remove: [OSX] Support for OSX older than 10.7, including QuickTime music driver (#8078) +Feature: Toggle to enable/disable vsync (#8997) +Feature: Volume controls in the Game Options window, and better defaults (#8943) +Add: Hotkey to focus object and rail filters (#8908) +Add: Better plural support for Romanian (#8936) +Change: Improve layout and spacing of several windows at different GUI scales (#9041, #9042, #9044, #9050) +Change: [Win32] Use user UI language setting for initial language selection (#8974) +Change: Make effect volume scale more intuitively (#8945, #8950) +Change: Improve padding of Object & Rail station windows (#8929) +Fix #6322: [Script] Crash when script allocates too much memory, now kills script instead (#9047) +Fix #7513: [Script] Crash on garbage collection with misbehaving script (#9040) +Fix #9028: [OpenGL] Crash when changing max sprite zoom level (#9032) +Fix #8874: show a warning when a NewGRF scan is requested multiple times (#9022) +Fix: Desync when GS unlocks railtype with wagon unlock (#9021) +Fix #9015: [Win32] Crash on running "pwd" command in the console (#9016) +Fix #9008: Validate starting year given on the command line (-t) (#9014) +Fix #8878: [Network] Slow DNS queries could block the server and disconnect clients (#9013) +Fix: Improve validation of OpenGL video driver to avoid crashes (#9007) +Fix: Credits scrolled too slowly with larger font sizes (#8994) +Fix #8977: Crash when altering max sprite resolution (#8993) +Fix #8956: Industry disaster news messages showed the wrong location (#8992) +Fix: [Win32] Font glyphs of certain widths had broken rendering (#8990) +Fix #8930: [Win32] Duplicate text input issue for systems using IME (#8976) +Fix: [Network] Potential stale client entries in client list (#8959) +Fix: Graphical issues when dragging measurement tooltips (#8951) +Fix: [Fluidsynth] Use provided default soundfont if available (#8948, #8953) +Fix #8935: [macOS] Crash on save (#8944) +Fix #8922: Crash when selling shared vehicles with shared vehicle window open (#8926) +Fix: Compiling on armhf (Raspberry Pi) (#8924) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 84e8c17d..894e9b9e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -379,6 +379,8 @@ jobs: bundle_name: "groovy" - container_image: "debian:buster" bundle_name: "buster" + - container_image: "debian:bullseye" + bundle_name: "bullseye" runs-on: ubuntu-20.04 container: diff --git a/.ottdrev b/.ottdrev index 0146c2da..20c6f717 100644 --- a/.ottdrev +++ b/.ottdrev @@ -1 +1 @@ -1.11.0 20210401 0 bd80ec7cff2f2186b133ea4bee431cb1a2f1fc95 1 1 2021 +1.11.1 20210418 0 0be22efffc3c14db08baf5e58c448b5d074f4427 1 1 2021 diff --git a/.release_date b/.release_date index 1f3966f9..1360740e 100644 --- a/.release_date +++ b/.release_date @@ -1 +1 @@ -2021-04-01 12:33 UTC +2021-04-18 21:11 UTC diff --git a/.version b/.version index 1cac385c..720c7384 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -1.11.0 +1.11.1 diff --git a/CMakeLists.txt b/CMakeLists.txt index c5f1d11b..63a0ce2f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ endif() project(${BINARY_NAME}) if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) - message(FATAL_ERROR "In-source builds not allowed. Please run \"cmake ..\" from the bin directory") + message(FATAL_ERROR "In-source builds not allowed. Please run \"cmake ..\" from the build directory. You may need to delete \"${CMAKE_SOURCE_DIR}/CMakeCache.txt\" first.") endif() # Debug mode by default. @@ -220,6 +220,7 @@ if(MSVC) target_sources(openttd PRIVATE "${CMAKE_SOURCE_DIR}/os/windows/openttd.manifest") endif() +add_subdirectory(${CMAKE_SOURCE_DIR}/bin) add_subdirectory(${CMAKE_SOURCE_DIR}/src) add_subdirectory(${CMAKE_SOURCE_DIR}/media) @@ -240,7 +241,7 @@ if(IPO_FOUND) set_target_properties(openttd PROPERTIES INTERPROCEDURAL_OPTIMIZATION_MINSIZEREL True) set_target_properties(openttd PROPERTIES INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO True) endif() -set_target_properties(openttd PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/bin") +set_target_properties(openttd PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_BINARY_DIR}") process_compile_flags() include(LinkPackage) diff --git a/bin/CMakeLists.txt b/bin/CMakeLists.txt new file mode 100644 index 00000000..9d75bc0e --- /dev/null +++ b/bin/CMakeLists.txt @@ -0,0 +1,2 @@ +add_subdirectory(ai) +add_subdirectory(game) diff --git a/bin/ai/CMakeLists.txt b/bin/ai/CMakeLists.txt new file mode 100644 index 00000000..60398f08 --- /dev/null +++ b/bin/ai/CMakeLists.txt @@ -0,0 +1,39 @@ +set(AI_COMPAT_SOURCE_FILES + ${CMAKE_CURRENT_SOURCE_DIR}/compat_0.7.nut + ${CMAKE_CURRENT_SOURCE_DIR}/compat_1.0.nut + ${CMAKE_CURRENT_SOURCE_DIR}/compat_1.1.nut + ${CMAKE_CURRENT_SOURCE_DIR}/compat_1.2.nut + ${CMAKE_CURRENT_SOURCE_DIR}/compat_1.3.nut + ${CMAKE_CURRENT_SOURCE_DIR}/compat_1.4.nut + ${CMAKE_CURRENT_SOURCE_DIR}/compat_1.5.nut + ${CMAKE_CURRENT_SOURCE_DIR}/compat_1.6.nut + ${CMAKE_CURRENT_SOURCE_DIR}/compat_1.7.nut + ${CMAKE_CURRENT_SOURCE_DIR}/compat_1.8.nut + ${CMAKE_CURRENT_SOURCE_DIR}/compat_1.9.nut + ${CMAKE_CURRENT_SOURCE_DIR}/compat_1.10.nut + ${CMAKE_CURRENT_SOURCE_DIR}/compat_1.11.nut +) + +foreach(AI_COMPAT_SOURCE_FILE IN LISTS AI_COMPAT_SOURCE_FILES) + string(REPLACE "${CMAKE_SOURCE_DIR}/bin/" "" AI_COMPAT_SOURCE_FILE_NAME "${AI_COMPAT_SOURCE_FILE}") + string(CONCAT AI_COMPAT_BINARY_FILE "${CMAKE_BINARY_DIR}/" "${AI_COMPAT_SOURCE_FILE_NAME}") + + add_custom_command(OUTPUT ${AI_COMPAT_BINARY_FILE} + COMMAND ${CMAKE_COMMAND} -E copy + ${AI_COMPAT_SOURCE_FILE} + ${AI_COMPAT_BINARY_FILE} + MAIN_DEPENDENCY ${AI_COMPAT_SOURCE_FILE} + COMMENT "Copying ${AI_COMPAT_SOURCE_FILE_NAME}" + ) + + list(APPEND AI_COMPAT_BINARY_FILES ${AI_COMPAT_BINARY_FILE}) +endforeach() + +# Create a new target which copies all compat files +add_custom_target(ai_compat_files + DEPENDS ${AI_COMPAT_BINARY_FILES} +) + +add_dependencies(openttd + ai_compat_files +) diff --git a/bin/game/CMakeLists.txt b/bin/game/CMakeLists.txt new file mode 100644 index 00000000..db1acf31 --- /dev/null +++ b/bin/game/CMakeLists.txt @@ -0,0 +1,36 @@ +set(GS_COMPAT_SOURCE_FILES + ${CMAKE_CURRENT_SOURCE_DIR}/compat_1.2.nut + ${CMAKE_CURRENT_SOURCE_DIR}/compat_1.3.nut + ${CMAKE_CURRENT_SOURCE_DIR}/compat_1.4.nut + ${CMAKE_CURRENT_SOURCE_DIR}/compat_1.5.nut + ${CMAKE_CURRENT_SOURCE_DIR}/compat_1.6.nut + ${CMAKE_CURRENT_SOURCE_DIR}/compat_1.7.nut + ${CMAKE_CURRENT_SOURCE_DIR}/compat_1.8.nut + ${CMAKE_CURRENT_SOURCE_DIR}/compat_1.9.nut + ${CMAKE_CURRENT_SOURCE_DIR}/compat_1.10.nut + ${CMAKE_CURRENT_SOURCE_DIR}/compat_1.11.nut +) + +foreach(GS_COMPAT_SOURCE_FILE IN LISTS GS_COMPAT_SOURCE_FILES) + string(REPLACE "${CMAKE_SOURCE_DIR}/bin/" "" GS_COMPAT_SOURCE_FILE_NAME "${GS_COMPAT_SOURCE_FILE}") + string(CONCAT GS_COMPAT_BINARY_FILE "${CMAKE_BINARY_DIR}/" "${GS_COMPAT_SOURCE_FILE_NAME}") + + add_custom_command(OUTPUT ${GS_COMPAT_BINARY_FILE} + COMMAND ${CMAKE_COMMAND} -E copy + ${GS_COMPAT_SOURCE_FILE} + ${GS_COMPAT_BINARY_FILE} + MAIN_DEPENDENCY ${GS_COMPAT_SOURCE_FILE} + COMMENT "Copying ${GS_COMPAT_SOURCE_FILE_NAME}" + ) + + list(APPEND GS_COMPAT_BINARY_FILES ${GS_COMPAT_BINARY_FILE}) +endforeach() + +# Create a new target which copies all compat files +add_custom_target(gs_compat_files + DEPENDS ${GS_COMPAT_BINARY_FILES} +) + +add_dependencies(openttd + gs_compat_files +) diff --git a/changelog.txt b/changelog.txt index e366eb73..cae48e8c 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,35 @@ +1.11.1 (2021-04-18) +------------------------------------------------------------------------ +Feature: Toggle to enable/disable vsync (#8997) +Feature: Volume controls in the Game Options window, and better defaults (#8943) +Add: Hotkey to focus object and rail filters (#8908) +Add: Better plural support for Romanian (#8936) +Change: Improve layout and spacing of several windows at different GUI scales (#9041, #9042, #9044, #9050) +Change: [Win32] Use user UI language setting for initial language selection (#8974) +Change: Make effect volume scale more intuitively (#8945, #8950) +Change: Improve padding of Object & Rail station windows (#8929) +Fix #6322: [Script] Crash when script allocates too much memory, now kills script instead (#9047) +Fix #7513: [Script] Crash on garbage collection with misbehaving script (#9040) +Fix #9028: [OpenGL] Crash when changing max sprite zoom level (#9032) +Fix #8874: show a warning when a NewGRF scan is requested multiple times (#9022) +Fix: Desync when GS unlocks railtype with wagon unlock (#9021) +Fix #9015: [Win32] Crash on running "pwd" command in the console (#9016) +Fix #9008: Validate starting year given on the command line (-t) (#9014) +Fix #8878: [Network] Slow DNS queries could block the server and disconnect clients (#9013) +Fix: Improve validation of OpenGL video driver to avoid crashes (#9007) +Fix: Credits scrolled too slowly with larger font sizes (#8994) +Fix #8977: Crash when altering max sprite resolution (#8993) +Fix #8956: Industry disaster news messages showed the wrong location (#8992) +Fix: [Win32] Font glyphs of certain widths had broken rendering (#8990) +Fix #8930: [Win32] Duplicate text input issue for systems using IME (#8976) +Fix: [Network] Potential stale client entries in client list (#8959) +Fix: Graphical issues when dragging measurement tooltips (#8951) +Fix: [Fluidsynth] Use provided default soundfont if available (#8948, #8953) +Fix #8935: [macOS] Crash on save (#8944) +Fix #8922: Crash when selling shared vehicles with shared vehicle window open (#8926) +Fix: Compiling on armhf (Raspberry Pi) (#8924) + + 1.11.0 (2021-04-01) ------------------------------------------------------------------------ Feature: Allow setting a custom terrain type to define highest peak (#8891) diff --git a/cmake/CompileFlags.cmake b/cmake/CompileFlags.cmake index f4047b83..86d336b5 100644 --- a/cmake/CompileFlags.cmake +++ b/cmake/CompileFlags.cmake @@ -4,20 +4,22 @@ # macro(compile_flags) if(MSVC) - # Switch to MT (static) instead of MD (dynamic) binary - - # For MSVC two generators are available - # - a command line generator (Ninja) using CMAKE_BUILD_TYPE to specify the - # configuration of the build tree - # - an IDE generator (Visual Studio) using CMAKE_CONFIGURATION_TYPES to - # specify all configurations that will be available in the generated solution - list(APPEND MSVC_CONFIGS "${CMAKE_BUILD_TYPE}" "${CMAKE_CONFIGURATION_TYPES}") - - # Set usage of static runtime for all configurations - foreach(MSVC_CONFIG ${MSVC_CONFIGS}) - string(TOUPPER "CMAKE_CXX_FLAGS_${MSVC_CONFIG}" MSVC_FLAGS) - string(REPLACE "/MD" "/MT" ${MSVC_FLAGS} "${${MSVC_FLAGS}}") - endforeach() + if(VCPKG_TARGET_TRIPLET MATCHES "-static" AND NOT VCPKG_TARGET_TRIPLET MATCHES "-md") + # Switch to MT (static) instead of MD (dynamic) binary + + # For MSVC two generators are available + # - a command line generator (Ninja) using CMAKE_BUILD_TYPE to specify the + # configuration of the build tree + # - an IDE generator (Visual Studio) using CMAKE_CONFIGURATION_TYPES to + # specify all configurations that will be available in the generated solution + list(APPEND MSVC_CONFIGS "${CMAKE_BUILD_TYPE}" "${CMAKE_CONFIGURATION_TYPES}") + + # Set usage of static runtime for all configurations + foreach(MSVC_CONFIG ${MSVC_CONFIGS}) + string(TOUPPER "CMAKE_CXX_FLAGS_${MSVC_CONFIG}" MSVC_FLAGS) + string(REPLACE "/MD" "/MT" ${MSVC_FLAGS} "${${MSVC_FLAGS}}") + endforeach() + endif() # "If /Zc:rvalueCast is specified, the compiler follows section 5.4 of the # C++11 standard". We need C++11 for the way we use threads. diff --git a/cmake/InstallAndPackage.cmake b/cmake/InstallAndPackage.cmake index 0b1dc149..fa36518d 100644 --- a/cmake/InstallAndPackage.cmake +++ b/cmake/InstallAndPackage.cmake @@ -26,8 +26,8 @@ install(TARGETS openttd install(DIRECTORY ${CMAKE_BINARY_DIR}/lang ${CMAKE_BINARY_DIR}/baseset - ${CMAKE_SOURCE_DIR}/bin/ai - ${CMAKE_SOURCE_DIR}/bin/game + ${CMAKE_BINARY_DIR}/ai + ${CMAKE_BINARY_DIR}/game ${CMAKE_SOURCE_DIR}/bin/scripts DESTINATION ${DATA_DESTINATION_DIR} COMPONENT language_files) diff --git a/docs/multiplayer.md b/docs/multiplayer.md index 89a49060..daccbf06 100644 --- a/docs/multiplayer.md +++ b/docs/multiplayer.md @@ -211,3 +211,10 @@ Last updated: 2011-02-16 communication from an admin tool reach the programme. See section 1 'Starting a server' further up for the ports and protocols used by OpenTTD. The ports can be configured in the config file. + + - My advertising server warns a lot about getaddrinfo taking N seconds + This could be a transient issue with your (local) DNS server, but if the + problem persists there is likely a configuration issue in DNS resolving + on your computer. This seems to be a common configuration issue for + Docker instances, where the DNS resolving waits for a time out of usually + 5 seconds. diff --git a/src/3rdparty/squirrel/squirrel/sqarray.h b/src/3rdparty/squirrel/squirrel/sqarray.h index 5c263520..13ae1161 100644 --- a/src/3rdparty/squirrel/squirrel/sqarray.h +++ b/src/3rdparty/squirrel/squirrel/sqarray.h @@ -17,9 +17,9 @@ struct SQArray : public CHAINABLE_OBJ return newarray; } #ifndef NO_GARBAGE_COLLECTOR - void Mark(SQCollectable **chain); + void EnqueueMarkObjectForChildren(SQGCMarkerQueue &queue) override; #endif - void Finalize(){ + void Finalize() override { _values.resize(0); } bool Get(const SQInteger nidx,SQObjectPtr &val) @@ -78,9 +78,13 @@ struct SQArray : public CHAINABLE_OBJ ShrinkIfNeeded(); return true; } - void Release() + void Release() override { - sq_delete(this,SQArray); + this->_sharedstate->DelayFinalFree(this); + } + void FinalFree() override + { + sq_delete(this, SQArray); } SQObjectPtrVec _values; }; diff --git a/src/3rdparty/squirrel/squirrel/sqclass.h b/src/3rdparty/squirrel/squirrel/sqclass.h index 895c053c..4fb6ecbd 100644 --- a/src/3rdparty/squirrel/squirrel/sqclass.h +++ b/src/3rdparty/squirrel/squirrel/sqclass.h @@ -59,7 +59,7 @@ struct SQClass : public CHAINABLE_OBJ } void Finalize(); #ifndef NO_GARBAGE_COLLECTOR - void Mark(SQCollectable ** ); + void EnqueueMarkObjectForChildren(SQGCMarkerQueue &queue); #endif SQInteger Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval); SQInstance *CreateInstance(); @@ -126,31 +126,33 @@ struct SQInstance : public SQDelegable } return false; } - void Release() { + void Release() override { _uiRef++; try { if (_hook) { _hook(_userpointer,0);} } catch (...) { _uiRef--; if (_uiRef == 0) { - SQInteger size = _memsize; - this->~SQInstance(); - SQ_FREE(this, size); + this->_sharedstate->DelayFinalFree(this); } throw; } _uiRef--; if(_uiRef > 0) return; + this->_sharedstate->DelayFinalFree(this); + } + void FinalFree() override + { SQInteger size = _memsize; this->~SQInstance(); SQ_FREE(this, size); } - void Finalize(); + void Finalize() override; #ifndef NO_GARBAGE_COLLECTOR - void Mark(SQCollectable ** ); + void EnqueueMarkObjectForChildren(SQGCMarkerQueue &queue) override; #endif bool InstanceOf(SQClass *trg); - bool GetMetaMethod(SQVM *v,SQMetaMethod mm,SQObjectPtr &res); + bool GetMetaMethod(SQVM *v,SQMetaMethod mm,SQObjectPtr &res) override; SQClass *_class; SQUserPointer _userpointer; diff --git a/src/3rdparty/squirrel/squirrel/sqclosure.h b/src/3rdparty/squirrel/squirrel/sqclosure.h index a42dcd57..8480fb8a 100644 --- a/src/3rdparty/squirrel/squirrel/sqclosure.h +++ b/src/3rdparty/squirrel/squirrel/sqclosure.h @@ -32,7 +32,7 @@ struct SQClosure : public CHAINABLE_OBJ bool Save(SQVM *v,SQUserPointer up,SQWRITEFUNC write); static bool Load(SQVM *v,SQUserPointer up,SQREADFUNC read,SQObjectPtr &ret); #ifndef NO_GARBAGE_COLLECTOR - void Mark(SQCollectable **chain); + void EnqueueMarkObjectForChildren(SQGCMarkerQueue &queue); void Finalize(){_outervalues.resize(0); } #endif SQObjectPtr _env; @@ -66,7 +66,7 @@ struct SQGenerator : public CHAINABLE_OBJ bool Yield(SQVM *v); bool Resume(SQVM *v,SQInteger target); #ifndef NO_GARBAGE_COLLECTOR - void Mark(SQCollectable **chain); + void EnqueueMarkObjectForChildren(SQGCMarkerQueue &queue); void Finalize(){_stack.resize(0);_closure=_null_;} #endif SQObjectPtr _closure; @@ -106,7 +106,7 @@ struct SQNativeClosure : public CHAINABLE_OBJ sq_delete(this,SQNativeClosure); } #ifndef NO_GARBAGE_COLLECTOR - void Mark(SQCollectable **chain); + void EnqueueMarkObjectForChildren(SQGCMarkerQueue &queue); void Finalize(){_outervalues.resize(0);} #endif SQInteger _nparamscheck; diff --git a/src/3rdparty/squirrel/squirrel/sqobject.cpp b/src/3rdparty/squirrel/squirrel/sqobject.cpp index d48baca1..a113f316 100644 --- a/src/3rdparty/squirrel/squirrel/sqobject.cpp +++ b/src/3rdparty/squirrel/squirrel/sqobject.cpp @@ -486,104 +486,81 @@ bool SQFunctionProto::Load(SQVM *v,SQUserPointer up,SQREADFUNC read,SQObjectPtr #ifndef NO_GARBAGE_COLLECTOR -#define START_MARK() if(!(_uiRef&MARK_FLAG)){ \ - _uiRef|=MARK_FLAG; - -#define END_MARK() RemoveFromChain(&_sharedstate->_gc_chain, this); \ - AddToChain(chain, this); } - -void SQVM::Mark(SQCollectable **chain) +void SQVM::EnqueueMarkObjectForChildren(SQGCMarkerQueue &queue) { - START_MARK() - SQSharedState::MarkObject(_lasterror,chain); - SQSharedState::MarkObject(_errorhandler,chain); - SQSharedState::MarkObject(_debughook,chain); - SQSharedState::MarkObject(_roottable, chain); - SQSharedState::MarkObject(temp_reg, chain); - for(SQUnsignedInteger i = 0; i < _stack.size(); i++) SQSharedState::MarkObject(_stack[i], chain); - for(SQUnsignedInteger j = 0; j < _vargsstack.size(); j++) SQSharedState::MarkObject(_vargsstack[j], chain); - for(SQInteger k = 0; k < _callsstacksize; k++) SQSharedState::MarkObject(_callsstack[k]._closure, chain); - END_MARK() -} - -void SQArray::Mark(SQCollectable **chain) + SQSharedState::EnqueueMarkObject(_lasterror,queue); + SQSharedState::EnqueueMarkObject(_errorhandler,queue); + SQSharedState::EnqueueMarkObject(_debughook,queue); + SQSharedState::EnqueueMarkObject(_roottable, queue); + SQSharedState::EnqueueMarkObject(temp_reg, queue); + for(SQUnsignedInteger i = 0; i < _stack.size(); i++) SQSharedState::EnqueueMarkObject(_stack[i], queue); + for(SQUnsignedInteger j = 0; j < _vargsstack.size(); j++) SQSharedState::EnqueueMarkObject(_vargsstack[j], queue); + for(SQInteger k = 0; k < _callsstacksize; k++) SQSharedState::EnqueueMarkObject(_callsstack[k]._closure, queue); +} + +void SQArray::EnqueueMarkObjectForChildren(SQGCMarkerQueue &queue) { - START_MARK() - SQInteger len = _values.size(); - for(SQInteger i = 0;i < len; i++) SQSharedState::MarkObject(_values[i], chain); - END_MARK() + SQInteger len = _values.size(); + for(SQInteger i = 0;i < len; i++) SQSharedState::EnqueueMarkObject(_values[i], queue); } -void SQTable::Mark(SQCollectable **chain) + +void SQTable::EnqueueMarkObjectForChildren(SQGCMarkerQueue &queue) { - START_MARK() - if(_delegate) _delegate->Mark(chain); - SQInteger len = _numofnodes; - for(SQInteger i = 0; i < len; i++){ - SQSharedState::MarkObject(_nodes[i].key, chain); - SQSharedState::MarkObject(_nodes[i].val, chain); - } - END_MARK() + if(_delegate) queue.Enqueue(_delegate); + SQInteger len = _numofnodes; + for(SQInteger i = 0; i < len; i++){ + SQSharedState::EnqueueMarkObject(_nodes[i].key, queue); + SQSharedState::EnqueueMarkObject(_nodes[i].val, queue); + } } -void SQClass::Mark(SQCollectable **chain) +void SQClass::EnqueueMarkObjectForChildren(SQGCMarkerQueue &queue) { - START_MARK() - _members->Mark(chain); - if(_base) _base->Mark(chain); - SQSharedState::MarkObject(_attributes, chain); - for(SQUnsignedInteger i =0; i< _defaultvalues.size(); i++) { - SQSharedState::MarkObject(_defaultvalues[i].val, chain); - SQSharedState::MarkObject(_defaultvalues[i].attrs, chain); - } - for(SQUnsignedInteger j =0; j< _methods.size(); j++) { - SQSharedState::MarkObject(_methods[j].val, chain); - SQSharedState::MarkObject(_methods[j].attrs, chain); - } - for(SQUnsignedInteger k =0; k< _metamethods.size(); k++) { - SQSharedState::MarkObject(_metamethods[k], chain); - } - END_MARK() + queue.Enqueue(_members); + if(_base) queue.Enqueue(_base); + SQSharedState::EnqueueMarkObject(_attributes, queue); + for(SQUnsignedInteger i =0; i< _defaultvalues.size(); i++) { + SQSharedState::EnqueueMarkObject(_defaultvalues[i].val, queue); + SQSharedState::EnqueueMarkObject(_defaultvalues[i].attrs, queue); + } + for(SQUnsignedInteger j =0; j< _methods.size(); j++) { + SQSharedState::EnqueueMarkObject(_methods[j].val, queue); + SQSharedState::EnqueueMarkObject(_methods[j].attrs, queue); + } + for(SQUnsignedInteger k =0; k< _metamethods.size(); k++) { + SQSharedState::EnqueueMarkObject(_metamethods[k], queue); + } } -void SQInstance::Mark(SQCollectable **chain) +void SQInstance::EnqueueMarkObjectForChildren(SQGCMarkerQueue &queue) { - START_MARK() - _class->Mark(chain); - SQUnsignedInteger nvalues = _class->_defaultvalues.size(); - for(SQUnsignedInteger i =0; i< nvalues; i++) { - SQSharedState::MarkObject(_values[i], chain); - } - END_MARK() + queue.Enqueue(_class); + SQUnsignedInteger nvalues = _class->_defaultvalues.size(); + for(SQUnsignedInteger i =0; i< nvalues; i++) { + SQSharedState::EnqueueMarkObject(_values[i], queue); + } } -void SQGenerator::Mark(SQCollectable **chain) +void SQGenerator::EnqueueMarkObjectForChildren(SQGCMarkerQueue &queue) { - START_MARK() - for(SQUnsignedInteger i = 0; i < _stack.size(); i++) SQSharedState::MarkObject(_stack[i], chain); - for(SQUnsignedInteger j = 0; j < _vargsstack.size(); j++) SQSharedState::MarkObject(_vargsstack[j], chain); - SQSharedState::MarkObject(_closure, chain); - END_MARK() + for(SQUnsignedInteger i = 0; i < _stack.size(); i++) SQSharedState::EnqueueMarkObject(_stack[i], queue); + for(SQUnsignedInteger j = 0; j < _vargsstack.size(); j++) SQSharedState::EnqueueMarkObject(_vargsstack[j], queue); + SQSharedState::EnqueueMarkObject(_closure, queue); } -void SQClosure::Mark(SQCollectable **chain) +void SQClosure::EnqueueMarkObjectForChildren(SQGCMarkerQueue &queue) { - START_MARK() - for(SQUnsignedInteger i = 0; i < _outervalues.size(); i++) SQSharedState::MarkObject(_outervalues[i], chain); - for(SQUnsignedInteger i = 0; i < _defaultparams.size(); i++) SQSharedState::MarkObject(_defaultparams[i], chain); - END_MARK() + for(SQUnsignedInteger i = 0; i < _outervalues.size(); i++) SQSharedState::EnqueueMarkObject(_outervalues[i], queue); + for(SQUnsignedInteger i = 0; i < _defaultparams.size(); i++) SQSharedState::EnqueueMarkObject(_defaultparams[i], queue); } -void SQNativeClosure::Mark(SQCollectable **chain) +void SQNativeClosure::EnqueueMarkObjectForChildren(SQGCMarkerQueue &queue) { - START_MARK() - for(SQUnsignedInteger i = 0; i < _outervalues.size(); i++) SQSharedState::MarkObject(_outervalues[i], chain); - END_MARK() + for(SQUnsignedInteger i = 0; i < _outervalues.size(); i++) SQSharedState::EnqueueMarkObject(_outervalues[i], queue); } -void SQUserData::Mark(SQCollectable **chain){ - START_MARK() - if(_delegate) _delegate->Mark(chain); - END_MARK() +void SQUserData::EnqueueMarkObjectForChildren(SQGCMarkerQueue &queue){ + if(_delegate) queue.Enqueue(_delegate); } void SQCollectable::UnMark() { _uiRef&=~MARK_FLAG; } diff --git a/src/3rdparty/squirrel/squirrel/sqobject.h b/src/3rdparty/squirrel/squirrel/sqobject.h index d71e515a..9212766e 100644 --- a/src/3rdparty/squirrel/squirrel/sqobject.h +++ b/src/3rdparty/squirrel/squirrel/sqobject.h @@ -2,6 +2,7 @@ #ifndef _SQOBJECT_H_ #define _SQOBJECT_H_ +#include #include "squtils.h" #define SQ_CLOSURESTREAM_HEAD (('S'<<24)|('Q'<<16)|('I'<<8)|('R')) @@ -344,11 +345,54 @@ struct SQCollectable : public SQRefCounted { SQCollectable *_prev; SQSharedState *_sharedstate; virtual void Release()=0; - virtual void Mark(SQCollectable **chain)=0; + virtual void EnqueueMarkObjectForChildren(class SQGCMarkerQueue &queue)=0; void UnMark(); virtual void Finalize()=0; static void AddToChain(SQCollectable **chain,SQCollectable *c); static void RemoveFromChain(SQCollectable **chain,SQCollectable *c); + + /** + * Helper to perform the final memory freeing of this instance. Since the destructor might + * release more objects, this can cause a very deep recursion. As such, the calls to this + * are to be done via _sharedstate->DelayFinalFree which ensures the calls to this method + * are done in an iterative instead of recursive approach. + */ + virtual void FinalFree() {} +}; + +/** + * Helper container for state to change the garbage collection from a recursive to an iterative approach. + * The iterative approach provides effectively a depth first search approach. + */ +class SQGCMarkerQueue { + std::vector stack; ///< The elements to still process, with the most recent elements at the back. +public: + /** Whether there are any elements left to process. */ + bool IsEmpty() { return this->stack.empty(); } + + /** + * Remove the most recently added element from the queue. + * Removal when the queue is empty results in undefined behaviour. + */ + SQCollectable *Pop() + { + SQCollectable *collectable = this->stack.back(); + this->stack.pop_back(); + return collectable; + } + + /** + * Add a collectable to the queue, but only when it has not been marked yet. + * When adding it to the queue, the collectable will be marked, so subsequent calls + * will not add it again. + */ + void Enqueue(SQCollectable *collectable) + { + if ((collectable->_uiRef & MARK_FLAG) == 0) { + collectable->_uiRef |= MARK_FLAG; + this->stack.push_back(collectable); + } + } }; diff --git a/src/3rdparty/squirrel/squirrel/sqstate.cpp b/src/3rdparty/squirrel/squirrel/sqstate.cpp index eaad6a3f..31345d66 100644 --- a/src/3rdparty/squirrel/squirrel/sqstate.cpp +++ b/src/3rdparty/squirrel/squirrel/sqstate.cpp @@ -99,6 +99,7 @@ SQSharedState::SQSharedState() _notifyallexceptions = false; _scratchpad=NULL; _scratchpadsize=0; + _collectable_free_processing = false; #ifndef NO_GARBAGE_COLLECTOR _gc_chain=NULL; #endif @@ -226,20 +227,48 @@ SQInteger SQSharedState::GetMetaMethodIdxByName(const SQObjectPtr &name) return -1; } +/** + * Helper function that is to be used instead of calling FinalFree directly on the instance, + * so the frees can happen iteratively. This as in the FinalFree the references to any other + * objects are released, which can cause those object to be freed yielding a potentially + * very deep stack in case of for example a link list. + * + * This is done internally by a vector onto which the to be freed instances are pushed. When + * this is called when not already processing, this method will actually call the FinalFree + * function which might cause more elements to end up in the queue which this method then + * picks up continueing until it has processed all instances in that queue. + * @param collectable The collectable to (eventually) free. + */ +void SQSharedState::DelayFinalFree(SQCollectable *collectable) +{ + this->_collectable_free_queue.push_back(collectable); + + if (!this->_collectable_free_processing) { + this->_collectable_free_processing = true; + while (!this->_collectable_free_queue.empty()) { + SQCollectable *collectable = this->_collectable_free_queue.back(); + this->_collectable_free_queue.pop_back(); + collectable->FinalFree(); + } + this->_collectable_free_processing = false; + } +} + + #ifndef NO_GARBAGE_COLLECTOR -void SQSharedState::MarkObject(SQObjectPtr &o,SQCollectable **chain) +void SQSharedState::EnqueueMarkObject(SQObjectPtr &o,SQGCMarkerQueue &queue) { switch(type(o)){ - case OT_TABLE:_table(o)->Mark(chain);break; - case OT_ARRAY:_array(o)->Mark(chain);break; - case OT_USERDATA:_userdata(o)->Mark(chain);break; - case OT_CLOSURE:_closure(o)->Mark(chain);break; - case OT_NATIVECLOSURE:_nativeclosure(o)->Mark(chain);break; - case OT_GENERATOR:_generator(o)->Mark(chain);break; - case OT_THREAD:_thread(o)->Mark(chain);break; - case OT_CLASS:_class(o)->Mark(chain);break; - case OT_INSTANCE:_instance(o)->Mark(chain);break; + case OT_TABLE:queue.Enqueue(_table(o));break; + case OT_ARRAY:queue.Enqueue(_array(o));break; + case OT_USERDATA:queue.Enqueue(_userdata(o));break; + case OT_CLOSURE:queue.Enqueue(_closure(o));break; + case OT_NATIVECLOSURE:queue.Enqueue(_nativeclosure(o));break; + case OT_GENERATOR:queue.Enqueue(_generator(o));break; + case OT_THREAD:queue.Enqueue(_thread(o));break; + case OT_CLASS:queue.Enqueue(_class(o));break; + case OT_INSTANCE:queue.Enqueue(_instance(o));break; default: break; //shutup compiler } } @@ -248,27 +277,36 @@ void SQSharedState::MarkObject(SQObjectPtr &o,SQCollectable **chain) SQInteger SQSharedState::CollectGarbage(SQVM *vm) { SQInteger n=0; - SQCollectable *tchain=NULL; SQVM *vms = _thread(_root_vm); - vms->Mark(&tchain); -#ifndef NDEBUG + SQGCMarkerQueue queue; + queue.Enqueue(vms); +#ifdef WITH_ASSERT SQInteger x = _table(_thread(_root_vm)->_roottable)->CountUsed(); #endif - _refs_table.Mark(&tchain); - MarkObject(_registry,&tchain); - MarkObject(_consts,&tchain); - MarkObject(_metamethodsmap,&tchain); - MarkObject(_table_default_delegate,&tchain); - MarkObject(_array_default_delegate,&tchain); - MarkObject(_string_default_delegate,&tchain); - MarkObject(_number_default_delegate,&tchain); - MarkObject(_generator_default_delegate,&tchain); - MarkObject(_thread_default_delegate,&tchain); - MarkObject(_closure_default_delegate,&tchain); - MarkObject(_class_default_delegate,&tchain); - MarkObject(_instance_default_delegate,&tchain); - MarkObject(_weakref_default_delegate,&tchain); + _refs_table.EnqueueMarkObject(queue); + EnqueueMarkObject(_registry,queue); + EnqueueMarkObject(_consts,queue); + EnqueueMarkObject(_metamethodsmap,queue); + EnqueueMarkObject(_table_default_delegate,queue); + EnqueueMarkObject(_array_default_delegate,queue); + EnqueueMarkObject(_string_default_delegate,queue); + EnqueueMarkObject(_number_default_delegate,queue); + EnqueueMarkObject(_generator_default_delegate,queue); + EnqueueMarkObject(_thread_default_delegate,queue); + EnqueueMarkObject(_closure_default_delegate,queue); + EnqueueMarkObject(_class_default_delegate,queue); + EnqueueMarkObject(_instance_default_delegate,queue); + EnqueueMarkObject(_weakref_default_delegate,queue); + + SQCollectable *tchain=NULL; + + while (!queue.IsEmpty()) { + SQCollectable *q = queue.Pop(); + q->EnqueueMarkObjectForChildren(queue); + SQCollectable::RemoveFromChain(&_gc_chain, q); + SQCollectable::AddToChain(&tchain, q); + } SQCollectable *t = _gc_chain; SQCollectable *nx = NULL; @@ -291,7 +329,7 @@ SQInteger SQSharedState::CollectGarbage(SQVM *vm) t = t->_next; } _gc_chain = tchain; -#ifndef NDEBUG +#ifdef WITH_ASSERT SQInteger z = _table(_thread(_root_vm)->_roottable)->CountUsed(); assert(z == x); #endif @@ -357,12 +395,12 @@ RefTable::~RefTable() } #ifndef NO_GARBAGE_COLLECTOR -void RefTable::Mark(SQCollectable **chain) +void RefTable::EnqueueMarkObject(SQGCMarkerQueue &queue) { RefNode *nodes = (RefNode *)_nodes; for(SQUnsignedInteger n = 0; n < _numofslots; n++) { if(type(nodes->obj) != OT_NULL) { - SQSharedState::MarkObject(nodes->obj,chain); + SQSharedState::EnqueueMarkObject(nodes->obj,queue); } nodes++; } diff --git a/src/3rdparty/squirrel/squirrel/sqstate.h b/src/3rdparty/squirrel/squirrel/sqstate.h index da6bf9ae..547e6de4 100644 --- a/src/3rdparty/squirrel/squirrel/sqstate.h +++ b/src/3rdparty/squirrel/squirrel/sqstate.h @@ -34,7 +34,7 @@ struct RefTable { void AddRef(SQObject &obj); SQBool Release(SQObject &obj); #ifndef NO_GARBAGE_COLLECTOR - void Mark(SQCollectable **chain); + void EnqueueMarkObject(SQGCMarkerQueue &queue); #endif void Finalize(); private: @@ -61,9 +61,10 @@ struct SQSharedState public: SQChar* GetScratchPad(SQInteger size); SQInteger GetMetaMethodIdxByName(const SQObjectPtr &name); + void DelayFinalFree(SQCollectable *collectable); #ifndef NO_GARBAGE_COLLECTOR SQInteger CollectGarbage(SQVM *vm); - static void MarkObject(SQObjectPtr &o,SQCollectable **chain); + static void EnqueueMarkObject(SQObjectPtr &o,SQGCMarkerQueue &queue); #endif SQObjectPtrVec *_metamethods; SQObjectPtr _metamethodsmap; @@ -74,6 +75,10 @@ struct SQSharedState SQObjectPtr _registry; SQObjectPtr _consts; SQObjectPtr _constructoridx; + /** Queue to make freeing of collectables iterative. */ + std::vector _collectable_free_queue; + /** Whether someone is already processing the _collectable_free_queue. */ + bool _collectable_free_processing; #ifndef NO_GARBAGE_COLLECTOR SQCollectable *_gc_chain; #endif diff --git a/src/3rdparty/squirrel/squirrel/sqtable.h b/src/3rdparty/squirrel/squirrel/sqtable.h index 52d9ba41..fad2fdc6 100644 --- a/src/3rdparty/squirrel/squirrel/sqtable.h +++ b/src/3rdparty/squirrel/squirrel/sqtable.h @@ -50,7 +50,7 @@ struct SQTable : public SQDelegable newtable->_delegate = NULL; return newtable; } - void Finalize(); + void Finalize() override; SQTable *Clone(); ~SQTable() { @@ -60,7 +60,7 @@ struct SQTable : public SQDelegable SQ_FREE(_nodes, _numofnodes * sizeof(_HashNode)); } #ifndef NO_GARBAGE_COLLECTOR - void Mark(SQCollectable **chain); + void EnqueueMarkObjectForChildren(SQGCMarkerQueue &queue) override; #endif inline _HashNode *_Get(const SQObjectPtr &key,SQHash hash) { @@ -81,7 +81,11 @@ struct SQTable : public SQDelegable SQInteger CountUsed(){ return _usednodes;} void Clear(); - void Release() + void Release() override + { + this->_sharedstate->DelayFinalFree(this); + } + void FinalFree() override { sq_delete(this, SQTable); } diff --git a/src/3rdparty/squirrel/squirrel/squserdata.h b/src/3rdparty/squirrel/squirrel/squserdata.h index 3bf1a9db..ca4933de 100644 --- a/src/3rdparty/squirrel/squirrel/squserdata.h +++ b/src/3rdparty/squirrel/squirrel/squserdata.h @@ -18,7 +18,7 @@ struct SQUserData : SQDelegable return ud; } #ifndef NO_GARBAGE_COLLECTOR - void Mark(SQCollectable **chain); + void EnqueueMarkObjectForChildren(SQGCMarkerQueue &queue); void Finalize(){SetDelegate(NULL);} #endif void Release() { diff --git a/src/3rdparty/squirrel/squirrel/sqvm.cpp b/src/3rdparty/squirrel/squirrel/sqvm.cpp index 5419c94c..ad07ac51 100644 --- a/src/3rdparty/squirrel/squirrel/sqvm.cpp +++ b/src/3rdparty/squirrel/squirrel/sqvm.cpp @@ -1460,7 +1460,7 @@ bool SQVM::DeleteSlot(const SQObjectPtr &self,const SQObjectPtr &key,SQObjectPtr } } res = t; - } + } break; default: Raise_Error("attempt to delete a slot from a %s",GetTypeName(self)); @@ -1471,7 +1471,7 @@ bool SQVM::DeleteSlot(const SQObjectPtr &self,const SQObjectPtr &key,SQObjectPtr bool SQVM::Call(SQObjectPtr &closure,SQInteger nparams,SQInteger stackbase,SQObjectPtr &outres,SQBool raiseerror,SQBool can_suspend) { -#ifndef NDEBUG +#ifdef WITH_ASSERT SQInteger prevstackbase = _stackbase; #endif switch(type(closure)) { @@ -1482,13 +1482,13 @@ bool SQVM::Call(SQObjectPtr &closure,SQInteger nparams,SQInteger stackbase,SQObj bool ret = Execute(closure, _top - nparams, nparams, stackbase,outres,raiseerror); this->_can_suspend = backup_suspend; return ret; - } + } break; - case OT_NATIVECLOSURE:{ + case OT_NATIVECLOSURE: { bool suspend; return CallNative(_nativeclosure(closure), nparams, stackbase, outres,suspend); - } + } break; case OT_CLASS: { SQObjectPtr constr; @@ -1499,12 +1499,12 @@ bool SQVM::Call(SQObjectPtr &closure,SQInteger nparams,SQInteger stackbase,SQObj return Call(constr,nparams,stackbase,temp,raiseerror,false); } return true; - } + } break; default: return false; } -#ifndef NDEBUG +#ifdef WITH_ASSERT if(!_suspended) { assert(_stackbase == prevstackbase); } diff --git a/src/3rdparty/squirrel/squirrel/sqvm.h b/src/3rdparty/squirrel/squirrel/sqvm.h index 9c8e986f..dbfe2309 100644 --- a/src/3rdparty/squirrel/squirrel/sqvm.h +++ b/src/3rdparty/squirrel/squirrel/sqvm.h @@ -113,7 +113,7 @@ typedef sqvector CallInfoVec; #endif #ifndef NO_GARBAGE_COLLECTOR - void Mark(SQCollectable **chain); + void EnqueueMarkObjectForChildren(SQGCMarkerQueue &queue); #endif void Finalize(); void GrowCallStack() { diff --git a/src/ai/ai_gui.cpp b/src/ai/ai_gui.cpp index 4c0330bc..14fc65cc 100644 --- a/src/ai/ai_gui.cpp +++ b/src/ai/ai_gui.cpp @@ -704,16 +704,16 @@ static const NWidgetPart _nested_ai_config_widgets[] = { 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, 12), SetDataTip(STR_AI_CONFIG_CHANGE, STR_AI_CONFIG_CHANGE_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CONFIGURE), SetFill(1, 0), SetMinimalSize(93, 12), SetDataTip(STR_AI_CONFIG_CONFIGURE, STR_AI_CONFIG_CONFIGURE_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CLOSE), SetFill(1, 0), SetMinimalSize(93, 12), SetDataTip(STR_AI_SETTINGS_CLOSE, STR_NULL), - EndContainer(), + 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_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), + 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_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(), - NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CONTENT_DOWNLOAD), SetFill(1, 0), SetMinimalSize(279, 12), SetPadding(0, 7, 9, 7), SetDataTip(STR_INTRO_ONLINE_CONTENT, STR_INTRO_TOOLTIP_ONLINE_CONTENT), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CONTENT_DOWNLOAD), SetFill(1, 0), SetMinimalSize(279, 0), SetPadding(0, 7, 9, 7), SetDataTip(STR_INTRO_ONLINE_CONTENT, STR_INTRO_TOOLTIP_ONLINE_CONTENT), EndContainer(), }; diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index f50644cf..cebf7019 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -1351,7 +1351,9 @@ DEF_CONSOLE_CMD(ConRescanNewGRF) return true; } - RequestNewGRFScan(); + if (!RequestNewGRFScan()) { + IConsoleWarning("NewGRF scanning is already running. Please wait until completed to run again."); + } return true; } diff --git a/src/core/pool_type.hpp b/src/core/pool_type.hpp index e847dfbb..33f952dd 100644 --- a/src/core/pool_type.hpp +++ b/src/core/pool_type.hpp @@ -82,7 +82,7 @@ struct Pool : PoolBase { /* Ensure Tmax_size is within the bounds of Tindex. */ static_assert((uint64)(Tmax_size - 1) >> 8 * sizeof(Tindex) == 0); - static const size_t MAX_SIZE = Tmax_size; ///< Make template parameter accessible from outside + static constexpr size_t MAX_SIZE = Tmax_size; ///< Make template parameter accessible from outside const char * const name; ///< Name of this pool diff --git a/src/disaster_vehicle.cpp b/src/disaster_vehicle.cpp index c5d76877..cc245b38 100644 --- a/src/disaster_vehicle.cpp +++ b/src/disaster_vehicle.cpp @@ -456,7 +456,7 @@ static bool DisasterTick_Aircraft(DisasterVehicle *v, uint16 image_override, boo DestructIndustry(i); SetDParam(0, i->town->index); - AddTileNewsItem(news_message, NT_ACCIDENT, v->dest_tile); + AddIndustryNewsItem(news_message, NT_ACCIDENT, i->index); if (_settings_client.sound.disaster) SndPlayTileFx(SND_12_EXPLOSION, i->location.tile); } } else if (v->current_order.GetDestination() == 0) { diff --git a/src/engine.cpp b/src/engine.cpp index 596e8706..60b0d422 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -722,11 +722,9 @@ static void EnableEngineForCompany(EngineID eid, CompanyID company) SetBit(e->company_avail, company); if (e->type == VEH_TRAIN) { - assert(e->u.rail.railtype < RAILTYPE_END); - c->avail_railtypes = AddDateIntroducedRailTypes(c->avail_railtypes | GetRailTypeInfo(e->u.rail.railtype)->introduces_railtypes, _date); + c->avail_railtypes = GetCompanyRailtypes(c->index); } else if (e->type == VEH_ROAD) { - assert(e->u.road.roadtype < ROADTYPE_END); - c->avail_roadtypes = AddDateIntroducedRoadTypes(c->avail_roadtypes | GetRoadTypeInfo(e->u.road.roadtype)->introduces_roadtypes, _date); + c->avail_roadtypes = GetCompanyRoadTypes(c->index); } if (company == _local_company) { diff --git a/src/group_gui.cpp b/src/group_gui.cpp index e711201a..a8b4c5f1 100644 --- a/src/group_gui.cpp +++ b/src/group_gui.cpp @@ -46,7 +46,6 @@ static const NWidgetPart _nested_group_widgets[] = { NWidget(NWID_HORIZONTAL), /* left part */ NWidget(NWID_VERTICAL), - NWidget(WWT_PANEL, COLOUR_GREY), SetMinimalTextLines(1, WD_DROPDOWNTEXT_TOP + WD_DROPDOWNTEXT_BOTTOM), SetFill(1, 0), EndContainer(), NWidget(WWT_PANEL, COLOUR_GREY, WID_GL_ALL_VEHICLES), SetFill(1, 0), EndContainer(), NWidget(WWT_PANEL, COLOUR_GREY, WID_GL_DEFAULT_VEHICLES), SetFill(1, 0), EndContainer(), NWidget(NWID_HORIZONTAL), @@ -54,18 +53,18 @@ static const NWidgetPart _nested_group_widgets[] = { SetFill(1, 0), SetResize(0, 1), SetScrollbar(WID_GL_LIST_GROUP_SCROLLBAR), NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_GL_LIST_GROUP_SCROLLBAR), EndContainer(), - NWidget(WWT_PANEL, COLOUR_GREY, WID_GL_INFO), SetFill(1, 0), EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY, WID_GL_INFO), SetFill(1, 1), SetMinimalTextLines(3, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM), EndContainer(), NWidget(NWID_HORIZONTAL), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_GL_CREATE_GROUP), SetFill(0, 1), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_GL_CREATE_GROUP), SetDataTip(SPR_GROUP_CREATE_TRAIN, STR_GROUP_CREATE_TOOLTIP), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_GL_DELETE_GROUP), SetFill(0, 1), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_GL_DELETE_GROUP), SetDataTip(SPR_GROUP_DELETE_TRAIN, STR_GROUP_DELETE_TOOLTIP), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_GL_RENAME_GROUP), SetFill(0, 1), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_GL_RENAME_GROUP), SetDataTip(SPR_GROUP_RENAME_TRAIN, STR_GROUP_RENAME_TOOLTIP), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_GL_LIVERY_GROUP), SetFill(0, 1), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_GL_LIVERY_GROUP), SetDataTip(SPR_GROUP_LIVERY_TRAIN, STR_GROUP_LIVERY_TOOLTIP), - NWidget(WWT_PANEL, COLOUR_GREY), SetFill(1, 1), EndContainer(), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_GL_REPLACE_PROTECTION), SetFill(0, 1), + NWidget(WWT_PANEL, COLOUR_GREY), SetFill(1, 0), EndContainer(), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_GL_REPLACE_PROTECTION), SetDataTip(SPR_GROUP_REPLACE_OFF_TRAIN, STR_GROUP_REPLACE_PROTECTION_TOOLTIP), EndContainer(), EndContainer(), @@ -87,14 +86,14 @@ static const NWidgetPart _nested_group_widgets[] = { EndContainer(), NWidget(WWT_PANEL, COLOUR_GREY), SetMinimalSize(1, 0), SetFill(1, 1), SetResize(1, 0), EndContainer(), NWidget(NWID_HORIZONTAL), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GL_AVAILABLE_VEHICLES), SetMinimalSize(106, 12), SetFill(0, 1), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GL_AVAILABLE_VEHICLES), SetMinimalSize(106, 12), SetDataTip(STR_BLACK_STRING, STR_VEHICLE_LIST_AVAILABLE_ENGINES_TOOLTIP), - NWidget(WWT_PANEL, COLOUR_GREY), SetMinimalSize(0, 12), SetFill(1, 1), SetResize(1, 0), EndContainer(), - NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GL_MANAGE_VEHICLES_DROPDOWN), SetMinimalSize(118, 12), SetFill(0, 1), + NWidget(WWT_PANEL, COLOUR_GREY), SetMinimalSize(0, 12), SetFill(1, 0), SetResize(1, 0), EndContainer(), + NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GL_MANAGE_VEHICLES_DROPDOWN), SetMinimalSize(118, 12), SetDataTip(STR_VEHICLE_LIST_MANAGE_LIST, STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_GL_STOP_ALL), SetMinimalSize(12, 12), SetFill(0, 1), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_GL_STOP_ALL), SetMinimalSize(12, 12), SetDataTip(SPR_FLAG_VEH_STOPPED, STR_VEHICLE_LIST_MASS_STOP_LIST_TOOLTIP), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_GL_START_ALL), SetMinimalSize(12, 12), SetFill(0, 1), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_GL_START_ALL), SetMinimalSize(12, 12), SetDataTip(SPR_FLAG_VEH_RUNNING, STR_VEHICLE_LIST_MASS_START_LIST_TOOLTIP), NWidget(WWT_RESIZEBOX, COLOUR_GREY), EndContainer(), @@ -229,7 +228,7 @@ class VehicleGroupWindow : public BaseVehicleListWindow { 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_MATRIX_TOP; + this->tiny_step_height += WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; return WD_FRAMERECT_LEFT + 8 + this->column_size[VGC_FOLD].width + 2 + @@ -255,7 +254,7 @@ class VehicleGroupWindow : public BaseVehicleListWindow { { /* 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, right - WD_FRAMERECT_RIGHT, y + this->tiny_step_height - WD_FRAMERECT_BOTTOM - WD_MATRIX_TOP, _colour_gradient[COLOUR_GREY][7]); + 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]); } if (g_id == NEW_GROUP) return; @@ -386,7 +385,7 @@ class VehicleGroupWindow : public BaseVehicleListWindow { resize->height = this->tiny_step_height; /* Minimum height is the height of the list widget minus all and default vehicles... */ - size->height = 4 * GetVehicleListHeight(this->vli.vtype, this->tiny_step_height) - 2 * this->tiny_step_height; + size->height = 4 * GetVehicleListHeight(this->vli.vtype, this->tiny_step_height); /* ... minus the buttons at the bottom ... */ uint max_icon_height = GetSpriteSize(this->GetWidget(WID_GL_CREATE_GROUP)->widget_data).height; @@ -429,11 +428,6 @@ class VehicleGroupWindow : public BaseVehicleListWindow { *size = maxdim(*size, d); break; } - - case WID_GL_INFO: { - size->height = (FONT_HEIGHT_NORMAL * 3) + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; - break; - } } } @@ -555,11 +549,11 @@ class VehicleGroupWindow : public BaseVehicleListWindow { { switch (widget) { case WID_GL_ALL_VEHICLES: - DrawGroupInfo(r.top + WD_FRAMERECT_TOP, r.left, r.right, ALL_GROUP); + DrawGroupInfo(r.top, r.left, r.right, ALL_GROUP); break; case WID_GL_DEFAULT_VEHICLES: - DrawGroupInfo(r.top + WD_FRAMERECT_TOP, r.left, r.right, DEFAULT_GROUP); + DrawGroupInfo(r.top, r.left, r.right, DEFAULT_GROUP); break; case WID_GL_INFO: { @@ -600,7 +594,7 @@ class VehicleGroupWindow : public BaseVehicleListWindow { } case WID_GL_LIST_GROUP: { - int y1 = r.top + WD_FRAMERECT_TOP; + int y1 = r.top; int max = std::min(this->group_sb->GetPosition() + this->group_sb->GetCapacity(), this->groups.size()); for (int i = this->group_sb->GetPosition(); i < max; ++i) { const Group *g = this->groups[i]; @@ -892,7 +886,11 @@ class VehicleGroupWindow : public BaseVehicleListWindow { /* We do not support VehicleClicked() here since the contextual action may only make sense for individual vehicles */ if (vindex == v->index) { - ShowVehicleListWindow(v); + if (vehgroup.NumVehicles() == 1) { + ShowVehicleViewWindow(v); + } else { + ShowVehicleListWindow(v); + } } break; } diff --git a/src/landscape.cpp b/src/landscape.cpp index 9c524bf6..6ea3af75 100644 --- a/src/landscape.cpp +++ b/src/landscape.cpp @@ -1400,7 +1400,7 @@ static void CalculateSnowLine() static uint8 CalculateDesertLine() { /* CalculateCoverageLine() runs from top to bottom, so we need to invert the coverage. */ - return _settings_game.game_creation.snow_line_height = CalculateCoverageLine(100 - _settings_game.game_creation.desert_coverage, 4); + return CalculateCoverageLine(100 - _settings_game.game_creation.desert_coverage, 4); } void GenerateLandscape(byte mode) diff --git a/src/lang/afrikaans.txt b/src/lang/afrikaans.txt index b5c9a79b..a598df62 100644 --- a/src/lang/afrikaans.txt +++ b/src/lang/afrikaans.txt @@ -990,6 +990,7 @@ STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}Kies die 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 diff --git a/src/lang/arabic_egypt.txt b/src/lang/arabic_egypt.txt index ba35fa90..bb89534d 100644 --- a/src/lang/arabic_egypt.txt +++ b/src/lang/arabic_egypt.txt @@ -965,6 +965,7 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}تسري STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}حدد هذا المربع للسماح لـ OpenTTD بمحاولة استخدام تسريع الأجهزة. سيتم تطبيق الإعداد الذي تم تغييره فقط عند إعادة تشغيل اللعبة STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}لن يعمل الإعداد إلا بعد إعادة تشغيل اللعبة + STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}حجم اللوحة STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}حدد العنصر المطلوب diff --git a/src/lang/basque.txt b/src/lang/basque.txt index df73bdc1..b9f89ac0 100644 --- a/src/lang/basque.txt +++ b/src/lang/basque.txt @@ -961,6 +961,7 @@ STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}Pantaila STR_GAME_OPTIONS_RESOLUTION_OTHER :besteak + STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Interfaze tamaina STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normala diff --git a/src/lang/belarusian.txt b/src/lang/belarusian.txt index a3807fc7..9a9c84ba 100644 --- a/src/lang/belarusian.txt +++ b/src/lang/belarusian.txt @@ -1299,6 +1299,7 @@ STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}Выба STR_GAME_OPTIONS_RESOLUTION_OTHER :Iншае + STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Памер элементаў інтэрфейсу STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Выберыце памер элементаў інтэрфейсу diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index e13a8830..3c1083f5 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -1007,6 +1007,9 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Acelera STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Marque esta caixa para permitir que o OpenTTD tente usar a aceleração de hardware. Qualquer mudança nesta configuração só será aplicada após reiniciar o jogo. STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}A configuração só terá efeito após reiniciar o jogo +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_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 diff --git a/src/lang/bulgarian.txt b/src/lang/bulgarian.txt index 3b174449..3f40d2c0 100644 --- a/src/lang/bulgarian.txt +++ b/src/lang/bulgarian.txt @@ -969,6 +969,7 @@ STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}Избо STR_GAME_OPTIONS_RESOLUTION_OTHER :друго + STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Интерфейс размер STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Изберете размера на интерфейс елемент за използване diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index 986535f3..c627b328 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -1007,6 +1007,9 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Accelera STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Seleccioneu aquesta opció per permetre que l'OpenTTD provi d'usar acceleració per maquinari. Si es canvia l'opció, s'aplicarà quan es reiniciï el programa. STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}La configuració tindrà efecte quan es reiniciï el programa. +STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync +STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Selecciona aquesta casella per activar la sincronització vertical de la pantalla. Els canvis s'aplicaran quan es reiniciï el programa. Només funciona si s'activa l'acceleració per maquinari. + 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 @@ -2689,7 +2692,7 @@ STR_LAND_AREA_INFORMATION_OWNER :{BLACK}Propieta STR_LAND_AREA_INFORMATION_ROAD_OWNER :{BLACK}Propietari de la carretera: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Propietari del rail del tramvia: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_RAIL_OWNER :{BLACK}Propietari del rail: {LTBLUE}{STRING} -STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY :{BLACK}Autoritat Local: {LTBLUE}{STRING} +STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY :{BLACK}Autoritat local: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE :Cap STR_LAND_AREA_INFORMATION_LANDINFO_COORDS :{BLACK}Coordenades: {LTBLUE}{NUM} x {NUM} x {NUM} ({STRING}) STR_LAND_AREA_INFORMATION_BUILD_DATE :{BLACK}Construït: {LTBLUE}{DATE_LONG} diff --git a/src/lang/croatian.txt b/src/lang/croatian.txt index 6be4993e..f534c46c 100644 --- a/src/lang/croatian.txt +++ b/src/lang/croatian.txt @@ -1086,6 +1086,7 @@ STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}Odaberi STR_GAME_OPTIONS_RESOLUTION_OTHER :ostalo + 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 diff --git a/src/lang/czech.txt b/src/lang/czech.txt index 2b0c8b1e..eefb64a7 100644 --- a/src/lang/czech.txt +++ b/src/lang/czech.txt @@ -1093,6 +1093,7 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Hardwaro STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Zaškrtni, pokud chceš OpenTTD povolit použití hardwarové akcelerace. Změněné nastavení bude aplikováno po restartu hry STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Nastavení vstoupí v platnost pouze po restartu hry + STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Velikost rozhraní STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Zvolit velikost prvků uživatelského rozhraní diff --git a/src/lang/danish.txt b/src/lang/danish.txt index 86d48f86..7f0e804f 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -991,6 +991,7 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :andet STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Hardware-acceleration + 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 diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index 8a5b74bf..799ce679 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -1006,6 +1006,7 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Hardware STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Selecteer dit vakje om OpenTTD hardwareversnelling te laten gebruiken. De gewijzigde instelling wordt pas van kracht nadat het spel opnieuw is gestart. STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}De instelling wordt pas van kracht als het spel opnieuw is gestart + STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Menupuntgrootte STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Kiest de grootte van bedieningselementen diff --git a/src/lang/english.txt b/src/lang/english.txt index 9f43788e..dfd0e766 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1006,6 +1006,9 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Hardware STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Check this box to allow OpenTTD to try to use hardware acceleration. A changed setting will only be applied upon game restart STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}The setting will only take effect after a game restart +STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync +STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Check this box to v-sync the screen. A changed setting will only be applied upon game restart. Only works with hardware acceleration enabled + STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Interface size STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Select the interface element size to use diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index cfb2f69b..159af46c 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -966,6 +966,7 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :other + STR_GAME_OPTIONS_BASE_GRF :{BLACK}Base graphics set STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Select the base graphics set to use STR_GAME_OPTIONS_BASE_GRF_STATUS :{RED}{NUM} missing/corrupted file{P "" s} diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index 138f82e4..272c9fe0 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -1006,6 +1006,9 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Hardware STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Check this box to allow OpenTTD to try to use hardware acceleration. A changed setting will only be applied upon game restart STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}The setting will only take effect after a game restart +STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync +STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Check this box to v-sync the screen. A changed setting will only be applied upon game restart. Only works with hardware acceleration enabled + STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Interface size STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Select the interface element size to use diff --git a/src/lang/esperanto.txt b/src/lang/esperanto.txt index 7df07fdd..c8893d3a 100644 --- a/src/lang/esperanto.txt +++ b/src/lang/esperanto.txt @@ -953,6 +953,7 @@ STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}Elektu u STR_GAME_OPTIONS_RESOLUTION_OTHER :alia + STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Interfacgrandeco STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normala diff --git a/src/lang/estonian.txt b/src/lang/estonian.txt index 8e5bad9b..2f6ac4b7 100644 --- a/src/lang/estonian.txt +++ b/src/lang/estonian.txt @@ -1063,6 +1063,7 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Riistvar STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Märkides selle ruudu, lubad OpenTTD-l üritada kasutada riistvarakiirendust. Muudetud seade omab mõju pärast mängu taaskäivitust STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Seade omab mõju alles pärast mängu taaskäivitust + STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Liidese suurus STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Vali kasutatav liideseelementide suurus diff --git a/src/lang/faroese.txt b/src/lang/faroese.txt index fb9edb11..e6519df5 100644 --- a/src/lang/faroese.txt +++ b/src/lang/faroese.txt @@ -947,6 +947,7 @@ 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} diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index f4ae079e..dfe1cba2 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -1006,6 +1006,9 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Laitteis STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Valitse tämä, jos haluat, että OpenTTD yrittää käyttää laitteistokiihdytystä. Muutettu asetus tulee voimaan vasta pelin uudelleenkäynnistyksen jälkeen. STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Asetus tulee voimaan vasta pelin uudelleenkäynnistyksen jälkeen +STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}Pystytahdistus +STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Valitse tämä ottaaksesi käyttöön näytön pystytahdistuksen. Muutettu asetus tulee voimaan vasta pelin uudelleenkäynnistyksen jälkeen. Edellyttää, että laitteistokiihdytys on käytössä. + 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 diff --git a/src/lang/french.txt b/src/lang/french.txt index 20e1104d..0ce8e81a 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -1007,6 +1007,9 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK} Accél STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Cochez cette case permet à OpenTTD d'utiliser l'accélération matérielle, si possible. Un paramètre modifié ne sera pris en compte qu'au redémarrage du jeu STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Les paramètres ne prendront effet qu'après le redémarrage du jeu +STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync +STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Cochez cette case pour activer la synchronisation verticale de l'écran. La modification de ce paramètres ne sera effective qu'après le redémarrage du jeu. Fonctionne uniquement si l’accélération matérielle est active + 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 @@ -1023,7 +1026,7 @@ 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_GRAPHICS :Graphiques {BLACK} +STR_GAME_OPTIONS_GRAPHICS :{BLACK} Graphiques STR_GAME_OPTIONS_REFRESH_RATE :{BLACK} Taux de rafraîchissement de l'affichage STR_GAME_OPTIONS_REFRESH_RATE_TOOLTIP :{BLACK} Sélectionnez la fréquence de rafraîchissement à utiliser @@ -3437,7 +3440,7 @@ STR_COMPANY_VIEW_RELOCATE_HQ :{BLACK}Déména STR_COMPANY_VIEW_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Reconstruire ailleurs le siège de la compagnie pour le prix de 1{NBSP}% de sa valeur.{}Shift-clic pour afficher seulement le coût estimé. STR_COMPANY_VIEW_INFRASTRUCTURE_BUTTON :{BLACK}Détails STR_COMPANY_VIEW_INFRASTRUCTURE_TOOLTIP :{BLACK}Afficher le détail des calculs d'infrastructure -STR_COMPANY_VIEW_GIVE_MONEY_BUTTON :Donner de l’argent +STR_COMPANY_VIEW_GIVE_MONEY_BUTTON :{BLACK}Donner de l’argent STR_COMPANY_VIEW_GIVE_MONEY_TOOLTIP :{BLACK}Donner de l’argent à cette compagnie STR_COMPANY_VIEW_NEW_FACE_BUTTON :{BLACK}Nouveau visage diff --git a/src/lang/gaelic.txt b/src/lang/gaelic.txt index 6755dd69..7e15bd03 100644 --- a/src/lang/gaelic.txt +++ b/src/lang/gaelic.txt @@ -1174,6 +1174,7 @@ STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}Tagh dù 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 diff --git a/src/lang/galician.txt b/src/lang/galician.txt index 6b10b581..d993322b 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -989,6 +989,7 @@ STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}Seleccio STR_GAME_OPTIONS_RESOLUTION_OTHER :outra + 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 diff --git a/src/lang/german.txt b/src/lang/german.txt index 2fbd98b7..c53a0504 100644 --- a/src/lang/german.txt +++ b/src/lang/german.txt @@ -1007,6 +1007,9 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Hardware STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Dieses Kästchen ankreuzen, um OpenTTD zu erlauben, die Hardwarebeschleunigung zu verwenden. Eine geänderte Einstellung wird nur beim Spielneustart wirksam STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Die Einstellung tritt nur nach einem Neustart des Spiels in Kraft +STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync +STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Dieses Kästchen ankreuzen, um VSync zu aktivieren. Eine geänderte Einstellung wird nur beim Spielneustart wirksam. Funktioniert nur mit aktivierter Hardwarebeschleunigung + 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 diff --git a/src/lang/greek.txt b/src/lang/greek.txt index 9be35fa4..6593038b 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -1101,6 +1101,7 @@ STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}Διαλ STR_GAME_OPTIONS_RESOLUTION_OTHER :άλλη + STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Μέγεθος διεπαφής STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Επιλέξτε το μέγεθος στοιχείου διεπαφής diff --git a/src/lang/hebrew.txt b/src/lang/hebrew.txt index 9e0a2be7..ba5d417a 100644 --- a/src/lang/hebrew.txt +++ b/src/lang/hebrew.txt @@ -988,6 +988,7 @@ STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}בחר STR_GAME_OPTIONS_RESOLUTION_OTHER :אחר + STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}גודל ממשק STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}בחר את ממשק גודל העצם לשימוש diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index b7064f1a..f98be25c 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -1070,6 +1070,9 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Hardvere STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Bekapcsolásával az OpenTTD hardveres gyorsítást próbál alkalmazni. A beállítás csak a játék újraindítása után lép érvénybe. STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Ez a beállítás csak a játék újraindítása után lép érvénybe +STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync (Vertikális Szinkronizáció) +STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Jelöld be ezt a négyzetet hogy engedélyezd a v-sync-et. A változtatás csak a játék újraindítása után fog érvényesülni. Kizárólag hardware gyorsítással működik! + 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 diff --git a/src/lang/icelandic.txt b/src/lang/icelandic.txt index 9aae3f35..778c0722 100644 --- a/src/lang/icelandic.txt +++ b/src/lang/icelandic.txt @@ -946,6 +946,7 @@ 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} diff --git a/src/lang/indonesian.txt b/src/lang/indonesian.txt index 69f0f6ab..20ee7ef7 100644 --- a/src/lang/indonesian.txt +++ b/src/lang/indonesian.txt @@ -946,6 +946,7 @@ STR_GAME_OPTIONS_CURRENCY_NTD :Dollar Taiwan B STR_GAME_OPTIONS_CURRENCY_CNY :Renminbi Cina (CNY) STR_GAME_OPTIONS_CURRENCY_HKD :Dollar Hong Kong (HKD) STR_GAME_OPTIONS_CURRENCY_INR :India Rupee (INR) +STR_GAME_OPTIONS_CURRENCY_MYR :Ringgit Malaysia (MYR) ############ end of currency region STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Berkendara di lajur kiri @@ -999,6 +1000,9 @@ STR_GAME_OPTIONS_RESOLUTION :{BLACK}Resolusi STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}Pilih resolusi layar yang diinginkan STR_GAME_OPTIONS_RESOLUTION_OTHER :lainnya +STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Akselerasi perangkat keras +STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Pengaturan hanya akan berlaku setelah game dimulai ulang + STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Ukuran antarmuka STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Pilih ukuran elemen antarmuka yang akan digunakan @@ -1016,7 +1020,10 @@ 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 +STR_GAME_OPTIONS_REFRESH_RATE :{BLACK}Menampilkan kecepatan refresh +STR_GAME_OPTIONS_REFRESH_RATE_WARNING :{WHITE}Kecepatan refresh yang lebih tinggi dari 60Hz dapat memengaruhi kinerja. STR_GAME_OPTIONS_BASE_GRF :{BLACK}Set Grafik Dasar STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Pilih grafik dasar yang digunakan @@ -1112,6 +1119,8 @@ STR_TERRAIN_TYPE_FLAT :Datar STR_TERRAIN_TYPE_HILLY :Berbukit STR_TERRAIN_TYPE_MOUNTAINOUS :Pegunungan STR_TERRAIN_TYPE_ALPINIST :Pemanjat Gunung +STR_TERRAIN_TYPE_CUSTOM :Ketinggian Kustom +STR_TERRAIN_TYPE_CUSTOM_VALUE :Ketinggian Kustom ({NUM}) STR_CITY_APPROVAL_PERMISSIVE :Selalu boleh STR_CITY_APPROVAL_TOLERANT :Toleran @@ -1193,6 +1202,8 @@ STR_CONFIG_SETTING_DISASTERS_HELPTEXT :Mengaktifkan be STR_CONFIG_SETTING_CITY_APPROVAL :Sikap pemerintah kota terhadap restrukturasi area: {STRING} STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT :Pilih seberapa banyak dampak kebisingan dan lingkungan oleh perusahaan terhadap peringkat kota karena pembangunan di daerah +STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT :Ketinggian peta maksimum: {STRING} +STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT_HELPTEXT :Tetapkan ketinggian maksimum medan peta. Dengan "(otomatis)" nilai yang baik akan diambil setelah pembuatan medan STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN :{WHITE}Kamu tidak bisa mengubah ketinggian peta maksimum di angka itu. Setidaknya ada satu gunung di peta yang lebih tinggi STR_CONFIG_SETTING_AUTOSLOPE :Ijinkan pembentukan slop dibawah bangunan, rel, dsb.: {STRING} STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :Ijinkan pembentukan tanah dibawah bangunan dan trek tanpa merusaknya @@ -1338,6 +1349,9 @@ STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Jarak maksimal STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Kilang minyak hanya dibangun pada tepi peta atau pantai STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Tinggi garis salju: {STRING} STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Mengatur ketinggian di mana salju akan muncul. Salju juga akan mempengaruhi pengembangan industri dan persyaratan untuk pertumbuhan kota +STR_CONFIG_SETTING_DESERT_COVERAGE :Cakupan gurun: {STRING} +STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Kontrol perkiraan jumlah gurun di lanskap tropis. Gurun juga mempengaruhi generasi industri. Hanya digunakan selama pembuatan peta +STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Kekasaran daratan: {STRING} STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(hanya TerraGenesis) Memilih frekuensi bukit: Bentang darat rata punya bukit yang lebih sedikit dan lebih lebar. Bentang darat bergunung punya lebih banyak bukit, dan ini mungkin akan terlihat lebih membosankan STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Sangat halus @@ -1643,12 +1657,15 @@ STR_CONFIG_SETTING_ZOOM_MIN :Tingkat Perbesa STR_CONFIG_SETTING_ZOOM_MIN_HELPTEXT :Perbesaran viewport maksimal. Semakin besar semakin banyak memori yang dibutuhkan STR_CONFIG_SETTING_ZOOM_MAX :Tingkat zoom out Maksimal: {STRING} STR_CONFIG_SETTING_ZOOM_MAX_HELPTEXT :Pengecilan maksimum untuk viewport. Semakin kecil semakin tidak jelas +STR_CONFIG_SETTING_SPRITE_ZOOM_MIN :Sprite resolusi tertinggi untuk digunakan: {STRING} STR_CONFIG_SETTING_ZOOM_LVL_MIN :4x STR_CONFIG_SETTING_ZOOM_LVL_IN_2X :2x STR_CONFIG_SETTING_ZOOM_LVL_NORMAL :Normal STR_CONFIG_SETTING_ZOOM_LVL_OUT_2X :2x STR_CONFIG_SETTING_ZOOM_LVL_OUT_4X :4x STR_CONFIG_SETTING_ZOOM_LVL_OUT_8X :8x +STR_CONFIG_SETTING_SPRITE_ZOOM_LVL_IN_2X :2x +STR_CONFIG_SETTING_SPRITE_ZOOM_LVL_NORMAL :1x STR_CONFIG_SETTING_TOWN_GROWTH :Kecepatan pertumbuhan kota: {STRING} STR_CONFIG_SETTING_TOWN_GROWTH_HELPTEXT :Kecepatan pertumbuhan kota STR_CONFIG_SETTING_TOWN_GROWTH_NONE :Tidak tumbuh @@ -1783,6 +1800,7 @@ STR_CONFIG_ERROR_OUT_OF_MEMORY :{WHITE}Kehabisa STR_CONFIG_ERROR_SPRITECACHE_TOO_BIG :{WHITE}Mengalokasikan {BYTES} 'spritecache' gagal. 'Spritecache' dikurangi ke {BYTES}. Ini akan kurangi kinerja OpenTTD. Untuk kurangi kebutuhan memori anda bisa coba matikan grafik 32bpp dan/atau tingkat pembesaran # Video initalization errors +STR_VIDEO_DRIVER_ERROR_NO_HARDWARE_ACCELERATION :{WHITE}... tidak ditemukan GPU yang kompatibel. Akselerasi perangkat keras dinonaktifkan # Intro window STR_INTRO_CAPTION :{WHITE}OpenTTD {REV} @@ -2314,6 +2332,8 @@ STR_MISSING_GRAPHICS_SET_MESSAGE :{BLACK}OpenTTD STR_MISSING_GRAPHICS_YES_DOWNLOAD :{BLACK}Ya, download file gambar STR_MISSING_GRAPHICS_NO_QUIT :{BLACK}Tidak, tutup OpenTTD +STR_MISSING_GRAPHICS_ERROR_TITLE :{WHITE}Gagal Mendownload +STR_MISSING_GRAPHICS_ERROR_QUIT :{BLACK}Keluar OpenTTD # Transparency settings window STR_TRANSPARENCY_CAPTION :{WHITE}Pengaturan Transparasi @@ -2864,6 +2884,9 @@ STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Jumlah Kota: STR_MAPGEN_DATE :{BLACK}Tgl: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Jumlah industri: +STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}Kurangi satu ketinggian maksimum puncak tertinggi di peta +STR_MAPGEN_SNOW_COVERAGE_DOWN :{BLACK}Kurangi cakupan salju hingga sepuluh persen +STR_MAPGEN_DESERT_COVERAGE :{BLACK}Cakupan gurun: STR_MAPGEN_LAND_GENERATOR :{BLACK}Algoritma pulau: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Jenis dataran: STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Area perairan: @@ -2889,6 +2912,7 @@ STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Nama Pet STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Luas: STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM} +STR_MAPGEN_SNOW_COVERAGE_QUERY_CAPT :{WHITE}Cakupan salju (dalam %) STR_MAPGEN_START_DATE_QUERY_CAPT :{WHITE}Ganti Tahun Permulaan # SE Map generation @@ -3179,6 +3203,7 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Kolusi STR_GOALS_CAPTION :{WHITE}{COMPANY} Target STR_GOALS_SPECTATOR_CAPTION :{WHITE}Target Global STR_GOALS_SPECTATOR :Target Global +STR_GOALS_GLOBAL_BUTTON :{BLACK}Global STR_GOALS_TEXT :{ORANGE}{STRING} STR_GOALS_NONE :{ORANGE}- Tidak ada - STR_GOALS_PROGRESS :{ORANGE}{STRING} @@ -3553,6 +3578,7 @@ STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT :{BLACK}Daya Ger STR_PURCHASE_INFO_REFITTABLE_TO :{BLACK}Kargo dapat di ganti untuk: {GOLD}{STRING} STR_PURCHASE_INFO_ALL_TYPES :Semua jenis kargo STR_PURCHASE_INFO_NONE :Tidak Ada +STR_PURCHASE_INFO_ENGINES_ONLY :Hanya Lokomotif STR_PURCHASE_INFO_ALL_BUT :Semua tapi tidak untuk {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}Traksi Maks.: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Jangkauan: {GOLD}{COMMA} kotak diff --git a/src/lang/irish.txt b/src/lang/irish.txt index 6d0a5224..a6b192cf 100644 --- a/src/lang/irish.txt +++ b/src/lang/irish.txt @@ -969,6 +969,7 @@ STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}Roghnaig STR_GAME_OPTIONS_RESOLUTION_OTHER :eile + 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 diff --git a/src/lang/italian.txt b/src/lang/italian.txt index 4de8c45e..2627a7b6 100644 --- a/src/lang/italian.txt +++ b/src/lang/italian.txt @@ -1008,6 +1008,7 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Accelera STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Seleziona questa opzione per consentire a OpenTTD di utilizzare l'accelerazione hardware. Eventuali cambiamenti avranno effetto solo dopo un riavvio del gioco STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Le nuove impostazioni avranno effetto solo dopo un riavvio del gioco + 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 diff --git a/src/lang/japanese.txt b/src/lang/japanese.txt index 48725eef..228b16df 100644 --- a/src/lang/japanese.txt +++ b/src/lang/japanese.txt @@ -982,6 +982,7 @@ STR_GAME_OPTIONS_RESOLUTION_ITEM :{NUM}x{NUM} STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}ハードウェアアクセラレーション + STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}インターフェイスのサイズ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}インターフェイス上の単位サイズを指定します diff --git a/src/lang/korean.txt b/src/lang/korean.txt index fbb9847c..38d29715 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -954,7 +954,7 @@ STR_GAME_OPTIONS_CURRENCY_MYR :말레이시아 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_FRAME :{BLACK}도시 이름: STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}도시 이름 스타일을 선택하세요 ############ start of townname region @@ -1004,9 +1004,12 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :기타 STR_GAME_OPTIONS_RESOLUTION_ITEM :{NUM}x{NUM} STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}하드웨어 가속 -STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}OpenTTD가 하드웨어 가속을 사용하게 하려면 체크하세요. 변경된 설정은 게임을 재시작한 뒤에 적용됩니다. +STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}OpenTTD가 하드웨어 가속을 사용하게 하려면 체크하세요. 변경한 설정은 게임을 재시작한 뒤에 적용될 것입니다. STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}이 설정은 게임을 재시작한 뒤에 적용될 것입니다 +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}인터페이스의 크기를 선택합니다. @@ -1534,20 +1537,20 @@ STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY :스크립트당 STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_HELPTEXT :스크립트 하나가 강제 종료되기 전까지 사용할 수 있는 메모리의 양입니다. 크기가 큰 맵에서는 값을 크게 설정해야할 수도 있습니다. STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_VALUE :{COMMA} MiB -STR_CONFIG_SETTING_SERVINT_ISPERCENT :신뢰도에 따른 정비 설정: {STRING} +STR_CONFIG_SETTING_SERVINT_ISPERCENT :신뢰도에 따른 점검 설정: {STRING} STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :차량 점검 방식을 "마지막 점검 이후 지난 시간 (또는) 최대 신뢰도에 대한 차량 신뢰도의 일정 퍼센트 하락 여부" 중에 하나로 선택합니다. STR_CONFIG_SETTING_SERVINT_TRAINS :열차에 대한 기본 점검 기준: {STRING} STR_CONFIG_SETTING_SERVINT_TRAINS_HELPTEXT :열차에 따로 점검 기간이 설정되어있지 않은 경우에 사용할 기본 점검 기간을 설정합니다. STR_CONFIG_SETTING_SERVINT_VALUE :{COMMA}{NBSP}일/% STR_CONFIG_SETTING_SERVINT_DISABLED :사용 안 함 STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES :차량에 대한 기본 점검 기준: {STRING} -STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES_HELPTEXT :차량 정비 설정을 하지 않은 경우, 기본값으로 사용할 정비 주기를 설정합니다. +STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES_HELPTEXT :차량 점검 설정을 하지 않은 경우, 기본값으로 사용할 점검 주기를 설정합니다 STR_CONFIG_SETTING_SERVINT_AIRCRAFT :항공기에 대한 기본 점검 기준: {STRING} STR_CONFIG_SETTING_SERVINT_AIRCRAFT_HELPTEXT :항공기에 따로 점검 기간이 설정되어있지 않은 경우에 사용할 기본 점검 기간을 설정합니다. STR_CONFIG_SETTING_SERVINT_SHIPS :선박에 대한 기본 점검 기준: {STRING} STR_CONFIG_SETTING_SERVINT_SHIPS_HELPTEXT :선박에 따로 점검 기간이 설정되어있지 않은 경우에 사용할 기본 점검 기간을 설정합니다. -STR_CONFIG_SETTING_NOSERVICE :차량 고장 설정이 비활성화된 경우 정비하지 않음: {STRING} -STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :이 설정을 켜면, 차량이 고장나지 않도록 설정되어 있는 경우 차량이 정비를 하러 가지 않습니다. +STR_CONFIG_SETTING_NOSERVICE :차량 고장 설정을 껐으면 점검을 하지 않음: {STRING} +STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :이 설정을 켜면, 차량이 고장나지 않도록 설정되어 있는 경우 차량이 자동으로 점검을 하러 가지 않습니다 STR_CONFIG_SETTING_WAGONSPEEDLIMITS :화물차 속력 제한 적용: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :이 설정을 켜면, 화물차의 속력 제한값에 따라 열차의 최대 속력을 제한합니다. STR_CONFIG_SETTING_DISABLE_ELRAILS :전기 철도를 사용하지 않음: {STRING} @@ -1723,38 +1726,38 @@ STR_CONFIG_SETTING_SHORT_PATH_SATURATION_HELPTEXT :종종 두 역 STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY :속력 단위: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :속력를 표시할 때 선택한 단위를 사용하여 나타냅니다. -STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :임페리얼법 (mph) +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :야드파운드법 (mph) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :미터법 (km/h) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :국제표준규격 (m/s) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS :게임 단위 (칸/일) STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :차량의 힘 단위: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :출력할 차량의 힘 단위를 선택합니다. -STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_IMPERIAL :임페리얼법 (마력) +STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_IMPERIAL :야드파운드법 (마력) STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_METRIC :미터법 (마력) STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_SI :국제표준규격 (kW) STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT :무게 단위: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_HELPTEXT :무게를 표시할 때 선택한 단위를 사용하여 나타냅니다. -STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_IMPERIAL :임페리얼법 (미국 톤) +STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_IMPERIAL :야드파운드법 (미국 톤) STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_METRIC :미터법 (톤) STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_SI :국제표준규격 (kg) STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME :부피 단위: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_HELPTEXT :부피를 표시할 때 선택한 단위를 사용하여 나타냅니다. -STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_IMPERIAL :임페리얼법 (갤런) +STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_IMPERIAL :야드파운드법 (갤런) STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_METRIC :미터법 (리터) STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_SI :국제표준규격 (m³) STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE :견인 효과 단위: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_HELPTEXT :견인 효과(견인력)를 표시할 때 선택한 단위를 사용하여 나타냅니다. -STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_IMPERIAL :임페리얼법 (파운드중) +STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_IMPERIAL :야드파운드법 (파운드중) STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_METRIC :미터법 (kgf) STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :국제표준규격 (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :높이 단위: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :높이를 표시할 때 선택한 단위를 사용하여 나타냅니다. -STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :임페리얼법 (ft) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :야드파운드법 (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :미터법 (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :국제표준규격 (m) @@ -2406,7 +2409,7 @@ STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :자기부상열 STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}선로를 건설합니다. CTRL 키를 누르면 건설모드/철거모드로 전환합니다. SHIFT 키를 누른 채로 사용하면 예상 비용을 볼 수 있습니다 STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}자동건설 모드로 선로를 건설합니다. CTRL 키를 누르면 건설/철거모드를 바꿀 수 있습니다. SHIFT 키를 누른 채로 사용하면 예상 비용을 볼 수 있습니다 -STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}차량기지를 건설합니다. 차량을 구입하거나 정비를 할 수 있습니다. SHIFT 키를 누른 채로 사용하면 예상 비용을 볼 수 있습니다 +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}차량기지를 건설합니다. 차량을 구입하거나 점검을 할 수 있습니다. SHIFT 키를 누른 채로 사용하면 예상 비용을 볼 수 있습니다 STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}선로에 경유지를 설치합니다. CTRL 키를 사용하면 같은 이름의 경유지를 서로 떨어진 곳에 지을 수 있습니다. SHIFT 키를 누른 채로 사용하면 예상 비용을 볼 수 있습니다 STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}철도역을 짓습니다. CTRL 키를 사용하면 같은 이름의 역을 서로 떨어진 곳에 지을 수 있습니다. SHIFT 키를 누른 채로 사용하면 예상 비용을 볼 수 있습니다 STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}신호기를 설치합니다. CTRL 키를 누르면 구식/전자식으로 전환합니다.{}선로를 따라 드래그해서 설치할 수 있습니다. CTRL 키를 누른 채로 드래그하면 다음 분기점이나 다음 신호기까지 신호기를 설치합니다.{}CTRL 키를 누른 채 클릭하면 신호기 선택 창을 전환합니다. SHIFT 키를 누른 채로 사용하면 예상 비용을 볼 수 있습니다 @@ -2487,8 +2490,8 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION :{BLACK}도로 STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}전차 선로를 짓습니다. CTRL 키를 누르고 있으면 건설/제거 모드를 바꿀 수 있습니다. SHIFT 키를 누른 채로 사용하면 예상 비용을 볼 수 있습니다 STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}자동건설 모드로 도로를 짓습니다. CTRL 키를 누르고 있으면 건설/제거 모드를 바꿀 수 있습니다. SHIFT 키를 누른 채로 사용하면 예상 비용을 볼 수 있습니다 STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}자동건설 모드로 전차 선로를 짓습니다. CTRL 키를 누르고 있으면 건설/제거 모드를 바꿀 수 있습니다. SHIFT 키를 누른 채로 사용하면 예상 비용을 볼 수 있습니다 -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}차고지를 건설합니다. 차량을 구입하거나 정비를 할 수 있습니다. SHIFT 키를 누른 채로 사용하면 예상 비용을 볼 수 있습니다 -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}전차 차고지를 건설합니다. 차량을 구입하거나 정비를 할 수 있습니다. SHIFT 키를 누른 채로 사용하면 예상 비용을 볼 수 있습니다 +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}차고지를 건설합니다. 차량을 구입하거나 점검을 할 수 있습니다. SHIFT 키를 누른 채로 사용하면 예상 비용을 볼 수 있습니다 +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}전차 차고지를 건설합니다. 차량을 구입하거나 점검을 할 수 있습니다. SHIFT 키를 누른 채로 사용하면 예상 비용을 볼 수 있습니다 STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}버스 정류장을 짓습니다. CTRL 키를 사용하면 근처 정류장과 연결할 수 있습니다. SHIFT 키를 누른 채로 사용하면 예상 비용을 볼 수 있습니다 STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}여객 전차역을 짓습니다. CTRL 키를 사용하면 근처 역과 연결할 수 있습니다. SHIFT 키를 누른 채로 사용하면 예상 비용을 볼 수 있습니다 STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}트럭 적하장을 짓습니다. CTRL 키를 사용하면 근처 적하장과 연결할 수 있습니다. SHIFT 키를 누른 채로 사용하면 예상 비용을 볼 수 있습니다 @@ -3090,7 +3093,7 @@ STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING}{G 1 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_AFTER_TRANSLATED_FILE :GRF 파일이 번역을 위해 만들어졌습니다 -STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :NewGRF이 너무 많습니다 +STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :NewGRF가 너무 많습니다 STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :{2:STRING}{G 2 "을" "를"} 포함한 정적 NewGRF {1:STRING}{G 1 "을" "를"} 불러오는 것은 비동기화를 일으킬 수 있습니다 STR_NEWGRF_ERROR_UNEXPECTED_SPRITE :예기치 않은 스프라이트 (스프라이트 {3:NUM}) STR_NEWGRF_ERROR_UNKNOWN_PROPERTY :알려지지 않은 액션 0 속성 {4:HEX} (스프라이트 {3:NUM}) @@ -3124,7 +3127,7 @@ STR_NEWGRF_LIST_COMPATIBLE :{YELLOW}호환 STR_NEWGRF_LIST_MISSING :{RED}파일 없음 # NewGRF 'it's broken' warnings -STR_NEWGRF_BROKEN :{WHITE}'{0:STRING}' NewGRF이 적용되는 과정에서 비동기화나 충돌이 일어날 수 있습니다 +STR_NEWGRF_BROKEN :{WHITE}'{0:STRING}' NewGRF가 적용되는 과정에서 비동기화나 충돌이 일어날 수 있습니다 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}'의 수송량이 변경되었습니다 @@ -3529,7 +3532,7 @@ STR_VEHICLE_LIST_AVAILABLE_ENGINES_TOOLTIP :{BLACK}이 차 STR_VEHICLE_LIST_MANAGE_LIST :{BLACK}관리 STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}이 목록에 있는 모든 열차에 지시를 내려 관리합니다 STR_VEHICLE_LIST_REPLACE_VEHICLES :차량 교체 -STR_VEHICLE_LIST_SEND_FOR_SERVICING :정비하러 보내기 +STR_VEHICLE_LIST_SEND_FOR_SERVICING :점검하러 보내기 STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :차량기지로 보내기 STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :차고지로 보내기 @@ -3748,7 +3751,7 @@ STR_DEPOT_MASS_START_HANGAR_TOOLTIP :{BLACK}이 격 STR_DEPOT_SELL_CONFIRMATION_TEXT :{YELLOW}이 안에 있는 모든 차량을 판매하려고 합니다. 계속하시겠습니까? # Engine preview window -STR_ENGINE_PREVIEW_CAPTION :{WHITE}차량 개발자로부터의 메시지 +STR_ENGINE_PREVIEW_CAPTION :{WHITE}차량 개발자가 보낸 메시지 STR_ENGINE_PREVIEW_MESSAGE :{GOLD}저희는 이제 막 새로운 {STRING}{G 0 "을" "를"} 개발했습니다. 1년 먼저 이 차량을 사용하셔서 모두에게 공개되기 전에 잘 작동하는지 확인해주시겠습니까? STR_ENGINE_PREVIEW_RAILROAD_LOCOMOTIVE :{G=f}철도 기관차 @@ -3823,10 +3826,10 @@ STR_VEHICLE_VIEW_ROAD_VEHICLE_CENTER_TOOLTIP :{BLACK}이 차 STR_VEHICLE_VIEW_SHIP_CENTER_TOOLTIP :{BLACK}이 선박의 위치로 화면을 이동합니다. 더블 클릭하면 이 선박을 따라 화면이 움직입니다. CTRL+클릭하면 이 선박 위치를 기준으로 외부 화면을 엽니다 STR_VEHICLE_VIEW_AIRCRAFT_CENTER_TOOLTIP :{BLACK}이 항공기의 위치로 화면을 이동합니다. 더블 클릭하면 이 항공기를 따라 화면이 움직입니다. CTRL+클릭하면 이 항공기 위치를 기준으로 외부 화면을 엽니다 -STR_VEHICLE_VIEW_TRAIN_SEND_TO_DEPOT_TOOLTIP :{BLACK}열차를 차량기지로 보냅니다. CTRL+클릭하면 정비를 하러 차량기지에 들르기만 합니다 -STR_VEHICLE_VIEW_ROAD_VEHICLE_SEND_TO_DEPOT_TOOLTIP :{BLACK}차량을 차고지로 보냅니다. CTRL+클릭하면 정비를 하러 차고지에 들르기만 합니다 -STR_VEHICLE_VIEW_SHIP_SEND_TO_DEPOT_TOOLTIP :{BLACK}선박을 정박소로 보냅니다. CTRL+클릭하면 정비를 하러 정박소에 들르기만 합니다 -STR_VEHICLE_VIEW_AIRCRAFT_SEND_TO_DEPOT_TOOLTIP :{BLACK}항공기를 격납고로 보냅니다. CTRL+클릭하면 정비를 하러 격납고에 들르기만 합니다 +STR_VEHICLE_VIEW_TRAIN_SEND_TO_DEPOT_TOOLTIP :{BLACK}열차를 차량기지로 보냅니다. CTRL+클릭하면 점검을 하러 차량기지에 들르기만 합니다 +STR_VEHICLE_VIEW_ROAD_VEHICLE_SEND_TO_DEPOT_TOOLTIP :{BLACK}차량을 차고지로 보냅니다. CTRL+클릭하면 점검을 하러 차고지에 들르기만 합니다 +STR_VEHICLE_VIEW_SHIP_SEND_TO_DEPOT_TOOLTIP :{BLACK}선박을 정박소로 보냅니다. CTRL+클릭하면 점검을 하러 정박소에 들르기만 합니다 +STR_VEHICLE_VIEW_AIRCRAFT_SEND_TO_DEPOT_TOOLTIP :{BLACK}항공기를 격납고로 보냅니다. CTRL+클릭하면 점검을 하러 격납고에 들르기만 합니다 STR_VEHICLE_VIEW_CLONE_TRAIN_INFO :{BLACK}객차/화차를 포함한 열차 전체를 복제합니다. CTRL+클릭하면 경로도 함께 공유됩니다. SHIFT+클릭하면 예상 비용을 볼 수 있습니다 STR_VEHICLE_VIEW_CLONE_ROAD_VEHICLE_INFO :{BLACK}차량을 복제합니다. CTRL+클릭하면 경로도 함께 공유됩니다. SHIFT+클릭하면 예상 비용을 볼 수 있습니다 @@ -3914,12 +3917,12 @@ STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}수송 STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}환승 수익: {LTBLUE}{CURRENCY_LONG} -STR_VEHICLE_DETAILS_SERVICING_INTERVAL_DAYS :{BLACK}정비 간격: {LTBLUE}{COMMA}일{BLACK}마다 마지막 정비 날짜: {LTBLUE}{DATE_LONG} -STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}정비 기준: {LTBLUE}{COMMA}%{BLACK} 떨어지면 마지막 정비 날짜: {LTBLUE}{DATE_LONG} +STR_VEHICLE_DETAILS_SERVICING_INTERVAL_DAYS :{BLACK}점검 간격: {LTBLUE}{COMMA}일{BLACK}마다{NBSP} 마지막 점검 날짜: {LTBLUE}{DATE_LONG} +STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}점검 기준: {LTBLUE}{COMMA}%{BLACK} 떨어지면 마지막 점검 날짜: {LTBLUE}{DATE_LONG} STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP :{BLACK}점검 기준값을 10만큼 올립니다. CTRL+클릭하면 점검 기준값을 5만큼 올립니다 STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP :{BLACK}점검 기준값을 10만큼 내립니다. CTRL+클릭하면 점검 기준값을 5만큼 내립니다 -STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}정비 기준 설정을 변경합니다 +STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}점검 기준 설정을 변경합니다 STR_VEHICLE_DETAILS_DEFAULT :기본 STR_VEHICLE_DETAILS_DAYS :날짜 STR_VEHICLE_DETAILS_PERCENT :신뢰도 @@ -4017,11 +4020,11 @@ STR_ORDER_REFIT_AUTO_TOOLTIP :{BLACK}이 경 STR_ORDER_DROP_REFIT_AUTO :특정 화물로 STR_ORDER_DROP_REFIT_AUTO_ANY :이용 가능한 화물로 -STR_ORDER_SERVICE :{BLACK}정비 +STR_ORDER_SERVICE :{BLACK}점검 STR_ORDER_DROP_GO_ALWAYS_DEPOT :항상 감 -STR_ORDER_DROP_SERVICE_DEPOT :필요하면 정비 +STR_ORDER_DROP_SERVICE_DEPOT :필요하면 점검 STR_ORDER_DROP_HALT_DEPOT :멈춤 -STR_ORDER_SERVICE_TOOLTIP :{BLACK}정비가 필요하지 않으면 이 경로를 건너뜁니다 +STR_ORDER_SERVICE_TOOLTIP :{BLACK}점검이 필요하지 않으면 이 경로를 건너뜁니다 STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}경로를 건너뛰기 위한 비교 조건을 선택합니다 @@ -4030,7 +4033,7 @@ STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE :적재율 STR_ORDER_CONDITIONAL_RELIABILITY :신뢰도 STR_ORDER_CONDITIONAL_MAX_SPEED :최고 속력 STR_ORDER_CONDITIONAL_AGE :연령 (년) -STR_ORDER_CONDITIONAL_REQUIRES_SERVICE :정비 필요성 +STR_ORDER_CONDITIONAL_REQUIRES_SERVICE :점검 필요성 STR_ORDER_CONDITIONAL_UNCONDITIONALLY :항상 STR_ORDER_CONDITIONAL_REMAINING_LIFETIME :남은 수명 (년) STR_ORDER_CONDITIONAL_MAX_RELIABILITY :최대 신뢰도 @@ -4062,7 +4065,7 @@ STR_ORDER_GO_TO_NEAREST_DEPOT :가까운 차 STR_ORDER_GO_TO_NEAREST_HANGAR :가까운 격납고로 STR_ORDER_CONDITIONAL :조건부 경로 건너뛰기 STR_ORDER_SHARE :경로 공유하기 -STR_ORDERS_GO_TO_TOOLTIP :{BLACK}선택된 경로 바로 전이나 목록 맨 끝에 새 경로를 삽입합니다. CTRL 키와 함께 누르면, 역에서는 '아무 화물이나 가득 싣기'로, 경유지에서는 '직행'으로, 차량기지에서는 '점검'으로 지정됩니다. '공유된 경로'를 클릭하거나 CTRL 키를 누르면 선택했던 차량과 이 차량의 경로를 공유하게 됩니다. 단순히 클릭하면 그 차량의 경로를 복사하기만 합니다. 차량기지를 경로에 포함시키면 이 차량은 자동 정비를 할 수 없게 됩니다 +STR_ORDERS_GO_TO_TOOLTIP :{BLACK}선택된 경로 바로 전이나 목록 맨 끝에 새 경로를 삽입합니다. CTRL 키와 함께 누르면, 역에서는 '아무 화물이나 가득 싣기'로, 경유지에서는 '직행'으로, 차량기지에서는 '점검'으로 지정됩니다. '공유된 경로'를 클릭하거나 CTRL 키를 누르면 선택했던 차량과 이 차량의 경로를 공유하게 됩니다. 단순히 클릭하면 그 차량의 경로를 복사하기만 합니다. 차량기지를 경로에 포함시키면 이 차량은 자동 점검를 할 수 없게 됩니다 STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP :{BLACK}이 경로를 공유하고 있는 모든 차량을 표시합니다. @@ -4070,8 +4073,8 @@ STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP :{BLACK}이 경 STR_ORDER_GO_TO_WAYPOINT :완행 경유 {WAYPOINT} STR_ORDER_GO_NON_STOP_TO_WAYPOINT :직행 경유 {WAYPOINT} -STR_ORDER_SERVICE_AT :완행 정비 -STR_ORDER_SERVICE_NON_STOP_AT :직행 정비 +STR_ORDER_SERVICE_AT :완행 점검 +STR_ORDER_SERVICE_NON_STOP_AT :직행 점검 STR_ORDER_NEAREST_DEPOT :가까운 STR_ORDER_NEAREST_HANGAR :가까운 격납고 @@ -4679,7 +4682,7 @@ STR_ERROR_SHIP_NOT_AVAILABLE :{WHITE}이 선 STR_ERROR_AIRCRAFT_NOT_AVAILABLE :{WHITE}이 항공기는 사용할 수 없는 상태입니다 STR_ERROR_TOO_MANY_VEHICLES_IN_GAME :{WHITE}게임에 차량이 너무 많습니다! -STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}정비 간격 설정을 바꿀 수 없습니다... +STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}점검 간격 설정을 바꿀 수 없습니다... STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... 차량이 파괴되었습니다 diff --git a/src/lang/latin.txt b/src/lang/latin.txt index a29caead..bb12707a 100644 --- a/src/lang/latin.txt +++ b/src/lang/latin.txt @@ -1166,6 +1166,7 @@ STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}Eligere 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 diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt index b5993c60..21363564 100644 --- a/src/lang/latvian.txt +++ b/src/lang/latvian.txt @@ -1004,6 +1004,7 @@ STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}Ekrāna STR_GAME_OPTIONS_RESOLUTION_OTHER :Cita + 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 diff --git a/src/lang/lithuanian.txt b/src/lang/lithuanian.txt index 188791cd..a1e9e63c 100644 --- a/src/lang/lithuanian.txt +++ b/src/lang/lithuanian.txt @@ -1211,6 +1211,7 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Aparatin STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Pažymėkite šį langelį, jei norite, kad OpenTTD taikytų aparatinį spartinimą. Kad nuostata įsigaliotų, reiks perkrauti OpenTTD STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Kad pakeitimai įsigaliotų, reikia paleisti OpenTTD iš naujo + 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į diff --git a/src/lang/luxembourgish.txt b/src/lang/luxembourgish.txt index bc977556..688daa89 100644 --- a/src/lang/luxembourgish.txt +++ b/src/lang/luxembourgish.txt @@ -1006,6 +1006,7 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Hardware STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Dës Optioun wielen, dass OpenTTD Hardwarebeschleunigung dierf notzen. Wäert just geännert ginn wann d'Spill nei gestart gëtt STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}D'Astellung huet réicht en Afloss no engem Neistart vum Spill + 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 diff --git a/src/lang/malay.txt b/src/lang/malay.txt index 7346d8ed..03b92a03 100644 --- a/src/lang/malay.txt +++ b/src/lang/malay.txt @@ -944,6 +944,7 @@ STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}Pilih re 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 diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index 3cec1042..8127dd97 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -1008,6 +1008,9 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Maskinva STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Merk av i denne boksen for å la OpenTTD prøve å bruke maskinvareakselerasjon. En endret innstilling blir bare brukt ved omstart av spillet STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Innstillingen vil ikke tre i kraft før spillet er restartet +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 diff --git a/src/lang/norwegian_nynorsk.txt b/src/lang/norwegian_nynorsk.txt index 8c1ff1ee..4a2bf807 100644 --- a/src/lang/norwegian_nynorsk.txt +++ b/src/lang/norwegian_nynorsk.txt @@ -971,6 +971,7 @@ STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}Vel skje 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 diff --git a/src/lang/polish.txt b/src/lang/polish.txt index 8860ae62..1c7902b4 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -1386,6 +1386,9 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Przyspie STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Zaznacz to pole, aby zezwolić OpenTTD na użycie przyspieszenia sprzętowego. Ustawienia zostaną zastosowane dopiero po ponownym uruchomieniu gry. STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Ustawienie to zacznie obowiązywać dopiero po ponownym uruchomieniu gry. +STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}Synchronizacja pionowa +STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Zaznacz to pole aby włączyć synchronizację pionową. Zmiany zostaną zastosowane po restarcie gry. Działa tylko z włączoną akceleracją sprzętową. + STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Rozmiar interfejsu STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Wybierz rozmiar elementów interfejsu @@ -2406,10 +2409,10 @@ STR_NETWORK_SERVER_LIST_JOIN_GAME :{BLACK}Przyłą STR_NETWORK_SERVER_LIST_REFRESH :{BLACK}Odśwież serwer STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}Odśwież informacje o serwerze -STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET :Przeszukaj internet +STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET :{BLACK}Przeszukaj internet STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET_TOOLTIP :{BLACK}Znajdź w internecie serwery publiczne -STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN :Przeszukaj LAN -STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN_TOOLTIP :Znajdź serwery w sieci lokalnej +STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN :{BLACK}Przeszukaj LAN +STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN_TOOLTIP :{BLACK}Znajdź serwery w sieci lokalnej STR_NETWORK_SERVER_LIST_ADD_SERVER :{BLACK}Zapisz serwer STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Zapisz serwer na liście serwerów, które będą zawsze sprawdzane w poszukiwaniu uruchomionych gier STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Uruchom serwer diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 6c2bb390..411f00bb 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -242,7 +242,7 @@ STR_TOOLTIP_CLOSE_WINDOW :{BLACK}Fechar j STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS :{BLACK}Título da janela - arraste isto para mover a janela STR_TOOLTIP_SHADE :{BLACK}Encolher janela - apenas mostra a barra de título STR_TOOLTIP_DEBUG :{BLACK}Mostrar informação de depuração de NewGRF -STR_TOOLTIP_DEFSIZE :{BLACK}Reajusta janela para tamanho por defeito. Ctrl+Clique para manter o tamanho actual como o por defeito +STR_TOOLTIP_DEFSIZE :{BLACK}Redimensionar a janela para o tamanho padrão. Ctrl+Clique para guardar o tamanho atual como padrão STR_TOOLTIP_STICKY :{BLACK}Marcar esta janela como não-encerrável pela tecla 'Fechar Todas as Janelas'. Ctrl+Clique para tambem salvar o estado como por omissão STR_TOOLTIP_RESIZE :{BLACK}Clique e arraste para reajustar janela STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW :{BLACK}Alternar entre janela grande/pequena @@ -1007,6 +1007,9 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Acelera STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Marque esta caixa para permitir que o OpenTTD tente usar a aceleração por hardware. Uma configuração alterada só será aplicada após reiniciar o jogo STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}A definição só terá efeito após reiniciar o jogo +STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync +STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Marque esta caixa para ativar "V-Sync" no ecrã. Uma configuração alterada só terá efeito quando reiniciar o jogo. Só funciona com a aceleração por hardware ativada + 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 @@ -1266,7 +1269,7 @@ STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT :Se ativado, os STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Novas ordens são 'sem parar' por predefinição: {STRING} STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Normalmente, um veículo para em cada estação por onde passa. Ao ativar esta configuração, um veículo irá passar por todas as estações no seu percurso, parando apenas no destino final. Esta opção só tem efeito para novas rotas, mas as rotas existentes podem ser alteradas para funcionarem de forma igual. STR_CONFIG_SETTING_STOP_LOCATION :Ordens novas do comboio param {STRING} da plataforma -STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Local onde um combóio parará na plataforma por omissão. A opção 'extremo mais próximo' significa perto do ponto de entrada, 'meio' significa no meio da plataforma e 'extremo mais distante' significa o mais distante possível do ponto de entrada. Esta opção apenas afecta o valor por omissão para novas encomendas. Encomendas individuais podem utilizar qualquer uma das opções independentemente desta +STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Local de paragem do comboio nas plataformas por omissão. A opção 'extremo mais próximo' significa perto do ponto de entrada, 'meio' significa no meio da plataforma e 'extremo mais distante' significa o mais distante possível do ponto de entrada. Esta opção apenas afeta o valor por omissão para novas ordens. Ordens individuais podem utilizar qualquer uma das opções independentemente desta STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :no extremo perto STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :no meio STR_CONFIG_SETTING_STOP_LOCATION_FAR_END :no extremo longe @@ -1313,7 +1316,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :Activar esta pr 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. STR_CONFIG_SETTING_ORDER_REVIEW :Analisar ordens dos veículos: {STRING} -STR_CONFIG_SETTING_ORDER_REVIEW_HELPTEXT :Quando activo, as encomendas dos veículos são periodicamente revistas e algumas falhas óbvias são anunciadas através de notícias, quando detectadas +STR_CONFIG_SETTING_ORDER_REVIEW_HELPTEXT :Quando ativo, as ordens dos veículos são periodicamente revistas e algumas falhas óbvias são anunciadas através de notícias, quando detetadas STR_CONFIG_SETTING_ORDER_REVIEW_OFF :Não STR_CONFIG_SETTING_ORDER_REVIEW_EXDEPOT :Sim, mas excluir veículos parados STR_CONFIG_SETTING_ORDER_REVIEW_ON :De todos os veículos @@ -1904,11 +1907,11 @@ STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Seleccio STR_LIVERY_PANEL_TOOLTIP :{BLACK}Seleccione o esquema de cores a alterar, ou esquemas múltiplos utilizando a tecla Ctrl com o botão esquerdo do rato. Marque a caixa para comutar a utilização do esquema de cores STR_LIVERY_DEFAULT :Estampagem Padrão -STR_LIVERY_STEAM :Motor a Vapor -STR_LIVERY_DIESEL :Motor Diesel -STR_LIVERY_ELECTRIC :Motor Eléctrico -STR_LIVERY_MONORAIL :Motor Monocarril -STR_LIVERY_MAGLEV :Motor Maglev (Levitação Magnética) +STR_LIVERY_STEAM :Locomotivas a Vapor +STR_LIVERY_DIESEL :Locomotivas Diesel +STR_LIVERY_ELECTRIC :Locomotivas Eléctricas +STR_LIVERY_MONORAIL :Motoras Monocarril +STR_LIVERY_MAGLEV :Motoras Maglev (Levitação Magnética) STR_LIVERY_DMU :DMU STR_LIVERY_EMU :EMU STR_LIVERY_PASSENGER_WAGON_STEAM :Carruagem de Passageiros (Vapor) @@ -1917,8 +1920,8 @@ STR_LIVERY_PASSENGER_WAGON_ELECTRIC :Carruagem de Pa STR_LIVERY_PASSENGER_WAGON_MONORAIL :Carruagem de Passageiros (Monocarril) STR_LIVERY_PASSENGER_WAGON_MAGLEV :Carruagem de Passageiros (Maglev) STR_LIVERY_FREIGHT_WAGON :Vagão de Carga -STR_LIVERY_BUS :Autocarro -STR_LIVERY_TRUCK :Veículo de Mercadorias +STR_LIVERY_BUS :Autocarros +STR_LIVERY_TRUCK :Camiões STR_LIVERY_PASSENGER_SHIP :Navio de passageiros STR_LIVERY_FREIGHT_SHIP :Navio cargueiro STR_LIVERY_HELICOPTER :Helicóptero @@ -2442,7 +2445,7 @@ STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}Construi STR_STATION_BUILD_STATION_CLASS_TOOLTIP :{BLACK}Escolher a classe da estação a mostrar STR_STATION_BUILD_STATION_TYPE_TOOLTIP :{BLACK}Escolher o tipo de estação a construir -STR_STATION_CLASS_DFLT :Estação por defeito +STR_STATION_CLASS_DFLT :Estação padrão STR_STATION_CLASS_WAYP :Pontos de passagem # Signal window @@ -2872,7 +2875,7 @@ STR_SAVELOAD_SAVE_SCENARIO :{WHITE}Guardar STR_SAVELOAD_LOAD_SCENARIO :{WHITE}Abrir Cenário STR_SAVELOAD_LOAD_HEIGHTMAP :{WHITE}Carregar mapa de alturas STR_SAVELOAD_SAVE_HEIGHTMAP :{WHITE}Guardar mapa de alturas -STR_SAVELOAD_HOME_BUTTON :{BLACK}Carregue aqui para saltar para a directoria de gravação/carregamento por defeito +STR_SAVELOAD_HOME_BUTTON :{BLACK}Clique aqui para saltar para o diretório atual de gravação/carregamento padrão STR_SAVELOAD_BYTES_FREE :{BLACK}{BYTES} livres STR_SAVELOAD_LIST_TOOLTIP :{BLACK}Lista de unidades, directorias e ficheiros de jogos guardados STR_SAVELOAD_EDITBOX_TOOLTIP :{BLACK}Nome escolhido para guardar o jogo @@ -3897,11 +3900,11 @@ STR_VEHICLE_INFO_AGE_RUNNING_COST_YR :{BLACK}Idade: { STR_VEHICLE_INFO_AGE :{COMMA} ano{P "" s} ({COMMA}) STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} ano{P "" s} ({COMMA}) -STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Máx. velocidade: {LTBLUE}{VELOCITY} +STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Velocidade máx.: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Vel. máxima: {LTBLUE}{VELOCITY} {BLACK}Tipo de Aeronave: {LTBLUE}{STRING} STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Velocidade Máx.: {LTBLUE}{VELOCITY} {BLACK}Tipo de Aeronave: {LTBLUE}{STRING} {BLACK}Alcance: {LTBLUE}{COMMA} quadrados -STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Peso: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potência: {LTBLUE}{POWER}{BLACK} Max. velocidade: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Peso: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potência: {LTBLUE}{POWER}{BLACK} Máx. velocidade: {LTBLUE}{VELOCITY} {BLACK}Máx. E.T.: {LTBLUE}{FORCE} +STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Peso: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potência: {LTBLUE}{POWER}{BLACK} Velocidade máx.: {LTBLUE}{VELOCITY} +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_RELIABILITY_BREAKDOWNS :{BLACK}Fiabilidade: {LTBLUE}{COMMA}% {BLACK}Avarias desde o último serviço: {LTBLUE}{COMMA} @@ -3920,7 +3923,7 @@ STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP :{BLACK}Aumentar STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP :{BLACK}Diminuir intervalo de serviço por 10. Ctrl+Clique diminui o intervalo de serviço por 5 STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}Alterar tipo de intervalo de manutenção -STR_VEHICLE_DETAILS_DEFAULT :Por Defeito +STR_VEHICLE_DETAILS_DEFAULT :Padrão STR_VEHICLE_DETAILS_DAYS :Dias STR_VEHICLE_DETAILS_PERCENT :Percentagem diff --git a/src/lang/romanian.txt b/src/lang/romanian.txt index 1f7a8eb9..11b35e52 100644 --- a/src/lang/romanian.txt +++ b/src/lang/romanian.txt @@ -1,7 +1,7 @@ ##name Romanian ##ownname Românӑ ##isocode ro_RO -##plural 0 +##plural 14 ##textdir ltr ##digitsep . ##digitsepcur . @@ -93,37 +93,25 @@ STR_CARGO_SINGULAR_FIZZY_DRINK :Suc acidulat # Quantity of cargo STR_QUANTITY_NOTHING : -STR_QUANTITY_PASSENGERS :{COMMA} călător{P "" i} STR_QUANTITY_COAL :{WEIGHT_LONG} de cărbune -STR_QUANTITY_MAIL :{COMMA} sac{P "" i} cu colete poștale STR_QUANTITY_OIL :{VOLUME_LONG} de petrol -STR_QUANTITY_LIVESTOCK :{COMMA} animal{P "" e} -STR_QUANTITY_GOODS :{COMMA} pachet{P "" e} de bunuri STR_QUANTITY_GRAIN :{WEIGHT_LONG} de cereale STR_QUANTITY_WOOD :{WEIGHT_LONG} de lemne STR_QUANTITY_IRON_ORE :{WEIGHT_LONG} de minereu de fier STR_QUANTITY_STEEL :{WEIGHT_LONG} de oțel -STR_QUANTITY_VALUABLES :{COMMA} cuti{P e i} de valori STR_QUANTITY_COPPER_ORE :{WEIGHT_LONG} de minereu de cupru STR_QUANTITY_MAIZE :{WEIGHT_LONG} de porumb STR_QUANTITY_FRUIT :{WEIGHT_LONG} de fructe -STR_QUANTITY_DIAMONDS :{COMMA} sac{P "" i} cu diamante STR_QUANTITY_FOOD :{WEIGHT_LONG} de alimente STR_QUANTITY_PAPER :{WEIGHT_LONG} de hârtie -STR_QUANTITY_GOLD :{COMMA} sac{P "" i} cu aur STR_QUANTITY_WATER :{VOLUME_LONG} de apă STR_QUANTITY_WHEAT :{WEIGHT_LONG} de grâu STR_QUANTITY_RUBBER :{VOLUME_LONG} de cauciuc STR_QUANTITY_SUGAR :{WEIGHT_LONG} de zahăr -STR_QUANTITY_TOYS :{COMMA} sac{P "" i} cu jucării -STR_QUANTITY_SWEETS :{COMMA} sac{P "" i} cu bomboane STR_QUANTITY_COLA :{VOLUME_LONG} de cola STR_QUANTITY_CANDYFLOSS :{WEIGHT_LONG} de vată de zahăr -STR_QUANTITY_BUBBLES :{COMMA} balonaș{P "" e} STR_QUANTITY_TOFFEE :{WEIGHT_LONG} de caramel -STR_QUANTITY_BATTERIES :{COMMA} bateri{P e i} STR_QUANTITY_PLASTIC :{VOLUME_LONG} de plastic -STR_QUANTITY_FIZZY_DRINKS :{COMMA} bido{P n ane} cu suc STR_QUANTITY_N_A :N/A # Two letter abbreviation of cargo name @@ -163,12 +151,10 @@ STR_ABBREV_NONE :{TINY_FONT}NU STR_ABBREV_ALL :{TINY_FONT}TOT # 'Mode' of transport for cargoes -STR_PASSENGERS :{COMMA} călător{P "" i} -STR_BAGS :{COMMA} sac{P "" i} +STR_BAGS :{COMMA}{NBSP}sac{P "" "" "de "}sac{P "" i i} STR_TONS :{COMMA} tone STR_LITERS :{COMMA} litri STR_ITEMS :{COMMA} bucăți -STR_CRATES :{COMMA} pachet{P "" e} # Colours, do not shuffle STR_COLOUR_DARK_BLUE :Albastru închis @@ -194,6 +180,7 @@ STR_COLOUR_DEFAULT :Prestabilit STR_UNITS_VELOCITY_IMPERIAL :{COMMA} mph STR_UNITS_VELOCITY_METRIC :{COMMA} km/h STR_UNITS_VELOCITY_SI :{COMMA} m/s +STR_UNITS_VELOCITY_GAMEUNITS :{DECIMAL}{NBSP}dale/zi STR_UNITS_POWER_IMPERIAL :{COMMA}cp STR_UNITS_POWER_METRIC :{COMMA}cp @@ -203,16 +190,12 @@ STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}kg -STR_UNITS_WEIGHT_LONG_IMPERIAL :{COMMA} ton{P ă e} -STR_UNITS_WEIGHT_LONG_METRIC :{COMMA} ton{P ă e} STR_UNITS_WEIGHT_LONG_SI :{COMMA} kg STR_UNITS_VOLUME_SHORT_IMPERIAL :{COMMA}gal STR_UNITS_VOLUME_SHORT_METRIC :{COMMA}l STR_UNITS_VOLUME_SHORT_SI :{COMMA}m³ -STR_UNITS_VOLUME_LONG_IMPERIAL :{COMMA} galo{P n ane} -STR_UNITS_VOLUME_LONG_METRIC :{COMMA} litr{P u i} STR_UNITS_VOLUME_LONG_SI :{COMMA} m³ STR_UNITS_FORCE_IMPERIAL :{COMMA} lbf @@ -312,8 +295,13 @@ STR_SORT_BY_CARGO_CAPACITY :Capacitate înc STR_SORT_BY_RANGE :Raza de acțiune STR_SORT_BY_POPULATION :Populaţia STR_SORT_BY_RATING :Cotaţie +STR_SORT_BY_NUM_VEHICLES :Număr de vehicule +STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Profit total în anul trecut +STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Profit mediu în anul trecut +STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Profit mediu în acest an # Group by options for vehicle list +STR_GROUP_BY_SHARED_ORDERS :Comenzi comune # Tooltips for the main toolbar STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Pauză joc @@ -331,14 +319,15 @@ STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}Afişeaz STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Afişează grafice STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Afişează clasamentul companiilor STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Listează sau fondează obiectivele industriale -STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}Afişează lista cu trenurile companiei. Ctrl+Click alternează deschiderea listei cu grupuri/vehicule -STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}Afişează lista cu autovehiculele companiei. Ctrl+Click alternează deschiderea listei cu grupuri/vehicule -STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}Afişează lista cu navele companiei. Ctrl+Click alternează deschiderea listei cu grupuri/vehicule -STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}Afişează lista cu aeronavele companiei. Ctrl+Click alternează deschiderea listei cu grupuri/vehicule +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}Afișează lista cu trenurile companiei. Ctrl+clic comută afișarea listei cu grupuri/vehicule +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}Afișează lista cu autovehiculele companiei. Ctrl+clic comută afișarea listei cu grupuri/vehicule +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}Afișează lista cu navele companiei. Ctrl+clic comută afișarea listei cu grupuri/vehicule +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}Afișează lista cu aeronavele companiei. Ctrl+clic comută afișarea listei cu grupuri/vehicule STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}Măreşte imaginea STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}Micşorează imaginea STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Construieşte căi ferate STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}Construieşte drumuri +STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}Construiește linii de tramvai STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}Construieşte porturi STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}Construieşte aeroporturi STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}Afişează instrumentele pentru modelarea terenului, plantarea copacilor, etc. @@ -359,6 +348,7 @@ STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}Generare STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Generare oraş STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Generare industrii STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Construcţii rutiere +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 @@ -368,7 +358,7 @@ STR_SCENEDIT_FILE_MENU_SAVE_SCENARIO :Salvează scena STR_SCENEDIT_FILE_MENU_LOAD_SCENARIO :Încarcă scenariu STR_SCENEDIT_FILE_MENU_SAVE_HEIGHTMAP :Salvează harta înălţimilor STR_SCENEDIT_FILE_MENU_LOAD_HEIGHTMAP :Încarcă harta de înălţimi -STR_SCENEDIT_FILE_MENU_QUIT_EDITOR :Ieşire din editorul de scenarii +STR_SCENEDIT_FILE_MENU_QUIT_EDITOR :Ieșire din editorul de scenarii STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Ieşire din joc ############ range for SE file menu starts @@ -393,7 +383,7 @@ STR_SETTINGS_MENU_TRANSPARENT_SIGNS :Nume staţii/se ############ range for file menu starts STR_FILE_MENU_SAVE_GAME :Salvează jocul STR_FILE_MENU_LOAD_GAME :Încarcă joc -STR_FILE_MENU_QUIT_GAME :Ieşire în meniul principal +STR_FILE_MENU_QUIT_GAME :Ieșire în meniul principal STR_FILE_MENU_SEPARATOR : STR_FILE_MENU_EXIT :Ieşire din joc ############ range ends here @@ -443,7 +433,7 @@ STR_RAIL_MENU_MAGLEV_CONSTRUCTION :Construcţie pe ############ range for road construction menu starts STR_ROAD_MENU_ROAD_CONSTRUCTION :Construcţii rutiere -STR_ROAD_MENU_TRAM_CONSTRUCTION :Construcţie tramvai +STR_ROAD_MENU_TRAM_CONSTRUCTION :Construcție tramvai ############ range ends here ############ range for waterways construction menu starts @@ -649,13 +639,14 @@ STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLA STR_MUSIC_TRACK_NONE :{TINY_FONT}{DKGREEN}-- STR_MUSIC_TRACK_DIGIT :{TINY_FONT}{DKGREEN}{ZEROFILL_NUM} STR_MUSIC_TITLE_NONE :{TINY_FONT}{DKGREEN}------ +STR_MUSIC_TITLE_NOMUSIC :{TINY_FONT}{DKGREEN}Nu există muzică disponibilă STR_MUSIC_TITLE_NAME :{TINY_FONT}{DKGREEN}"{STRING}" STR_MUSIC_TRACK :{TINY_FONT}{BLACK}Piesa STR_MUSIC_XTITLE :{TINY_FONT}{BLACK}Titlul STR_MUSIC_SHUFFLE :{TINY_FONT}{BLACK}Aleator STR_MUSIC_PROGRAM :{TINY_FONT}{BLACK}Program -STR_MUSIC_TOOLTIP_SKIP_TO_PREVIOUS_TRACK :{BLACK}Sari la piesa precedentă din selecţie -STR_MUSIC_TOOLTIP_SKIP_TO_NEXT_TRACK_IN_SELECTION :{BLACK}Sari la piesa următoare din selecţie +STR_MUSIC_TOOLTIP_SKIP_TO_PREVIOUS_TRACK :{BLACK}Sari la piesa precedentă din selecție +STR_MUSIC_TOOLTIP_SKIP_TO_NEXT_TRACK_IN_SELECTION :{BLACK}Sari la următoarea piesă din selecție STR_MUSIC_TOOLTIP_STOP_PLAYING_MUSIC :{BLACK}Opreşte muzica STR_MUSIC_TOOLTIP_START_PLAYING_MUSIC :{BLACK}Porneşte muzica STR_MUSIC_TOOLTIP_DRAG_SLIDERS_TO_SET_MUSIC :{BLACK}Foloseşte aceste indicatoare pentru a regla volumul muzicii şi al efectelor sonore @@ -666,7 +657,7 @@ STR_MUSIC_TOOLTIP_SELECT_EZY_STREET_STYLE :{BLACK}Selectea STR_MUSIC_TOOLTIP_SELECT_CUSTOM_1_USER_DEFINED :{BLACK}Selectează programul personal 1 STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Selectează programul personal 2 STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Comutator pentru amestecarea melodiilor (pornit/oprit) -STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Afişeaza fereastra pentru selecţia melodiilor +STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Afișează fereastra pentru selecția melodiilor # Playlist window STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" @@ -766,6 +757,7 @@ STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}Afișeaz STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Re-afişează ultimul mesaj STR_STATUSBAR_COMPANY_NAME :{SILVER}- - {COMPANY} - - STR_STATUSBAR_PAUSED :{YELLOW}* * PAUZĂ * * +STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * PAUZĂ (se actualizează graficul conexiunilor) * * STR_STATUSBAR_AUTOSAVE :{RED}SALVARE AUTOMATĂ STR_STATUSBAR_SAVING_GAME :{RED}* * SALVARE JOC * * @@ -811,6 +803,7 @@ STR_NEWS_MERGER_TAKEOVER_TITLE :{BIG_FONT}{BLAC STR_PRESIDENT_NAME_MANAGER :{BLACK}{PRESIDENT_NAME}{}(Preşedinte) STR_NEWS_NEW_TOWN :{BLACK}{BIG_FONT}{STRING} a sponsorizat construcţia unui nou oras {TOWN}! +STR_NEWS_NEW_TOWN_UNSPONSORED :{BLACK}{BIG_FONT}Un nou oraș, numit {TOWN}, a fost construit! STR_NEWS_INDUSTRY_CONSTRUCTION :{BIG_FONT}{BLACK}Un nou obiectiv industrial ({STRING}) se construieşte lângă {TOWN}! STR_NEWS_INDUSTRY_PLANTED :{BIG_FONT}{BLACK}O nouă {STRING} se plantează lângă {TOWN}! @@ -873,7 +866,7 @@ STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLAC STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}Subvenţie acordată companiei {STRING}!{}{}Transportul de {STRING} de la {STRING} la {STRING} va aduce încasări triple timp de un an! STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}Subvenţie acordată companiei {STRING}!{}{}Transportul de {STRING} de la {STRING} la {STRING} va aduce încasări de patru ori mai mari timp de un an! -STR_NEWS_ROAD_REBUILDING :{BIG_FONT}{BLACK}Haos pe străzile din {TOWN}!{}{}Programul finanţat de {STRING} pentru reconstrucţia străzilor aduce 6 luni de haos participanţilor la trafic! +STR_NEWS_ROAD_REBUILDING :{BIG_FONT}{BLACK}Haos pe străzile din {TOWN}!{}{}Programul finanțat de {STRING} pentru reconstrucția străzilor aduce 6 luni de haos participanților la trafic! STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Monopol de transport! STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION :{BIG_FONT}{BLACK}Autoritatea locală a oraşului {TOWN} semnează un contract cu {STRING} pentru un an de drepturi exclusive de transport! @@ -925,6 +918,11 @@ STR_GAME_OPTIONS_CURRENCY_CUSTOM :Personalizată. STR_GAME_OPTIONS_CURRENCY_GEL :Lari Georgian (GEL) STR_GAME_OPTIONS_CURRENCY_IRR :Rial Iranian (IRR) STR_GAME_OPTIONS_CURRENCY_RUB :Ruble rusești (RUB) +STR_GAME_OPTIONS_CURRENCY_MXN :Peso Mexican (MXN) +STR_GAME_OPTIONS_CURRENCY_NTD :Noul Dolar Taiwanez (NTD) +STR_GAME_OPTIONS_CURRENCY_CNY :Renminbi Chinezesc (CNY) +STR_GAME_OPTIONS_CURRENCY_INR :Rupia Indiană (INR) +STR_GAME_OPTIONS_CURRENCY_MYR :Ringgit Malaysian (MYR) ############ end of currency region STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Pe partea stângă @@ -977,23 +975,35 @@ STR_GAME_OPTIONS_FULLSCREEN_TOOLTIP :{BLACK}Bifează STR_GAME_OPTIONS_RESOLUTION :{BLACK}Rezoluţia ecranului STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}Alege rezoluţia dorită pentru joc STR_GAME_OPTIONS_RESOLUTION_OTHER :(alta/nespecificată) +STR_GAME_OPTIONS_RESOLUTION_ITEM :{NUM}x{NUM} +STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Accelerare hardware +STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Setarea va avea efect doar după repornirea jocului + +STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync 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_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 împătrită +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_GRAPHICS :{BLACK}Grafică +STR_GAME_OPTIONS_REFRESH_RATE_TOOLTIP :{BLACK}Alegeți rata de reîmprospătare dorită +STR_GAME_OPTIONS_REFRESH_RATE_ITEM :{NUM}Hz +STR_GAME_OPTIONS_REFRESH_RATE_WARNING :{WHITE}Ratele de împrospătare de peste 60Hz ar putea afecta performanța. STR_GAME_OPTIONS_BASE_GRF :{BLACK}Set grafic de bază STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Selectează setul grafic de bază utilizat în joc -STR_GAME_OPTIONS_BASE_GRF_STATUS :{RED}{NUM} fişier{P "" "e"} lipsă/corupt{P "" e} STR_GAME_OPTIONS_BASE_GRF_DESCRIPTION_TOOLTIP :{BLACK}Informaţii adiţionale despre setul grafic de bază STR_GAME_OPTIONS_BASE_SFX :{BLACK}Set sunete de bază @@ -1002,7 +1012,6 @@ STR_GAME_OPTIONS_BASE_SFX_DESCRIPTION_TOOLTIP :{BLACK}Informa STR_GAME_OPTIONS_BASE_MUSIC :{BLACK}Setul de muzică de bază STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :{BLACK}Selectaţi setul de muzică de bază -STR_GAME_OPTIONS_BASE_MUSIC_STATUS :{RED}{NUM} fişier{P "" e} corupt{P "" e} STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}Informaţii adiţionale despre setul de muzică de bază STR_ERROR_RESOLUTION_LIST_FAILED :{WHITE}Nu s-a putut obține lista de rezoluții suportate @@ -1085,6 +1094,7 @@ STR_TERRAIN_TYPE_FLAT :Plat STR_TERRAIN_TYPE_HILLY :Deluros STR_TERRAIN_TYPE_MOUNTAINOUS :Muntos STR_TERRAIN_TYPE_ALPINIST :Alpinist +STR_TERRAIN_TYPE_CUSTOM_VALUE :Înălțime personalizată ({NUM}) STR_CITY_APPROVAL_PERMISSIVE :Permisivă STR_CITY_APPROVAL_TOLERANT :Tolerantă @@ -1108,7 +1118,7 @@ STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :Setări compani STR_CONFIG_SETTING_RESTRICT_CATEGORY :{BLACK}Categorie: STR_CONFIG_SETTING_RESTRICT_TYPE :{BLACK}Tip: -STR_CONFIG_SETTING_RESTRICT_DROPDOWN_HELPTEXT :{BLACK}Arată în lista de mai jos doar setările modificate +STR_CONFIG_SETTING_RESTRICT_DROPDOWN_HELPTEXT :{BLACK}Limitează lista de mai jos doar la setările modificate STR_CONFIG_SETTING_RESTRICT_BASIC :Setări de bază (afişează numai setări importante) STR_CONFIG_SETTING_RESTRICT_ADVANCED :Setări avansate (afişează majoritatea setărilor) STR_CONFIG_SETTING_RESTRICT_ALL :Setări expert (afişează toate setările) @@ -1165,7 +1175,9 @@ STR_CONFIG_SETTING_DISASTERS_HELPTEXT :Comută dezastr STR_CONFIG_SETTING_CITY_APPROVAL :Atitudinea consiliului orașului cu privire la restructurarea zonei: {STRING} STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT :Alege în ce măsură poluarea fonică si deranjamentul local provocat de o companie va afecta impresia orașului despre aceasta, si viitoarele planuri de construcție in zonă -STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN :{WHITE}Nu poţi seta înălţimea maxima a hărţii la aceasta valoare. Cel puţin un munte pe hartă are o înălţime mai mare. +STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT :Înălțimea limită a hărții: {STRING} +STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT_VALUE :{NUM} +STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN :{WHITE}Nu poți seta înălțimea maximă a hărții la această valoare. Cel puțin un munte de pe hartă este mai înalt de-atât. STR_CONFIG_SETTING_AUTOSLOPE :Permite terra-formarea sub clădiri, şine, etc. (auto-pante): {STRING} STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :Permite terraformarea sub clădiri şi şine fără eliminarea acestora STR_CONFIG_SETTING_CATCHMENT :Permite arii de cuprindere mai realiste: {STRING} @@ -1175,12 +1187,11 @@ STR_CONFIG_SETTING_EXTRADYNAMITE :Permite demolar STR_CONFIG_SETTING_EXTRADYNAMITE_HELPTEXT :Facilitează eliminarea de clădiri şi infrastructură deţinute de oraş STR_CONFIG_SETTING_TRAIN_LENGTH :Lungimea maximă a trenurilor: {STRING} STR_CONFIG_SETTING_TRAIN_LENGTH_HELPTEXT :Configurează lungimea maximă a trenurilor -STR_CONFIG_SETTING_TILE_LENGTH :{COMMA} pătrăţel{P 0 "" e} STR_CONFIG_SETTING_SMOKE_AMOUNT :Cantitatea de fum/ scântei ale vehiculului: {STRING} STR_CONFIG_SETTING_SMOKE_AMOUNT_HELPTEXT :Configurează cât de mult fum sau cât de multe scântei sunt emise de vehicule STR_CONFIG_SETTING_TRAIN_ACCELERATION_MODEL :Modelul de acceleraţie al trenurilor: {STRING} STR_CONFIG_SETTING_TRAIN_ACCELERATION_MODEL_HELPTEXT :Selectează modelul fizic pentru accelerarea trenurilor. Modelul "original" penalizează pantele în mod egal pentru toate vehiculele. Modelul "realistic" penalizează pantele şi curbele în funcţie de mai mulţi parametrii, cum ar fi lungimea şi efortul tractor -STR_CONFIG_SETTING_ROAD_VEHICLE_ACCELERATION_MODEL :Modelul de acceleraţie al vehiculelor rutiere: {STRING} +STR_CONFIG_SETTING_ROAD_VEHICLE_ACCELERATION_MODEL :Modelul de accelerație al vehiculelor rutiere: {STRING} STR_CONFIG_SETTING_ROAD_VEHICLE_ACCELERATION_MODEL_HELPTEXT :Selectează modelul fizic pentru accelerarea autovehiculelor. Modelul "original" penalizează pantele în mod egal pentru toate autovehiculele. Modelul "realistic" penalizează pantele şi curbele în funcţie de mai mulţi parametrii ai motorului, cum ar fi efortul tractor STR_CONFIG_SETTING_TRAIN_SLOPE_STEEPNESS :Înclinarea pantelor pentru trenuri: {STRING} STR_CONFIG_SETTING_TRAIN_SLOPE_STEEPNESS_HELPTEXT :Înclinarea unui pătrăţel de pantă pentru trenuri. O valoare mai mare face urcarea mai dificilă @@ -1195,8 +1206,8 @@ STR_CONFIG_SETTING_INFLATION :Inflaţia: {STR STR_CONFIG_SETTING_INFLATION_HELPTEXT :Activează inflaţia în economie, unde costurile cresc ceva mai rapid decât plăţile STR_CONFIG_SETTING_MAX_BRIDGE_LENGTH :Lungimea maximă a podurilor: {STRING} STR_CONFIG_SETTING_MAX_BRIDGE_LENGTH_HELPTEXT :Lungimea maximă pentru construcţia de poduri -STR_CONFIG_SETTING_MAX_BRIDGE_HEIGHT :Întăltimea maximă a podurilor: {STRING} -STR_CONFIG_SETTING_MAX_BRIDGE_HEIGHT_HELPTEXT :Întăltimea maximă pentru construcţia de poduri +STR_CONFIG_SETTING_MAX_BRIDGE_HEIGHT :Înălțimea maximă a podurilor: {STRING} +STR_CONFIG_SETTING_MAX_BRIDGE_HEIGHT_HELPTEXT :Înălțimea maximă pentru construcția de poduri STR_CONFIG_SETTING_MAX_TUNNEL_LENGTH :Lungimea maximă a tunelurilor: {STRING} STR_CONFIG_SETTING_MAX_TUNNEL_LENGTH_HELPTEXT :Lungimea maximă pentru construcţia de tuneluri STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD :Metoda manuală de construcţie a industriilor primare: {STRING} @@ -1231,7 +1242,7 @@ STR_CONFIG_SETTING_AUTOSCROLL_EVERY_VIEWPORT :fiecare ecran STR_CONFIG_SETTING_BRIBE :Permite mituirea autorităţilor locale: {STRING} STR_CONFIG_SETTING_BRIBE_HELPTEXT :Permite companiilor să încerce să mituiască autoritatea locală. Daca încercarea este descoperită de către un inspector, compania nu va mai putea executa nici o acțiune în oraș timp de șase luni STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :Permite cumpărarea de drepturi exclusive de transport: {STRING} -STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Dacă o companie cumpără drepturi exclusive de transport într-un oras, staţiilor oponenţilor (de pasageri şi mărfuri) nu vor primi niciun fel de cargo pentru un an întreg +STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Dacă o companie cumpără drepturi exclusive de transport într-un oraș, stațiile concurenței (de pasageri și mărfuri) nu vor primi niciun fel de marfă timp de un an STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS :Permite finaţarea clădirilor noi: {STRING} STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT :Permite companiilor să doneze bani orașelor pentru construcția de noi locuințe STR_CONFIG_SETTING_ALLOW_FUND_ROAD :Permite finanțarea reconstrucției străzilor locale: {STRING} @@ -1256,6 +1267,7 @@ STR_CONFIG_SETTING_DYNAMIC_ENGINES_EXISTING_VEHICLES :{WHITE}Schimbar STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE :Mentenanță infrastructură: {STRING} STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :Cand este activă, infrastructura necesita cheltuieli cu intreținerea. Costurile cresc proporțional cu rețeaua de transport, afectând companiile mari mai mult decât companiile mici +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_HELPTEXT :Alegeți culoarea de început pentru companie STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :Aeroporturile nu expiră niciodată: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :Activarea acestei opțiuni determina ca fiecare tip de aeroport sa fie disponibil permanent, după ce a fost introdus. @@ -1275,21 +1287,18 @@ STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Înnoire automa STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :După activare, orice vehicul care este învechit va fi reînnoit automat când condițiile de înlocuire automată sunt îndeplinite STR_CONFIG_SETTING_AUTORENEW_MONTHS :Autoreînnoire când vehiculul {STRING} vârsta maximă STR_CONFIG_SETTING_AUTORENEW_MONTHS_HELPTEXT :Vârsta aproximativă când un vehicul ar trebui autoreînnoit -STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_BEFORE :mai are {COMMA} lun{P 0 ă i} până la -STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_AFTER :a depășit cu {COMMA} lun{P 0 ă i} STR_CONFIG_SETTING_AUTORENEW_MONEY :Fonduri minime pentru înnoire automată: {STRING} STR_CONFIG_SETTING_AUTORENEW_MONEY_HELPTEXT :Suma minimă care trebuie să rămână disponibilă atunci când se face autoreînnoirea STR_CONFIG_SETTING_ERRMSG_DURATION :Durata de afișare a mesajelor de eroare: {STRING} STR_CONFIG_SETTING_ERRMSG_DURATION_HELPTEXT :Durata afișării mesajelor de eroare în fereastra roșie. Unele mesaje de eroare (cele critice) nu sunt închise automat după trecerea acestei perioade, și trebuie închise manual. -STR_CONFIG_SETTING_ERRMSG_DURATION_VALUE :{COMMA} secund{P 0 ă e} STR_CONFIG_SETTING_HOVER_DELAY :Afișează texte informative: {STRING} STR_CONFIG_SETTING_HOVER_DELAY_HELPTEXT :Durata dinaintea afișării sfaturilor când se ține mausul pe un element al interfeței. Alternativ, afișarea sfaturilor poate fi setată pentru clic-dreapta -STR_CONFIG_SETTING_HOVER_DELAY_VALUE :Plutește {COMMA} milisecund{P 0 ă e} STR_CONFIG_SETTING_HOVER_DELAY_DISABLED :Click dreapta STR_CONFIG_SETTING_POPULATION_IN_LABEL :Afişează populaţia unui oras lângă nume: {STRING} STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Afișează populația orașelor în numele afișate pe hartă STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Grosimea liniilor din grafice: {STRING} STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Grosimea liniilor din grafice. O linie subțire este mai informativă, o linie mai groasă este mai ușor de văzut și are culorile mai usor de distins +STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :Afișează numele NewGRF în fereastra de construcție a vehiculului: {STRING} 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 @@ -1300,10 +1309,16 @@ STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis STR_CONFIG_SETTING_TERRAIN_TYPE :Tip teren: {STRING} STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(Doar TerraGenesis) Frecvența dealurilor din peisaj STR_CONFIG_SETTING_INDUSTRY_DENSITY :Densitatea industriei: {STRING} +STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Stabilește câte industrii ar trebui generate și ce nivel ar trebui întreținut pe durata jocului STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Distanța maximă de la marginea hărții pentru rafinării: {STRING} STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Rafinăriile de petrol vor fi construite doar la marginea hărţii, sau pe coastă, în cazul harţilor insulare STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Grosimea stratului de zăpadă: {STRING} -STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Controlează înălțimea de la care zăpada apare în peisajul sub-arctic. De asemenea, zăpada afectează generarea industriilor și cerințele de creștere a orașelor. +STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Controlează înălțimea de la care zăpada apare în peisajul sub-arctic. Zăpada afectează și generarea industriilor și cerințele de creștere a orașelor. Se poate modifica doar prin Editorul de scenarii sau este calculat prin „acoperirea cu zăpadă” +STR_CONFIG_SETTING_SNOW_COVERAGE :Acoperire cu zăpadă: {STRING} +STR_CONFIG_SETTING_SNOW_COVERAGE_VALUE :{NUM}% +STR_CONFIG_SETTING_DESERT_COVERAGE :Acoperire cu deșert: {STRING} +STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Controlează întinderea aproximativă de deșert din peisajul tropical. Deșert afectează și generarea industriilor. Parametrul se folosește doar la generarea hărții +STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Duritatea terenului (doar pt TerraGenesis) : {STRING} STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(Doar TerraGenesis) Alegeți frecvența dealurilor: Peisajele line au dealuri mai puține și mai întinse. Peisajele dure au multe dealuri și pot arăta repetitiv STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Foarte fin @@ -1311,6 +1326,8 @@ STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :Fin STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :Dur STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :Foarte dur STR_CONFIG_SETTING_VARIETY :Distribuția varietății: {STRING} +STR_CONFIG_SETTING_VARIETY_HELPTEXT :(TerraGenesis only) Specifică dacă harta conține și zone muntoase și teren plat. Deoarece aceasta face harta mai plată, alte setări ar trebui să adauge zone muntoase +STR_CONFIG_SETTING_RIVER_AMOUNT :Numărul de râuri: {STRING} STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :Alege câte râuri să fie generate STR_CONFIG_SETTING_TREE_PLACER :Algoritm amplasare arbori: {STRING} STR_CONFIG_SETTING_TREE_PLACER_HELPTEXT :Alegeți distribuția copacilor pe hartă: 'Original' plantează copacii dispersați uniform, 'Îmbunătățit' îi plantează grupat @@ -1337,7 +1354,9 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Culoarea terenu STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Verde STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Verde închis STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Mov +STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Comportamentul derulării hărții STR_CONFIG_SETTING_SCROLLMODE_RMB_LOCKED :Mută harta ținând apăsat click dreapta, poziția cursorului rămânând fixă +STR_CONFIG_SETTING_SCROLLMODE_RMB :Mută harta cu clic dreapta STR_CONFIG_SETTING_SCROLLMODE_LMB :Mută harta cu clic stânga STR_CONFIG_SETTING_SMOOTH_SCROLLING :Derulare uşoară ecran: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Controlează modul de deplasare a imaginii din ecranul principal când se face click pe harta mică sau când se execută o comandă de deplasare către un obiect anume de pe hartă. Dacă este activată, imaginea se deplasează în mod fluid, altfel imaginea sare direct la zona dorită @@ -1370,6 +1389,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Comandă+Click STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Control+Click STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Oprit +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Închidere fereastră la clic-dreapta: {STRING} +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Închide o fereastră prin clic-dreapta înăuntrul ei. Dezactivează sfatul oferit la clic-dreapta! STR_CONFIG_SETTING_AUTOSAVE :Autosalvare: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Alege intervalul de timp dintre salvările automate @@ -1410,6 +1431,9 @@ STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS_HELPTEXT :Menține barele STR_CONFIG_SETTING_EXPENSES_LAYOUT :Grupează cheltuielile în raportul financiar al companiei: {STRING} STR_CONFIG_SETTING_EXPENSES_LAYOUT_HELPTEXT :Definește stilul ferestrei care afișează cheltuielile companiei STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS_HELPTEXT :Elimină automat semnalele când construiești căi ferate dacă ele îți vin în cale. Nu uita că asta ar putea conduce la accidente feroviare. +STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT :Limita de viteză pentru trecerea timpului: {STRING} +STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_VAL :{NUM}% din viteza normală a jocului +STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_ZERO :Fără limită (atât de rapid pe cât permite calculatorul tău) STR_CONFIG_SETTING_SOUND_TICKER :Afișaj știri: {STRING} STR_CONFIG_SETTING_SOUND_TICKER_HELPTEXT :Redă sunet la afișarea sumarului știrilor @@ -1458,13 +1482,14 @@ STR_CONFIG_SETTING_AI_IN_MULTIPLAYER :Permite Intelig STR_CONFIG_SETTING_AI_IN_MULTIPLAYER_HELPTEXT :Permite ca jucătorii controlați de AI să participe în jocuri multiplayer STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES :Număr opcodes înainte de suspendarea scripturilor: {STRING} STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES_HELPTEXT :Numărul maxim de instrucțiuni pe care un script le poate executa pe parcursul unei ture +STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY :Maximul de memorie utilizată per script: {STRING} +STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_HELPTEXT :Câtă memorie poate consuma un singur script înainte să fie terminat forțat. Cantitatea necesară ar putea fi mai mare pentru hărți mari. STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_VALUE :{COMMA} MiB STR_CONFIG_SETTING_SERVINT_ISPERCENT :Intervaluri de service în procente: {STRING} STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :Alege dacă întreținerea vehiculelor este activată de trecerea unei anumite perioade de timp, sau scăzând un anumit procent din gradul de rezistență al vehiculului STR_CONFIG_SETTING_SERVINT_TRAINS :Intervalul de întreținere implicit al trenurilor: {STRING} STR_CONFIG_SETTING_SERVINT_TRAINS_HELPTEXT :Alege perioada de întreținere implicită pentru noi vehicule feroviare, dacă nu există un interval de întreținere stabilit pentru vehicul -STR_CONFIG_SETTING_SERVINT_VALUE :{COMMA} zi{P 0 "" le}/% STR_CONFIG_SETTING_SERVINT_DISABLED :Dezactivat STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES :Intervalul de întreținere implicit al vehiculelor rutiere: {STRING} STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES_HELPTEXT :Alege perioada de întreținere implicită pentru noi vehicule rutiere, dacă nu există un interval de întreținere stabilit pentru vehicul @@ -1518,13 +1543,17 @@ STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Ştirile color STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Anul începând cu care anunțurile din ziar sunt tipărite color. Înainte de acest an, anunturile sunt monocrome (alb/negru) STR_CONFIG_SETTING_STARTING_YEAR :Anul de început al jocului: {STRING} STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} +STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Niciodată +STR_CONFIG_SETTING_ECONOMY_TYPE :Tipul economiei: {STRING} +STR_CONFIG_SETTING_ECONOMY_TYPE_ORIGINAL :Original +STR_CONFIG_SETTING_ECONOMY_TYPE_SMOOTH :Lin +STR_CONFIG_SETTING_ECONOMY_TYPE_FROZEN :Înghețată STR_CONFIG_SETTING_ALLOW_SHARES :Permite cumpărarea de acţiuni de la alte companii: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Dacă este activată, se permite cumpărarea și vânzarea de acțiuni ale companiilor. Acțiunile devin disponibile doar când compania depășește o anumită vârstă STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Procentul din profitul pe secţiune care să fie plătit pentru alimentare: {STRING} STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :Procentul din câştig care este oferit legăturilor intermediare pentru alimentare, oferind mai mult control asupra încasărilor STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :Când se trage cu mouse-ul, plasează semnale la fiecare: {STRING} -STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Configurează distanţa la care se vor construi semnale pe şină până la următorul obstacol (semnal, intersecţie), dacâ se trage cu mouse-ul -STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} pătrăţel{P 0 "" e} +STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Configurează distanța la care se vor construi semnale pe șină până la următorul obstacol (semnal, intersecție), dacă se trage cu mausul STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :La plasarea mai multor semale, păstrează distanţa fixă între acestea: {STRING} STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Construieşte automat semafoare înainte de: {STRING} STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Alege anul din care se vor folosi semnale electrice pe calea feroviară. Înainte de acest an, se vor folosi semnale non-electrice care au aceeasi funcționalitate dar arată diferit @@ -1566,13 +1595,15 @@ STR_CONFIG_SETTING_TOWN_CARGOGENMODE_BITCOUNT :Liniar STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :Poziţionarea copacilor în joc: {STRING} STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :Controlează apariția aleatoare a copacilor în joc. Este posibil ca această opțiune să afecteze industrii care depind de creșterea copacilor, cum ar fi fabricile de cherestea +STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_SPREAD :Cresc dar nu se extind {RED}(strică fabrica de cherestea) +STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_RAINFOREST :Cresc dar se extind doar în păduri tropicale +STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_ALL :Cresc și se extind peste tot STR_CONFIG_SETTING_TOOLBAR_POS :Poziţia barei principale de instrumente: {STRING} STR_CONFIG_SETTING_TOOLBAR_POS_HELPTEXT :Poziţia orizontală a barei principale în partea de sus a ecranului STR_CONFIG_SETTING_STATUSBAR_POS :Poziţia barei de stare: {STRING} STR_CONFIG_SETTING_STATUSBAR_POS_HELPTEXT :Poziţia orizontală a barei principale în partea de jos a ecranului STR_CONFIG_SETTING_SNAP_RADIUS :Raza "magnetică" a ferestrelor: {STRING} -STR_CONFIG_SETTING_SNAP_RADIUS_VALUE :{COMMA} pixel{P 0 "" i} STR_CONFIG_SETTING_SNAP_RADIUS_DISABLED :Dezactivat STR_CONFIG_SETTING_SOFT_LIMIT :Numărul maxim de ferestre nefixate: {STRING} STR_CONFIG_SETTING_SOFT_LIMIT_VALUE :{COMMA} @@ -1580,12 +1611,14 @@ STR_CONFIG_SETTING_SOFT_LIMIT_DISABLED :dezactivat STR_CONFIG_SETTING_ZOOM_MIN :Nivelul maxim de apropiere imagine: {STRING} STR_CONFIG_SETTING_ZOOM_MIN_HELPTEXT :Nivelul maxim de apropiere a câmpului vizual. Luați aminte că nivelele înalte ridică necesarul de memorie STR_CONFIG_SETTING_ZOOM_MAX :Nivelul maxim de îndepărtare imagine: {STRING} +STR_CONFIG_SETTING_SPRITE_ZOOM_MIN :Rezoluția maximă pentru sprite-uri: {STRING} STR_CONFIG_SETTING_ZOOM_LVL_MIN :x4 STR_CONFIG_SETTING_ZOOM_LVL_IN_2X :x2 STR_CONFIG_SETTING_ZOOM_LVL_NORMAL :Normal STR_CONFIG_SETTING_ZOOM_LVL_OUT_2X :x2 STR_CONFIG_SETTING_ZOOM_LVL_OUT_4X :x4 STR_CONFIG_SETTING_ZOOM_LVL_OUT_8X :x8 +STR_CONFIG_SETTING_SPRITE_ZOOM_LVL_IN_2X :2x STR_CONFIG_SETTING_TOWN_GROWTH :Viteza de dezvoltare a oraşului: {STRING} STR_CONFIG_SETTING_TOWN_GROWTH_HELPTEXT :Viteza creşterii oraşelor STR_CONFIG_SETTING_TOWN_GROWTH_NONE :Deloc @@ -1600,8 +1633,7 @@ STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :deloc STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Multiplicator iniţial dimensiune oraş: {STRING} STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Dimensiunea medie a oraşelor mari relativ la oraşele normale, la începutul jocului -STR_CONFIG_SETTING_LINKGRAPH_INTERVAL :Actualizează graficul de distribuţie la fiecare {STRING} zi{P 0:2 "" le} -STR_CONFIG_SETTING_LINKGRAPH_TIME :Acordă {STRING} zi{P 0:2 "" le} pentru recalcularea graficului de distribuţie +STR_CONFIG_SETTING_LINKGRAPH_INTERVAL_HELPTEXT :Interval de timp între recalculările graficului de conexiuni. Fiecare recalculare calculează planurile unei componente ale graficului. Asta înseamnă că o valoare X pentru această setare nu va duce la actualizarea întregului grafic la fiecare X zile, ci doar o componentă va fi actualizată. Cu cât e mai mică valoarea, cu atât mai timp CPU va fi necesar pentru calcule. Cu cât e mai mare valoarea, cu atât va dura mai mult până va începe distribuția mărfii pe rute noi. STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :manual STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC :asimetric STR_CONFIG_SETTING_DISTRIBUTION_SYMMETRIC :simetric @@ -1611,6 +1643,7 @@ STR_CONFIG_SETTING_DISTRIBUTION_MAIL :Modalitatea de STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :"simetric" înseamnă că aproximativ aceeași cantitate de poștă va fi expediată din stația A spre stația B, precum de la B la A. "asimetric" presupune expedierea de cantități arbitrare de poștă în fiecare direcție. "manual" înseamnă că repartizarea poștei nu va fi automatizată. STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED :Modalitatea de distribuire pentru clasa de cargo BLINDAT: {STRING} STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :Modalitatea de distribuire pentru alte clase de cargo: {STRING} +STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :"asimetric" înseamnă că pot fi trimise cantități diferite de marfă în ambele direcții. "manual" înseamnă că nu se va face distribuție automată pentru acele mărfuri. STR_CONFIG_SETTING_LINKGRAPH_ACCURACY :Acurateţea distribuţiei: {STRING} STR_CONFIG_SETTING_DEMAND_DISTANCE :Efectul distanţei asupra cererii: {STRING} STR_CONFIG_SETTING_DEMAND_DISTANCE_HELPTEXT :Dacă setezi această valoare peste 0, distanța dintre stația origine A al mărfii și o posibilă stație B va afecta cantitatea de marfă trimisă din punctul A în B. Cu cât e mai departe B de A cu atât va fi mai mică cantitatea de marfă transportată. Cu cât mărești această valoare, cu atât mai puțină marfă se livrează spre destinațiile îndepărtate si cu atât mai multă la cele mai apropiate. @@ -1622,6 +1655,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Afişează vite STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :Imperial (mph) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :Metric (km/h) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :SI (m/s) +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS :Unități de joc (dale/zi) STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Unitate putere vehicule: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :Afişează puterea vehiculelor în interfaţă folosind unităţile selectate @@ -1664,7 +1698,9 @@ STR_CONFIG_SETTING_ADVISORS :{ORANGE}Știri STR_CONFIG_SETTING_COMPANY :{ORANGE}Companie STR_CONFIG_SETTING_ACCOUNTING :{ORANGE}Contabilitate STR_CONFIG_SETTING_VEHICLES :{ORANGE}Vehicule +STR_CONFIG_SETTING_VEHICLES_PHYSICS :{ORANGE}Fizică STR_CONFIG_SETTING_VEHICLES_ROUTING :{ORANGE}Direcţionare +STR_CONFIG_SETTING_LIMITATIONS :{ORANGE}Limitări STR_CONFIG_SETTING_ACCIDENTS :{ORANGE}Dezastre / Accidente STR_CONFIG_SETTING_GENWORLD :{ORANGE}Generare lume STR_CONFIG_SETTING_ENVIRONMENT :{ORANGE}Mediu @@ -1710,6 +1746,7 @@ STR_CONFIG_ERROR_OUT_OF_MEMORY :{WHITE}Fără m STR_CONFIG_ERROR_SPRITECACHE_TOO_BIG :{WHITE}Nu s-au putut rezerva {BYTES} pentru cache al sprite-urilor. Mărimea cache-ului a fost redusă la {BYTES}. Performanța OpenTTD va fi redusă. Pentru a micșora cerințele jocului cu privire la memorie, poți încerca să dezactivezi modul grafic 32bpp și/sau reducerea numărului de nivele zoom # Video initalization errors +STR_VIDEO_DRIVER_ERROR_NO_HARDWARE_ACCELERATION :{WHITE}... GPU incompatibil. Accelerarea hardware este dezactivată # Intro window STR_INTRO_CAPTION :{WHITE}OpenTTD {REV} @@ -1749,7 +1786,6 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Verific STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Afişează setările pentru Inteligența Artificială şi pentru Scripturi Joc STR_INTRO_TOOLTIP_QUIT :{BLACK}Ieşi din 'OpenTTD' -STR_INTRO_TRANSLATION :{BLACK}Acestei traduceri îi lipse{P 0 "şte" "sc"} {NUM} text{P "" e}. Te rugăm să ajuti la îmbunătățirea OpenTTD înrolându-te ca traducător. Citește fișierul readme.txt pentru detalii. # Quit window STR_QUIT_CAPTION :{WHITE}Ieşire din joc @@ -1758,9 +1794,9 @@ STR_QUIT_YES :{BLACK}Da STR_QUIT_NO :{BLACK}Nu # Abandon game -STR_ABANDON_GAME_CAPTION :{WHITE}Ieşire din joc -STR_ABANDON_GAME_QUERY :{YELLOW}Eşti sigur că vrei să renunţi la acest joc? -STR_ABANDON_SCENARIO_QUERY :{YELLOW}Eşti sigur că vrei să renunţi la acest scenariu? +STR_ABANDON_GAME_CAPTION :{WHITE}Ieșire din joc +STR_ABANDON_GAME_QUERY :{YELLOW}Sigur vrei să renunți la acest joc? +STR_ABANDON_SCENARIO_QUERY :{YELLOW}Sigur vrei să renunți la acest scenariu? # Cheat window STR_CHEATS :{WHITE}Cheat-uri @@ -1770,8 +1806,8 @@ STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Joacă STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Buldozer magic (demolează industrii şi lucruri amovibile): {ORANGE}{STRING} STR_CHEAT_CROSSINGTUNNELS :{LTBLUE}Tunelele se pot intersecta: {ORANGE}{STRING} STR_CHEAT_NO_JETCRASH :{LTBLUE}Avioanele cu reacţie nu se vor prăbuşi (frecvent) pe aeroporturile mici: {ORANGE}{STRING} -STR_CHEAT_EDIT_MAX_HL :{LTBLUE}Schimbă înălţimea maximă a harţii: {ORANGE}{NUM} -STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT :{WHITE}Schimbă înălţimea maxima a munţilor pe hartă +STR_CHEAT_EDIT_MAX_HL :{LTBLUE}Schimbă înălțimea maximă a hărții: {ORANGE}{NUM} +STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT :{WHITE}Schimbă înălțimea maximă a munților pe hartă 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 @@ -1916,6 +1952,10 @@ STR_NETWORK_SERVER_LIST_JOIN_GAME :{BLACK}Intră STR_NETWORK_SERVER_LIST_REFRESH :{BLACK}Actualizează serverul STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}Actualizează informaţiile despre server +STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET :{BLACK}Caută pe internet +STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET_TOOLTIP :{BLACK}Caută servere publice în internet +STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN :{BLACK}Caută în LAN +STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN_TOOLTIP :{BLACK}Caută servere în rețeaua locală STR_NETWORK_SERVER_LIST_ADD_SERVER :{BLACK}Adaugă un server STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Adaugă un server la lista care va fi verificată pentru jocuri active STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Porneşte serverul @@ -1936,13 +1976,10 @@ STR_NETWORK_START_SERVER_ADVERTISED_LABEL :{BLACK}Publicat STR_NETWORK_START_SERVER_ADVERTISED_TOOLTIP :{BLACK}Alege între un joc publicat (prin Internet) și unul privat (reț) game STR_NETWORK_START_SERVER_UNADVERTISED :Nu STR_NETWORK_START_SERVER_ADVERTISED :Da -STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} clien{P t ţi} STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Număr maxim de clienţi: STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Alege un număr maxim de clienţi. Nu trebuie ocupate toate locurile. -STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} compan{P ie ii} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Companii maxim: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Limitează serverul la un anumit număr de companii -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} spectator{P "" i} STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Spectatori maxim: STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Limitează serverul la un anumit număr de spectatori STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Limba vorbită: @@ -2029,7 +2066,6 @@ STR_NETWORK_CONNECTING_6 :{BLACK}(6/6) Î STR_NETWORK_CONNECTING_SPECIAL_1 :{BLACK}Preluare informaţii joc... STR_NETWORK_CONNECTING_SPECIAL_2 :{BLACK}Preluare informaţii companie... ############ End of leave-in-this-order -STR_NETWORK_CONNECTING_WAITING :{BLACK}{NUM} clien{P t ţi} înaintea noastră STR_NETWORK_CONNECTING_DOWNLOADING_1 :{BLACK}{BYTES} descărcat până acum STR_NETWORK_CONNECTING_DOWNLOADING_2 :{BLACK}{BYTES} / {BYTES} descărcaţi până acum @@ -2135,10 +2171,11 @@ STR_NETWORK_ERROR_CLIENT_GUI_LOST_CONNECTION :{WHITE}În ulti STR_NETWORK_SERVER_MESSAGE :*** {1:STRING} ############ Leave those lines in this order!! STR_NETWORK_SERVER_MESSAGE_GAME_PAUSED :Joc în pauză ({STRING}) -STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_1 :Jocul este încă în pauză ({STRING}) -STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_2 :Jocul este încă în pauză ({STRING}, {STRING}) -STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_3 :Jocul este încă în pauză ({STRING}, {STRING}, {STRING}) -STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_4 :Jocul este încă în pauză ({STRING}, {STRING}, {STRING}, {STRING}) +STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_1 :Jocul încă este în pauză ({STRING}) +STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_2 :Jocul încă este în pauză ({STRING}, {STRING}) +STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_3 :Jocul încă este în pauză ({STRING}, {STRING}, {STRING}) +STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_4 :Jocul încă este în pauză ({STRING}, {STRING}, {STRING}, {STRING}) +STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_5 :Jocul încă este în pauză ({STRING}, {STRING}, {STRING}, {STRING}, {STRING}) STR_NETWORK_SERVER_MESSAGE_GAME_UNPAUSED :Jocul continuă ({STRING}) STR_NETWORK_SERVER_MESSAGE_GAME_REASON_NOT_ENOUGH_PLAYERS :număr de jucători STR_NETWORK_SERVER_MESSAGE_GAME_REASON_CONNECTING_CLIENTS :conectare clienţi @@ -2156,6 +2193,7 @@ STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} ş STR_NETWORK_MESSAGE_GIVE_MONEY :*** {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}) # Content downloading window STR_CONTENT_TITLE :{WHITE}Descărcare resurse online @@ -2178,7 +2216,7 @@ STR_CONTENT_FILTER_TITLE :{BLACK}Filtru n STR_CONTENT_OPEN_URL :{BLACK}Vizitează site-ul web STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}Vizitează site-ul web al acestei resurse STR_CONTENT_DOWNLOAD_CAPTION :{BLACK}Descarcă -STR_CONTENT_DOWNLOAD_CAPTION_TOOLTIP :{BLACK}Porneşte descărcarea resurselor selectate +STR_CONTENT_DOWNLOAD_CAPTION_TOOLTIP :{BLACK}Pornește descărcarea resurselor selectate STR_CONTENT_TOTAL_DOWNLOAD_SIZE :{SILVER}Total de descărcat: {WHITE}{BYTES} STR_CONTENT_DETAIL_TITLE :{SILVER}INFO RESURSĂ STR_CONTENT_DETAIL_SUBTITLE_UNSELECTED :{SILVER}Această resursă nu a fost selectată pentru descărcare @@ -2220,7 +2258,7 @@ STR_CONTENT_DOWNLOAD_PROGRESS_SIZE :{WHITE}{BYTES} # Content downloading error messages STR_CONTENT_ERROR_COULD_NOT_CONNECT :{WHITE}Conectare la server eşuată... -STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD :{WHITE}Descărcare eşuată +STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD :{WHITE}Descărcare eșuată STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD_CONNECTION_LOST :{WHITE}... conexiune întreruptă STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD_FILE_NOT_WRITABLE :{WHITE}... fişierul nu poate fi scris STR_CONTENT_ERROR_COULD_NOT_EXTRACT :{WHITE}Fişierul descărcat nu a putut fi decompresat @@ -2230,6 +2268,8 @@ STR_MISSING_GRAPHICS_SET_MESSAGE :{BLACK}OpenTTD STR_MISSING_GRAPHICS_YES_DOWNLOAD :{BLACK}Da, descarcă pachetele grafice STR_MISSING_GRAPHICS_NO_QUIT :{BLACK}Nu, ieși din OpenTTD +STR_MISSING_GRAPHICS_ERROR_TITLE :{WHITE}Descărcarea a eșuat +STR_MISSING_GRAPHICS_ERROR :{BLACK}Descărcarea graficii a eșuat.{}Vă rugăm descărcați manual grafica. # Transparency settings window STR_TRANSPARENCY_CAPTION :{WHITE}Optiuni transparenţă @@ -2249,6 +2289,7 @@ STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Legenda STR_LINKGRAPH_LEGEND_ALL :{BLACK}Toate STR_LINKGRAPH_LEGEND_NONE :{BLACK}Nici una STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Alege companiile care vor fi afișate +STR_LINKGRAPH_LEGEND_COMPANY_TOOLTIP :{BLACK}{STRING}{}{COMPANY} # Linkgraph legend window and linkgraph legend in smallmap STR_LINKGRAPH_LEGEND_UNUSED :{TINY_FONT}{BLACK}nefolosit @@ -2375,7 +2416,10 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Construi STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Construieşte tunel pentru tramvaie. Shift comută între construire/afişare cost estimat STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}Comutator pentru construcţie/înlăturare şosele STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Comută construcţie/înlăturare pentru şine de tramvai +STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD :{BLACK}Convertește/Modernizează tipul drumului. Shift comută construcția/afișarea costului estimat +STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM :{BLACK}Convertește/Modernizează tipul tramvaiului. Shift comută construcția/afișarea costului estimat +STR_ROAD_NAME_TRAM :Șină de tramvai # Road depot construction window STR_BUILD_DEPOT_ROAD_ORIENTATION_CAPTION :{WHITE}Orientarea autobazei @@ -2463,6 +2507,11 @@ STR_TREES_RANDOM_TYPE :{BLACK}Arbori d STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Plantează arbori din diverse specii la întâmplare. Shift comută între plantare/afişare cost estimat STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Arbori aleatori STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Plantează aleator arbori pe uscat +STR_TREES_MODE_NORMAL_BUTTON :{BLACK}Normal +STR_TREES_MODE_NORMAL_TOOLTIP :{BLACK}Plantează copaci trăgându-i peste peisaj. +STR_TREES_MODE_FOREST_SM_BUTTON :{BLACK}Dumbravă +STR_TREES_MODE_FOREST_LG_BUTTON :{BLACK}Pădure +STR_TREES_MODE_FOREST_LG_TOOLTIP :{BLACK}Plantează păduri întinse prin tragerea peste peisaj. # Land generation window (SE) STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}Generator suprafaţă uscat @@ -2519,6 +2568,8 @@ STR_FUND_INDUSTRY_INDUSTRY_BUILD_COST :{BLACK}Cost: {Y STR_FUND_INDUSTRY_PROSPECT_NEW_INDUSTRY :{BLACK}Prospectează STR_FUND_INDUSTRY_BUILD_NEW_INDUSTRY :{BLACK}Construieşte STR_FUND_INDUSTRY_FUND_NEW_INDUSTRY :{BLACK}Finanţează +STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES :{BLACK}Elimină toate industriile +STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_QUERY :{YELLOW}Sigur vrei să elimini toate industriile? # Industry cargoes window STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Lanţ industrial pentru industria {STRING} @@ -2539,6 +2590,7 @@ STR_INDUSTRY_CARGOES_SELECT_INDUSTRY_TOOLTIP :{BLACK}Alege in # Land area window STR_LAND_AREA_INFORMATION_CAPTION :{WHITE}Informaţii teren +STR_LAND_AREA_INFORMATION_LOCATION_TOOLTIP :{BLACK}Centrează vizorul principal pe locația dalei. Ctrl+clic deschide un vizor nou pe locația dalei STR_LAND_AREA_INFORMATION_COST_TO_CLEAR_N_A :{BLACK}Costul demolării: {LTBLUE}nu este cazul STR_LAND_AREA_INFORMATION_COST_TO_CLEAR :{BLACK}Costul demolării: {RED}{CURRENCY_LONG} STR_LAND_AREA_INFORMATION_REVENUE_WHEN_CLEARED :{BLACK}Încasări după curăţare: {LTBLUE}{CURRENCY_LONG} @@ -2563,6 +2615,7 @@ STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Tip șin STR_LANG_AREA_INFORMATION_TRAM_TYPE :{BLACK}Tip de tramvai: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Limită viteză pe calea ferată: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Viteza limită a drumului: {LTBLUE}{VELOCITY} +STR_LANG_AREA_INFORMATION_TRAM_SPEED_LIMIT :{BLACK}Limită de viteză tramvai: {LTBLUE}{VELOCITY} # Description of land area of different tiles STR_LAI_CLEAR_DESCRIPTION_ROCKS :Stânci @@ -2663,21 +2716,37 @@ STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD # Framerate display window STR_FRAMERATE_CAPTION :{WHITE}FPS +STR_FRAMERATE_CAPTION_SMALL :{STRING}{WHITE} ({DECIMAL}x) +STR_FRAMERATE_RATE_GAMELOOP :{BLACK}Viteza simulării: {STRING} STR_FRAMERATE_RATE_GAMELOOP_TOOLTIP :{BLACK}Număr de evenimente de joc simulate per secundă. +STR_FRAMERATE_RATE_BLITTER_TOOLTIP :{BLACK}Numărul de cadre video randate per secundă. +STR_FRAMERATE_SPEED_FACTOR :{BLACK}Factorul actual de viteză a jocului: {DECIMAL}x STR_FRAMERATE_AVERAGE :{WHITE}Medie STR_FRAMERATE_MEMORYUSE :{WHITE}Memorie STR_FRAMERATE_DATA_POINTS :{BLACK}Date bazate pe măsurători {COMMA} STR_FRAMERATE_MS_GOOD :{LTBLUE}{DECIMAL} ms +STR_FRAMERATE_FPS_GOOD :{LTBLUE}{DECIMAL} cadre/s +STR_FRAMERATE_FPS_WARN :{YELLOW}{DECIMAL} cadre/s STR_FRAMERATE_FPS_BAD :{RED}{DECIMAL} cadre/s STR_FRAMERATE_BYTES_WARN :{YELLOW}{BYTES} +STR_FRAMERATE_BYTES_BAD :{RED}{BYTES} STR_FRAMERATE_GRAPH_MILLISECONDS :{TINY_FONT}{COMMA} ms +STR_FRAMERATE_GRAPH_SECONDS :{TINY_FONT}{COMMA} s ############ Leave those lines in this order!! +STR_FRAMERATE_GL_LINKGRAPH :{BLACK} Decalaj grafic de conexiuni: +STR_FRAMERATE_DRAWING :{BLACK}Randare grafică: +STR_FRAMERATE_DRAWING_VIEWPORTS :{BLACK} Vizoare globale: STR_FRAMERATE_VIDEO :{BLACK}Ieșire video: STR_FRAMERATE_GAMESCRIPT :{BLACK} Script joc: +STR_FRAMERATE_AI :{BLACK} IA {NUM} {STRING} ############ End of leave-in-this-order ############ Leave those lines in this order!! STR_FRAMETIME_CAPTION_GAMELOOP :Buclă de joc STR_FRAMETIME_CAPTION_GL_ECONOMY :Manipularea încărcăturilor +STR_FRAMETIME_CAPTION_DRAWING :Randare grafică +STR_FRAMETIME_CAPTION_DRAWING_VIEWPORTS :Randarea vizorului global +STR_FRAMETIME_CAPTION_SOUND :Mixaj de sunet +STR_FRAMETIME_CAPTION_AI :IA {NUM} {STRING} ############ End of leave-in-this-order @@ -2704,6 +2773,8 @@ STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}Nicio in 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_OVERWRITE_TITLE :{WHITE}Suprascrie fișierul +STR_SAVELOAD_DIRECTORY :{STRING} (listă) STR_SAVELOAD_OSKTITLE :{BLACK}Introduceţi un nume pentru salvare @@ -2715,6 +2786,11 @@ STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Nr. de oraşe: STR_MAPGEN_DATE :{BLACK}Data: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Nr. de industrii: +STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Cel mai înalt vârf: +STR_MAPGEN_SNOW_COVERAGE_UP :{BLACK}Mărește acoperirea cu zăpadă cu zece procente +STR_MAPGEN_DESERT_COVERAGE_UP :{BLACK}Mărește întinderea deșertului cu zece procente +STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Reduce întinderea deșertului cu zece procente +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: @@ -2740,6 +2816,9 @@ STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Nume har STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Dimensiune: STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM} +STR_MAPGEN_HEIGHTMAP_HEIGHT_QUERY_CAPT :{WHITE}Cel mai înalt vârf +STR_MAPGEN_SNOW_COVERAGE_QUERY_CAPT :{WHITE}Acoperire cu zăpadă (în %) +STR_MAPGEN_DESERT_COVERAGE_QUERY_CAPT :{WHITE}Acoperire cu deșert (în %) STR_MAPGEN_START_DATE_QUERY_CAPT :{WHITE}Modifică anul de început # SE Map generation @@ -2812,7 +2891,11 @@ STR_NEWGRF_SETTINGS_VERSION :{BLACK}Versiune STR_NEWGRF_SETTINGS_MIN_VERSION :{BLACK}Vers. minimă compatibilă: {SILVER}{NUM} STR_NEWGRF_SETTINGS_MD5SUM :{BLACK}MD5sum: {SILVER}{STRING} STR_NEWGRF_SETTINGS_PALETTE :{BLACK}Paletă: {SILVER}{STRING} +STR_NEWGRF_SETTINGS_PALETTE_DEFAULT :Implicit (D) +STR_NEWGRF_SETTINGS_PALETTE_DEFAULT_32BPP :Implicit (D) / 32 bpp +STR_NEWGRF_SETTINGS_PALETTE_LEGACY :Legacy (W) STR_NEWGRF_SETTINGS_PARAMETER :{BLACK}Parametri: {SILVER}{STRING} +STR_NEWGRF_SETTINGS_PARAMETER_NONE :Nimic STR_NEWGRF_SETTINGS_NO_INFO :{BLACK}Nicio informaţie disponibilă STR_NEWGRF_SETTINGS_NOT_FOUND :{RED}Niciun fisier potrivit @@ -2820,9 +2903,12 @@ STR_NEWGRF_SETTINGS_DISABLED :{RED}Dezactivat STR_NEWGRF_SETTINGS_INCOMPATIBLE :{RED}Incompatibil cu această versiune de OpenTTD # NewGRF save preset window +STR_SAVE_PRESET_CAPTION :{WHITE}Salvează presetarea +STR_SAVE_PRESET_LIST_TOOLTIP :{BLACK}Lista presetărilor disponibile; alegeți una pentru salvare cu numele de mai jos STR_SAVE_PRESET_TITLE :{BLACK}Adaugă denumire presetare STR_SAVE_PRESET_CANCEL :{BLACK}Anulează STR_SAVE_PRESET_CANCEL_TOOLTIP :{BLACK}Nu schimba setarea implicită +STR_SAVE_PRESET_SAVE :{BLACK}Salvează STR_SAVE_PRESET_SAVE_TOOLTIP :{BLACK}Salvează setarea pe numele selectat # NewGRF parameters window @@ -2933,7 +3019,6 @@ STR_INVALID_VEHICLE : STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}Jocul a fost salvat într-o versiune fără suport pentru tramvaie. Toate tramvaiele au fost eliminate @@ -4074,6 +4182,7 @@ STR_WARNING_FALLBACK_SOUNDSET :{WHITE}Doar un STR_WARNING_SCREENSHOT_SIZE_CAPTION :{WHITE}Imagine de dimensiune foarte mare STR_WARNING_SCREENSHOT_SIZE_MESSAGE :{YELLOW}Imaginea capturată va avea o dimensiune de {COMMA} x {COMMA} pixeli. Realizarea unei capturi va dura ceva timp. Dorești să continui? +STR_MESSAGE_HEIGHTMAP_SUCCESSFULLY :{WHITE}Harta înălțimilor s-a salvat cu succes ca '{STRING}'. Cel mai înalt vârf este {NUM} STR_MESSAGE_SCREENSHOT_SUCCESSFULLY :{WHITE}Imagine salvată cu succes pe disc în fişierul '{STRING}' STR_ERROR_SCREENSHOT_FAILED :{WHITE}Imaginea nu a putut fi capturată! @@ -4127,6 +4236,7 @@ STR_ERROR_LOAN_ALREADY_REPAYED :{WHITE}... nu a STR_ERROR_CURRENCY_REQUIRED :{WHITE}... ai nevoie de {CURRENCY_LONG} STR_ERROR_CAN_T_REPAY_LOAN :{WHITE}Nu poţi plăti creditul... STR_ERROR_INSUFFICIENT_FUNDS :{WHITE}Nu poţi dona din banii împrumutaţi de la bancă... +STR_ERROR_CAN_T_GIVE_MONEY :{WHITE}Nu se pot da bani acestei companii... STR_ERROR_CAN_T_BUY_COMPANY :{WHITE}Nu se poate cumpăra compania... STR_ERROR_CAN_T_BUILD_COMPANY_HEADQUARTERS :{WHITE}Nu se poate construi sediul companiei... STR_ERROR_CAN_T_BUY_25_SHARE_IN_THIS :{WHITE}Nu se pot cumpăra 25% din acţiunile acestei companii... @@ -4239,7 +4349,7 @@ STR_ERROR_TRAINS_CAN_ONLY_BE_ALTERED_INSIDE_A_DEPOT :{WHITE}Trenuril STR_ERROR_TRAIN_TOO_LONG :{WHITE}Tren prea lung STR_ERROR_CAN_T_REVERSE_DIRECTION_RAIL_VEHICLE :{WHITE}Nu se poate inversa direcţia vehiculului... STR_ERROR_CAN_T_REVERSE_DIRECTION_RAIL_VEHICLE_MULTIPLE_UNITS :{WHITE}... este alcătuit din mai multe unități -STR_ERROR_INCOMPATIBLE_RAIL_TYPES :Tipuri de sine incompatibile +STR_ERROR_INCOMPATIBLE_RAIL_TYPES :Tipurile de șine sunt incompatibile STR_ERROR_CAN_T_MOVE_VEHICLE :{WHITE}Nu se poate muta vehiculul... STR_ERROR_REAR_ENGINE_FOLLOW_FRONT :{WHITE}Al doilea vagon+motor va avea mereu aceeasi destinatie ca si primul @@ -4252,6 +4362,7 @@ STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :Tip incorect de STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} este prea lung după înlocuire STR_ERROR_AUTOREPLACE_NOTHING_TO_DO :{WHITE}Nicio regulă autoînlocuire/reînnoire aplicată STR_ERROR_AUTOREPLACE_MONEY_LIMIT :(fonduri limitate) +STR_ERROR_AUTOREPLACE_INCOMPATIBLE_CARGO :{WHITE}Noul vehicul nu poate transporta {STRING} # Rail construction errors STR_ERROR_IMPOSSIBLE_TRACK_COMBINATION :{WHITE}Combinaţie de linii imposibilă @@ -4279,6 +4390,10 @@ STR_ERROR_CAN_T_REMOVE_ROAD_FROM :{WHITE}Nu se po STR_ERROR_CAN_T_REMOVE_TRAMWAY_FROM :{WHITE}Nu pot înlătura şina de tramvai de aici... STR_ERROR_THERE_IS_NO_ROAD :{WHITE}...nu există drum aici STR_ERROR_THERE_IS_NO_TRAMWAY :{WHITE}...nu există şină de tramvai aici +STR_ERROR_CAN_T_CONVERT_ROAD :{WHITE}Tipul de drum nu poate fi convertit aici... +STR_ERROR_NO_SUITABLE_ROAD :{WHITE}Niciun drum adecvat +STR_ERROR_NO_SUITABLE_TRAMWAY :{WHITE}Niciun tramvai adecvat +STR_ERROR_INCOMPATIBLE_TRAMWAY :{WHITE}... tramvai incompatibil # Waterway construction errors STR_ERROR_CAN_T_BUILD_CANALS :{WHITE}Nu pot construi un canal aici... @@ -4407,8 +4522,8 @@ STR_ERROR_CAN_T_INSERT_NEW_ORDER :{WHITE}Nu se po STR_ERROR_CAN_T_DELETE_THIS_ORDER :{WHITE}Nu se poate şterge această comandă... STR_ERROR_CAN_T_MODIFY_THIS_ORDER :{WHITE}Nu se poate modifica această comandă... STR_ERROR_CAN_T_MOVE_THIS_ORDER :{WHITE}Nu pot muta acest ordin... -STR_ERROR_CAN_T_SKIP_ORDER :{WHITE}Nu pot renunta la comanda actuala... -STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}Nu pot sări la ordinul selectat... +STR_ERROR_CAN_T_SKIP_ORDER :{WHITE}Nu se poate sări peste comanda actuală... +STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}Nu pot sări la comanda selectată... 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 @@ -4434,15 +4549,15 @@ STR_ERROR_CAN_T_DELETE_SIGN :{WHITE}Nu pot s STR_DESKTOP_SHORTCUT_COMMENT :Un joc de simulare bazat pe Transport Tycoon Deluxe # Translatable descriptions in media/baseset/*.ob* files -STR_BASEGRAPHICS_DOS_DESCRIPTION :Setul grafic original al Transport Tycoon Deluxe pentru DOS. -STR_BASEGRAPHICS_DOS_DE_DESCRIPTION :Setul grafic original al Transport Tycoon Deluxe pentru DOS (ediţia germană). -STR_BASEGRAPHICS_WIN_DESCRIPTION :Setul grafic original al Transport Tycoon Deluxe pentru Windows. -STR_BASESOUNDS_DOS_DESCRIPTION :Setul de sunete original al Transport Tycoon Deluxe pentru DOS. -STR_BASESOUNDS_WIN_DESCRIPTION :Setul de sunete original al Transport Tycoon Deluxe pentru Windows. +STR_BASEGRAPHICS_DOS_DESCRIPTION :Grafica originală a ediției Transport Tycoon Deluxe pentru DOS. +STR_BASEGRAPHICS_DOS_DE_DESCRIPTION :Grafica originală a Transport Tycoon Deluxe pentru DOS (ediția germană). +STR_BASEGRAPHICS_WIN_DESCRIPTION :Grafica originală a ediției Transport Tycoon Deluxe pentru Windows. +STR_BASESOUNDS_DOS_DESCRIPTION :Sunetele originale ale ediției Transport Tycoon Deluxe pentru DOS. +STR_BASESOUNDS_WIN_DESCRIPTION :Sunetele originale ale Transport Tycoon Deluxe pentru Windows. STR_BASESOUNDS_NONE_DESCRIPTION :Un set de sunete fără nici un sunet inclus. -STR_BASEMUSIC_WIN_DESCRIPTION :Setul de muzică original al Transport Tycoon Deluxe pentru Windows. -STR_BASEMUSIC_DOS_DESCRIPTION :Setul de muzică original al Transport Tycoon Deluxe pentru DOS. -STR_BASEMUSIC_TTO_DESCRIPTION :Setul de muzică original al Transport (Original/World Editor) pentru DOS. +STR_BASEMUSIC_WIN_DESCRIPTION :Muzica originală a ediției Transport Tycoon Deluxe pentru Windows. +STR_BASEMUSIC_DOS_DESCRIPTION :Muzica originală a ediției Transport Tycoon Deluxe pentru DOS. +STR_BASEMUSIC_TTO_DESCRIPTION :Setul original de muzică al Transport Tycoon (Original/World Editor) pentru DOS. STR_BASEMUSIC_NONE_DESCRIPTION :Un set de muzică fără muzică inclusă. ##id 0x2000 @@ -4831,6 +4946,7 @@ STR_FORMAT_BUOY_NAME :{TOWN} Baliza STR_FORMAT_BUOY_NAME_SERIAL :{TOWN} Baliza #{COMMA} STR_FORMAT_COMPANY_NUM :(Companie {COMMA}) STR_FORMAT_GROUP_NAME :Grup {COMMA} +STR_FORMAT_GROUP_VEHICLE_NAME :{GROUP} #{COMMA} STR_FORMAT_INDUSTRY_NAME :{TOWN} {STRING} STR_FORMAT_WAYPOINT_NAME :Halta {TOWN} STR_FORMAT_WAYPOINT_NAME_SERIAL :Halta {TOWN} #{COMMA} diff --git a/src/lang/russian.txt b/src/lang/russian.txt index 5d5f88da..53c354c9 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -1148,9 +1148,12 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :Другое STR_GAME_OPTIONS_RESOLUTION_ITEM :{NUM}x{NUM} STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Аппаратное ускорение -STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Поставьте отметку, чтобы включить аппаратное ускорение в OpenTTD. Но для этого игру придётся перезапустить. +STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Нажмите здесь, чтобы включить/выключить аппаратное ускорение в OpenTTD. После этого игру потребуется перезапустить. STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Эта настройка будет применена только после перезапуска игры +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}Выберите размер элементов интерфейса @@ -1263,7 +1266,7 @@ STR_DISASTER_NONE :нет STR_DISASTER_REDUCED :сниженная STR_DISASTER_NORMAL :обычная -STR_SUBSIDY_X1_5 :x1.5 +STR_SUBSIDY_X1_5 :x1,5 STR_SUBSIDY_X2 :x2 STR_SUBSIDY_X3 :x3 STR_SUBSIDY_X4 :x4 @@ -1273,6 +1276,8 @@ STR_TERRAIN_TYPE_FLAT :Равнинн STR_TERRAIN_TYPE_HILLY :Холмистый STR_TERRAIN_TYPE_MOUNTAINOUS :Преимущественно горный STR_TERRAIN_TYPE_ALPINIST :Исключительно горный +STR_TERRAIN_TYPE_CUSTOM :Установить высоту вручную +STR_TERRAIN_TYPE_CUSTOM_VALUE :Установленная высота ({NUM}) STR_CITY_APPROVAL_PERMISSIVE :дозволяющее STR_CITY_APPROVAL_TOLERANT :терпимое @@ -1356,6 +1361,10 @@ STR_CONFIG_SETTING_DISASTERS_HELPTEXT :Включен STR_CONFIG_SETTING_CITY_APPROVAL :Отношение городского совета к реструктуризации окрестностей: {STRING} STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT :Выберите уровень влияния шума и загрязнения окружающей среды компаниями на их рейтинг в городах и возможность дальнейшего строительства около городов +STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT :Максимальная высота объектов на карте: {STRING} +STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT_HELPTEXT :Установить максимальное значение высоты гор на карте. «(Автовыбор)» подберёт приемлемое значение после создания ландшафта. +STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT_VALUE :{NUM} +STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT_AUTO :(автовыбор) STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN :{WHITE}Невозможно изменить максимальную высоту. На карте есть горы выше этого значения. STR_CONFIG_SETTING_AUTOSLOPE :Разрешить изм. ландшафта под зданиями, дорогами и т. д. (автоспуски): {STRING} STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :Разрешить изменение ландшафта под домами и дорогами, не требуя их сноса @@ -1500,8 +1509,13 @@ STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Выберит STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Макс. расстояние от края карты до предприятий нефтяной индустрии: {STRING} STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Эта настройка ограничивает расстояние от края карты до нефтяных платформ и нефтеперерабатывающих заводов. Таким образом, на краях карты, оканчивающихся водой, они будут строиться у берега. На картах размером более 256 это значение будет соответственно увеличено. STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Высота снеговой линии: {STRING} -STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Укажите, на какой высоте в субарктическом климате устанавливается снеговой покров. Наличие снега влияет на расстановку предприятий и на условия роста городов. -STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Укажите приблизительное количество пустыни на тропическом ландшафте. Пустыня также влияет на промышленное производство. Используется только во время создания карты +STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Это значение определяет, на какой высоте в субарктическом климате устанавливается снеговой покров. Наличие снега влияет на расстановку предприятий и на условия роста городов.{}Значение может быть установлено только в редакторе сценариев; иначе оно рассчитывается в зависимости от значения «снежного покрытия». +STR_CONFIG_SETTING_SNOW_COVERAGE :Снежное покрытие: {STRING} +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_VALUE :{NUM}% STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Грубость ландшафта: {STRING} STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(Только для TerraGenesis){}Выберите количество гор и холмов на карте. На гладком ландшафте холмов немного и они более пологие. На грубом - много гор, и ландшафт может показаться слишком однообразным. STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Очень гладкий @@ -3066,6 +3080,17 @@ STR_MAPGEN_BY :{BLACK}× STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Количество городов: STR_MAPGEN_DATE :{BLACK}Дата: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Кол-во предпр.: +STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Высочайшая вершина: +STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}Увеличить максимальную высоту гор на карте на 1 +STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}Уменьшить максимальную высоту гор на карте на 1 +STR_MAPGEN_SNOW_COVERAGE :{BLACK}Снежное покрытие: +STR_MAPGEN_SNOW_COVERAGE_UP :{BLACK}Увеличить площадь снежного покрытия на 10% +STR_MAPGEN_SNOW_COVERAGE_DOWN :{BLACK}Уменьшить площадь снежного покрытия на 10% +STR_MAPGEN_SNOW_COVERAGE_TEXT :{BLACK}{NUM}% +STR_MAPGEN_DESERT_COVERAGE :{BLACK}Песчаное покрытие: +STR_MAPGEN_DESERT_COVERAGE_UP :{BLACK}Увеличить площадь песчаного покрытия на 10% +STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Уменьшить площадь песчаного покрытия на 10% +STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}Генератор ландшафта: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Тип ландшафта: STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Количество морей и озёр: @@ -3091,7 +3116,10 @@ STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Назв STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Размер: STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} × {NUM} +STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT :{WHITE}Максимальная высота STR_MAPGEN_HEIGHTMAP_HEIGHT_QUERY_CAPT :{WHITE}Cамая высокая вершина +STR_MAPGEN_SNOW_COVERAGE_QUERY_CAPT :{WHITE}Снежное покрытие (в %) +STR_MAPGEN_DESERT_COVERAGE_QUERY_CAPT :{WHITE}Песчаное покрытие (в %) STR_MAPGEN_START_DATE_QUERY_CAPT :{WHITE}Изменить год начала игры # SE Map generation @@ -4520,6 +4548,7 @@ STR_WARNING_FALLBACK_SOUNDSET :{WHITE}Теку STR_WARNING_SCREENSHOT_SIZE_CAPTION :{WHITE}Огромный снимок экрана STR_WARNING_SCREENSHOT_SIZE_MESSAGE :{YELLOW}Снимок экрана будет иметь размер {COMMA}{NBSP}х{NBSP}{COMMA}{NBSP}пиксел{P ь я ей}. Его создание займёт некоторое время. Продолжить? +STR_MESSAGE_HEIGHTMAP_SUCCESSFULLY :{WHITE}Карта высот успешно сохранена под именем «{STRING}». Максимальная высота - {NUM}. STR_MESSAGE_SCREENSHOT_SUCCESSFULLY :{WHITE}Снимок экрана сохранён под именем «{STRING}» STR_ERROR_SCREENSHOT_FAILED :{WHITE}Не удалось сделать снимок экрана diff --git a/src/lang/serbian.txt b/src/lang/serbian.txt index e3b8dc01..a9362e57 100644 --- a/src/lang/serbian.txt +++ b/src/lang/serbian.txt @@ -1201,6 +1201,7 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Hardvers STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Označavanje ove opcije čini da OpenTTD pokuša da koristi hardversko ubrzanje. Promena ovog podešavanja će imati efekta tek nakon ponvnog pokretanja igre STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Podešavanje će imati efekta tek nakon ponovnog pokretanja igre + 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 diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index 205f8a98..891c597f 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -1005,6 +1005,7 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}硬件 STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}点击该复选框,让 OpenTTD 尝试使用硬件加速。修改后的设置将在游戏重启后生效 STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}修改后的设置将在游戏重启后生效 + STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}界面大小 STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}选择使用的界面元素大小 @@ -1021,6 +1022,7 @@ 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}图像 STR_GAME_OPTIONS_REFRESH_RATE :{BLACK}显示刷新率 STR_GAME_OPTIONS_REFRESH_RATE_TOOLTIP :{BLACK}选择需要的屏幕刷新率 @@ -1204,6 +1206,7 @@ STR_CONFIG_SETTING_CITY_APPROVAL :地区政府对 STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT :设置相关参数以决定各公司造成的噪音及环境破坏时,各城镇对该公司的评价及未来区域建设的影响。 STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT :地图高度限制:{STRING} +STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT_VALUE :{NUM} STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN :{WHITE}您不能把最高地面高度设为这个值,因为地图上至少有一座山丘的高度比这个值还大 STR_CONFIG_SETTING_AUTOSLOPE :允许在建筑、轨道等下方改变地形(自动斜坡): {STRING} STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :允许在建筑和轨道下方改变地形而不需要拆除他们 @@ -1468,6 +1471,9 @@ STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS_HELPTEXT :“打开”时 STR_CONFIG_SETTING_EXPENSES_LAYOUT :企业财政窗口中的组群支出:{STRING} STR_CONFIG_SETTING_EXPENSES_LAYOUT_HELPTEXT :“打开”时公司财务报表将分组显示 STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS :建造铁路时自动移除信号灯:{STRING} +STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT :快进速度上限:{STRING} +STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_VAL :{NUM}% 正常游戏速度 +STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_ZERO :无限制(在您的计算机能允许的范围内) STR_CONFIG_SETTING_SOUND_TICKER :产业新闻: {STRING} STR_CONFIG_SETTING_SOUND_TICKER_HELPTEXT :每月初产业新闻音效 @@ -2572,6 +2578,7 @@ STR_TREES_RANDOM_TYPE :{BLACK}随机 STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}种植随机类型的树木,按住 Shift 键可以显示所需资金 STR_TREES_RANDOM_TREES_BUTTON :{BLACK}随机树木 STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}随机地种植一些树木 +STR_TREES_MODE_FOREST_SM_BUTTON :{BLACK}树丛 STR_TREES_MODE_FOREST_LG_BUTTON :{BLACK}森林 # Land generation window (SE) @@ -3787,6 +3794,7 @@ STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}当车 STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE} STR_VEHICLE_VIEW_TRAIN_CENTER_TOOLTIP :{BLACK}将主视角中心移动到列车所在的位置。双击将会在主视角中跟踪列车。单击的同时按住Ctrl会在新视点中显示列车位置 +STR_VEHICLE_VIEW_ROAD_VEHICLE_CENTER_TOOLTIP :{BLACK} 将主视角中心移动到车辆所在的位置。双击将会在主视角中跟踪车辆。单击的同时按住 Ctrl 会在新视点中显示车辆位置 STR_VEHICLE_VIEW_SHIP_CENTER_TOOLTIP :{BLACK}将主视角中心移动到船只所在的位置。双击将会在主视角中跟踪船只。单击的同时按住Ctrl会在新视点中显示船只位置 STR_VEHICLE_VIEW_AIRCRAFT_CENTER_TOOLTIP :{BLACK}将主视角中心移动到飞机所在的位置。双击将会在主视角中跟踪飞机。单击的同时按住Ctrl会在新视点中显示飞机位置 @@ -3957,8 +3965,8 @@ STR_ORDERS_END_OF_SHARED_ORDERS :- - 共享调 STR_ORDER_NON_STOP :{BLACK}不停车 STR_ORDER_GO_TO :前往 STR_ORDER_GO_NON_STOP_TO :不停车前往 -STR_ORDER_GO_VIA :通过 -STR_ORDER_GO_NON_STOP_VIA :前往不停车 +STR_ORDER_GO_VIA :经由 +STR_ORDER_GO_NON_STOP_VIA :经由(不停车) STR_ORDER_TOOLTIP_NON_STOP :{BLACK}改变当前选中车站停车时的执行动作 STR_ORDER_TOGGLE_FULL_LOAD :{BLACK}装满任意货物 @@ -4375,6 +4383,7 @@ STR_ERROR_LOAN_ALREADY_REPAYED :{WHITE}没有 STR_ERROR_CURRENCY_REQUIRED :{WHITE}需要{CURRENCY_LONG} STR_ERROR_CAN_T_REPAY_LOAN :{WHITE}不能偿还贷款…… STR_ERROR_INSUFFICIENT_FUNDS :{WHITE}不能将银行的贷款送给别人…… +STR_ERROR_CAN_T_GIVE_MONEY :{WHITE}不能给予该公司资金…… STR_ERROR_CAN_T_BUY_COMPANY :{WHITE}不能收购公司…… STR_ERROR_CAN_T_BUILD_COMPANY_HEADQUARTERS :{WHITE}不能设置公司总部 STR_ERROR_CAN_T_BUY_25_SHARE_IN_THIS :{WHITE}不能购买此公司的股份…… @@ -4650,7 +4659,7 @@ STR_ERROR_NO_VEHICLES_AVAILABLE_YET_EXPLANATION :{WHITE}在{DATE # Specific vehicle errors STR_ERROR_CAN_T_MAKE_TRAIN_PASS_SIGNAL :{WHITE}不能让列车冒险通过信号... STR_ERROR_CAN_T_REVERSE_DIRECTION_TRAIN :{WHITE}不能命令列车调头... -STR_ERROR_TRAIN_START_NO_POWER :木有接触网! +STR_ERROR_TRAIN_START_NO_POWER :没有接触网! STR_ERROR_CAN_T_MAKE_ROAD_VEHICLE_TURN :{WHITE}车辆无法调头... diff --git a/src/lang/slovak.txt b/src/lang/slovak.txt index 2b2fd599..683f7958 100644 --- a/src/lang/slovak.txt +++ b/src/lang/slovak.txt @@ -1074,6 +1074,7 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Hardvér STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Zaškrtnutím políčka dovolíte, aby sa OpenTTD pokúsilo použiť hardvérové zrýchlenie. Zmena nastavenia sa uplatní až po reštartovaní hry STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Nastavenie sa uplatní až po reštartovaní hry + STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Veľkosť rozhrania STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Výber veľkosti prvkov rozhrania diff --git a/src/lang/slovenian.txt b/src/lang/slovenian.txt index 6b854c34..1e05e9f2 100644 --- a/src/lang/slovenian.txt +++ b/src/lang/slovenian.txt @@ -1123,6 +1123,7 @@ STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}Izberi l STR_GAME_OPTIONS_RESOLUTION_OTHER :drugo + STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Velikost vmesnika STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Izberi velikost elementa vmesnika diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt index fd76a474..8eccc712 100644 --- a/src/lang/spanish.txt +++ b/src/lang/spanish.txt @@ -119,7 +119,7 @@ STR_QUANTITY_SUGAR :{WEIGHT_LONG} d STR_QUANTITY_TOYS :{COMMA}{NBSP}juguete{P "" s} STR_QUANTITY_SWEETS :{COMMA}{NBSP}bolsa{P "" s} de caramelos STR_QUANTITY_COLA :{VOLUME_LONG} de cola -STR_QUANTITY_CANDYFLOSS :{WEIGHT_LONG} de algodón dulce +STR_QUANTITY_CANDYFLOSS :{WEIGHT_LONG} de algodón de azúcar STR_QUANTITY_BUBBLES :{COMMA} burbuja{P "" s} STR_QUANTITY_TOFFEE :{WEIGHT_LONG} de tofe{P "" s} STR_QUANTITY_BATTERIES :{COMMA} pila{P "" s} @@ -195,7 +195,7 @@ STR_COLOUR_DEFAULT :Por Defecto STR_UNITS_VELOCITY_IMPERIAL :{COMMA}{NBSP}mph STR_UNITS_VELOCITY_METRIC :{COMMA}{NBSP}km/h STR_UNITS_VELOCITY_SI :{COMMA}{NBSP}m/s -STR_UNITS_VELOCITY_GAMEUNITS :{DECIMAL} {NBSP}casillas/día +STR_UNITS_VELOCITY_GAMEUNITS :{DECIMAL}{NBSP}casillas/día STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}hp STR_UNITS_POWER_METRIC :{COMMA}{NBSP}cv @@ -315,7 +315,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 :Beneficios total del último año +STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Beneficio total del último año 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 @@ -1007,6 +1007,9 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Acelerac STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Marca esta casilla para permitir que OpenTTD intente usar aceleración por hardware. El cambio de configuración sólo tendrá efecto después de reiniciar el juego STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}El ajuste sólo tendrá efecto después de reiniciar el juego +STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}Sincronización vertical +STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Marca esta casilla para activar la sincronización vertical en la pantalla. El cambio sólo se aplicará después de reiniciar el juego. Sólo funciona si la aceleración por hardware está activada. + 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 @@ -1087,11 +1090,11 @@ STR_NUM_CUSTOM :Personalizado STR_NUM_CUSTOM_NUMBER :Personalizado ({NUM}) STR_VARIETY_NONE :Ninguna -STR_VARIETY_VERY_LOW :Muy baja +STR_VARIETY_VERY_LOW :Muy Baja STR_VARIETY_LOW :Baja STR_VARIETY_MEDIUM :Media STR_VARIETY_HIGH :Alta -STR_VARIETY_VERY_HIGH :Muy alta +STR_VARIETY_VERY_HIGH :Muy Alta STR_AI_SPEED_VERY_SLOW :Muy lenta STR_AI_SPEED_SLOW :Lenta @@ -1099,7 +1102,7 @@ STR_AI_SPEED_MEDIUM :Media STR_AI_SPEED_FAST :Rápida STR_AI_SPEED_VERY_FAST :Muy rápida -STR_SEA_LEVEL_VERY_LOW :Muy bajo +STR_SEA_LEVEL_VERY_LOW :Muy Bajo STR_SEA_LEVEL_LOW :Bajo STR_SEA_LEVEL_MEDIUM :Medio STR_SEA_LEVEL_HIGH :Alto @@ -1730,7 +1733,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS :Unidad del jueg STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Unidad 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á la unidad seleccionada -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) @@ -3220,12 +3223,12 @@ STR_LOCAL_AUTHORITY_ACTION_NEW_BUILDINGS :Financiar la co STR_LOCAL_AUTHORITY_ACTION_EXCLUSIVE_TRANSPORT :Comprar derechos de transporte exclusivos STR_LOCAL_AUTHORITY_ACTION_BRIBE :Sobornar a la autoridad local -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{YELLOW}Iniciar una pequeña campaña publicitaria local 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}Iniciar 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}Iniciar una gran campaña publicitaria local 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}Pagar la reconstrucción de las carreteras locales.{}Provoca considerables complicaciones de tráfico durante 6 meses.{}Coste: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{YELLOW}Iniciar 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}Iniciar 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}Pagar 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_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} diff --git a/src/lang/spanish_MX.txt b/src/lang/spanish_MX.txt index d47e13c8..ef202375 100644 --- a/src/lang/spanish_MX.txt +++ b/src/lang/spanish_MX.txt @@ -1007,6 +1007,7 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Acelerac STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Activar esta casilla para intentar emplear la aceleración por hardware. Este cambio solo tiene efecto tras reiniciar el juego STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Esta configuración solo tendrá efecto después de reiniciar el juego + 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 diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index aa725a47..dfc8faa7 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -1006,6 +1006,7 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Hårdvar STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Markera denna rutan för att tillåta OpenTTD att försöka använda hårdvaruacceleration. Ändrad inställning kommer bara att gälla efter omstart. STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Inställningen kommer bara att gälla efter omstart av spelet + 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 diff --git a/src/lang/tamil.txt b/src/lang/tamil.txt index 94d0c647..99b2384e 100644 --- a/src/lang/tamil.txt +++ b/src/lang/tamil.txt @@ -962,6 +962,8 @@ STR_GAME_OPTIONS_FULLSCREEN_TOOLTIP :{BLACK}OpenTTD- STR_GAME_OPTIONS_RESOLUTION :{BLACK}திரையின் அளவு STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}திரை அளவினைத் தேர்ந்தெடுக்கவும் STR_GAME_OPTIONS_RESOLUTION_OTHER :மற்றவை +STR_GAME_OPTIONS_RESOLUTION_ITEM :{NUM}x{NUM} + STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}இடைமுக அளவு @@ -1696,6 +1698,7 @@ STR_FACE_LOAD :{BLACK}ஏற STR_FACE_LOAD_TOOLTIP :{BLACK}பிடித்த முகத்தினை பதிவேற்று STR_FACE_LOAD_DONE :{WHITE}உங்களுடைய பிடித்த முகம் OpenTTD உள்ளமைவு கோப்பிலிருந்து ஏற்றப்பட்டுள்ளது STR_FACE_FACECODE :{BLACK}விளையாடுபவர் முக எண் +STR_FACE_FACECODE_TOOLTIP :{BLACK}நிறுவனரின் முக எண்னை பார் மற்றும்/அல்லது அமை STR_FACE_FACECODE_CAPTION :{WHITE}நிறுவனரின் முக எண்னை பார் அல்லது அமை STR_FACE_FACECODE_SET :{WHITE}புதிய முக எண் குறி அமைக்கப்பட்டது STR_FACE_SAVE :{BLACK}சேமி @@ -2117,6 +2120,7 @@ STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :மேக்ல STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}இரயில்வே இருப்புப் பாதையினை கட்டவும். Shift அழுத்தினால் கட்டுமான/செலவு மதிப்பீடு காட்டப்படும் STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}இரயில் பணிமனையினைக் (இரயில்களை வாங்க மற்றும் பழுதுபார்க்க) கட்டவும். Shift அழுத்தினால் கட்டுமான/செலவு மதிப்பீடு காட்டப்படும் +STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}இரயில் தடத்தை வழிப்புள்ளியாக மாற்றும். வழிப்புள்ளிகளை இணைக்க Ctrl-ஐ அழுத்தவும். கட்டுமான/செலவு மதிப்பீட்டினை காட்டShift-ஐ அழுத்தவும். STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}இரயில் நிலையத்தினை கட்டவும். Ctrl அழுத்தினால் நிலையங்களினை இணைக்கலாம். Shift அழுத்தினால் கட்டுமான/செலவு மதிப்பீடு காட்டப்படும் STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}இரயில்வே சிக்னல்களைக் கட்டவும். Ctrl அழுத்தினால் சிக்னல் வகைகளை மாற்றலாம்{}இரயில் தடத்தின்மேல் இழுத்தினால் சிக்னல்களை அமைக்கலாம். Ctrl அழுத்தினால் அடுத்த எணைப்பு வரை சிக்னல்கள் அமைக்கப்படும்{}Ctrl+Click அழுத்தினால் சிக்னல் தேர்ந்தெடுக்கும் திரை தெரியும்/மரையும். Shift அழுத்தினால் கட்டுமான/செலவு மதிப்பீடு காட்டப்படும் STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}இரயில்வே பாலத்தினை கட்டவும். Shift அழுத்தினால் கட்டுமான/செலவு மதிப்பீடு காட்டப்படும் diff --git a/src/lang/thai.txt b/src/lang/thai.txt index 12966b73..11a7f55b 100644 --- a/src/lang/thai.txt +++ b/src/lang/thai.txt @@ -960,6 +960,7 @@ STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}เล STR_GAME_OPTIONS_RESOLUTION_OTHER :อื่นๆ + STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}ขนาดของแผงควบคุม diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index 410b6cd6..d21dd76f 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -974,6 +974,7 @@ STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}選擇 STR_GAME_OPTIONS_RESOLUTION_OTHER :其它 + STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}介面大小 STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}選擇使用的介面元素大小 diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt index 5d135721..11f3042f 100644 --- a/src/lang/turkish.txt +++ b/src/lang/turkish.txt @@ -993,6 +993,7 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :diğer STR_GAME_OPTIONS_RESOLUTION_ITEM :{NUM}x{NUM} + 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 diff --git a/src/lang/ukrainian.txt b/src/lang/ukrainian.txt index f68ac35f..8c90c222 100644 --- a/src/lang/ukrainian.txt +++ b/src/lang/ukrainian.txt @@ -1134,6 +1134,7 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Прис STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Увімкнутий прапорець дозволить використання грою прискорення апаратного забезпечення. Налаштування запрацює тільки після перезапуску гри STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Налаштування запрацює тільки після перезапуску гри + STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Розмір інтерфейсу STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Оберіть розмір елементів інтерфейсу diff --git a/src/lang/unfinished/chuvash.txt b/src/lang/unfinished/chuvash.txt index e70e1b77..6686a542 100644 --- a/src/lang/unfinished/chuvash.txt +++ b/src/lang/unfinished/chuvash.txt @@ -520,6 +520,7 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :расна + # Custom currency window diff --git a/src/lang/unfinished/frisian.txt b/src/lang/unfinished/frisian.txt index dbbb6905..4344540a 100644 --- a/src/lang/unfinished/frisian.txt +++ b/src/lang/unfinished/frisian.txt @@ -969,6 +969,7 @@ STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}Selektea STR_GAME_OPTIONS_RESOLUTION_OTHER :oars + STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Interfacegrutte STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normaal diff --git a/src/lang/unfinished/ido.txt b/src/lang/unfinished/ido.txt index 0f7b1d15..a98bbd7f 100644 --- a/src/lang/unfinished/ido.txt +++ b/src/lang/unfinished/ido.txt @@ -484,6 +484,7 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :altra + # Custom currency window diff --git a/src/lang/unfinished/macedonian.txt b/src/lang/unfinished/macedonian.txt index a4614cb1..e0657af6 100644 --- a/src/lang/unfinished/macedonian.txt +++ b/src/lang/unfinished/macedonian.txt @@ -804,6 +804,7 @@ STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_1_MONTH :Секој ме + # Custom currency window diff --git a/src/lang/unfinished/maltese.txt b/src/lang/unfinished/maltese.txt index 7261c292..a30a718b 100644 --- a/src/lang/unfinished/maltese.txt +++ b/src/lang/unfinished/maltese.txt @@ -417,6 +417,7 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :oħrajn + # Custom currency window diff --git a/src/lang/unfinished/marathi.txt b/src/lang/unfinished/marathi.txt index f7717c2c..de8d4bec 100644 --- a/src/lang/unfinished/marathi.txt +++ b/src/lang/unfinished/marathi.txt @@ -757,6 +757,7 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :अन्य + # Custom currency window diff --git a/src/lang/unfinished/persian.txt b/src/lang/unfinished/persian.txt index 049ba914..71553957 100644 --- a/src/lang/unfinished/persian.txt +++ b/src/lang/unfinished/persian.txt @@ -962,6 +962,7 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :دیگر + STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :دو برابر diff --git a/src/lang/unfinished/urdu.txt b/src/lang/unfinished/urdu.txt index fc4fe019..9c59f4b1 100644 --- a/src/lang/unfinished/urdu.txt +++ b/src/lang/unfinished/urdu.txt @@ -942,6 +942,7 @@ 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} diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index 51b291cc..05f81947 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -1006,6 +1006,7 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Tăng t STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Đánh dấu vào ô này để cho phép OpenTTD thử sử dụng tăng tốc phần cứng. Sẽ có tác dụng sau khi khởi động lại trò chơi STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Thiết lập chỉ có tác dụng sau khi khởi động lại trò chơi + 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 diff --git a/src/lang/welsh.txt b/src/lang/welsh.txt index 0d534bfb..12bbec9b 100644 --- a/src/lang/welsh.txt +++ b/src/lang/welsh.txt @@ -972,6 +972,7 @@ STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}Dewiswch 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 diff --git a/src/linkgraph/linkgraphjob.h b/src/linkgraph/linkgraphjob.h index caeacd19..4913b5a3 100644 --- a/src/linkgraph/linkgraphjob.h +++ b/src/linkgraph/linkgraphjob.h @@ -367,6 +367,7 @@ class Path { static Path *invalid_path; Path(NodeID n, bool source = false); + virtual ~Path() = default; /** Get the node this leg passes. */ inline NodeID GetNode() const { return this->node; } diff --git a/src/misc_gui.cpp b/src/misc_gui.cpp index 3de39015..c425d2dc 100644 --- a/src/misc_gui.cpp +++ b/src/misc_gui.cpp @@ -498,7 +498,7 @@ struct AboutWindow : public Window { int line_height; ///< The height of a single line static const int num_visible_lines = 19; ///< The number of lines visible simultaneously - static const uint TIMER_INTERVAL = 150; ///< Scrolling interval in ms + static const uint TIMER_INTERVAL = 2100; ///< Scrolling interval, scaled by line text line height. This value chosen to maintain parity: 2100 / FONT_HEIGHT_NORMAL = 150ms GUITimer timer; AboutWindow() : Window(&_about_desc) @@ -506,7 +506,6 @@ struct AboutWindow : public Window { this->InitNested(WN_GAME_OPTIONS_ABOUT); this->text_position = this->GetWidget(WID_A_SCROLLING_TEXT)->pos_y + this->GetWidget(WID_A_SCROLLING_TEXT)->current_y; - this->timer.SetInterval(TIMER_INTERVAL); } void SetStringParameters(int widget) const override @@ -529,6 +528,10 @@ struct AboutWindow : public Window { d.width = std::max(d.width, GetStringBoundingBox(_credits[i]).width); } *size = maxdim(*size, d); + + /* Set scroll interval based on required speed. To keep scrolling smooth, + * the interval is adjusted rather than the distance moved. */ + this->timer.SetInterval(TIMER_INTERVAL / FONT_HEIGHT_NORMAL); } void DrawWidget(const Rect &r, int widget) const override @@ -767,6 +770,12 @@ struct TooltipsWindow : public Window case TCC_RIGHT_CLICK: if (!_right_button_down) delete this; break; case TCC_HOVER: if (!_mouse_hovering) delete this; break; case TCC_NONE: break; + + case TCC_EXIT_VIEWPORT: { + Window *w = FindWindowFromPt(_cursor.pos.x, _cursor.pos.y); + if (w == nullptr || IsPtInWindowViewport(w, _cursor.pos.x, _cursor.pos.y) == nullptr) delete this; + break; + } } } }; @@ -783,7 +792,7 @@ void GuiShowTooltips(Window *parent, StringID str, uint paramcount, const uint64 { DeleteWindowById(WC_TOOLTIPS, 0); - if (str == STR_NULL) return; + if (str == STR_NULL || !_cursor.in_window) return; new TooltipsWindow(parent, str, paramcount, params, close_tooltip); } diff --git a/src/mixer.cpp b/src/mixer.cpp index 90e3951c..d892a573 100644 --- a/src/mixer.cpp +++ b/src/mixer.cpp @@ -11,6 +11,7 @@ #include #include "core/math_func.hpp" #include "framerate_type.h" +#include "settings_type.h" #include "safeguards.h" #include "mixer.h" @@ -45,7 +46,7 @@ static MxStreamCallback _music_stream = nullptr; * stops overflowing when too many sounds are played at the same time, which * causes an even worse sound quality. */ -static const int MAX_VOLUME = 128 * 128; +static const int MAX_VOLUME = 32767; /** * Perform the rate conversion between the input and output. @@ -60,7 +61,7 @@ static int RateConversion(T *b, int frac_pos) return ((b[0] * ((1 << 16) - frac_pos)) + (b[1] * frac_pos)) >> 16; } -static void mix_int16(MixerChannel *sc, int16 *buffer, uint samples) +static void mix_int16(MixerChannel *sc, int16 *buffer, uint samples, uint8 effect_vol) { if (samples > sc->samples_left) samples = sc->samples_left; sc->samples_left -= samples; @@ -69,8 +70,8 @@ static void mix_int16(MixerChannel *sc, int16 *buffer, uint samples) const int16 *b = (const int16 *)sc->memory + sc->pos; uint32 frac_pos = sc->frac_pos; uint32 frac_speed = sc->frac_speed; - int volume_left = sc->volume_left; - int volume_right = sc->volume_right; + int volume_left = sc->volume_left * effect_vol / 255; + int volume_right = sc->volume_right * effect_vol / 255; if (frac_speed == 0x10000) { /* Special case when frac_speed is 0x10000 */ @@ -96,7 +97,7 @@ static void mix_int16(MixerChannel *sc, int16 *buffer, uint samples) sc->pos = b - (const int16 *)sc->memory; } -static void mix_int8_to_int16(MixerChannel *sc, int16 *buffer, uint samples) +static void mix_int8_to_int16(MixerChannel *sc, int16 *buffer, uint samples, uint8 effect_vol) { if (samples > sc->samples_left) samples = sc->samples_left; sc->samples_left -= samples; @@ -105,8 +106,8 @@ static void mix_int8_to_int16(MixerChannel *sc, int16 *buffer, uint samples) const int8 *b = sc->memory + sc->pos; uint32 frac_pos = sc->frac_pos; uint32 frac_speed = sc->frac_speed; - int volume_left = sc->volume_left; - int volume_right = sc->volume_right; + int volume_left = sc->volume_left * effect_vol / 255; + int volume_right = sc->volume_right * effect_vol / 255; if (frac_speed == 0x10000) { /* Special case when frac_speed is 0x10000 */ @@ -154,13 +155,21 @@ void MxMixSamples(void *buffer, uint samples) /* Fetch music if a sampled stream is available */ if (_music_stream) _music_stream((int16*)buffer, samples); + /* Apply simple x^3 scaling to master effect volume. This increases the + * 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); + /* Mix each channel */ for (mc = _channels; mc != endof(_channels); mc++) { if (mc->active) { if (mc->is16bit) { - mix_int16(mc, (int16*)buffer, samples); + mix_int16(mc, (int16*)buffer, samples, effect_vol); } else { - mix_int8_to_int16(mc, (int16*)buffer, samples); + mix_int8_to_int16(mc, (int16*)buffer, samples, effect_vol); } if (mc->samples_left == 0) MxCloseChannel(mc); } diff --git a/src/music/dmusic.cpp b/src/music/dmusic.cpp index b0e34070..c9447206 100644 --- a/src/music/dmusic.cpp +++ b/src/music/dmusic.cpp @@ -1071,7 +1071,7 @@ static const char *LoadDefaultDLSFile(const char *user_dls) const char *MusicDriver_DMusic::Start(const StringList &parm) { /* Initialize COM */ - if (FAILED(CoInitializeEx(nullptr, COINITBASE_MULTITHREADED))) return "COM initialization failed"; + if (FAILED(CoInitializeEx(nullptr, COINIT_MULTITHREADED))) return "COM initialization failed"; /* Create the DirectMusic object */ if (FAILED(CoCreateInstance( diff --git a/src/music/fluidsynth.cpp b/src/music/fluidsynth.cpp index 61686a44..000432e1 100644 --- a/src/music/fluidsynth.cpp +++ b/src/music/fluidsynth.cpp @@ -29,7 +29,15 @@ static FMusicDriver_FluidSynth iFMusicDriver_FluidSynth; /** List of sound fonts to try by default. */ static const char *default_sf[] = { - /* Debian/Ubuntu/OpenSUSE preferred */ + /* FluidSynth preferred */ + /* See: https://www.fluidsynth.org/api/settings_synth.html#settings_synth_default-soundfont */ + "/usr/share/soundfonts/default.sf2", + + /* Debian/Ubuntu preferred */ + /* See: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=929185 */ + "/usr/share/sounds/sf3/default-GM.sf3", + + /* OpenSUSE preferred */ "/usr/share/sounds/sf2/FluidR3_GM.sf2", /* RedHat/Fedora/Arch preferred */ @@ -77,12 +85,22 @@ const char *MusicDriver_FluidSynth::Start(const StringList ¶m) /* Load a SoundFont and reset presets (so that new instruments * get used from the SoundFont) */ if (!sfont_name) { - int i; sfont_id = FLUID_FAILED; - for (i = 0; default_sf[i]; i++) { - if (!fluid_is_soundfont(default_sf[i])) continue; - sfont_id = fluid_synth_sfload(_midi.synth, default_sf[i], 1); - if (sfont_id != FLUID_FAILED) break; + + /* Try loading the default soundfont registered with FluidSynth. */ + char *default_soundfont; + fluid_settings_dupstr(_midi.settings, "synth.default-soundfont", &default_soundfont); + if (fluid_is_soundfont(default_soundfont)) { + sfont_id = fluid_synth_sfload(_midi.synth, default_soundfont, 1); + } + + /* If no default soundfont found, try our own list. */ + if (sfont_id == FLUID_FAILED) { + for (int i = 0; default_sf[i]; i++) { + if (!fluid_is_soundfont(default_sf[i])) continue; + sfont_id = fluid_synth_sfload(_midi.synth, default_sf[i], 1); + if (sfont_id != FLUID_FAILED) break; + } } if (sfont_id == FLUID_FAILED) return "Could not open any sound font"; } else { diff --git a/src/music_gui.cpp b/src/music_gui.cpp index 7e2aaac1..28cb6ce4 100644 --- a/src/music_gui.cpp +++ b/src/music_gui.cpp @@ -26,6 +26,7 @@ #include "settings_gui.h" #include "widgets/dropdown_func.h" #include "widgets/dropdown_type.h" +#include "widgets/slider_func.h" #include "widgets/music_widget.h" @@ -643,8 +644,6 @@ static void ShowMusicTrackSelection() } struct MusicWindow : public Window { - static const int slider_width = 3; - MusicWindow(WindowDesc *desc, WindowNumber number) : Window(desc) { this->InitNested(number); @@ -740,27 +739,13 @@ struct MusicWindow : public Window { break; } - case WID_M_MUSIC_VOL: case WID_M_EFFECT_VOL: { - /* Draw a wedge indicating low to high volume level. */ - const int ha = (r.bottom - r.top) / 5; - int wx1 = r.left, wx2 = r.right; - if (_current_text_dir == TD_RTL) std::swap(wx1, wx2); - const uint shadow = _colour_gradient[COLOUR_GREY][3]; - const uint fill = _colour_gradient[COLOUR_GREY][6]; - const uint light = _colour_gradient[COLOUR_GREY][7]; - const std::vector wedge{ Point{wx1, r.bottom - ha}, Point{wx2, r.top + ha}, Point{wx2, r.bottom - ha} }; - GfxFillPolygon(wedge, fill); - GfxDrawLine(wedge[0].x, wedge[0].y, wedge[2].x, wedge[2].y, light); - GfxDrawLine(wedge[1].x, wedge[1].y, wedge[2].x, wedge[2].y, _current_text_dir == TD_RTL ? shadow : light); - GfxDrawLine(wedge[0].x, wedge[0].y, wedge[1].x, wedge[1].y, shadow); - /* Draw a slider handle indicating current volume level. */ - const int sw = ScaleGUITrad(slider_width); - byte volume = (widget == WID_M_MUSIC_VOL) ? _settings_client.music.music_vol : _settings_client.music.effect_vol; - if (_current_text_dir == TD_RTL) volume = 127 - volume; - const int x = r.left + (volume * (r.right - r.left - sw) / 127); - DrawFrameRect(x, r.top, x + sw, r.bottom, COLOUR_GREY, FR_NONE); + case WID_M_MUSIC_VOL: + DrawVolumeSliderWidget(r, _settings_client.music.music_vol); + break; + + case WID_M_EFFECT_VOL: + DrawVolumeSliderWidget(r, _settings_client.music.effect_vol); break; - } } } @@ -801,19 +786,11 @@ struct MusicWindow : public Window { break; case WID_M_MUSIC_VOL: case WID_M_EFFECT_VOL: { // volume sliders - int x = pt.x - this->GetWidget(widget)->pos_x; - - byte *vol = (widget == WID_M_MUSIC_VOL) ? &_settings_client.music.music_vol : &_settings_client.music.effect_vol; - - byte new_vol = Clamp(x * 127 / (int)this->GetWidget(widget)->current_x, 0, 127); - if (_current_text_dir == TD_RTL) new_vol = 127 - new_vol; - /* Clamp to make sure min and max are properly settable */ - if (new_vol > 124) new_vol = 127; - if (new_vol < 3) new_vol = 0; - if (new_vol != *vol) { - *vol = new_vol; - if (widget == WID_M_MUSIC_VOL) MusicDriver::GetInstance()->SetVolume(new_vol); + 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); this->SetDirty(); + SetWindowClassesDirty(WC_GAME_OPTIONS); } if (click_count > 0) this->mouse_capture_widget = widget; diff --git a/src/network/core/address.cpp b/src/network/core/address.cpp index 2e00b5b1..f57218ce 100644 --- a/src/network/core/address.cpp +++ b/src/network/core/address.cpp @@ -239,7 +239,18 @@ SOCKET NetworkAddress::Resolve(int family, int socktype, int flags, SocketList * strecpy(this->hostname, fam == AF_INET ? "0.0.0.0" : "::", lastof(this->hostname)); } + static bool _resolve_timeout_error_message_shown = false; + auto start = std::chrono::steady_clock::now(); int e = getaddrinfo(StrEmpty(this->hostname) ? nullptr : this->hostname, port_name, &hints, &ai); + auto end = std::chrono::steady_clock::now(); + std::chrono::seconds duration = std::chrono::duration_cast(end - start); + if (!_resolve_timeout_error_message_shown && duration >= std::chrono::seconds(5)) { + DEBUG(net, 0, "getaddrinfo for hostname \"%s\", port %s, address family %s and socket type %s took %i seconds", + this->hostname, port_name, AddressFamilyAsString(family), SocketTypeAsString(socktype), (int)duration.count()); + DEBUG(net, 0, " this is likely an issue in the DNS name resolver's configuration causing it to time out"); + _resolve_timeout_error_message_shown = true; + } + if (reset_hostname) strecpy(this->hostname, "", lastof(this->hostname)); diff --git a/src/network/network.cpp b/src/network/network.cpp index 1d5563c3..f4640191 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -74,19 +74,12 @@ uint32 _sync_seed_2; ///< Second part of the seed. #endif uint32 _sync_frame; ///< The frame to perform the sync check. bool _network_first_time; ///< Whether we have finished joining or not. -bool _network_udp_server; ///< Is the UDP server started? -uint16 _network_udp_broadcast; ///< Timeout for the UDP broadcasts. -uint8 _network_advertise_retries; ///< The number of advertisement retries we did. CompanyMask _network_company_passworded; ///< Bitmask of the password status of all companies. /* Check whether NETWORK_NUM_LANDSCAPES is still in sync with NUM_LANDSCAPE */ static_assert((int)NETWORK_NUM_LANDSCAPES == (int)NUM_LANDSCAPE); static_assert((int)NETWORK_COMPANY_NAME_LENGTH == MAX_LENGTH_COMPANY_NAME_CHARS * MAX_CHAR_LENGTH); -extern NetworkUDPSocketHandler *_udp_client_socket; ///< udp client socket -extern NetworkUDPSocketHandler *_udp_server_socket; ///< udp server socket -extern NetworkUDPSocketHandler *_udp_master_socket; ///< udp master socket - /** The amount of clients connected */ byte _network_clients_connected = 0; @@ -724,7 +717,7 @@ bool NetworkServerStart() /* Try to start UDP-server */ DEBUG(net, 1, "starting listeners for incoming server queries"); - _network_udp_server = _udp_server_socket->Listen(); + NetworkUDPServerListen(); _network_company_states = CallocT(MAX_COMPANIES); _network_server = true; @@ -1060,7 +1053,6 @@ void NetworkStartUp() _network_available = NetworkCoreInitialize(); _network_dedicated = false; _network_need_advertise = true; - _network_advertise_retries = 0; /* Generate an server id when there is none yet */ if (StrEmpty(_settings_client.network.network_id)) NetworkGenerateServerId(); diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index ae263cf0..33639584 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -500,6 +500,7 @@ class NetworkGameWindow : public Window { switch (widget) { case WID_NG_MATRIX: resize->height = WD_MATRIX_TOP + std::max(GetSpriteSize(SPR_BLOT).height, (uint)FONT_HEIGHT_NORMAL) + WD_MATRIX_BOTTOM; + fill->height = resize->height; size->height = 12 * resize->height; break; @@ -954,7 +955,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, 155), 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 + WD_PAR_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), diff --git a/src/network/network_internal.h b/src/network/network_internal.h index 8cae502e..290922f3 100644 --- a/src/network/network_internal.h +++ b/src/network/network_internal.h @@ -126,11 +126,6 @@ extern uint32 _network_join_bytes_total; extern uint8 _network_reconnect; -extern bool _network_udp_server; -extern uint16 _network_udp_broadcast; - -extern uint8 _network_advertise_retries; - extern CompanyMask _network_company_passworded; void NetworkTCPQueryServer(NetworkAddress address); diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index 9e4d0d88..86885d59 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -456,7 +456,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendError(NetworkErrorCode err } for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) { - if (new_cs->status > STATUS_AUTHORIZED && new_cs != this) { + if (new_cs->status >= STATUS_AUTHORIZED && new_cs != this) { /* Some errors we filter to a more general error. Clients don't have to know the real * reason a joining failed. */ if (error == NETWORK_ERROR_NOT_AUTHORIZED || error == NETWORK_ERROR_NOT_EXPECTED || error == NETWORK_ERROR_WRONG_REVISION) { @@ -549,7 +549,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendWelcome() /* Transmit info about all the active clients */ for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) { - if (new_cs != this && new_cs->status > STATUS_AUTHORIZED) { + if (new_cs != this && new_cs->status >= STATUS_AUTHORIZED) { this->SendClientInfo(new_cs->GetInfo()); } } @@ -1068,7 +1068,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_MAP_OK(Packet * this->last_frame_server = _frame_counter; for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) { - if (new_cs->status > STATUS_AUTHORIZED) { + if (new_cs->status >= STATUS_AUTHORIZED) { new_cs->SendClientInfo(this->GetInfo()); new_cs->SendJoin(this->client_id); } @@ -1178,7 +1178,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ERROR(Packet *p NetworkTextMessage(NETWORK_ACTION_LEAVE, CC_DEFAULT, false, client_name, nullptr, strid); for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) { - if (new_cs->status > STATUS_AUTHORIZED) { + if (new_cs->status >= STATUS_AUTHORIZED) { new_cs->SendErrorQuit(this->client_id, errorno); } } @@ -1204,7 +1204,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_QUIT(Packet *p) NetworkTextMessage(NETWORK_ACTION_LEAVE, CC_DEFAULT, false, client_name, nullptr, STR_NETWORK_MESSAGE_CLIENT_LEAVING); for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) { - if (new_cs->status > STATUS_AUTHORIZED && new_cs != this) { + if (new_cs->status >= STATUS_AUTHORIZED && new_cs != this) { new_cs->SendQuit(this->client_id); } } @@ -1607,7 +1607,9 @@ void NetworkUpdateClientInfo(ClientID client_id) DEBUG(desync, 1, "client: %08x; %02x; %02x; %04x", _date, _date_fract, (int)ci->client_playas, client_id); for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) { - cs->SendClientInfo(ci); + if (cs->status >= ServerNetworkGameSocketHandler::STATUS_AUTHORIZED) { + cs->SendClientInfo(ci); + } } NetworkAdminClientUpdate(ci); diff --git a/src/network/network_udp.cpp b/src/network/network_udp.cpp index 99939fab..6d7e6ca6 100644 --- a/src/network/network_udp.cpp +++ b/src/network/network_udp.cpp @@ -33,9 +33,6 @@ #include "../safeguards.h" -/** Mutex for all out threaded udp resolution and such. */ -static std::mutex _network_udp_mutex; - /** Session key to register ourselves to the master server */ static uint64 _session_key = 0; @@ -43,9 +40,45 @@ static const std::chrono::minutes ADVERTISE_NORMAL_INTERVAL(15); ///< interval b static const std::chrono::seconds ADVERTISE_RETRY_INTERVAL(10); ///< re-advertise when no response after this amount of time. static const uint32 ADVERTISE_RETRY_TIMES = 3; ///< give up re-advertising after this much failed retries -NetworkUDPSocketHandler *_udp_client_socket = nullptr; ///< udp client socket -NetworkUDPSocketHandler *_udp_server_socket = nullptr; ///< udp server socket -NetworkUDPSocketHandler *_udp_master_socket = nullptr; ///< udp master socket +static bool _network_udp_server; ///< Is the UDP server started? +static uint16 _network_udp_broadcast; ///< Timeout for the UDP broadcasts. +static uint8 _network_advertise_retries; ///< The number of advertisement retries we did. + +/** Some information about a socket, which exists before the actual socket has been created to provide locking and the likes. */ +struct UDPSocket { + const std::string name; ///< The name of the socket. + std::mutex mutex; ///< Mutex for everything that (indirectly) touches the sockets within the handler. + NetworkUDPSocketHandler *socket; ///< The actual socket, which may be nullptr when not initialized yet. + std::atomic receive_iterations_locked; ///< The number of receive iterations the mutex was locked. + + UDPSocket(const std::string &name_) : name(name_), socket(nullptr) {} + + void Close() + { + std::lock_guard lock(mutex); + socket->Close(); + delete socket; + socket = nullptr; + } + + void ReceivePackets() + { + std::unique_lock lock(mutex, std::defer_lock); + if (!lock.try_lock()) { + if (++receive_iterations_locked % 32 == 0) { + DEBUG(net, 0, "[udp] %s background UDP loop processing appears to be blocked. Your OS may be low on UDP send buffers.", name.c_str()); + } + return; + } + + receive_iterations_locked.store(0); + socket->ReceivePackets(); + } +}; + +static UDPSocket _udp_client("Client"); ///< udp client socket +static UDPSocket _udp_server("Server"); ///< udp server socket +static UDPSocket _udp_master("Master"); ///< udp master socket /** * Helper function doing the actual work for querying the server. @@ -63,11 +96,11 @@ static void DoNetworkUDPQueryServer(NetworkAddress &address, bool needs_mutex, b item->manually = manually; NetworkGameListAddItemDelayed(item); - std::unique_lock lock(_network_udp_mutex, std::defer_lock); + std::unique_lock lock(_udp_client.mutex, std::defer_lock); if (needs_mutex) lock.lock(); /* Init the packet */ Packet p(PACKET_UDP_CLIENT_FIND_SERVER); - if (_udp_client_socket != nullptr) _udp_client_socket->SendPacket(&p, &address); + if (_udp_client.socket != nullptr) _udp_client.socket->SendPacket(&p, &address); } /** @@ -475,7 +508,8 @@ void NetworkUDPQueryMasterServer() p.Send_uint8(NETWORK_MASTER_SERVER_VERSION); p.Send_uint8(SLT_AUTODETECT); - _udp_client_socket->SendPacket(&p, &out_addr, true); + std::lock_guard lock(_udp_client.mutex); + _udp_client.socket->SendPacket(&p, &out_addr, true); DEBUG(net, 2, "[udp] master server queried at %s", out_addr.GetAddressAsString().c_str()); } @@ -488,7 +522,7 @@ void NetworkUDPSearchGame() DEBUG(net, 0, "[udp] searching server"); - NetworkUDPBroadCast(_udp_client_socket); + NetworkUDPBroadCast(_udp_client.socket); _network_udp_broadcast = 300; // Stay searching for 300 ticks } @@ -508,8 +542,8 @@ static void NetworkUDPRemoveAdvertiseThread() p.Send_uint8 (NETWORK_MASTER_SERVER_VERSION); p.Send_uint16(_settings_client.network.server_port); - std::lock_guard lock(_network_udp_mutex); - if (_udp_master_socket != nullptr) _udp_master_socket->SendPacket(&p, &out_addr, true); + std::lock_guard lock(_udp_master.mutex); + if (_udp_master.socket != nullptr) _udp_master.socket->SendPacket(&p, &out_addr, true); } /** @@ -560,8 +594,8 @@ static void NetworkUDPAdvertiseThread() p.Send_uint16(_settings_client.network.server_port); p.Send_uint64(_session_key); - std::lock_guard lock(_network_udp_mutex); - if (_udp_master_socket != nullptr) _udp_master_socket->SendPacket(&p, &out_addr, true); + std::lock_guard lock(_udp_master.mutex); + if (_udp_master.socket != nullptr) _udp_master.socket->SendPacket(&p, &out_addr, true); } /** @@ -603,40 +637,41 @@ void NetworkUDPAdvertise() void NetworkUDPInitialize() { /* If not closed, then do it. */ - if (_udp_server_socket != nullptr) NetworkUDPClose(); + if (_udp_server.socket != nullptr) NetworkUDPClose(); DEBUG(net, 1, "[udp] initializing listeners"); - assert(_udp_client_socket == nullptr && _udp_server_socket == nullptr && _udp_master_socket == nullptr); + assert(_udp_client.socket == nullptr && _udp_server.socket == nullptr && _udp_master.socket == nullptr); - std::lock_guard lock(_network_udp_mutex); + std::scoped_lock lock(_udp_client.mutex, _udp_server.mutex, _udp_master.mutex); - _udp_client_socket = new ClientNetworkUDPSocketHandler(); + _udp_client.socket = new ClientNetworkUDPSocketHandler(); NetworkAddressList server; GetBindAddresses(&server, _settings_client.network.server_port); - _udp_server_socket = new ServerNetworkUDPSocketHandler(&server); + _udp_server.socket = new ServerNetworkUDPSocketHandler(&server); server.clear(); GetBindAddresses(&server, 0); - _udp_master_socket = new MasterNetworkUDPSocketHandler(&server); + _udp_master.socket = new MasterNetworkUDPSocketHandler(&server); _network_udp_server = false; _network_udp_broadcast = 0; + _network_advertise_retries = 0; +} + +/** Start the listening of the UDP server component. */ +void NetworkUDPServerListen() +{ + std::lock_guard lock(_udp_server.mutex); + _network_udp_server = _udp_server.socket->Listen(); } /** Close all UDP related stuff. */ void NetworkUDPClose() { - std::lock_guard lock(_network_udp_mutex); - _udp_server_socket->Close(); - _udp_master_socket->Close(); - _udp_client_socket->Close(); - delete _udp_client_socket; - delete _udp_server_socket; - delete _udp_master_socket; - _udp_client_socket = nullptr; - _udp_server_socket = nullptr; - _udp_master_socket = nullptr; + _udp_client.Close(); + _udp_server.Close(); + _udp_master.Close(); _network_udp_server = false; _network_udp_broadcast = 0; @@ -646,13 +681,11 @@ void NetworkUDPClose() /** Receive the UDP packets. */ void NetworkBackgroundUDPLoop() { - std::lock_guard lock(_network_udp_mutex); - if (_network_udp_server) { - _udp_server_socket->ReceivePackets(); - _udp_master_socket->ReceivePackets(); + _udp_server.ReceivePackets(); + _udp_master.ReceivePackets(); } else { - _udp_client_socket->ReceivePackets(); + _udp_client.ReceivePackets(); if (_network_udp_broadcast > 0) _network_udp_broadcast--; } } diff --git a/src/network/network_udp.h b/src/network/network_udp.h index c042bea4..189657bc 100644 --- a/src/network/network_udp.h +++ b/src/network/network_udp.h @@ -19,6 +19,7 @@ void NetworkUDPQueryServer(NetworkAddress address, bool manually = false); void NetworkUDPAdvertise(); void NetworkUDPRemoveAdvertise(bool blocking); void NetworkUDPClose(); +void NetworkUDPServerListen(); void NetworkBackgroundUDPLoop(); #endif /* NETWORK_UDP_H */ diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 7ac8bc94..46bd5a65 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -3862,6 +3862,7 @@ static ChangeInfoResult AirportChangeInfo(uint airport, int numinfo, int prop, B } case 0x0A: { // Set airport layout + byte old_num_table = as->num_table; free(as->rotation); as->num_table = buf->ReadByte(); // Number of layaouts as->rotation = MallocT(as->num_table); @@ -3920,6 +3921,12 @@ static ChangeInfoResult AirportChangeInfo(uint airport, int numinfo, int prop, B tile_table[j] = CallocT(size); memcpy(tile_table[j], copy_from, sizeof(*copy_from) * size); } + /* Free old layouts in the airport spec */ + for (int j = 0; j < old_num_table; j++) { + /* remove the individual layouts */ + free(as->table[j]); + } + free(as->table); /* Install final layout construction in the airport spec */ as->table = tile_table; free(att); diff --git a/src/object.h b/src/object.h index e3f0c84f..c374ba95 100644 --- a/src/object.h +++ b/src/object.h @@ -18,6 +18,6 @@ void UpdateCompanyHQ(TileIndex tile, uint score); void BuildObject(ObjectType type, TileIndex tile, CompanyID owner = OWNER_NONE, struct Town *town = nullptr, uint8 view = 0); -void ShowBuildObjectPicker(); +Window *ShowBuildObjectPicker(); #endif /* OBJECT_H */ diff --git a/src/object_gui.cpp b/src/object_gui.cpp index 7fab0b19..05e9b009 100644 --- a/src/object_gui.cpp +++ b/src/object_gui.cpp @@ -9,9 +9,11 @@ #include "stdafx.h" #include "command_func.h" +#include "hotkeys.h" #include "newgrf.h" #include "newgrf_object.h" #include "newgrf_text.h" +#include "object.h" #include "querystring_gui.h" #include "sortlist_type.h" #include "stringfilter_type.h" @@ -33,6 +35,11 @@ static ObjectClassID _selected_object_class; ///< Currently selected available o static int _selected_object_index; ///< Index of the currently selected object if existing, else \c -1. static uint8 _selected_object_view; ///< the view of the selected object +/** Enum referring to the Hotkeys in the build object window */ +enum BuildObjectHotkeys { + BOHK_FOCUS_FILTER_BOX, ///< Focus the edit box for editing the filter string +}; + /** The window used for building objects. */ class BuildObjectWindow : public Window { typedef GUIList GUIObjectClassList; ///< Type definition for the list to hold available object classes. @@ -88,7 +95,7 @@ class BuildObjectWindow : public Window { } public: - BuildObjectWindow(WindowDesc *desc, WindowNumber number) : Window(desc), info_height(1), filter_editbox(EDITBOX_MAX_SIZE) + BuildObjectWindow(WindowDesc *desc, WindowNumber number) : Window(desc), info_height(1), filter_editbox(EDITBOX_MAX_SIZE * MAX_CHAR_LENGTH, EDITBOX_MAX_SIZE) { this->CreateNestedTree(); @@ -544,6 +551,21 @@ class BuildObjectWindow : public Window { this->UpdateButtons(_selected_object_class, -1, _selected_object_view); } + EventState OnHotkey(int hotkey) override + { + switch (hotkey) { + case BOHK_FOCUS_FILTER_BOX: + this->SetFocusedWidget(WID_BO_FILTER); + SetFocusedWindow(this); // The user has asked to give focus to the text box, so make sure this window is focused. + break; + + default: + return ES_NOT_HANDLED; + } + + return ES_HANDLED; + } + void OnEditboxChanged(int wid) override { string_filter.SetFilterTerm(this->filter_editbox.text.buf); @@ -597,8 +619,29 @@ class BuildObjectWindow : public Window { } this->SelectOtherObject(-1); } + + static HotkeyList hotkeys; }; +/** + * Handler for global hotkeys of the BuildObjectWindow. + * @param hotkey Hotkey + * @return ES_HANDLED if hotkey was accepted. + */ +static EventState BuildObjectGlobalHotkeys(int hotkey) +{ + if (_game_mode == GM_MENU) return ES_NOT_HANDLED; + Window *w = ShowBuildObjectPicker(); + if (w == nullptr) return ES_NOT_HANDLED; + return w->OnHotkey(hotkey); +} + +static Hotkey buildobject_hotkeys[] = { + Hotkey('F', "focus_filter_box", BOHK_FOCUS_FILTER_BOX), + HOTKEY_LIST_END +}; +HotkeyList BuildObjectWindow::hotkeys("buildobject", buildobject_hotkeys, BuildObjectGlobalHotkeys); + Listing BuildObjectWindow::last_sorting = { false, 0 }; Filtering BuildObjectWindow::last_filtering = { false, 0 }; @@ -617,24 +660,24 @@ static const NWidgetPart _nested_build_object_widgets[] = { NWidget(WWT_DEFSIZEBOX, COLOUR_DARK_GREEN), EndContainer(), NWidget(WWT_PANEL, COLOUR_DARK_GREEN), - NWidget(NWID_HORIZONTAL), SetPadding(2, 0, 0, 0), - NWidget(NWID_VERTICAL), - NWidget(NWID_HORIZONTAL), SetPadding(0, 5, 2, 5), + NWidget(NWID_HORIZONTAL), SetPadding(2, 0, 0, 2), + NWidget(NWID_VERTICAL), SetPadding(0, 5, 2, 0), SetPIP(0, 2, 0), + NWidget(NWID_HORIZONTAL), NWidget(WWT_TEXT, COLOUR_DARK_GREEN), SetFill(0, 1), SetDataTip(STR_LIST_FILTER_TITLE, STR_NULL), NWidget(WWT_EDITBOX, COLOUR_GREY, WID_BO_FILTER), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_LIST_FILTER_OSKTITLE, STR_LIST_FILTER_TOOLTIP), EndContainer(), - NWidget(NWID_HORIZONTAL), SetPadding(0, 5, 2, 5), + NWidget(NWID_HORIZONTAL), NWidget(WWT_MATRIX, COLOUR_GREY, WID_BO_CLASS_LIST), SetFill(1, 0), SetMatrixDataTip(1, 0, STR_OBJECT_BUILD_CLASS_TOOLTIP), SetScrollbar(WID_BO_SCROLLBAR), NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_BO_SCROLLBAR), EndContainer(), - NWidget(NWID_HORIZONTAL), SetPadding(0, 5, 0, 5), + NWidget(NWID_HORIZONTAL), NWidget(NWID_MATRIX, COLOUR_DARK_GREEN, WID_BO_OBJECT_MATRIX), SetPIP(0, 2, 0), NWidget(WWT_PANEL, COLOUR_GREY, WID_BO_OBJECT_SPRITE), SetDataTip(0x0, STR_OBJECT_BUILD_PREVIEW_TOOLTIP), EndContainer(), EndContainer(), EndContainer(), - NWidget(WWT_TEXT, COLOUR_DARK_GREEN, WID_BO_OBJECT_NAME), SetDataTip(STR_ORANGE_STRING, STR_NULL), SetPadding(2, 5, 2, 5), - NWidget(WWT_TEXT, COLOUR_DARK_GREEN, WID_BO_OBJECT_SIZE), SetDataTip(STR_OBJECT_BUILD_SIZE, STR_NULL), SetPadding(2, 5, 2, 5), + NWidget(WWT_TEXT, COLOUR_DARK_GREEN, WID_BO_OBJECT_NAME), SetDataTip(STR_ORANGE_STRING, STR_NULL), + NWidget(WWT_TEXT, COLOUR_DARK_GREEN, WID_BO_OBJECT_SIZE), SetDataTip(STR_OBJECT_BUILD_SIZE, STR_NULL), EndContainer(), NWidget(WWT_PANEL, COLOUR_DARK_GREEN), SetScrollbar(WID_BO_SELECT_SCROLL), NWidget(NWID_HORIZONTAL), @@ -648,7 +691,7 @@ static const NWidgetPart _nested_build_object_widgets[] = { EndContainer(), EndContainer(), NWidget(NWID_HORIZONTAL), - NWidget(WWT_EMPTY, INVALID_COLOUR, WID_BO_INFO), SetPadding(2, 5, 0, 5), SetFill(1, 0), SetResize(1, 0), + NWidget(WWT_EMPTY, INVALID_COLOUR, WID_BO_INFO), SetPadding(0, 5, 0, 1), 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), @@ -661,16 +704,18 @@ static WindowDesc _build_object_desc( WDP_AUTO, "build_object", 0, 0, WC_BUILD_OBJECT, WC_BUILD_TOOLBAR, WDF_CONSTRUCTION, - _nested_build_object_widgets, lengthof(_nested_build_object_widgets) + _nested_build_object_widgets, lengthof(_nested_build_object_widgets), + &BuildObjectWindow::hotkeys ); /** Show our object picker. */ -void ShowBuildObjectPicker() +Window *ShowBuildObjectPicker() { /* Don't show the place object button when there are no objects to place. */ if (ObjectClass::GetUIClassCount() > 0) { - AllocateWindowDescFront(&_build_object_desc, 0); + return AllocateWindowDescFront(&_build_object_desc, 0); } + return nullptr; } /** Reset all data of the object GUI. */ diff --git a/src/openttd.cpp b/src/openttd.cpp index 235d36f0..4d820d4d 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -455,7 +455,7 @@ struct AfterNewGRFScan : NewGRFScanCallback { /* restore saved music volume */ MusicDriver::GetInstance()->SetVolume(_settings_client.music.music_vol); - if (startyear != INVALID_YEAR) _settings_newgame.game_creation.starting_year = startyear; + if (startyear != INVALID_YEAR) IConsoleSetSetting("game_creation.starting_year", startyear); if (generation_seed != GENERATE_NEW_SEED) _settings_newgame.game_creation.generation_seed = generation_seed; if (dedicated_host != nullptr) { @@ -1450,11 +1450,15 @@ static void DoAutosave() * done in the game-thread, and not in the draw-thread (which most often * triggers this request). * @param callback Optional callback to call when NewGRF scan is completed. + * @return True when the NewGRF scan was actually requested, false when the scan was already running. */ -void RequestNewGRFScan(NewGRFScanCallback *callback) +bool RequestNewGRFScan(NewGRFScanCallback *callback) { + if (_request_newgrf_scan) return false; + _request_newgrf_scan = true; _request_newgrf_scan_callback = callback; + return true; } void GameLoop() diff --git a/src/openttd.h b/src/openttd.h index 38c7f806..77fafab1 100644 --- a/src/openttd.h +++ b/src/openttd.h @@ -81,6 +81,6 @@ void HandleExitGameRequest(); void SwitchToMode(SwitchMode new_mode); -void RequestNewGRFScan(struct NewGRFScanCallback *callback = nullptr); +bool RequestNewGRFScan(struct NewGRFScanCallback *callback = nullptr); #endif /* OPENTTD_H */ diff --git a/src/os/windows/font_win32.cpp b/src/os/windows/font_win32.cpp index 9a9dba2f..80f5576a 100644 --- a/src/os/windows/font_win32.cpp +++ b/src/os/windows/font_win32.cpp @@ -497,7 +497,7 @@ void Win32FontCache::ClearFontCache() * For anti-aliased rendering, GDI uses the strange value range of 0 to 64, * inclusively. To map this to 0 to 255, we shift left by two and then * subtract one. */ - uint pitch = Align(aa ? gm.gmBlackBoxX : std::max(gm.gmBlackBoxX / 8u, 1u), 4); + uint pitch = Align(aa ? gm.gmBlackBoxX : std::max((gm.gmBlackBoxX + 7u) / 8u, 1u), 4); /* Draw shadow for medium size. */ if (this->fs == FS_NORMAL && !aa) { diff --git a/src/os/windows/win32.cpp b/src/os/windows/win32.cpp index cfe7d42d..997f18d3 100644 --- a/src/os/windows/win32.cpp +++ b/src/os/windows/win32.cpp @@ -247,7 +247,7 @@ bool FiosGetDiskFreeSpace(const char *path, uint64 *tot) ULARGE_INTEGER bytes_free; bool retval = GetDiskFreeSpaceEx(OTTD2FS(path), &bytes_free, nullptr, nullptr); - if (retval) *tot = bytes_free.QuadPart; + if (retval && tot != nullptr) *tot = bytes_free.QuadPart; SetErrorMode(sem); // reset previous setting return retval; @@ -625,9 +625,12 @@ wchar_t *convert_to_fs(const char *name, wchar_t *system_buf, size_t buflen, boo /** Determine the current user's locale. */ const char *GetCurrentLocale(const char *) { + const LANGID userUiLang = GetUserDefaultUILanguage(); + const LCID userUiLocale = MAKELCID(userUiLang, SORT_DEFAULT); + char lang[9], country[9]; - if (GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SISO639LANGNAME, lang, lengthof(lang)) == 0 || - GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SISO3166CTRYNAME, country, lengthof(country)) == 0) { + if (GetLocaleInfoA(userUiLocale, LOCALE_SISO639LANGNAME, lang, lengthof(lang)) == 0 || + GetLocaleInfoA(userUiLocale, LOCALE_SISO3166CTRYNAME, country, lengthof(country)) == 0) { /* Unable to retrieve the locale. */ return nullptr; } diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index cb90a391..6956d0e0 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -71,7 +71,7 @@ static RailStationGUISettings _railstation; ///< Settings of the station builder static void HandleStationPlacement(TileIndex start, TileIndex end); static void ShowBuildTrainDepotPicker(Window *parent); static void ShowBuildWaypointPicker(Window *parent); -static void ShowStationBuilder(Window *parent); +static Window *ShowStationBuilder(Window *parent); static void ShowSignalBuilder(Window *parent); /** @@ -888,6 +888,11 @@ static void HandleStationPlacement(TileIndex start, TileIndex end) ShowSelectStationIfNeeded(cmdcont, ta); } +/** Enum referring to the Hotkeys in the build rail station window */ +enum BuildRalStationHotkeys { + BRASHK_FOCUS_FILTER_BOX, ///< Focus the edit box for editing the filter string +}; + struct BuildRailStationWindow : public PickerWindowBase { private: uint line_height; ///< Height of a single line in the newstation selection matrix (#WID_BRAS_NEWST_LIST widget). @@ -959,7 +964,7 @@ struct BuildRailStationWindow : public PickerWindowBase { } public: - BuildRailStationWindow(WindowDesc *desc, Window *parent, bool newstation) : PickerWindowBase(desc, parent), filter_editbox(EDITBOX_MAX_SIZE) + 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->vscroll = nullptr; @@ -1113,6 +1118,21 @@ struct BuildRailStationWindow : public PickerWindowBase { this->BuildStationClassesAvailable(); } + EventState OnHotkey(int hotkey) override + { + switch (hotkey) { + case BRASHK_FOCUS_FILTER_BOX: + this->SetFocusedWidget(WID_BRAS_FILTER_EDITBOX); + SetFocusedWindow(this); // The user has asked to give focus to the text box, so make sure this window is focused. + break; + + default: + return ES_NOT_HANDLED; + } + + return ES_HANDLED; + } + void OnEditboxChanged(int wid) override { string_filter.SetFilterTerm(this->filter_editbox.text.buf); @@ -1490,8 +1510,29 @@ struct BuildRailStationWindow : public PickerWindowBase { { CheckRedrawStationCoverage(this); } + + static HotkeyList hotkeys; }; +/** + * Handler for global hotkeys of the BuildRailStationWindow. + * @param hotkey Hotkey + * @return ES_HANDLED if hotkey was accepted. + */ +static EventState BuildRailStationGlobalHotkeys(int hotkey) +{ + if (_game_mode == GM_MENU) return ES_NOT_HANDLED; + Window *w = ShowStationBuilder(FindWindowById(WC_BUILD_TOOLBAR, TRANSPORT_RAIL)); + if (w == nullptr) return ES_NOT_HANDLED; + return w->OnHotkey(hotkey); +} + +static Hotkey buildrailstation_hotkeys[] = { + Hotkey('F', "focus_filter_box", BRASHK_FOCUS_FILTER_BOX), + HOTKEY_LIST_END +}; +HotkeyList BuildRailStationWindow::hotkeys("buildrailstation", buildrailstation_hotkeys, BuildRailStationGlobalHotkeys); + Listing BuildRailStationWindow::last_sorting = { false, 0 }; Filtering BuildRailStationWindow::last_filtering = { false, 0 }; @@ -1513,23 +1554,23 @@ static const NWidgetPart _nested_station_builder_widgets[] = { EndContainer(), EndContainer(), NWidget(WWT_PANEL, COLOUR_DARK_GREEN), - NWidget(NWID_HORIZONTAL), + NWidget(NWID_HORIZONTAL), SetPadding(2, 0, 0, 2), NWidget(NWID_VERTICAL), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_BRAS_FILTER_CONTAINER), - NWidget(NWID_HORIZONTAL), SetPadding(2, 2, 0, 5), + NWidget(NWID_HORIZONTAL), SetPadding(0, 5, 2, 0), NWidget(WWT_TEXT, COLOUR_DARK_GREEN), SetFill(0, 1), SetDataTip(STR_LIST_FILTER_TITLE, STR_NULL), NWidget(WWT_EDITBOX, COLOUR_GREY, WID_BRAS_FILTER_EDITBOX), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_LIST_FILTER_OSKTITLE, STR_LIST_FILTER_TOOLTIP), EndContainer(), EndContainer(), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_BRAS_SHOW_NEWST_ADDITIONS), - NWidget(NWID_HORIZONTAL), SetPIP(7, 0, 7), SetPadding(2, 0, 1, 0), + NWidget(NWID_HORIZONTAL), SetPadding(0, 5, 2, 0), NWidget(WWT_MATRIX, COLOUR_GREY, WID_BRAS_NEWST_LIST), SetMinimalSize(122, 71), SetFill(1, 0), SetMatrixDataTip(1, 0, STR_STATION_BUILD_STATION_CLASS_TOOLTIP), SetScrollbar(WID_BRAS_NEWST_SCROLL), NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_BRAS_NEWST_SCROLL), EndContainer(), EndContainer(), - NWidget(WWT_LABEL, COLOUR_DARK_GREEN), SetMinimalSize(144, 11), SetDataTip(STR_STATION_BUILD_ORIENTATION, STR_NULL), SetPadding(1, 2, 0, 2), + NWidget(WWT_LABEL, COLOUR_DARK_GREEN), SetMinimalSize(144, 11), SetDataTip(STR_STATION_BUILD_ORIENTATION, STR_NULL), SetPadding(1, 2, 0, 0), NWidget(NWID_HORIZONTAL), NWidget(NWID_SPACER), SetMinimalSize(7, 0), SetFill(1, 0), NWidget(WWT_PANEL, COLOUR_GREY, WID_BRAS_PLATFORM_DIR_X), SetMinimalSize(66, 60), SetFill(0, 0), SetDataTip(0x0, STR_STATION_BUILD_RAILROAD_ORIENTATION_TOOLTIP), EndContainer(), @@ -1568,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), SetMinimalSize(144, 11), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), SetPadding(3, 2, 0, 2), + NWidget(WWT_LABEL, COLOUR_DARK_GREEN), SetMinimalSize(144, 11), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), SetPadding(3, 2, 0, 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), @@ -1582,7 +1623,7 @@ static const NWidgetPart _nested_station_builder_widgets[] = { /* We need an additional background for the matrix, as the matrix cannot handle the scrollbar due to not being an NWidgetCore. */ NWidget(WWT_PANEL, COLOUR_DARK_GREEN), SetScrollbar(WID_BRAS_MATRIX_SCROLL), NWidget(NWID_HORIZONTAL), - NWidget(NWID_MATRIX, COLOUR_DARK_GREEN, WID_BRAS_MATRIX), SetScrollbar(WID_BRAS_MATRIX_SCROLL), SetPIP(0, 2, 0), SetPadding(2, 0, 0, 0), + NWidget(NWID_MATRIX, COLOUR_DARK_GREEN, WID_BRAS_MATRIX), SetScrollbar(WID_BRAS_MATRIX_SCROLL), SetPIP(0, 2, 0), NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BRAS_IMAGE), SetMinimalSize(66, 60), SetFill(0, 0), SetResize(0, 0), SetDataTip(0x0, STR_STATION_BUILD_STATION_TYPE_TOOLTIP), SetScrollbar(WID_BRAS_MATRIX_SCROLL), EndContainer(), @@ -1593,7 +1634,7 @@ static const NWidgetPart _nested_station_builder_widgets[] = { EndContainer(), EndContainer(), NWidget(NWID_HORIZONTAL), - NWidget(WWT_EMPTY, INVALID_COLOUR, WID_BRAS_COVERAGE_TEXTS), SetFill(1, 1), SetResize(1, 0), + NWidget(WWT_EMPTY, INVALID_COLOUR, WID_BRAS_COVERAGE_TEXTS), SetPadding(2, 5, 0, 1), 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(), @@ -1609,14 +1650,15 @@ static WindowDesc _station_builder_desc( WDP_AUTO, "build_station_rail", 350, 0, WC_BUILD_STATION, WC_BUILD_TOOLBAR, WDF_CONSTRUCTION, - _nested_station_builder_widgets, lengthof(_nested_station_builder_widgets) + _nested_station_builder_widgets, lengthof(_nested_station_builder_widgets), + &BuildRailStationWindow::hotkeys ); /** Open station build window */ -static void ShowStationBuilder(Window *parent) +static Window *ShowStationBuilder(Window *parent) { bool newstations = StationClass::GetClassCount() > 2 || StationClass::Get(STAT_CLASS_DFLT)->GetSpecCount() != 1; - new BuildRailStationWindow(&_station_builder_desc, parent, newstations); + return new BuildRailStationWindow(&_station_builder_desc, parent, newstations); } struct BuildSignalWindow : public PickerWindowBase { diff --git a/src/rev.cpp.in b/src/rev.cpp.in index ad3fd747..ef9eb218 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[] = "1.11.0"; +const char _openttd_revision[] = "1.11.1"; /** * The text version of OpenTTD's build date. @@ -48,7 +48,7 @@ const char _openttd_build_date[] = __DATE__ " " __TIME__; /** * The git revision hash of this version. */ -const char _openttd_revision_hash[] = "bd80ec7cff2f2186b133ea4bee431cb1a2f1fc95"; +const char _openttd_revision_hash[] = "0be22efffc3c14db08baf5e58c448b5d074f4427"; /** * The year of this version. diff --git a/src/saveload/gamelog_sl.cpp b/src/saveload/gamelog_sl.cpp index 6bff1b15..d68297c9 100644 --- a/src/saveload/gamelog_sl.cpp +++ b/src/saveload/gamelog_sl.cpp @@ -107,8 +107,11 @@ static void Load_GLOG_common(LoggedAction *&gamelog_action, uint &gamelog_action assert(gamelog_action == nullptr); assert(gamelog_actions == 0); - GamelogActionType at; - while ((at = (GamelogActionType)SlReadByte()) != GLAT_NONE) { + byte type; + while ((type = SlReadByte()) != GLAT_NONE) { + if (type >= GLAT_END) SlErrorCorrupt("Invalid gamelog action type"); + GamelogActionType at = (GamelogActionType)type; + gamelog_action = ReallocT(gamelog_action, gamelog_actions + 1); LoggedAction *la = &gamelog_action[gamelog_actions++]; @@ -118,8 +121,10 @@ static void Load_GLOG_common(LoggedAction *&gamelog_action, uint &gamelog_action la->change = nullptr; la->changes = 0; - GamelogChangeType ct; - while ((ct = (GamelogChangeType)SlReadByte()) != GLCT_NONE) { + while ((type = SlReadByte()) != GLCT_NONE) { + if (type >= GLCT_END) SlErrorCorrupt("Invalid gamelog change type"); + GamelogChangeType ct = (GamelogChangeType)type; + la->change = ReallocT(la->change, la->changes + 1); LoggedChange *lc = &la->change[la->changes++]; @@ -127,8 +132,6 @@ static void Load_GLOG_common(LoggedAction *&gamelog_action, uint &gamelog_action memset(lc, 0, sizeof(*lc)); lc->ct = ct; - assert((uint)ct < GLCT_END); - SlObject(lc, _glog_desc[ct]); } } diff --git a/src/saveload/linkgraph_sl.cpp b/src/saveload/linkgraph_sl.cpp index a597edfc..f571e331 100644 --- a/src/saveload/linkgraph_sl.cpp +++ b/src/saveload/linkgraph_sl.cpp @@ -151,6 +151,7 @@ void SaveLoad_LinkGraph(LinkGraph &lg) } else { /* ... but as that wasted a lot of space we save a sparse matrix now. */ for (NodeID to = from; to != INVALID_NODE; to = lg.edges[from][to].next_edge) { + if (to >= size) SlErrorCorrupt("Link graph structure overflow"); SlObject(&lg.edges[from][to], _edge_desc); } } diff --git a/src/script/script_fatalerror.hpp b/src/script/script_fatalerror.hpp index 5d1a2c12..96c64e0b 100644 --- a/src/script/script_fatalerror.hpp +++ b/src/script/script_fatalerror.hpp @@ -19,7 +19,7 @@ class Script_FatalError { * Creates a "fatal error" exception. * @param msg The message describing the cause of the fatal error. */ - Script_FatalError(const char *msg) : + Script_FatalError(const std::string &msg) : msg(msg) {} @@ -27,10 +27,10 @@ class Script_FatalError { * The error message associated with the fatal error. * @return The error message. */ - const char *GetErrorMessage() { return msg; } + const std::string &GetErrorMessage() const { return msg; } private: - const char *msg; ///< The error message. + const std::string msg; ///< The error message. }; #endif /* SCRIPT_FATALERROR_HPP */ diff --git a/src/script/script_instance.cpp b/src/script/script_instance.cpp index 8227060d..f7f9de4f 100644 --- a/src/script/script_instance.cpp +++ b/src/script/script_instance.cpp @@ -100,7 +100,7 @@ void ScriptInstance::Initialize(const char *main_script, const char *instance_na ScriptObject::SetAllowDoCommand(true); } catch (Script_FatalError &e) { this->is_dead = true; - this->engine->ThrowError(e.GetErrorMessage()); + this->engine->ThrowError(e.GetErrorMessage().c_str()); this->engine->ResumeError(); this->Died(); } @@ -228,7 +228,7 @@ void ScriptInstance::GameLoop() this->callback = e.GetSuspendCallback(); } catch (Script_FatalError &e) { this->is_dead = true; - this->engine->ThrowError(e.GetErrorMessage()); + this->engine->ThrowError(e.GetErrorMessage().c_str()); this->engine->ResumeError(); this->Died(); } @@ -249,7 +249,7 @@ void ScriptInstance::GameLoop() this->callback = e.GetSuspendCallback(); } catch (Script_FatalError &e) { this->is_dead = true; - this->engine->ThrowError(e.GetErrorMessage()); + this->engine->ThrowError(e.GetErrorMessage().c_str()); this->engine->ResumeError(); this->Died(); } @@ -505,7 +505,7 @@ void ScriptInstance::Save() /* If we don't mark the script as dead here cleaning up the squirrel * stack could throw Script_FatalError again. */ this->is_dead = true; - this->engine->ThrowError(e.GetErrorMessage()); + this->engine->ThrowError(e.GetErrorMessage().c_str()); this->engine->ResumeError(); SaveEmpty(); /* We can't kill the script here, so mark it as crashed (not dead) and diff --git a/src/script/script_scanner.cpp b/src/script/script_scanner.cpp index 6fa88bfe..8b48809b 100644 --- a/src/script/script_scanner.cpp +++ b/src/script/script_scanner.cpp @@ -38,7 +38,7 @@ bool ScriptScanner::AddFile(const std::string &filename, size_t basepath_length, try { this->engine->LoadScript(filename.c_str()); } catch (Script_FatalError &e) { - DEBUG(script, 0, "Fatal error '%s' when trying to load the script '%s'.", e.GetErrorMessage(), filename.c_str()); + DEBUG(script, 0, "Fatal error '%s' when trying to load the script '%s'.", e.GetErrorMessage().c_str(), filename.c_str()); return false; } return true; diff --git a/src/script/squirrel.cpp b/src/script/squirrel.cpp index f97896eb..b9d614e8 100644 --- a/src/script/squirrel.cpp +++ b/src/script/squirrel.cpp @@ -21,7 +21,13 @@ #include <../squirrel/sqvm.h> #include "../core/alloc_func.hpp" -#include "../safeguards.h" +/** + * In the memory allocator for Squirrel we want to directly use malloc/realloc, so when the OS + * does not have enough memory the game does not go into unrecoverable error mode and kill the + * whole game, but rather let the AI die though then we need to circumvent MallocT/ReallocT. + * + * So no #include "../safeguards.h" here as is required, but after the allocator's implementation. + */ /* * If changing the call paths into the scripting engine, define this symbol to enable full debugging of allocations. @@ -32,6 +38,13 @@ struct ScriptAllocator { size_t allocated_size; ///< Sum of allocated data size size_t allocation_limit; ///< Maximum this allocator may use before allocations fail + /** + * Whether the error has already been thrown, so to not throw secondary errors in + * the handling of the allocation error. This as the handling of the error will + * throw a Squirrel error so the Squirrel stack can be dumped, however that gets + * allocated by this allocator and then you might end up in an infinite loop. + */ + bool error_thrown; static const size_t SAFE_LIMIT = 0x8000000; ///< 128 MiB, a safe choice for almost any situation @@ -44,11 +57,52 @@ struct ScriptAllocator { if (this->allocated_size > this->allocation_limit) throw Script_FatalError("Maximum memory allocation exceeded"); } + /** + * Catch all validation for the allocation; did it allocate too much memory according + * to the allocation limit or did the allocation at the OS level maybe fail? In those + * error situations a Script_FatalError is thrown, but once that has been done further + * allocations are allowed to make it possible for Squirrel to throw the error and + * clean everything up. + * @param requested_size The requested size that was requested to be allocated. + * @param p The pointer to the allocated object, or null if allocation failed. + */ + void CheckAllocation(size_t requested_size, const void *p) + { + if (this->allocated_size > this->allocation_limit && !this->error_thrown) { + /* Do not allow allocating more than the allocation limit, except when an error is + * already as then the allocation is for throwing that error in Squirrel, the + * associated stack trace information and while cleaning up the AI. */ + this->error_thrown = true; + char buff[128]; + seprintf(buff, lastof(buff), "Maximum memory allocation exceeded by " PRINTF_SIZE " bytes when allocating " PRINTF_SIZE " bytes", + this->allocated_size - this->allocation_limit, requested_size); + throw Script_FatalError(buff); + } + + if (p == nullptr) { + /* The OS did not have enough memory to allocate the object, regardless of the + * limit imposed by OpenTTD on the amount of memory that may be allocated. */ + if (this->error_thrown) { + /* The allocation is called in the error handling of a memory allocation + * failure, then not being able to allocate that small amount of memory + * means there is no other choice than to bug out completely. */ + MallocError(requested_size); + } + + this->error_thrown = true; + char buff[64]; + seprintf(buff, lastof(buff), "Out of memory. Cannot allocate " PRINTF_SIZE " bytes", requested_size); + throw Script_FatalError(buff); + } + } + void *Malloc(SQUnsignedInteger size) { - void *p = MallocT(size); + void *p = malloc(size); this->allocated_size += size; + this->CheckAllocation(size, p); + #ifdef SCRIPT_DEBUG_ALLOCATIONS assert(p != nullptr); assert(this->allocations.find(p) == this->allocations.end()); @@ -73,11 +127,13 @@ struct ScriptAllocator { this->allocations.erase(p); #endif - void *new_p = ReallocT(static_cast(p), size); + void *new_p = realloc(p, size); this->allocated_size -= oldsize; this->allocated_size += size; + this->CheckAllocation(size, p); + #ifdef SCRIPT_DEBUG_ALLOCATIONS assert(new_p != nullptr); assert(this->allocations.find(p) == this->allocations.end()); @@ -104,6 +160,7 @@ struct ScriptAllocator { this->allocated_size = 0; this->allocation_limit = static_cast(_settings_game.script.script_max_memory_megabytes) << 20; if (this->allocation_limit == 0) this->allocation_limit = SAFE_LIMIT; // in case the setting is somehow zero + this->error_thrown = false; } ~ScriptAllocator() @@ -114,6 +171,14 @@ struct ScriptAllocator { } }; +/** + * In the memory allocator for Squirrel we want to directly use malloc/realloc, so when the OS + * does not have enough memory the game does not go into unrecoverable error mode and kill the + * whole game, but rather let the AI die though then we need to circumvent MallocT/ReallocT. + * For the rest of this code, the safeguards should be in place though! + */ +#include "../safeguards.h" + ScriptAllocator *_squirrel_allocator = nullptr; /* See 3rdparty/squirrel/squirrel/sqmem.cpp for the default allocator implementation, which this overrides */ diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index b7545087..fb95d0b5 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -21,6 +21,7 @@ #include "string_func.h" #include "widgets/dropdown_type.h" #include "widgets/dropdown_func.h" +#include "widgets/slider_func.h" #include "highscore.h" #include "base_media_base.h" #include "company_base.h" @@ -36,6 +37,7 @@ #include "fontcache.h" #include "zoom_func.h" #include "video/video_driver.hpp" +#include "music/music_driver.hpp" #include #include @@ -335,6 +337,14 @@ struct GameOptionsWindow : Window { SetDParamStr(0, BaseMusic::GetUsedSet()->GetDescription(GetCurrentLanguageIsoCode())); DrawStringMultiLine(r.left, r.right, r.top, UINT16_MAX, STR_BLACK_RAW_STRING); break; + + case WID_GO_BASE_SFX_VOLUME: + DrawVolumeSliderWidget(r, _settings_client.music.effect_vol); + break; + + case WID_GO_BASE_MUSIC_VOLUME: + DrawVolumeSliderWidget(r, _settings_client.music.music_vol); + break; } } @@ -387,6 +397,16 @@ struct GameOptionsWindow : Window { } break; + case WID_GO_BASE_SFX_VOLUME: + case WID_GO_BASE_MUSIC_VOLUME: + size->width = ScaleGUITrad(67); + size->height = ScaleGUITrad(12); + resize->width = 0; + resize->height = 0; + fill->width = 0; + fill->height = 0; + break; + default: { int selected; DropDownList list = this->BuildDropDownList(widget, &selected); @@ -438,9 +458,35 @@ struct GameOptionsWindow : Window { _video_hw_accel = !_video_hw_accel; ShowErrorMessage(STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART, INVALID_STRING_ID, WL_INFO); this->SetWidgetLoweredState(WID_GO_VIDEO_ACCEL_BUTTON, _video_hw_accel); +#ifndef __APPLE__ + this->SetWidgetDisabledState(WID_GO_VIDEO_VSYNC_BUTTON, !_video_hw_accel); +#endif this->SetDirty(); break; + case WID_GO_VIDEO_VSYNC_BUTTON: + if (!_video_hw_accel) break; + + _video_vsync = !_video_vsync; + VideoDriver::GetInstance()->ToggleVsync(_video_vsync); + + this->SetWidgetLoweredState(WID_GO_VIDEO_VSYNC_BUTTON, _video_vsync); + this->SetDirty(); + 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); + this->SetDirty(); + SetWindowClassesDirty(WC_MUSIC_WINDOW); + } + + if (click_count > 0) this->mouse_capture_widget = widget; + break; + } + default: { int selected; DropDownList list = this->BuildDropDownList(widget, &selected); @@ -565,6 +611,11 @@ struct GameOptionsWindow : Window { this->SetWidgetLoweredState(WID_GO_FULLSCREEN_BUTTON, _fullscreen); this->SetWidgetLoweredState(WID_GO_VIDEO_ACCEL_BUTTON, _video_hw_accel); +#ifndef __APPLE__ + this->SetWidgetLoweredState(WID_GO_VIDEO_VSYNC_BUTTON, _video_vsync); + this->SetWidgetDisabledState(WID_GO_VIDEO_VSYNC_BUTTON, !_video_hw_accel); +#endif + 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); @@ -610,23 +661,34 @@ static const NWidgetPart _nested_game_options_widgets[] = { NWidget(WWT_FRAME, COLOUR_GREY), SetDataTip(STR_GAME_OPTIONS_GRAPHICS, STR_NULL), SetPadding(0, 10, 0, 10), NWidget(NWID_HORIZONTAL), - NWidget(NWID_VERTICAL), - NWidget(WWT_TEXT, COLOUR_GREY), SetMinimalSize(0, 12), SetFill(1, 0), SetDataTip(STR_GAME_OPTIONS_RESOLUTION, STR_NULL), SetPadding(0, 0, 2, 0), - NWidget(WWT_TEXT, COLOUR_GREY), SetMinimalSize(0, 12), SetFill(1, 0), SetDataTip(STR_GAME_OPTIONS_REFRESH_RATE, STR_NULL), SetPadding(0, 0, 2, 0), - NWidget(WWT_TEXT, COLOUR_GREY), SetMinimalSize(0, 12), SetFill(1, 0), SetDataTip(STR_GAME_OPTIONS_FULLSCREEN, STR_NULL), SetPadding(0, 0, 2, 0), - NWidget(WWT_TEXT, COLOUR_GREY), SetMinimalSize(0, 12), SetFill(1, 0), SetDataTip(STR_GAME_OPTIONS_VIDEO_ACCELERATION, STR_NULL), - EndContainer(), - NWidget(NWID_VERTICAL), - NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GO_RESOLUTION_DROPDOWN), SetMinimalSize(100, 12), SetDataTip(STR_BLACK_STRING, STR_GAME_OPTIONS_RESOLUTION_TOOLTIP), SetFill(1, 0), SetPadding(0, 0, 2, 0), - NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GO_REFRESH_RATE_DROPDOWN), SetMinimalSize(100, 12), SetDataTip(STR_GAME_OPTIONS_REFRESH_RATE_ITEM, STR_GAME_OPTIONS_REFRESH_RATE_TOOLTIP), SetFill(1, 0), SetPadding(0, 0, 2, 0), - NWidget(NWID_HORIZONTAL), SetPadding(0, 0, 2, 0), + NWidget(NWID_VERTICAL), SetPIP(0, 2, 0), + NWidget(NWID_HORIZONTAL), + NWidget(WWT_TEXT, COLOUR_GREY), SetMinimalSize(0, 12),SetDataTip(STR_GAME_OPTIONS_RESOLUTION, STR_NULL), + NWidget(NWID_SPACER), SetMinimalSize(1, 0), SetFill(1, 0), + NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GO_RESOLUTION_DROPDOWN), SetMinimalSize(200, 12), SetDataTip(STR_BLACK_STRING, STR_GAME_OPTIONS_RESOLUTION_TOOLTIP), + EndContainer(), + NWidget(NWID_HORIZONTAL), + NWidget(WWT_TEXT, COLOUR_GREY), SetMinimalSize(0, 12), SetDataTip(STR_GAME_OPTIONS_REFRESH_RATE, STR_NULL), + NWidget(NWID_SPACER), SetMinimalSize(1, 0), SetFill(1, 0), + NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GO_REFRESH_RATE_DROPDOWN), SetMinimalSize(200, 12), SetDataTip(STR_GAME_OPTIONS_REFRESH_RATE_ITEM, STR_GAME_OPTIONS_REFRESH_RATE_TOOLTIP), + EndContainer(), + NWidget(NWID_HORIZONTAL), + NWidget(WWT_TEXT, COLOUR_GREY), SetMinimalSize(0, 12), SetDataTip(STR_GAME_OPTIONS_FULLSCREEN, STR_NULL), NWidget(NWID_SPACER), SetMinimalSize(1, 0), SetFill(1, 0), NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_GO_FULLSCREEN_BUTTON), SetMinimalSize(21, 9), SetDataTip(STR_EMPTY, STR_GAME_OPTIONS_FULLSCREEN_TOOLTIP), EndContainer(), NWidget(NWID_HORIZONTAL), + NWidget(WWT_TEXT, COLOUR_GREY), SetMinimalSize(0, 12), SetDataTip(STR_GAME_OPTIONS_VIDEO_ACCELERATION, STR_NULL), NWidget(NWID_SPACER), SetMinimalSize(1, 0), SetFill(1, 0), NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_GO_VIDEO_ACCEL_BUTTON), SetMinimalSize(21, 9), SetDataTip(STR_EMPTY, STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP), EndContainer(), +#ifndef __APPLE__ + NWidget(NWID_HORIZONTAL), + NWidget(WWT_TEXT, COLOUR_GREY), SetMinimalSize(0, 12), SetDataTip(STR_GAME_OPTIONS_VIDEO_VSYNC, STR_NULL), + NWidget(NWID_SPACER), SetMinimalSize(1, 0), SetFill(1, 0), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_GO_VIDEO_VSYNC_BUTTON), SetMinimalSize(21, 9), SetDataTip(STR_EMPTY, STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP), + EndContainer(), +#endif EndContainer(), EndContainer(), EndContainer(), @@ -645,9 +707,10 @@ static const NWidgetPart _nested_game_options_widgets[] = { EndContainer(), NWidget(WWT_FRAME, COLOUR_GREY), SetDataTip(STR_GAME_OPTIONS_BASE_SFX, STR_NULL), SetPadding(0, 10, 0, 10), - NWidget(NWID_HORIZONTAL), SetPIP(0, 30, 0), + NWidget(NWID_HORIZONTAL), SetPIP(0, 30, 7), NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GO_BASE_SFX_DROPDOWN), SetMinimalSize(150, 12), SetDataTip(STR_BLACK_RAW_STRING, STR_GAME_OPTIONS_BASE_SFX_TOOLTIP), - NWidget(NWID_SPACER), SetFill(1, 0), + NWidget(NWID_SPACER), SetMinimalSize(150, 12), SetFill(1, 0), + NWidget(WWT_EMPTY, COLOUR_GREY, WID_GO_BASE_SFX_VOLUME), SetMinimalSize(67, 12), SetMinimalTextLines(1, 0), SetDataTip(0x0, STR_MUSIC_TOOLTIP_DRAG_SLIDERS_TO_SET_MUSIC), EndContainer(), NWidget(WWT_TEXT, COLOUR_GREY, WID_GO_BASE_SFX_DESCRIPTION), SetMinimalSize(330, 0), SetDataTip(STR_EMPTY, STR_GAME_OPTIONS_BASE_SFX_DESCRIPTION_TOOLTIP), SetFill(1, 0), SetPadding(6, 0, 6, 0), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(7, 0, 7), @@ -658,9 +721,10 @@ static const NWidgetPart _nested_game_options_widgets[] = { EndContainer(), NWidget(WWT_FRAME, COLOUR_GREY), SetDataTip(STR_GAME_OPTIONS_BASE_MUSIC, STR_NULL), SetPadding(0, 10, 0, 10), - NWidget(NWID_HORIZONTAL), SetPIP(0, 30, 0), + NWidget(NWID_HORIZONTAL), SetPIP(0, 30, 7), NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GO_BASE_MUSIC_DROPDOWN), SetMinimalSize(150, 12), SetDataTip(STR_BLACK_RAW_STRING, STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP), 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), SetMinimalTextLines(1, 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, NC_EQUALSIZE), SetPIP(7, 0, 7), diff --git a/src/sound.cpp b/src/sound.cpp index e6c1cb07..7d70fa76 100644 --- a/src/sound.cpp +++ b/src/sound.cpp @@ -252,7 +252,7 @@ static void SndPlayScreenCoordFx(SoundID sound, int left, int right, int top, in StartSound( sound, panning, - (_settings_client.music.effect_vol * _vol_factor_by_zoom[vp->zoom - ZOOM_LVL_BEGIN]) / 256 + _vol_factor_by_zoom[vp->zoom - ZOOM_LVL_BEGIN] ); return; } @@ -281,7 +281,7 @@ void SndPlayVehicleFx(SoundID sound, const Vehicle *v) void SndPlayFx(SoundID sound) { - StartSound(sound, 0.5, _settings_client.music.effect_vol); + StartSound(sound, 0.5, UINT8_MAX); } INSTANTIATE_BASE_MEDIA_METHODS(BaseMedia, SoundsSet) diff --git a/src/spritecache.cpp b/src/spritecache.cpp index 1c7cc6f7..288f74af 100644 --- a/src/spritecache.cpp +++ b/src/spritecache.cpp @@ -229,7 +229,7 @@ static void ResizeSpriteOut(SpriteLoader::Sprite *sprite, ZoomLevel zoom) SpriteLoader::CommonPixel *dst = sprite[zoom].data; const SpriteLoader::CommonPixel *src = sprite[zoom - 1].data; -#ifndef NDEBUG +#ifdef WITH_ASSERT const SpriteLoader::CommonPixel *src_end = src + sprite[zoom - 1].height * sprite[zoom - 1].width; #endif diff --git a/src/stdafx.h b/src/stdafx.h index 42a6106e..6ca183a9 100644 --- a/src/stdafx.h +++ b/src/stdafx.h @@ -112,7 +112,7 @@ #endif /* Stuff for GCC */ -#if defined(__GNUC__) || defined(__clang__) +#if defined(__GNUC__) || (defined(__clang__) && !defined(_MSC_VER)) # define NORETURN __attribute__ ((noreturn)) # define CDECL # define __int64 long long @@ -195,14 +195,10 @@ # define CDECL _cdecl # define WARN_FORMAT(string, args) -# ifndef __clang__ -# define FINAL sealed -# else -# define FINAL -# endif +# define FINAL final /* fallthrough attribute, VS 2017 */ -# if (_MSC_VER >= 1910) +# if (_MSC_VER >= 1910) || defined(__clang__) # define FALLTHROUGH [[fallthrough]] # else # define FALLTHROUGH diff --git a/src/strings.cpp b/src/strings.cpp index 02ca30f2..7f400aef 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -620,6 +620,12 @@ static int DeterminePluralForm(int64 count, int plural_form) * Scottish Gaelic */ case 13: return ((n == 1 || n == 11) ? 0 : (n == 2 || n == 12) ? 1 : ((n > 2 && n < 11) || (n > 12 && n < 20)) ? 2 : 3); + + /* Three forms: special cases for 1, 0 and numbers ending in 01 to 19. + * Used in: + * Romanian */ + case 14: + return n == 1 ? 0 : (n == 0 || (n % 100 > 0 && n % 100 < 20)) ? 1 : 2; } } diff --git a/src/table/misc_settings.ini b/src/table/misc_settings.ini index 9286d1c9..49a4caa1 100644 --- a/src/table/misc_settings.ini +++ b/src/table/misc_settings.ini @@ -77,6 +77,12 @@ var = _video_hw_accel def = true cat = SC_BASIC +[SDTG_BOOL] +name = ""video_vsync"" +var = _video_vsync +def = false +cat = SC_BASIC + [SDTG_OMANY] name = ""support8bpp"" type = SLE_UINT8 diff --git a/src/table/settings.ini b/src/table/settings.ini index c4a6aeaf..efbb3e0c 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -3522,7 +3522,7 @@ cat = SC_BASIC var = music.music_vol type = SLE_UINT8 flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -def = 127 +def = 50 min = 0 max = 127 interval = 1 @@ -3532,7 +3532,7 @@ cat = SC_BASIC var = music.effect_vol type = SLE_UINT8 flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -def = 127 +def = 100 min = 0 max = 127 interval = 1 diff --git a/src/table/strgen_tables.h b/src/table/strgen_tables.h index 1c565089..ecdafb3e 100644 --- a/src/table/strgen_tables.h +++ b/src/table/strgen_tables.h @@ -176,6 +176,7 @@ static const PluralForm _plural_forms[] = { { 2, "Two forms: cases for numbers ending with a consonant, and with a vowel.", "\"yeong,il,sam,yuk,chil,pal\" \"i,sa,o,gu\"" }, { 4, "Four forms: special cases for 1, 0 and numbers ending in 02 to 10, and numbers ending in 11 to 19.", "\"1\" \"0,2..10,102..110,202..210,...\" \"11..19,111..119,211..219,...\" \"other\"" }, { 4, "Four forms: special cases for 1 and 11, 2 and 12, 3..10 and 13..19.", "\"1,11\" \"2,12\" \"3..10,13..19\" \"other\"" }, + { 3, "Three forms: special cases for 1, 0 and numbers ending in 01 to 19.", "\"1\" \"0,2..19,101..119,201..219,...\" \"other\"" }, }; /* Flags: diff --git a/src/tgp.cpp b/src/tgp.cpp index 39fda6e6..e23b2643 100644 --- a/src/tgp.cpp +++ b/src/tgp.cpp @@ -658,7 +658,7 @@ static void HeightMapCurves(uint level) for (uint t = 0; t < lengthof(curve_maps); t++) { if (!HasBit(corner_bits, t)) continue; -#ifndef NDEBUG +#ifdef WITH_ASSERT bool found = false; #endif const control_point_t *cm = curve_maps[t].list; @@ -668,7 +668,7 @@ static void HeightMapCurves(uint level) if (*h >= p1.x && *h < p2.x) { ht[t] = p1.y + (*h - p1.x) * (p2.y - p1.y) / (p2.x - p1.x); -#ifndef NDEBUG +#ifdef WITH_ASSERT found = true; #endif break; diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 023063c1..43f3523f 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -107,7 +107,7 @@ Town::~Town() DeleteWindowById(WC_TOWN_VIEW, this->index); /* Check no industry is related to us. */ -#ifndef NDEBUG +#ifdef WITH_ASSERT for (const Industry *i : Industry::Iterate()) assert(i->town != this); /* ... and no object is related to us. */ diff --git a/src/townname.cpp b/src/townname.cpp index 082c40f7..519391f1 100644 --- a/src/townname.cpp +++ b/src/townname.cpp @@ -600,7 +600,7 @@ static char *MakeCzechTownName(char *buf, const char *last, uint32 seed) return strecpy(buf, _name_czech_real[SeedModChance(4, lengthof(_name_czech_real), seed)], last); } -#ifndef NDEBUG +#ifdef WITH_ASSERT const char *orig = buf; #endif diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 8ffaea40..a9af24c5 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -953,7 +953,7 @@ void CallVehicleTicks() PerformanceAccumulator::Reset(PFE_GL_AIRCRAFT); for (Vehicle *v : Vehicle::Iterate()) { -#ifndef NDEBUG +#ifdef WITH_ASSERT size_t vehicle_index = v->index; #endif diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 5960f0be..aa289382 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -1830,12 +1830,18 @@ struct VehicleListWindow : public BaseVehicleListWindow { break; } - case GB_SHARED_ORDERS: + 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 */ - ShowVehicleListWindow(vehgroup.vehicles_begin[0]); + if (vehgroup.NumVehicles() == 1) { + ShowVehicleViewWindow(v); + } else { + ShowVehicleListWindow(v); + } break; + } default: NOT_REACHED(); } diff --git a/src/video/cocoa/cocoa_ogl.mm b/src/video/cocoa/cocoa_ogl.mm index 8d02428e..f8c2e97e 100644 --- a/src/video/cocoa/cocoa_ogl.mm +++ b/src/video/cocoa/cocoa_ogl.mm @@ -134,7 +134,7 @@ - (void)drawInCGLContext:(CGLContextObj)ctx pixelFormat:(CGLPixelFormatObj)pf fo CGLSetCurrentContext(ctx); OpenGLBackend::Get()->Paint(); - if (_cursor.in_window) OpenGLBackend::Get()->DrawMouseCursor(); + OpenGLBackend::Get()->DrawMouseCursor(); [ super drawInCGLContext:ctx pixelFormat:pf forLayerTime:t displayTime:ts ]; } diff --git a/src/video/cocoa/cocoa_v.mm b/src/video/cocoa/cocoa_v.mm index 9fb74cd0..c16d1969 100644 --- a/src/video/cocoa/cocoa_v.mm +++ b/src/video/cocoa/cocoa_v.mm @@ -224,7 +224,7 @@ */ void VideoDriver_Cocoa::EditBoxLostFocus() { - [ [ this->cocoaview inputContext ] discardMarkedText ]; + [ [ this->cocoaview inputContext ] performSelectorOnMainThread:@selector(discardMarkedText) withObject:nil waitUntilDone:[ NSThread isMainThread ] ]; /* Clear any marked string from the current edit box. */ HandleTextInput(nullptr, true); } diff --git a/src/video/opengl.cpp b/src/video/opengl.cpp index e74ab7b5..bb509bcd 100644 --- a/src/video/opengl.cpp +++ b/src/video/opengl.cpp @@ -510,7 +510,7 @@ OpenGLBackend::~OpenGLBackend() _glDeleteBuffers(1, &this->anim_pbo); } if (_glDeleteTextures != nullptr) { - ClearCursorCache(); + this->InternalClearCursorCache(); OpenGLSprite::Destroy(); _glDeleteTextures(1, &this->vid_texture); @@ -1053,18 +1053,20 @@ void OpenGLBackend::Paint() */ void OpenGLBackend::DrawMouseCursor() { + if (!this->cursor_in_window) return; + /* Draw cursor on screen */ _cur_dpi = &_screen; - for (uint i = 0; i < _cursor.sprite_count; ++i) { - SpriteID sprite = _cursor.sprite_seq[i].sprite; + for (uint i = 0; i < this->cursor_sprite_count; ++i) { + SpriteID sprite = this->cursor_sprite_seq[i].sprite; /* Sprites are cached by PopulateCursorCache(). */ if (this->cursor_cache.Contains(sprite)) { - const Sprite *spr = GetSprite(sprite, ST_NORMAL); + Sprite *spr = this->cursor_cache.Get(sprite); - this->RenderOglSprite((OpenGLSprite *)this->cursor_cache.Get(sprite)->data, _cursor.sprite_seq[i].pal, - _cursor.pos.x + _cursor.sprite_pos[i].x + UnScaleByZoom(spr->x_offs, ZOOM_LVL_GUI), - _cursor.pos.y + _cursor.sprite_pos[i].y + UnScaleByZoom(spr->y_offs, ZOOM_LVL_GUI), + this->RenderOglSprite((OpenGLSprite *)spr->data, this->cursor_sprite_seq[i].pal, + this->cursor_pos.x + this->cursor_sprite_pos[i].x + UnScaleByZoom(spr->x_offs, ZOOM_LVL_GUI), + this->cursor_pos.y + this->cursor_sprite_pos[i].y + UnScaleByZoom(spr->y_offs, ZOOM_LVL_GUI), ZOOM_LVL_GUI); } } @@ -1072,20 +1074,24 @@ void OpenGLBackend::DrawMouseCursor() void OpenGLBackend::PopulateCursorCache() { + static_assert(lengthof(_cursor.sprite_seq) == lengthof(this->cursor_sprite_seq)); + static_assert(lengthof(_cursor.sprite_pos) == lengthof(this->cursor_sprite_pos)); + if (this->clear_cursor_cache) { /* We have a pending cursor cache clear to do first. */ this->clear_cursor_cache = false; this->last_sprite_pal = (PaletteID)-1; - Sprite *sp; - while ((sp = this->cursor_cache.Pop()) != nullptr) { - OpenGLSprite *sprite = (OpenGLSprite *)sp->data; - sprite->~OpenGLSprite(); - free(sp); - } + this->InternalClearCursorCache(); } + this->cursor_pos = _cursor.pos; + this->cursor_sprite_count = _cursor.sprite_count; + this->cursor_in_window = _cursor.in_window; + for (uint i = 0; i < _cursor.sprite_count; ++i) { + this->cursor_sprite_seq[i] = _cursor.sprite_seq[i]; + this->cursor_sprite_pos[i] = _cursor.sprite_pos[i]; SpriteID sprite = _cursor.sprite_seq[i].sprite; if (!this->cursor_cache.Contains(sprite)) { @@ -1102,6 +1108,19 @@ void OpenGLBackend::PopulateCursorCache() /** * Clear all cached cursor sprites. */ +void OpenGLBackend::InternalClearCursorCache() +{ + Sprite *sp; + while ((sp = this->cursor_cache.Pop()) != nullptr) { + OpenGLSprite *sprite = (OpenGLSprite *)sp->data; + sprite->~OpenGLSprite(); + free(sp); + } +} + +/** + * Queue a request for cursor cache clear. + */ void OpenGLBackend::ClearCursorCache() { /* If the game loop is threaded, this function might be called diff --git a/src/video/opengl.h b/src/video/opengl.h index c17a8536..b0318f98 100644 --- a/src/video/opengl.h +++ b/src/video/opengl.h @@ -65,12 +65,20 @@ class OpenGLBackend : public ZeroedMemoryAllocator, SpriteEncoder { PaletteID last_sprite_pal = (PaletteID)-1; ///< Last uploaded remap palette. bool clear_cursor_cache = false; ///< A clear of the cursor cache is pending. + Point cursor_pos; ///< Cursor position + bool cursor_in_window; ///< Cursor inside this window + PalSpriteID cursor_sprite_seq[16]; ///< Current image of cursor + Point cursor_sprite_pos[16]; ///< Relative position of individual cursor sprites + uint cursor_sprite_count; ///< Number of cursor sprites to draw + OpenGLBackend(); ~OpenGLBackend(); const char *Init(); bool InitShaders(); + void InternalClearCursorCache(); + void RenderOglSprite(OpenGLSprite *gl_sprite, PaletteID pal, int x, int y, ZoomLevel zoom); public: diff --git a/src/video/sdl2_opengl_v.cpp b/src/video/sdl2_opengl_v.cpp index 86dc104d..202593e6 100644 --- a/src/video/sdl2_opengl_v.cpp +++ b/src/video/sdl2_opengl_v.cpp @@ -69,8 +69,11 @@ const char *VideoDriver_SDL_OpenGL::Start(const StringList ¶m) int w, h; SDL_GetWindowSize(this->sdl_window, &w, &h); this->ClientSizeChanged(w, h, true); - - SDL_GL_SetSwapInterval(GetDriverParamBool(param, "vsync") ? 1 : 0); + /* We should have a valid screen buffer now. If not, something went wrong and we should abort. */ + if (_screen.dst_ptr == nullptr) { + this->Stop(); + return "Can't get pointer to screen buffer"; + } return nullptr; } @@ -91,6 +94,11 @@ void VideoDriver_SDL_OpenGL::DestroyContext() } } +void VideoDriver_SDL_OpenGL::ToggleVsync(bool vsync) +{ + SDL_GL_SetSwapInterval(vsync); +} + const char *VideoDriver_SDL_OpenGL::AllocateContext() { SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); @@ -107,6 +115,8 @@ const char *VideoDriver_SDL_OpenGL::AllocateContext() this->gl_context = SDL_GL_CreateContext(this->sdl_window); if (this->gl_context == nullptr) return "SDL2: Can't active GL context"; + ToggleVsync(_video_vsync); + return OpenGLBackend::Create(&GetOGLProcAddressCallback); } @@ -174,7 +184,7 @@ void VideoDriver_SDL_OpenGL::Paint() } OpenGLBackend::Get()->Paint(); - if (_cursor.in_window) OpenGLBackend::Get()->DrawMouseCursor(); + OpenGLBackend::Get()->DrawMouseCursor(); SDL_GL_SwapWindow(this->sdl_window); } diff --git a/src/video/sdl2_opengl_v.h b/src/video/sdl2_opengl_v.h index f749b1f4..c7e647ca 100644 --- a/src/video/sdl2_opengl_v.h +++ b/src/video/sdl2_opengl_v.h @@ -29,6 +29,8 @@ class VideoDriver_SDL_OpenGL : public VideoDriver_SDL_Base { bool HasAnimBuffer() override { return true; } uint8 *GetAnimBuffer() override { return this->anim_buffer; } + void ToggleVsync(bool vsync) override; + const char *GetName() const override { return "sdl-opengl"; } protected: diff --git a/src/video/sdl2_v.h b/src/video/sdl2_v.h index bd43f71f..d706cc66 100644 --- a/src/video/sdl2_v.h +++ b/src/video/sdl2_v.h @@ -17,7 +17,7 @@ /** The SDL video driver. */ class VideoDriver_SDL_Base : public VideoDriver { public: - VideoDriver_SDL_Base() : sdl_window(nullptr) {} + VideoDriver_SDL_Base() : sdl_window(nullptr), buffer_locked(false) {} const char *Start(const StringList ¶m) override; diff --git a/src/video/video_driver.cpp b/src/video/video_driver.cpp index bee67e1e..eaff0b74 100644 --- a/src/video/video_driver.cpp +++ b/src/video/video_driver.cpp @@ -21,6 +21,7 @@ #include "video_driver.hpp" bool _video_hw_accel; ///< Whether to consider hardware accelerated video drivers. +bool _video_vsync; ///< Whether we should use vsync (only if _video_hw_accel is enabled). void VideoDriver::GameLoop() { diff --git a/src/video/video_driver.hpp b/src/video/video_driver.hpp index 7a859565..4964e01c 100644 --- a/src/video/video_driver.hpp +++ b/src/video/video_driver.hpp @@ -28,6 +28,7 @@ extern std::vector _resolutions; extern Dimension _cur_resolution; extern bool _rightclick_emulate; extern bool _video_hw_accel; +extern bool _video_vsync; /** The base of all video drivers. */ class VideoDriver : public Driver { @@ -35,7 +36,7 @@ class VideoDriver : public Driver { const uint DEFAULT_WINDOW_HEIGHT = 480u; ///< Default window height. public: - VideoDriver() : is_game_threaded(true), change_blitter(nullptr) {} + VideoDriver() : fast_forward_key_pressed(false), fast_forward_via_key(false), is_game_threaded(true), change_blitter(nullptr) {} /** * Mark a particular area dirty. @@ -66,6 +67,12 @@ class VideoDriver : public Driver { */ virtual bool ToggleFullscreen(bool fullscreen) = 0; + /** + * Change the vsync setting. + * @param vsync The new setting. + */ + virtual void ToggleVsync(bool vsync) {} + /** * Callback invoked after the blitter was changed. * @return True if no error. diff --git a/src/video/win32_v.cpp b/src/video/win32_v.cpp index 1d9cd3e2..d13350c1 100644 --- a/src/video/win32_v.cpp +++ b/src/video/win32_v.cpp @@ -552,14 +552,6 @@ LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) uint scancode = GB(lParam, 16, 8); keycode = scancode == 41 ? (uint)WKC_BACKQUOTE : MapWindowsKey(wParam); - /* Silently drop all messages handled by WM_CHAR. */ - MSG msg; - if (PeekMessage(&msg, nullptr, 0, 0, PM_NOREMOVE)) { - if ((msg.message == WM_CHAR || msg.message == WM_DEADCHAR) && GB(lParam, 16, 8) == GB(msg.lParam, 16, 8)) { - return 0; - } - } - uint charcode = MapVirtualKey(wParam, MAPVK_VK_TO_CHAR); /* No character translation? */ @@ -568,21 +560,26 @@ LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) return 0; } - /* Is the console key a dead key? If yes, ignore the first key down event. */ - if (HasBit(charcode, 31) && !console) { - if (scancode == 41) { - console = true; - return 0; + /* If an edit box is in focus, wait for the corresponding WM_CHAR message. */ + if (!EditBoxInGlobalFocus()) { + /* Is the console key a dead key? If yes, ignore the first key down event. */ + if (HasBit(charcode, 31) && !console) { + if (scancode == 41) { + console = true; + return 0; + } } - } - console = false; + console = false; - /* IMEs and other input methods sometimes send a WM_CHAR without a WM_KEYDOWN, - * clear the keycode so a previous WM_KEYDOWN doesn't become 'stuck'. */ - uint cur_keycode = keycode; - keycode = 0; + /* IMEs and other input methods sometimes send a WM_CHAR without a WM_KEYDOWN, + * clear the keycode so a previous WM_KEYDOWN doesn't become 'stuck'. */ + uint cur_keycode = keycode; + keycode = 0; - return HandleCharMsg(cur_keycode, LOWORD(charcode)); + return HandleCharMsg(cur_keycode, LOWORD(charcode)); + } + + return 0; } case WM_SYSKEYDOWN: // user presses F10 or Alt, both activating the title-menu @@ -1293,7 +1290,6 @@ const char *VideoDriver_Win32OpenGL::Start(const StringList ¶m) if (BlitterFactory::GetCurrentBlitter()->GetScreenDepth() == 0) return "Only real blitters supported"; Dimension old_res = _cur_resolution; // Save current screen resolution in case of errors, as MakeWindow invalidates it. - this->vsync = GetDriverParamBool(param, "vsync"); LoadWGLExtensions(); @@ -1309,6 +1305,12 @@ const char *VideoDriver_Win32OpenGL::Start(const StringList ¶m) } this->ClientSizeChanged(this->width, this->height, true); + /* We should have a valid screen buffer now. If not, something went wrong and we should abort. */ + if (_screen.dst_ptr == nullptr) { + this->Stop(); + _cur_resolution = old_res; + return "Can't get pointer to screen buffer"; + } MarkWholeScreenDirty(); @@ -1338,6 +1340,15 @@ void VideoDriver_Win32OpenGL::DestroyContext() } } +void VideoDriver_Win32OpenGL::ToggleVsync(bool vsync) +{ + if (_wglSwapIntervalEXT != nullptr) { + _wglSwapIntervalEXT(vsync); + } else if (vsync) { + DEBUG(driver, 0, "OpenGL: Vsync requested, but not supported by driver"); + } +} + const char *VideoDriver_Win32OpenGL::AllocateContext() { this->dc = GetDC(this->main_wnd); @@ -1366,12 +1377,7 @@ const char *VideoDriver_Win32OpenGL::AllocateContext() } if (!wglMakeCurrent(this->dc, rc)) return "Can't active GL context"; - /* Enable/disable Vsync if supported. */ - if (_wglSwapIntervalEXT != nullptr) { - _wglSwapIntervalEXT(this->vsync ? 1 : 0); - } else if (vsync) { - DEBUG(driver, 0, "OpenGL: Vsync requested, but not supported by driver"); - } + this->ToggleVsync(_video_vsync); this->gl_rc = rc; return OpenGLBackend::Create(&GetOGLProcAddressCallback); @@ -1457,7 +1463,7 @@ void VideoDriver_Win32OpenGL::Paint() } OpenGLBackend::Get()->Paint(); - if (_cursor.in_window) OpenGLBackend::Get()->DrawMouseCursor(); + OpenGLBackend::Get()->DrawMouseCursor(); SwapBuffers(this->dc); } diff --git a/src/video/win32_v.h b/src/video/win32_v.h index f6ca291f..4686df71 100644 --- a/src/video/win32_v.h +++ b/src/video/win32_v.h @@ -17,7 +17,7 @@ /** Base class for Windows video drivers. */ class VideoDriver_Win32Base : public VideoDriver { public: - VideoDriver_Win32Base() : main_wnd(nullptr), fullscreen(false) {} + VideoDriver_Win32Base() : main_wnd(nullptr), fullscreen(false), buffer_locked(false) {} void Stop() override; @@ -138,12 +138,13 @@ class VideoDriver_Win32OpenGL : public VideoDriver_Win32Base { bool HasAnimBuffer() override { return true; } uint8 *GetAnimBuffer() override { return this->anim_buffer; } + void ToggleVsync(bool vsync) override; + const char *GetName() const override { return "win32-opengl"; } protected: HDC dc; ///< Window device context. HGLRC gl_rc; ///< OpenGL context. - bool vsync; ///< Enable VSync? uint8 *anim_buffer; ///< Animation buffer from OpenGL back-end. uint8 GetFullscreenBpp() override { return 32; } // OpenGL is always 32 bpp. diff --git a/src/viewport.cpp b/src/viewport.cpp index 2a3f9b32..aae659d5 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -2637,7 +2637,7 @@ void UpdateTileSelection() * @param params (optional) up to 5 pieces of additional information that may be added to a tooltip * @param close_cond Condition for closing this tooltip. */ -static inline void ShowMeasurementTooltips(StringID str, uint paramcount, const uint64 params[], TooltipCloseCondition close_cond = TCC_NONE) +static inline void ShowMeasurementTooltips(StringID str, uint paramcount, const uint64 params[], TooltipCloseCondition close_cond = TCC_EXIT_VIEWPORT) { if (!_settings_client.gui.measure_tooltip) return; GuiShowTooltips(_thd.GetCallbackWnd(), str, paramcount, params, close_cond); diff --git a/src/widget.cpp b/src/widget.cpp index b0656210..9de848a6 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -1156,7 +1156,7 @@ void NWidgetHorizontal::SetupSmallestSize(Window *w, bool init_array) this->smallest_y = std::max(this->smallest_y, child_wid->smallest_y + child_wid->padding_top + child_wid->padding_bottom); } /* 1b. Make the container higher if needed to accommodate all children nicely. */ -#ifndef NDEBUG +#ifdef WITH_ASSERT uint max_smallest = this->smallest_y + 3 * max_vert_fill; // Upper limit to computing smallest height. #endif uint cur_height = this->smallest_y; @@ -1323,7 +1323,7 @@ void NWidgetVertical::SetupSmallestSize(Window *w, bool init_array) this->smallest_x = std::max(this->smallest_x, child_wid->smallest_x + child_wid->padding_left + child_wid->padding_right); } /* 1b. Make the container wider if needed to accommodate all children nicely. */ -#ifndef NDEBUG +#ifdef WITH_ASSERT uint max_smallest = this->smallest_x + 3 * max_hor_fill; // Upper limit to computing smallest height. #endif uint cur_width = this->smallest_x; diff --git a/src/widget_type.h b/src/widget_type.h index c5083c6c..1692ef22 100644 --- a/src/widget_type.h +++ b/src/widget_type.h @@ -158,6 +158,16 @@ class NWidgetBase : public ZeroedMemoryAllocator { virtual void Draw(const Window *w) = 0; virtual void SetDirty(const Window *w) const; + Rect GetCurrentRect() const + { + Rect r; + r.left = this->pos_x; + r.top = this->pos_y; + r.right = this->pos_x + this->current_x; + r.bottom = this->pos_y + this->current_y; + return r; + } + WidgetType type; ///< Type of the widget / nested widget. uint fill_x; ///< Horizontal fill stepsize (from initial size, \c 0 means not resizable). uint fill_y; ///< Vertical fill stepsize (from initial size, \c 0 means not resizable). diff --git a/src/widgets/CMakeLists.txt b/src/widgets/CMakeLists.txt index 18ecd529..5586870a 100644 --- a/src/widgets/CMakeLists.txt +++ b/src/widgets/CMakeLists.txt @@ -44,6 +44,8 @@ add_files( screenshot_widget.h settings_widget.h sign_widget.h + slider.cpp + slider_func.h smallmap_widget.h station_widget.h statusbar_widget.h diff --git a/src/widgets/settings_widget.h b/src/widgets/settings_widget.h index 7f8b0e11..c68545e3 100644 --- a/src/widgets/settings_widget.h +++ b/src/widgets/settings_widget.h @@ -25,14 +25,17 @@ enum GameOptionsWidgets { WID_GO_BASE_GRF_TEXTFILE, ///< Open base GRF readme, changelog (+1) or license (+2). WID_GO_BASE_GRF_DESCRIPTION = WID_GO_BASE_GRF_TEXTFILE + TFT_END, ///< Description of selected base GRF. WID_GO_BASE_SFX_DROPDOWN, ///< Use to select a base SFX. + WID_GO_BASE_SFX_VOLUME, ///< Change sound effects volume. WID_GO_BASE_SFX_TEXTFILE, ///< Open base SFX readme, changelog (+1) or license (+2). 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_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 new file mode 100644 index 00000000..6d6d7328 --- /dev/null +++ b/src/widgets/slider.cpp @@ -0,0 +1,70 @@ +/* + * 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 slider.cpp Implementation of the horizontal slider widget. */ + +#include "../stdafx.h" +#include "../window_gui.h" +#include "../window_func.h" +#include "../strings_func.h" +#include "../zoom_func.h" +#include "slider_func.h" + +#include "../safeguards.h" + + +/** + * Draw a volume slider widget with know at given value + * @param r Rectangle to draw the widget in + * @param value Value to put the slider at + */ +void DrawVolumeSliderWidget(Rect r, byte value) +{ + static const int slider_width = 3; + + /* Draw a wedge indicating low to high volume level. */ + const int ha = (r.bottom - r.top) / 5; + int wx1 = r.left, wx2 = r.right; + if (_current_text_dir == TD_RTL) std::swap(wx1, wx2); + const uint shadow = _colour_gradient[COLOUR_GREY][3]; + const uint fill = _colour_gradient[COLOUR_GREY][6]; + const uint light = _colour_gradient[COLOUR_GREY][7]; + const std::vector wedge{ Point{wx1, r.bottom - ha}, Point{wx2, r.top + ha}, Point{wx2, r.bottom - ha} }; + GfxFillPolygon(wedge, fill); + GfxDrawLine(wedge[0].x, wedge[0].y, wedge[2].x, wedge[2].y, light); + GfxDrawLine(wedge[1].x, wedge[1].y, wedge[2].x, wedge[2].y, _current_text_dir == TD_RTL ? shadow : light); + GfxDrawLine(wedge[0].x, wedge[0].y, wedge[1].x, wedge[1].y, shadow); + + /* Draw a slider handle indicating current volume level. */ + const int sw = ScaleGUITrad(slider_width); + if (_current_text_dir == TD_RTL) value = 127 - value; + const int x = r.left + (value * (r.right - r.left - sw) / 127); + DrawFrameRect(x, r.top, x + sw, r.bottom, COLOUR_GREY, FR_NONE); +} + +/** + * Handle click on a volume 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 + */ +bool ClickVolumeSliderWidget(Rect r, Point pt, byte &value) +{ + byte new_vol = Clamp((pt.x - r.left) * 127 / (r.right - r.left), 0, 127); + if (_current_text_dir == TD_RTL) new_vol = 127 - new_vol; + + /* Clamp to make sure min and max are properly settable */ + if (new_vol > 124) new_vol = 127; + if (new_vol < 3) new_vol = 0; + if (new_vol != value) { + value = new_vol; + return true; + } + + return false; +} diff --git a/src/widgets/slider_func.h b/src/widgets/slider_func.h new file mode 100644 index 00000000..1aa1fa10 --- /dev/null +++ b/src/widgets/slider_func.h @@ -0,0 +1,21 @@ +/* + * 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 slider_type.h Types related to the horizontal slider widget. */ + +#ifndef WIDGETS_SLIDER_TYPE_H +#define WIDGETS_SLIDER_TYPE_H + +#include "../window_type.h" +#include "../gfx_func.h" + + +void DrawVolumeSliderWidget(Rect r, byte value); +bool ClickVolumeSliderWidget(Rect r, Point pt, byte &value); + + +#endif /* WIDGETS_SLIDER_TYPE_H */ diff --git a/src/window_gui.h b/src/window_gui.h index c792a6b2..aca7f448 100644 --- a/src/window_gui.h +++ b/src/window_gui.h @@ -268,6 +268,7 @@ enum TooltipCloseCondition { TCC_RIGHT_CLICK, TCC_HOVER, TCC_NONE, + TCC_EXIT_VIEWPORT, }; /**