diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 886e4e0877..55693231b6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -374,14 +374,19 @@ jobs: include: - container_image: "ubuntu:18.04" bundle_name: "bionic" + compiler: "g++-8" - container_image: "ubuntu:20.04" bundle_name: "focal" + compiler: "g++" - container_image: "ubuntu:20.10" bundle_name: "groovy" + compiler: "g++" - container_image: "debian:buster" bundle_name: "buster" + compiler: "g++" - container_image: "debian:bullseye" bundle_name: "bullseye" + compiler: "g++" runs-on: ubuntu-20.04 container: @@ -407,7 +412,7 @@ jobs: apt-get install -y --no-install-recommends \ cmake \ debhelper \ - g++ \ + ${{ matrix.compiler }} \ git \ make \ openssl \ @@ -434,7 +439,7 @@ jobs: cd build echo "::group::CMake" - cmake ${GITHUB_WORKSPACE} \ + CXX=${{ matrix.compiler }} cmake ${GITHUB_WORKSPACE} \ -DCMAKE_BUILD_TYPE=RelWithDebInfo \ -DCMAKE_INSTALL_PREFIX=/usr \ # EOF diff --git a/CMakeLists.txt b/CMakeLists.txt index c147e9184b..95f1aaa1a3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ if(NOT BINARY_NAME) endif() project(${BINARY_NAME} - VERSION 1.12.0 + VERSION 12.0 ) if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) @@ -96,7 +96,6 @@ if(OPTION_TOOLS_ONLY) -DCPACK_BINARY_DIR=${CMAKE_BINARY_DIR} -DREV_MAJOR=${PROJECT_VERSION_MAJOR} -DREV_MINOR=${PROJECT_VERSION_MINOR} - -DREV_BUILD=${PROJECT_VERSION_PATCH} $<$:-DWIN32=TRUE> -P "${CMAKE_SOURCE_DIR}/cmake/scripts/FindVersion.cmake" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} @@ -476,7 +475,6 @@ add_custom_target(find_version -DCPACK_BINARY_DIR=${CMAKE_BINARY_DIR} -DREV_MAJOR=${PROJECT_VERSION_MAJOR} -DREV_MINOR=${PROJECT_VERSION_MINOR} - -DREV_BUILD=${PROJECT_VERSION_PATCH} -DCONFIGURE_DEFINES="${CFG_DEFS}" $<$:-DWIN32=TRUE> -P "${CMAKE_SOURCE_DIR}/cmake/scripts/FindVersion.cmake" diff --git a/bin/ai/compat_1.12.nut b/bin/ai/compat_12.nut similarity index 100% rename from bin/ai/compat_1.12.nut rename to bin/ai/compat_12.nut diff --git a/bin/game/compat_1.12.nut b/bin/game/compat_12.nut similarity index 100% rename from bin/game/compat_1.12.nut rename to bin/game/compat_12.nut diff --git a/changelog.txt b/changelog.txt index bf75edde4f..a661cab6ec 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,207 @@ +12.0-beta1 (2021-08-15) +------------------------------------------------------------------------ +Feature: [Network] Remove lobby window; pressing "Join Game" now immediately joins a server (#9467) +Feature: [Network] Synchronize server name to clients and display in Online Players window (#9472) +Feature: [Network] Mention you are a spectator in the status bar (#9471) +Feature: [Network] No longer require port-forwarding to host a server (#9443, #9447) +Feature: [Network] Allow setting your server visibility to "invite-only" (#9434) +Feature: [Network] Join servers based on their invite code (#9432) +Feature: Raise the maximum NewGRF limit to 255 (#9428) +Feature: Persistent rotation of numbered auto/netsave after restart (#9395, #9397) +Feature: [NewGRF] Maximum curve speed modifier for rail vehicles (#9346) +Feature: Move sensitive information to secrets.cfg and private information to private.cfg (#9298) +Feature: Signed Windows builds (#9294) +Feature: [NewGRF] Define refittability of default vehicles using cargo classes (#9148) +Feature: Configurable subsidy duration, up to 5000 years (#9081) +Feature: [Network] Rework in-game Online Players window (#9067) +Feature: [Network] Show previous chat history when the chat message box is open (#9025) +Feature: Button to reset game settings to their default values (#8958) +Feature: Press Ctrl to build diagonal rivers in Scenario Editor (#8880) +Feature: Set wagon replacement per group when using autoreplace (#7441) +Add: [Network] Open Online Players window on starting/joining a server (#9479) +Add: [Script] Basic information about loaded NewGRFs for scripts (#9464) +Add: [AI] Get the number of vehicles in a given group (#9462) +Add: [Network] Inform network clients what game-script a server is running (#9441) +Add: Hindi translation (#9086) +Add: [Network] Ensure players fill in a name instead of defaulting to "Player" (#9080) +Change: Allow pause/unpause console command in single player (#9342) +Change: Make savegame format self-descriptive and consistent across all objects (#9322, #9335, #9338, #9339) +Change: By default, make "unload all" leave stations empty (#9301) +Change: Reworked the debug levels and messages for network logs (#9230, #9251) +Change: [Emscripten] Set default scrolling mode to non-pointer-locking (#9191) +Change: Use neutral pronouns for various strings (#9189, #9203, #9228) +Change: Make the town directory horizontally resizable (#9157) +Change: Allow non-ASCII currency separators (#9121) +Change: [NewGRF] Display a pop-up window for Errors with severity ERROR (#9119) +Change: Treat languages as finished, if translations are 75% completed (#9019, #9086) +Change: Disable NewGRF window apply button if no change was made (#8934) +Fix: [Script] Crash when iterating lists of which the key is larger than 32bit (#9465) +Fix: [Network] Desync due to use of unstable sort when distributing cargo production (#9460) +Fix #9440: Negative cargo payments not being handled correctly (#9455) +Fix: [Network] Crash when joining a server again after a TCP disconnect (#9453) +Fix: Don't enable rename button for network clients in build vehicle window (#9452) +Fix: Money could underflow and wrap around (#9451) +Fix: Parse the console settings the same way as config settings (#9438) +Fix: Ensure no more than the allowed number of NewGRFs are loaded from the configuration (#9430) +Fix: [NewGRF] Overflow when determining cargo mask for string code 9A 1E (#9423) +Fix: Integers for scripts are 64bit, but saved as 32bit (#9415) +Fix #9392: [Script] Return a valid value with GetBuildWithRefitCapacity even when AIs are maxed out in vehicles (#9393) +Fix #8169: Crash when autoreplacing vehicle with no orders (#9387) +Fix: Wrong cargo line position in IndustryCargo window (#9383) +Fix: Race-condition during startup of NewGRF scan (#9382) +Fix: Don't propagate Shift/Ctrl state till next game-tick (#9381) +Fix: Prevent palette updates during copying to the video driver (#9379) +Fix: [Network] Determining GetNetworkRevisionString could overflow and underflow its buffer (#9372) +Fix #9358: Don't skip empty files in tar archives (#9367) +Fix: For old savegames, station bus/truck station cache was not updated (#9366) +Fix #9353: [Script] Garbage collecting on priority queues could crash the game (#9356) +Fix: Respect the autosave_on_exit setting for Null video driver (#9343) +Fix: Compatible NewGRFs in crash-log reported wrong MD5 hash (#9340) +Fix: [Script] Ensure the saved script strings are properly validated and terminated (#9336) +Fix #9316: Town bridge length limit check incorrect above 250k inhabitants (#9318) +Fix: Limit heightmap sizes to 8192x8192 (#9307) +Fix #9281: Money generating exploit when buying out a company (#9300) +Fix: Part of a tile might not be redrawn when terraforming (#9296) +Fix: [OpenGL] Increase timeout when waiting for the GPU to be done with the drawing buffer (#9282) +Fix: Vehicles sent in the wrong direction if there is no path to the destination (#9280) +Fix #9264: Do not attach temporary wagons to free wagon chains when autoreplacing (#9278) +Fix #9267: [Script] Crash during garbage collection (#9275) +Fix: Encountering two-way red signals could prune unrelated Pathfinder branches (#9271) +Fix #9255: [Network] Crash when hostname is not found (#9259) +Fix #9256: Invalid read after free when replacing train chains (#9258) +Fix: [Emscripten] Force secure WebSockets over HTTPS (#9248) +Fix #9242: Tree tick handler did not scale by map size (#9246) +Fix: [Network] Mark server as offline when no longer reachable (#9244) +Fix: [Network] Don't rebuild the host-list during iterating the list (#9240) +Fix: [Network] Don't mark the last-joined server as a manually added server (#9239) +Fix: [Network] Clients leaving because of broken connections was not broadcasted (#9238) +Fix: [Network] Check on CIDR for netmask check considered everything valid (#9235) +Fix: Creating screenshots on dedicated servers failed (#9232) +Fix: Leaking file descriptors for downloaded content (#9229) +Fix: Spelling of several town names (#9222) +Fix #9209: Game hangs when resizing highscore/news window if the screen is too small (#9210) +Fix: [Network] Optimize creating network connections for clients using IPv4 and IPv6 (#9199) +Fix #9186: Fix incorrect bounding box height causing station sprite glitch (#9187) +Fix: Truncating strings in settings could leave invalid UTF-8 characters (#9121) +Fix: Many issues related to window scaling (#9087, #9219) +Fix: Invalidate cached vehicle colourmaps when changing liveries setting (#9006) +Fix #8981: Don't attempt to re-reserve path if already entering/entered depot (#9000) +Fix: Missing 'Town names:' colon in map gen GUI (#8986) +Fix: Sorting and filtering industries that produce/accept many cargoes (#8468) +Remove: [Network] COMPANY_INFO packets (#9475) +Remove: [Network] A server can no longer set a limit to the amount of spectators allowed (#9466) +Remove: Arbitrary limit on number of statically loaded NewGRFs (#9431) +Remove: [Network] Language and map-name from server information (#9070) + + +1.11.2 (2021-05-03) +------------------------------------------------------------------------ +Change: [Win32] Limit hardware accelerated video driver to OpenGL 3.2 or higher (#9077) +Change: More improvements to the GUI at different scales (#9075, #9102, #9107, #9133, #9174, #9183) +Fix: Query windows could be partially drawn (#9184) +Fix #9113: Crash when removing an airport that exists in an aircraft's orders (#9182) +Fix #9117: [Fluidsynth] Hang when changing song (#9181) +Fix: String validation could leave invalid UTF-8 encoded strings (#9096) +Fix: [Network] Out-of-bounds memory access with modified servers sending too short password salts (#9176) +Fix: Crash when extra viewport with zero height has sign in view (#9175) +Fix #9147: Crash when taking screenshots (#9169) +Fix #6598: [Network] Prevent crashes when (re)joining network game by falling back to main menu first (#9163) +Fix #9152: Screenshot success popup window was treated as an error (#9159) +Fix: Fast-forward stuttering when vsync is enabled (#9140) +Fix: [Network, Win32] Network errors were handled badly (#9116) +Fix: [Network] Savegame transfer could stall in rare cases (#9106) +Fix #9097: [NewGRF] Cargo initial payment variable was being truncated (#9098) +Fix: [NewGRF] Industry variable 66 and object variable 46 erroneously truncated the distance (#9088) +Fix: [NewGRF] Industry variables 65 and 66 ignored the parameter, and always used the north tile (#9088) +Fix: Do not include regression test AI in bundle (#9068, #9164) +Fix #9062: [Win32] Version in executable was not set to current release version (#9066, #9154) + + +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) +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) diff --git a/cmake/scripts/FindVersion.cmake b/cmake/scripts/FindVersion.cmake index bd853cec51..03d405c65c 100644 --- a/cmake/scripts/FindVersion.cmake +++ b/cmake/scripts/FindVersion.cmake @@ -6,9 +6,6 @@ endif() if(NOT REV_MINOR) set(REV_MINOR 0) endif() -if(NOT REV_BUILD) - set(REV_BUILD 0) -endif() # # Finds the current version of the current folder. diff --git a/docs/game_coordinator.md b/docs/game_coordinator.md index e8260f2e1c..8bf07d8027 100644 --- a/docs/game_coordinator.md +++ b/docs/game_coordinator.md @@ -62,3 +62,22 @@ server can continue to talk to each other. Some NAT gateways do not allow this method; for those this attempt will fail, and this also means that it is not possible to create a connection between the client and server. + +## 3) Via TURN + +As a last resort, the Game Coordinator can decide to connect the client and +server together via TURN. TURN is a relay service, relaying the messages +between client and server. + +As the client and server can already connect to the Game Coordinator, it is +very likely this is successful. + +It is important to note that a relay service has full view of the traffic +send between client and server, and as such it is important that you trust +the relay service used. +For official binaries, this relay service is hosted by openttd.org. The relay +service as hosted by openttd.org only validates it is relaying valid OpenTTD +packets and does no further inspection of the payload itself. +Although in our experience most patch-packs also use the services as offered +by openttd.org, it is possible they use different services. Please be mindful +about this. diff --git a/known-bugs.txt b/known-bugs.txt index be09c970bf..1b9a465af7 100644 --- a/known-bugs.txt +++ b/known-bugs.txt @@ -1,6 +1,4 @@ OpenTTD's known bugs -Last updated: 2021-02-28 -Release version: 1.11.0-beta2 ------------------------------------------------------------------------ diff --git a/regression/regression/info.nut b/regression/regression/info.nut index 50c9fa5146..1a52cfebbb 100644 --- a/regression/regression/info.nut +++ b/regression/regression/info.nut @@ -4,7 +4,7 @@ class Regression extends AIInfo { function GetShortName() { return "REGR"; } function GetDescription() { return "This runs regression-tests on some commands. On the same map the result should always be the same."; } function GetVersion() { return 1; } - function GetAPIVersion() { return "1.12"; } + function GetAPIVersion() { return "12"; } function GetDate() { return "2007-03-18"; } function CreateInstance() { return "Regression"; } function UseAsRandomAI() { return false; } diff --git a/regression/stationlist/info.nut b/regression/stationlist/info.nut index 0558ccc1fb..ad91c7645c 100644 --- a/regression/stationlist/info.nut +++ b/regression/stationlist/info.nut @@ -4,7 +4,7 @@ class StationList extends AIInfo { function GetShortName() { return "REGS"; } function GetDescription() { return "This runs stationlist-tests on some commands. On the same map the result should always be the same."; } function GetVersion() { return 1; } - function GetAPIVersion() { return "1.12"; } + function GetAPIVersion() { return "12"; } function GetDate() { return "2007-03-18"; } function CreateInstance() { return "StationList"; } function UseAsRandomAI() { return false; } diff --git a/src/ai/ai_info.cpp b/src/ai/ai_info.cpp index 757e780ce2..c064457b94 100644 --- a/src/ai/ai_info.cpp +++ b/src/ai/ai_info.cpp @@ -25,7 +25,7 @@ */ static bool CheckAPIVersion(const char *api_version) { - static const std::set versions = { "0.7", "1.0", "1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8", "1.9", "1.10", "1.11", "1.12" }; + static const std::set versions = { "0.7", "1.0", "1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8", "1.9", "1.10", "1.11", "12" }; return versions.find(api_version) != versions.end(); } diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index 6bbe5efd82..d603f811b8 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -1788,7 +1788,10 @@ struct BuildVehicleWindow : BuildVehicleWindowBase { this->GenerateBuildList(); this->vscroll->SetCount((uint)this->eng_list.size()); - this->SetWidgetsDisabledState(this->sel_engine == INVALID_ENGINE, WID_BV_SHOW_HIDE, WID_BV_BUILD, WID_BV_RENAME, WIDGET_LIST_END); + this->SetWidgetsDisabledState(this->sel_engine == INVALID_ENGINE, WID_BV_SHOW_HIDE, WID_BV_BUILD, WIDGET_LIST_END); + + /* Disable renaming engines in network games if you are not the server. */ + this->SetWidgetDisabledState(WID_BV_RENAME, this->sel_engine == INVALID_ENGINE || (_networking && !_network_server)); /* disable renaming engines in network games if you are not the server */ this->SetWidgetDisabledState(WID_BV_RENAME, _networking && !(_network_server || _network_settings_access)); diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index b77465efa4..77065b7884 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -789,14 +789,14 @@ DEF_CONSOLE_CMD(ConServerInfo) { if (argc == 0) { IConsoleHelp("List current and maximum client/company limits. Usage 'server_info'"); - IConsoleHelp("You can change these values by modifying settings 'network.max_clients', 'network.max_companies' and 'network.max_spectators'"); + IConsoleHelp("You can change these values by modifying settings 'network.max_clients' and 'network.max_companies'"); return true; } IConsolePrintF(CC_DEFAULT, "Invite code: %s", _network_server_invite_code.c_str()); IConsolePrintF(CC_DEFAULT, "Current/maximum clients: %3d/%3d", _network_game_info.clients_on, _settings_client.network.max_clients); IConsolePrintF(CC_DEFAULT, "Current/maximum companies: %3d/%3d", (int)Company::GetNumItems(), _settings_client.network.max_companies); - IConsolePrintF(CC_DEFAULT, "Current/maximum spectators: %3d/%3d", NetworkSpectatorCount(), _settings_client.network.max_spectators); + IConsolePrintF(CC_DEFAULT, "Current spectators: %3d", NetworkSpectatorCount()); return true; } @@ -856,11 +856,6 @@ DEF_CONSOLE_CMD(ConJoinCompany) return true; } - if (company_id == COMPANY_SPECTATOR && NetworkMaxSpectatorsReached()) { - IConsoleError("Cannot join spectators, maximum number of spectators reached."); - return true; - } - if (company_id != COMPANY_SPECTATOR && !Company::IsHumanID(company_id)) { IConsoleError("Cannot join AI company."); return true; @@ -3473,7 +3468,6 @@ void IConsoleStdLibRegister() IConsole::AliasRegister("server_port", "setting server_port %+"); IConsole::AliasRegister("max_clients", "setting max_clients %+"); IConsole::AliasRegister("max_companies", "setting max_companies %+"); - IConsole::AliasRegister("max_spectators", "setting max_spectators %+"); IConsole::AliasRegister("max_join_time", "setting max_join_time %+"); IConsole::AliasRegister("pause_on_join", "setting pause_on_join %+"); IConsole::AliasRegister("autoclean_companies", "setting autoclean_companies %+"); diff --git a/src/core/overflowsafe_type.hpp b/src/core/overflowsafe_type.hpp index 20cd5e87e1..cfbde555f1 100644 --- a/src/core/overflowsafe_type.hpp +++ b/src/core/overflowsafe_type.hpp @@ -18,25 +18,26 @@ * you multiply the maximum value with 2, or add 2, or subtract something from * the minimum value, etc. * @param T the type these integers are stored with. - * @param T_MAX the maximum value for the integers. - * @param T_MIN the minimum value for the integers. */ -template +template class OverflowSafeInt { private: + static constexpr T T_MAX = std::numeric_limits::max(); + static constexpr T T_MIN = std::numeric_limits::min(); + /** The non-overflow safe backend to store the value in. */ T m_value; typedef typename std::make_unsigned::type T_unsigned; public: - OverflowSafeInt() : m_value(0) { } + constexpr OverflowSafeInt() : m_value(0) { } - OverflowSafeInt(const OverflowSafeInt& other) { this->m_value = other.m_value; } - OverflowSafeInt(const int64 int_) { this->m_value = int_; } + constexpr OverflowSafeInt(const OverflowSafeInt& other) : m_value(other.m_value) { } + constexpr OverflowSafeInt(const int64 int_) : m_value(int_) { } - inline OverflowSafeInt& operator = (const OverflowSafeInt& other) { this->m_value = other.m_value; return *this; } + inline constexpr OverflowSafeInt& operator = (const OverflowSafeInt& other) { this->m_value = other.m_value; return *this; } - inline OverflowSafeInt operator - () const { return OverflowSafeInt(this->m_value == T_MIN ? T_MAX : -this->m_value); } + inline constexpr OverflowSafeInt operator - () const { return OverflowSafeInt(this->m_value == T_MIN ? T_MAX : -this->m_value); } /** * Safe implementation of addition. @@ -44,7 +45,7 @@ public: * @note when the addition would yield more than T_MAX (or less than T_MIN), * it will be T_MAX (respectively T_MIN). */ - inline OverflowSafeInt& operator += (const OverflowSafeInt& other) + inline constexpr OverflowSafeInt& operator += (const OverflowSafeInt& other) { #ifdef WITH_OVERFLOW_BUILTINS if (unlikely(__builtin_add_overflow(this->m_value, other.m_value, &this->m_value))) { @@ -62,7 +63,12 @@ public: return *this; } - inline OverflowSafeInt& operator -= (const OverflowSafeInt& other) + /** + * Safe implementation of subtraction. + * @param other the amount to subtract + * @note when the subtraction would yield less than T_MIN, it will be T_MIN. + */ + inline constexpr OverflowSafeInt& operator -= (const OverflowSafeInt& other) { #ifdef WITH_OVERFLOW_BUILTINS if (unlikely(__builtin_sub_overflow(this->m_value, other.m_value, &this->m_value))) { @@ -80,18 +86,18 @@ public: return *this; } - /* Operators for addition and subtraction */ - inline OverflowSafeInt operator + (const OverflowSafeInt& other) const { OverflowSafeInt result = *this; result += other; return result; } - inline OverflowSafeInt operator + (const int other) const { OverflowSafeInt result = *this; result += (int64)other; return result; } - inline OverflowSafeInt operator + (const uint other) const { OverflowSafeInt result = *this; result += (int64)other; return result; } - inline OverflowSafeInt operator - (const OverflowSafeInt& other) const { OverflowSafeInt result = *this; result -= other; return result; } - inline OverflowSafeInt operator - (const int other) const { OverflowSafeInt result = *this; result -= (int64)other; return result; } - inline OverflowSafeInt operator - (const uint other) const { OverflowSafeInt result = *this; result -= (int64)other; return result; } + /* Operators for addition and subtraction. */ + inline constexpr OverflowSafeInt operator + (const OverflowSafeInt& other) const { OverflowSafeInt result = *this; result += other; return result; } + inline constexpr OverflowSafeInt operator + (const int other) const { OverflowSafeInt result = *this; result += (int64)other; return result; } + inline constexpr OverflowSafeInt operator + (const uint other) const { OverflowSafeInt result = *this; result += (int64)other; return result; } + inline constexpr OverflowSafeInt operator - (const OverflowSafeInt& other) const { OverflowSafeInt result = *this; result -= other; return result; } + inline constexpr OverflowSafeInt operator - (const int other) const { OverflowSafeInt result = *this; result -= (int64)other; return result; } + inline constexpr OverflowSafeInt operator - (const uint other) const { OverflowSafeInt result = *this; result -= (int64)other; return result; } - inline OverflowSafeInt& operator ++ () { return *this += 1; } - inline OverflowSafeInt& operator -- () { return *this += -1; } - inline OverflowSafeInt operator ++ (int) { OverflowSafeInt org = *this; *this += 1; return org; } - inline OverflowSafeInt operator -- (int) { OverflowSafeInt org = *this; *this += -1; return org; } + inline constexpr OverflowSafeInt& operator ++ () { return *this += 1; } + inline constexpr OverflowSafeInt& operator -- () { return *this += -1; } + inline constexpr OverflowSafeInt operator ++ (int) { OverflowSafeInt org = *this; *this += 1; return org; } + inline constexpr OverflowSafeInt operator -- (int) { OverflowSafeInt org = *this; *this += -1; return org; } /** * Safe implementation of multiplication. @@ -99,10 +105,10 @@ public: * @note when the multiplication would yield more than T_MAX (or less than T_MIN), * it will be T_MAX (respectively T_MIN). */ - inline OverflowSafeInt& operator *= (const int factor) + inline constexpr OverflowSafeInt& operator *= (const int factor) { #ifdef WITH_OVERFLOW_BUILTINS - T out; + T out = 0; if (likely(!__builtin_mul_overflow(this->m_value, factor, &out))) { this->m_value = out; } else { @@ -126,73 +132,80 @@ public: return *this; } - /* Operators for multiplication */ - inline OverflowSafeInt operator * (const int64 factor) const { OverflowSafeInt result = *this; result *= factor; return result; } - inline OverflowSafeInt operator * (const int factor) const { OverflowSafeInt result = *this; result *= (int64)factor; return result; } - inline OverflowSafeInt operator * (const uint factor) const { OverflowSafeInt result = *this; result *= (int64)factor; return result; } - inline OverflowSafeInt operator * (const uint16 factor) const { OverflowSafeInt result = *this; result *= (int64)factor; return result; } - inline OverflowSafeInt operator * (const byte factor) const { OverflowSafeInt result = *this; result *= (int64)factor; return result; } + /* Operators for multiplication. */ + inline constexpr OverflowSafeInt operator * (const int64 factor) const { OverflowSafeInt result = *this; result *= factor; return result; } + inline constexpr OverflowSafeInt operator * (const int factor) const { OverflowSafeInt result = *this; result *= (int64)factor; return result; } + inline constexpr OverflowSafeInt operator * (const uint factor) const { OverflowSafeInt result = *this; result *= (int64)factor; return result; } + inline constexpr OverflowSafeInt operator * (const uint16 factor) const { OverflowSafeInt result = *this; result *= (int64)factor; return result; } + inline constexpr OverflowSafeInt operator * (const byte factor) const { OverflowSafeInt result = *this; result *= (int64)factor; return result; } - /* Operators for division */ - inline OverflowSafeInt& operator /= (const int64 divisor) { this->m_value /= divisor; return *this; } - inline OverflowSafeInt operator / (const OverflowSafeInt& divisor) const { OverflowSafeInt result = *this; result /= divisor.m_value; return result; } - inline OverflowSafeInt operator / (const int divisor) const { OverflowSafeInt result = *this; result /= divisor; return result; } - inline OverflowSafeInt operator / (const uint divisor) const { OverflowSafeInt result = *this; result /= (int)divisor; return result; } + /* Operators for division. */ + inline constexpr OverflowSafeInt& operator /= (const int64 divisor) { this->m_value /= divisor; return *this; } + inline constexpr OverflowSafeInt operator / (const OverflowSafeInt& divisor) const { OverflowSafeInt result = *this; result /= divisor.m_value; return result; } + inline constexpr OverflowSafeInt operator / (const int divisor) const { OverflowSafeInt result = *this; result /= divisor; return result; } + inline constexpr OverflowSafeInt operator / (const uint divisor) const { OverflowSafeInt result = *this; result /= (int)divisor; return result; } /* Operators for modulo */ - inline OverflowSafeInt& operator %= (const int divisor) { this->m_value %= divisor; return *this; } - inline OverflowSafeInt operator % (const int divisor) const { OverflowSafeInt result = *this; result %= divisor; return result; } - - /* Operators for shifting */ - inline OverflowSafeInt& operator <<= (const int shift) { this->m_value = ((T_unsigned) this->m_value) << shift; return *this; } - inline OverflowSafeInt operator << (const int shift) const { OverflowSafeInt result = *this; result <<= shift; return result; } - inline OverflowSafeInt& operator >>= (const int shift) { this->m_value >>= shift; return *this; } - inline OverflowSafeInt operator >> (const int shift) const { OverflowSafeInt result = *this; result >>= shift; return result; } - - /* Operators for (in)equality when comparing overflow safe ints */ - inline bool operator == (const OverflowSafeInt& other) const { return this->m_value == other.m_value; } - inline bool operator != (const OverflowSafeInt& other) const { return !(*this == other); } - inline bool operator > (const OverflowSafeInt& other) const { return this->m_value > other.m_value; } - inline bool operator >= (const OverflowSafeInt& other) const { return this->m_value >= other.m_value; } - inline bool operator < (const OverflowSafeInt& other) const { return !(*this >= other); } - inline bool operator <= (const OverflowSafeInt& other) const { return !(*this > other); } - - /* Operators for (in)equality when comparing non-overflow safe ints */ - inline bool operator == (const int other) const { return this->m_value == other; } - inline bool operator != (const int other) const { return !(*this == other); } - inline bool operator > (const int other) const { return this->m_value > other; } - inline bool operator >= (const int other) const { return this->m_value >= other; } - inline bool operator < (const int other) const { return !(*this >= other); } - inline bool operator <= (const int other) const { return !(*this > other); } - - inline operator int64 () const { return this->m_value; } + inline constexpr OverflowSafeInt& operator %= (const int divisor) { this->m_value %= divisor; return *this; } + inline constexpr OverflowSafeInt operator % (const int divisor) const { OverflowSafeInt result = *this; result %= divisor; return result; } + + /* Operators for shifting. */ + inline constexpr OverflowSafeInt& operator <<= (const int shift) { this->m_value = ((T_unsigned) this->m_value) << shift; return *this; } + inline constexpr OverflowSafeInt operator << (const int shift) const { OverflowSafeInt result = *this; result <<= shift; return result; } + inline constexpr OverflowSafeInt& operator >>= (const int shift) { this->m_value >>= shift; return *this; } + inline constexpr OverflowSafeInt operator >> (const int shift) const { OverflowSafeInt result = *this; result >>= shift; return result; } + + /* Operators for (in)equality when comparing overflow safe ints. */ + inline constexpr bool operator == (const OverflowSafeInt& other) const { return this->m_value == other.m_value; } + inline constexpr bool operator != (const OverflowSafeInt& other) const { return !(*this == other); } + inline constexpr bool operator > (const OverflowSafeInt& other) const { return this->m_value > other.m_value; } + inline constexpr bool operator >= (const OverflowSafeInt& other) const { return this->m_value >= other.m_value; } + inline constexpr bool operator < (const OverflowSafeInt& other) const { return !(*this >= other); } + inline constexpr bool operator <= (const OverflowSafeInt& other) const { return !(*this > other); } + + /* Operators for (in)equality when comparing non-overflow safe ints. */ + inline constexpr bool operator == (const int other) const { return this->m_value == other; } + inline constexpr bool operator != (const int other) const { return !(*this == other); } + inline constexpr bool operator > (const int other) const { return this->m_value > other; } + inline constexpr bool operator >= (const int other) const { return this->m_value >= other; } + inline constexpr bool operator < (const int other) const { return !(*this >= other); } + inline constexpr bool operator <= (const int other) const { return !(*this > other); } + + inline constexpr operator int64 () const { return this->m_value; } }; -/* Sometimes we got int64 operator OverflowSafeInt instead of vice versa. Handle that properly */ -template inline OverflowSafeInt operator + (int64 a, OverflowSafeInt b) { return b + a; } -template inline OverflowSafeInt operator - (int64 a, OverflowSafeInt b) { return -b + a; } -template inline OverflowSafeInt operator * (int64 a, OverflowSafeInt b) { return b * a; } -template inline OverflowSafeInt operator / (int64 a, OverflowSafeInt b) { return (OverflowSafeInt)a / (int)b; } - -/* Sometimes we got int operator OverflowSafeInt instead of vice versa. Handle that properly */ -template inline OverflowSafeInt operator + (int a, OverflowSafeInt b) { return b + a; } -template inline OverflowSafeInt operator - (int a, OverflowSafeInt b) { return -b + a; } -template inline OverflowSafeInt operator * (int a, OverflowSafeInt b) { return b * a; } -template inline OverflowSafeInt operator / (int a, OverflowSafeInt b) { return (OverflowSafeInt)a / (int)b; } - -/* Sometimes we got uint operator OverflowSafeInt instead of vice versa. Handle that properly */ -template inline OverflowSafeInt operator + (uint a, OverflowSafeInt b) { return b + a; } -template inline OverflowSafeInt operator - (uint a, OverflowSafeInt b) { return -b + a; } -template inline OverflowSafeInt operator * (uint a, OverflowSafeInt b) { return b * a; } -template inline OverflowSafeInt operator / (uint a, OverflowSafeInt b) { return (OverflowSafeInt)a / (int)b; } - -/* Sometimes we got byte operator OverflowSafeInt instead of vice versa. Handle that properly */ -template inline OverflowSafeInt operator + (byte a, OverflowSafeInt b) { return b + (uint)a; } -template inline OverflowSafeInt operator - (byte a, OverflowSafeInt b) { return -b + (uint)a; } -template inline OverflowSafeInt operator * (byte a, OverflowSafeInt b) { return b * (uint)a; } -template inline OverflowSafeInt operator / (byte a, OverflowSafeInt b) { return (OverflowSafeInt)a / (int)b; } - -typedef OverflowSafeInt OverflowSafeInt64; -typedef OverflowSafeInt OverflowSafeInt32; + +/* Sometimes we got int64 operator OverflowSafeInt instead of vice versa. Handle that properly. */ +template inline constexpr OverflowSafeInt operator + (const int64 a, const OverflowSafeInt b) { return b + a; } +template inline constexpr OverflowSafeInt operator - (const int64 a, const OverflowSafeInt b) { return -b + a; } +template inline constexpr OverflowSafeInt operator * (const int64 a, const OverflowSafeInt b) { return b * a; } +template inline constexpr OverflowSafeInt operator / (const int64 a, const OverflowSafeInt b) { return (OverflowSafeInt)a / (int)b; } + +/* Sometimes we got int operator OverflowSafeInt instead of vice versa. Handle that properly. */ +template inline constexpr OverflowSafeInt operator + (const int a, const OverflowSafeInt b) { return b + a; } +template inline constexpr OverflowSafeInt operator - (const int a, const OverflowSafeInt b) { return -b + a; } +template inline constexpr OverflowSafeInt operator * (const int a, const OverflowSafeInt b) { return b * a; } +template inline constexpr OverflowSafeInt operator / (const int a, const OverflowSafeInt b) { return (OverflowSafeInt)a / (int)b; } + +/* Sometimes we got uint operator OverflowSafeInt instead of vice versa. Handle that properly. */ +template inline constexpr OverflowSafeInt operator + (const uint a, const OverflowSafeInt b) { return b + a; } +template inline constexpr OverflowSafeInt operator - (const uint a, const OverflowSafeInt b) { return -b + a; } +template inline constexpr OverflowSafeInt operator * (const uint a, const OverflowSafeInt b) { return b * a; } +template inline constexpr OverflowSafeInt operator / (const uint a, const OverflowSafeInt b) { return (OverflowSafeInt)a / (int)b; } + +/* Sometimes we got byte operator OverflowSafeInt instead of vice versa. Handle that properly. */ +template inline constexpr OverflowSafeInt operator + (const byte a, const OverflowSafeInt b) { return b + (uint)a; } +template inline constexpr OverflowSafeInt operator - (const byte a, const OverflowSafeInt b) { return -b + (uint)a; } +template inline constexpr OverflowSafeInt operator * (const byte a, const OverflowSafeInt b) { return b * (uint)a; } +template inline constexpr OverflowSafeInt operator / (const byte a, const OverflowSafeInt b) { return (OverflowSafeInt)a / (int)b; } + +typedef OverflowSafeInt OverflowSafeInt64; +typedef OverflowSafeInt OverflowSafeInt32; + +/* Some basic "unit tests". Also has the bonus of confirming that constexpr is working. */ +static_assert(OverflowSafeInt32(INT32_MIN) - 1 == OverflowSafeInt32(INT32_MIN)); +static_assert(OverflowSafeInt32(INT32_MAX) + 1 == OverflowSafeInt32(INT32_MAX)); +static_assert(OverflowSafeInt32(INT32_MAX) * 2 == OverflowSafeInt32(INT32_MAX)); +static_assert(OverflowSafeInt32(INT32_MIN) * 2 == OverflowSafeInt32(INT32_MIN)); #endif /* OVERFLOWSAFE_TYPE_HPP */ diff --git a/src/core/pool_type.hpp b/src/core/pool_type.hpp index d6e4745fc1..141e8406e7 100644 --- a/src/core/pool_type.hpp +++ b/src/core/pool_type.hpp @@ -161,7 +161,11 @@ struct Pool : PoolBase { private: size_t index; - void ValidateIndex() { while (this->index < T::GetPoolSize() && !(T::IsValidID(this->index))) this->index++; } + void ValidateIndex() + { + while (this->index < T::GetPoolSize() && !(T::IsValidID(this->index))) this->index++; + if (this->index >= T::GetPoolSize()) this->index = T::Pool::MAX_SIZE; + } }; /* @@ -173,7 +177,7 @@ struct Pool : PoolBase { size_t from; IterateWrapper(size_t from = 0) : from(from) {} PoolIterator begin() { return PoolIterator(this->from); } - PoolIterator end() { return PoolIterator(T::GetPoolSize()); } + PoolIterator end() { return PoolIterator(T::Pool::MAX_SIZE); } bool empty() { return this->begin() == this->end(); } }; @@ -202,7 +206,11 @@ struct Pool : PoolBase { private: size_t index; F filter; - void ValidateIndex() { while (this->index < T::GetPoolSize() && !(T::IsValidID(this->index) && this->filter(this->index))) this->index++; } + void ValidateIndex() + { + while (this->index < T::GetPoolSize() && !(T::IsValidID(this->index) && this->filter(this->index))) this->index++; + if (this->index >= T::GetPoolSize()) this->index = T::Pool::MAX_SIZE; + } }; /* @@ -215,7 +223,7 @@ struct Pool : PoolBase { F filter; IterateWrapperFiltered(size_t from, F filter) : from(from), filter(filter) {} PoolIteratorFiltered begin() { return PoolIteratorFiltered(this->from, this->filter); } - PoolIteratorFiltered end() { return PoolIteratorFiltered(T::GetPoolSize(), this->filter); } + PoolIteratorFiltered end() { return PoolIteratorFiltered(T::Pool::MAX_SIZE, this->filter); } bool empty() { return this->begin() == this->end(); } }; diff --git a/src/engine_type.h b/src/engine_type.h index 83f8dc307e..f0b6ea5450 100644 --- a/src/engine_type.h +++ b/src/engine_type.h @@ -59,6 +59,7 @@ struct RailVehicleInfo { byte tractive_effort; ///< Tractive effort coefficient byte air_drag; ///< Coefficient of air drag byte user_def_data; ///< Property 0x25: "User-defined bit mask" Used only for (very few) NewGRF vehicles + int16 curve_speed_mod; ///< Modifier to maximum speed in curves (fixed-point binary with 8 fractional bits) }; /** Information about a ship vehicle. */ diff --git a/src/fios.cpp b/src/fios.cpp index b26e31e505..2dc788b768 100644 --- a/src/fios.cpp +++ b/src/fios.cpp @@ -22,6 +22,7 @@ #include #include #include "3rdparty/optional/ottd_optional.h" +#include #ifndef _WIN32 # include @@ -745,3 +746,59 @@ void ScanScenarios() { _scanner.Scan(true); } + +/** + * Constructs FiosNumberedSaveName. Initial number is the most recent save, or -1 if not found. + * @param prefix The prefix to use to generate a filename. +*/ +FiosNumberedSaveName::FiosNumberedSaveName(const std::string &prefix) : prefix(prefix), number(-1) +{ + static std::optional _autosave_path; + if (!_autosave_path) _autosave_path = FioFindDirectory(AUTOSAVE_DIR); + + static std::string _prefix; ///< Static as the lambda needs access to it. + + /* Callback for FiosFileScanner. */ + static fios_getlist_callback_proc *proc = [](SaveLoadOperation fop, const std::string &file, const char *ext, char *title, const char *last) { + if (strcasecmp(ext, ".sav") == 0 && StrStartsWith(file, _prefix)) return FIOS_TYPE_FILE; + return FIOS_TYPE_INVALID; + }; + + /* Prefix to check in the callback. */ + _prefix = *_autosave_path + this->prefix; + + /* Get the save list. */ + FileList list; + FiosFileScanner scanner(SLO_SAVE, proc, list); + scanner.Scan(".sav", _autosave_path->c_str(), false); + + /* Find the number for the most recent save, if any. */ + if (list.begin() != list.end()) { + SortingBits order = _savegame_sort_order; + _savegame_sort_order = SORT_BY_DATE | SORT_DESCENDING; + std::sort(list.begin(), list.end()); + _savegame_sort_order = order; + + std::string_view name = list.begin()->title; + std::from_chars(name.data() + this->prefix.size(), name.data() + name.size(), this->number); + } +} + +/** + * Generate a savegame name and number according to _settings_client.gui.max_num_autosaves. + * @return A filename in format ".sav". +*/ +std::string FiosNumberedSaveName::Filename() +{ + if (++this->number >= _settings_client.gui.max_num_autosaves) this->number = 0; + return stdstr_fmt("%s%u.sav", this->prefix.c_str(), this->number); +} + +/** + * Generate an extension for a savegame name. + * @return An extension in format "-.sav". +*/ +std::string FiosNumberedSaveName::Extension() +{ + return stdstr_fmt("-%s.sav", this->prefix.c_str()); +} diff --git a/src/fios.h b/src/fios.h index 46d6660823..c529c9b522 100644 --- a/src/fios.h +++ b/src/fios.h @@ -130,4 +130,16 @@ std::string FiosMakeSavegameName(const char *name); FiosType FiosGetSavegameListCallback(SaveLoadOperation fop, const std::string &file, const char *ext, char *title, const char *last); +/** + * A savegame name automatically numbered. + */ +struct FiosNumberedSaveName { + FiosNumberedSaveName(const std::string &prefix); + std::string Filename(); + std::string Extension(); +private: + std::string prefix; + int number; +}; + #endif /* FIOS_H */ diff --git a/src/game/game_info.cpp b/src/game/game_info.cpp index 9b27fbe2ec..4c36dc5b94 100644 --- a/src/game/game_info.cpp +++ b/src/game/game_info.cpp @@ -23,7 +23,7 @@ */ static bool CheckAPIVersion(const char *api_version) { - static const std::set versions = { "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8", "1.9", "1.10", "1.11", "1.12" }; + static const std::set versions = { "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8", "1.9", "1.10", "1.11", "12" }; return versions.find(api_version) != versions.end(); } diff --git a/src/industry_gui.cpp b/src/industry_gui.cpp index b3527940e7..5e82c3b0e6 100644 --- a/src/industry_gui.cpp +++ b/src/industry_gui.cpp @@ -1310,7 +1310,7 @@ protected: /* Runtime saved values */ static Listing last_sorting; - /* Constants for sorting stations */ + /* Constants for sorting industries */ static const StringID sorter_names[]; static GUIIndustryList::SortFunction * const sorter_funcs[]; @@ -1321,6 +1321,14 @@ protected: StringID cargo_filter_texts[NUM_CARGO + 3]; ///< Texts for filter_cargo, terminated by INVALID_STRING_ID byte produced_cargo_filter_criteria; ///< Selected produced cargo filter index byte accepted_cargo_filter_criteria; ///< Selected accepted cargo filter index + static CargoID produced_cargo_filter; + + enum class SorterType : uint8 { + IDW_SORT_BY_NAME, ///< Sorter type to sort by name + IDW_SORT_BY_TYPE, ///< Sorter type to sort by type + IDW_SORT_BY_PRODUCTION, ///< Sorter type to sort by production amount + IDW_SORT_BY_TRANSPORTED, ///< Sorter type to sort by transported percentage + }; /** * Set cargo filter list item index. @@ -1410,6 +1418,8 @@ protected: this->cargo_filter[this->produced_cargo_filter_criteria]); this->industries.Filter(filter); + + IndustryDirectoryWindow::produced_cargo_filter = this->cargo_filter[this->produced_cargo_filter_criteria]; this->industries.Sort(); this->vscroll->SetCount((uint)this->industries.size()); // Update scrollbar as well. @@ -1428,7 +1438,7 @@ protected: { assert(id < lengthof(i->produced_cargo)); - if (i->produced_cargo[id] == CT_INVALID) return 101; + if (i->produced_cargo[id] == CT_INVALID) return -1; return ToPercent8(i->last_month_pct_transported[id]); } @@ -1441,12 +1451,27 @@ protected: */ static int GetCargoTransportedSortValue(const Industry *i) { - int p1 = GetCargoTransportedPercentsIfValid(i, 0); - int p2 = GetCargoTransportedPercentsIfValid(i, 1); + CargoID filter = IndustryDirectoryWindow::produced_cargo_filter; + if (filter == CF_NONE) return 0; - if (p1 > p2) Swap(p1, p2); // lower value has higher priority + int percentage = 0, produced_cargo_count = 0; + for (uint id = 0; id < lengthof(i->produced_cargo); id++) { + if (filter == CF_ANY) { + int transported = GetCargoTransportedPercentsIfValid(i, id); + if (transported != -1) { + produced_cargo_count++; + percentage += transported; + } + if (produced_cargo_count == 0 && id == lengthof(i->produced_cargo) - 1 && percentage == 0) { + return transported; + } + } else if (filter == i->produced_cargo[id]) { + return GetCargoTransportedPercentsIfValid(i, id); + } + } - return (p1 << 8) + p2; + if (produced_cargo_count == 0) return percentage; + return percentage / produced_cargo_count; } /** Sort industries by name */ @@ -1471,10 +1496,18 @@ protected: /** Sort industries by production and name */ static bool IndustryProductionSorter(const Industry * const &a, const Industry * const &b) { + CargoID filter = IndustryDirectoryWindow::produced_cargo_filter; + if (filter == CF_NONE) return IndustryTypeSorter(a, b); + uint prod_a = 0, prod_b = 0; for (uint i = 0; i < lengthof(a->produced_cargo); i++) { - if (a->produced_cargo[i] != CT_INVALID) prod_a += a->last_month_production[i]; - if (b->produced_cargo[i] != CT_INVALID) prod_b += b->last_month_production[i]; + if (filter == CF_ANY) { + if (a->produced_cargo[i] != CT_INVALID) prod_a += a->last_month_production[i]; + if (b->produced_cargo[i] != CT_INVALID) prod_b += b->last_month_production[i]; + } else { + if (a->produced_cargo[i] == filter) prod_a += a->last_month_production[i]; + if (b->produced_cargo[i] == filter) prod_b += b->last_month_production[i]; + } } int r = prod_a - prod_b; @@ -1505,26 +1538,45 @@ protected: GetAllCargoSuffixes(CARGOSUFFIX_OUT, CST_DIR, i, i->type, indsp, i->produced_cargo, cargo_suffix); /* Get industry productions (CargoID, production, suffix, transported) */ - typedef std::tuple CargoInfo; + struct CargoInfo { + CargoID cargo_id; + uint16 production; + const char *suffix; + uint transported; + }; std::vector cargos; for (byte j = 0; j < lengthof(i->produced_cargo); j++) { if (i->produced_cargo[j] == CT_INVALID) continue; - cargos.emplace_back(i->produced_cargo[j], i->last_month_production[j], cargo_suffix[j].text, ToPercent8(i->last_month_pct_transported[j])); - } + cargos.push_back({ i->produced_cargo[j], i->last_month_production[j], cargo_suffix[j].text, ToPercent8(i->last_month_pct_transported[j]) }); + } + + switch (static_cast(this->industries.SortType())) { + case IndustryDirectoryWindow::SorterType::IDW_SORT_BY_NAME: + case IndustryDirectoryWindow::SorterType::IDW_SORT_BY_TYPE: + case IndustryDirectoryWindow::SorterType::IDW_SORT_BY_PRODUCTION: + /* Sort by descending production, then descending transported */ + std::sort(cargos.begin(), cargos.end(), [](const CargoInfo &a, const CargoInfo &b) { + if (a.production != b.production) return a.production > b.production; + return a.transported > b.transported; + }); + break; - /* Sort by descending production, then descending transported */ - std::sort(cargos.begin(), cargos.end(), [](const CargoInfo a, const CargoInfo b) { - if (std::get<1>(a) != std::get<1>(b)) return std::get<1>(a) > std::get<1>(b); - return std::get<3>(a) > std::get<3>(b); - }); + case IndustryDirectoryWindow::SorterType::IDW_SORT_BY_TRANSPORTED: + /* Sort by descending transported, then descending production */ + std::sort(cargos.begin(), cargos.end(), [](const CargoInfo &a, const CargoInfo &b) { + if (a.transported != b.transported) return a.transported > b.transported; + return a.production > b.production; + }); + break; + } /* If the produced cargo filter is active then move the filtered cargo to the beginning of the list, * because this is the one the player interested in, and that way it is not hidden in the 'n' more cargos */ const CargoID cid = this->cargo_filter[this->produced_cargo_filter_criteria]; if (cid != CF_ANY && cid != CF_NONE) { - auto filtered_ci = std::find_if(cargos.begin(), cargos.end(), [cid](const CargoInfo& ci) -> bool { - return std::get<0>(ci) == cid; + auto filtered_ci = std::find_if(cargos.begin(), cargos.end(), [cid](const CargoInfo &ci) -> bool { + return ci.cargo_id == cid; }); if (filtered_ci != cargos.end()) { std::rotate(cargos.begin(), filtered_ci, filtered_ci + 1); @@ -1535,10 +1587,10 @@ protected: for (size_t j = 0; j < std::min(3, cargos.size()); j++) { CargoInfo ci = cargos[j]; SetDParam(p++, STR_INDUSTRY_DIRECTORY_ITEM_INFO); - SetDParam(p++, std::get<0>(ci)); - SetDParam(p++, std::get<1>(ci)); - SetDParamStr(p++, std::get<2>(ci)); - SetDParam(p++, std::get<3>(ci)); + SetDParam(p++, ci.cargo_id); + SetDParam(p++, ci.production); + SetDParamStr(p++, ci.suffix); + SetDParam(p++, ci.transported); } /* Undisplayed cargos if any */ @@ -1786,6 +1838,8 @@ const StringID IndustryDirectoryWindow::sorter_names[] = { INVALID_STRING_ID }; +CargoID IndustryDirectoryWindow::produced_cargo_filter = CF_ANY; + /** Window definition of the industry directory gui */ static WindowDesc _industry_directory_desc( diff --git a/src/ini_load.cpp b/src/ini_load.cpp index b06cdf8d71..1b6532022e 100644 --- a/src/ini_load.cpp +++ b/src/ini_load.cpp @@ -112,8 +112,9 @@ void IniGroup::RemoveItem(const std::string &name) if (item->name != name) continue; *prev = item->next; - if (this->last_item == &this->item) { - this->last_item = &item->next; + /* "last_item" is a pointer to the "real-last-item"->next. */ + if (this->last_item == &item->next) { + this->last_item = prev; } item->next = nullptr; diff --git a/src/lang/afrikaans.txt b/src/lang/afrikaans.txt index 3cf6835d3a..0e1476892d 100644 --- a/src/lang/afrikaans.txt +++ b/src/lang/afrikaans.txt @@ -779,6 +779,7 @@ STR_STATUSBAR_PAUSED :{YELLOW}* * GE STR_STATUSBAR_AUTOSAVE :{RED}OUTOSTOOR STR_STATUSBAR_SAVING_GAME :{RED}* * STOOR SPELETJIE * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Boodskapgeskiedenis STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}'n Lys van al die onlangs nuus boodskappe @@ -1387,6 +1388,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Dubbel-klik STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Enkel klik (met fokus) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Enkel klik (dadelik) + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Regs-klik emulasie: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Kies die manier om regs-klik na te maak STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command-klik @@ -1981,39 +1983,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Kies die STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} Maatskap{P py pye} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Maksimum aantal maatskappye: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Beperk die verskaffer na 'n sekere bedrag van maatskappye -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} aanskouer{P "" s} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Maksimum aantal toekouers: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Beperk die verskaffer na 'n sekere bedrag van aanskouers STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Taal gepraat: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Ander spelers sal weet watter taal op die verskaffer gepraat is STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Tik 'n naam in vir die netwerk speeletjie -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Multispeler spel tuiste - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Berei tans voor om te verbind: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}'n Lys van alle ondernemings tans in hierdie speletjie. U kan een van beide sluit aan een of begin 'n nuwe een indien daar is 'n vry maatskappy gleuf - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}MAATSKAPPY INFORMASIE -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Maatskappy naam: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Inwyding: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Maatskappy boekwaarde: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Huidige kontantvloei: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Vorige jaar se inkomste: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Werkverrignting: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Voertuie: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Stasies: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Spelers: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Nuwe Maatskappy -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Skep 'n nuwe maatskappy -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Aanskou speletjie -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Bekyk die spel as 'n aanskouer -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Verbind maatskappy -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Hulp om die maatskappy te bestuur - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Besig om the konnek... @@ -2048,6 +2022,7 @@ STR_NETWORK_COMPANY_LIST_SPECTATE :Toeskou + STR_NETWORK_SERVER :Verskaffer STR_NETWORK_CLIENT :Klient STR_NETWORK_SPECTATORS :Aanskouers diff --git a/src/lang/arabic_egypt.txt b/src/lang/arabic_egypt.txt index cc78426e7a..7937bfed22 100644 --- a/src/lang/arabic_egypt.txt +++ b/src/lang/arabic_egypt.txt @@ -761,6 +761,7 @@ STR_STATUSBAR_PAUSED :{YELLOW}* * م STR_STATUSBAR_AUTOSAVE :{RED}حفظ تلقائي STR_STATUSBAR_SAVING_GAME :{RED}* * يتم حفظ اللعبة * * + # News message history STR_MESSAGE_HISTORY :{WHITE}الرسائل السابقة STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}قائمة بآخر الاخبار @@ -1240,6 +1241,7 @@ STR_CONFIG_SETTING_SCROLLWHEEL_SCROLL :تحريك ال STR_CONFIG_SETTING_SCROLLWHEEL_OFF :عدم استخدام STR_CONFIG_SETTING_SCROLLWHEEL_MULTIPLIER :سرعة تحريك الخريطة: {STRING} + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :محاكاة الزر الأيمن : {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :الأوامر STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :للتحكم @@ -1678,39 +1680,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}أختر STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM}شركة STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}أقصى عدد شركات: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}حدد العدد الاقصى للشركات في هذا الخادم -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM}مشاهد -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}أقصى عدد مشاهدين: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}حدد عدد المشاهدين لهذا الخادم STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}اللغة المتحدثة: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}اللاعبين الآخرين سيعرفون اللغة المتحدثة STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}أدخل أسم اللعبة للشبكة -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}ردهة تعدد اللاعبين - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}التحضير لالانضمام الى:{ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}قائمة بالشركات الموجودة باللعبة ، يمكنك الإنضمام لشركة أو تأسيس واحدة - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}معلومات الشركة -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}أسم الشركة:{WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}افتتاح:{WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}قيمة الشركة:{WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}الرصيد الحالي:{WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}دخل السنة الماضية:{WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}الأداء:{WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}مركبة:{WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}محطات:{WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}لاعبين:{WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}شركة جديدة -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}أنشئ شركة جديدة -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}شاهد اللعبة -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}شاهد اللعبة كامشاهد -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}أنضم لشركة -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}ساعد في إدارة الشركة - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}إتصال... @@ -1745,6 +1719,7 @@ STR_NETWORK_COMPANY_LIST_SPECTATE :شاهد + STR_NETWORK_SERVER :خادم STR_NETWORK_CLIENT :عميل STR_NETWORK_SPECTATORS :المشاهدين diff --git a/src/lang/basque.txt b/src/lang/basque.txt index 478f9b0e92..a360c2629f 100644 --- a/src/lang/basque.txt +++ b/src/lang/basque.txt @@ -758,6 +758,7 @@ STR_STATUSBAR_PAUSED :{YELLOW}* * G STR_STATUSBAR_AUTOSAVE :{RED}AUTO-GORDEA STR_STATUSBAR_SAVING_GAME :{RED}* * JOKOA GORDETZEN * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Mezu Historia STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Azken albiste mezuetako zerrenda @@ -1326,6 +1327,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Klik bikoitza STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Klik bakarra (enfokatua dagoenean) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Klik bakarra (Berehala) + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Xaguaren eskuineko botoiaren emulazioa: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Aukeratu saguaren eskuineko botoiaren klikak emulatzeko modua STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Komandoa+Klik @@ -1856,39 +1858,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Gehienez STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} konpainia STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Gehienezko konpainia kopurua: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Zerbitzaria konpainia kupuru zehatz batera mugatu -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} ikusle -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Gehienezko ikusle kopurua: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Zerbitzaria ikusle kupuru zehatz batera mugatu STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Hitzegiten den hizkuntza: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Beste jokalariek erabiltzen ari den hizkuntza ezagutu ahalko dute STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Sare joko batentzako izena sartu -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Multijokalari joko itxia - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Sartzeko prestatzen: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Joko honetan egun dauden konpainien zerrenda. Konpainia batera batu zaitezke edo konpainia berria sortu dezakezu lekua badago - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}KONPAINIA INFORMAZIOA -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Konpainia izena: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Sortutako urtea: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Konpainiaren balioa: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Egungo balorazioa: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Iazko diru sarrerak: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Errendimendua: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Ibilgailuak: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Geltokiak: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Jokalariak: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Konpainia berria -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Konpainia berria sortu -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Ikusle jokoa -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Jokoan ikusle bezala sartu -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Konpainian sartu -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Konpainia hau kudeatzen lagundu - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Konektatzen... @@ -1923,6 +1897,7 @@ STR_NETWORK_COMPANY_LIST_SPECTATE :Ikusle + STR_NETWORK_SERVER :Zerbitzaria STR_NETWORK_CLIENT :Bezeroa STR_NETWORK_SPECTATORS :Ikusleak diff --git a/src/lang/belarusian.txt b/src/lang/belarusian.txt index 284111311e..852850c709 100644 --- a/src/lang/belarusian.txt +++ b/src/lang/belarusian.txt @@ -1088,6 +1088,7 @@ STR_STATUSBAR_PAUSED :{YELLOW}* * STR_STATUSBAR_AUTOSAVE :{RED}Аўтазахаваньне STR_STATUSBAR_SAVING_GAME :{RED}* * ЗАХАВАНЬНЕ ГУЛЬНІ * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Гісторыя паведамленьняў STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Сьпіс нядаўніх навін @@ -1697,6 +1698,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Падвоен STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Адзіночная пстрычка (калі выдзелена) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Адзіночная пстрычка (неадкладна) + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Эмуляцыя правага кліка мышы: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Выбаць мэтад імітацыі націсьненьня правай кнопкі мышы. STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :каманда+клік @@ -2291,39 +2293,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Выба STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} кампанi{P я i яў} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Макс. колькасьць кампанiяў: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Абмежаваць максымальную колькасьць кампаніяў на сэрвэры -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} назіральнік{P "" i аў} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Макс. назіральнiкаў: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Абмежаваць максымальную колькасьць назіральнікаў на сэрвэры STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Мова зносінаў: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Іншыя гульцы будуць ведаць, на якой мове размаўляюць на сэрвэры STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Увядзіце назву сеткавай гульні -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Вітальня сеткавай гульні - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Падрыхтоўка далучэньня: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Сьпіс кампаніяў, якія зараз у гульні. Вы можаце далучыцца да якойсьці існуючай або адкрыць сваю, калі ёсьць вольны слот - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}ІНФАРМАЦЫЯ АБ КАМПАНІІ -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Назва кампаніі: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Заснавана: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Кошт кампаніі: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Бягучы балянс: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Прыбытак летась: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Прадукцыйнасьць: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Транспарт: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Станцыi: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Гульцы: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Новая кампанія -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Заснаваць новую кампанію -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Назіраць за гульнёй -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Сачыць за гульнёй у якасьці гледача -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Далучыцца да кампаніі -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Далучыцца да кампаніі й дапамагчы ў кіраваньні ёю - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Злучэньне... @@ -2358,6 +2332,7 @@ STR_NETWORK_COMPANY_LIST_SPECTATE :Назірац + STR_NETWORK_SERVER :Сэрвэр STR_NETWORK_CLIENT :Кліент STR_NETWORK_SPECTATORS :Назіральнікі diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index 988574f7c8..9d758d4089 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -790,6 +790,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * P STR_STATUSBAR_AUTOSAVE :{RED}Salvo Automaticamente STR_STATUSBAR_SAVING_GAME :{RED}* * SALVANDO JOGO * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Histórico de Mensagens STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Uma lista das mensagens de notícias recentes @@ -1446,6 +1447,12 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Clique duplo STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Clique simples (quando em foco) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Clique simples (imediatamente) +STR_CONFIG_SETTING_USE_RELAY_SERVICE :Usar serviço de retransmissão: {STRING} +STR_CONFIG_SETTING_USE_RELAY_SERVICE_HELPTEXT :Se durante a criação da conexão o servidor falhar, pode-se usar um serviço de retransmissão para criar a conexão. "Nunca" não permite isso, "perguntar" irá perguntar antes, "permitir" vai permitir sem perguntar +STR_CONFIG_SETTING_USE_RELAY_SERVICE_NEVER :Nunca +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ASK :Perguntar +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ALLOW :Permitir + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Emulação do clique direito: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Seleciona o método para emular cliques com o botão direito STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Clique de comando @@ -1798,6 +1805,7 @@ STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :{ORANGE}Indúst STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :{ORANGE}Distribuição de Carga STR_CONFIG_SETTING_AI :{ORANGE}Oponentes STR_CONFIG_SETTING_AI_NPC :{ORANGE}Computadores +STR_CONFIG_SETTING_NETWORK :{ORANGE}Rede STR_CONFIG_SETTING_PATHFINDER_NPF :NPF STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Recomendado) @@ -2003,7 +2011,9 @@ STR_FACE_EARRING :Brinco: STR_FACE_TIE_EARRING_TOOLTIP :{BLACK}Alterar gravata ou brinco ############ Next lines match ServerGameType +STR_NETWORK_SERVER_VISIBILITY_LOCAL :Local STR_NETWORK_SERVER_VISIBILITY_PUBLIC :Público +STR_NETWORK_SERVER_VISIBILITY_INVITE_ONLY :Apenas por convite ############ End of leave-in-this-order # Network server list @@ -2038,6 +2048,7 @@ STR_NETWORK_SERVER_LIST_SERVER_VERSION :{SILVER}Versão STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}IP do servidor: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}Data de inicio: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}Data atual: {WHITE}{DATE_SHORT} +STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}Script de jogo: {WHITE}{STRING} (v{NUM}) STR_NETWORK_SERVER_LIST_PASSWORD :{SILVER}Protegido por senha! STR_NETWORK_SERVER_LIST_SERVER_OFFLINE :{SILVER}SERVIDOR DESLIGADO STR_NETWORK_SERVER_LIST_SERVER_FULL :{SILVER}SERVIDOR CHEIO @@ -2058,6 +2069,7 @@ STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Iniciar STR_NETWORK_SERVER_LIST_START_SERVER_TOOLTIP :{BLACK}Iniciar um servidor próprio STR_NETWORK_SERVER_LIST_PLAYER_NAME_OSKTITLE :{BLACK}Coloque seu nome +STR_NETWORK_SERVER_LIST_ENTER_SERVER_ADDRESS :{BLACK}Insira o endereço do servidor ou o código de convite # Start new multiplayer server STR_NETWORK_START_SERVER_CAPTION :{WHITE}Iniciar novo jogo @@ -2075,39 +2087,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Escolha STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} empresa{P "" s} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Núm máx de empresas: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Limita o servidor para uma certa quantia de empresas -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} espectador{P "" es} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Núm máx de espectadores: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Limita o servidor para um certa quantia de espectadores STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Idioma falado: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Outros jogadores saberão o idioma utilizado no servidor. STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Coloque o nome para o jogo em rede -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Sala de espera do jogo - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Preparando para conectar em: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Lista de todas as empresas ativas no jogo. Você pode juntar-se a uma delas ou iniciar uma nova empresa. - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}INFORMAÇÃO DA EMPRESA -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Nome da empresa: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Inauguração: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Valor da empresa: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Balanço atual: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Rendimento do último ano: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Desempenho: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Veículos: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Estações: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Jogadores: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Nova empresa -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Criar uma nova empresa -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Observar jogo -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Ver jogo como um espectador -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Unir-se à empresa -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Auxiliar na gestão desta empresa - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Conectando... @@ -2144,6 +2128,10 @@ STR_NETWORK_CLIENT_LIST_SERVER_NAME_EDIT_TOOLTIP :{BLACK}Edita o STR_NETWORK_CLIENT_LIST_SERVER_NAME_QUERY_CAPTION :Nome do servidor STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY :{BLACK}Visibilidade STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY_TOOLTIP :{BLACK}Se outras pessoas podem ver seu servidor na lista pública +STR_NETWORK_CLIENT_LIST_SERVER_INVITE_CODE :{BLACK}Código de convite +STR_NETWORK_CLIENT_LIST_SERVER_INVITE_CODE_TOOLTIP :{BLACK}Código de convite que outros jogadores podem usar para se juntar a esse servidor +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE :{BLACK}Tipo de conexão +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TOOLTIP :{BLACK}Se e como seu servidor pode ser acessado por outros STR_NETWORK_CLIENT_LIST_PLAYER :{BLACK}Jogador STR_NETWORK_CLIENT_LIST_PLAYER_NAME :{BLACK}Nome STR_NETWORK_CLIENT_LIST_PLAYER_NAME_TOOLTIP :{BLACK}Seu nome de jogador @@ -2163,6 +2151,11 @@ STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP :{BLACK}Esse é STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT :{BLACK}{NUM} cliente{P "" s} / {NUM} empresa{P "" s} ############ Begin of ConnectionType +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_UNKNOWN :{BLACK}Local +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_ISOLATED :{RED}Jogadores remotos não podem se conectar +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_DIRECT :{BLACK}Público +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_STUN :{BLACK}Atrás de um NAT +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TURN :{BLACK}Através de retransmissão ############ End of ConnectionType STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :Expulsar @@ -2176,6 +2169,12 @@ STR_NETWORK_CLIENT_LIST_ASK_CLIENT_BAN :{YELLOW}Você t STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Você tem certeza que quer excluir a empresa '{COMPANY}'? STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Você tem certeza que quer restaurar a senha da empresa '{COMPANY}'? +STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}Usar retransmissão? +STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}Erro ao estabelecer uma conexão entre você e o servidor.{}Você gostaria de retransmitir essa sessão via '{STRING}'? +STR_NETWORK_ASK_RELAY_NO :{BLACK}Não +STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Sim, apenas dessa vez +STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Sim, não perguntar novamente + STR_NETWORK_SERVER :Servidor STR_NETWORK_CLIENT :Cliente STR_NETWORK_SPECTATORS :Espectadores @@ -2292,6 +2291,9 @@ STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}O servid STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}O servidor está reiniciando...{}Aguarde... STR_NETWORK_MESSAGE_KICKED :*** {STRING} foi kickado. Motivo: ({STRING}) +STR_NETWORK_ERROR_COORDINATOR_REGISTRATION_FAILED :{WHITE}Falha no registro do servidor +STR_NETWORK_ERROR_COORDINATOR_ISOLATED :{WHITE}Seu servidor não permite conexões remotas +STR_NETWORK_ERROR_COORDINATOR_ISOLATED_DETAIL :{WHITE}Outros jogadores não poderão se conectar ao seu servidor # Content downloading window STR_CONTENT_TITLE :{WHITE}Baixando conteúdo diff --git a/src/lang/bulgarian.txt b/src/lang/bulgarian.txt index 0416a620cf..da07012ac1 100644 --- a/src/lang/bulgarian.txt +++ b/src/lang/bulgarian.txt @@ -760,6 +760,7 @@ STR_STATUSBAR_PAUSED :{YELLOW}* * И STR_STATUSBAR_AUTOSAVE :{RED}АВТОЗАПАЗВАНЕ STR_STATUSBAR_SAVING_GAME :{RED}* * ЗАПИСВАНЕ НА ИГРА * * + # News message history STR_MESSAGE_HISTORY :{WHITE}История на съобщенията STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Списък с последните новини @@ -1346,6 +1347,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Двойно н STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Еднократно натискане (когато е на фокус) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Еднократно натискане (незабавно) + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Дясно-щракане емулациа: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Избира метода за симулация на десния бутон на мишката STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Команда-щракане @@ -1898,39 +1900,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Избо STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} компани{P а ий} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Макс. брой компании: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Ограничаване на играта до определен брой компании -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} зрител{P "" s} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Макс. брой наблюдатели: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Ограничаване на сървъра до определен брой наблюдатели STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Говорим език: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Другите играчи ще знаят езика на който се говори на сървъра STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Въведете име за мрежовата игра -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Преддверие на мрежовите игри - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Подготовка за присъединяване: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Списък с всички компании в играта. Можете да се присъедините към някоя или да започнете нова ако има свободно място - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}ИНФОРМАЦИЯ ЗА КОМПАНИЯ -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Име на компания: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Основаване: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Стойност на компанията: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Текущ баланс: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Приход от предходната година: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Представяне: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Превозни средства: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Станции: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Играчи: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Нова компания -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Създаване на нова компания -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Наблюдаване на играта -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Наблюдаване на играта като наблюдател -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Присъединяване към компания -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Помощ за управлението на компанията - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Свързване... @@ -1965,6 +1939,7 @@ STR_NETWORK_COMPANY_LIST_SPECTATE :Наблюда + STR_NETWORK_SERVER :Сървър STR_NETWORK_CLIENT :Клиент STR_NETWORK_SPECTATORS :Наблюдатели diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index 5a4742215f..f032a88a64 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -790,6 +790,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * E STR_STATUSBAR_AUTOSAVE :{RED}DESADA AUTOMÀTICA STR_STATUSBAR_SAVING_GAME :{RED}* * DESANT PARTIDA * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Historial de missatges STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Llista de les notícies més recents @@ -1446,6 +1447,12 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Doble clic STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Un clic (quan té el focus) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Un clic (immediatament) +STR_CONFIG_SETTING_USE_RELAY_SERVICE :Servei de transmissió: {STRING} +STR_CONFIG_SETTING_USE_RELAY_SERVICE_HELPTEXT :Si falla la creació d'una connexió al servidor, es pot usar un servei de transmissió per crear la connexió. «Mai» no permet fer-ho, «Pregunta» permet que l'usuari esculli què fer i «Permet» en permet l'ús sense preguntar-ho. +STR_CONFIG_SETTING_USE_RELAY_SERVICE_NEVER :Mai +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ASK :Pregunta +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ALLOW :Permet + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Emulació del botó dret: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Selecciona el mètode per emular els clics amb el botó dret del ratolí STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command-clic @@ -1798,6 +1805,7 @@ STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :{ORANGE}Indúst STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :{ORANGE}Distribució de la càrrega STR_CONFIG_SETTING_AI :{ORANGE}Competidors STR_CONFIG_SETTING_AI_NPC :{ORANGE}Jugadors IA +STR_CONFIG_SETTING_NETWORK :{ORANGE}Xarxa STR_CONFIG_SETTING_PATHFINDER_NPF :NPF STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Recomanat) @@ -2003,7 +2011,9 @@ STR_FACE_EARRING :Arracades: STR_FACE_TIE_EARRING_TOOLTIP :{BLACK}Canvia la corbata o les arracades ############ Next lines match ServerGameType +STR_NETWORK_SERVER_VISIBILITY_LOCAL :Local STR_NETWORK_SERVER_VISIBILITY_PUBLIC :Pública +STR_NETWORK_SERVER_VISIBILITY_INVITE_ONLY :Només invitació ############ End of leave-in-this-order # Network server list @@ -2038,6 +2048,7 @@ STR_NETWORK_SERVER_LIST_SERVER_VERSION :{SILVER}Versió STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}Adreça del servidor: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}Data inicial: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}Data actual: {WHITE}{DATE_SHORT} +STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}Script de partida: {WHITE}{STRING} (v{NUM}) STR_NETWORK_SERVER_LIST_PASSWORD :{SILVER}Protegit per contrasenya! STR_NETWORK_SERVER_LIST_SERVER_OFFLINE :{SILVER}SERVIDOR DESCONNECTAT STR_NETWORK_SERVER_LIST_SERVER_FULL :{SILVER}SERVIDOR PLÉ @@ -2053,11 +2064,12 @@ STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET_TOOLTIP :{BLACK}Cerca se STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN :{BLACK}Cerca a la LAN STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN_TOOLTIP :{BLACK}Cerca servidors a la xarxa local STR_NETWORK_SERVER_LIST_ADD_SERVER :{BLACK}Afegeix un servidor -STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Afegeix un servidor a la llista que sempre es comprovarà per buscar partides en marxa +STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Afegeix un servidor a la llista. Es pot afegir l'adreça del servidor o un codi d'invitació. STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Inicia el servidor STR_NETWORK_SERVER_LIST_START_SERVER_TOOLTIP :{BLACK}Inicia en un servidor propi STR_NETWORK_SERVER_LIST_PLAYER_NAME_OSKTITLE :{BLACK}Posa el teu nom +STR_NETWORK_SERVER_LIST_ENTER_SERVER_ADDRESS :{BLACK}Escriviu l'adreça del servidor o el codi d'invitació. # Start new multiplayer server STR_NETWORK_START_SERVER_CAPTION :{WHITE}Inicia una partida multijugador nova @@ -2075,39 +2087,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Tria el STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} companyi{P a es} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Màxim nombre de companyies: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Limita el servidor a un cert nombre de companyies -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} espectador{P "" s} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Màxim nombre d'espectadors: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Limita el servidor a un cert nombre d'espectadors STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Idioma parlat: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Els altres jugadors sabran quin idioma es parla en aquest servidor. STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Posa el nom de la partida en xarxa -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Lobby de partida multijugador - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Preparant per connectar: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Una llista de totes les companyies actuals en aquesta partida. Podeu utilitzar-ne una o bé iniciar-ne una de nova si hi ha algun lloc lliure. - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}INFORMACIÓ DE LA COMPANYIA -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Nom companyia: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Inauguració: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Valor de la companyia: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Balanç actual: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Ingressos del darrer any: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Rendiment: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Vehicles: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Estacions: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Jugadors: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Crea companyia nova -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Obre una nova companyia. -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Espectador -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Veure la partida com a espectador -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Uneix-te a la companyia -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Ajuda a gestionar aquesta companyia - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Connectant... @@ -2144,6 +2128,10 @@ STR_NETWORK_CLIENT_LIST_SERVER_NAME_EDIT_TOOLTIP :{BLACK}Editeu e STR_NETWORK_CLIENT_LIST_SERVER_NAME_QUERY_CAPTION :Nom del servidor STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY :{BLACK}Visibilitat STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY_TOOLTIP :{BLACK}Permet establir si altres persones poden veure el vostre servidor a la llista pública. +STR_NETWORK_CLIENT_LIST_SERVER_INVITE_CODE :{BLACK}Codi d'invitació +STR_NETWORK_CLIENT_LIST_SERVER_INVITE_CODE_TOOLTIP :{BLACK}Codi d'invitació que els altres jugadors poden usar per unir-se a aquest servidor. +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE :{BLACK}Tipus de connexió +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TOOLTIP :{BLACK}Indica com els altres usuaris poden comunicar-se amb el vostre servidor. STR_NETWORK_CLIENT_LIST_PLAYER :{BLACK}Jugador STR_NETWORK_CLIENT_LIST_PLAYER_NAME :{BLACK}Nom STR_NETWORK_CLIENT_LIST_PLAYER_NAME_TOOLTIP :{BLACK}El vostre nom de jugador @@ -2163,6 +2151,11 @@ STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP :{BLACK}Aquest STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT :{BLACK}{NUM} client{P "" s} / {NUM} companyi{P a es} ############ Begin of ConnectionType +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_UNKNOWN :{BLACK}Local +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_ISOLATED :{RED}Els jugadors remots no es poden connectar. +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_DIRECT :{BLACK}Públic +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_STUN :{BLACK}Darrere del NAT +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TURN :{BLACK}Via servei de transmissió ############ End of ConnectionType STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :Treu @@ -2176,6 +2169,12 @@ STR_NETWORK_CLIENT_LIST_ASK_CLIENT_BAN :{YELLOW}Esteu s STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Esteu segur que voleu esborrar la companyia «{COMPANY}»? STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Esteu segur que voleu restablir la contrasenya de la companyia «{COMPANY}»? +STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}Voleu usar un servei de transmissió? +STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}No s'ha pogut establir una connexió entre el servidor i el vostre dispositiu.{}Voleu transmetre aquesta sessió via «{STRING}»? +STR_NETWORK_ASK_RELAY_NO :{BLACK}No +STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Sí, aquest una vegada. +STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Sí, no ho preguntis més. + STR_NETWORK_SERVER :Servidor STR_NETWORK_CLIENT :Client STR_NETWORK_SPECTATORS :Espectadors @@ -2292,6 +2291,9 @@ STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}El servi STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}El servidor està reiniciant...{}Espera un moment... STR_NETWORK_MESSAGE_KICKED :*** S'ha expulsat {STRING}. Motiu: {STRING} +STR_NETWORK_ERROR_COORDINATOR_REGISTRATION_FAILED :{WHITE}El registre al servidor ha fallat. +STR_NETWORK_ERROR_COORDINATOR_ISOLATED :{WHITE}El vostre servidor no permet connexions remotes. +STR_NETWORK_ERROR_COORDINATOR_ISOLATED_DETAIL :{WHITE}Els altres jugadors no podran connectar-se al vostre servidor. # Content downloading window STR_CONTENT_TITLE :{WHITE}Descàrregues de contingut diff --git a/src/lang/chuvash.txt b/src/lang/chuvash.txt index bde2d9a298..37c07fb45c 100644 --- a/src/lang/chuvash.txt +++ b/src/lang/chuvash.txt @@ -445,6 +445,7 @@ STR_STATUSBAR_PAUSED :{YELLOW}* * STR_STATUSBAR_AUTOSAVE :{RED}ХӐЙ УПРАВ STR_STATUSBAR_SAVING_GAME :{RED}* * ВӐЙЙИ УПРАВ * * + # News message history STR_MESSAGE_NEWS_FORMAT :{STRING} - {STRING} @@ -593,6 +594,7 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Симĕс STR_CONFIG_SETTING_LIVERIES_NONE :Ҫук STR_CONFIG_SETTING_SCROLLWHEEL_OFF :Сӳнтер + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Сӳнтер @@ -777,12 +779,6 @@ STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Вырн -# Network game lobby - - - - - # Network connecting window ############ Leave those lines in this order!! @@ -801,6 +797,7 @@ STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Вырн + # Network set password # Network company info join/password diff --git a/src/lang/croatian.txt b/src/lang/croatian.txt index b7d86cc3db..e619d62dbb 100644 --- a/src/lang/croatian.txt +++ b/src/lang/croatian.txt @@ -874,6 +874,7 @@ STR_STATUSBAR_PAUSED :{YELLOW}* * S STR_STATUSBAR_AUTOSAVE :{RED}AUTOMATSKO SPREMANJE STR_STATUSBAR_SAVING_GAME :{RED}* * SPREMAM IGRU * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Povijest poruka STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Popis nedavnih novinskih poruka @@ -1489,6 +1490,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Dvostruki klik STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Jedan klik (kada je usredotočen) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Jedan klik (odmah) + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Emulacija desnog klika mišem: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Odaberi metodu imitiranja klika na desnu tipku miša STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+klik @@ -2086,39 +2088,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Odaberi STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} tvrtk{P a e i} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Najveći broj tvrtki: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Ograniči poslužitelj na određeni broj tvrtki -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} gledatelj{P "" a a} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Najveći broj promatrača: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Ograniči poslužitelj na određeni broj gledatelja STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Jezik kojim se govori: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Drugi igrači znat će kojim se jezikom govori na poslužitelju STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Upišite ime mrežne igre -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Predvorje igre za više igrača - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Pripremanje za pridruživanje: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Popis svih tvrtki trenutno u igri. Možete se pridružiti jednoj ili osnovati novu ako postoji slobodno mjesto - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}PODACI O TVRTKI -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Ime tvrtke: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Ustoličenje: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Vrijednost tvrtke: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Trenutno stanje: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Prošlogodišnji prihod: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Učinkovitost: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Vozila: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Postaje: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Igrači: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Nova tvrtka -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Otvori novu tvrtku -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Gledaj igru -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Promatraj igru kao gledatelj -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Pridruži se tvrtki -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Pomozi upravljati ovom tvrtkom - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Spajanje... @@ -2153,6 +2127,7 @@ STR_NETWORK_COMPANY_LIST_SPECTATE :Promatraj + STR_NETWORK_SERVER :Poslužitelj STR_NETWORK_CLIENT :Klijent STR_NETWORK_SPECTATORS :Promatrači diff --git a/src/lang/czech.txt b/src/lang/czech.txt index 50a7009c13..77f8b3fa54 100644 --- a/src/lang/czech.txt +++ b/src/lang/czech.txt @@ -883,6 +883,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * P STR_STATUSBAR_AUTOSAVE :{RED}Automatické ukládání STR_STATUSBAR_SAVING_GAME :{RED}* * HRA SE UKLÁDÁ * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Historie zpráv STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Seznam předešlých zpráv @@ -1614,6 +1615,7 @@ STR_CONFIG_SETTING_VIEWPORT_MAP_DRAW_ROUTE_DASH :Styl vykreslen STR_CONFIG_SETTING_VIEWPORT_MAP_DRAW_ROUTE_DASH_VALUE :přerušovaná čára široká {COMMA} pixel{P "" y ů} STR_CONFIG_SETTING_VIEWPORT_MAP_DRAW_ROUTE_DASH_DISABLED :plné čáry + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Emulace pravého tlačítka: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Vybrat metodu emulování stisknutí pravého tlačítka myši STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command + kliknutí @@ -2402,39 +2404,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Zvol nej STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} společnost{P "" i í} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Maximální počet společností: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Omezit serverem počet společností -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} pozorovatel{P "" é ů} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Maximální počet pozorovatelů: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Omezit serverem pocet pozorovatelů STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Jazyk ve hře: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Aby ostatní hráči věděli, jakým jazykem se bude ve hře mluvit STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Zadej jméno této síťové hry -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Vstupní místnost do hry více hráčů - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Připravuji se na vstoupení: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Současný seznam všech společností v této hře. Buď můžeš do jedné vstoupit, nebo můžeš založit novou - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}INFO O SPOLEČNOSTI -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Jméno společnosti: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Založeno: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Hodnota společnosti: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Stav na účtu: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Loňský hrubý zisk: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Výkon: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Vozidla: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Stanice: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Hráči: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Nová společnost -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Založit novou společnost -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Navštívit hru -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Připojit se do hry jako pozorovatel -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Vstoupit do společnosti -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Pomoz vést tuto společnost - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Připojování... @@ -2477,6 +2451,7 @@ STR_NETWORK_CLIENT_LIST_CHAT_COMPANY_TOOLTIP :{BLACK}Poslat z STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Jste si jisti, že chcete smazat společnost '{COMPANY}'? + STR_NETWORK_SERVER :Server STR_NETWORK_CLIENT :Klient STR_NETWORK_SPECTATORS :Pozorovatelé diff --git a/src/lang/danish.txt b/src/lang/danish.txt index 90c17c09c8..14a21386c8 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -779,6 +779,7 @@ STR_STATUSBAR_PAUSED :{YELLOW}* * PA STR_STATUSBAR_AUTOSAVE :{RED}AUTOGEM STR_STATUSBAR_SAVING_GAME :{RED}* * GEMMER SPIL * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Beskedhistorik STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}En liste over seneste nyheder @@ -1395,6 +1396,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Dobbelt click STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Enkelt click (når fokuseret) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Enkelt click (umiddelbart) + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Højreklik-emulering: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Vælg metode til at emulere højre muse-knap klik STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Kommandoklik @@ -1996,39 +1998,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Vælg de STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} selskab{P "" er} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Maks. selskaber: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Begræns serveren til et bestemt antal selskaber -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} tilskuer{P "" e} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Maks. tilskuere: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Begræns serveren til et bestemt antal tilskurere STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Talt sprog: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Andre spillere vil vide hvilket sprog, der bliver talt på serveren STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Skriv et navn for netværksspillet -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Netværksspils lobby - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Forbereder tilslutning: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}En liste over alle selskaber i spillet lige nu. Du kan enten tilslutte dig et eller starte et nyt, hvis der er plads til flere selskaber - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}SELSKABSINFO -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Selskabsnavn: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Grundlagt: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Virksomhedens værdi: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Nuværende beholdning: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Sidste års indtægt: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Præstation: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Køretøjer: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Stationer: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Spillere: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Nyt selskab -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Opret et nyt selskab -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Tilskuer -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Tilslut spillet som tilskuer -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Tilslut dig selskab -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Hjælp med at bestyrre dette selskab - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Tilslutter... @@ -2063,6 +2037,7 @@ STR_NETWORK_COMPANY_LIST_SPECTATE :Tilslut som til + STR_NETWORK_SERVER :Server STR_NETWORK_CLIENT :Klient STR_NETWORK_SPECTATORS :Tilskuere diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index 8f12115d1a..4de4a4f5a9 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -789,6 +789,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * GEP STR_STATUSBAR_AUTOSAVE :{RED}AUTOMATISCH OPSLAAN STR_STATUSBAR_SAVING_GAME :{RED}* * SPEL WORDT OPGESLAGEN * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Berichtengeschiedenis STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Een lijst met recente nieuwsberichten @@ -1445,6 +1446,12 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Dubbelklik STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Enkele klik (met focus) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Enkele klik (onmiddelijk) +STR_CONFIG_SETTING_USE_RELAY_SERVICE :Omleiden: {STRING} +STR_CONFIG_SETTING_USE_RELAY_SERVICE_HELPTEXT :Als het niet lukt om verbinding te maken met de server, kun je laten omleiden om een verbinding tot stand te brengen. Met 'Nooit' sta je dit niet toe, met 'Vragen' krijg je eerst navraag, met 'Toestaan' sta je dit toe zonder navraag. +STR_CONFIG_SETTING_USE_RELAY_SERVICE_NEVER :Nooit +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ASK :Vragen +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ALLOW :Toestaan + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Rechtsklikemulatie: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Methode selecteeren voor nabootsen van rechtsklikken STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command-klik @@ -1797,6 +1804,7 @@ STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :{ORANGE}Industr STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :{ORANGE}Vrachtdistributie STR_CONFIG_SETTING_AI :{ORANGE}Tegenstanders STR_CONFIG_SETTING_AI_NPC :{ORANGE}Computerspelers +STR_CONFIG_SETTING_NETWORK :{ORANGE}Netwerk STR_CONFIG_SETTING_PATHFINDER_NPF :NPF STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Aanbevolen) @@ -2078,39 +2086,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Kies het STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} bedr{P ijf ijven} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Maximumaantal bedrijven: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Beperk de server tot een bepaald aantal bedrijven -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} toeschouwer{P "" s} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Maximumaantal toeschouwers: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Beperk de server tot een bepaald aantal toeschouwers STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Gesproken taal: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Andere spelers zullen weten welke taal er wordt gesproken op de server STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Geef de naam van het netwerkspel -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Verzamelkamer voor netwerkspellen - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Klaar om deel te nemen: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Een lijst met alle bedrijven die momenteel in dit spel bestaan. Je kan meedoen met een bestaand bedrijf of een nieuw bedrijf beginnen - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}BEDRIJFSINFORMATIE -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Bedrijfsnaam: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Gestart in: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Bedrijfswaarde: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Huidige kas: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Inkomen vorig jaar: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Prestatie: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Voertuigen: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Stations: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Spelers: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Nieuw bedrijf -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Start een nieuw bedrijf -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Bekijk spel -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Bekijk het spel als een toeschouwer -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Meedoen met dit bedrijf -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Help met het beheren van dit bedrijf - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Verbinden... @@ -2173,6 +2153,8 @@ STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT :{BLACK}{NUM} kl STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_UNKNOWN :{BLACK}Lokaal STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_ISOLATED :{RED}Externe spelers kunnen geen verbinding maken STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_DIRECT :{BLACK}Openbaar +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_STUN :{BLACK}Achter NAT +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TURN :{BLACK}Via omleiden ############ End of ConnectionType STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :Eruit schoppen @@ -2186,6 +2168,12 @@ STR_NETWORK_CLIENT_LIST_ASK_CLIENT_BAN :{YELLOW}Weet je STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Weet je zeker dat je het bedrijf '{COMPANY}' wilt verwijderen? STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Weet je zeker dat je het wachtwoord voor bedrijf '{COMPANY}' wilt terugstellen? +STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}Omleiden? +STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}Kan geen verbinding maken tussen server en jou.{}Wil je deze sessie omleiden via '{STRING}'? +STR_NETWORK_ASK_RELAY_NO :{BLACK}Nee +STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Ja, deze keer +STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Ja, en vraag dit niet opnieuw + STR_NETWORK_SERVER :Server STR_NETWORK_CLIENT :Speler STR_NETWORK_SPECTATORS :Toeschouwers diff --git a/src/lang/english.txt b/src/lang/english.txt index be0e7180a3..a70f07eb46 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -811,6 +811,8 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * P STR_STATUSBAR_AUTOSAVE :{RED}AUTOSAVE STR_STATUSBAR_SAVING_GAME :{RED}* * SAVING GAME * * +STR_STATUSBAR_SPECATOR :{WHITE}(spectator) + # News message history STR_MESSAGE_HISTORY :{WHITE}Message History STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}A list of the recent news messages @@ -1642,6 +1644,12 @@ STR_CONFIG_SETTING_VIEWPORT_MAP_DRAW_ROUTE_DASH :Drawing style o STR_CONFIG_SETTING_VIEWPORT_MAP_DRAW_ROUTE_DASH_VALUE :dashed lines of {COMMA} pixel{P "" s} STR_CONFIG_SETTING_VIEWPORT_MAP_DRAW_ROUTE_DASH_DISABLED :plain lines +STR_CONFIG_SETTING_USE_RELAY_SERVICE :Use relay service: {STRING2} +STR_CONFIG_SETTING_USE_RELAY_SERVICE_HELPTEXT :If creating a connection to the server fails, one can use a relay service to create a connection. "Never" disallows this, "ask" will ask first, "allow" will allow it without asking +STR_CONFIG_SETTING_USE_RELAY_SERVICE_NEVER :Never +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ASK :Ask +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ALLOW :Allow + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Right-click emulation: {STRING2} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Select the method to emulate right mouse-button clicks STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+Click @@ -2150,6 +2158,7 @@ STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST_PER_CARGO_OVERRIDE :{ORANGE}Cargo d STR_CONFIG_SETTING_ENVIRONMENT_TREES :{ORANGE}Trees STR_CONFIG_SETTING_AI :{ORANGE}Competitors STR_CONFIG_SETTING_AI_NPC :{ORANGE}Computer players +STR_CONFIG_SETTING_NETWORK :{ORANGE}Network STR_CONFIG_SETTING_VIEWPORT_MAP_OPTIONS :{ORANGE}Map mode STR_CONFIG_SETTING_SHARING :{ORANGE}Infrastructure sharing STR_CONFIG_SETTING_SCENARIO_EDITOR :{ORANGE}Scenario Editor @@ -2511,39 +2520,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Choose t STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} compan{P y ies} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Maximum number of companies: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Limit the server to a certain amount of companies -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} spectator{P "" s} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Maximum number of spectators: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Limit the server to a certain amount of spectators STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Language spoken: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Other players will know which language is spoken on the server STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Enter a name for the network game -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Multiplayer game lobby - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Preparing to join: {ORANGE}{RAW_STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}A list of all companies currently in this game. You can either join one or start a new one if there is a free company slot - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}COMPANY INFO -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Company name: {WHITE}{RAW_STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Inauguration: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Company value: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Current balance: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Last year's income: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Performance: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Vehicles: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Stations: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Players: {WHITE}{RAW_STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}New company -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Create a new company -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Spectate game -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Watch the game as a spectator -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Join company -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Help manage this company - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Connecting... @@ -2572,7 +2553,7 @@ STR_NETWORK_COMPANY_LIST_CLIENT_LIST :Online players STR_NETWORK_COMPANY_LIST_SPECTATE :Spectate # Network client list -STR_NETWORK_CLIENT_LIST_CAPTION :{WHITE}Multiplayer +STR_NETWORK_CLIENT_LIST_CAPTION :{WHITE}Online Players STR_NETWORK_CLIENT_LIST_SERVER :{BLACK}Server STR_NETWORK_CLIENT_LIST_SERVER_NAME :{BLACK}Name STR_NETWORK_CLIENT_LIST_SERVER_NAME_TOOLTIP :{BLACK}Name of the server you are playing on @@ -2607,6 +2588,7 @@ STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_UNKNOWN :{BLACK}Local STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_ISOLATED :{RED}Remote players can't connect STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_DIRECT :{BLACK}Public STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_STUN :{BLACK}Behind NAT +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TURN :{BLACK}Via relay ############ End of ConnectionType STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :Kick @@ -2620,6 +2602,12 @@ STR_NETWORK_CLIENT_LIST_ASK_CLIENT_BAN :{YELLOW}Are you STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Are you sure you want to delete company '{COMPANY}'? STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Are you sure you want to reset the password of company '{COMPANY}'? +STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}Use relay? +STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}Failed to establish a connection between you and the server.{}Would you like to relay this session via '{RAW_STRING}'? +STR_NETWORK_ASK_RELAY_NO :{BLACK}No +STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Yes, this once +STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Yes, don't ask again + STR_NETWORK_SERVER :Server STR_NETWORK_CLIENT :Client STR_NETWORK_SPECTATORS :Spectators diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index 714bdc72ec..d41f9a9cc7 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -756,6 +756,7 @@ STR_STATUSBAR_PAUSED :{YELLOW}* * P STR_STATUSBAR_AUTOSAVE :{RED}AUTOSAVE STR_STATUSBAR_SAVING_GAME :{RED}* * SAVING GAME * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Message History STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}A list of the recent news messages @@ -1338,6 +1339,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Double click STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Single click (when focussed) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Single click (immediately) + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Right-click emulation: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Select the method to emulate right mouse-button clicks STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+Click @@ -1936,39 +1938,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Choose t STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} compan{P y ies} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Maximum number of companies: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Limit the server to a certain amount of companies -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} spectator{P "" s} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Maximum number of spectators: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Limit the server to a certain amount of spectators STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Language spoken: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Other players will know which language is spoken on the server STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Enter a name for the network game -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Multiplayer game lobby - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Preparing to join: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}A list of all companies currently in this game. You can either join one or start a new one if there is a free company slot - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}COMPANY INFO -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Company name: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Inauguration: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Company value: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Current balance: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Last year's income: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Performance: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Vehicles: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Stations: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Players: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}New company -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Create a new company -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Spectate game -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Watch the game as a spectator -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Join company -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Help manage this company - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Connecting... @@ -2003,6 +1977,7 @@ STR_NETWORK_COMPANY_LIST_SPECTATE :Spectate + STR_NETWORK_SERVER :Server STR_NETWORK_CLIENT :Client STR_NETWORK_SPECTATORS :Spectators diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index 19261e680c..7c1321b67f 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -789,6 +789,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * P STR_STATUSBAR_AUTOSAVE :{RED}AUTOSAVE STR_STATUSBAR_SAVING_GAME :{RED}* * SAVING GAME * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Message History STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}A list of the recent news messages @@ -1447,6 +1448,12 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Double click STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Single click (when focused) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Single click (immediately) +STR_CONFIG_SETTING_USE_RELAY_SERVICE :Use relay service: {STRING} +STR_CONFIG_SETTING_USE_RELAY_SERVICE_HELPTEXT :If creating a connection to the server fails, one can use a relay service to create a connection. "Never" disallows this, "ask" will ask first, "allow" will allow it without asking +STR_CONFIG_SETTING_USE_RELAY_SERVICE_NEVER :Never +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ASK :Ask +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ALLOW :Allow + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Right-click emulation: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Select the method to emulate right mouse-button clicks STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+Click @@ -1821,6 +1828,7 @@ STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :{ORANGE}Industr STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :{ORANGE}Cargo distribution STR_CONFIG_SETTING_AI :{ORANGE}Competitors STR_CONFIG_SETTING_AI_NPC :{ORANGE}Computer players +STR_CONFIG_SETTING_NETWORK :{ORANGE}Network STR_CONFIG_SETTING_PATHFINDER_NPF :NPF STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Recommended) @@ -2028,6 +2036,7 @@ STR_FACE_TIE_EARRING_TOOLTIP :{BLACK}Change t ############ Next lines match ServerGameType STR_NETWORK_SERVER_VISIBILITY_LOCAL :Local STR_NETWORK_SERVER_VISIBILITY_PUBLIC :Public +STR_NETWORK_SERVER_VISIBILITY_INVITE_ONLY :Invite only ############ End of leave-in-this-order # Network server list @@ -2062,6 +2071,7 @@ STR_NETWORK_SERVER_LIST_SERVER_VERSION :{SILVER}Server STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}Server address: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}Start date: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}Current date: {WHITE}{DATE_SHORT} +STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}Game Script: {WHITE}{STRING} (v{NUM}) STR_NETWORK_SERVER_LIST_PASSWORD :{SILVER}Password protected! STR_NETWORK_SERVER_LIST_SERVER_OFFLINE :{SILVER}SERVER OFFLINE STR_NETWORK_SERVER_LIST_SERVER_FULL :{SILVER}SERVER FULL @@ -2100,39 +2110,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Choose t STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} compan{P y ies} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Maximum number of companies: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Limit the server to a certain number of companies -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} spectator{P "" s} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Maximum number of spectators: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Limit the server to a certain number of spectators STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Language spoken: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Other players will know which language is spoken on the server STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Enter a name for the network game -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Multiplayer game lobby - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Preparing to join: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}A list of all companies currently in this game. You can either join one or start a new one if there is a free company slot - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}COMPANY INFO -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Company name: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Inauguration: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Company value: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Current balance: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Last year's income: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Performance: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Vehicles: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Stations: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Players: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}New company -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Create a new company -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Spectate game -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Watch the game as a spectator -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Join company -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Help manage this company - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Connecting... @@ -2194,6 +2176,8 @@ STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT :{BLACK}{NUM} cl STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_UNKNOWN :{BLACK}Local STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_ISOLATED :{RED}Remote players can't connect STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_DIRECT :{BLACK}Public +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_STUN :{BLACK}Behind NAT +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TURN :{BLACK}Via relay ############ End of ConnectionType STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :Kick @@ -2208,6 +2192,12 @@ STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Are you STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Are you sure you want to reset the password of company '{COMPANY}'? STR_NETWORK_COMPANY_LIST_SPECTATE :Spectate +STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}Use relay? +STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}Failed to establish a connection between you and the server.{}Would you like to relay this session via '{STRING}'? +STR_NETWORK_ASK_RELAY_NO :{BLACK}No +STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Yes, this once +STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Yes, don't ask again + STR_NETWORK_SERVER :Server STR_NETWORK_CLIENT :Client STR_NETWORK_SPECTATORS :Spectators diff --git a/src/lang/esperanto.txt b/src/lang/esperanto.txt index dc81871be3..3a95ea2672 100644 --- a/src/lang/esperanto.txt +++ b/src/lang/esperanto.txt @@ -755,6 +755,7 @@ STR_STATUSBAR_PAUSED :{YELLOW}* * PA STR_STATUSBAR_AUTOSAVE :{RED}AŬTOMATA KONSERVADO STR_STATUSBAR_SAVING_GAME :{RED}* * KONSERVAS LUDON * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Mesaĝa historio STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Listo da aktualaj novaĵoj @@ -1212,6 +1213,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Duobla klako STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Unuobla klako (kiam enfokusigita) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Unuobla klako (tuj) + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Imitado de dekstra klako: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Komando+Klako STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+Klako @@ -1596,39 +1598,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Elektu k STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} kompanio{P "" j} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Kompania maksimumo: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Limu la servilon al certa kvanto da kompanioj -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} spektanto{P "" j} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Maksimumo spektanta: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Limigu la servilon al certa kvanto da spektantoj STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Parolata lingvo: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Aliaj ludantoj scios kiu lingvo paroliĝas en la servilo STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Tajpu nomon por la retludo -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Atendejo por plurludantaj ludoj - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Preparanta por aliĝi: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Listo da kompanioj haveblaj en ĉi tiu ludo. Vi povas aliĝi al unu aŭ komenci novan kompanion se restas loko - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}KOMPANIAJ INFORMOJ -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Kompaninomo: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Inaŭguro: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Kompanivaloro: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Nuna monstato: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Lastjara enspezo: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Rendimento: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Veturiloj: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Stacioj: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Ludantoj: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Nova kompanio -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Kreu novan kompanion -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Spektu ludon -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Spektu la ludon kiel spektanto -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Aliĝu al kompanio -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Helpu manaĝi ĉi tiun kompanion - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Konektante... @@ -1663,6 +1637,7 @@ STR_NETWORK_COMPANY_LIST_SPECTATE :Spekti + STR_NETWORK_SERVER :Servilo STR_NETWORK_CLIENT :Kliento STR_NETWORK_SPECTATORS :Spektantoj diff --git a/src/lang/estonian.txt b/src/lang/estonian.txt index 98a24c3d34..bb0f38f701 100644 --- a/src/lang/estonian.txt +++ b/src/lang/estonian.txt @@ -846,6 +846,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * S STR_STATUSBAR_AUTOSAVE :{RED}VÄLPSALVESTUS STR_STATUSBAR_SAVING_GAME :{RED}* * MÄNGU SALVESTAMINE * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Sõnumite ajalugu STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Nimekiri hiljutistest uudistest @@ -1493,6 +1494,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Topeltklõpsuga STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Ühe klõpsuga (kui on fookuses) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Ühe klõpsuga (koheselt) + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Paremklõpsu matkimine: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Vali meetod mille järgi emuleeritakse hiite paremklõpse STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+klõps @@ -2105,6 +2107,7 @@ STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Tee serv STR_NETWORK_SERVER_LIST_START_SERVER_TOOLTIP :{BLACK}Tee oma server STR_NETWORK_SERVER_LIST_PLAYER_NAME_OSKTITLE :{BLACK}Sisesta enda nimi +STR_NETWORK_SERVER_LIST_ENTER_SERVER_ADDRESS :{BLACK}Sisesta serveri aadress või kutse kood # Start new multiplayer server STR_NETWORK_START_SERVER_CAPTION :{WHITE}Mitmikmängu alustamine @@ -2123,39 +2126,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Määrab STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} ettevõte{P "" t} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Ettevõtteid kuni: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Piirab serveris olevate ettevõtete arvu -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} vaatleja{P "" t} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Vaatlejaid kuni: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Piirab serveris olevate vaatlejate arvu STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Suhtluskeel: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Teavitab teisi mängijaid, mis keeles serveris rääkida STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Sisesta mitmikmängu nimi -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Mitmikmängu jututuba - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Liitumiseks valmistumine: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Nimekiri mängus oelvatest ettevõtetest. Saad liituda ühega või alustada uut, kui on vabu kohti - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}ETTEVÕTTE ANDMED -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Ettevõtte nimi: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Avamine: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Firmaväärtus: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Rahaline seis: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Eelmise aasta tulud: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Suutlikus: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Sõidukid: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Jaamad: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Mängijad: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Uus ettevõte -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Uue ettevõtte loomine -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Jälgi mängu -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Ole mängu vaatleja -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Liitu ettevõttega -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Aita seda ettevõtet töös hoida - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Ühendumine... @@ -2223,6 +2198,7 @@ STR_NETWORK_CLIENT_LIST_ASK_CLIENT_BAN :{YELLOW}Kas ole STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Kas oled kindel, et tahad kustutada ettevõtte '{COMPANY}'? STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Kas oled kindel, et soovid nullida ettevõtte '{COMPANY}' salasõna? + STR_NETWORK_SERVER :Server STR_NETWORK_CLIENT :Klient STR_NETWORK_SPECTATORS :Vaatlejad diff --git a/src/lang/faroese.txt b/src/lang/faroese.txt index 44ac0f4698..ef2adc906f 100644 --- a/src/lang/faroese.txt +++ b/src/lang/faroese.txt @@ -738,6 +738,7 @@ STR_STATUSBAR_PAUSED :{YELLOW}* * S STR_STATUSBAR_AUTOSAVE :{RED}SJÁLVGOYMSLA STR_STATUSBAR_SAVING_GAME :{RED}* * GOYMUR SPÆL * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Boðs søga STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Yvirlit yvir fesk tíðinda boð @@ -1294,6 +1295,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Dupult trýst STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Einkult trýst (tá savna) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Einkult trýst (alt fyri eitt) + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Høgra-trýst eftirgerð: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Vel háttin at eftirgerða trýst á høgra músa knøtt STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+trýst @@ -1762,39 +1764,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Vel mest STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} fyritøk{P a ur} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Mest loyvdar fyritøkur: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Avmarka nøgdina av fyritøkum á servaranum -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} eygleiðar{P i ar} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Mest loyvdir eygjleiðarar: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Avmarka nøgdina av eygleiðarum á servaranum STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Tungumál: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Aðrir spælarir kunnu síggja hvat mál verður tosa á servaranum STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Gev netverks spælinum eitt navn -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Hópspæls forhøll - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Fyrireikar samband við: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Listi yvir allar fyritøkur í hesum spælinum júst nú. Tú kann antin taka lut í einari, ella stovna eina nyggja um ta er pláss - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}KUNNING UM FYRITØKU -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Navn á fyritøku: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Stovnað: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Virði á fyritøku: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Peningur á bók júst nú: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Inntøka síðsta ár: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Avrik: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Flutningstól: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Støðir: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Spælarir: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Nýggja fyritøku -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Stovnað eina nýggja fyritøku -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Eygleið spæl -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Hygg eftir spælinum sum eygleiðari -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Tak lut í fyritøku -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Hjálp við at leiða hesa fyritøkuna - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Fær samband... @@ -1829,6 +1803,7 @@ STR_NETWORK_COMPANY_LIST_SPECTATE :Eygleið + STR_NETWORK_SERVER :Servari STR_NETWORK_CLIENT :Klient STR_NETWORK_SPECTATORS :Eygleiðarar diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index 7eccc125ea..049000c464 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -789,6 +789,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * T STR_STATUSBAR_AUTOSAVE :{RED}AUTOMAATTITALLENNUS STR_STATUSBAR_SAVING_GAME :{RED}* * TALLENNETAAN PELIÄ * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Viestihistoria STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Lista viimeisimmistä uutisviesteistä @@ -1445,6 +1446,12 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Kaksoisnapsautu STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Yksi napsautus (kun kohdistettuna) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Yksi napsautus (välitön) +STR_CONFIG_SETTING_USE_RELAY_SERVICE :Käytä välityspalvelua: {STRING} +STR_CONFIG_SETTING_USE_RELAY_SERVICE_HELPTEXT :Jos yhteyden muodostaminen palvelimeen epäonnistuu, yhteys voidaan muodostaa välityspalvelun kautta. ”Ei koskaan” estää tämän, ”kysy” kysyy ensin, ”salli” sallii kysymättä. +STR_CONFIG_SETTING_USE_RELAY_SERVICE_NEVER :Ei koskaan +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ASK :Kysy +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ALLOW :Salli + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Oikean painikkeen emulointi: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Valitse, miten hiiren oikean painikkeen painalluksia emuloidaan STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Komento+napsautus @@ -1797,6 +1804,7 @@ STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :{ORANGE}Laitoks STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :{ORANGE}Rahdin jakautuminen STR_CONFIG_SETTING_AI :{ORANGE}Kilpailijat STR_CONFIG_SETTING_AI_NPC :{ORANGE}Tietokonepelaajat +STR_CONFIG_SETTING_NETWORK :{ORANGE}Verkko STR_CONFIG_SETTING_PATHFINDER_NPF :NPF STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Suositeltu) @@ -2039,6 +2047,7 @@ STR_NETWORK_SERVER_LIST_SERVER_VERSION :{SILVER}Palveli STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}Palvelimen osoite: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}Aloitusvuosi: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}Päivämäärä: {WHITE}{DATE_SHORT} +STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}Peliskripti: {WHITE}{STRING} (v.{NBSP}{NUM}) STR_NETWORK_SERVER_LIST_PASSWORD :{SILVER}Salasanasuojattu! STR_NETWORK_SERVER_LIST_SERVER_OFFLINE :{SILVER}PALVELIN KIINNI STR_NETWORK_SERVER_LIST_SERVER_FULL :{SILVER}PALVELIN TÄYNNÄ @@ -2077,39 +2086,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Pelaajie STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} yhtiö{P "" tä} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Yhtiöiden enimmäismäärä: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Rajoita yhtiöiden määrää palvelimella -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} katsoja{P "" a} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Katsojien enimmäismäärä: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Rajoita katsojien määrää palvelimella STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Puhuttu kieli: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Toiset pelaajat tietävät tästä, mitä kieltä palvelimella puhutaan STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Syötä nimi verkkopelille -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Moninpeliaula - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Valmistautuu yhdistämään: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Lista pelissä olevista yhtiöistä. Voit joko liittyä yhteen tai perustaa omasi - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}YHTIÖN TIEDOT -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Yhtiön nimi: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Perustettu: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Yhtiön arvo: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Nykyinen kate: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Viime vuoden tulot: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Suorite: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Kulkuneuvot: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Asemat: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Pelaajat: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Uusi yhtiö -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Perusta uusi yhtiö -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Seuraa peliä -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Seuraa pelin kulkua -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Liity yhtiöön -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Auta tämän yhtiön hallinnassa - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Yhdistetään... @@ -2172,6 +2153,8 @@ STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT :{BLACK}{NUM} pe STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_UNKNOWN :{BLACK}Paikallinen STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_ISOLATED :{RED}Etäpelaajat eivät voi ottaa yhteyttä STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_DIRECT :{BLACK}Julkinen +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_STUN :{BLACK}NATin takana +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TURN :{BLACK}Välityspalvelimen kautta ############ End of ConnectionType STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :Potki @@ -2185,6 +2168,12 @@ STR_NETWORK_CLIENT_LIST_ASK_CLIENT_BAN :{YELLOW}Haluatk STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Haluatko varmasti poistaa yhtiön ”{COMPANY}”? STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Haluatko varmasti nollata yhtiön ”{COMPANY}” salasanan? +STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}Käytetäänkö välityspalvelua? +STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}Yhteyden muodostaminen sinun ja palvelimen välillä epäonnistui.{}Haluatko, että tämä istunto välitetään välityspalvelimen ”{STRING}” kautta? +STR_NETWORK_ASK_RELAY_NO :{BLACK}Ei +STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Kyllä, tämän kerran +STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Kyllä, älä kysy uudestaan + STR_NETWORK_SERVER :Palvelin STR_NETWORK_CLIENT :Pelaaja STR_NETWORK_SPECTATORS :Katsojat diff --git a/src/lang/french.txt b/src/lang/french.txt index 924dcbd7fd..f08f0f2b54 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -790,6 +790,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * S STR_STATUSBAR_AUTOSAVE :{RED}ENREGISTREMENT AUTOMATIQUE STR_STATUSBAR_SAVING_GAME :{RED}* * SAUVEGARDE EN COURS * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Historique des messages STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Liste des messages récents @@ -1446,6 +1447,12 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Double clic STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Simple clic (avec le focus) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Simple clic (immédiatement) +STR_CONFIG_SETTING_USE_RELAY_SERVICE :Utiliser un service relai{NBSP}: {STRING} +STR_CONFIG_SETTING_USE_RELAY_SERVICE_HELPTEXT :Si la création d'une connexion vers le serveur échoue, il est possible d'utiliser un service relai pour créer une connexion. "Jamais" refusera cela, "demander" demandera d'abord, "autoriser" l'autorisera sans demander +STR_CONFIG_SETTING_USE_RELAY_SERVICE_NEVER :Jamais +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ASK :Demander +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ALLOW :Autoriser + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Émulation du clic droit{NBSP}: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Choisir la méthode pour émuler les clics du bouton droit de la souris STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Commande-clic @@ -1798,6 +1805,7 @@ STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :{ORANGE}Industr STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :{ORANGE}Distribution des marchandises STR_CONFIG_SETTING_AI :{ORANGE}Compétiteurs STR_CONFIG_SETTING_AI_NPC :{ORANGE}Intelligence artificielle +STR_CONFIG_SETTING_NETWORK :{ORANGE}Réseau STR_CONFIG_SETTING_PATHFINDER_NPF :NPF STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(recommandé) @@ -2003,7 +2011,9 @@ STR_FACE_EARRING :Boucle d'oreill STR_FACE_TIE_EARRING_TOOLTIP :{BLACK}Modifier la cravate ou la boucle d'oreille ############ Next lines match ServerGameType +STR_NETWORK_SERVER_VISIBILITY_LOCAL :Local STR_NETWORK_SERVER_VISIBILITY_PUBLIC :Public +STR_NETWORK_SERVER_VISIBILITY_INVITE_ONLY :Invitation uniquement ############ End of leave-in-this-order # Network server list @@ -2038,6 +2048,7 @@ STR_NETWORK_SERVER_LIST_SERVER_VERSION :{SILVER}Version STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}Adresse du serveur{NBSP}: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}Date de début{NBSP}: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}Date courante{NBSP}: {WHITE}{DATE_SHORT} +STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}Script de jeu{NBSP}: {WHITE}{STRING} (v{NUM}) STR_NETWORK_SERVER_LIST_PASSWORD :{SILVER}Protégée par mot de passe{NBSP}! STR_NETWORK_SERVER_LIST_SERVER_OFFLINE :{SILVER}SERVEUR HORS-LIGNE STR_NETWORK_SERVER_LIST_SERVER_FULL :{SILVER}SERVEUR PLEIN @@ -2053,11 +2064,12 @@ STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET_TOOLTIP :{BLACK}Recherch STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN :{BLACK}Recherche LAN STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN_TOOLTIP :{BLACK}Rechercher des serveurs sur le réseau local STR_NETWORK_SERVER_LIST_ADD_SERVER :{BLACK}Ajouter un serveur -STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Ajouter un serveur à la liste de ceux parmi lesquels des parties en cours seront toujours cherchées +STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Ajouter un serveur à la liste. Ce peut être soit une adresse de serveur, soit un code d'invitation STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Héberger/créer un serveur de jeu STR_NETWORK_SERVER_LIST_START_SERVER_TOOLTIP :{BLACK}Démarrer son propre serveur, sur cet ordinateur-ci STR_NETWORK_SERVER_LIST_PLAYER_NAME_OSKTITLE :{BLACK}Entrer votre nom +STR_NETWORK_SERVER_LIST_ENTER_SERVER_ADDRESS :{BLACK}Entrer l'adresse du serveur, ou le code d'invitation # Start new multiplayer server STR_NETWORK_START_SERVER_CAPTION :{WHITE}Commencer une nouvelle partie @@ -2075,39 +2087,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Choisir STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} compagnie{P "" s} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Nombre de compagnies maximum{NBSP}: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Limiter le serveur à un certain nombre de compagnies -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} spectateur{P "" s} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Nombre de spectateurs maximum{NBSP}: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Limiter le serveur à un certain nombre de spectateurs STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Langue utilisée{NBSP}: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Les autres joueurs sauront quelle langue est parlée sur ce serveur STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Entrer un nom pour la partie en réseau -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Préparation de la partie - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Se prépare à rejoindre{NBSP}: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Liste des compagnies présentes dans le jeu. Vous pouvez soit en rejoindre une, soit en créer une si il reste un emplacement libre. - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}INFOS SUR LA COMPAGNIE -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Nom de la compagnie{NBSP}: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Inauguration{NBSP}: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Valeur de la compagnie{NBSP}: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Argent courant{NBSP}: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Revenus de l'année dernière{NBSP}: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Performance{NBSP}: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Véhicules{NBSP}: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Stations{NBSP}: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Joueurs{NBSP}: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Nouvelle compagnie -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Créer une nouvelle compagnie -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Observer la partie -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Observer une partie en tant que spectateur -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Rejoindre la compagnie -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Aider à gérer cette compagnie - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Connexion en cours... @@ -2144,6 +2128,10 @@ STR_NETWORK_CLIENT_LIST_SERVER_NAME_EDIT_TOOLTIP :{BLACK}Éditer STR_NETWORK_CLIENT_LIST_SERVER_NAME_QUERY_CAPTION :Nom du serveur STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY :{BLACK}Visibilité STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY_TOOLTIP :{BLACK}Possibilité pour les autres personnes de voir votre serveur dans la liste publique +STR_NETWORK_CLIENT_LIST_SERVER_INVITE_CODE :{BLACK}Code d'invitation +STR_NETWORK_CLIENT_LIST_SERVER_INVITE_CODE_TOOLTIP :{BLACK}Code d'invitation que les autres joueurs peuvent utiliser pour rejoindre ce serveur +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE :{BLACK}Type de connexion +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TOOLTIP :{BLACK}Si et comment votre serveur peut être vu par les autres STR_NETWORK_CLIENT_LIST_PLAYER :{BLACK}Joueur STR_NETWORK_CLIENT_LIST_PLAYER_NAME :{BLACK}Nom STR_NETWORK_CLIENT_LIST_PLAYER_NAME_TOOLTIP :{BLACK}Votre nom de jeu @@ -2160,8 +2148,14 @@ STR_NETWORK_CLIENT_LIST_NEW_COMPANY :(Nouvelle compa STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP :{BLACK}Créer une nouvelle compagnie et la rejoindre STR_NETWORK_CLIENT_LIST_PLAYER_ICON_SELF_TOOLTIP :{BLACK}C'est vous STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP :{BLACK}C'est l'hôte du jeu +STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT :{BLACK}{NUM} client{P "" s} / {NUM} compagnie{P "" s} ############ Begin of ConnectionType +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_UNKNOWN :{BLACK}Local +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_ISOLATED :{RED}Les joueurs distants ne peuvent pas se connecter +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_DIRECT :{BLACK}Public +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_STUN :{BLACK}Derrière un NAT +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TURN :{BLACK}Via relai ############ End of ConnectionType STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :Exclure @@ -2175,6 +2169,12 @@ STR_NETWORK_CLIENT_LIST_ASK_CLIENT_BAN :{YELLOW}Êtes-v STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Êtes-vous sûr de vouloir supprimer la compagnie '{COMPANY}'{NBSP}? STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Êtes-vous sûr de vouloir réinitialiser le mot de passe de la compagnie '{COMPANY}'? +STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}Utiliser un relai{NBSP}? +STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}Aucune connexion n'a pu être établie entre vous et le serveur.{}Voudriez vous relayer cette session via '{STRING}'{NBSP}? +STR_NETWORK_ASK_RELAY_NO :{BLACK}Non +STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Oui, cette fois uniquement +STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Oui, ne plus me demander + STR_NETWORK_SERVER :Serveur STR_NETWORK_CLIENT :Client STR_NETWORK_SPECTATORS :Spectateurs @@ -2291,6 +2291,9 @@ STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}Le serve STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Le serveur redémarre...{}Veuillez patienter... STR_NETWORK_MESSAGE_KICKED :*** {STRING} a été exclu. Raison{NBSP}: ({STRING}) +STR_NETWORK_ERROR_COORDINATOR_REGISTRATION_FAILED :{WHITE}Échec de l'enregistrement du serveur +STR_NETWORK_ERROR_COORDINATOR_ISOLATED :{WHITE}Votre serveur n'autorise pas les connexions distantes +STR_NETWORK_ERROR_COORDINATOR_ISOLATED_DETAIL :{WHITE}Les autres joueurs ne pourront pas se connecter à votre serveur # Content downloading window STR_CONTENT_TITLE :{WHITE}Téléchargement de modules diff --git a/src/lang/frisian.txt b/src/lang/frisian.txt index aaa0db4dd9..17658b3128 100644 --- a/src/lang/frisian.txt +++ b/src/lang/frisian.txt @@ -765,6 +765,7 @@ STR_STATUSBAR_PAUSED :{YELLOW}* * SK STR_STATUSBAR_AUTOSAVE :{RED}Automatysk bewarje STR_STATUSBAR_SAVING_GAME :{RED}* * SLAAT SPUL OP * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Berjochtenskiednis STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}In list fan resinte nijsberjochten @@ -1347,6 +1348,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Dûbel klikken STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Inkele klik (ûnder fokus) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Inkele klik (direktst) + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Rjochtsklikemulaasje: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Selektearje de metoade dy't brûkt wurdt om rjochts-klikken mûlk te meitsjen STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Kommando+Klik @@ -1847,31 +1849,10 @@ STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} kl STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Maksimaal oantal kliïnten: STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} bedriuw{P "" en} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Maksimaal tal bedriuwen: -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} taskôger{P "" s} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Maksimaal tal taskôgers: STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Sprutsen taal: STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Fier in namme yn foar it networkspul -# Network game lobby - - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}BEDRIUWSYNFORMAASJE -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Bedriuwsnamme: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Bedriuwswearde: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Prestaasje: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Auto's: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Stasjons: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Spilers: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Nei Bedriuw -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Nei bedriuw oprjochtsje -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Spul taskôgje -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Spul besjen as taskôger -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Meidwaan mei dit bedriuw -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Help dit bedriuw bestjoeren - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Ferbyning meitsje... @@ -1905,6 +1886,7 @@ STR_NETWORK_COMPANY_LIST_SPECTATE :{WHITE}Taskôgj + STR_NETWORK_SERVER :Tsjinner STR_NETWORK_CLIENT :Kliïnt STR_NETWORK_SPECTATORS :Taskôgers diff --git a/src/lang/gaelic.txt b/src/lang/gaelic.txt index acd7aa818f..9c6fceff7b 100644 --- a/src/lang/gaelic.txt +++ b/src/lang/gaelic.txt @@ -970,6 +970,7 @@ STR_STATUSBAR_PAUSED :{YELLOW}* * N STR_STATUSBAR_AUTOSAVE :{RED}FÈIN-SHÀBHALADH STR_STATUSBAR_SAVING_GAME :{RED}* * A' SÀBHALADH GEAMA * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Eachdraidh nam brath STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Liosta nam brath-naidheachd o chionn ghoirid @@ -1563,6 +1564,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Briogadh dùbai STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Aon bhriogadh (le fòcas) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Aon bhriogadh (sa bhad) + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Riochdachadh a' bhriogaidh dheis: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Tagh an dòigh sa thèid briogadh le putan deas na luchaige a riochdachadh STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+Briogadh @@ -2147,39 +2149,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Tagh an STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} {P chompanaidh chompanaidh companaidhean companaidh} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Companaidhean air a char as motha: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Cuingich am frithealaiche gu àireamh shònraichte dhe chompanaidhean -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} {P amharcaiche amharcaiche amharcaichean amharcaiche} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Amharcaichean air a char as motha: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Cuingich co mheud duine a dh'fhaodas sealltainn air geamannan air an fhrithealaiche STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Cànan a tha ga bhruidhinn: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Bidh fios aig cluicheadairean eile dè an cànan a tha ga bruidhinn air an fhrithealaiche STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Cuir a-steach ainm airson a' gheama lìonraidh -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Lobaidh nan geamannan ioma-chluicheadair - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Ag ullachadh gus gabhail ann: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Liosta dhen a h-uile companaidh a tha sa gheama an-dràsta. ’S urrainn dhut gabhail ann an tè no tè ùr a stèidheachadh ma tha slot companaidh saor ri làimh - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}FIOSRACHADH A' CHOMPANAIDH -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Ainm na companaidh: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Stèidheachadh: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Luach a' chompanaidh: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Balans an-dràsta: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Teachd a-steach an-uiridh: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Dèanadas: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Carbadan: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Stèiseanan: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Cluicheadairean: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Companaidh ùr -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Cruthaich companaidh ùr -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Coimhead air geama -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Coimhead air a' gheama mar amharcaiche -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Gabh sa chompanaidh -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Cuidich le stiùireadh na companaidh seo - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}A' ceangal ... @@ -2214,6 +2188,7 @@ STR_NETWORK_COMPANY_LIST_SPECTATE :Coimhead air + STR_NETWORK_SERVER :Frithealaiche STR_NETWORK_CLIENT :Cliant STR_NETWORK_SPECTATORS :Amharcaichean diff --git a/src/lang/galician.txt b/src/lang/galician.txt index 9588319129..c2fe7929a3 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -779,6 +779,7 @@ STR_STATUSBAR_PAUSED :{YELLOW}* * EN STR_STATUSBAR_AUTOSAVE :{RED}AUTOGRAVADO STR_STATUSBAR_SAVING_GAME :{RED}* * GRAVANDO PARTIDA * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Historial de mensaxes STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Unha lista das mensaxes e novas recentes @@ -1390,6 +1391,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Dobre clic STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Clic sinxelo (centrado) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Clic sinxelo (inmediatamente) + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Emulación do botón dereito: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Selecciona o método para emular clics co botón dereito do rato STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Tecla Command+Clic @@ -1983,39 +1985,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Escolle STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} compañía{P "" s} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Número máx. de compañías: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Limita-lo servidor a unha certa cantidade de compañías -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} espectador{P "" es} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Número máx. de espectadores: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Limita-lo servidor a unha certa cantidade de espectadores STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Idioma falado: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Outros xogadores saberán cal é o idioma que se fala no servidor STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Escribe un nome para a partida en rede -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Sala de espera de partida multixogador - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Preparando para unirse: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Unha lista de tódalas compañías nesta patida. Podes unirte a unha ou empezar unha nova se hai algún lugar libre - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}INFORMACIÓN DA COMPAÑÍA -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Nome da compañía: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Inauguración: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Valor da compañía: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Balance actual: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Ingresos do ano pasado: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Rendemento: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Vehículos: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Estacións: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Xogadores: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Nova compañía -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Crear unha nova compañía -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Observar partida -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Observa-la partida coma espectador -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Unirse a unha compañía -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Axudar a dirixir esta compañía - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Conectando... @@ -2050,6 +2024,7 @@ STR_NETWORK_COMPANY_LIST_SPECTATE :Observar + STR_NETWORK_SERVER :Servidor STR_NETWORK_CLIENT :Cliente STR_NETWORK_SPECTATORS :Espectadores diff --git a/src/lang/german.txt b/src/lang/german.txt index 29e5a2109e..3eebbdd164 100644 --- a/src/lang/german.txt +++ b/src/lang/german.txt @@ -805,6 +805,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * P STR_STATUSBAR_AUTOSAVE :{RED}Autosicherung STR_STATUSBAR_SAVING_GAME :{RED}* * SPEICHERE SPIEL * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Nachrichtenchronik STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Eine Liste der aktuellen Nachrichten @@ -1563,6 +1564,12 @@ STR_CONFIG_SETTING_VIEWPORT_MAP_DRAW_ROUTE_DASH :Zeichenstil der STR_CONFIG_SETTING_VIEWPORT_MAP_DRAW_ROUTE_DASH_VALUE :gestrichelte Linie von {COMMA} Pixel{P "" n} Länge STR_CONFIG_SETTING_VIEWPORT_MAP_DRAW_ROUTE_DASH_DISABLED :durchgezogene Linie +STR_CONFIG_SETTING_USE_RELAY_SERVICE :Weiterleitungsdienst benutzen: {STRING} +STR_CONFIG_SETTING_USE_RELAY_SERVICE_HELPTEXT :Falls eine Verbindung mit dem Server fehlschlägt, kann man einen Weiterleitungsdienst benutzen, um eine Verbindung herzustellen. „Nie“ verbietet dies, „fragen“ wird zuerst fragen, „erlauben“ wird es ohne Nachfrage erlauben. +STR_CONFIG_SETTING_USE_RELAY_SERVICE_NEVER :Nie +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ASK :Fragen +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ALLOW :Erlauben + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Rechtsklick-Emulation: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Lege die Methode, die rechte Maustaste zu emulieren, fest STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Befehlstaste+Klick @@ -2031,6 +2038,7 @@ STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST_PER_CARGO_OVERRIDE :{ORANGE}Warenve STR_CONFIG_SETTING_ENVIRONMENT_TREES :{ORANGE}Bäume STR_CONFIG_SETTING_AI :{ORANGE}Mitbewerber STR_CONFIG_SETTING_AI_NPC :{ORANGE}Computerspieler +STR_CONFIG_SETTING_NETWORK :{ORANGE}Netzwerk STR_CONFIG_SETTING_VIEWPORT_MAP_OPTIONS :{ORANGE}Zusätzliche Kartenansicht STR_CONFIG_SETTING_SHARING :{ORANGE}Infrastruktur-Sharing STR_CONFIG_SETTING_SCENARIO_EDITOR :{ORANGE}Szenarieneditor @@ -2315,6 +2323,7 @@ STR_FACE_TIE_EARRING_TOOLTIP :{BLACK}Krawatte ############ Next lines match ServerGameType STR_NETWORK_SERVER_VISIBILITY_LOCAL :Lokal STR_NETWORK_SERVER_VISIBILITY_PUBLIC :Öffentlich +STR_NETWORK_SERVER_VISIBILITY_INVITE_ONLY :Nur Einladung ############ End of leave-in-this-order # Network server list @@ -2349,6 +2358,7 @@ STR_NETWORK_SERVER_LIST_SERVER_VERSION :{SILVER}Serverv STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}Serveradresse: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}Startdatum: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}Aktuelles Datum: {WHITE}{DATE_SHORT} +STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}Spielskript: {WHITE}{STRING} (v{NUM}) STR_NETWORK_SERVER_LIST_PASSWORD :{SILVER}Passwortgeschützt! STR_NETWORK_SERVER_LIST_SERVER_OFFLINE :{SILVER}SERVER OFFLINE STR_NETWORK_SERVER_LIST_SERVER_FULL :{SILVER}SERVER VOLL @@ -2387,39 +2397,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Auswahl STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} Firm{P a en} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Maximale Firmenanzahl: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Begrenzt den Server auf eine bestimmte Anzahl an Firmen -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} Zuschauer -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Maximale Zuschaueranzahl: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Begrenzt den Server auf eine gewisse Anzahl an Zuschauern STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Gesprochene Sprache: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Damit andere Spieler wissen, welche Sprache auf diesem Server gesprochen wird STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Namen für das Netzwerkspiel eingeben -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Mehrspielerlobby - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Spieleintritt vorbereiten: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Eine Liste aller Firmen, die sich im Spiel befinden. Man kann einer Firma beitreten oder eine eigene Firma gründen, sofern ein Platz frei ist - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}Firmenprofil -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Firmenname: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Gründung: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Firmenwert: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Kontostand: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Einkommen (letzes Jahr): {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Leistung: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Fahrzeuge: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Stationen: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Spieler: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Neue Firma -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Eine neue Firma gründen -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Beim Spiel zusehen -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Als Zuschauer dem Spiel zusehen -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Firma beitreten -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Beim Verwalten der ausgewählten Firma helfen - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Verbinden... @@ -2482,6 +2464,8 @@ STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT :{BLACK}{NUM} Cl STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_UNKNOWN :{BLACK}Lokal STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_ISOLATED :{RED}Nicht-lokale Spieler können sich nicht verbinden STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_DIRECT :{BLACK}Öffentlich +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_STUN :{BLACK}Hinter NAT +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TURN :{BLACK}Via Umleitung ############ End of ConnectionType STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :Hinauswerfen @@ -2495,6 +2479,12 @@ STR_NETWORK_CLIENT_LIST_ASK_CLIENT_BAN :{YELLOW}Sind Si STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Sind Sie sicher, dass Sie die Firma '{COMPANY}' löschen möchten? STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Sind Sie sicher, dass Sie das Passwort der Firma '{COMPANY}' zurücksetzen möchten? +STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}Weiterleitung benutzen? +STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}Verbindung zwischen Ihnen und dem Server konnte nicht hergestellt werden.{}Möchten Sie für diese Sitzung eine Weiterleitung via „{STRING}” benutzen? +STR_NETWORK_ASK_RELAY_NO :{BLACK}Nein +STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Ja, diesmal +STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Ja, nicht erneut fragen + STR_NETWORK_SERVER :Server STR_NETWORK_CLIENT :Teilnehmer STR_NETWORK_SPECTATORS :Zuschauer diff --git a/src/lang/greek.txt b/src/lang/greek.txt index da5405e5e2..c702699950 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -890,6 +890,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}** ΠΑ STR_STATUSBAR_AUTOSAVE :{RED}ΑΥΤΟΜΑΤΗ ΑΠΟΘΗΚΕΥΣΗ STR_STATUSBAR_SAVING_GAME :{RED}* * ΑΠΟΘΗΚΕΥΣΗ ΠΑΙΧΝΙΔΙΟΥ * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Ιστορικό Μηνυμάτων STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Λίστα των πρόσφατων μηνυμάτων ειδήσεων @@ -1503,6 +1504,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Με διπλό STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Με απλό κλικ (όταν είναι επικεντρωμένο) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Με απλό κλικ (άμεσα) + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Εξομοίωση δεξιού κλικ {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Επιλέξτε τον τρόπο μίμησης των πατημάτων του δεξιού κουμπιού του ποντικιού STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+Κλικ @@ -2104,39 +2106,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Επιλ STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} εταιρεί{P α ες} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Μέγιστος αριθμός εταιριών: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Περιορισμός του διακομιστή σε συγκεκριμένο αριθμό εταιρειών -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} θεατ{P ής ές} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Μέγιστος αριθμός θεατών: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Περιορισμός του διακομιστή σε συγκεκριμένο αριθμό θεατών STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Ομιλούμενη γλώσσα: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Οι υπόλοιποι παίκτες θα γνωρίζουν ποια γλώσσα ομιλείται στον διακομιστή STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Εισάγετε το όνομα του δικτυακού παιχνιδιού -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Αίθουσα παιχνιδιού για πολλούς παίκτες - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Προετοιμασία για συμμετοχή: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Λίστα όλων των εταιρειών αυτήν τη στιγμή στο παιχνίδι. Μπορείτε είτε να συμμετάσχετε σε μία ή να δημιουργήσετε μια νέα αν υπάρχει κενή θέση - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}ΠΛΗΡΟΦΟΡΙΕΣ ΕΤΑΙΡΕΙΑΣ -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Όνομα εταιρείας: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Ίδρυση: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Αξία εταιρείας: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Τρέχων ισοζύγιο: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Έσοδα τελευταίας χρονιάς: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Απόδοση: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Οχήματα: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Σταθμοί: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Παίκτες: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Νέα εταιρεία -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Δημιουργία νέας εταιρείας -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Παρακολούθηση παιχνιδιού -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Δείτε το παιχνίδι ως θεατής -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Συμμετοχή σε εταιρεία -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Βοηθήστε στη διαχείριση αυτής της εταιρείας - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Σύνδεση... @@ -2171,6 +2145,7 @@ STR_NETWORK_COMPANY_LIST_SPECTATE :Παρακολ + STR_NETWORK_SERVER :Διακομιστής STR_NETWORK_CLIENT :Πελάτης STR_NETWORK_SPECTATORS :Θεατές diff --git a/src/lang/hebrew.txt b/src/lang/hebrew.txt index c7823466d8..2455f07c64 100644 --- a/src/lang/hebrew.txt +++ b/src/lang/hebrew.txt @@ -783,6 +783,7 @@ STR_STATUSBAR_PAUSED :{YELLOW}* * ה STR_STATUSBAR_AUTOSAVE :{RED}שמירה אוטומטית STR_STATUSBAR_SAVING_GAME :{RED}* * שומר משחק * * + # News message history STR_MESSAGE_HISTORY :{WHITE}היסטוריית ההודעות STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}רשימת ההודעות האחרונות @@ -1378,6 +1379,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :קליק כפו STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :קליק יחיד (כאשר בפוקוס) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :קליק יחיד (מיד) + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :{STRING} :הדמיית כפתור ימני בעכבר STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :בחר בשיטה לדימוי קליקים בכפתור העכבר הימני STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command-click @@ -1961,39 +1963,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK} :מספ STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} חבר{P "ה" "ות"} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}מספר מקסימלי של חברות: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}הגבל את השרת למספר מסויים של חברות -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} צופ{P "ה" "ים"} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}מספר צופים מירבי: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}הגבלת השרת למספר צופים מסויים STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}שפת דיבור: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}שחקנים אחרים ידעו איו שפה מדוברת בשרת STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}הזן שם למשחק רשת -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}לובי של משחק רשת - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{ORANGE}{STRING} {BLACK} :מתכונן להצטרף אל -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}רשימת החברות המשתתפות במשחק. ניתן להצטרף לחברה קיימת או ליצור חברה חדשה במידה וקיים מקום פנוי - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}פרטי חברה -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}שם החברה: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{WHITE}{NUM}{SILVER} :שנת הקמה -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}ערך החברה: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{WHITE}{CURRENCY_LONG}{SILVER} :מאזן נוכחי -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{WHITE}{CURRENCY_LONG}{SILVER} :הכנסות בשנה האחרונה -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{WHITE}{NUM}{SILVER} :מדד הביצועים - -STR_NETWORK_GAME_LOBBY_VEHICLES :{WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} {SILVER} :כלי תעבורה -STR_NETWORK_GAME_LOBBY_STATIONS :{WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} {SILVER} :תחנות -STR_NETWORK_GAME_LOBBY_PLAYERS :{WHITE}{STRING} {SILVER} :שחקנים - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}חברה חדשה -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}יצירת חברה חדשה -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}צפה במשחק -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}הצטרף למשחק כצופה -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}הצטרף לחברה -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}הצטרף להנהלת חברה זו - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}מתחבר... @@ -2028,6 +2002,7 @@ STR_NETWORK_COMPANY_LIST_SPECTATE :צפה + STR_NETWORK_SERVER :שרת STR_NETWORK_CLIENT :לקוח STR_NETWORK_SPECTATORS :צופים diff --git a/src/lang/hindi.txt b/src/lang/hindi.txt index cd76a92a69..679bd2bb00 100644 --- a/src/lang/hindi.txt +++ b/src/lang/hindi.txt @@ -220,6 +220,7 @@ STR_SMALLMAP_TOWN :{TINY_FONT}{WHI # Status bar messages STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * ठहरा हुआ (संपर्क चित्र अद्यतन के लिये प्रतीक्षारत) * * + # News message history STR_NEWS_CUSTOM_ITEM :{BIG_FONT}{BLACK}{STRING} @@ -343,6 +344,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DISABLED :अक्षम + STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_ZERO :सीमाहीन (आपके कंप्यूटर द्वारा सीमित) STR_CONFIG_SETTING_SOUND_NEWS :समाचार पत्र: {STRING} @@ -430,13 +432,6 @@ STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}सर -# Network game lobby - - -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}उद्घाटन: {WHITE}{NUM} - - - # Network connecting window ############ Leave those lines in this order!! @@ -455,6 +450,7 @@ STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}उद + # Network set password # Network company info join/password diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index 0a42512de8..a4c05c9089 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -853,6 +853,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * S STR_STATUSBAR_AUTOSAVE :{RED}Automatikus mentés STR_STATUSBAR_SAVING_GAME :{RED}* * JÁTÉK MENTÉSE * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Előző üzenetek STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Az előző hírüzenetek listája @@ -1500,6 +1501,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Dupla kattintá STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Egyszeres kattintás (amikor előtérben van) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Egyszeres kattintás (azonnal) + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Jobb egérgomb emuláció: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Jobb egérgomb emulálási módszerének kiválasztása STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Parancs+Kattintás @@ -2129,39 +2131,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}A maxim STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} vállalat STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Max. vállalatszám: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}A vállalatok maximális száma a szerveren -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} megfigyelő -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Max. megfigyelő: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}A megfigyelők maximális száma a szerveren STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Beszélt nyelv: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}A többi játékos megtudhatja milyen nyelven beszélnek a szerveren STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Add meg a hálózati játékhoz a neved -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Hálózati játék előszoba - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Készülődés a kapcsolódáshoz: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Egy lista az összes vállalatról aki játékban van. Alapíthatsz újat, beléphetsz egybe, vagy csak nézheted őket megfigyelőként - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}VÁLLALAT INFÓ -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}A vállalat neve: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Beiktatás: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}A vállalat értéke: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Jelenlegi összeg: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Előző évi bevétel: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Teljesítmény: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Járművek: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Állomások: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Játékosok: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Új vállalat -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Új vállalatot alapít -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Játék megvizsgálása -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Megtekinted a játékot mint megfigyelő -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Belépés a vállalatba -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Segítesz a vállalatirányításban - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Kapcsolódás... @@ -2229,6 +2203,7 @@ STR_NETWORK_CLIENT_LIST_ASK_CLIENT_BAN :{YELLOW}Biztos STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Biztos ki akarod törölni a '{COMPANY}' vállalatot? STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Biztos vissza akarod állítani a '{COMPANY}' vállalat jelszavát? + STR_NETWORK_SERVER :Szerver STR_NETWORK_CLIENT :Kliens STR_NETWORK_SPECTATORS :Megfigyelők diff --git a/src/lang/icelandic.txt b/src/lang/icelandic.txt index 0b03306ffa..3aff929564 100644 --- a/src/lang/icelandic.txt +++ b/src/lang/icelandic.txt @@ -737,6 +737,7 @@ STR_STATUSBAR_PAUSED :{YELLOW}* * ST STR_STATUSBAR_AUTOSAVE :{RED}SJÁLFVIRK VISTUN STR_STATUSBAR_SAVING_GAME :{RED}* * VISTA LEIK * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Saga skilaboða STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Listi yfir nýlegar fréttir @@ -1293,6 +1294,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Tvísmella STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Ýta einusinni (þegar valið) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Ýta einusinni (birtist strax) + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Hægrismellshermun: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Veldu hvernig herma á eftir hægri smelli á músinni STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+smella @@ -1800,39 +1802,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Veldu h STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} Fyrirtæki STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Hámarksfjöldi fyrirtækja: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Takmarka fjölda fyrirtækja á vefþjóni -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} áhorf{P andi endur} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Hámarksfjöldi áhorfanda: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Takmarka fjölda áhorfanda á vefþjóninum STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Tungumál: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Aðrir notendur munu vita hvaða tungumál er talað á þjóninum STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Sláðu inn nafn netleiksins -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Anddyri fjölspilunarleiks - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Undirbý tengingu við: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Listi yfir öll fyrirtæki í leiknum. Þú getur annað hvort gengið í lið með einu eða komið á fót nýju ef pláss er fyrir nýtt - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}UPPLÝSINGAR UM FYRIRTÆKI -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Nafn fyrirtækis: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Upphaf: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Verðmæti fyrirtækis: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Núverandi staða: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Innkoma síðasta árs: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Frammistaða: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Farartæki: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Stöðvar: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Leikmenn: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Nýtt fyrirtæki -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Koma á fót nýju fyrirtæki -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Fylgjast með leik -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Fylgjast með leiknum sem áhorfandi -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Ganga í lið með fyrirtæki -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Hjálpa við stjórnun þessa fyrirtækis - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Tengist... @@ -1867,6 +1841,7 @@ STR_NETWORK_COMPANY_LIST_SPECTATE :Fylgjast með + STR_NETWORK_SERVER :Þjónn STR_NETWORK_CLIENT :Notandi STR_NETWORK_SPECTATORS :Áhorfendur diff --git a/src/lang/ido.txt b/src/lang/ido.txt index 60536c6939..a6b851a925 100644 --- a/src/lang/ido.txt +++ b/src/lang/ido.txt @@ -434,6 +434,7 @@ STR_SMALLMAP_SHOW_HEIGHT :{BLACK}Montras # Status bar messages STR_STATUSBAR_COMPANY_NAME :{SILVER}- - {COMPANY} - - + # News message history STR_NEWS_MESSAGE_CAPTION :{WHITE}Sendajo @@ -573,6 +574,7 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Violkolora + # Config errors @@ -625,12 +627,6 @@ STR_NETWORK_SERVER_LIST_MAP_SIZE_SHORT :{BLACK}{COMMA}x -# Network game lobby - - - - - # Network connecting window ############ Leave those lines in this order!! @@ -649,6 +645,7 @@ STR_NETWORK_SERVER_LIST_MAP_SIZE_SHORT :{BLACK}{COMMA}x + # Network set password # Network company info join/password diff --git a/src/lang/indonesian.txt b/src/lang/indonesian.txt index 799a693d82..5be60a998a 100644 --- a/src/lang/indonesian.txt +++ b/src/lang/indonesian.txt @@ -789,6 +789,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * PAU STR_STATUSBAR_AUTOSAVE :{RED}SIMPAN OTOMATIS STR_STATUSBAR_SAVING_GAME :{RED}* * MENYIMPAN PERMAINAN * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Pesan Lampau STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Daftar pesan berita-berita yang ada @@ -1436,6 +1437,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Klik ganda STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Klik sekali (saat tersorot) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Klik sekali (langsung) + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Emulasikan klik kanan: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Pilih metode untuk meng-emulasi klik kanan mouse STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Perintah-klik @@ -2065,39 +2067,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Pilih ju STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} Perusahaan STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Maksimum jumlah perusahaan: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Batasi jumlah perusahaan pada server -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} Penonton -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Maksimum jumlah penonton: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Batasi jumlah penonton pada server STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Bahasa pembicaraan: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Agar pemain lain mengetahui bahasa apa yang digunakan pada sever STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Masukkan nama dari permainan di jaringan -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Lobi Bermain bersama - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Persiapan bergabung: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Daftar perusahaan yang ada dalam sesi permainan ini. Anda bisa bergabung dengan salah satu perusahaan, atau membuat perusahaan baru bila masih ada ruang tersisa. - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}INFO PERUSAHAAN -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Nama Perusahaan: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Dilantik: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Nilai perusahaan: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Neraca saat ini: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Pendapatan tahun terakhir: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Performa: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Kendaraan: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Stasiun: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Para pemain: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Perusahaan baru -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Ciptakan satu perusahaan baru -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Nonton permainan -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Menonton permainan sebagai penonton -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Bergabung dengan perusahaan -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Membantu untuk mengatur perusahaan ini - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Menghubungkan... @@ -2165,6 +2139,7 @@ STR_NETWORK_CLIENT_LIST_ASK_CLIENT_BAN :{YELLOW}Apakah STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Anda yakin ingin menghapus perusahaan '{COMPANY}'? STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Anda yakin ingin menyetel ulang sandi perusahaan '{COMPANY}'? + STR_NETWORK_SERVER :Server STR_NETWORK_CLIENT :Klien STR_NETWORK_SPECTATORS :Penonton diff --git a/src/lang/irish.txt b/src/lang/irish.txt index a23c96e4cf..f95a2e5617 100644 --- a/src/lang/irish.txt +++ b/src/lang/irish.txt @@ -765,6 +765,7 @@ STR_STATUSBAR_PAUSED :{YELLOW}* * A STR_STATUSBAR_AUTOSAVE :{RED}UATHSHÁBHÁIL STR_STATUSBAR_SAVING_GAME :{RED}* * CLUICHE Á SHÁBHÁIL * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Stair na dteachtaireachtaí STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Liosta de gach teachtaireacht nuachta le déanaí @@ -1355,6 +1356,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Cliceáil dhúb STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Cliceáil amháin (agus fócas aige) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Cliceáil amháin (láithreach) + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Aithris deaschliceála: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Roghnaigh an modh a úsáidfear chun athris a dhéanamh ar dheaschliceáil an chnaipe luchóige STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Ordú+Cliceáil @@ -1935,39 +1937,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Roghnaig STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} {P ch ch ch gc c}uideachta STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Uaslíon na gcuideachtaí: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Déan an freastalaí a theorannú go líon áirithe cuideachtaí -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} féachadóir{P "" í í í í} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Uaslíon na bhféachóirí: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Déan an freastalaí a theorannú go líon áirithe féachadóirí STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}An teanga a labhraítear: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Beidh a fhios ag imreoirí eile cén teanga a labhraítear ar an bhfreastalaí STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Iontráil ainm don chluiche líonra -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Forsheomra cluichí ilimreoirí - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Ag ullmhú le dul isteach: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Liosta de gach cuideachta sa chluiche seo faoi láthair. Is féidir leat dul isteach i gceann acu nó cuideachta nua a thosú má tá spás saor do chuideachta - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}FAISNÉIS CUIDEACHTA -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Ainm na cuideachta: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Tús gnó: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Luach na cuideachta: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Iarmhéid reatha: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Ioncam na bliana seo caite: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Feidhmíocht: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Feithiclí: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Stáisiúin: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Imreoirí: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Cuideachta nua -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Cruthaigh cuideachta na -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Féach ar chluiche -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Breathnaigh ar an gcluiche mar fhéachadóir -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Téigh isteach sa chuideachta -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Cabhraigh leis an gcuideachta seo a bhainistiú - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Ag nascadh... @@ -2002,6 +1976,7 @@ STR_NETWORK_COMPANY_LIST_SPECTATE :Féach air + STR_NETWORK_SERVER :Freastalaí STR_NETWORK_CLIENT :Cliant STR_NETWORK_SPECTATORS :Féachadóirí diff --git a/src/lang/italian.txt b/src/lang/italian.txt index 3c949654c5..4973d46ec0 100644 --- a/src/lang/italian.txt +++ b/src/lang/italian.txt @@ -791,6 +791,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * I STR_STATUSBAR_AUTOSAVE :{RED}SALVATAGGIO AUTOMATICO STR_STATUSBAR_SAVING_GAME :{RED}* * SALVATAGGIO PARTITA * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Cronologia messaggi STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Elenco delle notizie recenti @@ -1450,6 +1451,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Doppio clic STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Clic (con casella di testo attiva) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Clic (immediato) + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Emulazione clic destro: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Seleziona il metodo per emulare i clic con il tasto destro del mouse STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :COMANDO+clic @@ -2077,39 +2079,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Imposta STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} compagni{P a e} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Limite compagnie: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Limita il server a un certo numero di compagnie -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} spettator{P e i} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Limite spettatori: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Limita il server a un certo numero di spettatori STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Lingua parlata: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Fa sapere agli altri giocatori quale lingua è parlata sul server STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Inserire il nome della partita -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Stanza principale partita multigiocatore - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Preparazione all'ingresso in: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Elenco di tutte le compagnie attualmente nella partita. È possibile unirsi ad una di esse o fondarne una nuova se è disponibile un posto - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}INFORMAZIONI COMPAGNIA -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Nome compagnia: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Inaugurazione: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Valore compagnia: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Saldo corrente: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Ricavi anno scorso: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Prestazioni: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Veicoli: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Stazioni: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Giocatori: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Nuova compagnia -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Crea una nuova compagnia -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Assisti alla partita -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Osserva la partita come spettatore -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Usa compagnia -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Aiuta a controllare questa compagnia - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Connessione... @@ -2145,6 +2119,7 @@ STR_NETWORK_COMPANY_LIST_SPECTATE :Diventa spettat STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Sei sicuro di voler eliminare la compagnia '{COMPANY}'? + STR_NETWORK_SERVER :Server STR_NETWORK_CLIENT :Client STR_NETWORK_SPECTATORS :Spettatori diff --git a/src/lang/japanese.txt b/src/lang/japanese.txt index 5f640287df..d25ae8e9c7 100644 --- a/src/lang/japanese.txt +++ b/src/lang/japanese.txt @@ -789,6 +789,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * STR_STATUSBAR_AUTOSAVE :{RED}オートセーブ STR_STATUSBAR_SAVING_GAME :{RED}* * ゲームセーブ中 * * + # News message history STR_MESSAGE_HISTORY :{WHITE}メッセージ履歴 STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}最新のニュース/メッセージのリストです @@ -1437,6 +1438,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :ダブルクリ STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :クリック(フォーカス後) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :クリック(即時) + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :右クリックのエミュレーション: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :右クリックをエミュレートする方法を指定します STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :コマンド+クリック (Mac) @@ -2070,39 +2072,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}接続 STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}会社数: {NUM} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}最大会社数: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}このサーバーでの最大会社数を指定します -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}観覧者数: {NUM} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}最高観覧者数: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}このサーバーでの最大観覧者数を指定します STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}言語: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}このサーバーで使われる主言語を表示します STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}ネットワークゲーム名を入力 -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}マルチプレイヤーゲーム ロビー - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{ORANGE}{STRING}{BLACK}への参加準備 -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}このゲームに現在参加している会社のリストです。ゲームに参加する場合、既にある会社の経営に参画するか、新規開業(空きスロットがある場合)するかのいずれかになります - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}会社情報 -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}会社名: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}開業日: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}企業価値: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}預金残高: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}昨年の損益: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}会社格付: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}輸送機器数: {WHITE}{NUM} {TRAIN}、{NUM} {LORRY}、{NUM} {BUS}、{NUM} {SHIP}、{NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}停留施設数: {WHITE}{NUM} {TRAIN}、{NUM} {LORRY}、{NUM} {BUS}、{NUM} {SHIP}、{NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}プレイヤー数: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}新規会社 -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}新しく会社を設立します -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}ゲームを観覧 -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}観覧者としてゲームを観戦します -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}経営に参画 -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}この交通会社の経営に参画します - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}接続中… @@ -2170,6 +2144,7 @@ STR_NETWORK_CLIENT_LIST_ASK_CLIENT_BAN :{YELLOW}プレ STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}会社 '{COMPANY}' を削除してもよろしいですか? STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}会社 '{COMPANY}'のパスワードをリセットしてもよろしいですか? + STR_NETWORK_SERVER :サーバー STR_NETWORK_CLIENT :クライアント STR_NETWORK_SPECTATORS :観覧者 diff --git a/src/lang/korean.txt b/src/lang/korean.txt index d144bde217..e7cbea59d8 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -811,6 +811,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * STR_STATUSBAR_AUTOSAVE :{RED}자동 저장 STR_STATUSBAR_SAVING_GAME :{RED}* * 게임 저장 중 * * + # News message history STR_MESSAGE_HISTORY :{WHITE}메시지 기록 STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}최근 뉴스 메시지의 기록입니다 @@ -1642,6 +1643,12 @@ STR_CONFIG_SETTING_VIEWPORT_MAP_DRAW_ROUTE_DASH :차량 경로 STR_CONFIG_SETTING_VIEWPORT_MAP_DRAW_ROUTE_DASH_VALUE :{COMMA} 픽셀 간격의 점선 STR_CONFIG_SETTING_VIEWPORT_MAP_DRAW_ROUTE_DASH_DISABLED :실선 +STR_CONFIG_SETTING_USE_RELAY_SERVICE :중계 서비스 이용: {STRING} +STR_CONFIG_SETTING_USE_RELAY_SERVICE_HELPTEXT :서버 연결에 실패할 경우, 중계 서비스를 이용하여 연결을 시도할 수 있습니다. "사용 안 함"으로 설정하면 이 중계 서비스를 사용하지 않고, "물어보기"는 처음에 물어보고 사용하며, "이용"은 물어보지 않고 중계 서비스를 사용합니다. +STR_CONFIG_SETTING_USE_RELAY_SERVICE_NEVER :사용 안 함 +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ASK :물어보기 +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ALLOW :사용 + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :오른쪽 클릭 매크로: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :오른쪽 마우스 버튼 클릭을 대신할 방법을 선택합니다. STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :커맨드 + 클릭 @@ -2150,6 +2157,7 @@ STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST_PER_CARGO_OVERRIDE :{ORANGE}화물 STR_CONFIG_SETTING_ENVIRONMENT_TREES :{ORANGE}나무 STR_CONFIG_SETTING_AI :{ORANGE}경쟁자 STR_CONFIG_SETTING_AI_NPC :{ORANGE}컴퓨터 플레이어 +STR_CONFIG_SETTING_NETWORK :{ORANGE}네트워크 STR_CONFIG_SETTING_VIEWPORT_MAP_OPTIONS :{ORANGE}지도 모드 STR_CONFIG_SETTING_SHARING :{ORANGE}시설 공유 STR_CONFIG_SETTING_SCENARIO_EDITOR :{ORANGE}시나리오 에디터 @@ -2472,6 +2480,7 @@ STR_NETWORK_SERVER_LIST_SERVER_VERSION :{SILVER}서버 STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}서버 주소: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}시작 날짜: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}현재 날짜: {WHITE}{DATE_SHORT} +STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}게임 스크립트: {WHITE}{STRING} (v{NUM}) STR_NETWORK_SERVER_LIST_PASSWORD :{SILVER}비밀번호가 걸려있습니다! STR_NETWORK_SERVER_LIST_SERVER_OFFLINE :{SILVER}서버 오프라인 STR_NETWORK_SERVER_LIST_SERVER_FULL :{SILVER}서버가 꽉 참 @@ -2510,39 +2519,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}최대 STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM}개 STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}최대 회사수: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}서버의 회사의 수를 제한합니다 -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM}명 -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}최대 관전자수: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}게임을 관전하는 접속자의 수를 제한합니다 STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}대화 언어: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}서버에서 주로 사용하는 언어를 고르십시오 STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}네트워크 게임에서 사용할 이름을 입력하세요 -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}멀티플레이 게임 대기실 - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}참가 준비중: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}이 게임에 있는 회사의 목록입니다. 다른 회사에 같이 참여하거나, 빈 자리가 있을 경우 새로운 회사를 세워서 시작할 수 있습니다 - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}회사 정보 -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}회사 이름: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}설립: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}회사가치: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}재정 수익: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}작년 수익: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}성취도: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}차량: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}역: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}플레이어: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}새 회사 -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}새 회사를 만듭니다 -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}게임 관전 -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}게임에 참여하지 않고 보기만 합니다 -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}회사 참여 -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}이 회사를 도와 플레이합니다 - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}접속중... @@ -2605,6 +2586,8 @@ STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT :{BLACK}접속 STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_UNKNOWN :{BLACK}로컬 STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_ISOLATED :{RED}다른 플레이어가 접속할 수 없게 됩니다 STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_DIRECT :{BLACK}공개 +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_STUN :{BLACK}공유기 우회 +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TURN :{BLACK}중계 이용 ############ End of ConnectionType STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :추방 @@ -2618,6 +2601,12 @@ STR_NETWORK_CLIENT_LIST_ASK_CLIENT_BAN :{YELLOW}'{STRIN STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}'{COMPANY}' 회사를 정말로 삭제하시겠습니까? STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}'{COMPANY}' 회사의 비밀번호를 정말로 초기화하시겠습니까? +STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}중계를 이용할까요? +STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}서버와 연결을 수립하는 데 실패했습니다.{} '{0:STRING}'{G 0 "을" "를"} 통해 연결을 중계하시겠습니까? +STR_NETWORK_ASK_RELAY_NO :{BLACK}아니요 +STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}이번에만 사용 +STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}항상 사용 + STR_NETWORK_SERVER :서버 STR_NETWORK_CLIENT :접속자 STR_NETWORK_SPECTATORS :관전자 diff --git a/src/lang/latin.txt b/src/lang/latin.txt index 62df86890a..b7f496b1e6 100644 --- a/src/lang/latin.txt +++ b/src/lang/latin.txt @@ -960,6 +960,7 @@ STR_STATUSBAR_PAUSED :{YELLOW}* * I STR_STATUSBAR_AUTOSAVE :{RED}AUTOSERVANS STR_STATUSBAR_SAVING_GAME :{RED}* * LUDUM SERVANS * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Historia Nuntiorum STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Index nuntiorum recentium @@ -1566,6 +1567,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Bis premendo STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Semel premendo (dum conspicua est) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Semel premendo (statim) + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Aemulatio dextrum premendi: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Eligere modum aemulationis dextrum globulum muris premendi STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Cmd+Premere @@ -2154,39 +2156,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Eligere STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} societa{P s tes} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Societates maximae: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Eligere numerum maximum societatum -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} spectator{P "" es} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Spectatores maximi: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Eligere numerum maximum spectatorum STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Lingua adhibita: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Lingua in servatro adhibita STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Inscribe nomen ludi retis -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Atrium Plurium Lusorum - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Parans ad iungendum: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Index societatum in hoc ludo. Potes iungere aut novam incipere si locus vacuus adest - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}INDICIA SOCIETATIS -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Nomen societatis: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Initium: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Aestimatio societatis: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Pecunia currens: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Reditus anni prioris: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Effectus: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Vehicula: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Stationes: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Lusores: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Societas Nova -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Creare societatem novam -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Ludum spectare -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Aspicere ludum sicut spectator -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Societatem iungere -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Administrare hanc societatem - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Coniungens... @@ -2221,6 +2195,7 @@ STR_NETWORK_COMPANY_LIST_SPECTATE :Spectare + STR_NETWORK_SERVER :Servatrum STR_NETWORK_CLIENT :Cliens STR_NETWORK_SPECTATORS :Spectatores diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt index a4576f5c14..34a0627153 100644 --- a/src/lang/latvian.txt +++ b/src/lang/latvian.txt @@ -65,13 +65,13 @@ STR_CARGO_SINGULAR_PASSENGER :Pasažieris STR_CARGO_SINGULAR_COAL :Ogles STR_CARGO_SINGULAR_MAIL :Pasts STR_CARGO_SINGULAR_OIL :Nafta -STR_CARGO_SINGULAR_LIVESTOCK :Mājlopi +STR_CARGO_SINGULAR_LIVESTOCK :Mājlops STR_CARGO_SINGULAR_GOODS :Preces STR_CARGO_SINGULAR_GRAIN :Graudi STR_CARGO_SINGULAR_WOOD :Koksne STR_CARGO_SINGULAR_IRON_ORE :Dzelzsrūda STR_CARGO_SINGULAR_STEEL :Tērauds -STR_CARGO_SINGULAR_VALUABLES :Vērtslietas +STR_CARGO_SINGULAR_VALUABLES :Vērtslieta STR_CARGO_SINGULAR_COPPER_ORE :Vara rūda STR_CARGO_SINGULAR_MAIZE :Kukurūza STR_CARGO_SINGULAR_FRUIT :Augļi @@ -89,7 +89,7 @@ STR_CARGO_SINGULAR_COLA :Kola STR_CARGO_SINGULAR_CANDYFLOSS :Cukurvate STR_CARGO_SINGULAR_BUBBLE :Burbuļi STR_CARGO_SINGULAR_TOFFEE :Īriss -STR_CARGO_SINGULAR_BATTERY :Baterijas +STR_CARGO_SINGULAR_BATTERY :Baterija STR_CARGO_SINGULAR_PLASTIC :Plastmasa STR_CARGO_SINGULAR_FIZZY_DRINK :Limonāde @@ -791,6 +791,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE} * * PA STR_STATUSBAR_AUTOSAVE :{RED}AUTOMĀTISKĀ SAGLABĀŠANA STR_STATUSBAR_SAVING_GAME :{RED}* * SPĒLE TIEK SAGLABĀTA * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Ziņojumu vēsture STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Neseno ziņojumu saraksts @@ -956,7 +957,7 @@ STR_GAME_OPTIONS_CURRENCY_MYR :Malaizijas Ring STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Brauc pa kreiso pusi STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Brauc pa labo pusi -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Pilsētu nosaukumi +STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Pilsētu nosaukumi: STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Pilsētu nosaukumu stila izvēle ############ start of townname region @@ -980,7 +981,7 @@ STR_GAME_OPTIONS_TOWN_NAME_SWISS :Šveiciešu STR_GAME_OPTIONS_TOWN_NAME_DANISH :Dāņu STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turku STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Itāļu -STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Kataloņu +STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Katalāņu ############ end of townname region STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Automātiskā saglabāšana @@ -1410,6 +1411,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :dubultklikšķi STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :viens klikšķis (kad fokusēta) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :viens klikšķis (nekavējoties) + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Labā klikšķa emulēšana: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Izvēlēties peles labās pogas klikšķu emulēšanas paņēmienu STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Komanda+klikšķis @@ -1851,7 +1853,7 @@ STR_ABANDON_SCENARIO_QUERY :{YELLOW}Vai tie # Cheat window STR_CHEATS :{WHITE}Blēdības STR_CHEATS_TOOLTIP :{BLACK}Atzīmētās rūtiņas norāda uz to, vai esat jau izmantojis šo blēdību -STR_CHEATS_NOTE :{BLACK}Piezīme: Šo iestatījumu lietojumus tiks ierakstīs arī savegame +STR_CHEATS_NOTE :{BLACK}Piezīme: Šo iestatījumu lietojums tiks ierakstīs arī spēles saglabājumā STR_CHEAT_MONEY :{LTBLUE}Palielināt naudas līdzekļus par {CURRENCY_LONG} STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Spēlēt kā uzņēmumam: {ORANGE}{COMMA} STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Burvju buldozers (nojauc ražotnes, nepārvietojamus objektus): {ORANGE}{STRING} @@ -2031,39 +2033,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Izvēlē STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} uzņēmum{P s i u} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Maksimālais uzņēmumu skaits: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Ierobežo serveri noteiktam uzņēmumu skaitam -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} novērotāj{P s i u} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Maksimālais novērotāju skaits: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Ierobežo serveri noteiktam novērotāju skaitam STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Valoda, kurā runā: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Citi lietotāji zinās, kurā valodā tiek runāts uz servera STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Ievadīt tīkla spēles nosaukumu -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Vairākspēlētāju spēles vestibils - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Gatavojos pievienoties: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Spēlē esošo uzņēmumu saraksts. Jūs varat vai nu kādam pievienoties, vai arī sākt jaunu, ja ir brīvs uzņēmuma slots - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}UZŅĒMUMA INFORMĀCIJA -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Uzņēmuma nosaukums: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Atklāšana: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Uzņēmuma vērtība: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Šībrīža bilance: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Ienākumi pērn: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Veiktspēja: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Satiksmes līdzekļi: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Stacijas: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Spēlētāji: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Jauns uzņēmums -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Izveidot jaunu uzņēmumu -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Novērot spēli -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Skatīties spēli kā novērotājam -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Pievienoties uzņēmumam -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Palīdzēt vadīt šo uzņēmumu - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Savienojas... @@ -2098,6 +2072,7 @@ STR_NETWORK_COMPANY_LIST_SPECTATE :Skatīt + STR_NETWORK_SERVER :Serveris STR_NETWORK_CLIENT :Spēlētājs STR_NETWORK_SPECTATORS :Novērotāji @@ -2279,7 +2254,7 @@ STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD_FILE_NOT_WRITABLE :{WHITE}... fail STR_CONTENT_ERROR_COULD_NOT_EXTRACT :{WHITE}Neizdevās atspiest lejupielādēto failu STR_MISSING_GRAPHICS_SET_CAPTION :{WHITE}Trūkst grafikas -STR_MISSING_GRAPHICS_SET_MESSAGE :{BLACK}OpenTTD vajag grafiku, lai strādātu, bet tādu nevarēja atrast. Vai ļaujat OpenTTD lejupielādēt un instalēt tādu grafiku? +STR_MISSING_GRAPHICS_SET_MESSAGE :{BLACK}OpenTTD darbībai nepieciešama grafika, bet tāda nav atrodama. Vai ļaut OpenTTD lejupielādēt un instalēt šo grafiku? STR_MISSING_GRAPHICS_YES_DOWNLOAD :{BLACK}Jā, lejupielādēt grafiku STR_MISSING_GRAPHICS_NO_QUIT :{BLACK}Nē, iziet no OpenTTD @@ -2538,10 +2513,10 @@ STR_TERRAFORM_TOOLTIP_DECREASE_SIZE_OF_LAND_AREA :{BLACK}Samazin STR_TERRAFORM_TOOLTIP_GENERATE_RANDOM_LAND :{BLACK}Radīt nejaušu zemi STR_TERRAFORM_SE_NEW_WORLD :{BLACK}Izveidot jaunu scenāriju STR_TERRAFORM_RESET_LANDSCAPE :{BLACK}Atiestatīt ainavu -STR_TERRAFORM_RESET_LANDSCAPE_TOOLTIP :{BLACK}Novākt visus spēlētājam piederošos īpašumus no kartes +STR_TERRAFORM_RESET_LANDSCAPE_TOOLTIP :{BLACK}Noņemt visus spēlētājam piederošos īpašumus no kartes STR_QUERY_RESET_LANDSCAPE_CAPTION :{WHITE}Atiestatīt ainavu -STR_RESET_LANDSCAPE_CONFIRMATION_TEXT :{WHITE}Vai tiešām vēlaties novākt visus uzņēmumam piederošos īpašumus? +STR_RESET_LANDSCAPE_CONFIRMATION_TEXT :{WHITE}Vai tiešām vēlaties noņemt visus uzņēmumam piederošos īpašumus? # Town generation window (SE) STR_FOUND_TOWN_CAPTION :{WHITE}Pilsētu radīšana @@ -2589,7 +2564,7 @@ STR_FUND_INDUSTRY_FUND_NEW_INDUSTRY :{BLACK}Finansē STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES :{BLACK}Noņemt visas nozares STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_TOOLTIP :{BLACK} Noņemt visas kartē pašlaik esošās nozares STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_CAPTION :{WHITE} Noņemt visas nozares -STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_QUERY :{YELLOW}Vai tiešām vēlaties noņemt visas industrijas? +STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_QUERY :{YELLOW}Vai tiešām vēlaties noņemt visas nozares? # Industry cargoes window STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Ražotnes '{STRING}' kravu ķēde @@ -3149,7 +3124,7 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{YELLOW}Veikt l STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{YELLOW}Finansēt ceļu remontdarbus. Rada satiksmes traucējumus līdz pat pusgadam.{}Izmaksas: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{YELLOW}Uzbūvēt statuju par godu savam uzņēmumam.{}Izmaksas: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{YELLOW}Finansēt jaunu komercēku būvniecību šajā pilsētā.{}Izmaksas: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW}Pirkt 1 gada izņēmuma tiesības uz kravu un pasažieru transportēšanu. Pašvaldība atļaus pasažieriem un kravas pārvešanai izmantot tkai jūsu uzņēmuma stacijas.{}Izmaksas: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW}Pirkt 1 gada izņēmuma tiesības uz pārvadājumiem pilsētā.{}Pašvaldība neatļaus pasažieru un kravu pārvešanai izmantot jūsu sāncenšu stacijas.{}Izmaksas: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Piekukuļot vietējo pašvaldību lai paceltu reitingu, riskējot saņemt lielu sodu.{}Izmaksas: {CURRENCY_LONG} # Goal window @@ -3291,9 +3266,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Novērst # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} -STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centrēt galveno skatu uz pieturas punktu. Ctrl+klikšķis atvērs skatu uz pieturas punktu jaunā skatulaukā +STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centrēt galveno skatu uz pieturas punktu. Ctrl+klikšķis atvērs skatu uz pieturas punktu jaunā skatlaukā STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Mainīt pieturas punkta nosaukumu -STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centrēt galveno skatu uz boju. Ctrl+klikšķis atvērs skatu uz boju jaunā skatulaukā +STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centrēt galveno skatu uz boju. Ctrl+klikšķis atvērs skatu uz boju jaunā skatlaukā STR_BUOY_VIEW_CHANGE_BUOY_NAME :{BLACK}Mainīt bojas nosaukumu STR_EDIT_WAYPOINT_NAME :{WHITE}Labot pieturas punkta nosaukumu diff --git a/src/lang/lithuanian.txt b/src/lang/lithuanian.txt index 1d2fa9c346..0be7d98b05 100644 --- a/src/lang/lithuanian.txt +++ b/src/lang/lithuanian.txt @@ -994,6 +994,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * P STR_STATUSBAR_AUTOSAVE :{RED}AUTOMATINIS SAUGOJIMAS STR_STATUSBAR_SAVING_GAME :{RED}* * Išsaugomas žaidimas * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Žinučių istorija STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Paskutinių žinučių sąrašas @@ -1635,6 +1636,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Dvikartis spust STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Vienkartis spustelėjimas (jei židinyje) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Vienkartis spustelėjimas (iškart) + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Dešiniojo pelės mygtuko emuliacija: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Pasirinkite būdą, kurį atliks dešinio pelės klavišo paspaudimas STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+Click @@ -2275,39 +2277,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Pasirink STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} kompanij{P a os ų} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Daugiausia kompanijų: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Riboti serverį iki tam tikro skaičiaus kompanijų -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} stebėtoj{P as ai ų} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Daugiausia žiurovų: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Riboti serverį iki tam tikro skaičiaus žiurovų STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Kalba: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Kiti žaidėjai žinos kokia kalba kalbama serveryje STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Įveskite tinklo žaidimo pavadinimą -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Kelių žaidėjų meniu - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Ruošiamasi prisijungti: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Sąrašas visų kompanijų žaidime. Gali arba prisijungti prie kurios nors, arba sukurti naują kompaniją (jei yra laisvų vietų) - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}KOMPANIJOS INFORMACIJA -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Įmonės pavadinimas: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{G=vyr}{SILVER}Įkurtas: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Įmonės vertė: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Dabartinis balansas: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Praeitų metų pajamos: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Sparta: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Transporto priemonės: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Stotelės: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Žaidejai: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Nauja kompanija -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Sukursi naują kompaniją -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Stebėti žaidimą -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Stebėsi žaidimą kaip žiūrovas -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Prisijungti prie kompanijos -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Padėsi valdyti šią kompaniją - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Jungiamasi... @@ -2342,6 +2316,7 @@ STR_NETWORK_COMPANY_LIST_SPECTATE :Stebėti + STR_NETWORK_SERVER :Serveris STR_NETWORK_CLIENT :Žaidėjas STR_NETWORK_SPECTATORS :Stebėtojai diff --git a/src/lang/luxembourgish.txt b/src/lang/luxembourgish.txt index f760815ceb..97369d187c 100644 --- a/src/lang/luxembourgish.txt +++ b/src/lang/luxembourgish.txt @@ -789,6 +789,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * P STR_STATUSBAR_AUTOSAVE :{RED}AUTOSPÄICHEREN STR_STATUSBAR_SAVING_GAME :{RED}* * SPÄICHERT D'SPILL * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Meldungshistorie STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Eng Lëscht vun de leschten Meldungen @@ -1430,6 +1431,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Duebelklick STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Ee Klick (wann fokusséiert) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Ee Klick (direkt) + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Rietsklickemulatioun: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Wiel d'Method aus fir déi riets Maustast ze emuléiren STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :COMM+Klick @@ -2056,39 +2058,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Maximal STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} Firm{P a en} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Maximal Firmen: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}D'Unzuel vun de Firme limitéieren -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} Zuschauer -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Maximal Zuschauer: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}D'Unzuel vun den Zuschauer limitéiren STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Geschwate Sprooch: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Aner Leit gesinn wéieng Sprooch um Server geschwat gëtt STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Gëff en Numm fir d'Spill un -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Multiplayer-Spill Lobby - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Preparéiert fir bäizetrieden: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Eng Lëscht vun de Firmen an dësem Spill. Du kanns enger bäitrieden oder eng nei opmaachen. - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}FIRMENINFO -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Firmennumm: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Grënnung: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Firmewäert: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Kontostand: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Akommes vum leschte Joer: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Performance: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Gefierer: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Statiounen: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Spiller: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Nei Firma -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Nei Firma erstellen -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Dem Spill nokucken -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Dem Spill als Zuschauer nokucken -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Firma bäitrieden -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Des Firma matverwalten - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Connectioun... @@ -2123,6 +2097,7 @@ STR_NETWORK_COMPANY_LIST_SPECTATE :Nokucken + STR_NETWORK_SERVER :Server STR_NETWORK_CLIENT :Spiller STR_NETWORK_SPECTATORS :Zuschauer diff --git a/src/lang/macedonian.txt b/src/lang/macedonian.txt index 72bc4a654b..ec3fd24614 100644 --- a/src/lang/macedonian.txt +++ b/src/lang/macedonian.txt @@ -732,6 +732,7 @@ STR_STATUSBAR_PAUSED :{YELLOW}* * STR_STATUSBAR_AUTOSAVE :{RED}Автозачувување STR_STATUSBAR_SAVING_GAME :{RED}* * ЗАШТЕДА НА ИГРА * * + # News message history STR_MESSAGE_HISTORY :{WHITE}порака Историја STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Листа на последните вести пораки @@ -858,6 +859,7 @@ STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Дебелин + STR_CONFIG_SETTING_SOUND_NEW_YEAR :Крај на година: {STRING} STR_CONFIG_SETTING_SOUND_CONFIRM :Изградба: {STRING} STR_CONFIG_SETTING_SOUND_VEHICLE :Возила: {STRING} @@ -983,12 +985,6 @@ STR_NETWORK_SERVER_LIST_MAP_SIZE_SHORT :{BLACK}{COMMA}x -# Network game lobby - - - - - # Network connecting window ############ Leave those lines in this order!! @@ -1007,6 +1003,7 @@ STR_NETWORK_SERVER_LIST_MAP_SIZE_SHORT :{BLACK}{COMMA}x + # Network set password # Network company info join/password diff --git a/src/lang/malay.txt b/src/lang/malay.txt index 763731ba4b..3eec18e48d 100644 --- a/src/lang/malay.txt +++ b/src/lang/malay.txt @@ -742,6 +742,7 @@ STR_STATUSBAR_PAUSED :{YELLOW}* * DI STR_STATUSBAR_AUTOSAVE :{RED}SIMPANAN AUTOMATIK STR_STATUSBAR_SAVING_GAME :{RED}* * SEDANG SIMPAN PERMAINAN * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Pesanan Sebelumnya STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Senarai laporan berita terkini @@ -1270,6 +1271,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Dua klik STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Satu klik (bila difokuskan) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Satu klik (segera) + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Emulasi klik kanan: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+Klik STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+Klik @@ -1697,39 +1699,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Tentukan STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} syarikat STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Amaun maksimum syarikat: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Hadkan bilangan syarikat dalam pelayan -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} penyaksi -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Amaun maxsimum penyaksi: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Hadkan bilangan penyaksi dalam pelayan STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Bahasa yang digunakan: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Pemain lain akan tahu bahasa apa yang digunakan di pelayan ini STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Masukkan nama untuk permainan rangkaian -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Ruang tunggu berbilang pemain - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Sedang bersedia untuk menyambung: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Senarai semua syarikat yang sedang beroperasi. Anda boleh sertai salah satu syarikat atau mulakan syarikat yang baru jika ada slot kosong - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}MAKLUMAT SYARIKAT -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Nama syarikat: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Ditubuhkan: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Nilai syarikat: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Baki sekarang: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Pendapatan tahun lepas: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Prestasi: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Kenderaan: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Stesen-stesen: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Pemain: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Syarikat baru -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Mulakan syarikat baru -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Saksikan permainan -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Saksikan permainan sebagai seorang penyaksi -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Sertai syarikat -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Bantu uruskan syarikat ini - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Menyambung... @@ -1764,6 +1738,7 @@ STR_NETWORK_COMPANY_LIST_SPECTATE :Saksi + STR_NETWORK_SERVER :Pelayan STR_NETWORK_CLIENT :Klien STR_NETWORK_SPECTATORS :Penyaksi diff --git a/src/lang/maltese.txt b/src/lang/maltese.txt index 110ec64347..aae0806665 100644 --- a/src/lang/maltese.txt +++ b/src/lang/maltese.txt @@ -368,6 +368,7 @@ STR_SMALLMAP_TOOLTIP_ENABLE_ALL_COMPANIES :{BLACK}Uri l-pr # Status bar messages STR_STATUSBAR_COMPANY_NAME :{SILVER}- - {COMPANY} - - + # News message history @@ -478,6 +479,7 @@ STR_CONFIG_SETTING_WARN_LOST_VEHICLE :Avza jekk jinti + STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_NO_ACTIONS :L-ebda azzjoni STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_ACTIONS :L-azzjonijiet kollha STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS :Uza l-lista avvanzata tal-vetturi: {STRING} @@ -551,12 +553,6 @@ STR_NETWORK_SERVER_LIST_MAP_SIZE_SHORT :{BLACK}{COMMA}x -# Network game lobby - - - - - # Network connecting window ############ Leave those lines in this order!! @@ -577,6 +573,7 @@ STR_NETWORK_CONNECTING_DOWNLOADING_2 :{BLACK}{BYTES} + # Network set password # Network company info join/password diff --git a/src/lang/marathi.txt b/src/lang/marathi.txt index 3841e36232..a78ca8900f 100644 --- a/src/lang/marathi.txt +++ b/src/lang/marathi.txt @@ -657,6 +657,7 @@ STR_SMALLMAP_TOWN :{TINY_FONT}{WHI # Status bar messages STR_STATUSBAR_COMPANY_NAME :{SILVER}- - {COMPANY} - - + # News message history STR_MESSAGE_NEWS_FORMAT :{STRING} - {STRING} @@ -809,6 +810,7 @@ STR_CONFIG_SETTING_WARN_LOST_VEHICLE : वाहन + STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_NO_ACTIONS :कोणतीही कृती नाही STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_ACTIONS :सर्व कृत्या @@ -919,14 +921,6 @@ STR_NETWORK_SERVER_LIST_LANGUAGE :{SILVER}भा -# Network game lobby - - -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}गेल्या वर्ष्याची कमाई: {WHITE}{CURRENCY_LONG} - -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}स्थानक: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} - - # Network connecting window ############ Leave those lines in this order!! @@ -947,6 +941,7 @@ STR_NETWORK_CONNECTING_DOWNLOADING_2 :{BLACK}{BYTES} + # Network set password # Network company info join/password diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index b0bbb8dbe7..de0af38c06 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -791,6 +791,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * SPI STR_STATUSBAR_AUTOSAVE :{RED}AUTOLAGRING STR_STATUSBAR_SAVING_GAME :{RED}* * LAGRER SPILL * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Meldingshistorikk STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}En liste over de siste nyhetsmeldingene @@ -1448,6 +1449,12 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Dobbeltklikk STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Enkelt klikk (ved fokus) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Enkelt klikk (umiddelbart) +STR_CONFIG_SETTING_USE_RELAY_SERVICE :Bruk videresendingstjeneste: {STRING} +STR_CONFIG_SETTING_USE_RELAY_SERVICE_HELPTEXT :Hvis opprettelsen av en tilkobling til serveren mislykkes, kan man bruke en videresendingstjeneste til å opprette en tilkobling. "Aldri" tillater dette, "spør" vil spørre først, "tillat" vil tillate det uten å spørre +STR_CONFIG_SETTING_USE_RELAY_SERVICE_NEVER :Aldri +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ASK :Spør +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ALLOW :Tillat + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Høyreklikkemulering: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Velg metoden å etterligne høyreklikk STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Kommando+klikk @@ -1800,6 +1807,7 @@ STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :{ORANGE}Industr STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :{ORANGE}Gods-distribusjon STR_CONFIG_SETTING_AI :{ORANGE}Motstandere STR_CONFIG_SETTING_AI_NPC :{ORANGE}Datamaskinstyrte spillere +STR_CONFIG_SETTING_NETWORK :{ORANGE}Nettverk STR_CONFIG_SETTING_PATHFINDER_NPF :NPF STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Anbefalt) @@ -2005,7 +2013,9 @@ STR_FACE_EARRING :Ørering: STR_FACE_TIE_EARRING_TOOLTIP :{BLACK}Endre slips eller ørering ############ Next lines match ServerGameType +STR_NETWORK_SERVER_VISIBILITY_LOCAL :Lokal STR_NETWORK_SERVER_VISIBILITY_PUBLIC :Offentlig +STR_NETWORK_SERVER_VISIBILITY_INVITE_ONLY :Kun invitasjon ############ End of leave-in-this-order # Network server list @@ -2040,6 +2050,7 @@ STR_NETWORK_SERVER_LIST_SERVER_VERSION :{SILVER}Tjenerv STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}Tjeneradresse: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}Startdato: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}Nettverksdato: {WHITE}{DATE_SHORT} +STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}Spillskript: {WHITE}{STRING} (v{NUM}) STR_NETWORK_SERVER_LIST_PASSWORD :{SILVER}Passordbeskyttet! STR_NETWORK_SERVER_LIST_SERVER_OFFLINE :{SILVER}TJENEREN ER FRAKOBLET STR_NETWORK_SERVER_LIST_SERVER_FULL :{SILVER}TJENEREN ER FULL @@ -2055,11 +2066,12 @@ STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET_TOOLTIP :{BLACK}Søk på STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN :{BLACK}Søk LAN STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN_TOOLTIP :{BLACK}Søk lokalt nettverk for servere STR_NETWORK_SERVER_LIST_ADD_SERVER :{BLACK}Legg til tjener -STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Legger til en tjener til listen som alltid vil bli sjekket for aktive spill. +STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Legger til en tjener til listen. Dette kan enten være en serveradresse eller en invitasjonskode STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Start tjener STR_NETWORK_SERVER_LIST_START_SERVER_TOOLTIP :{BLACK}Start en egen tjener STR_NETWORK_SERVER_LIST_PLAYER_NAME_OSKTITLE :{BLACK}Skriv inn ditt navn +STR_NETWORK_SERVER_LIST_ENTER_SERVER_ADDRESS :{BLACK}Tast inn serveradresse og invitasjonskode # Start new multiplayer server STR_NETWORK_START_SERVER_CAPTION :{WHITE}Start et nytt flerspillerspill @@ -2078,39 +2090,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Velg mak STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} firma{P "" er} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Maks antall firmaer: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Begrens tjeneren til et bestemt antall firmaer -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} tilskuer{P "" e} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Maks antall tilskuere: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Begrens tjeneren til et bestemt antall tilskuere STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Språk de snakker på tjeneren: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Andre spillere skal kunne vite hvilket språk man snakker på denne tjeneren STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Skriv inn et navn for nettverksspillet -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Flerspillerlobby - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Prøver å koble til: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}En liste over alle nåværende firmaer i spillet. Du kan enten bli med i et eller starte et nytt hvis det er en ledig firmaplass. - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}FIRMAOVERSIKT -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Firmanavn: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Grunnlagt: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Firmaverdi: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Nåværende balanse: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Inntekt i fjor: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Nettverksytelse: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Kjøretøy: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Stasjoner: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Spillere: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Nytt firma -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Start et nytt firma -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Vær tilskuer -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Vær tilskuer til spillet -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Bli med i firmaet -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Hjelp til med å styre dette firmaet - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Kobler til... @@ -2147,6 +2131,10 @@ STR_NETWORK_CLIENT_LIST_SERVER_NAME_EDIT_TOOLTIP :{BLACK}Rediger STR_NETWORK_CLIENT_LIST_SERVER_NAME_QUERY_CAPTION :Servernavn STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY :{BLACK}Synlighet STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY_TOOLTIP :{BLACK}Om andre mennesker kan se serveren din i den offentlige oppføringen +STR_NETWORK_CLIENT_LIST_SERVER_INVITE_CODE :{BLACK}Invitasjonskode +STR_NETWORK_CLIENT_LIST_SERVER_INVITE_CODE_TOOLTIP :{BLACK}Invitasjonskode andre spillere kan bruke for å koble til denne serveren +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE :{BLACK}Tilkoblingstype +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TOOLTIP :{BLACK}Hvorvidt og hvordan serveren din kan nås av andre STR_NETWORK_CLIENT_LIST_PLAYER :{BLACK}Spiller STR_NETWORK_CLIENT_LIST_PLAYER_NAME :{BLACK}Navn STR_NETWORK_CLIENT_LIST_PLAYER_NAME_TOOLTIP :{BLACK}Ditt spillernavn @@ -2166,6 +2154,11 @@ STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP :{BLACK}Dette er STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT :{BLACK}{NUM} klient{P "" s} / {NUM} firma{P et er} ############ Begin of ConnectionType +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_UNKNOWN :{BLACK}Lokal +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_ISOLATED :{RED}Eksterne spillere kan ikke koble til +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_DIRECT :{BLACK}Offentlig +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_STUN :{BLACK}Bak NAT +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TURN :{BLACK}Via videresending ############ End of ConnectionType STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :Spark @@ -2179,6 +2172,12 @@ STR_NETWORK_CLIENT_LIST_ASK_CLIENT_BAN :{YELLOW}Er du s STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Er du sikker på at du vil slette firmaet '{COMPANY}'? STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Er du sikker på at du vil tilbakestille passordet til firma '{COMPANY}'? +STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}Vil du bruke videresending? +STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}Kunne ikke opprette en kobling mellom deg og serveren.{}Vil du videresende denne økten via '{STRING}'? +STR_NETWORK_ASK_RELAY_NO :{BLACK}Nei +STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Ja, denne +STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Ja, ikke spør igjen + STR_NETWORK_SERVER :Tjener STR_NETWORK_CLIENT :Klient STR_NETWORK_SPECTATORS :Tilskuere @@ -2295,6 +2294,9 @@ STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}Tjeneren STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Tjeneren starter på nytt...{}Vennligst vent... STR_NETWORK_MESSAGE_KICKED :*** {STRING} ble kastet ut. Grunn: ({STRING}) +STR_NETWORK_ERROR_COORDINATOR_REGISTRATION_FAILED :{WHITE}Serverregistrering mislykket +STR_NETWORK_ERROR_COORDINATOR_ISOLATED :{WHITE}Serveren din tillater ikke eksterne tilkoblinger +STR_NETWORK_ERROR_COORDINATOR_ISOLATED_DETAIL :{WHITE}Andre spillere vil ikke kunne koble seg til din server # Content downloading window STR_CONTENT_TITLE :{WHITE}Laster ned innhold diff --git a/src/lang/norwegian_nynorsk.txt b/src/lang/norwegian_nynorsk.txt index 2ab7f001b3..5a398859f7 100644 --- a/src/lang/norwegian_nynorsk.txt +++ b/src/lang/norwegian_nynorsk.txt @@ -767,6 +767,7 @@ STR_STATUSBAR_PAUSED :{YELLOW}* * PA STR_STATUSBAR_AUTOSAVE :{RED}AUTOLAGRING STR_STATUSBAR_SAVING_GAME :{RED}* * LAGRAR SPEL * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Meldingshistorikk STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Ei liste over siste nyheiter @@ -1324,6 +1325,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Dobbelklikk STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Enkelt klikk (når vald) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Enkelt klikk (umiddelbart) + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Høgreklikkemulering: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Vel metode for å gjenskape høgre museknapp-klikk STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Kommando+klikk @@ -1859,39 +1861,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Vel maks STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} firma STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Maks. antal firma: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Begrens tenaren til eit visst antal firma -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} tilskodar{P "" ar} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Maks. antal tilskodarar: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Begrens tenaren til eit visst antal tilskodarar STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Språk som vert tala på tenaren: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Andre spelarar skal vete kva språk ein talar på denne tenaren STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Gje eit namn til nettverksspelet -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Fleirspelarspel-lobby - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Freistar å verte med: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Ei liste over firma i spelet. Du kan anten verte med i eit eller starte eit nytt. - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}FIRMAOVERSIKT -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Firmanamn: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Skipa: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Firmaverdi: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Noverande saldo: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Inntekt i fjor: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Nettverksyting: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Køyretøy: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Stasjonar: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Spelarar: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Nytt firma -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Skip eit nytt firma -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Vær tilskodar -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Ver tilskodar til spelet -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Ver med i firmaet -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Hjelp å styre dette firmaet - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Kobler til... @@ -1926,6 +1900,7 @@ STR_NETWORK_COMPANY_LIST_SPECTATE :Vær tilskodar + STR_NETWORK_SERVER :Tenar STR_NETWORK_CLIENT :Klient STR_NETWORK_SPECTATORS :Tilskodarar diff --git a/src/lang/persian.txt b/src/lang/persian.txt index 91cb13fc38..720e6d14d7 100644 --- a/src/lang/persian.txt +++ b/src/lang/persian.txt @@ -757,6 +757,7 @@ STR_STATUSBAR_PAUSED :{YELLOW}* * ت STR_STATUSBAR_AUTOSAVE :{RED}ذخیره اتوماتیک STR_STATUSBAR_SAVING_GAME :{RED}»»»» در حال ذخيره بازي «««« + # News message history STR_MESSAGE_HISTORY :{WHITE}تاریخچه پیام ها STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}لیست آخرین پیام های اخباری @@ -1239,6 +1240,7 @@ STR_CONFIG_SETTING_SCROLLWHEEL_SCROLL :جابجا کر STR_CONFIG_SETTING_SCROLLWHEEL_OFF :خاموش STR_CONFIG_SETTING_SCROLLWHEEL_MULTIPLIER :سرعت حرکت نقشه با چرخاندن غلطک ماوس: {STRING} + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :شبیه سازی کلیک راست: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :دستور+کلیک STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :کنترل+کلیک @@ -1657,39 +1659,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}بیشت STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} شرک{P ت تها} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}بیشترین تعداد شرکت ها: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}محدود کردن سرویس دهنده به داشتن تعداد مشخصی شرکت -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} تماشاگر{P "" ها} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}بیشترین تعداد تماشاگر: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}محدود کردن سرویس دهنده به داشتن تعداد مشخصی تماشاگر STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}زبان گفتگو: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}دیگر بازیگران می فهمند که با چه زبانی در این سرویس دهنده گفتگو می شود STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}برای بازی شبکه‌ای یک نام وارد نمایید -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}سالن انتظار بازی چندنفره - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}آماده سازی برای پیوستن: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}لیستی از تمامی شرکت هایی که در بازی وجود دارند. شما می توانید به یکی از آنها بپیوندید یا در صورت وجود جای خالی برای ساخت شرکت، یک شرکت جدید بسازید - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}مشخصات شرکت -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}نام شرکت: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}گشایش: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}ارزش شرکت: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}موجودی فعلی: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}درآمد سال گذشته: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}کارایی: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}وسایل نقلیه: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}ایستگاه ها: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}بازیگران: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}شرکت جدید -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}ساختن یک شرکت جدید -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}تماشای بازی -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}دیدن بازی به عنوان یک تماشاگر -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}پیوستن به شرکت -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}کمک به مدیریت این شرکت - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}درحال وصل شدن... @@ -1724,6 +1698,7 @@ STR_NETWORK_COMPANY_LIST_SPECTATE :{WHITE}تماش + STR_NETWORK_SERVER :سرویس دهنده STR_NETWORK_CLIENT :سرویس گیرنده STR_NETWORK_SPECTATORS :تماشاگران diff --git a/src/lang/polish.txt b/src/lang/polish.txt index 1c702030b1..b202a18d3c 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -715,7 +715,7 @@ STR_TOOLBAR_TOOLTIP_OPTIONS :{BLACK}Opcje STR_TOOLBAR_TOOLTIP_SAVE_GAME_ABANDON_GAME :{BLACK}Zapis gry, opuszczenie gry, wyjście STR_TOOLBAR_TOOLTIP_DISPLAY_MAP :{BLACK}Wyświetl mapę, dodatkowy podgląd lub listę napisów STR_TOOLBAR_TOOLTIP_DISPLAY_TOWN_DIRECTORY :{BLACK}Wyświetl listę miast -STR_TOOLBAR_TOOLTIP_DISPLAY_SUBSIDIES :{BLACK}Wyświetl subsydia +STR_TOOLBAR_TOOLTIP_DISPLAY_SUBSIDIES :{BLACK}Wyświetl dotacje STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS :{BLACK}Wyświetl listę stacji firmy STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}Wyświetl informacje finansowe firmy STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}Wyświetl informacje ogólne firmy @@ -805,7 +805,7 @@ STR_TOWN_MENU_FOUND_TOWN :Załóż miasto ############ range ends here ############ range for subsidies menu starts -STR_SUBSIDIES_MENU_SUBSIDIES :Subsydia +STR_SUBSIDIES_MENU_SUBSIDIES :Dotacje ############ range ends here ############ range for graph menu starts @@ -1169,6 +1169,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * P STR_STATUSBAR_AUTOSAVE :{RED}AUTOZAPIS STR_STATUSBAR_SAVING_GAME :{RED}* * ZAPISYWANIE GRY * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Poprzednie wiadomości STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Lista ostatnich wiadomości @@ -1267,8 +1268,13 @@ STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO_OR_CARGO :{WHITE}{STATION STR_NEWS_STATION_NOW_ACCEPTS_CARGO :{WHITE}{STATION} już akceptuje {STRING.b} STR_NEWS_STATION_NOW_ACCEPTS_CARGO_AND_CARGO :{WHITE}{STATION} już akceptuje {STRING.b} i {STRING.b} -STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}Subsydiowanie wygasło:{}{}{STRING} z {STRING} do {STRING} nie będzie już dotowane -STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Koniec dotacji:{}{}Przewóz {STRING.d} z {STRING} do {STRING} nie jest już subsydiowany +STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}Dotacja wygasła:{}{}{STRING} z {STRING} do {STRING} nie będzie już dotowane +STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Koniec dotacji:{}{}Przewóz {STRING.d} z {STRING} do {STRING} nie jest już dotowany +STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIG_FONT}{BLACK}Oferta usługi dotowanej:{}{}Pierwszy przewóz {STRING.d} z {STRING} do {STRING} będzie dotowany przez następn{P 3 y e ych} {NUM} {P rok lata lat} przez lokalne władze! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}Przyznano dotację dla {STRING}!{}{}Przewóz {STRING.d} z {STRING} do {STRING} będzie opłacany o 50% więcej przez następn{P 4 y e ych} {NUM} {P rok lata lat}! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLACK}Przyznano dotację dla {STRING}!{}{}Przewóz {STRING.d} z {STRING} do {STRING} będzie opłacany podwójnie przez następn{P 4 y e ych} {NUM} {P rok lata lat}! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}Przyznano dotację dla {STRING}!{}{}Przewóz {STRING.d} z {STRING} do {STRING} będzie opłacany potrójnie przez następn{P 4 y e ych} {NUM} {P rok lata lat}! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}Przyznano dotację dla {STRING}!{}{}Przewóz {STRING.d} z {STRING} do {STRING} będzie opłacany poczwórnie przez następn{P 4 y e ych} {NUM} {P rok lata lat}! STR_NEWS_ROAD_REBUILDING :{BIG_FONT}{BLACK}Chaos na drogach w {TOWN}!{}{}Program przebudowy dróg ufundowany przez {STRING} przynosi 6 miesięcy męki dla kierowców! STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Monopol transportowy! @@ -1334,7 +1340,7 @@ STR_GAME_OPTIONS_CURRENCY_MYR :Ringgit malezyj STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Jazda po lewej STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Jazda po prawej -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Nazwy miast +STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Nazwy miast: STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Wybierz styl nazw miast ############ start of townname region @@ -1584,6 +1590,10 @@ STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS :Awarie pojazdó STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT :Kontroluj jak często nieodpowiednio serwisowane pojazdy mogą się psuć STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER :Mnożnik dofinansowania: {STRING} STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT :Ustaw wysokość zapłaty za połączenia dofinansowywane +STR_CONFIG_SETTING_SUBSIDY_DURATION :Czas trwania dotacji: {STRING} +STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :Określ liczbę lat, na które przyznawana jest dotacja +STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{NUM} {P rok lata lat} +STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :Brak dotacji STR_CONFIG_SETTING_CONSTRUCTION_COSTS :Koszty konstrukcji: {STRING} STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Ustaw poziom kosztów konstrukcji i kupna STR_CONFIG_SETTING_RECESSIONS :Kryzys: {STRING} @@ -1816,6 +1826,12 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Podwójny klik STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Pojedyncze kliknięcie (w przybliżeniu) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Pojedyncze kliknięcie (natychmiast) +STR_CONFIG_SETTING_USE_RELAY_SERVICE :Użyj usługi przekaźnika: {STRING} +STR_CONFIG_SETTING_USE_RELAY_SERVICE_HELPTEXT :Jeśli nawiązanie połączenia z serwerem nie powiedzie się, można użyć usługi przekaźnika do nawiązania połączenia. „Nigdy" nie zezwoli na to, „pytaj” najpierw zapyta, „zezwól” pozwoli na to bez pytania +STR_CONFIG_SETTING_USE_RELAY_SERVICE_NEVER :Nigdy +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ASK :Pytaj +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ALLOW :Zezwól + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Emulacja prawego przycisku myszy: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Wybierz metodę emulacji klikania prawym przyciskiem myszki STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+klik @@ -1966,8 +1982,8 @@ STR_CONFIG_SETTING_NEWS_NEW_VEHICLES :Nowe pojazdy: { STR_CONFIG_SETTING_NEWS_NEW_VEHICLES_HELPTEXT :Wyświetl wiadomość w gazecie o dostępnym nowym typie pojazdu STR_CONFIG_SETTING_NEWS_CHANGES_ACCEPTANCE :Zmiany w akceptowaniu ładunku: {STRING} STR_CONFIG_SETTING_NEWS_CHANGES_ACCEPTANCE_HELPTEXT :Wyświetlaj wiadomości o zmianach w akceptowaniu towarów przez stacje -STR_CONFIG_SETTING_NEWS_SUBSIDIES :Subsydia: {STRING} -STR_CONFIG_SETTING_NEWS_SUBSIDIES_HELPTEXT :Wyświetl wiadomość w gazecie o wydarzeniach związanych z subsydiami +STR_CONFIG_SETTING_NEWS_SUBSIDIES :Dotacje: {STRING} +STR_CONFIG_SETTING_NEWS_SUBSIDIES_HELPTEXT :Wyświetl wiadomość w gazecie o wydarzeniach związanych z dotacjami STR_CONFIG_SETTING_NEWS_GENERAL_INFORMATION :Ogólne informacje: {STRING} STR_CONFIG_SETTING_NEWS_GENERAL_INFORMATION_HELPTEXT :Wyświetl wiadomość w gazecie o wydarzeniach takich jak zakup ekskluzywnych praw lub fundowanie przebudowy dróg @@ -2168,6 +2184,7 @@ STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :{ORANGE}Przedsi STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :{ORANGE}Dystrybucja towarów STR_CONFIG_SETTING_AI :{ORANGE}Rywale STR_CONFIG_SETTING_AI_NPC :{ORANGE}Gracze komputerowi +STR_CONFIG_SETTING_NETWORK :{ORANGE}Sieć STR_CONFIG_SETTING_PATHFINDER_NPF :NPF STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Zalecane) @@ -2257,7 +2274,7 @@ STR_QUIT_NO :{BLACK}Nie # Abandon game STR_ABANDON_GAME_CAPTION :{WHITE}Wyjście STR_ABANDON_GAME_QUERY :{YELLOW}Czy jesteś pewien, że chcesz skończyć tę grę? -STR_ABANDON_SCENARIO_QUERY :{YELLOW}Czy jesteś pewny, że chcesz opuścić ten scenariusz? +STR_ABANDON_SCENARIO_QUERY :{YELLOW}Czy jesteś pewien, że chcesz opuścić ten scenariusz? # Cheat window STR_CHEATS :{WHITE}Oszustwa @@ -2286,8 +2303,8 @@ STR_LIVERY_TRAIN_TOOLTIP :{BLACK}Pokaż s STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}Pokaż schematy koloru pojazdów STR_LIVERY_SHIP_TOOLTIP :{BLACK}Pokaż schematy koloru statków STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}Pokaż schematy koloru samolotów -STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Wybierz główny kolor dla wybranego schematu. Ctrl + klik ustawi ten kolor dla wszystkich schematów -STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Wybierz drugi kolor dla wybranego schematu. Ctrl + klik ustawi ten kolor dla wszystkich schematów +STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Wybierz główny kolor dla wybranego schematu. Ctrl+klik ustawi ten kolor dla wszystkich schematów +STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Wybierz drugi kolor dla wybranego schematu. Ctrl+klik ustawi ten kolor dla wszystkich schematów STR_LIVERY_PANEL_TOOLTIP :{BLACK}Wybierz schemat kolorów do zmiany, albo wiele schematów z CTRL+klik. Kliknij na okienku aby wł./wył. używanie schematu. STR_LIVERY_DEFAULT :Standardowy wygląd @@ -2373,6 +2390,9 @@ STR_FACE_EARRING :Kolczyk: STR_FACE_TIE_EARRING_TOOLTIP :{BLACK}Zmień krawat lub kolczyk ############ Next lines match ServerGameType +STR_NETWORK_SERVER_VISIBILITY_LOCAL :Lokalny +STR_NETWORK_SERVER_VISIBILITY_PUBLIC :Publiczny +STR_NETWORK_SERVER_VISIBILITY_INVITE_ONLY :Tylko na zaproszenie ############ End of leave-in-this-order # Network server list @@ -2395,7 +2415,7 @@ STR_NETWORK_SERVER_LIST_YEARS_CAPTION_TOOLTIP :{BLACK}Ilość STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP :{BLACK}Język, wersja serwera, itp. STR_NETWORK_SERVER_LIST_CLICK_GAME_TO_SELECT :{BLACK}Kliknij na grze z listy by ją wybrać -STR_NETWORK_SERVER_LIST_LAST_JOINED_SERVER :{BLACK}Serwer z którym ostatnio się połączyłeś: +STR_NETWORK_SERVER_LIST_LAST_JOINED_SERVER :{BLACK}Serwer, do którego ostatnio dołączyłeś: STR_NETWORK_SERVER_LIST_CLICK_TO_SELECT_LAST :{BLACK}Kliknij, aby wybrać serwer na którym grałeś ostatnio STR_NETWORK_SERVER_LIST_GAME_INFO :{SILVER}INFORMACJE O GRZE @@ -2407,6 +2427,7 @@ STR_NETWORK_SERVER_LIST_SERVER_VERSION :{SILVER}Wersja STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}Adres serwera: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}Data uruchomienia: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}Aktualna data: {WHITE}{DATE_SHORT} +STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}Game Script: {WHITE}{STRING} (v{NUM}) STR_NETWORK_SERVER_LIST_PASSWORD :{SILVER}Chronione hasłem! STR_NETWORK_SERVER_LIST_SERVER_OFFLINE :{SILVER}SERWER WYŁĄCZONY STR_NETWORK_SERVER_LIST_SERVER_FULL :{SILVER}SERWER PEŁNY @@ -2427,6 +2448,7 @@ STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Uruchom STR_NETWORK_SERVER_LIST_START_SERVER_TOOLTIP :{BLACK}Uruchom własny serwer STR_NETWORK_SERVER_LIST_PLAYER_NAME_OSKTITLE :{BLACK}Wprowadź swoje imię +STR_NETWORK_SERVER_LIST_ENTER_SERVER_ADDRESS :{BLACK}Wprowadź adres serwera lub kod zaproszenia # Start new multiplayer server STR_NETWORK_START_SERVER_CAPTION :{WHITE}Rozpocznij nową grę wieloosobową @@ -2436,45 +2458,19 @@ STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}Nazwa gr STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Ustaw hasło STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Zabezpiecz grę hasłem jeśli nie chcesz, by była publicznie dostępna +STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Widoczność +STR_NETWORK_START_SERVER_VISIBILITY_TOOLTIP :{BLACK}Czy inni ludzie mogą zobaczyć twój serwer na publicznej liście STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} klient{P "" ów ów} STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Dopuszczalna liczba klientów: STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Ustaw maksymalną liczbę klientów. Nie wszystkie pola muszą być wypełnione. STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} firm{P a y ""} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Maksymalna liczba firm: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Ogranicz serwer do określonej ilości firm -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} widz{P "" ów ów} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Maksymalna liczba widzów: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Ogranicz serwer do określonej ilości widzów STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Używany język: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Inni gracze będą poinformowani jaki język jest używany na serwerze STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Wpisz nazwę dla gry sieciowej -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Rozpoczęcie gry wieloosobowej - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Przygotowanie do połączenia: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Lista wszystkich firm w grze. Możesz przyłączyć się do jednej z nich, lub założyć nową - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}INFO O FIRMIE -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Nazwa firmy: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Inauguracja: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Wartość firmy: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Bieżący bilans: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Dochód w ostatnim roku: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Wydajność: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Pojazdy: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Stacje: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Gracze: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Nowa firma -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Rozpoczęcie działalności nowej firmy -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Obserwuj grę -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Oglądaj grę jako widz -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Dołącz do firmy -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Pomóż zarządzać tą firmą - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Łączenie... @@ -2499,15 +2495,64 @@ STR_NETWORK_NEED_GAME_PASSWORD_CAPTION :{WHITE}Serwer j STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION :{WHITE}Firma jest chroniona. Wprowadź hasło # Network company list added strings -STR_NETWORK_COMPANY_LIST_CLIENT_LIST :Lista klientów +STR_NETWORK_COMPANY_LIST_CLIENT_LIST :Połączeni gracze STR_NETWORK_COMPANY_LIST_SPECTATE :Obserwuj # Network client list +STR_NETWORK_CLIENT_LIST_CAPTION :{WHITE}Gra wieloosobowa +STR_NETWORK_CLIENT_LIST_SERVER :{BLACK}Serwer +STR_NETWORK_CLIENT_LIST_SERVER_NAME :{BLACK}Nazwa +STR_NETWORK_CLIENT_LIST_SERVER_NAME_TOOLTIP :{BLACK}Nazwa serwera, na którym grasz +STR_NETWORK_CLIENT_LIST_SERVER_NAME_EDIT_TOOLTIP :{BLACK}Edytuj nazwę swojego serwera +STR_NETWORK_CLIENT_LIST_SERVER_NAME_QUERY_CAPTION :Nazwa serwera +STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY :{BLACK}Widoczność +STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY_TOOLTIP :{BLACK}Czy inni ludzie mogą zobaczyć twój serwer na publicznej liście +STR_NETWORK_CLIENT_LIST_SERVER_INVITE_CODE :{BLACK}Kod zaproszenia +STR_NETWORK_CLIENT_LIST_SERVER_INVITE_CODE_TOOLTIP :{BLACK}Kod zaproszenia, którego mogą użyć inni gracze, by dołączyć do tego serwera +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE :{BLACK}Typ połączenia +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TOOLTIP :{BLACK}Czy i jak twój serwer może być osiągalny dla innych +STR_NETWORK_CLIENT_LIST_PLAYER :{BLACK}Gracz +STR_NETWORK_CLIENT_LIST_PLAYER_NAME :{BLACK}Nazwa +STR_NETWORK_CLIENT_LIST_PLAYER_NAME_TOOLTIP :{BLACK}Twoja nazwa gracza +STR_NETWORK_CLIENT_LIST_PLAYER_NAME_EDIT_TOOLTIP :{BLACK}Edytuj swoją nazwę gracza +STR_NETWORK_CLIENT_LIST_PLAYER_NAME_QUERY_CAPTION :Twoja nazwa gracza +STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_TOOLTIP :{BLACK}Działania administracyjne, które można wykonać dla tego klienta +STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_TOOLTIP :{BLACK}Działania administracyjne, które można wykonać dla tej firmy +STR_NETWORK_CLIENT_LIST_JOIN_TOOLTIP :{BLACK}Dołącz do tej firmy +STR_NETWORK_CLIENT_LIST_CHAT_CLIENT_TOOLTIP :{BLACK}Wyślij wiadomość do tego gracza +STR_NETWORK_CLIENT_LIST_CHAT_COMPANY_TOOLTIP :{BLACK}Wyślij wiadomość do wszystkich graczy tej firmy +STR_NETWORK_CLIENT_LIST_CHAT_SPECTATOR_TOOLTIP :{BLACK}Wyślij wiadomość do wszystkich obserwatorów +STR_NETWORK_CLIENT_LIST_SPECTATORS :Obserwatorzy +STR_NETWORK_CLIENT_LIST_NEW_COMPANY :(Nowa firma) +STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP :{BLACK}Utwórz nową firmę i dołącz do niej +STR_NETWORK_CLIENT_LIST_PLAYER_ICON_SELF_TOOLTIP :{BLACK}To jesteś ty +STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP :{BLACK}To jest gospodarz gry +STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT :{BLACK}{NUM} klient{P "" ów ów} / {NUM} firm{P a y ""} ############ Begin of ConnectionType +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_UNKNOWN :{BLACK}Lokalny +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_ISOLATED :{RED}Zdalni gracze nie mogą się łączyć +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_DIRECT :{BLACK}Publiczny +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_STUN :{BLACK}Za NAT-em +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TURN :{BLACK}Przez przekaźnik ############ End of ConnectionType +STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :Wyrzuć +STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Zbanuj +STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_RESET :Usuń +STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_UNLOCK :Wyczyść hasło + +STR_NETWORK_CLIENT_LIST_ASK_CAPTION :{WHITE}Działanie administratora +STR_NETWORK_CLIENT_LIST_ASK_CLIENT_KICK :{YELLOW}Czy na pewno chcesz wyrzucić gracza „{STRING}”? +STR_NETWORK_CLIENT_LIST_ASK_CLIENT_BAN :{YELLOW}Czy na pewno chcesz zbanować gracza „{STRING}”? +STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Czy na pewno chcesz usunąć firmę „{COMPANY}”? +STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Czy na pewno chcesz zresetować hasło firmy „{COMPANY}”? +STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}Używać przekaźnika? +STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}Nie udało się nawiązać połączenia między tobą a serwerem.{}Czy chcesz przekazać tę sesję za pośrednictwem „{STRING}”? +STR_NETWORK_ASK_RELAY_NO :{BLACK}Nie +STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Tak, ten jeden raz +STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Tak, nie pytaj ponownie STR_NETWORK_SERVER :Serwer STR_NETWORK_CLIENT :Klient @@ -2552,6 +2597,8 @@ STR_NETWORK_ERROR_SERVER_START :{WHITE}Nie moż STR_NETWORK_ERROR_CLIENT_START :{WHITE}Nie można połączyć STR_NETWORK_ERROR_TIMEOUT :{WHITE}Przekroczony limit czasu dla połączenia #{NUM} STR_NETWORK_ERROR_SERVER_ERROR :{WHITE}Błąd protokołu, połączenie zostało przerwane +STR_NETWORK_ERROR_BAD_PLAYER_NAME :{WHITE}Twoja nazwa gracza nie została ustawiona. Nazwę można ustawić w górnej części okna Gra wieloosobowa +STR_NETWORK_ERROR_BAD_SERVER_NAME :{WHITE}Nazwa twojego serwera nie została ustawiona. Nazwę można ustawić w górnej części okna Gra wieloosobowa STR_NETWORK_ERROR_WRONG_REVISION :{WHITE}Wersja gry nie zgadza się z wersją gry na serwerze STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}Złe hasło STR_NETWORK_ERROR_SERVER_FULL :{WHITE}Serwer jest pełny @@ -2564,6 +2611,8 @@ STR_NETWORK_ERROR_TIMEOUT_PASSWORD :{WHITE}Zbyt dł STR_NETWORK_ERROR_TIMEOUT_COMPUTER :{WHITE}Twój komputer jest zbyt wolny, by nadążyć za serwerem STR_NETWORK_ERROR_TIMEOUT_MAP :{WHITE}Twój komputer zbyt długo pobierał mapę STR_NETWORK_ERROR_TIMEOUT_JOIN :{WHITE}Twój komputer zbyt długo łączył się z serwerem +STR_NETWORK_ERROR_INVALID_CLIENT_NAME :{WHITE}Twoja nazwa gracza jest nieprawidłowa +STR_NETWORK_ERROR_SERVER_TOO_OLD :{WHITE}Zapytany serwer jest zbyt stary dla tego klienta ############ Leave those lines in this order!! STR_NETWORK_ERROR_CLIENT_GENERAL :błąd ogólny @@ -2586,6 +2635,7 @@ STR_NETWORK_ERROR_CLIENT_TIMEOUT_PASSWORD :nie otrzymano h STR_NETWORK_ERROR_CLIENT_TIMEOUT_COMPUTER :przekroczono czas STR_NETWORK_ERROR_CLIENT_TIMEOUT_MAP :pobieranie mapy trwało zbyt długo STR_NETWORK_ERROR_CLIENT_TIMEOUT_JOIN :przetwarzanie mapy trwało za długo +STR_NETWORK_ERROR_CLIENT_INVALID_CLIENT_NAME :nieprawidłowa nazwa klienta ############ End of leave-in-this-order STR_NETWORK_ERROR_CLIENT_GUI_LOST_CONNECTION_CAPTION :{WHITE}Możliwa utrata połączenia @@ -2614,12 +2664,15 @@ STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} do STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} dołączył do obserwatorów STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} założył nową firmę (#{2:NUM}) STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} opuścił grę ({2:STRING}) -STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} zmienił/zmieniła swoje imię na {STRING} +STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} zmienił swoją nazwę na {STRING} STR_NETWORK_MESSAGE_GIVE_MONEY :*** Firma {STRING} przekazała firmie {1:STRING} {2:CURRENCY_LONG} STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}Serwer zamknął sesję STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Restart serwera...{}Proszę czekać... STR_NETWORK_MESSAGE_KICKED :*** {STRING} został wyrzucony. Powód: ({STRING}) +STR_NETWORK_ERROR_COORDINATOR_REGISTRATION_FAILED :{WHITE}Rejestracja serwera nie powiodła się +STR_NETWORK_ERROR_COORDINATOR_ISOLATED :{WHITE}Twój serwer nie pozwala na połączenia zdalne +STR_NETWORK_ERROR_COORDINATOR_ISOLATED_DETAIL :{WHITE}Inni gracze nie będą mogli połączyć się z twoim serwerem # Content downloading window STR_CONTENT_TITLE :{WHITE}Przeglądarka dodatkowej zawartości @@ -3430,6 +3483,7 @@ STR_NEWGRF_ERROR_MSG_WARNING :{RED}Ostrzeżen STR_NEWGRF_ERROR_MSG_ERROR :{RED}Błąd: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Błąd krytyczny: {SILVER}{STRING} STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Wystąpił błąd krytyczny NewGRF:{}{STRING} +STR_NEWGRF_ERROR_POPUP :{WHITE}Wystąpił błąd NewGRF:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} nie zadziała z wersją TTDPatcha zgłoszoną przez OpenTTD STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} jest przeznaczony dla TTD wersji {STRING} STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} jest zaprojektowany do użycia z {STRING} @@ -3619,11 +3673,11 @@ STR_GOAL_QUESTION_BUTTON_CLOSE :Zamknij ############ End of Goal Question button list # Subsidies window -STR_SUBSIDIES_CAPTION :{WHITE}Subsydia -STR_SUBSIDIES_OFFERED_TITLE :{BLACK}Oferta subsydiów dla usługi przewozu: +STR_SUBSIDIES_CAPTION :{WHITE}Dotacje +STR_SUBSIDIES_OFFERED_TITLE :{BLACK}Oferta dotacji dla usługi przewozu: STR_SUBSIDIES_OFFERED_FROM_TO :{ORANGE}{STRING} z {STRING} do {STRING}{YELLOW} (do {DATE_SHORT}) STR_SUBSIDIES_NONE :{ORANGE}- Żadne - -STR_SUBSIDIES_SUBSIDISED_TITLE :{BLACK}Usługi już subsydiowane: +STR_SUBSIDIES_SUBSIDISED_TITLE :{BLACK}Usługi już dotowane: STR_SUBSIDIES_SUBSIDISED_FROM_TO :{ORANGE}{STRING} z {STRING} do {STRING}{YELLOW} ({COMPANY}{YELLOW}, do {DATE_SHORT}) STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Klik na usłudze żeby wyśrodkować widok na fabrykę/miasto. Ctrl+klik otwiera nowy podgląd na pozycji fabryki/miasta @@ -3907,7 +3961,7 @@ STR_GROUP_CREATE_TOOLTIP :{BLACK}Kliknij STR_GROUP_DELETE_TOOLTIP :{BLACK}Usuń zaznaczoną grupę STR_GROUP_RENAME_TOOLTIP :{BLACK}Zmień nazwę zaznaczonej grupy STR_GROUP_LIVERY_TOOLTIP :{BLACK}Zmień kolor zaznaczonej grupy -STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Kliknij, aby ochronić tę grupę przed globalną zamianą pojazdów +STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Kliknij, aby chronić tę grupę przed globalną zamianą pojazdów. Ctrl+klik, aby chronić również podgrupy STR_QUERY_GROUP_DELETE_CAPTION :{WHITE}Skasuj grupę STR_GROUP_DELETE_QUERY_TEXT :{WHITE}Jesteś pewien, że chcesz skasować tę grupę i wszystkich jej członków? @@ -4166,7 +4220,9 @@ STR_REPLACE_MAGLEV_VEHICLES :Kolej Maglev STR_REPLACE_ROAD_VEHICLES :Pojazdy drogowe STR_REPLACE_TRAM_VEHICLES :Tramwaje +STR_REPLACE_REMOVE_WAGON :{BLACK}Usunięcie wagonów: ({STRING}): {ORANGE}{STRING} STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Autowymiana zachowuje długość pociągu poprzez usuwanie wagonów (począwszy od początku), jeśli wymiana lokomotywy spowoduje wydłużenie pociągu +STR_REPLACE_REMOVE_WAGON_GROUP_HELP :{STRING}. Ctrl+klik, aby zastosować również do podgrup # Vehicle view STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE} diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 1408228718..da3fc205cf 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -790,6 +790,8 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * E STR_STATUSBAR_AUTOSAVE :{RED}AUTOGUARDADO STR_STATUSBAR_SAVING_GAME :{RED}* * A GUARDAR JOGO * * +STR_STATUSBAR_SPECATOR :{WHITE}(espectador) + # News message history STR_MESSAGE_HISTORY :{WHITE}Histórico de Mensagens STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Lista de notícias recentes @@ -1446,6 +1448,12 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Duplo clique STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Clique simples (quando em foco) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Clique (imediatamente) +STR_CONFIG_SETTING_USE_RELAY_SERVICE :Usar serviço de retransmissão: {STRING} +STR_CONFIG_SETTING_USE_RELAY_SERVICE_HELPTEXT :Se a criação da ligação com o servidor falhar, pode usar um serviço de retransmissão para criar uma conexão. "Nunca" desautoriza isso; "perguntar" perguntará primeiro e "permitir" permitirá sem perguntar +STR_CONFIG_SETTING_USE_RELAY_SERVICE_NEVER :Nunca +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ASK :Perguntar +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ALLOW :Permitir + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Emulação de clique de botão direito: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Selecione o método de emulação dos cliques do botão direito do rato STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND : + Clique @@ -1798,6 +1806,7 @@ STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :{ORANGE}Industr STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :{ORANGE}Distribuição de Carga STR_CONFIG_SETTING_AI :{ORANGE}Oponentes STR_CONFIG_SETTING_AI_NPC :{ORANGE}Jogadores Computador +STR_CONFIG_SETTING_NETWORK :{ORANGE}Rede STR_CONFIG_SETTING_PATHFINDER_NPF :NPF STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Recomendado) @@ -2079,39 +2088,11 @@ STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Escolha STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} empresa{P "" s} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Máximo de empresas: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Limitar o servidor a um certo número de empresas -STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} espectador{P "" es} -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Máximo de espectadores: -STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Limitar o servidor a um certo número de espectadores STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Idioma falado: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Outros jogadores ficarão a conhecer o idioma utilizado no servidor. STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Digite nome para o jogo de rede -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Sala de espera de jogo multi-jogador - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Preparando para entrar: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Lista das empresas activas neste jogo. Pode entrar numa delas ou iniciar uma nova empresa. - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}INFORMAÇÃO DA EMPRESA -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Nome da empresa: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Inauguração: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Valor da empresa: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Balanço actual: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Rendimento do último ano: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Desempenho: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Veículos: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Estações: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Jogadores: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Nova empresa -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Criar uma nova empresa -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Observar jogo -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Ver jogo como um espectador -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Entrar na empresa -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Auxiliar na gestão desta empresa - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}A ligar... @@ -2174,6 +2155,8 @@ STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT :{BLACK}{NUM} cl STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_UNKNOWN :{BLACK}Local STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_ISOLATED :{RED}Jogadores remotos não conseguem conetar STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_DIRECT :{BLACK}Público +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_STUN :{BLACK}Atrás de NAT +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TURN :{BLACK}Via retransmissão ############ End of ConnectionType STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :Expulsar @@ -2187,6 +2170,12 @@ STR_NETWORK_CLIENT_LIST_ASK_CLIENT_BAN :{YELLOW}Tem a c STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Tem a certeza que quer apagar a empresa '{COMPANY}'? STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Tem a certeza que quer restabelecer a palavra-chave da empresa '{COMPANY}'? +STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}Usar retransmissão? +STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}Falha ao estabelecer a ligação entre si e o servidor.{}Deseja retransmitir esta sessão via '{STRING}'? +STR_NETWORK_ASK_RELAY_NO :{BLACK}Não +STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Sim, desta vez +STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Sim, não perguntar novamente + STR_NETWORK_SERVER :Servidor STR_NETWORK_CLIENT :Cliente STR_NETWORK_SPECTATORS :Espectadores diff --git a/src/lang/romanian.txt b/src/lang/romanian.txt index d69ba0d275..0910399901 100644 --- a/src/lang/romanian.txt +++ b/src/lang/romanian.txt @@ -93,25 +93,37 @@ STR_CARGO_SINGULAR_FIZZY_DRINK :Suc acidulat # Quantity of cargo STR_QUANTITY_NOTHING : +STR_QUANTITY_PASSENGERS :{COMMA}{NBSP}{P călător călători "de călătorii"} STR_QUANTITY_COAL :{WEIGHT_LONG} de cărbune +STR_QUANTITY_MAIL :{COMMA}{NBSP}{P sac saci "de saci"} cu colete poștale STR_QUANTITY_OIL :{VOLUME_LONG} de petrol +STR_QUANTITY_LIVESTOCK :{COMMA}{NBSP}{P animal animale "de animale"} +STR_QUANTITY_GOODS :{COMMA}{NBSP}{P pachet pachete "de pachete"} 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}{NBSP}{P sac saci "de saci"} 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} {P sac saci "de saci"} cu diamante STR_QUANTITY_FOOD :{WEIGHT_LONG} de alimente STR_QUANTITY_PAPER :{WEIGHT_LONG} de hârtie +STR_QUANTITY_GOLD :{COMMA}{NBSP}{P sac saci "de saci"} 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}{NBSP}{P sac saci "de saci"} cu jucării +STR_QUANTITY_SWEETS :{COMMA}{NBSP}{P sac saci "de saci"} cu bomboane STR_QUANTITY_COLA :{VOLUME_LONG} de cola STR_QUANTITY_CANDYFLOSS :{WEIGHT_LONG} de vată de zahăr +STR_QUANTITY_BUBBLES :{COMMA} {P balonaș balonașe "de balonașe"} STR_QUANTITY_TOFFEE :{WEIGHT_LONG} de caramel +STR_QUANTITY_BATTERIES :{COMMA} {P baterie baterii "de baterii"} STR_QUANTITY_PLASTIC :{VOLUME_LONG} de plastic +STR_QUANTITY_FIZZY_DRINKS :{COMMA} {P bidon bidoane "de bidoane"} cu suc STR_QUANTITY_N_A :N/A # Two letter abbreviation of cargo name @@ -151,10 +163,12 @@ STR_ABBREV_NONE :{TINY_FONT}NU STR_ABBREV_ALL :{TINY_FONT}TOT # 'Mode' of transport for cargoes +STR_PASSENGERS :{COMMA}{NBSP}{P călător călători "de călători"} 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}{NBSP}{P pachet pachete "de pachete"} # Colours, do not shuffle STR_COLOUR_DARK_BLUE :Albastru închis @@ -195,12 +209,16 @@ 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}{NBSP}{P tonă tone "de tone"} +STR_UNITS_WEIGHT_LONG_METRIC :{COMMA}{NBSP}{P tonă tone "de tone"} 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}{NBSP}{P galon galoane "de galoane"} +STR_UNITS_VOLUME_LONG_METRIC :{COMMA}{NBSP}{P litru litri "de litri"} STR_UNITS_VOLUME_LONG_SI :{COMMA} m³ STR_UNITS_FORCE_IMPERIAL :{COMMA} lbf @@ -767,6 +785,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * P STR_STATUSBAR_AUTOSAVE :{RED}SALVARE AUTOMATĂ STR_STATUSBAR_SAVING_GAME :{RED}* * SALVARE JOC * * + # News message history STR_MESSAGE_HISTORY :{WHITE}Cronologia mesajelor STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}O listă a celor mai recente mesaje @@ -866,6 +885,11 @@ STR_NEWS_STATION_NOW_ACCEPTS_CARGO_AND_CARGO :{WHITE}{STATION STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}Ofertă expirată:{}{}Transportul de {STRING} de la {STRING} la {STRING} nu va mai fi subvenţionat STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Ofertă retrasă:{}{}Transportul de {STRING} de la {STRING} la {STRING} nu va mai fi subvenţionat +STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIG_FONT}{BLACK}Subvenţie oferită:{}{}Primul transport de {STRING} de la {STRING} la {STRING} va primi o subvenţie pe {NUM} {P an ani "de ani"} din partea autorităţilor locale! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}Subvenţie acordată companiei {STRING}!{}{}Transportul de {STRING} de la {STRING} la {STRING} va aduce încasări cu 50% mai mari în următor{P 4 ul ii ii} {NUM} {P an ani "de ani"}! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLACK}Subvenţie acordată companiei {STRING}!{}{}Transportul de {STRING} de la {STRING} la {STRING} va aduce încasări duble în următor{P 4 ul ii ii} {NUM} {P an ani "de ani"}! +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 în următor{P 4 ul ii ii} {NUM} {P an ani "de ani"}! +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 în următor{P 4 ul ii ii} {NUM} {P an ani "de ani"}! 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! @@ -923,6 +947,7 @@ STR_GAME_OPTIONS_CURRENCY_MXN :Peso Mexican (M 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_IDR :Rupia indoneziană (IDR) STR_GAME_OPTIONS_CURRENCY_MYR :Ringgit Malaysian (MYR) ############ end of currency region @@ -1008,6 +1033,7 @@ STR_GAME_OPTIONS_REFRESH_RATE_WARNING :{WHITE}Ratele d 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} {P fișier fișiere "de fișiere"} lipsă/corupt{P "" e 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ă @@ -1016,6 +1042,7 @@ 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} {P fișier fișiere "de fișiere"} corupt{P "" e 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 @@ -1119,6 +1146,7 @@ STR_CONFIG_SETTING_TYPE_GAME_MENU :Setări joc (st STR_CONFIG_SETTING_TYPE_GAME_INGAME :Setări joc (stocate în fişierul de salvare; afectează doar jocul curent) STR_CONFIG_SETTING_TYPE_COMPANY_MENU :Setări companie (stocate în fişierele de salvare; afectează doar jocurile noi) STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :Setări companie (stocate în fişierul de salvare; afectează doar compania curentă) +STR_CONFIG_SETTING_RESET_ALL_CONFIRMATION_DIALOG_CAPTION :{WHITE}Atenție! STR_CONFIG_SETTING_RESTRICT_CATEGORY :{BLACK}Categorie: STR_CONFIG_SETTING_RESTRICT_TYPE :{BLACK}Tip: @@ -1168,6 +1196,7 @@ STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS :Defecțiuni ale STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT :Controlează cât de des se defectează vehiculele prost întreținute STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER :Multiplicator al subvențiilor: {STRING} STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT :Alege cât de mult se plătește pentru conexiuni subvenționate +STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{NUM} {P an ani "de ani"} STR_CONFIG_SETTING_CONSTRUCTION_COSTS :Costuri de construcție: {STRING} STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Alege nivelul de construcție și costurile de achiziție STR_CONFIG_SETTING_RECESSIONS :Recesiuni: {STRING} @@ -1192,6 +1221,7 @@ 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 0 pătrățel pătrățele "de pătrățele"} 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} @@ -1292,12 +1322,16 @@ 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 :{COMMA} {P 0 lună luni "de luni"} până la +STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_AFTER :{COMMA} {P 0 lună luni "de luni"} 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} {P 0 secundă secunde "de secunde"} 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} {P 0 milisecundă milisecunde "de milisecunde"} 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ă @@ -1360,6 +1394,7 @@ 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_DEFAULT :Mută fereastra de vizualizare ținând apăsat click dreapta, poziția cursorului rămânând fixă 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 @@ -1388,6 +1423,8 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Click dublu STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Un singur click (când este în focus) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Un singur click (instant) +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ALLOW :Permite + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Emulare click-dreapta: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Alege metoda de emulare a click-urilor provenite de la butonul din dreapta al mouse-ului STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Comandă+Click @@ -1496,6 +1533,7 @@ STR_CONFIG_SETTING_SERVINT_ISPERCENT :Intervaluri de 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} {P 0 zi zile "de zile"}/% 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 @@ -1562,6 +1600,7 @@ STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Procentul din p 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 mausul +STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} {P 0 pătrățel pătrățele "de pătrățele"} 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 @@ -1612,6 +1651,7 @@ STR_CONFIG_SETTING_TOOLBAR_POS_HELPTEXT :Poziţia orizon 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} {P 0 pixel pixeli "de pixeli"} 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} @@ -1626,6 +1666,7 @@ 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_MIN :4x 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 @@ -1641,7 +1682,9 @@ 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}{NBSP}{P 0:2 zi zile "de zile"} 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_LINKGRAPH_TIME :Acordă {STRING}{NBSP}{P 0:2 zi zile "de zile"} pentru recalcularea graficului de distribuţie STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :manual STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC :asimetric STR_CONFIG_SETTING_DISTRIBUTION_SYMMETRIC :simetric @@ -1794,6 +1837,8 @@ 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_BASESET :{BLACK}Setul grafic actual are lipsă {NUM} {P sprite spriteuri "de spriteuri"}. Verificați actualizările pentru setul de bază. +STR_INTRO_TRANSLATION :{BLACK}Acestei traduceri îi lipse{P 0 "şte" "sc" "sc"} {NUM} {P text texte "de texte"}. 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 @@ -1920,6 +1965,7 @@ STR_FACE_EARRING :Cercei: STR_FACE_TIE_EARRING_TOOLTIP :{BLACK}Schimbă cravata sau cerceii ############ Next lines match ServerGameType +STR_NETWORK_SERVER_VISIBILITY_PUBLIC :Public ############ End of leave-in-this-order # Network server list @@ -1969,7 +2015,7 @@ STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET_TOOLTIP :{BLACK}Caută s 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_ADD_SERVER_TOOLTIP :{BLACK}Adaugă un server la listă. Poate să fie ori o adresă de server, ori un cod de invitație STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Porneşte serverul STR_NETWORK_SERVER_LIST_START_SERVER_TOOLTIP :{BLACK}Porneşte un server propriu @@ -1985,42 +2031,17 @@ STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Protejea STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Vizibilitate STR_NETWORK_START_SERVER_VISIBILITY_TOOLTIP :{BLACK}Dacă alți oameni îți pot vedea serverul în lista publică +STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} {P client clienţi "de clienț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} {P companie companii "de companii"} 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_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ă: STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Ceilalţi jucători vor şti în ce limbă se discută pe server. STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Introduceţi un nume pentru joc -# Network game lobby -STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Chatul jocului multiplayer - -STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}În pregătire pentru joc: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Lista companiilor din jocul curent. Poţi colabora cu o companie sau să infiinţezi una - -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}INFO COMPANIE -STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Numele companiei: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Inaugurarea: {WHITE}{NUM} -STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Valoarea companiei: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Balanţa curentă: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Venituri anul trecut: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Performanţa: {WHITE}{NUM} - -STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Vehicule: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Staţii: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} -STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Jucători: {WHITE}{STRING} - -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Companie nouă -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Fondează o companie nouă -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Modul spectator -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Vizionează jocul din poziţia de spectator -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Alătură-te companiei -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Ajută la conducerea acestei companii - # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Conectare... @@ -2035,6 +2056,7 @@ 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} {P client clienți "de clienți"} înaintea ta 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 @@ -2053,16 +2075,21 @@ STR_NETWORK_CLIENT_LIST_SERVER_NAME_EDIT_TOOLTIP :{BLACK}Modific STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY :{BLACK}Vizibilitate STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY_TOOLTIP :{BLACK}Dacă alți oameni îți pot vedea serverul în lista publică STR_NETWORK_CLIENT_LIST_PLAYER_NAME_EDIT_TOOLTIP :{BLACK}Modifică-ți numele +STR_NETWORK_CLIENT_LIST_PLAYER_NAME_QUERY_CAPTION :Numele tău de jucător STR_NETWORK_CLIENT_LIST_CHAT_COMPANY_TOOLTIP :{BLACK}Trimite un mesaj tuturor jucătorilor acestei companii STR_NETWORK_CLIENT_LIST_CHAT_SPECTATOR_TOOLTIP :{BLACK}Trimite un mesaj tuturor spectatorilor ############ Begin of ConnectionType +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_DIRECT :{BLACK}Public ############ End of ConnectionType STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_UNLOCK :Deblocare cu parolă STR_NETWORK_CLIENT_LIST_ASK_CLIENT_KICK :{YELLOW}Sigur vrei să dai afară jucătorul '{STRING}'? STR_NETWORK_CLIENT_LIST_ASK_CLIENT_BAN :{YELLOW}Sigur vrei să blochezi jucătorul '{STRING}'? +STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Sigur dorești ștergerea companiei '{COMPANY}'? + +STR_NETWORK_ASK_RELAY_NO :{BLACK}Nu STR_NETWORK_SERVER :Server STR_NETWORK_CLIENT :Client @@ -2544,6 +2571,7 @@ STR_FUND_INDUSTRY_CAPTION :{WHITE}Construi STR_FUND_INDUSTRY_SELECTION_TOOLTIP :{BLACK}Alege industria potrivită din acestă listă STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES :{BLACK}Creează multe industrii aleatoare STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_TOOLTIP :{BLACK}Umple harta cu industrii generate aleator +STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_CAPTION :{WHITE}Creează multe industrii aleatoare STR_FUND_INDUSTRY_INDUSTRY_BUILD_COST :{BLACK}Cost: {YELLOW}{CURRENCY_LONG} STR_FUND_INDUSTRY_PROSPECT_NEW_INDUSTRY :{BLACK}Prospectează STR_FUND_INDUSTRY_BUILD_NEW_INDUSTRY :{BLACK}Construieşte @@ -2705,6 +2733,7 @@ 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_MS_WARN :{YELLOW}{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 @@ -2756,6 +2785,7 @@ STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA} 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_OVERWRITE_WARNING :{YELLOW}Sigur vrei să suprascrii fișierul existent? STR_SAVELOAD_DIRECTORY :{STRING} (listă) STR_SAVELOAD_OSKTITLE :{BLACK}Introduceţi un nume pentru salvare @@ -3005,6 +3035,7 @@ STR_INVALID_VEHICLE : +#include #include "core/math_func.hpp" #include "framerate_type.h" #include "settings_type.h" #include "safeguards.h" -#include "mixer.h" +#include "mixer.h" struct MixerChannel { bool active; @@ -39,6 +40,7 @@ static MixerChannel _channels[8]; static uint32 _play_rate = 11025; static uint32 _max_size = UINT_MAX; static MxStreamCallback _music_stream = nullptr; +static std::mutex _music_stream_mutex; /** * The theoretical maximum volume for a single sound sample. Multiple sound @@ -152,8 +154,11 @@ void MxMixSamples(void *buffer, uint samples) /* Clear the buffer */ memset(buffer, 0, sizeof(int16) * 2 * samples); - /* Fetch music if a sampled stream is available */ - if (_music_stream) _music_stream((int16*)buffer, samples); + { + std::lock_guard lock{ _music_stream_mutex }; + /* 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 @@ -227,22 +232,24 @@ void MxSetChannelVolume(MixerChannel *mc, uint volume, float pan) void MxActivateChannel(MixerChannel *mc) { mc->active = true; -} - -/** - * Set source of PCM music - * @param music_callback Function that will be called to fill sample buffers with music data. - * @return Sample rate of mixer, which the buffers supplied to the callback must be rendered at. - */ -uint32 MxSetMusicSource(MxStreamCallback music_callback) -{ - _music_stream = music_callback; - return _play_rate; +} + +/** + * Set source of PCM music + * @param music_callback Function that will be called to fill sample buffers with music data. + * @return Sample rate of mixer, which the buffers supplied to the callback must be rendered at. + */ +uint32 MxSetMusicSource(MxStreamCallback music_callback) +{ + std::lock_guard lock{ _music_stream_mutex }; + _music_stream = music_callback; + return _play_rate; } bool MxInitialize(uint rate) { + std::lock_guard lock{ _music_stream_mutex }; _play_rate = rate; _max_size = UINT_MAX / _play_rate; _music_stream = nullptr; /* rate may have changed, any music source is now invalid */ diff --git a/src/network/CMakeLists.txt b/src/network/CMakeLists.txt index 8b01579189..ac500a22cf 100644 --- a/src/network/CMakeLists.txt +++ b/src/network/CMakeLists.txt @@ -26,6 +26,8 @@ add_files( network_server.h network_stun.cpp network_stun.h + network_turn.cpp + network_turn.h network_type.h network_udp.cpp network_udp.h diff --git a/src/network/core/CMakeLists.txt b/src/network/core/CMakeLists.txt index bcecad38c8..756fa9e8f3 100644 --- a/src/network/core/CMakeLists.txt +++ b/src/network/core/CMakeLists.txt @@ -30,6 +30,8 @@ add_files( tcp_listen.h tcp_stun.cpp tcp_stun.h + tcp_turn.cpp + tcp_turn.h udp.cpp udp.h ) diff --git a/src/network/core/config.h b/src/network/core/config.h index e12f8b1696..68b5d10060 100644 --- a/src/network/core/config.h +++ b/src/network/core/config.h @@ -22,6 +22,7 @@ static const char * const NETWORK_CONTENT_MIRROR_URL = "/bananas"; static const uint16 NETWORK_COORDINATOR_SERVER_PORT = 3976; ///< The default port of the Game Coordinator server (TCP) static const uint16 NETWORK_STUN_SERVER_PORT = 3975; ///< The default port of the STUN server (TCP) +static const uint16 NETWORK_TURN_SERVER_PORT = 3974; ///< The default port of the TURN server (TCP) static const uint16 NETWORK_CONTENT_SERVER_PORT = 3978; ///< The default port of the content server (TCP) static const uint16 NETWORK_CONTENT_MIRROR_PORT = 80; ///< The default port of the content mirror (TCP) static const uint16 NETWORK_DEFAULT_PORT = 3979; ///< The default port of the game server (TCP & UDP) @@ -48,9 +49,9 @@ static const uint16 TCP_MTU = 32767; ///< Numbe static const uint16 COMPAT_MTU = 1460; ///< Number of bytes we can pack in a single packet for backward compatibility static const byte NETWORK_GAME_ADMIN_VERSION = 1; ///< What version of the admin network do we use? -static const byte NETWORK_GAME_INFO_VERSION = 5; ///< What version of game-info do we use? +static const byte NETWORK_GAME_INFO_VERSION = 6; ///< What version of game-info do we use? static const byte NETWORK_COMPANY_INFO_VERSION = 6; ///< What version of company info is this? -static const byte NETWORK_COORDINATOR_VERSION = 3; ///< What version of game-coordinator-protocol do we use? +static const byte NETWORK_COORDINATOR_VERSION = 5; ///< What version of game-coordinator-protocol do we use? static const uint NETWORK_NAME_LENGTH = 80; ///< The maximum length of the server name and map name, in bytes including '\0' static const uint NETWORK_COMPANY_NAME_LENGTH = 128; ///< The maximum length of the company name, in bytes including '\0' @@ -95,14 +96,4 @@ static const uint NETWORK_GRF_NAME_LENGTH = 80; ///< Maxim */ static const uint NETWORK_MAX_GRF_COUNT = 255; -/** - * The number of landscapes in OpenTTD. - * This number must be equal to NUM_LANDSCAPE, but as this number is used - * within the network code and that the network code is shared with the - * masterserver/updater, it has to be declared in here too. In network.cpp - * there is a compile assertion to check that this NUM_LANDSCAPE is equal - * to NETWORK_NUM_LANDSCAPES. - */ -static const uint NETWORK_NUM_LANDSCAPES = 4; - #endif /* NETWORK_CORE_CONFIG_H */ diff --git a/src/network/core/core.h b/src/network/core/core.h index 3e470ef5f1..84d5b62013 100644 --- a/src/network/core/core.h +++ b/src/network/core/core.h @@ -71,8 +71,6 @@ public: * Reopen the socket so we can send/receive stuff again. */ void Reopen() { this->has_quit = false; } - - void SendCompanyInformation(Packet *p, const struct Company *c, const struct NetworkCompanyStats *stats, uint max_len = NETWORK_COMPANY_NAME_LENGTH); }; #endif /* NETWORK_CORE_CORE_H */ diff --git a/src/network/core/game_info.cpp b/src/network/core/game_info.cpp index 294b552681..a1062bbc08 100644 --- a/src/network/core/game_info.cpp +++ b/src/network/core/game_info.cpp @@ -134,7 +134,6 @@ void FillStaticNetworkServerGameInfo() _network_game_info.start_date = ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1); _network_game_info.clients_max = _settings_client.network.max_clients; _network_game_info.companies_max = _settings_client.network.max_companies; - _network_game_info.spectators_max = _settings_client.network.max_spectators; _network_game_info.map_width = MapSizeX(); _network_game_info.map_height = MapSizeY(); _network_game_info.landscape = _settings_game.game_creation.landscape; @@ -167,17 +166,15 @@ const NetworkServerGameInfo *GetCurrentNetworkServerGameInfo() * a NetworkGameInfo. Only grfid and md5sum are set, the rest is zero. This * function must set all appropriate fields. This GRF is later appended to * the grfconfig list of the NetworkGameInfo. - * @param config the GRF to handle. + * @param config The GRF to handle. + * @param name The name of the NewGRF, empty when unknown. */ -static void HandleIncomingNetworkGameInfoGRFConfig(GRFConfig *config) +static void HandleIncomingNetworkGameInfoGRFConfig(GRFConfig *config, std::string name) { /* Find the matching GRF file */ const GRFConfig *f = FindGRFConfig(config->ident.grfid, FGCM_EXACT, config->ident.md5sum); if (f == nullptr) { - /* Don't know the GRF, so mark game incompatible and the (possibly) - * already resolved name for this GRF (another server has sent the - * name of the GRF already */ - config->name = FindUnknownGRFName(config->ident.grfid, config->ident.md5sum, true); + AddGRFTextToList(config->name, name.empty() ? GetString(STR_CONFIG_ERROR_INVALID_GRF_UNKNOWN) : name); config->status = GCS_NOT_FOUND; } else { config->filename = f->filename; @@ -193,7 +190,7 @@ static void HandleIncomingNetworkGameInfoGRFConfig(GRFConfig *config) * @param p the packet to write the data to. * @param info the NetworkGameInfo struct to serialize from. */ -void SerializeNetworkGameInfo(Packet *p, const NetworkServerGameInfo *info) +void SerializeNetworkGameInfo(Packet *p, const NetworkServerGameInfo *info, bool send_newgrf_names) { p->Send_uint8 (NETWORK_GAME_INFO_VERSION); @@ -205,6 +202,9 @@ void SerializeNetworkGameInfo(Packet *p, const NetworkServerGameInfo *info) /* Update the documentation in game_info.h on changes * to the NetworkGameInfo wire-protocol! */ + /* NETWORK_GAME_INFO_VERSION = 6 */ + p->Send_uint8(send_newgrf_names ? NST_GRFID_MD5_NAME : NST_GRFID_MD5); + /* NETWORK_GAME_INFO_VERSION = 5 */ GameInfo *game_info = Game::GetInfo(); p->Send_uint32(game_info == nullptr ? -1 : (uint32)game_info->GetVersion()); @@ -226,16 +226,11 @@ void SerializeNetworkGameInfo(Packet *p, const NetworkServerGameInfo *info) p->Send_uint8(std::min(count, NETWORK_MAX_GRF_COUNT)); // Send number of GRFs /* Send actual GRF Identifications */ - uint index = 0; for (c = info->grfconfig; c != nullptr; c = c->next) { - if (!HasBit(c->flags, GCF_STATIC)) { - if (index >= NETWORK_MAX_GRF_COUNT) { - break; - } else { - SerializeGRFIdentifier(p, &c->ident); - } - index++; - } + if (HasBit(c->flags, GCF_STATIC)) continue; + + SerializeGRFIdentifier(p, &c->ident); + if (send_newgrf_names) p->Send_string(c->GetName()); } } @@ -246,17 +241,15 @@ void SerializeNetworkGameInfo(Packet *p, const NetworkServerGameInfo *info) /* NETWORK_GAME_INFO_VERSION = 2 */ p->Send_uint8 (info->companies_max); p->Send_uint8 (info->companies_on); - p->Send_uint8 (info->spectators_max); + p->Send_uint8 (info->clients_max); // Used to be max-spectators /* NETWORK_GAME_INFO_VERSION = 1 */ p->Send_string(info->server_name); p->Send_string(info->server_revision); - p->Send_uint8 (0); // Used to be server-lang. p->Send_bool (info->use_password); p->Send_uint8 (info->clients_max); p->Send_uint8 (info->clients_on); p->Send_uint8 (info->spectators_on); - p->Send_string(""); // Used to be map-name. p->Send_uint16(info->map_width); p->Send_uint16(info->map_height); p->Send_uint8 (info->landscape); @@ -268,15 +261,17 @@ void SerializeNetworkGameInfo(Packet *p, const NetworkServerGameInfo *info) * @param p the packet to write the data to * @param info the NetworkGameInfo struct to serialize */ -void SerializeNetworkGameInfoExtended(Packet *p, const NetworkServerGameInfo *info, uint16 flags, uint16 version) +void SerializeNetworkGameInfoExtended(Packet *p, const NetworkServerGameInfo *info, uint16 flags, uint16 version, bool send_newgrf_names) { - p->Send_uint8(0); // version num + version = std::max(version, 1); // Version 1 is the max supported + + p->Send_uint8(version); // version num p->Send_uint32(info->game_date); p->Send_uint32(info->start_date); p->Send_uint8 (info->companies_max); p->Send_uint8 (info->companies_on); - p->Send_uint8 (info->spectators_max); + p->Send_uint8 (info->clients_max); // Used to be max-spectators p->Send_string(info->server_name); p->Send_string(info->server_revision); p->Send_uint8 (0); // Used to be server-lang. @@ -290,6 +285,14 @@ void SerializeNetworkGameInfoExtended(Packet *p, const NetworkServerGameInfo *in p->Send_uint8 (info->landscape); p->Send_bool (info->dedicated); + if (version >= 1) { + GameInfo *game_info = Game::GetInfo(); + p->Send_uint32(game_info == nullptr ? -1 : (uint32)game_info->GetVersion()); + p->Send_string(game_info == nullptr ? "" : game_info->GetName()); + + p->Send_uint8(send_newgrf_names ? NST_GRFID_MD5_NAME : NST_GRFID_MD5); + } + { /* Only send the GRF Identification (GRF_ID and MD5 checksum) of * the GRFs that are needed, i.e. the ones that the server has @@ -306,9 +309,10 @@ void SerializeNetworkGameInfoExtended(Packet *p, const NetworkServerGameInfo *in /* Send actual GRF Identifications */ for (c = info->grfconfig; c != nullptr; c = c->next) { - if (!HasBit(c->flags, GCF_STATIC)) { - SerializeGRFIdentifier(p, &c->ident); - } + if (HasBit(c->flags, GCF_STATIC)) continue; + + SerializeGRFIdentifier(p, &c->ident); + if (send_newgrf_names && version >= 1) p->Send_string(c->GetName()); } } } @@ -318,11 +322,12 @@ void SerializeNetworkGameInfoExtended(Packet *p, const NetworkServerGameInfo *in * @param p the packet to read the data from. * @param info the NetworkGameInfo to deserialize into. */ -void DeserializeNetworkGameInfo(Packet *p, NetworkGameInfo *info) +void DeserializeNetworkGameInfo(Packet *p, NetworkGameInfo *info, const GameInfoNewGRFLookupTable *newgrf_lookup_table) { static const Date MAX_DATE = ConvertYMDToDate(MAX_YEAR, 11, 31); // December is month 11 byte game_info_version = p->Recv_uint8(); + NewGRFSerializationType newgrf_serialisation = NST_GRFID_MD5; /* * Please observe the order. @@ -333,6 +338,11 @@ void DeserializeNetworkGameInfo(Packet *p, NetworkGameInfo *info) * to the NetworkGameInfo wire-protocol! */ switch (game_info_version) { + case 6: + newgrf_serialisation = (NewGRFSerializationType)p->Recv_uint8(); + if (newgrf_serialisation >= NST_END) return; + FALLTHROUGH; + case 5: { info->gamescript_version = (int)p->Recv_uint32(); info->gamescript_name = p->Recv_string(NETWORK_NAME_LENGTH); @@ -348,9 +358,31 @@ void DeserializeNetworkGameInfo(Packet *p, NetworkGameInfo *info) if (num_grfs > NETWORK_MAX_GRF_COUNT) return; for (i = 0; i < num_grfs; i++) { + NamedGRFIdentifier grf; + switch (newgrf_serialisation) { + case NST_GRFID_MD5: + DeserializeGRFIdentifier(p, &grf.ident); + break; + + case NST_GRFID_MD5_NAME: + DeserializeGRFIdentifierWithName(p, &grf); + break; + + case NST_LOOKUP_ID: { + if (newgrf_lookup_table == nullptr) return; + auto it = newgrf_lookup_table->find(p->Recv_uint32()); + if (it == newgrf_lookup_table->end()) return; + grf = it->second; + break; + } + + default: + NOT_REACHED(); + } + GRFConfig *c = new GRFConfig(); - DeserializeGRFIdentifier(p, &c->ident); - HandleIncomingNetworkGameInfoGRFConfig(c); + c->ident = grf.ident; + HandleIncomingNetworkGameInfoGRFConfig(c, grf.name); /* Append GRFConfig to the list */ *dst = c; @@ -367,13 +399,13 @@ void DeserializeNetworkGameInfo(Packet *p, NetworkGameInfo *info) case 2: info->companies_max = p->Recv_uint8 (); info->companies_on = p->Recv_uint8 (); - info->spectators_max = p->Recv_uint8 (); + p->Recv_uint8(); // Used to contain max-spectators. FALLTHROUGH; case 1: info->server_name = p->Recv_string(NETWORK_NAME_LENGTH); info->server_revision = p->Recv_string(NETWORK_REVISION_LENGTH); - p->Recv_uint8 (); // Used to contain server-lang. + if (game_info_version < 6) p->Recv_uint8 (); // Used to contain server-lang. info->use_password = p->Recv_bool (); info->clients_max = p->Recv_uint8 (); info->clients_on = p->Recv_uint8 (); @@ -382,13 +414,13 @@ void DeserializeNetworkGameInfo(Packet *p, NetworkGameInfo *info) info->game_date = p->Recv_uint16() + DAYS_TILL_ORIGINAL_BASE_YEAR; info->start_date = p->Recv_uint16() + DAYS_TILL_ORIGINAL_BASE_YEAR; } - while (p->Recv_uint8() != 0) {} // Used to contain the map-name. + if (game_info_version < 6) while (p->Recv_uint8() != 0) {} // Used to contain the map-name. info->map_width = p->Recv_uint16(); info->map_height = p->Recv_uint16(); info->landscape = p->Recv_uint8 (); info->dedicated = p->Recv_bool (); - if (info->landscape >= NETWORK_NUM_LANDSCAPES) info->landscape = 0; + if (info->landscape >= NUM_LANDSCAPE) info->landscape = 0; } } @@ -402,13 +434,15 @@ void DeserializeNetworkGameInfoExtended(Packet *p, NetworkGameInfo *info) static const Date MAX_DATE = ConvertYMDToDate(MAX_YEAR, 11, 31); // December is month 11 const uint8 version = p->Recv_uint8(); - if (version > 0) return; // Unknown version + if (version > 1) return; // Unknown version + + NewGRFSerializationType newgrf_serialisation = NST_GRFID_MD5; info->game_date = Clamp(p->Recv_uint32(), 0, MAX_DATE); info->start_date = Clamp(p->Recv_uint32(), 0, MAX_DATE); info->companies_max = p->Recv_uint8 (); info->companies_on = p->Recv_uint8 (); - info->spectators_max = p->Recv_uint8 (); + p->Recv_uint8(); // Used to contain max-spectators. info->server_name = p->Recv_string(NETWORK_NAME_LENGTH); info->server_revision = p->Recv_string(NETWORK_LONG_REVISION_LENGTH); p->Recv_uint8 (); // Used to contain server-lang. @@ -420,8 +454,17 @@ void DeserializeNetworkGameInfoExtended(Packet *p, NetworkGameInfo *info) info->map_width = p->Recv_uint32(); info->map_height = p->Recv_uint32(); info->landscape = p->Recv_uint8 (); + if (info->landscape >= NUM_LANDSCAPE) info->landscape = 0; info->dedicated = p->Recv_bool (); + if (version >= 1) { + info->gamescript_version = (int)p->Recv_uint32(); + info->gamescript_name = p->Recv_string(NETWORK_NAME_LENGTH); + + newgrf_serialisation = (NewGRFSerializationType)p->Recv_uint8(); + if (newgrf_serialisation >= NST_END) return; + } + { GRFConfig **dst = &info->grfconfig; uint i; @@ -431,17 +474,34 @@ void DeserializeNetworkGameInfoExtended(Packet *p, NetworkGameInfo *info) if (num_grfs > MAX_NON_STATIC_GRF_COUNT) return; for (i = 0; i < num_grfs; i++) { + NamedGRFIdentifier grf; + switch (newgrf_serialisation) { + case NST_GRFID_MD5: + DeserializeGRFIdentifier(p, &grf.ident); + break; + + case NST_GRFID_MD5_NAME: + DeserializeGRFIdentifierWithName(p, &grf); + break; + + case NST_LOOKUP_ID: { + DEBUG(net, 0, "Unexpected NST_LOOKUP_ID in DeserializeNetworkGameInfoExtended"); + return; + } + + default: + NOT_REACHED(); + } + GRFConfig *c = new GRFConfig(); - DeserializeGRFIdentifier(p, &c->ident); - HandleIncomingNetworkGameInfoGRFConfig(c); + c->ident = grf.ident; + HandleIncomingNetworkGameInfoGRFConfig(c, grf.name); /* Append GRFConfig to the list */ *dst = c; dst = &c->next; } } - - if (info->landscape >= NETWORK_NUM_LANDSCAPES) info->landscape = 0; } /** @@ -471,3 +531,14 @@ void DeserializeGRFIdentifier(Packet *p, GRFIdentifier *grf) grf->md5sum[j] = p->Recv_uint8(); } } + +/** + * Deserializes the NamedGRFIdentifier (GRF ID, MD5 checksum and name) from the packet + * @param p the packet to read the data from. + * @param grf the NamedGRFIdentifier to deserialize. + */ +void DeserializeGRFIdentifierWithName(Packet *p, NamedGRFIdentifier *grf) +{ + DeserializeGRFIdentifier(p, &grf->ident); + grf->name = p->Recv_string(NETWORK_GRF_NAME_LENGTH); +} diff --git a/src/network/core/game_info.h b/src/network/core/game_info.h index ead7e0bbce..ec4c8aab99 100644 --- a/src/network/core/game_info.h +++ b/src/network/core/game_info.h @@ -17,6 +17,8 @@ #include "../../newgrf_config.h" #include "../../date_type.h" +#include + /* * NetworkGameInfo has several revisions which we still need to support on the * wire. The table below shows the version and size for each field of the @@ -25,11 +27,32 @@ * Version: Bytes: Description: * all 1 the version of this packet's structure * - * 4+ 1 number of GRFs attached (n) - * 4+ n * 20 unique identifier for GRF files. Consists of: - * - one 4 byte variable with the GRF ID - * - 16 bytes (sent sequentially) for the MD5 checksum - * of the GRF + * 6+ 1 type of storage for the NewGRFs below: + * 0 = NewGRF ID and MD5 checksum. + * Used as default for version 5 and below, and for + * later game updates to the Game Coordinator. + * 1 = NewGRF ID, MD5 checksum and name. + * Used for direct requests and the first game + * update to Game Coordinator. + * 2 = Index in NewGRF lookup table. + * Used for sending server listing from the Game + * Coordinator to the clients. + * + * 5+ 4 version number of the Game Script (-1 is case none is selected). + * 5+ var string with the name of the Game Script. + * + * 4+ 1 number of GRFs attached (n). + * 4+ n * var identifiers for GRF files. Consists of: + * Note: the 'vN' refers to packet version and 'type' + * refers to the v6+ type of storage for the NewGRFs. + * - 4 byte variable with the GRF ID. + * For v4, v5, and v6+ in case of type 0 and/or type 1. + * - 16 bytes with the MD5 checksum of the GRF. + * For v4, v5, and v6+ in case of type 0 and/or type 1. + * - string with name of NewGRF. + * For v6+ in case of type 1. + * - 4 byte lookup table index. + * For v6+ in case of type 2. * * 3+ 4 current game date in days since 1-1-0 (DMY) * 3+ 4 game introduction date in days since 1-1-0 (DMY) @@ -40,7 +63,7 @@ * * 1+ var string with the name of the server * 1+ var string with the revision of the server - * 1+ 1 the language run on the server + * 1 - 5 1 the language run on the server * (0 = any, 1 = English, 2 = German, 3 = French) * 1+ 1 whether the server uses a password (0 = no, 1 = yes) * 1+ 1 maximum number of clients allowed on the server @@ -48,7 +71,7 @@ * 1+ 1 number of spectators on the server * 1 & 2 2 current game date in days since 1-1-1920 (DMY) * 1 & 2 2 game introduction date in days since 1-1-1920 (DMY) - * 1+ var string with the name of the map + * 1 - 5 var string with the name of the map * 1+ 2 width of the map in tiles * 1+ 2 height of the map in tiles * 1+ 1 type of map: @@ -56,6 +79,14 @@ * 1+ 1 whether the server is dedicated (0 = no, 1 = yes) */ +/** The different types/ways a NewGRF can be serialized in the GameInfo since version 6. */ +enum NewGRFSerializationType { + NST_GRFID_MD5 = 0, ///< Unique GRF ID and MD5 checksum. + NST_GRFID_MD5_NAME = 1, ///< Unique GRF ID, MD5 checksum and name. + NST_LOOKUP_ID = 2, ///< Unique ID into a lookup table that is sent before. + NST_END ///< The end of the list (period). +}; + /** * The game information that is sent from the server to the client. */ @@ -74,7 +105,6 @@ struct NetworkServerGameInfo { byte companies_on; ///< How many started companies do we have byte companies_max; ///< Max companies allowed on server byte spectators_on; ///< How many spectators do we have? - byte spectators_max; ///< Max spectators allowed on server byte landscape; ///< The used landscape int gamescript_version; ///< Version of the gamescript. std::string gamescript_name; ///< Name of the gamescript. @@ -89,6 +119,17 @@ struct NetworkGameInfo : NetworkServerGameInfo { bool compatible; ///< Can we connect to this server or not? (based on server_revision _and_ grf_match }; +/** + * Container to hold the GRF identifier (GRF ID + MD5 checksum) and the name + * associated with that NewGRF. + */ +struct NamedGRFIdentifier { + GRFIdentifier ident; ///< The unique identifier of the NewGRF. + std::string name; ///< The name of the NewGRF. +}; +/** Lookup table for the GameInfo in case of #NST_LOOKUP_ID. */ +typedef std::unordered_map GameInfoNewGRFLookupTable; + extern NetworkServerGameInfo _network_game_info; const char *GetNetworkRevisionString(); @@ -99,11 +140,12 @@ void FillStaticNetworkServerGameInfo(); const NetworkServerGameInfo *GetCurrentNetworkServerGameInfo(); void DeserializeGRFIdentifier(Packet *p, GRFIdentifier *grf); +void DeserializeGRFIdentifierWithName(Packet *p, NamedGRFIdentifier *grf); void SerializeGRFIdentifier(Packet *p, const GRFIdentifier *grf); -void DeserializeNetworkGameInfo(Packet *p, NetworkGameInfo *info); +void DeserializeNetworkGameInfo(Packet *p, NetworkGameInfo *info, const GameInfoNewGRFLookupTable *newgrf_lookup_table = nullptr); void DeserializeNetworkGameInfoExtended(Packet *p, NetworkGameInfo *info); -void SerializeNetworkGameInfo(Packet *p, const NetworkServerGameInfo *info); -void SerializeNetworkGameInfoExtended(Packet *p, const NetworkServerGameInfo *info, uint16 flags, uint16 version); +void SerializeNetworkGameInfo(Packet *p, const NetworkServerGameInfo *info, bool send_newgrf_names = true); +void SerializeNetworkGameInfoExtended(Packet *p, const NetworkServerGameInfo *info, uint16 flags, uint16 version, bool send_newgrf_names = true); #endif /* NETWORK_CORE_GAME_INFO_H */ diff --git a/src/network/core/tcp_coordinator.cpp b/src/network/core/tcp_coordinator.cpp index ba6d10792e..aca87803a6 100644 --- a/src/network/core/tcp_coordinator.cpp +++ b/src/network/core/tcp_coordinator.cpp @@ -42,6 +42,8 @@ bool NetworkCoordinatorSocketHandler::HandlePacket(Packet *p) case PACKET_COORDINATOR_GC_STUN_REQUEST: return this->Receive_GC_STUN_REQUEST(p); case PACKET_COORDINATOR_SERCLI_STUN_RESULT: return this->Receive_SERCLI_STUN_RESULT(p); case PACKET_COORDINATOR_GC_STUN_CONNECT: return this->Receive_GC_STUN_CONNECT(p); + case PACKET_COORDINATOR_GC_NEWGRF_LOOKUP: return this->Receive_GC_NEWGRF_LOOKUP(p); + case PACKET_COORDINATOR_GC_TURN_CONNECT: return this->Receive_GC_TURN_CONNECT(p); default: DEBUG(net, 0, "[tcp/coordinator] Received invalid packet type %u", type); @@ -99,3 +101,5 @@ bool NetworkCoordinatorSocketHandler::Receive_GC_DIRECT_CONNECT(Packet *p) { ret bool NetworkCoordinatorSocketHandler::Receive_GC_STUN_REQUEST(Packet *p) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_STUN_REQUEST); } bool NetworkCoordinatorSocketHandler::Receive_SERCLI_STUN_RESULT(Packet *p) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_SERCLI_STUN_RESULT); } bool NetworkCoordinatorSocketHandler::Receive_GC_STUN_CONNECT(Packet *p) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_STUN_CONNECT); } +bool NetworkCoordinatorSocketHandler::Receive_GC_NEWGRF_LOOKUP(Packet *p) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_NEWGRF_LOOKUP); } +bool NetworkCoordinatorSocketHandler::Receive_GC_TURN_CONNECT(Packet *p) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_TURN_CONNECT); } diff --git a/src/network/core/tcp_coordinator.h b/src/network/core/tcp_coordinator.h index 40502e7e3f..dea61cdec1 100644 --- a/src/network/core/tcp_coordinator.h +++ b/src/network/core/tcp_coordinator.h @@ -41,6 +41,8 @@ enum PacketCoordinatorType { PACKET_COORDINATOR_GC_STUN_REQUEST, ///< Game Coordinator tells client/server to initiate a STUN request. PACKET_COORDINATOR_SERCLI_STUN_RESULT, ///< Client/server informs the Game Coordinator of the result of the STUN request. PACKET_COORDINATOR_GC_STUN_CONNECT, ///< Game Coordinator tells client/server to connect() reusing the STUN local address. + PACKET_COORDINATOR_GC_NEWGRF_LOOKUP, ///< Game Coordinator informs client about NewGRF lookup table updates needed for GC_LISTING. + PACKET_COORDINATOR_GC_TURN_CONNECT, ///< Game Coordinator tells client/server to connect to a specific TURN server. PACKET_COORDINATOR_END, ///< Must ALWAYS be on the end of this list!! (period) }; @@ -52,6 +54,7 @@ enum ConnectionType { CONNECTION_TYPE_ISOLATED, ///< The Game Coordinator failed to find a way to connect to your server. Nobody will be able to join. CONNECTION_TYPE_DIRECT, ///< The Game Coordinator can directly connect to your server. CONNECTION_TYPE_STUN, ///< The Game Coordinator can connect to your server via a STUN request. + CONNECTION_TYPE_TURN, ///< The Game Coordinator needs you to connect to a relay. }; /** @@ -125,6 +128,7 @@ protected: * uint8 Game Coordinator protocol version. * uint8 Game-info version used by this client. * string Revision of the client. + * uint32 (Game Coordinator protocol >= 4) Cursor as received from GC_NEWGRF_LOOKUP, or zero. * * @param p The packet that was just received. * @return True upon success, otherwise false. @@ -263,6 +267,43 @@ protected: */ virtual bool Receive_GC_STUN_CONNECT(Packet *p); + /** + * Game Coordinator informs the client of updates for the NewGRFs lookup table + * as used by the NewGRF deserialization in GC_LISTING. + * This packet is sent after a CLIENT_LISTING request, but before GC_LISTING. + * + * uint32 Lookup table cursor. + * uint16 Number of NewGRFs in the packet, with for each of the NewGRFs: + * uint32 Lookup table index for the NewGRF. + * uint32 Unique NewGRF ID. + * byte[16] MD5 checksum of the NewGRF + * string Name of the NewGRF. + * + * The lookup table built using these packets are used by the deserialisation + * of the NewGRFs for servers in the GC_LISTING. These updates are additive, + * i.e. each update will add NewGRFs but never remove them. However, this + * lookup table is specific to the connection with the Game Coordinator, and + * should be considered invalid after disconnecting from the Game Coordinator. + * + * @param p The packet that was just received. + * @return True upon success, otherwise false. + */ + virtual bool Receive_GC_NEWGRF_LOOKUP(Packet *p); + + /** + * Game Coordinator requests that we make a connection to the indicated + * peer, which is a TURN server. + * + * string Token to track the current connect request. + * uint8 Tracking number to track current connect request. + * string Ticket to hand over to the TURN server. + * string Connection string of the TURN server. + * + * @param p The packet that was just received. + * @return True upon success, otherwise false. + */ + virtual bool Receive_GC_TURN_CONNECT(Packet *p); + bool HandlePacket(Packet *p); public: /** diff --git a/src/network/core/tcp_game.cpp b/src/network/core/tcp_game.cpp index 8eaef0d3bb..983588f575 100644 --- a/src/network/core/tcp_game.cpp +++ b/src/network/core/tcp_game.cpp @@ -112,7 +112,7 @@ NetworkRecvStatus NetworkGameSocketHandler::CloseConnection(bool error) _networking = false; ShowErrorMessage(STR_NETWORK_ERROR_LOSTCONNECTION, INVALID_STRING_ID, WL_CRITICAL); - return NETWORK_RECV_STATUS_CLIENT_QUIT; + return this->CloseConnection(NETWORK_RECV_STATUS_CLIENT_QUIT); } return this->CloseConnection(NETWORK_RECV_STATUS_CONNECTION_LOST); @@ -141,8 +141,6 @@ NetworkRecvStatus NetworkGameSocketHandler::HandlePacket(Packet *p) case PACKET_CLIENT_GAME_INFO: return this->Receive_CLIENT_GAME_INFO(p); case PACKET_SERVER_GAME_INFO: return this->Receive_SERVER_GAME_INFO(p); case PACKET_SERVER_GAME_INFO_EXTENDED: return this->Receive_SERVER_GAME_INFO_EXTENDED(p); - case PACKET_CLIENT_COMPANY_INFO: return this->Receive_CLIENT_COMPANY_INFO(p); - case PACKET_SERVER_COMPANY_INFO: return this->Receive_SERVER_COMPANY_INFO(p); case PACKET_SERVER_CLIENT_INFO: return this->Receive_SERVER_CLIENT_INFO(p); case PACKET_SERVER_NEED_GAME_PASSWORD: return this->Receive_SERVER_NEED_GAME_PASSWORD(p); case PACKET_SERVER_NEED_COMPANY_PASSWORD: return this->Receive_SERVER_NEED_COMPANY_PASSWORD(p); @@ -234,8 +232,6 @@ NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_ERROR(Packet *p) { re NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_GAME_INFO(Packet *p) { return this->ReceiveInvalidPacket(PACKET_CLIENT_GAME_INFO); } NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_GAME_INFO(Packet *p) { return this->ReceiveInvalidPacket(PACKET_SERVER_GAME_INFO); } NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_GAME_INFO_EXTENDED(Packet *p) { return this->ReceiveInvalidPacket(PACKET_SERVER_GAME_INFO_EXTENDED); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_COMPANY_INFO(Packet *p) { return this->ReceiveInvalidPacket(PACKET_CLIENT_COMPANY_INFO); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_COMPANY_INFO(Packet *p) { return this->ReceiveInvalidPacket(PACKET_SERVER_COMPANY_INFO); } NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_CLIENT_INFO(Packet *p) { return this->ReceiveInvalidPacket(PACKET_SERVER_CLIENT_INFO); } NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_NEED_GAME_PASSWORD(Packet *p) { return this->ReceiveInvalidPacket(PACKET_SERVER_NEED_GAME_PASSWORD); } NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_NEED_COMPANY_PASSWORD(Packet *p) { return this->ReceiveInvalidPacket(PACKET_SERVER_NEED_COMPANY_PASSWORD); } diff --git a/src/network/core/tcp_game.h b/src/network/core/tcp_game.h index 584c9cea1e..87ac95397b 100644 --- a/src/network/core/tcp_game.h +++ b/src/network/core/tcp_game.h @@ -39,9 +39,9 @@ enum PacketGameType { PACKET_CLIENT_JOIN, ///< The client telling the server it wants to join. PACKET_SERVER_ERROR, ///< Server sending an error message to the client. - /* Packets used for the pre-game lobby. */ - PACKET_CLIENT_COMPANY_INFO, ///< Request information about all companies. - PACKET_SERVER_COMPANY_INFO, ///< Information about a single company. + /* Unused packet types, formerly used for the pre-game lobby. */ + PACKET_CLIENT_UNUSED, ///< Unused. + PACKET_SERVER_UNUSED, ///< Unused. /* Packets used to get the game info. */ PACKET_SERVER_GAME_INFO, ///< Information about the server. @@ -221,40 +221,6 @@ protected: */ virtual NetworkRecvStatus Receive_SERVER_GAME_INFO_EXTENDED(Packet *p); - /** - * Request company information (in detail). - * @param p The packet that was just received. - */ - virtual NetworkRecvStatus Receive_CLIENT_COMPANY_INFO(Packet *p); - - /** - * Sends information about the companies (one packet per company): - * uint8 Version of the structure of this packet (NETWORK_COMPANY_INFO_VERSION). - * bool Contains data (false marks the end of updates). - * uint8 ID of the company. - * string Name of the company. - * uint32 Year the company was inaugurated. - * uint64 Value. - * uint64 Money. - * uint64 Income. - * uint16 Performance (last quarter). - * bool Company is password protected. - * uint16 Number of trains. - * uint16 Number of lorries. - * uint16 Number of busses. - * uint16 Number of planes. - * uint16 Number of ships. - * uint16 Number of train stations. - * uint16 Number of lorry stations. - * uint16 Number of bus stops. - * uint16 Number of airports and heliports. - * uint16 Number of harbours. - * bool Company is an AI. - * string Client names (comma separated list) - * @param p The packet that was just received. - */ - virtual NetworkRecvStatus Receive_SERVER_COMPANY_INFO(Packet *p); - /** * Send information about a client: * uint32 ID of the client (always unique on a server. 1 = server, 0 is invalid). diff --git a/src/network/core/tcp_turn.cpp b/src/network/core/tcp_turn.cpp new file mode 100644 index 0000000000..4800807cde --- /dev/null +++ b/src/network/core/tcp_turn.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 tcp_turn.cpp Basic functions to receive and send TURN packets. + */ + +#include "../../stdafx.h" +#include "../../date_func.h" +#include "../../debug.h" +#include "tcp_turn.h" + +#include "../../safeguards.h" + +/** + * Handle the given packet, i.e. pass it to the right + * parser receive command. + * @param p the packet to handle + * @return true if we should immediately handle further packets, false otherwise + */ +bool NetworkTurnSocketHandler::HandlePacket(Packet *p) +{ + PacketTurnType type = (PacketTurnType)p->Recv_uint8(); + + switch (type) { + case PACKET_TURN_TURN_ERROR: return this->Receive_TURN_ERROR(p); + case PACKET_TURN_SERCLI_CONNECT: return this->Receive_SERCLI_CONNECT(p); + case PACKET_TURN_TURN_CONNECTED: return this->Receive_TURN_CONNECTED(p); + + default: + DEBUG(net, 0, "[tcp/turn] Received invalid packet type %u", type); + return false; + } +} + +/** + * Receive a packet at TCP level + * @return Whether at least one packet was received. + */ +bool NetworkTurnSocketHandler::ReceivePackets() +{ + std::unique_ptr p; + static const int MAX_PACKETS_TO_RECEIVE = 4; + int i = MAX_PACKETS_TO_RECEIVE; + while (--i != 0 && (p = this->ReceivePacket()) != nullptr) { + bool cont = this->HandlePacket(p.get()); + if (!cont) return true; + } + + return i != MAX_PACKETS_TO_RECEIVE - 1; +} + +/** + * Helper for logging receiving invalid packets. + * @param type The received packet type. + * @return Always false, as it's an error. + */ +bool NetworkTurnSocketHandler::ReceiveInvalidPacket(PacketTurnType type) +{ + DEBUG(net, 0, "[tcp/turn] Received illegal packet type %u", type); + return false; +} + +bool NetworkTurnSocketHandler::Receive_TURN_ERROR(Packet *p) { return this->ReceiveInvalidPacket(PACKET_TURN_TURN_ERROR); } +bool NetworkTurnSocketHandler::Receive_SERCLI_CONNECT(Packet *p) { return this->ReceiveInvalidPacket(PACKET_TURN_SERCLI_CONNECT); } +bool NetworkTurnSocketHandler::Receive_TURN_CONNECTED(Packet *p) { return this->ReceiveInvalidPacket(PACKET_TURN_TURN_CONNECTED); } diff --git a/src/network/core/tcp_turn.h b/src/network/core/tcp_turn.h new file mode 100644 index 0000000000..0823731993 --- /dev/null +++ b/src/network/core/tcp_turn.h @@ -0,0 +1,79 @@ +/* + * 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 tcp_turn.h Basic functions to receive and send TCP packets to/from the TURN server. + */ + +#ifndef NETWORK_CORE_TCP_TURN_H +#define NETWORK_CORE_TCP_TURN_H + +#include "os_abstraction.h" +#include "tcp.h" +#include "packet.h" +#include "game_info.h" + +/** Enum with all types of TCP TURN packets. The order MUST not be changed. **/ +enum PacketTurnType { + PACKET_TURN_TURN_ERROR, ///< TURN server is unable to relay. + PACKET_TURN_SERCLI_CONNECT, ///< Client or server is connecting to the TURN server. + PACKET_TURN_TURN_CONNECTED, ///< TURN server indicates the socket is now being relayed. + PACKET_TURN_END, ///< Must ALWAYS be on the end of this list!! (period) +}; + +/** Base socket handler for all TURN TCP sockets. */ +class NetworkTurnSocketHandler : public NetworkTCPSocketHandler { +protected: + bool ReceiveInvalidPacket(PacketTurnType type); + + /** + * TURN server was unable to connect the client or server based on the + * token. Most likely cause is an invalid token or the other side that + * hasn't connected in a reasonable amount of time. + * + * @param p The packet that was just received. + * @return True upon success, otherwise false. + */ + virtual bool Receive_TURN_ERROR(Packet *p); + + /** + * Client or servers wants to connect to the TURN server (on request by + * the Game Coordinator). + * + * uint8 Game Coordinator protocol version. + * string Token to track the current TURN request. + * + * @param p The packet that was just received. + * @return True upon success, otherwise false. + */ + virtual bool Receive_SERCLI_CONNECT(Packet *p); + + /** + * TURN server has connected client and server together and will now relay + * all packets to each other. No further TURN packets should be send over + * this socket, and the socket should be handed over to the game protocol. + * + * string Hostname of the peer. This can be used to check if a client is not banned etc. + * + * @param p The packet that was just received. + * @return True upon success, otherwise false. + */ + virtual bool Receive_TURN_CONNECTED(Packet *p); + + bool HandlePacket(Packet *p); +public: + /** + * Create a new cs socket handler for a given cs. + * @param s the socket we are connected with. + * @param address IP etc. of the client. + */ + NetworkTurnSocketHandler(SOCKET s = INVALID_SOCKET) : NetworkTCPSocketHandler(s) {} + + bool ReceivePackets(); +}; + +#endif /* NETWORK_CORE_TCP_TURN_H */ diff --git a/src/network/network.cpp b/src/network/network.cpp index bd3dcb8ccd..26b9d42895 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -84,8 +84,6 @@ uint8 _last_sync_tick_skip_counter; ///< " bool _network_first_time; ///< Whether we have finished joining or not. 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); /** The amount of clients connected */ @@ -621,7 +619,7 @@ void NetworkClose(bool close_admins) MyClient::my_client->CloseConnection(NETWORK_RECV_STATUS_CLIENT_QUIT); } - _network_coordinator_client.CloseAllTokens(); + _network_coordinator_client.CloseAllConnections(); } TCPConnecter::KillAll(); @@ -672,7 +670,7 @@ public: { _networking = true; new ClientNetworkGameSocketHandler(s, this->connection_string); - MyClient::SendInformationQuery(false); + MyClient::SendInformationQuery(); } }; @@ -689,42 +687,6 @@ void NetworkQueryServer(const std::string &connection_string) new TCPQueryConnecter(connection_string); } -/** Non blocking connection to query servers for their game and company info. */ -class TCPLobbyQueryConnecter : TCPServerConnecter { -private: - std::string connection_string; - -public: - TCPLobbyQueryConnecter(const std::string &connection_string) : TCPServerConnecter(connection_string, NETWORK_DEFAULT_PORT), connection_string(connection_string) {} - - void OnFailure() override - { - DeleteWindowById(WC_NETWORK_WINDOW, WN_NETWORK_WINDOW_LOBBY); - - ShowErrorMessage(STR_NETWORK_ERROR_NOCONNECTION, INVALID_STRING_ID, WL_ERROR); - } - - void OnConnect(SOCKET s) override - { - _networking = true; - new ClientNetworkGameSocketHandler(s, this->connection_string); - MyClient::SendInformationQuery(true); - } -}; - -/** - * Query a server to fetch the game-info for the lobby. - * @param connection_string the address to query. - */ -void NetworkQueryLobbyServer(const std::string &connection_string) -{ - if (!_network_available) return; - - NetworkInitialize(); - - new TCPLobbyQueryConnecter(connection_string); -} - /** * Validates an address entered as a string and adds the server to * the list. If you use this function, the games will be marked diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp index 7e2c167d4c..1bcabf35dc 100644 --- a/src/network/network_client.cpp +++ b/src/network/network_client.cpp @@ -140,8 +140,8 @@ void ClientNetworkEmergencySave() if (!_networking) return; if (!ClientNetworkGameSocketHandler::EmergencySavePossible()) return; - static int _netsave_ctr = 0; - DoAutoOrNetsave(_netsave_ctr, true); + static FiosNumberedSaveName _netsave_ctr("netsave"); + DoAutoOrNetsave(_netsave_ctr, false); } @@ -180,29 +180,24 @@ ClientNetworkGameSocketHandler::~ClientNetworkGameSocketHandler() NetworkRecvStatus ClientNetworkGameSocketHandler::CloseConnection(NetworkRecvStatus status) { assert(status != NETWORK_RECV_STATUS_OKAY); - /* - * Sending a message just before leaving the game calls cs->SendPackets. - * This might invoke this function, which means that when we close the - * connection after cs->SendPackets we will close an already closed - * connection. This handles that case gracefully without having to make - * that code any more complex or more aware of the validity of the socket. - */ - if (this->sock == INVALID_SOCKET) return status; + assert(this->sock != INVALID_SOCKET); if (this->status == STATUS_CLOSING) return status; - DEBUG(net, 3, "Shutting down client connection %d", this->client_id); + if (!this->HasClientQuit()) { + DEBUG(net, 3, "Closed client connection %d", this->client_id); - SetBlocking(this->sock); + SetBlocking(this->sock); - this->SendPackets(true); + this->SendPackets(true); - ShutdownSocket(this->sock, false, true, 2); + ShutdownSocket(this->sock, false, true, 2); - /* Wait a number of ticks so our leave message can reach the server. - * This is especially needed for Windows servers as they seem to get - * the "socket is closed" message before receiving our leave message, - * which would trigger the server to close the connection as well. */ - CSleep(3 * MILLISECONDS_PER_TICK); + /* Wait a number of ticks so our leave message can reach the server. + * This is especially needed for Windows servers as they seem to get + * the "socket is closed" message before receiving our leave message, + * which would trigger the server to close the connection as well. */ + CSleep(3 * MILLISECONDS_PER_TICK); + } DEBUG(net, 1, "Shutdown client connection %d", this->client_id); @@ -291,7 +286,7 @@ void ClientNetworkGameSocketHandler::ClientError(NetworkRecvStatus res) /* static */ void ClientNetworkGameSocketHandler::Send() { my_client->SendPackets(); - my_client->CheckConnection(); + if (my_client != nullptr) my_client->CheckConnection(); } /** @@ -385,8 +380,8 @@ static std::string _password_server_id; /** Maximum number of companies of the currently joined server. */ static uint8 _network_server_max_companies; -/** Maximum number of spectators of the currently joined server. */ -static uint8 _network_server_max_spectators; +/** The current name of the server you are on. */ +std::string _network_server_name; /** Information about the game to join to. */ NetworkJoinInfo _network_join; @@ -402,7 +397,7 @@ static_assert(NETWORK_SERVER_ID_LENGTH == 16 * 2 + 1); /** * Query the server for server information. */ -NetworkRecvStatus ClientNetworkGameSocketHandler::SendInformationQuery(bool request_company_info) +NetworkRecvStatus ClientNetworkGameSocketHandler::SendInformationQuery() { my_client->status = STATUS_GAME_INFO; @@ -413,14 +408,6 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendInformationQuery(bool requ p->Send_uint16(0); // version my_client->SendPacket(p); - if (request_company_info) { - my_client->status = STATUS_COMPANY_INFO; - _network_join_status = NETWORK_JOIN_STATUS_GETTING_COMPANY_INFO; - SetWindowDirty(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN); - - my_client->SendPacket(new Packet(PACKET_CLIENT_COMPANY_INFO)); - } - return NETWORK_RECV_STATUS_OKAY; } @@ -696,13 +683,9 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_BANNED(Packet * NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_GAME_INFO(Packet *p) { - if (this->status != STATUS_COMPANY_INFO && this->status != STATUS_GAME_INFO) return NETWORK_RECV_STATUS_MALFORMED_PACKET; + if (this->status != STATUS_GAME_INFO) return NETWORK_RECV_STATUS_MALFORMED_PACKET; - NetworkGameList *item = GetLobbyGameInfo(); - if (item == nullptr) { - /* This is not the lobby, so add it to the game list. */ - item = NetworkGameListAddItem(this->connection_string); - } + NetworkGameList *item = NetworkGameListAddItem(this->connection_string); /* Clear any existing GRFConfig chain. */ ClearGRFConfigList(&item->info.grfconfig); @@ -713,20 +696,16 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_GAME_INFO(Packe /* Ensure we consider the server online. */ item->online = true; - /* It could be either window, but only one is open, so redraw both. */ UpdateNetworkGameWindow(); - SetWindowDirty(WC_NETWORK_WINDOW, WN_NETWORK_WINDOW_LOBBY); - /* We will receive company info next, so keep connection open. */ - if (this->status == STATUS_COMPANY_INFO) return NETWORK_RECV_STATUS_OKAY; return NETWORK_RECV_STATUS_CLOSE_QUERY; } NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_GAME_INFO_EXTENDED(Packet *p) { - if (this->status != STATUS_COMPANY_INFO && this->status != STATUS_INACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET; + if (this->status != STATUS_GAME_INFO) return NETWORK_RECV_STATUS_MALFORMED_PACKET; - NetworkGameList *item = GetLobbyGameInfo(); + NetworkGameList *item = NetworkGameListAddItem(this->connection_string); /* Clear any existing GRFConfig chain. */ ClearGRFConfigList(&item->info.grfconfig); @@ -737,50 +716,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_GAME_INFO_EXTEN /* Ensure we consider the server online. */ item->online = true; - SetWindowDirty(WC_NETWORK_WINDOW, WN_NETWORK_WINDOW_LOBBY); - - /* We will receive company info next, so keep connection open. */ - if (this->status == STATUS_COMPANY_INFO) return NETWORK_RECV_STATUS_OKAY; - return NETWORK_RECV_STATUS_CLOSE_QUERY; -} - -NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_COMPANY_INFO(Packet *p) -{ - if (this->status != STATUS_COMPANY_INFO) return NETWORK_RECV_STATUS_MALFORMED_PACKET; - - byte company_info_version = p->Recv_uint8(); - - if (!this->HasClientQuit() && company_info_version == NETWORK_COMPANY_INFO_VERSION) { - /* We have received all data... (there are no more packets coming) */ - if (!p->Recv_bool()) return NETWORK_RECV_STATUS_CLOSE_QUERY; - - CompanyID current = (Owner)p->Recv_uint8(); - if (current >= MAX_COMPANIES) return NETWORK_RECV_STATUS_CLOSE_QUERY; - - NetworkCompanyInfo *company_info = GetLobbyCompanyInfo(current); - if (company_info == nullptr) return NETWORK_RECV_STATUS_CLOSE_QUERY; - - company_info->company_name = p->Recv_string(NETWORK_COMPANY_NAME_LENGTH); - company_info->inaugurated_year = p->Recv_uint32(); - company_info->company_value = p->Recv_uint64(); - company_info->money = p->Recv_uint64(); - company_info->income = p->Recv_uint64(); - company_info->performance = p->Recv_uint16(); - company_info->use_password = p->Recv_bool(); - for (uint i = 0; i < NETWORK_VEH_END; i++) { - company_info->num_vehicle[i] = p->Recv_uint16(); - } - for (uint i = 0; i < NETWORK_VEH_END; i++) { - company_info->num_station[i] = p->Recv_uint16(); - } - company_info->ai = p->Recv_bool(); - - company_info->clients = p->Recv_string(NETWORK_CLIENTS_LENGTH); - - SetWindowDirty(WC_NETWORK_WINDOW, WN_NETWORK_WINDOW_LOBBY); - - return NETWORK_RECV_STATUS_OKAY; - } + UpdateNetworkGameWindow(); return NETWORK_RECV_STATUS_CLOSE_QUERY; } @@ -877,7 +813,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR(Packet *p * NETWORK_ERROR_NOT_EXPECTED on requesting the game info. Show a special * error popup in that case. */ - if (error == NETWORK_ERROR_NOT_EXPECTED && (this->status == STATUS_GAME_INFO || this->status == STATUS_COMPANY_INFO)) { + if (error == NETWORK_ERROR_NOT_EXPECTED && this->status == STATUS_GAME_INFO) { ShowErrorMessage(STR_NETWORK_ERROR_SERVER_TOO_OLD, INVALID_STRING_ID, WL_CRITICAL); return NETWORK_RECV_STATUS_CLOSE_QUERY; } @@ -1084,6 +1020,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_DONE(Packet /* Say we received the map and loaded it correctly! */ SendMapOk(); + ShowClientList(); + /* New company/spectator (invalid company) or company we want to join is not active * Switch local company to spectator and await the server's judgement */ if (_network_join.company == COMPANY_NEW_COMPANY || !Company::IsValidID(_network_join.company)) { @@ -1373,7 +1311,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CONFIG_UPDATE(P if (this->status < STATUS_ACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET; _network_server_max_companies = p->Recv_uint8(); - _network_server_max_spectators = p->Recv_uint8(); + _network_server_name = p->Recv_string(NETWORK_NAME_LENGTH); return NETWORK_RECV_STATUS_OKAY; } @@ -1433,7 +1371,6 @@ const char *ClientNetworkGameSocketHandler::GetServerStatusName(ServerStatus sta static const char* _server_status_names[] { "INACTIVE", "GAME_INFO", - "COMPANY_INFO", "JOIN", "NEWGRFS_CHECK", "AUTH_GAME", @@ -1643,12 +1580,3 @@ bool NetworkMaxCompaniesReached() { return Company::GetNumItems() >= (_network_server ? _settings_client.network.max_companies : _network_server_max_companies); } - -/** - * Check if max_spectatos has been reached on the server (local check only). - * @return true if the max value has been reached or exceeded, false otherwise. - */ -bool NetworkMaxSpectatorsReached() -{ - return NetworkSpectatorCount() >= (_network_server ? _settings_client.network.max_spectators : _network_server_max_spectators); -} diff --git a/src/network/network_client.h b/src/network/network_client.h index 4c18c301cb..561fb8d10a 100644 --- a/src/network/network_client.h +++ b/src/network/network_client.h @@ -23,7 +23,6 @@ private: enum ServerStatus { STATUS_INACTIVE, ///< The client is not connected nor active. STATUS_GAME_INFO, ///< We are trying to get the game information. - STATUS_COMPANY_INFO, ///< We are trying to get company information. STATUS_JOIN, ///< We are trying to join a server. STATUS_NEWGRFS_CHECK, ///< Last action was checking NewGRFs. STATUS_AUTH_GAME, ///< Last action was requesting game (server) password. @@ -54,7 +53,6 @@ protected: NetworkRecvStatus Receive_SERVER_ERROR(Packet *p) override; NetworkRecvStatus Receive_SERVER_GAME_INFO(Packet *p) override; NetworkRecvStatus Receive_SERVER_GAME_INFO_EXTENDED(Packet *p) override; - NetworkRecvStatus Receive_SERVER_COMPANY_INFO(Packet *p) override; NetworkRecvStatus Receive_SERVER_CLIENT_INFO(Packet *p) override; NetworkRecvStatus Receive_SERVER_NEED_GAME_PASSWORD(Packet *p) override; NetworkRecvStatus Receive_SERVER_NEED_COMPANY_PASSWORD(Packet *p) override; @@ -94,7 +92,7 @@ public: std::string GetDebugInfo() const override; - static NetworkRecvStatus SendInformationQuery(bool request_company_info); + static NetworkRecvStatus SendInformationQuery(); static NetworkRecvStatus SendJoin(); static NetworkRecvStatus SendCommand(const CommandPacket *cp); diff --git a/src/network/network_coordinator.cpp b/src/network/network_coordinator.cpp index c45c51f473..95124548d7 100644 --- a/src/network/network_coordinator.cpp +++ b/src/network/network_coordinator.cpp @@ -18,6 +18,7 @@ #include "network.h" #include "network_coordinator.h" #include "network_gamelist.h" +#include "network_gui.h" #include "network_internal.h" #include "network_server.h" #include "network_stun.h" @@ -144,7 +145,11 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_ERROR(Packet *p) return false; case NETWORK_COORDINATOR_ERROR_INVALID_INVITE_CODE: { - this->CloseToken(detail); + auto connecter_pre_it = this->connecter_pre.find(detail); + if (connecter_pre_it != this->connecter_pre.end()) { + connecter_pre_it->second->SetFailure(); + this->connecter_pre.erase(connecter_pre_it); + } /* Mark the server as offline. */ NetworkGameList *item = NetworkGameListAddItem(detail); @@ -189,6 +194,7 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_REGISTER_ACK(Packet *p) case CONNECTION_TYPE_ISOLATED: connection_type = "Remote players can't connect"; break; case CONNECTION_TYPE_DIRECT: connection_type = "Public"; break; case CONNECTION_TYPE_STUN: connection_type = "Behind NAT"; break; + case CONNECTION_TYPE_TURN: connection_type = "Via relay"; break; case CONNECTION_TYPE_UNKNOWN: // Never returned from Game Coordinator. default: connection_type = "Unknown"; break; // Should never happen, but don't fail if it does. @@ -231,7 +237,7 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_LISTING(Packet *p) /* Read the NetworkGameInfo from the packet. */ NetworkGameInfo ngi = {}; - DeserializeNetworkGameInfo(p, &ngi); + DeserializeNetworkGameInfo(p, &ngi, &this->newgrf_lookup_table); /* Now we know the connection string, we can add it to our list. */ NetworkGameList *item = NetworkGameListAddItem(connection_string); @@ -258,15 +264,15 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_CONNECTING(Packet *p) std::string invite_code = p->Recv_string(NETWORK_INVITE_CODE_LENGTH); /* Find the connecter based on the invite code. */ - auto connecter_it = this->connecter_pre.find(invite_code); - if (connecter_it == this->connecter_pre.end()) { + auto connecter_pre_it = this->connecter_pre.find(invite_code); + if (connecter_pre_it == this->connecter_pre.end()) { this->CloseConnection(); return false; } /* Now store it based on the token. */ - this->connecter[token] = connecter_it->second; - this->connecter_pre.erase(connecter_it); + this->connecter[token] = connecter_pre_it->second; + this->connecter_pre.erase(connecter_pre_it); return true; } @@ -274,14 +280,6 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_CONNECTING(Packet *p) bool ClientNetworkCoordinatorSocketHandler::Receive_GC_CONNECT_FAILED(Packet *p) { std::string token = p->Recv_string(NETWORK_TOKEN_LENGTH); - - auto connecter_it = this->connecter.find(token); - if (connecter_it != this->connecter.end()) { - connecter_it->second->SetFailure(); - this->connecter.erase(connecter_it); - } - - /* Close all remaining connections. */ this->CloseToken(token); return true; @@ -347,6 +345,62 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_STUN_CONNECT(Packet *p) return true; } +bool ClientNetworkCoordinatorSocketHandler::Receive_GC_NEWGRF_LOOKUP(Packet *p) +{ + this->newgrf_lookup_table_cursor = p->Recv_uint32(); + + uint16 newgrfs = p->Recv_uint16(); + for (; newgrfs> 0; newgrfs--) { + uint32 index = p->Recv_uint32(); + DeserializeGRFIdentifierWithName(p, &this->newgrf_lookup_table[index]); + } + return true; +} + +bool ClientNetworkCoordinatorSocketHandler::Receive_GC_TURN_CONNECT(Packet *p) +{ + std::string token = p->Recv_string(NETWORK_TOKEN_LENGTH); + uint8 tracking_number = p->Recv_uint8(); + std::string ticket = p->Recv_string(NETWORK_TOKEN_LENGTH); + std::string connection_string = p->Recv_string(NETWORK_HOSTNAME_PORT_LENGTH); + + /* Ensure all other pending connection attempts are killed. */ + if (this->game_connecter != nullptr) { + this->game_connecter->Kill(); + this->game_connecter = nullptr; + } + + this->turn_handlers[token] = ClientNetworkTurnSocketHandler::Turn(token, tracking_number, ticket, connection_string); + + if (!_network_server) { + switch (_settings_client.network.use_relay_service) { + case URS_NEVER: + this->ConnectFailure(token, 0); + break; + + case URS_ASK: + ShowNetworkAskRelay(connection_string, token); + break; + + case URS_ALLOW: + this->StartTurnConnection(token); + break; + } + } else { + this->StartTurnConnection(token); + } + + return true; +} + +void ClientNetworkCoordinatorSocketHandler::StartTurnConnection(std::string &token) +{ + auto turn_it = this->turn_handlers.find(token); + if (turn_it == this->turn_handlers.end()) return; + + turn_it->second->Connect(); +} + void ClientNetworkCoordinatorSocketHandler::Connect() { /* We are either already connected or are trying to connect. */ @@ -370,7 +424,7 @@ NetworkRecvStatus ClientNetworkCoordinatorSocketHandler::CloseConnection(bool er _network_server_connection_type = CONNECTION_TYPE_UNKNOWN; this->next_update = {}; - this->CloseAllTokens(); + this->CloseAllConnections(); SetWindowDirty(WC_CLIENT_LIST, 0); @@ -410,13 +464,14 @@ void ClientNetworkCoordinatorSocketHandler::Register() void ClientNetworkCoordinatorSocketHandler::SendServerUpdate() { DEBUG(net, 6, "Sending server update to Game Coordinator"); - this->next_update = std::chrono::steady_clock::now() + NETWORK_COORDINATOR_DELAY_BETWEEN_UPDATES; Packet *p = new Packet(PACKET_COORDINATOR_SERVER_UPDATE, TCP_MTU); p->Send_uint8(NETWORK_COORDINATOR_VERSION); - SerializeNetworkGameInfo(p, GetCurrentNetworkServerGameInfo()); + SerializeNetworkGameInfo(p, GetCurrentNetworkServerGameInfo(), this->next_update.time_since_epoch() != std::chrono::nanoseconds::zero()); this->SendPacket(p); + + this->next_update = std::chrono::steady_clock::now() + NETWORK_COORDINATOR_DELAY_BETWEEN_UPDATES; } /** @@ -432,6 +487,7 @@ void ClientNetworkCoordinatorSocketHandler::GetListing() p->Send_uint8(NETWORK_COORDINATOR_VERSION); p->Send_uint8(NETWORK_GAME_INFO_VERSION); p->Send_string(_openttd_revision); + p->Send_uint32(this->newgrf_lookup_table_cursor); this->SendPacket(p); } @@ -510,11 +566,14 @@ void ClientNetworkCoordinatorSocketHandler::ConnectSuccess(const std::string &to p->Send_string(token); this->SendPacket(p); + /* Find the connecter; it can happen it no longer exist, in cases where + * we aborted the connect but the Game Coordinator was already in the + * processes of connecting us. */ auto connecter_it = this->connecter.find(token); - assert(connecter_it != this->connecter.end()); - - connecter_it->second->SetConnected(sock); - this->connecter.erase(connecter_it); + if (connecter_it != this->connecter.end()) { + connecter_it->second->SetConnected(sock); + this->connecter.erase(connecter_it); + } } /* Close all remaining connections. */ @@ -538,6 +597,11 @@ void ClientNetworkCoordinatorSocketHandler::StunResult(const std::string &token, this->SendPacket(p); } +/** + * Close the STUN handler. + * @param token The token used for the STUN handlers. + * @param family The family of STUN handlers to close. AF_UNSPEC to close all STUN handlers for this token. + */ void ClientNetworkCoordinatorSocketHandler::CloseStunHandler(const std::string &token, uint8 family) { auto stun_it = this->stun_handlers.find(token); @@ -561,20 +625,34 @@ void ClientNetworkCoordinatorSocketHandler::CloseStunHandler(const std::string & } } +/** + * Close the TURN handler. + * @param token The token used for the TURN handler. + */ +void ClientNetworkCoordinatorSocketHandler::CloseTurnHandler(const std::string &token) +{ + DeleteWindowByClass(WC_NETWORK_ASK_RELAY); + + auto turn_it = this->turn_handlers.find(token); + if (turn_it == this->turn_handlers.end()) return; + + turn_it->second->CloseConnection(); + turn_it->second->CloseSocket(); + + /* We don't remove turn_handler here, as we can be called from within that + * turn_handler instance, so our object cannot be free'd yet. Instead, we + * check later if the connection is closed, and free the object then. */ +} + /** * Close everything related to this connection token. * @param token The connection token to close. */ void ClientNetworkCoordinatorSocketHandler::CloseToken(const std::string &token) { - /* Ensure all other pending connection attempts are also killed. */ - if (this->game_connecter != nullptr) { - this->game_connecter->Kill(); - this->game_connecter = nullptr; - } - - /* Close all remaining STUN connections. */ + /* Close all remaining STUN / TURN connections. */ this->CloseStunHandler(token); + this->CloseTurnHandler(token); /* Close the caller of the connection attempt. */ auto connecter_it = this->connecter.find(token); @@ -582,17 +660,12 @@ void ClientNetworkCoordinatorSocketHandler::CloseToken(const std::string &token) connecter_it->second->SetFailure(); this->connecter.erase(connecter_it); } - auto connecter_pre_it = this->connecter_pre.find(token); - if (connecter_pre_it != this->connecter_pre.end()) { - connecter_pre_it->second->SetFailure(); - this->connecter_pre.erase(connecter_pre_it); - } } /** * Close all pending connection tokens. */ -void ClientNetworkCoordinatorSocketHandler::CloseAllTokens() +void ClientNetworkCoordinatorSocketHandler::CloseAllConnections() { /* Ensure all other pending connection attempts are also killed. */ if (this->game_connecter != nullptr) { @@ -603,12 +676,20 @@ void ClientNetworkCoordinatorSocketHandler::CloseAllTokens() /* Mark any pending connecters as failed. */ for (auto &[token, it] : this->connecter) { this->CloseStunHandler(token); + this->CloseTurnHandler(token); it->SetFailure(); + + /* Inform the Game Coordinator he can stop trying to connect us to the server. */ + this->ConnectFailure(token, 0); } + this->stun_handlers.clear(); + this->turn_handlers.clear(); + this->connecter.clear(); + + /* Also close any pending invite-code requests. */ for (auto &[invite_code, it] : this->connecter_pre) { it->SetFailure(); } - this->connecter.clear(); this->connecter_pre.clear(); } @@ -684,4 +765,17 @@ void ClientNetworkCoordinatorSocketHandler::SendReceive() stun_handler->SendReceive(); } } + + /* Check for handlers that are not connecting nor connected. Destroy those objects. */ + for (auto turn_it = this->turn_handlers.begin(); turn_it != this->turn_handlers.end(); /* nothing */) { + if (turn_it->second->connect_started && turn_it->second->connecter == nullptr && !turn_it->second->IsConnected()) { + turn_it = this->turn_handlers.erase(turn_it); + } else { + turn_it++; + } + } + + for (const auto &[token, turn_handler] : this->turn_handlers) { + turn_handler->SendReceive(); + } } diff --git a/src/network/network_coordinator.h b/src/network/network_coordinator.h index f6859f859f..42e16d91dc 100644 --- a/src/network/network_coordinator.h +++ b/src/network/network_coordinator.h @@ -12,6 +12,7 @@ #include "core/tcp_coordinator.h" #include "network_stun.h" +#include "network_turn.h" #include /** @@ -42,6 +43,10 @@ * - a) Server/client connect, client sends CLIENT_CONNECTED to Game Coordinator. * - b) Server/client connect fails, both send SERCLI_CONNECT_FAILED to Game Coordinator. * - Game Coordinator tries other combination if available. + * 3) TURN? + * - Game Coordinator sends GC_TURN_CONNECT to server/client. + * - a) Server/client connect, client sends CLIENT_CONNECTED to Game Coordinator. + * - b) Server/client connect fails, both send SERCLI_CONNECT_FAILED to Game Coordinator. * - If all fails, Game Coordinator sends GC_CONNECT_FAILED to indicate no connection is possible. */ @@ -52,8 +57,12 @@ private: std::map connecter; ///< Based on tokens, the current connecters that are pending. std::map connecter_pre; ///< Based on invite codes, the current connecters that are pending. std::map>> stun_handlers; ///< All pending STUN handlers, stored by token:family. + std::map> turn_handlers; ///< Pending TURN handler (if any), stored by token. TCPConnecter *game_connecter = nullptr; ///< Pending connecter to the game server. + uint32 newgrf_lookup_table_cursor = 0; ///< Last received cursor for the #GameInfoNewGRFLookupTable updates. + GameInfoNewGRFLookupTable newgrf_lookup_table; ///< Table to look up NewGRFs in the GC_LISTING packets. + protected: bool Receive_GC_ERROR(Packet *p) override; bool Receive_GC_REGISTER_ACK(Packet *p) override; @@ -63,6 +72,8 @@ protected: bool Receive_GC_DIRECT_CONNECT(Packet *p) override; bool Receive_GC_STUN_REQUEST(Packet *p) override; bool Receive_GC_STUN_CONNECT(Packet *p) override; + bool Receive_GC_NEWGRF_LOOKUP(Packet *p) override; + bool Receive_GC_TURN_CONNECT(Packet *p) override; public: /** The idle timeout; when to close the connection because it's idle. */ @@ -82,14 +93,16 @@ public: void Connect(); void CloseToken(const std::string &token); - void CloseAllTokens(); + void CloseAllConnections(); void CloseStunHandler(const std::string &token, uint8 family = AF_UNSPEC); + void CloseTurnHandler(const std::string &token); void Register(); void SendServerUpdate(); void GetListing(); void ConnectToServer(const std::string &invite_code, TCPServerConnecter *connecter); + void StartTurnConnection(std::string &token); }; extern ClientNetworkCoordinatorSocketHandler _network_coordinator_client; diff --git a/src/network/network_func.h b/src/network/network_func.h index 596f9a5c25..d8895152be 100644 --- a/src/network/network_func.h +++ b/src/network/network_func.h @@ -62,7 +62,6 @@ void NetworkClientSendDesyncMsg(const char *msg); bool NetworkClientPreferTeamChat(const NetworkClientInfo *cio); bool NetworkCompanyIsPassworded(CompanyID company_id); bool NetworkMaxCompaniesReached(); -bool NetworkMaxSpectatorsReached(); void NetworkPrintClients(); void NetworkHandlePauseChange(PauseMode prev_mode, PauseMode changed_mode); diff --git a/src/network/network_gamelist.cpp b/src/network/network_gamelist.cpp index d4843ff673..ef5405dd2c 100644 --- a/src/network/network_gamelist.cpp +++ b/src/network/network_gamelist.cpp @@ -125,10 +125,7 @@ void NetworkAfterNewGRFScan() const GRFConfig *f = FindGRFConfig(c->ident.grfid, FGCM_EXACT, c->ident.md5sum); if (f == nullptr) { - /* Don't know the GRF, so mark game incompatible and the (possibly) - * already resolved name for this GRF (another server has sent the - * name of the GRF already. */ - c->name = FindUnknownGRFName(c->ident.grfid, c->ident.md5sum, true); + /* Don't know the GRF (anymore), so mark game incompatible. */ c->status = GCS_NOT_FOUND; /* If we miss a file, we're obviously incompatible. */ diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index 7db95af7c9..1b3d99e6e5 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -55,7 +55,6 @@ #include "../safeguards.h" static void ShowNetworkStartServerWindow(); -static void ShowNetworkLobbyWindow(NetworkGameList *ngl); static const int NETWORK_LIST_REFRESH_DELAY = 30; ///< Time, in seconds, between updates of the network list. @@ -498,7 +497,7 @@ public: this->filter_editbox.cancel_button = QueryString::ACTION_CLEAR; this->SetFocusedWidget(WID_NG_FILTER); - /* As the master-server doesn't support "websocket" servers yet, we + /* As the Game Coordinator doesn't support "websocket" servers yet, we * let "os/emscripten/pre.js" hardcode a list of servers people can * join. This means the serverlist is curated for now, but it is the * best we can offer. */ @@ -785,7 +784,7 @@ public: case WID_NG_JOIN: // Join Game if (this->server != nullptr) { - ShowNetworkLobbyWindow(this->server); + NetworkClientConnectGame(this->server->connection_string, COMPANY_SPECTATOR); } break; @@ -1005,7 +1004,6 @@ static WindowDesc _network_game_window_desc( void ShowNetworkGameWindow() { static bool first = true; - DeleteWindowById(WC_NETWORK_WINDOW, WN_NETWORK_WINDOW_LOBBY); DeleteWindowById(WC_NETWORK_WINDOW, WN_NETWORK_WINDOW_START); /* Only show once */ @@ -1048,10 +1046,6 @@ struct NetworkStartServerWindow : public Window { case WID_NSS_COMPANIES_TXT: SetDParam(0, _settings_client.network.max_companies); break; - - case WID_NSS_SPECTATORS_TXT: - SetDParam(0, _settings_client.network.max_spectators); - break; } } @@ -1094,7 +1088,6 @@ struct NetworkStartServerWindow : public Window { case WID_NSS_CLIENTS_BTND: case WID_NSS_CLIENTS_BTNU: // Click on up/down button for number of clients case WID_NSS_COMPANIES_BTND: case WID_NSS_COMPANIES_BTNU: // Click on up/down button for number of companies - case WID_NSS_SPECTATORS_BTND: case WID_NSS_SPECTATORS_BTNU: // Click on up/down button for number of spectators /* Don't allow too fast scrolling. */ if (!(this->flags & WF_TIMEOUT) || this->timeout_timer <= 1) { this->HandleButtonClick(widget); @@ -1107,9 +1100,6 @@ struct NetworkStartServerWindow : public Window { case WID_NSS_COMPANIES_BTND: case WID_NSS_COMPANIES_BTNU: _settings_client.network.max_companies = Clamp(_settings_client.network.max_companies + widget - WID_NSS_COMPANIES_TXT, 1, MAX_COMPANIES); break; - case WID_NSS_SPECTATORS_BTND: case WID_NSS_SPECTATORS_BTNU: - _settings_client.network.max_spectators = Clamp(_settings_client.network.max_spectators + widget - WID_NSS_SPECTATORS_TXT, 0, MAX_CLIENTS); - break; } } _left_button_clicked = false; @@ -1127,12 +1117,6 @@ struct NetworkStartServerWindow : public Window { ShowQueryString(STR_JUST_INT, STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES, 3, this, CS_NUMERAL, QSF_NONE); break; - case WID_NSS_SPECTATORS_TXT: // Click on number of spectators - this->widget_id = WID_NSS_SPECTATORS_TXT; - SetDParam(0, _settings_client.network.max_spectators); - ShowQueryString(STR_JUST_INT, STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS, 4, this, CS_NUMERAL, QSF_NONE); - break; - case WID_NSS_GENERATE_GAME: // Start game if (!CheckServerName()) return; _is_network_server = true; @@ -1187,7 +1171,7 @@ struct NetworkStartServerWindow : public Window { void OnTimeout() override { - static const int raise_widgets[] = {WID_NSS_CLIENTS_BTND, WID_NSS_CLIENTS_BTNU, WID_NSS_COMPANIES_BTND, WID_NSS_COMPANIES_BTNU, WID_NSS_SPECTATORS_BTND, WID_NSS_SPECTATORS_BTNU, WIDGET_LIST_END}; + static const int raise_widgets[] = {WID_NSS_CLIENTS_BTND, WID_NSS_CLIENTS_BTNU, WID_NSS_COMPANIES_BTND, WID_NSS_COMPANIES_BTNU, WIDGET_LIST_END}; for (const int *widget = raise_widgets; *widget != WIDGET_LIST_END; widget++) { if (this->IsWidgetLowered(*widget)) { this->RaiseWidget(*widget); @@ -1209,7 +1193,6 @@ struct NetworkStartServerWindow : public Window { default: NOT_REACHED(); case WID_NSS_CLIENTS_TXT: _settings_client.network.max_clients = Clamp(value, 2, MAX_CLIENTS); break; case WID_NSS_COMPANIES_TXT: _settings_client.network.max_companies = Clamp(value, 1, MAX_COMPANIES); break; - case WID_NSS_SPECTATORS_TXT: _settings_client.network.max_spectators = Clamp(value, 0, MAX_CLIENTS); break; } } @@ -1261,15 +1244,6 @@ static const NWidgetPart _nested_network_start_server_window_widgets[] = { NWidget(WWT_IMGBTN, COLOUR_LIGHT_BLUE, WID_NSS_COMPANIES_BTNU), SetMinimalSize(12, 12), SetFill(0, 1), SetDataTip(SPR_ARROW_UP, STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP), EndContainer(), EndContainer(), - - NWidget(NWID_VERTICAL), SetPIP(0, 1, 0), - NWidget(WWT_TEXT, COLOUR_LIGHT_BLUE, WID_NSS_SPECTATORS_LABEL), SetFill(1, 0), SetDataTip(STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS, STR_NULL), - NWidget(NWID_HORIZONTAL), - NWidget(WWT_IMGBTN, COLOUR_LIGHT_BLUE, WID_NSS_SPECTATORS_BTND), SetMinimalSize(12, 12), SetFill(0, 1), SetDataTip(SPR_ARROW_DOWN, STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_LIGHT_BLUE, WID_NSS_SPECTATORS_TXT), SetFill(1, 0), SetDataTip(STR_NETWORK_START_SERVER_SPECTATORS_SELECT, STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP), - NWidget(WWT_IMGBTN, COLOUR_LIGHT_BLUE, WID_NSS_SPECTATORS_BTNU), SetMinimalSize(12, 12), SetFill(0, 1), SetDataTip(SPR_ARROW_UP, STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP), - EndContainer(), - EndContainer(), EndContainer(), /* 'generate game' and 'load game' buttons */ @@ -1305,330 +1279,10 @@ static void ShowNetworkStartServerWindow() if (!NetworkValidateOurClientName()) return; DeleteWindowById(WC_NETWORK_WINDOW, WN_NETWORK_WINDOW_GAME); - DeleteWindowById(WC_NETWORK_WINDOW, WN_NETWORK_WINDOW_LOBBY); new NetworkStartServerWindow(&_network_start_server_window_desc); } -struct NetworkLobbyWindow : public Window { - CompanyID company; ///< Selected company - NetworkGameList *server; ///< Selected server - NetworkCompanyInfo company_info[MAX_COMPANIES]; - Scrollbar *vscroll; - - NetworkLobbyWindow(WindowDesc *desc, NetworkGameList *ngl) : - Window(desc), company(INVALID_COMPANY), server(ngl) - { - this->CreateNestedTree(); - this->vscroll = this->GetScrollbar(WID_NL_SCROLLBAR); - this->FinishInitNested(WN_NETWORK_WINDOW_LOBBY); - } - - CompanyID NetworkLobbyFindCompanyIndex(byte pos) const - { - /* Scroll through all this->company_info and get the 'pos' item that is not empty. */ - for (CompanyID i = COMPANY_FIRST; i < MAX_COMPANIES; i++) { - if (!this->company_info[i].company_name.empty()) { - if (pos-- == 0) return i; - } - } - - return COMPANY_FIRST; - } - - void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override - { - switch (widget) { - case WID_NL_HEADER: - size->height = WD_MATRIX_TOP + FONT_HEIGHT_NORMAL + WD_MATRIX_BOTTOM; - break; - - case WID_NL_MATRIX: - resize->height = WD_MATRIX_TOP + std::max(std::max(GetSpriteSize(SPR_LOCK).height, GetSpriteSize(SPR_PROFIT_LOT).height), FONT_HEIGHT_NORMAL) + WD_MATRIX_BOTTOM; - size->height = 10 * resize->height; - break; - - case WID_NL_DETAILS: - size->height = 30 + 11 * FONT_HEIGHT_NORMAL; - break; - } - } - - void SetStringParameters(int widget) const override - { - switch (widget) { - case WID_NL_TEXT: - SetDParamStr(0, this->server->info.server_name); - break; - } - } - - void DrawWidget(const Rect &r, int widget) const override - { - switch (widget) { - case WID_NL_DETAILS: - this->DrawDetails(r); - break; - - case WID_NL_MATRIX: - this->DrawMatrix(r); - break; - } - } - - void OnPaint() override - { - const NetworkGameInfo *gi = &this->server->info; - - /* Join button is disabled when no company is selected and for AI companies. */ - this->SetWidgetDisabledState(WID_NL_JOIN, this->company == INVALID_COMPANY || GetLobbyCompanyInfo(this->company)->ai); - /* Cannot start new company if there are too many. */ - this->SetWidgetDisabledState(WID_NL_NEW, gi->companies_on >= gi->companies_max); - /* Cannot spectate if there are too many spectators. */ - this->SetWidgetDisabledState(WID_NL_SPECTATE, gi->spectators_on >= gi->spectators_max); - - this->vscroll->SetCount(gi->companies_on); - - /* Draw window widgets */ - this->DrawWidgets(); - } - - void DrawMatrix(const Rect &r) const - { - bool rtl = _current_text_dir == TD_RTL; - uint left = r.left + WD_FRAMERECT_LEFT; - uint right = r.right - WD_FRAMERECT_RIGHT; - uint text_offset = (this->resize.step_height - WD_MATRIX_TOP - WD_MATRIX_BOTTOM - FONT_HEIGHT_NORMAL) / 2 + WD_MATRIX_TOP; - - Dimension lock_size = GetSpriteSize(SPR_LOCK); - int lock_width = lock_size.width; - int lock_y_offset = (this->resize.step_height - WD_MATRIX_TOP - WD_MATRIX_BOTTOM - lock_size.height) / 2 + WD_MATRIX_TOP; - - Dimension profit_size = GetSpriteSize(SPR_PROFIT_LOT); - int profit_width = lock_size.width; - int profit_y_offset = (this->resize.step_height - WD_MATRIX_TOP - WD_MATRIX_BOTTOM - profit_size.height) / 2 + WD_MATRIX_TOP; - - uint text_left = left + (rtl ? lock_width + profit_width + 4 : 0); - uint text_right = right - (rtl ? 0 : lock_width + profit_width + 4); - uint profit_left = rtl ? left : right - profit_width; - uint lock_left = rtl ? left + profit_width + 2 : right - profit_width - lock_width - 2; - - int y = r.top; - /* Draw company list */ - int pos = this->vscroll->GetPosition(); - while (pos < this->server->info.companies_on) { - byte company = NetworkLobbyFindCompanyIndex(pos); - bool income = false; - if (this->company == company) { - GfxFillRect(r.left + WD_BEVEL_LEFT, y + 1, r.right - WD_BEVEL_RIGHT, y + this->resize.step_height - 2, PC_GREY); // show highlighted item with a different colour - } - - DrawString(text_left, text_right, y + text_offset, this->company_info[company].company_name, TC_BLACK); - if (this->company_info[company].use_password != 0) DrawSprite(SPR_LOCK, PAL_NONE, lock_left, y + lock_y_offset); - - /* If the company's income was positive puts a green dot else a red dot */ - if (this->company_info[company].income >= 0) income = true; - DrawSprite(income ? SPR_PROFIT_LOT : SPR_PROFIT_NEGATIVE, PAL_NONE, profit_left, y + profit_y_offset); - - pos++; - y += this->resize.step_height; - if (pos >= this->vscroll->GetPosition() + this->vscroll->GetCapacity()) break; - } - } - - void DrawDetails(const Rect &r) const - { - const int detail_height = 12 + FONT_HEIGHT_NORMAL + 12; - /* Draw info about selected company when it is selected in the left window. */ - GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.top + detail_height - 1, PC_DARK_BLUE); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + 12, STR_NETWORK_GAME_LOBBY_COMPANY_INFO, TC_FROMSTRING, SA_HOR_CENTER); - - if (this->company == INVALID_COMPANY || this->company_info[this->company].company_name.empty()) return; - - int y = r.top + detail_height + 4; - const NetworkGameInfo *gi = &this->server->info; - - SetDParam(0, gi->clients_on); - SetDParam(1, gi->clients_max); - SetDParam(2, gi->companies_on); - SetDParam(3, gi->companies_max); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_NETWORK_SERVER_LIST_CLIENTS); - y += FONT_HEIGHT_NORMAL; - - SetDParamStr(0, this->company_info[this->company].company_name); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_NETWORK_GAME_LOBBY_COMPANY_NAME); - y += FONT_HEIGHT_NORMAL; - - SetDParam(0, this->company_info[this->company].inaugurated_year); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR); // inauguration year - y += FONT_HEIGHT_NORMAL; - - SetDParam(0, this->company_info[this->company].company_value); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_NETWORK_GAME_LOBBY_VALUE); // company value - y += FONT_HEIGHT_NORMAL; - - SetDParam(0, this->company_info[this->company].money); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE); // current balance - y += FONT_HEIGHT_NORMAL; - - SetDParam(0, this->company_info[this->company].income); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME); // last year's income - y += FONT_HEIGHT_NORMAL; - - SetDParam(0, this->company_info[this->company].performance); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_NETWORK_GAME_LOBBY_PERFORMANCE); // performance - y += FONT_HEIGHT_NORMAL; - - SetDParam(0, this->company_info[this->company].num_vehicle[NETWORK_VEH_TRAIN]); - SetDParam(1, this->company_info[this->company].num_vehicle[NETWORK_VEH_LORRY]); - SetDParam(2, this->company_info[this->company].num_vehicle[NETWORK_VEH_BUS]); - SetDParam(3, this->company_info[this->company].num_vehicle[NETWORK_VEH_SHIP]); - SetDParam(4, this->company_info[this->company].num_vehicle[NETWORK_VEH_PLANE]); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_NETWORK_GAME_LOBBY_VEHICLES); // vehicles - y += FONT_HEIGHT_NORMAL; - - SetDParam(0, this->company_info[this->company].num_station[NETWORK_VEH_TRAIN]); - SetDParam(1, this->company_info[this->company].num_station[NETWORK_VEH_LORRY]); - SetDParam(2, this->company_info[this->company].num_station[NETWORK_VEH_BUS]); - SetDParam(3, this->company_info[this->company].num_station[NETWORK_VEH_SHIP]); - SetDParam(4, this->company_info[this->company].num_station[NETWORK_VEH_PLANE]); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_NETWORK_GAME_LOBBY_STATIONS); // stations - y += FONT_HEIGHT_NORMAL; - - SetDParamStr(0, this->company_info[this->company].clients); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_NETWORK_GAME_LOBBY_PLAYERS); // players - } - - void OnClick(Point pt, int widget, int click_count) override - { - switch (widget) { - case WID_NL_CANCEL: // Cancel button - ShowNetworkGameWindow(); - break; - - case WID_NL_MATRIX: { // Company list - uint id_v = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_NL_MATRIX); - this->company = (id_v >= this->server->info.companies_on) ? INVALID_COMPANY : NetworkLobbyFindCompanyIndex(id_v); - this->SetDirty(); - - /* FIXME the disabling should go into some InvalidateData, which is called instead of the SetDirty */ - if (click_count > 1 && !this->IsWidgetDisabled(WID_NL_JOIN)) this->OnClick(pt, WID_NL_JOIN, 1); - break; - } - - case WID_NL_JOIN: // Join company - /* Button can be clicked only when it is enabled. */ - NetworkClientConnectGame(this->server->connection_string, this->company); - break; - - case WID_NL_NEW: // New company - NetworkClientConnectGame(this->server->connection_string, COMPANY_NEW_COMPANY); - break; - - case WID_NL_SPECTATE: // Spectate game - NetworkClientConnectGame(this->server->connection_string, COMPANY_SPECTATOR); - break; - - case WID_NL_REFRESH: // Refresh - /* Clear the information so removed companies don't remain */ - for (auto &company : this->company_info) company = {}; - - NetworkQueryLobbyServer(this->server->connection_string); - break; - } - } - - void OnResize() override - { - this->vscroll->SetCapacityFromWidget(this, WID_NL_MATRIX); - } -}; - -static const NWidgetPart _nested_network_lobby_window_widgets[] = { - NWidget(NWID_HORIZONTAL), - NWidget(WWT_CLOSEBOX, COLOUR_LIGHT_BLUE), - NWidget(WWT_CAPTION, COLOUR_LIGHT_BLUE), SetDataTip(STR_NETWORK_GAME_LOBBY_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), - EndContainer(), - NWidget(WWT_PANEL, COLOUR_LIGHT_BLUE, WID_NL_BACKGROUND), - NWidget(WWT_TEXT, COLOUR_LIGHT_BLUE, WID_NL_TEXT), SetDataTip(STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN, STR_NULL), SetResize(1, 0), SetPadding(10, 10, 0, 10), - NWidget(NWID_SPACER), SetMinimalSize(0, 3), - NWidget(NWID_HORIZONTAL), SetPIP(10, 0, 10), - /* Company list. */ - NWidget(NWID_VERTICAL), - NWidget(WWT_PANEL, COLOUR_WHITE, WID_NL_HEADER), SetMinimalSize(146, 0), SetResize(1, 0), SetFill(1, 0), EndContainer(), - NWidget(WWT_MATRIX, COLOUR_LIGHT_BLUE, WID_NL_MATRIX), SetMinimalSize(146, 0), SetResize(1, 1), SetFill(1, 1), SetMatrixDataTip(1, 0, STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP), SetScrollbar(WID_NL_SCROLLBAR), - EndContainer(), - NWidget(NWID_VSCROLLBAR, COLOUR_LIGHT_BLUE, WID_NL_SCROLLBAR), - NWidget(NWID_SPACER), SetMinimalSize(5, 0), SetResize(0, 1), - /* Company info. */ - NWidget(WWT_PANEL, COLOUR_LIGHT_BLUE, WID_NL_DETAILS), SetMinimalSize(232, 0), SetResize(1, 1), SetFill(1, 1), EndContainer(), - EndContainer(), - NWidget(NWID_SPACER), SetMinimalSize(0, 9), - /* Buttons. */ - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(10, 3, 10), - NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, 3, 0), - NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NL_JOIN), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_NETWORK_GAME_LOBBY_JOIN_COMPANY, STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NL_NEW), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_NETWORK_GAME_LOBBY_NEW_COMPANY, STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP), - EndContainer(), - NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, 3, 0), - NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NL_SPECTATE), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_NETWORK_GAME_LOBBY_SPECTATE_GAME, STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NL_REFRESH), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_NETWORK_SERVER_LIST_REFRESH, STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP), - EndContainer(), - NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, 3, 0), - NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NL_CANCEL), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_BUTTON_CANCEL, STR_NULL), - NWidget(NWID_SPACER), SetFill(1, 1), - EndContainer(), - EndContainer(), - NWidget(NWID_SPACER), SetMinimalSize(0, 8), - EndContainer(), -}; - -static WindowDesc _network_lobby_window_desc( - WDP_CENTER, nullptr, 0, 0, - WC_NETWORK_WINDOW, WC_NONE, - 0, - _nested_network_lobby_window_widgets, lengthof(_nested_network_lobby_window_widgets) -); - -/** - * Show the networklobbywindow with the selected server. - * @param ngl Selected game pointer which is passed to the new window. - */ -static void ShowNetworkLobbyWindow(NetworkGameList *ngl) -{ - if (!NetworkValidateOurClientName()) return; - - DeleteWindowById(WC_NETWORK_WINDOW, WN_NETWORK_WINDOW_START); - DeleteWindowById(WC_NETWORK_WINDOW, WN_NETWORK_WINDOW_GAME); - - _settings_client.network.last_joined = ngl->connection_string; - - NetworkQueryLobbyServer(ngl->connection_string); - - new NetworkLobbyWindow(&_network_lobby_window_desc, ngl); -} - -/** - * Get the company information of a given company to fill for the lobby. - * @param company the company to get the company info struct from. - * @return the company info struct to write the (downloaded) data to. - */ -NetworkCompanyInfo *GetLobbyCompanyInfo(CompanyID company) -{ - NetworkLobbyWindow *lobby = dynamic_cast(FindWindowById(WC_NETWORK_WINDOW, WN_NETWORK_WINDOW_LOBBY)); - return (lobby != nullptr && company < MAX_COMPANIES) ? &lobby->company_info[company] : nullptr; -} - -/** - * Get the game information for the lobby. - * @return the game info struct to write the (downloaded) data to. - */ -NetworkGameList *GetLobbyGameInfo() -{ - NetworkLobbyWindow *lobby = dynamic_cast(FindWindowById(WC_NETWORK_WINDOW, WN_NETWORK_WINDOW_LOBBY)); - return lobby != nullptr ? lobby->server : nullptr; -} - /* The window below gives information about the connected clients * and also makes able to kick them (if server) and stuff like that. */ @@ -1642,28 +1296,30 @@ static const NWidgetPart _nested_client_list_widgets[] = { NWidget(WWT_STICKYBOX, COLOUR_GREY), EndContainer(), NWidget(WWT_PANEL, COLOUR_GREY), - NWidget(NWID_SELECTION, INVALID_COLOUR, WID_CL_SERVER_SELECTOR), - NWidget(WWT_FRAME, COLOUR_GREY), SetDataTip(STR_NETWORK_CLIENT_LIST_SERVER, STR_NULL), SetPadding(4, 4, 0, 4), SetPIP(0, 2, 0), - NWidget(NWID_HORIZONTAL), SetPIP(0, 3, 0), - NWidget(WWT_TEXT, COLOUR_GREY), SetMinimalTextLines(1, 0), SetDataTip(STR_NETWORK_CLIENT_LIST_SERVER_NAME, STR_NULL), - NWidget(NWID_SPACER), SetMinimalSize(10, 0), - NWidget(WWT_TEXT, COLOUR_GREY, WID_CL_SERVER_NAME), SetFill(1, 0), SetMinimalTextLines(1, 0), SetResize(1, 0), SetDataTip(STR_BLACK_RAW_STRING, STR_NETWORK_CLIENT_LIST_SERVER_NAME_TOOLTIP), SetAlignment(SA_VERT_CENTER | SA_RIGHT), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_CL_SERVER_NAME_EDIT), SetMinimalSize(12, 14), SetDataTip(SPR_RENAME, STR_NETWORK_CLIENT_LIST_SERVER_NAME_EDIT_TOOLTIP), - EndContainer(), - NWidget(NWID_HORIZONTAL), SetPIP(0, 3, 0), - NWidget(WWT_TEXT, COLOUR_GREY), SetMinimalTextLines(1, 0), SetDataTip(STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY, STR_NULL), - NWidget(NWID_SPACER), SetMinimalSize(10, 0), SetFill(1, 0), SetResize(1, 0), - NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_CL_SERVER_VISIBILITY), SetDataTip(STR_BLACK_STRING, STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY_TOOLTIP), - EndContainer(), - NWidget(NWID_HORIZONTAL), SetPIP(0, 3, 0), - NWidget(WWT_TEXT, COLOUR_GREY), SetMinimalTextLines(1, 0), SetDataTip(STR_NETWORK_CLIENT_LIST_SERVER_INVITE_CODE, STR_NULL), - NWidget(NWID_SPACER), SetMinimalSize(10, 0), - NWidget(WWT_TEXT, COLOUR_GREY, WID_CL_SERVER_INVITE_CODE), SetFill(1, 0), SetMinimalTextLines(1, 0), SetResize(1, 0), SetDataTip(STR_BLACK_RAW_STRING, STR_NETWORK_CLIENT_LIST_SERVER_INVITE_CODE_TOOLTIP), SetAlignment(SA_VERT_CENTER | SA_RIGHT), - EndContainer(), - NWidget(NWID_HORIZONTAL), SetPIP(0, 3, 0), - NWidget(WWT_TEXT, COLOUR_GREY), SetMinimalTextLines(1, 0), SetDataTip(STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE, STR_NULL), - NWidget(NWID_SPACER), SetMinimalSize(10, 0), - NWidget(WWT_TEXT, COLOUR_GREY, WID_CL_SERVER_CONNECTION_TYPE), SetFill(1, 0), SetMinimalTextLines(1, 0), SetResize(1, 0), SetDataTip(STR_BLACK_STRING, STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TOOLTIP), SetAlignment(SA_VERT_CENTER | SA_RIGHT), + NWidget(WWT_FRAME, COLOUR_GREY), SetDataTip(STR_NETWORK_CLIENT_LIST_SERVER, STR_NULL), SetPadding(4, 4, 0, 4), SetPIP(0, 2, 0), + NWidget(NWID_HORIZONTAL), SetPIP(0, 3, 0), + NWidget(WWT_TEXT, COLOUR_GREY), SetMinimalTextLines(1, 0), SetDataTip(STR_NETWORK_CLIENT_LIST_SERVER_NAME, STR_NULL), + NWidget(NWID_SPACER), SetMinimalSize(10, 0), + NWidget(WWT_TEXT, COLOUR_GREY, WID_CL_SERVER_NAME), SetFill(1, 0), SetMinimalTextLines(1, 0), SetResize(1, 0), SetDataTip(STR_BLACK_RAW_STRING, STR_NETWORK_CLIENT_LIST_SERVER_NAME_TOOLTIP), SetAlignment(SA_VERT_CENTER | SA_RIGHT), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_CL_SERVER_NAME_EDIT), SetMinimalSize(12, 14), SetDataTip(SPR_RENAME, STR_NETWORK_CLIENT_LIST_SERVER_NAME_EDIT_TOOLTIP), + EndContainer(), + NWidget(NWID_SELECTION, INVALID_COLOUR, WID_CL_SERVER_SELECTOR), + NWidget(NWID_VERTICAL), + NWidget(NWID_HORIZONTAL), SetPIP(0, 3, 0), + NWidget(WWT_TEXT, COLOUR_GREY), SetMinimalTextLines(1, 0), SetDataTip(STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY, STR_NULL), + NWidget(NWID_SPACER), SetMinimalSize(10, 0), SetFill(1, 0), SetResize(1, 0), + NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_CL_SERVER_VISIBILITY), SetDataTip(STR_BLACK_STRING, STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY_TOOLTIP), + EndContainer(), + NWidget(NWID_HORIZONTAL), SetPIP(0, 3, 0), + NWidget(WWT_TEXT, COLOUR_GREY), SetMinimalTextLines(1, 0), SetDataTip(STR_NETWORK_CLIENT_LIST_SERVER_INVITE_CODE, STR_NULL), + NWidget(NWID_SPACER), SetMinimalSize(10, 0), + NWidget(WWT_TEXT, COLOUR_GREY, WID_CL_SERVER_INVITE_CODE), SetFill(1, 0), SetMinimalTextLines(1, 0), SetResize(1, 0), SetDataTip(STR_BLACK_RAW_STRING, STR_NETWORK_CLIENT_LIST_SERVER_INVITE_CODE_TOOLTIP), SetAlignment(SA_VERT_CENTER | SA_RIGHT), + EndContainer(), + NWidget(NWID_HORIZONTAL), SetPIP(0, 3, 0), + NWidget(WWT_TEXT, COLOUR_GREY), SetMinimalTextLines(1, 0), SetDataTip(STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE, STR_NULL), + NWidget(NWID_SPACER), SetMinimalSize(10, 0), + NWidget(WWT_TEXT, COLOUR_GREY, WID_CL_SERVER_CONNECTION_TYPE), SetFill(1, 0), SetMinimalTextLines(1, 0), SetResize(1, 0), SetDataTip(STR_BLACK_STRING, STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TOOLTIP), SetAlignment(SA_VERT_CENTER | SA_RIGHT), + EndContainer(), EndContainer(), EndContainer(), EndContainer(), @@ -1938,15 +1594,15 @@ private: /** * Part of RebuildList() to create the information for a single company. * @param company_id The company to build the list for. - * @param own_ci The NetworkClientInfo of the client itself. + * @param client_playas The company the client is joined as. */ - void RebuildListCompany(CompanyID company_id, const NetworkClientInfo *own_ci) + void RebuildListCompany(CompanyID company_id, CompanyID client_playas) { ButtonCommon *chat_button = new CompanyButton(SPR_CHAT, company_id == COMPANY_SPECTATOR ? STR_NETWORK_CLIENT_LIST_CHAT_SPECTATOR_TOOLTIP : STR_NETWORK_CLIENT_LIST_CHAT_COMPANY_TOOLTIP, COLOUR_ORANGE, company_id, &NetworkClientListWindow::OnClickCompanyChat); if (_network_server) this->buttons[line_count].emplace_back(new CompanyButton(SPR_ADMIN, STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_TOOLTIP, COLOUR_RED, company_id, &NetworkClientListWindow::OnClickCompanyAdmin, company_id == COMPANY_SPECTATOR)); this->buttons[line_count].emplace_back(chat_button); - if (own_ci->client_playas != company_id) this->buttons[line_count].emplace_back(new CompanyButton(SPR_JOIN, STR_NETWORK_CLIENT_LIST_JOIN_TOOLTIP, COLOUR_ORANGE, company_id, &NetworkClientListWindow::OnClickCompanyJoin, company_id != COMPANY_SPECTATOR && Company::Get(company_id)->is_ai)); + if (client_playas != company_id) this->buttons[line_count].emplace_back(new CompanyButton(SPR_JOIN, STR_NETWORK_CLIENT_LIST_JOIN_TOOLTIP, COLOUR_ORANGE, company_id, &NetworkClientListWindow::OnClickCompanyJoin, company_id != COMPANY_SPECTATOR && Company::Get(company_id)->is_ai)); this->line_count += 1; @@ -1977,6 +1633,7 @@ private: void RebuildList() { const NetworkClientInfo *own_ci = NetworkClientInfo::GetByClientID(_network_own_client_id); + CompanyID client_playas = own_ci == nullptr ? COMPANY_SPECTATOR : own_ci->client_playas; this->buttons.clear(); this->line_count = 0; @@ -1984,24 +1641,24 @@ private: this->player_self_index = -1; /* As spectator, show a line to create a new company. */ - if (own_ci->client_playas == COMPANY_SPECTATOR && !NetworkMaxCompaniesReached()) { + if (client_playas == COMPANY_SPECTATOR && !NetworkMaxCompaniesReached()) { this->buttons[line_count].emplace_back(new CompanyButton(SPR_JOIN, STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP, COLOUR_ORANGE, COMPANY_SPECTATOR, &NetworkClientListWindow::OnClickCompanyNew)); this->line_count += 1; } - if (own_ci->client_playas != COMPANY_SPECTATOR) { - this->RebuildListCompany(own_ci->client_playas, own_ci); + if (client_playas != COMPANY_SPECTATOR) { + this->RebuildListCompany(client_playas, client_playas); } /* Companies */ for (const Company *c : Company::Iterate()) { - if (c->index == own_ci->client_playas) continue; + if (c->index == client_playas) continue; - this->RebuildListCompany(c->index, own_ci); + this->RebuildListCompany(c->index, client_playas); } /* Spectators */ - this->RebuildListCompany(COMPANY_SPECTATOR, own_ci); + this->RebuildListCompany(COMPANY_SPECTATOR, client_playas); this->vscroll->SetCount(this->line_count); } @@ -2058,6 +1715,7 @@ public: /* Currently server information is not sync'd to clients, so we cannot show it on clients. */ this->GetWidget(WID_CL_SERVER_SELECTOR)->SetDisplayedPlane(_network_server ? 0 : SZSP_HORIZONTAL); + this->SetWidgetDisabledState(WID_CL_SERVER_NAME_EDIT, !_network_server); } void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override @@ -2092,7 +1750,7 @@ public: { switch (widget) { case WID_CL_SERVER_NAME: - SetDParamStr(0, _settings_client.network.server_name); + SetDParamStr(0, _network_server ? _settings_client.network.server_name : _network_server_name); break; case WID_CL_SERVER_VISIBILITY: @@ -2421,16 +2079,18 @@ public: } NetworkClientInfo *own_ci = NetworkClientInfo::GetByClientID(_network_own_client_id); - if (own_ci->client_playas == COMPANY_SPECTATOR && !NetworkMaxCompaniesReached()) { + CompanyID client_playas = own_ci == nullptr ? COMPANY_SPECTATOR : own_ci->client_playas; + + if (client_playas == COMPANY_SPECTATOR && !NetworkMaxCompaniesReached()) { this->DrawCompany(COMPANY_NEW_COMPANY, r.left, r.right, r.top, line); } - if (own_ci->client_playas != COMPANY_SPECTATOR) { - this->DrawCompany(own_ci->client_playas, r.left, r.right, r.top, line); + if (client_playas != COMPANY_SPECTATOR) { + this->DrawCompany(client_playas, r.left, r.right, r.top, line); } for (const Company *c : Company::Iterate()) { - if (own_ci->client_playas == c->index) continue; + if (client_playas == c->index) continue; this->DrawCompany(c->index, r.left, r.right, r.top, line); } @@ -2714,3 +2374,105 @@ void ShowNetworkCompanyPasswordWindow(Window *parent) new NetworkCompanyPasswordWindow(&_network_company_password_window_desc, parent); } + +/** + * Window used for asking the user if he is okay using a TURN server. + */ +struct NetworkAskRelayWindow : public Window { + std::string connection_string; ///< The TURN server we want to connect to. + std::string token; ///< The token for this connection. + + NetworkAskRelayWindow(WindowDesc *desc, Window *parent, const std::string &connection_string, const std::string &token) : Window(desc), connection_string(connection_string), token(token) + { + this->parent = parent; + this->InitNested(0); + } + + void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override + { + if (widget == WID_NAR_TEXT) { + *size = GetStringBoundingBox(STR_NETWORK_ASK_RELAY_TEXT); + size->height = GetStringHeight(STR_NETWORK_ASK_RELAY_TEXT, size->width - WD_FRAMETEXT_LEFT - WD_FRAMETEXT_RIGHT) + WD_FRAMETEXT_BOTTOM + WD_FRAMETEXT_TOP; + } + } + + void DrawWidget(const Rect &r, int widget) const override + { + if (widget == WID_NAR_TEXT) { + DrawStringMultiLine(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, r.top + WD_FRAMETEXT_TOP, r.bottom - WD_FRAMETEXT_BOTTOM, STR_NETWORK_ASK_RELAY_TEXT, TC_FROMSTRING, SA_CENTER); + } + } + + void FindWindowPlacementAndResize(int def_width, int def_height) override + { + /* Position query window over the calling window, ensuring it's within screen bounds. */ + this->left = Clamp(parent->left + (parent->width / 2) - (this->width / 2), 0, _screen.width - this->width); + this->top = Clamp(parent->top + (parent->height / 2) - (this->height / 2), 0, _screen.height - this->height); + this->SetDirty(); + } + + void SetStringParameters(int widget) const override + { + switch (widget) { + case WID_NAR_TEXT: + SetDParamStr(0, this->connection_string); + break; + } + } + + void OnClick(Point pt, int widget, int click_count) override + { + switch (widget) { + case WID_NAR_NO: + _network_coordinator_client.ConnectFailure(this->token, 0); + delete this; + break; + + case WID_NAR_YES_ONCE: + _network_coordinator_client.StartTurnConnection(this->token); + delete this; + break; + + case WID_NAR_YES_ALWAYS: + _settings_client.network.use_relay_service = URS_ALLOW; + _network_coordinator_client.StartTurnConnection(this->token); + delete this; + break; + } + } +}; + +static const NWidgetPart _nested_network_ask_relay_widgets[] = { + NWidget(NWID_HORIZONTAL), + NWidget(WWT_CLOSEBOX, COLOUR_RED), + NWidget(WWT_CAPTION, COLOUR_RED, WID_NAR_CAPTION), SetDataTip(STR_NETWORK_ASK_RELAY_CAPTION, STR_NULL), + EndContainer(), + NWidget(WWT_PANEL, COLOUR_RED), SetPIP(0, 0, 8), + NWidget(WWT_TEXT, COLOUR_RED, WID_NAR_TEXT), SetAlignment(SA_HOR_CENTER), SetFill(1, 1), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(10, 15, 10), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_NAR_NO), SetMinimalSize(71, 12), SetFill(1, 1), SetDataTip(STR_NETWORK_ASK_RELAY_NO, STR_NULL), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_NAR_YES_ONCE), SetMinimalSize(71, 12), SetFill(1, 1), SetDataTip(STR_NETWORK_ASK_RELAY_YES_ONCE, STR_NULL), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_NAR_YES_ALWAYS), SetMinimalSize(71, 12), SetFill(1, 1), SetDataTip(STR_NETWORK_ASK_RELAY_YES_ALWAYS, STR_NULL), + EndContainer(), + EndContainer(), +}; + +static WindowDesc _network_ask_relay_desc( + WDP_CENTER, nullptr, 0, 0, + WC_NETWORK_ASK_RELAY, WC_NONE, + WDF_MODAL, + _nested_network_ask_relay_widgets, lengthof(_nested_network_ask_relay_widgets) +); + +/** + * Show a modal confirmation window with "no" / "yes, once" / "yes, always" buttons. + * @param connection_string The relay server we want to connect to. + * @param token The token for this connection. + */ +void ShowNetworkAskRelay(const std::string &connection_string, const std::string &token) +{ + DeleteWindowByClass(WC_NETWORK_ASK_RELAY); + + Window *parent = FindWindowById(WC_MAIN_WINDOW, 0); + new NetworkAskRelayWindow(&_network_ask_relay_desc, parent, connection_string, token); +} diff --git a/src/network/network_gui.h b/src/network/network_gui.h index b5e834e608..e5d2ad20ff 100644 --- a/src/network/network_gui.h +++ b/src/network/network_gui.h @@ -38,7 +38,6 @@ struct NetworkCompanyInfo : NetworkCompanyStats { std::string clients; ///< The clients that control this company (Name1, name2, ..) }; -NetworkCompanyInfo *GetLobbyCompanyInfo(CompanyID company); -NetworkGameList *GetLobbyGameInfo(); +void ShowNetworkAskRelay(const std::string &connection_string, const std::string &token); #endif /* NETWORK_GUI_H */ diff --git a/src/network/network_internal.h b/src/network/network_internal.h index ffa1269402..66dea038e1 100644 --- a/src/network/network_internal.h +++ b/src/network/network_internal.h @@ -93,12 +93,14 @@ extern uint32 _network_join_bytes_total; extern ConnectionType _network_server_connection_type; extern std::string _network_server_invite_code; +/* Variable available for clients. */ +extern std::string _network_server_name; + extern uint8 _network_reconnect; extern CompanyMask _network_company_passworded; void NetworkQueryServer(const std::string &connection_string); -void NetworkQueryLobbyServer(const std::string &connection_string); void GetBindAddresses(NetworkAddressList *addresses, uint16 port); struct NetworkGameList *NetworkAddServer(const std::string &connection_string, bool manually = true, bool never_expire = false); diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index 4809562de6..4db82750bc 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -378,66 +378,6 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendGameInfoExtended(PacketGam return NETWORK_RECV_STATUS_OKAY; } -/** Send the client information about the companies. */ -NetworkRecvStatus ServerNetworkGameSocketHandler::SendCompanyInfo() -{ - /* Fetch the latest version of the stats */ - NetworkCompanyStats company_stats[MAX_COMPANIES]; - NetworkPopulateCompanyStats(company_stats); - - /* Make a list of all clients per company */ - std::string clients[MAX_COMPANIES]; - - /* Add the local player (if not dedicated) */ - const NetworkClientInfo *ci = NetworkClientInfo::GetByClientID(CLIENT_ID_SERVER); - if (ci != nullptr && Company::IsValidID(ci->client_playas)) { - clients[ci->client_playas] = ci->client_name; - } - - for (NetworkClientSocket *csi : NetworkClientSocket::Iterate()) { - char client_name[NETWORK_CLIENT_NAME_LENGTH]; - - ((ServerNetworkGameSocketHandler*)csi)->GetClientName(client_name, lastof(client_name)); - - ci = csi->GetInfo(); - if (ci != nullptr && Company::IsValidID(ci->client_playas)) { - if (!clients[ci->client_playas].empty()) { - clients[ci->client_playas] += ", "; - } - - clients[ci->client_playas] += client_name; - } - } - - /* Now send the data */ - - Packet *p; - - for (const Company *company : Company::Iterate()) { - p = new Packet(PACKET_SERVER_COMPANY_INFO, SHRT_MAX); - - p->Send_uint8 (NETWORK_COMPANY_INFO_VERSION); - p->Send_bool (true); - this->SendCompanyInformation(p, company, &company_stats[company->index]); - - if (clients[company->index].empty()) { - p->Send_string(""); - } else { - p->Send_string(clients[company->index]); - } - - this->SendPacket(p); - } - - p = new Packet(PACKET_SERVER_COMPANY_INFO, SHRT_MAX); - - p->Send_uint8 (NETWORK_COMPANY_INFO_VERSION); - p->Send_bool (false); - - this->SendPacket(p); - return NETWORK_RECV_STATUS_OKAY; -} - /** * Send an error to the client, and close its connection. * @param error The error to disconnect for. @@ -864,7 +804,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendConfigUpdate() Packet *p = new Packet(PACKET_SERVER_CONFIG_UPDATE, SHRT_MAX); p->Send_uint8(_settings_client.network.max_companies); - p->Send_uint8(_settings_client.network.max_spectators); + p->Send_string(_settings_client.network.server_name); this->SendPacket(p); return NETWORK_RECV_STATUS_OKAY; } @@ -895,11 +835,6 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GAME_INFO(Packe } } -NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMPANY_INFO(Packet *p) -{ - return this->SendCompanyInfo(); -} - NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_NEWGRFS_CHECKED(Packet *p) { if (this->status != STATUS_NEWGRFS_CHECK) { @@ -950,9 +885,6 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet *p) } break; case COMPANY_SPECTATOR: // Spectator - if (NetworkSpectatorCount() >= _settings_client.network.max_spectators) { - return this->SendError(NETWORK_ERROR_FULL); - } break; default: // Join another company (companies 1-8 (index 0-7)) if (!Company::IsValidHumanID(playas)) { @@ -1624,58 +1556,6 @@ std::string ServerNetworkGameSocketHandler::GetDebugInfo() const return stdstr_fmt("status: %d (%s)", this->status, GetClientStatusName(this->status)); } -/** - * Package some generic company information into a packet. - * @param p The packet that will contain the data. - * @param c The company to put the of into the packet. - * @param stats The statistics to put in the packet. - * @param max_len The maximum length of the company name. - */ -void NetworkSocketHandler::SendCompanyInformation(Packet *p, const Company *c, const NetworkCompanyStats *stats, uint max_len) -{ - /* Grab the company name */ - char company_name[NETWORK_COMPANY_NAME_LENGTH]; - SetDParam(0, c->index); - - assert(max_len <= lengthof(company_name)); - GetString(company_name, STR_COMPANY_NAME, company_name + max_len - 1); - - /* Get the income */ - Money income = 0; - if (_cur_year - 1 == c->inaugurated_year) { - /* The company is here just 1 year, so display [2], else display[1] */ - for (uint i = 0; i < lengthof(c->yearly_expenses[2]); i++) { - income -= c->yearly_expenses[2][i]; - } - } else { - for (uint i = 0; i < lengthof(c->yearly_expenses[1]); i++) { - income -= c->yearly_expenses[1][i]; - } - } - - /* Send the information */ - p->Send_uint8 (c->index); - p->Send_string(company_name); - p->Send_uint32(c->inaugurated_year); - p->Send_uint64(c->old_economy[0].company_value); - p->Send_uint64(c->money); - p->Send_uint64(income); - p->Send_uint16(c->old_economy[0].performance_history); - - /* Send 1 if there is a password for the company else send 0 */ - p->Send_bool (!_network_company_states[c->index].password.empty()); - - for (uint i = 0; i < NETWORK_VEH_END; i++) { - p->Send_uint16(stats->num_vehicle[i]); - } - - for (uint i = 0; i < NETWORK_VEH_END; i++) { - p->Send_uint16(stats->num_station[i]); - } - - p->Send_bool(c->is_ai); -} - /** * Populate the company stats. * @param stats the stats to update diff --git a/src/network/network_server.h b/src/network/network_server.h index 96533f33f6..43e37f42ed 100644 --- a/src/network/network_server.h +++ b/src/network/network_server.h @@ -25,7 +25,6 @@ class ServerNetworkGameSocketHandler : public NetworkClientSocketPool::PoolItem< protected: NetworkRecvStatus Receive_CLIENT_JOIN(Packet *p) override; NetworkRecvStatus Receive_CLIENT_GAME_INFO(Packet *p) override; - NetworkRecvStatus Receive_CLIENT_COMPANY_INFO(Packet *p) override; NetworkRecvStatus Receive_CLIENT_GAME_PASSWORD(Packet *p) override; NetworkRecvStatus Receive_CLIENT_COMPANY_PASSWORD(Packet *p) override; NetworkRecvStatus Receive_CLIENT_SETTINGS_PASSWORD(Packet *p) override; @@ -46,7 +45,6 @@ protected: NetworkRecvStatus SendGameInfo(); NetworkRecvStatus SendGameInfoExtended(PacketGameType reply_type, uint16 flags, uint16 version); - NetworkRecvStatus SendCompanyInfo(); NetworkRecvStatus SendNewGRFCheck(); NetworkRecvStatus SendWelcome(); NetworkRecvStatus SendNeedGamePassword(); diff --git a/src/network/network_turn.cpp b/src/network/network_turn.cpp new file mode 100644 index 0000000000..e04bec47ca --- /dev/null +++ b/src/network/network_turn.cpp @@ -0,0 +1,135 @@ +/* + * 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 network_turn.cpp TURN sending/receiving part of the network protocol. */ + +#include "../stdafx.h" +#include "../debug.h" +#include "../error.h" +#include "../strings_func.h" +#include "network_coordinator.h" +#include "network_turn.h" + +#include "table/strings.h" + +#include "../safeguards.h" + +/** Connect to the TURN server. */ +class NetworkTurnConnecter : public TCPConnecter { +private: + ClientNetworkTurnSocketHandler *handler; + +public: + /** + * Initiate the connecting. + * @param connection_string The address of the TURN server. + */ + NetworkTurnConnecter(ClientNetworkTurnSocketHandler *handler, const std::string &connection_string) : TCPConnecter(connection_string, NETWORK_TURN_SERVER_PORT), handler(handler) {} + + void OnFailure() override + { + this->handler->connecter = nullptr; + + this->handler->ConnectFailure(); + } + + void OnConnect(SOCKET s) override + { + this->handler->connecter = nullptr; + + handler->sock = s; + } +}; + +bool ClientNetworkTurnSocketHandler::Receive_TURN_ERROR(Packet *p) +{ + this->ConnectFailure(); + + return false; +} + +bool ClientNetworkTurnSocketHandler::Receive_TURN_CONNECTED(Packet *p) +{ + std::string hostname = p->Recv_string(NETWORK_HOSTNAME_LENGTH); + + /* Act like we no longer have a socket, as we are handing it over to the + * game handler. */ + SOCKET game_sock = this->sock; + this->sock = INVALID_SOCKET; + + NetworkAddress address = NetworkAddress(hostname, NETWORK_DEFAULT_PORT); + _network_coordinator_client.ConnectSuccess(this->token, game_sock, address); + + return false; +} + +/** + * Connect to the TURN server. + */ +void ClientNetworkTurnSocketHandler::Connect() +{ + this->connect_started = true; + this->connecter = new NetworkTurnConnecter(this, this->connection_string); +} + +/** + * Prepare a TURN connection. + * Not until you run Connect() on the resulting instance will it start setting + * up the TURN connection. + * @param token The token as received from the Game Coordinator. + * @param tracking_number The tracking number as recieved from the Game Coordinator. + * @param ticket The ticket as received from the Game Coordinator. + * @param connection_string Connection string of the TURN server. + * @return The handler for this TURN connection. + */ +/* static */ std::unique_ptr ClientNetworkTurnSocketHandler::Turn(const std::string &token, uint8 tracking_number, const std::string &ticket, const std::string &connection_string) +{ + auto turn_handler = std::make_unique(token, tracking_number, connection_string); + + Packet *p = new Packet(PACKET_TURN_SERCLI_CONNECT); + p->Send_uint8(NETWORK_COORDINATOR_VERSION); + p->Send_string(ticket); + + turn_handler->SendPacket(p); + + return turn_handler; +} + +void ClientNetworkTurnSocketHandler::ConnectFailure() +{ + _network_coordinator_client.ConnectFailure(this->token, this->tracking_number); +} + +NetworkRecvStatus ClientNetworkTurnSocketHandler::CloseConnection(bool error) +{ + NetworkTurnSocketHandler::CloseConnection(error); + + /* If our connecter is still pending, shut it down too. Otherwise the + * callback of the connecter can call into us, and our object is most + * likely about to be destroyed. */ + if (this->connecter != nullptr) { + this->connecter->Kill(); + this->connecter = nullptr; + } + + return NETWORK_RECV_STATUS_OKAY; +} + +/** + * Check whether we received/can send some data from/to the TURN server and + * when that's the case handle it appropriately + */ +void ClientNetworkTurnSocketHandler::SendReceive() +{ + if (this->sock == INVALID_SOCKET) return; + + if (this->CanSendReceive()) { + this->ReceivePackets(); + } + + this->SendPackets(); +} diff --git a/src/network/network_turn.h b/src/network/network_turn.h new file mode 100644 index 0000000000..cc569a977d --- /dev/null +++ b/src/network/network_turn.h @@ -0,0 +1,41 @@ +/* + * 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 network_turn.h Part of the network protocol handling TURN requests. */ + +#ifndef NETWORK_TURN_H +#define NETWORK_TURN_H + +#include "core/tcp_turn.h" + +/** Class for handling the client side of the TURN connection. */ +class ClientNetworkTurnSocketHandler : public NetworkTurnSocketHandler { +private: + std::string token; ///< Token of this connection. + uint8 tracking_number; ///< Tracking number of this connection. + std::string connection_string; ///< The connection string of the TURN server we are connecting to. + +protected: + bool Receive_TURN_ERROR(Packet *p) override; + bool Receive_TURN_CONNECTED(Packet *p) override; + +public: + TCPConnecter *connecter = nullptr; ///< Connecter instance. + bool connect_started = false; ///< Whether we started the connection. + + ClientNetworkTurnSocketHandler(const std::string &token, uint8 tracking_number, const std::string &connection_string) : token(token), tracking_number(tracking_number), connection_string(connection_string) {} + + NetworkRecvStatus CloseConnection(bool error = true) override; + void SendReceive(); + + void Connect(); + void ConnectFailure(); + + static std::unique_ptr Turn(const std::string &token, uint8 tracking_number, const std::string &ticket, const std::string &connection_string); +}; + +#endif /* NETWORK_TURN_H */ diff --git a/src/newgrf.cpp b/src/newgrf.cpp index c011a8f3e9..79e3d39506 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -1368,6 +1368,10 @@ static ChangeInfoResult RailVehicleChangeInfo(uint engine, int numinfo, int prop break; } + case PROP_TRAIN_CURVE_SPEED_MOD: // 0x2E Curve speed modifier + rvi->curve_speed_mod = buf->ReadWord(); + break; + default: ret = CommonVehicleChangeInfo(ei, prop, mapping_entry, buf); break; diff --git a/src/newgrf_config.cpp b/src/newgrf_config.cpp index 3bfa1f1488..46ca0d5b21 100644 --- a/src/newgrf_config.cpp +++ b/src/newgrf_config.cpp @@ -854,53 +854,6 @@ const GRFConfig *FindGRFConfig(uint32 grfid, FindGRFConfigMode mode, const uint8 return best; } -/** Structure for UnknownGRFs; this is a lightweight variant of GRFConfig */ -struct UnknownGRF : public GRFIdentifier { - GRFTextWrapper name; ///< Name of the GRF. - - UnknownGRF() = default; - UnknownGRF(const UnknownGRF &other) = default; - UnknownGRF(UnknownGRF &&other) = default; - UnknownGRF(uint32 grfid, const uint8 *_md5sum) : GRFIdentifier(grfid, _md5sum), name(new GRFTextList) {} -}; - -/** - * Finds the name of a NewGRF in the list of names for unknown GRFs. An - * unknown GRF is a GRF where the .grf is not found during scanning. - * - * The names are resolved via UDP calls to servers that should know the name, - * though the replies may not come. This leaves "" as name, though - * that shouldn't matter _very_ much as they need GRF crawler or so to look - * up the GRF anyway and that works better with the GRF ID. - * - * @param grfid the GRF ID part of the 'unique' GRF identifier - * @param md5sum the MD5 checksum part of the 'unique' GRF identifier - * @param create whether to create a new GRFConfig if the GRFConfig did not - * exist in the fake list of GRFConfigs. - * @return The GRFTextWrapper of the name of the GRFConfig with the given GRF ID - * and MD5 checksum or nullptr when it does not exist and create is false. - * This value must NEVER be freed by the caller. - */ -GRFTextWrapper FindUnknownGRFName(uint32 grfid, uint8 *md5sum, bool create) -{ - static std::vector unknown_grfs; - - for (const auto &grf : unknown_grfs) { - if (grf.grfid == grfid) { - if (memcmp(md5sum, grf.md5sum, sizeof(grf.md5sum)) == 0) return grf.name; - } - } - - if (!create) return nullptr; - - unknown_grfs.emplace_back(grfid, md5sum); - UnknownGRF &grf = unknown_grfs.back(); - - AddGRFTextToList(grf.name, UNKNOWN_GRF_NAME_PLACEHOLDER); - - return grf.name; -} - /** * Retrieve a NewGRF from the current config by its grfid. * @param grfid grf to look for. diff --git a/src/newgrf_config.h b/src/newgrf_config.h index 0729535ed7..833fa761d6 100644 --- a/src/newgrf_config.h +++ b/src/newgrf_config.h @@ -244,10 +244,6 @@ char *GRFBuildParamList(char *dst, const GRFConfig *c, const char *last); /* In newgrf_gui.cpp */ void ShowNewGRFSettings(bool editable, bool show_params, bool exec_changes, GRFConfig **config); -/** For communication about GRFs over the network */ -#define UNKNOWN_GRF_NAME_PLACEHOLDER "" -GRFTextWrapper FindUnknownGRFName(uint32 grfid, uint8 *md5sum, bool create); - void UpdateNewGRFScanStatus(uint num, const char *name); void UpdateNewGRFConfigPalette(int32 new_value = 0); diff --git a/src/newgrf_engine.cpp b/src/newgrf_engine.cpp index caaa6932d6..5933ea79f9 100644 --- a/src/newgrf_engine.cpp +++ b/src/newgrf_engine.cpp @@ -1329,13 +1329,13 @@ uint16 GetVehicleCallbackParent(CallbackID callback, uint32 param1, uint32 param /* Callback 36 handlers */ -uint GetVehicleProperty(const Vehicle *v, PropertyID property, uint orig_value) +int GetVehicleProperty(const Vehicle *v, PropertyID property, int orig_value, bool is_signed) { - return GetEngineProperty(v->engine_type, property, orig_value, v); + return GetEngineProperty(v->engine_type, property, orig_value, v, is_signed); } -uint GetEngineProperty(EngineID engine, PropertyID property, uint orig_value, const Vehicle *v) +int GetEngineProperty(EngineID engine, PropertyID property, int orig_value, const Vehicle *v, bool is_signed) { const Engine *e = Engine::Get(engine); if (static_cast(property) < 64 && !HasBit(e->cb36_properties_used, property)) return orig_value; @@ -1348,7 +1348,14 @@ uint GetEngineProperty(EngineID engine, PropertyID property, uint orig_value, co } } uint16 callback = object.ResolveCallback(); - if (callback != CALLBACK_FAILED) return callback; + if (callback != CALLBACK_FAILED) { + if (is_signed) { + /* Sign extend 15 bit integer */ + return static_cast(callback << 1) / 2; + } else { + return callback; + } + } return orig_value; } diff --git a/src/newgrf_engine.h b/src/newgrf_engine.h index 2ded4aea5f..8d0df22248 100644 --- a/src/newgrf_engine.h +++ b/src/newgrf_engine.h @@ -100,8 +100,8 @@ bool UsesWagonOverride(const Vehicle *v); /* Handler to Evaluate callback 36. If the callback fails (i.e. most of the * time) orig_value is returned */ -uint GetVehicleProperty(const Vehicle *v, PropertyID property, uint orig_value); -uint GetEngineProperty(EngineID engine, PropertyID property, uint orig_value, const Vehicle *v = nullptr); +int GetVehicleProperty(const Vehicle *v, PropertyID property, int orig_value, bool is_signed = false); +int GetEngineProperty(EngineID engine, PropertyID property, int orig_value, const Vehicle *v = nullptr, bool is_signed = false); enum VehicleTrigger { VEHICLE_TRIGGER_NEW_CARGO = 0x01, diff --git a/src/newgrf_properties.h b/src/newgrf_properties.h index 94dde722e7..9e697bf7b5 100644 --- a/src/newgrf_properties.h +++ b/src/newgrf_properties.h @@ -28,6 +28,7 @@ enum PropertyID : byte { PROP_TRAIN_SHORTEN_FACTOR = 0x21, ///< Shorter vehicles PROP_TRAIN_USER_DATA = 0x25, ///< User defined data for vehicle variable 0x42 PROP_TRAIN_CARGO_AGE_PERIOD = 0x2B, ///< Number of ticks before carried cargo is aged + PROP_TRAIN_CURVE_SPEED_MOD = 0x2E, ///< Modifier to maximum speed in curves PROP_ROADVEH_RUNNING_COST_FACTOR = 0x09, ///< Yearly runningcost PROP_ROADVEH_CARGO_CAPACITY = 0x0F, ///< Capacity diff --git a/src/openttd.cpp b/src/openttd.cpp index e2f461d5e8..37b493a63c 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -75,6 +75,7 @@ #include "tbtr_template_vehicle.h" #include "string_func_extra.h" #include "industry.h" +#include "network/network_gui.h" #include "cargopacket.h" #include "core/checksum_func.hpp" #include "tbtr_template_vehicle_func.h" @@ -1063,6 +1064,8 @@ static void MakeNewGameDone() CheckEngines(); CheckIndustries(); MarkWholeScreenDirty(); + + if (_network_server && !_network_dedicated) ShowClientList(); } /* @@ -1887,8 +1890,8 @@ void StateGameLoop() */ static void DoAutosave() { - static int _autosave_ctr = 0; - DoAutoOrNetsave(_autosave_ctr); + static FiosNumberedSaveName _autosave_ctr("autosave"); + DoAutoOrNetsave(_autosave_ctr, true); } /** diff --git a/src/os/windows/ottdres.rc.in b/src/os/windows/ottdres.rc.in index 31309382cf..279389a04c 100644 --- a/src/os/windows/ottdres.rc.in +++ b/src/os/windows/ottdres.rc.in @@ -77,8 +77,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION ${REV_MAJOR},${REV_MINOR},${REV_BUILD},${REV_ISODATE} - PRODUCTVERSION ${REV_MAJOR},${REV_MINOR},${REV_BUILD},${REV_ISODATE} + FILEVERSION ${REV_MAJOR},${REV_MINOR},0,${REV_ISODATE} + PRODUCTVERSION ${REV_MAJOR},${REV_MINOR},0,${REV_ISODATE} FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L diff --git a/src/rev.cpp.in b/src/rev.cpp.in index 976943731e..6b29d150ab 100644 --- a/src/rev.cpp.in +++ b/src/rev.cpp.in @@ -89,15 +89,18 @@ const char _openttd_content_version[] = "12.0"; /** * The NewGRF revision of OTTD: * bits meaning. - * 28-31 major version - * 24-27 minor version - * 20-23 build + * 24-31 major version + 16 + * 20-23 minor version * 19 1 if it is a release, 0 if it is not. * 0-18 used to be the SVN revision, now just last revision before switch to git * * The 19th bit is there so the development/betas/alpha, etc. leading to a * final release will always have a lower version number than the released * version, thus making comparisons on specific revisions easy. + * + * The + 16 for the major version is because we went from 1.11.0 to 12.0, dropping + * the "patch" part of the version. To make sure "1.11.0" is smaller than "12.0", we + * have to adjust the major by 16. */ /** ${REV_ISSTABLETAG} removed */ -const uint32 _openttd_newgrf_version = ${REV_MAJOR} << 28 | ${REV_MINOR} << 24 | ${REV_BUILD} << 20 | 0 << 19 | 28004; +const uint32 _openttd_newgrf_version = (${REV_MAJOR} + 16) << 24 | ${REV_MINOR} << 20 | 0 << 19 | 28004; diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index 3235614482..a8b2bc037a 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -3640,30 +3640,19 @@ SaveOrLoadResult SaveOrLoad(const std::string &filename, SaveLoadOperation fop, * @param counter A reference to the counter variable to be used for rotating the file name. * @param netsave Indicates if this is a regular autosave or a netsave. */ -void DoAutoOrNetsave(int &counter, bool netsave) +void DoAutoOrNetsave(FiosNumberedSaveName &counter, bool threaded) { char buf[MAX_PATH]; if (_settings_client.gui.keep_all_autosave) { GenerateDefaultSaveName(buf, lastof(buf)); - if (!netsave) { - strecat(buf, ".sav", lastof(buf)); - } else { - strecat(buf, "-netsave.sav", lastof(buf)); - } + strecat(buf, counter.Extension().c_str(), lastof(buf)); } else { - /* Generate a savegame name and number according to _settings_client.gui.max_num_autosaves. */ - if (!netsave) { - seprintf(buf, lastof(buf), "autosave%d.sav", counter); - } else { - seprintf(buf, lastof(buf), "netsave%d.sav", counter); - } - - if (++counter >= _settings_client.gui.max_num_autosaves) counter = 0; + strecpy(buf, counter.Filename().c_str(), lastof(buf)); } DEBUG(sl, 2, "Autosaving to '%s'", buf); - if (SaveOrLoad(buf, SLO_SAVE, DFT_GAME_FILE, AUTOSAVE_DIR, !netsave, SMF_ZSTD_OK) != SL_OK) { + if (SaveOrLoad(buf, SLO_SAVE, DFT_GAME_FILE, AUTOSAVE_DIR, threaded, SMF_ZSTD_OK) != SL_OK) { ShowErrorMessage(STR_ERROR_AUTOSAVE_FAILED, INVALID_STRING_ID, WL_ERROR); } } diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index fe30a9e837..6c8f3aa1d3 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -12,6 +12,7 @@ #include "saveload_types.h" #include "../fileio_type.h" +#include "../fios.h" #include "../strings_type.h" #include @@ -67,7 +68,7 @@ void WaitTillSaved(); void ProcessAsyncSaveFinish(); void DoExitSave(); -void DoAutoOrNetsave(int &counter, bool netsave = false); +void DoAutoOrNetsave(FiosNumberedSaveName &counter, bool threaded); SaveOrLoadResult SaveWithFilter(struct SaveFilter *writer, bool threaded, SaveModeFlags flags); SaveOrLoadResult LoadWithFilter(struct LoadFilter *reader); diff --git a/src/saveload/upstream/saveload.h b/src/saveload/upstream/saveload.h index b7fc9fbd2d..0e5219a5fd 100644 --- a/src/saveload/upstream/saveload.h +++ b/src/saveload/upstream/saveload.h @@ -15,7 +15,7 @@ #include "../../fios.h" #include "../../strings_type.h" #include "../../core/span_type.hpp" -#include +#include "../../3rdparty/optional/ottd_optional.h" #include #include diff --git a/src/script/api/CMakeLists.txt b/src/script/api/CMakeLists.txt index c21707d431..a6390e2bb6 100644 --- a/src/script/api/CMakeLists.txt +++ b/src/script/api/CMakeLists.txt @@ -179,6 +179,7 @@ add_files( script_log.hpp script_map.hpp script_marine.hpp + script_newgrf.hpp script_news.hpp script_object.hpp script_order.hpp @@ -246,6 +247,7 @@ add_files( script_log.cpp script_map.cpp script_marine.cpp + script_newgrf.cpp script_news.cpp script_object.cpp script_order.cpp diff --git a/src/script/api/ai_changelog.hpp b/src/script/api/ai_changelog.hpp index f63b41fa9b..e5699a7d47 100644 --- a/src/script/api/ai_changelog.hpp +++ b/src/script/api/ai_changelog.hpp @@ -13,10 +13,15 @@ * functions may still be available if you return an older API version * in GetAPIVersion() in info.nut. * - * \b 1.12.0 + * \b 12.0 * * This version is not yet released. The following changes are not set in stone yet. * + * API additions: + * \li AINewGRF + * \li AINewGRFList + * \li AIGroup::GetNumVehicles + * * \b 1.11.0 * * API additions: diff --git a/src/script/api/game_changelog.hpp b/src/script/api/game_changelog.hpp index 2702a98e7c..d3efea9197 100644 --- a/src/script/api/game_changelog.hpp +++ b/src/script/api/game_changelog.hpp @@ -13,10 +13,14 @@ * functions may still be available if you return an older API version * in GetAPIVersion() in info.nut. * - * \b 1.12.0 + * \b 12.0 * * This version is not yet released. The following changes are not set in stone yet. * + * API additions: + * \li GSNewGRF + * \li GSNewGRFList + * * \b 1.11.0 * * API additions: diff --git a/src/script/api/script_company.cpp b/src/script/api/script_company.cpp index 9f5722c100..dddcc950c7 100644 --- a/src/script/api/script_company.cpp +++ b/src/script/api/script_company.cpp @@ -140,9 +140,9 @@ if (quarter > EARLIEST_QUARTER) return -1; if (quarter == CURRENT_QUARTER) { - return ::Company::Get(company)->cur_economy.delivered_cargo.GetSum >(); + return ::Company::Get(company)->cur_economy.delivered_cargo.GetSum(); } - return ::Company::Get(company)->old_economy[quarter - 1].delivered_cargo.GetSum >(); + return ::Company::Get(company)->old_economy[quarter - 1].delivered_cargo.GetSum(); } /* static */ int32 ScriptCompany::GetQuarterlyPerformanceRating(ScriptCompany::CompanyID company, uint32 quarter) diff --git a/src/script/api/script_controller.hpp b/src/script/api/script_controller.hpp index 59da55e719..cd2a4ff640 100644 --- a/src/script/api/script_controller.hpp +++ b/src/script/api/script_controller.hpp @@ -140,11 +140,20 @@ public: /** * Get the OpenTTD version of this executable. The version is formatted * with the bits having the following meaning: - * 28-31 major version - * 24-27 minor version - * 20-23 build + * 24-31 major version + 16. + * 20-23 minor version. * 19 1 if it is a release, 0 if it is not. * 0-18 revision number; 0 when the revision is unknown. + * You have to subtract 16 from the major version to get the correct + * value. + * + * Prior to OpenTTD 12, the bits have the following meaning: + * 28-31 major version. + * 24-27 minor version. + * 20-23 build. + * 19 1 if it is a release, 0 if it is not. + * 0-18 revision number; 0 when the revision is unknown. + * * @return The version in newgrf format. */ static uint GetVersion(); diff --git a/src/script/api/script_group.cpp b/src/script/api/script_group.cpp index 0295c67aa7..a6e2fdee25 100644 --- a/src/script/api/script_group.cpp +++ b/src/script/api/script_group.cpp @@ -106,6 +106,15 @@ return GetGroupNumEngines(ScriptObject::GetCompany(), group_id, engine_id); } +/* static */ int32 ScriptGroup::GetNumVehicles(GroupID group_id, ScriptVehicle::VehicleType vehicle_type) +{ + bool valid_group = IsValidGroup(group_id); + if (!valid_group && group_id != GROUP_DEFAULT && group_id != GROUP_ALL) return -1; + if (!valid_group && (vehicle_type < ScriptVehicle::VT_RAIL || vehicle_type > ScriptVehicle::VT_AIR)) return -1; + + return GetGroupNumVehicle(ScriptObject::GetCompany(), group_id, valid_group ? ::Group::Get(group_id)->vehicle_type : (::VehicleType)vehicle_type); +} + /* static */ bool ScriptGroup::MoveVehicle(GroupID group_id, VehicleID vehicle_id) { EnforcePrecondition(false, IsValidGroup(group_id) || group_id == GROUP_DEFAULT); diff --git a/src/script/api/script_group.hpp b/src/script/api/script_group.hpp index 2c27b81c6e..384fea7a28 100644 --- a/src/script/api/script_group.hpp +++ b/src/script/api/script_group.hpp @@ -128,6 +128,20 @@ public: */ static int32 GetNumEngines(GroupID group_id, EngineID engine_id); + /** + * Get the total number of vehicles in a given group and its sub-groups. + * @param group_id The group to get the number of vehicles in. + * @param vehicle_type The type of vehicle of the group. + * @pre IsValidGroup(group_id) || group_id == GROUP_ALL || group_id == GROUP_DEFAULT. + * @pre IsValidGroup(group_id) || vehicle_type == ScriptVehicle::VT_ROAD || vehicle_type == ScriptVehicle::VT_RAIL || + * vehicle_type == ScriptVehicle::VT_WATER || vehicle_type == ScriptVehicle::VT_AIR + * @return The total number of vehicles in the group with id group_id and it's sub-groups. + * @note If the group is valid (neither GROUP_ALL nor GROUP_DEFAULT), the value of + * vehicle_type is retrieved from the group itself and not from the input value. + * But if the group is GROUP_ALL or GROUP_DEFAULT, then vehicle_type must be valid. + */ + static int32 GetNumVehicles(GroupID group_id, ScriptVehicle::VehicleType vehicle_type); + /** * Move a vehicle to a group. * @param group_id The group to move the vehicle to. diff --git a/src/script/api/script_list.cpp b/src/script/api/script_list.cpp index 2aa32fb941..74ded7d087 100644 --- a/src/script/api/script_list.cpp +++ b/src/script/api/script_list.cpp @@ -832,7 +832,7 @@ SQInteger ScriptList::_nexti(HSQUIRRELVM vm) SQInteger idx; sq_getinteger(vm, 2, &idx); - int val = this->Next(); + SQInteger val = this->Next(); if (this->IsEnd()) { sq_pushnull(vm); return 1; diff --git a/src/script/api/script_newgrf.cpp b/src/script/api/script_newgrf.cpp new file mode 100644 index 0000000000..9cdeeb1914 --- /dev/null +++ b/src/script/api/script_newgrf.cpp @@ -0,0 +1,64 @@ +/* + * This file is part of OpenTTD. + * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. + * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . + */ + +/** @file script_newgrf.cpp Implementation of ScriptNewGRF and friends. */ + +#include "../../stdafx.h" +#include "script_newgrf.hpp" +#include "../../core/bitmath_func.hpp" +#include "../../newgrf_config.h" +#include "../../string_func.h" + +#include "../../safeguards.h" + +ScriptNewGRFList::ScriptNewGRFList() +{ + for (auto c = _grfconfig; c != nullptr; c = c->next) { + if (!HasBit(c->flags, GCF_STATIC)) { + this->AddItem(BSWAP32(c->ident.grfid)); + } + } +} + +/* static */ bool ScriptNewGRF::IsLoaded(uint32 grfid) +{ + grfid = BSWAP32(grfid); // Match people's expectations. + + for (auto c = _grfconfig; c != nullptr; c = c->next) { + if (!HasBit(c->flags, GCF_STATIC) && c->ident.grfid == grfid) { + return true; + } + } + + return false; +} + +/* static */ uint32 ScriptNewGRF::GetVersion(uint32 grfid) +{ + grfid = BSWAP32(grfid); // Match people's expectations. + + for (auto c = _grfconfig; c != nullptr; c = c->next) { + if (!HasBit(c->flags, GCF_STATIC) && c->ident.grfid == grfid) { + return c->version; + } + } + + return 0; +} + +/* static */ char *ScriptNewGRF::GetName(uint32 grfid) +{ + grfid = BSWAP32(grfid); // Match people's expectations. + + for (auto c = _grfconfig; c != nullptr; c = c->next) { + if (!HasBit(c->flags, GCF_STATIC) && c->ident.grfid == grfid) { + return ::stredup(c->GetName()); + } + } + + return nullptr; +} diff --git a/src/script/api/script_newgrf.hpp b/src/script/api/script_newgrf.hpp new file mode 100644 index 0000000000..d1a9336ecc --- /dev/null +++ b/src/script/api/script_newgrf.hpp @@ -0,0 +1,56 @@ +/* + * This file is part of OpenTTD. + * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. + * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . + */ + +/** @file script_newgrf.hpp NewGRF info for scripts. */ + +#ifndef SCRIPT_NEWGRF_HPP +#define SCRIPT_NEWGRF_HPP + +#include "script_list.hpp" + +/** + * Create a list of loaded NewGRFs. + * @api ai game + * @ingroup ScriptList + */ +class ScriptNewGRFList : public ScriptList { +public: + ScriptNewGRFList(); +}; + + +/** + * Class that handles all NewGRF related functions. + * @api ai game + */ +class ScriptNewGRF : public ScriptObject { +public: + /** + * Check if a NewGRF with a given grfid is loaded. + * @param grfid The grfid to check. + * @return True if and only if a NewGRF with the given grfid is loaded in the game. + */ + static bool IsLoaded(uint32 grfid); + + /** + * Get the version of a loaded NewGRF. + * @param grfid The NewGRF to query. + * @pre ScriptNewGRF::IsLoaded(grfid). + * @return Version of the NewGRF or 0 if the NewGRF specifies no version. + */ + static uint32 GetVersion(uint32 grfid); + + /** + * Get the name of a loaded NewGRF. + * @param grfid The NewGRF to query. + * @pre ScriptNewGRF::IsLoaded(grfid). + * @return The name of the NewGRF or nullptr if no name is defined. + */ + static char *GetName(uint32 grfid); +}; + +#endif /* SCRIPT_NEWGRF_HPP */ diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 023ea3edce..ac79b2828a 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -2196,6 +2196,11 @@ static SettingsContainer &GetSettingsTree() scenario->Add(new SettingEntry("scenario.house_ignore_grf")); } + SettingsPage *network = main->Add(new SettingsPage(STR_CONFIG_SETTING_NETWORK)); + { + network->Add(new SettingEntry("network.use_relay_service")); + } + main->Init(); } return *main; diff --git a/src/settings_type.h b/src/settings_type.h index 26425330ae..0349f5ae49 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -59,6 +59,13 @@ enum IndustryDensity { ID_END, ///< Number of industry density settings. }; +/** Possible values for "userelayservice" setting. */ +enum UseRelayService { + URS_NEVER = 0, + URS_ASK, + URS_ALLOW, +}; + /** Settings related to the difficulty of the game */ struct DifficultySettings { byte competitor_start_time; ///< Unused value, used to load old savegames. @@ -341,23 +348,23 @@ struct NetworkSettings { std::string rcon_password; ///< password for rconsole (server side) std::string admin_password; ///< password for the admin network std::string settings_password; ///< password for game settings (server side) - bool server_advertise; ///< Advertise the server to the game coordinator. + bool server_advertise; ///< Advertise the server to the game coordinator. std::string client_name; ///< name of the player (as client) std::string default_company_pass; ///< default password for new companies in encrypted form std::string connect_to_ip; ///< default for the "Add server" query std::string network_id; ///< network ID for servers - bool autoclean_companies; ///< automatically remove companies that are not in use - uint8 autoclean_unprotected; ///< remove passwordless companies after this many months - uint8 autoclean_protected; ///< remove the password from passworded companies after this many months - uint8 autoclean_novehicles; ///< remove companies with no vehicles after this many months - uint8 max_companies; ///< maximum amount of companies - uint8 max_clients; ///< maximum amount of clients - uint8 max_spectators; ///< maximum amount of spectators - Year restart_game_year; ///< year the server restarts - uint8 min_active_clients; ///< minimum amount of active clients to unpause the game - bool reload_cfg; ///< reload the config file before restarting + bool autoclean_companies; ///< automatically remove companies that are not in use + uint8 autoclean_unprotected; ///< remove passwordless companies after this many months + uint8 autoclean_protected; ///< remove the password from passworded companies after this many months + uint8 autoclean_novehicles; ///< remove companies with no vehicles after this many months + uint8 max_companies; ///< maximum amount of companies + uint8 max_clients; ///< maximum amount of clients + Year restart_game_year; ///< year the server restarts + uint8 min_active_clients; ///< minimum amount of active clients to unpause the game + bool reload_cfg; ///< reload the config file before restarting std::string last_joined; ///< Last joined server - bool no_http_content_downloads; ///< do not do content downloads over HTTP + bool no_http_content_downloads; ///< do not do content downloads over HTTP + UseRelayService use_relay_service; ///< Use relay service? }; /** Settings related to the creation of games. */ diff --git a/src/statusbar_gui.cpp b/src/statusbar_gui.cpp index 6767f6205c..36ef31b828 100644 --- a/src/statusbar_gui.cpp +++ b/src/statusbar_gui.cpp @@ -148,11 +148,15 @@ struct StatusBarWindow : Window { break; case WID_S_RIGHT: { - /* Draw company money, if any */ - const Company *c = Company::GetIfValid(_local_company); - if (c != nullptr) { - SetDParam(0, c->money); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, text_top, STR_COMPANY_MONEY, TC_FROMSTRING, SA_HOR_CENTER); + if (_local_company == COMPANY_SPECTATOR) { + DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, text_top, STR_STATUSBAR_SPECATOR, TC_FROMSTRING, SA_HOR_CENTER); + } else { + /* Draw company money, if any */ + const Company *c = Company::GetIfValid(_local_company); + if (c != nullptr) { + SetDParam(0, c->money); + DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, text_top, STR_COMPANY_MONEY, TC_FROMSTRING, SA_HOR_CENTER); + } } break; } diff --git a/src/table/engines.h b/src/table/engines.h index f6ce10bf13..ab6ba77467 100644 --- a/src/table/engines.h +++ b/src/table/engines.h @@ -386,7 +386,7 @@ static const EngineInfo _orig_engine_info[] = { * Tractive effort coefficient by default is the same as TTDPatch, 0.30*256=76 * Air drag value depends on the top speed of the vehicle. */ -#define RVI(a, b, c, d, e, f, g, h, i, j, k) { a, b, c, j, d, e, f, g, h, k, i, 0, 0, 0, VE_DEFAULT, 0, 76, 0, 0 } +#define RVI(a, b, c, d, e, f, g, h, i, j, k) { a, b, c, j, d, e, f, g, h, k, i, 0, 0, 0, VE_DEFAULT, 0, 76, 0, 0, 0 } #define M RAILVEH_MULTIHEAD #define W RAILVEH_WAGON #define G RAILVEH_SINGLEHEAD diff --git a/src/table/settings/network_settings.ini b/src/table/settings/network_settings.ini index 550b838565..c1e7779308 100644 --- a/src/table/settings/network_settings.ini +++ b/src/table/settings/network_settings.ini @@ -10,6 +10,7 @@ static void UpdateClientConfigValues(); static std::initializer_list _server_game_type{"local", "public", "invite-only"}; +static std::initializer_list _use_relay_service{"never", "ask", "allow"}; static const SettingTable _network_settings = { [post-amble] @@ -225,16 +226,6 @@ max = MAX_CLIENTS post_cb = [](auto) { UpdateClientConfigValues(); } cat = SC_BASIC -[SDTC_VAR] -var = network.max_spectators -type = SLE_UINT8 -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY -def = 15 -min = 0 -max = MAX_CLIENTS -post_cb = [](auto) { UpdateClientConfigValues(); } -cat = SC_BASIC - [SDTC_VAR] var = network.restart_game_year type = SLE_INT32 @@ -263,3 +254,16 @@ var = network.no_http_content_downloads flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = false cat = SC_EXPERT + +[SDTC_OMANY] +var = network.use_relay_service +type = SLE_UINT8 +flags = SF_GUI_DROPDOWN | SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC +def = URS_ASK +min = URS_NO +max = URS_ALLOW +full = _use_relay_service +str = STR_CONFIG_SETTING_USE_RELAY_SERVICE +strhelp = STR_CONFIG_SETTING_USE_RELAY_SERVICE_HELPTEXT +strval = STR_CONFIG_SETTING_USE_RELAY_SERVICE_NEVER +cat = SC_BASIC diff --git a/src/train.h b/src/train.h index 1c181e55e4..34ff52c6b1 100644 --- a/src/train.h +++ b/src/train.h @@ -111,6 +111,7 @@ struct TrainCache { /* cached values, recalculated on load and each time a vehicle is added to/removed from the consist. */ TrainCacheFlags cached_tflags;///< train cached flags + int cached_curve_speed_mod; ///< curve speed modifier of the entire train uint8 cached_num_engines; ///< total number of engines, including rear ends of multiheaded engines uint16 cached_centre_mass; ///< Cached position of the centre of mass, from the front uint16 cached_veh_weight; ///< Cached individual vehicle weight @@ -452,6 +453,15 @@ protected: // These functions should not be called outside acceleration code. return GetRailTypeInfo(GetRailTypeByTrackBit(this->tile, this->track))->max_speed; } + /** + * Returns the curve speed modifier of this vehicle. + * @return Current curve speed modifier, in fixed-point binary representation with 8 fractional bits. + */ + inline int GetCurveSpeedModifier() const + { + return GetVehicleProperty(this, PROP_TRAIN_CURVE_SPEED_MOD, RailVehInfo(this->engine_type)->curve_speed_mod, true); + } + /** * Checks if the vehicle is at a tile that can be sloped. * @return True if the tile can be sloped. diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 1a06d0de3d..447e49c39e 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -264,6 +264,7 @@ void Train::ConsistChanged(ConsistChangeFlags allowed_changes) this->tcache.cached_num_engines = 0; bool train_can_tilt = true; + int min_curve_speed_mod = INT_MAX; for (Train *u = this; u != nullptr; u = u->Next()) { const RailVehicleInfo *rvi_u = RailVehInfo(u->engine_type); @@ -303,6 +304,7 @@ void Train::ConsistChanged(ConsistChangeFlags allowed_changes) const RailVehicleInfo *rvi_u = &e_u->u.rail; if (!HasBit(e_u->info.misc_flags, EF_RAIL_TILTS)) train_can_tilt = false; + min_curve_speed_mod = std::min(min_curve_speed_mod, u->GetCurveSpeedModifier()); /* Cache wagon override sprite group. nullptr is returned if there is none */ u->tcache.cached_override = GetWagonOverrideSpriteSet(u->engine_type, u->cargo_type, u->gcache.first_engine); @@ -389,6 +391,7 @@ void Train::ConsistChanged(ConsistChangeFlags allowed_changes) /* store consist weight/max speed in cache */ this->vcache.cached_max_speed = max_speed; this->tcache.cached_tflags = (train_can_tilt ? TCF_TILT : TCF_NONE); + this->tcache.cached_curve_speed_mod = min_curve_speed_mod; this->tcache.cached_max_curve_speed = this->GetCurveSpeedLimit(); /* recalculate cached weights and power too (we do this *after* the rest, so it is known which wagons are powered and need extra weight added) */ @@ -666,6 +669,11 @@ int Train::GetCurveSpeedLimit() const /* Apply max_speed bonus of 20% for a tilting train */ max_speed += max_speed / 5; } + + /* Apply max_speed modifier (cached value is fixed-point binary with 8 fractional bits) + * and clamp the result to an acceptable range. */ + max_speed += (max_speed * this->tcache.cached_curve_speed_mod) / 256; + max_speed = Clamp(max_speed, 2, absolute_max_speed); } return max_speed; diff --git a/src/vehicle_cmd.cpp b/src/vehicle_cmd.cpp index ebd94a566c..4accdac79e 100644 --- a/src/vehicle_cmd.cpp +++ b/src/vehicle_cmd.cpp @@ -134,7 +134,7 @@ CommandCost CmdBuildVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1, uint /* Check whether we can allocate a unit number. Autoreplace does not allocate * an unit number as it will (always) reuse the one of the replaced vehicle * and (train) wagons don't have an unit number in any scenario. */ - UnitID unit_num = (flags & DC_AUTOREPLACE || (type == VEH_TRAIN && e->u.rail.railveh_type == RAILVEH_WAGON)) ? 0 : GetFreeUnitNumber(type); + UnitID unit_num = (flags & DC_QUERY_COST || flags & DC_AUTOREPLACE || (type == VEH_TRAIN && e->u.rail.railveh_type == RAILVEH_WAGON)) ? 0 : GetFreeUnitNumber(type); if (unit_num == UINT16_MAX) return_cmd_error(STR_ERROR_TOO_MANY_VEHICLES_IN_GAME); /* If we are refitting we need to temporarily purchase the vehicle to be able to diff --git a/src/widgets/network_widget.h b/src/widgets/network_widget.h index c8ec22e861..f50bf04e93 100644 --- a/src/widgets/network_widget.h +++ b/src/widgets/network_widget.h @@ -66,10 +66,6 @@ enum NetworkStartServerWidgets { WID_NSS_COMPANIES_BTND, ///< 'Max companies' downarrow. WID_NSS_COMPANIES_TXT, ///< 'Max companies' text. WID_NSS_COMPANIES_BTNU, ///< 'Max companies' uparrow. - WID_NSS_SPECTATORS_LABEL, ///< Label for 'max spectators'. - WID_NSS_SPECTATORS_BTND, ///< 'Max spectators' downarrow. - WID_NSS_SPECTATORS_TXT, ///< 'Max spectators' text. - WID_NSS_SPECTATORS_BTNU, ///< 'Max spectators' uparrow. WID_NSS_GENERATE_GAME, ///< New game button. WID_NSS_LOAD_GAME, ///< Load game button. @@ -79,21 +75,6 @@ enum NetworkStartServerWidgets { WID_NSS_CANCEL, ///< 'Cancel' button. }; -/** Widgets of the #NetworkLobbyWindow class. */ -enum NetworkLobbyWidgets { - WID_NL_BACKGROUND, ///< Background of the window. - WID_NL_TEXT, ///< Heading text. - WID_NL_HEADER, ///< Header above list of companies. - WID_NL_MATRIX, ///< List of companies. - WID_NL_SCROLLBAR, ///< Scroll bar. - WID_NL_DETAILS, ///< Company details. - WID_NL_JOIN, ///< 'Join company' button. - WID_NL_NEW, ///< 'New company' button. - WID_NL_SPECTATE, ///< 'Spectate game' button. - WID_NL_REFRESH, ///< 'Refresh server' button. - WID_NL_CANCEL, ///< 'Cancel' button. -}; - /** Widgets of the #NetworkClientListWindow class. */ enum ClientListWidgets { WID_CL_PANEL, ///< Panel of the window. @@ -128,4 +109,13 @@ enum NetworkCompanyPasswordWidgets { WID_NCP_OK, ///< Safe the password etc. }; +/** Widgets of the #NetworkAskRelayWindow class. */ +enum NetworkAskRelayWidgets { + WID_NAR_CAPTION, ///< Caption of the window. + WID_NAR_TEXT, ///< Text in the window. + WID_NAR_NO, ///< "No" button. + WID_NAR_YES_ONCE, ///< "Yes, once" button. + WID_NAR_YES_ALWAYS, ///< "Yes, always" button. +}; + #endif /* WIDGETS_NETWORK_WIDGET_H */ diff --git a/src/window.cpp b/src/window.cpp index 37c206b0e0..5eb87101cc 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -1337,6 +1337,7 @@ static uint GetWindowZPriority(WindowClass wc) case WC_ERRMSG: case WC_CONFIRM_POPUP_QUERY: + case WC_NETWORK_ASK_RELAY: case WC_MODAL_PROGRESS: case WC_NETWORK_STATUS_WINDOW: case WC_SAVE_PRESET: diff --git a/src/window_type.h b/src/window_type.h index 66f7535527..ba9c22f23c 100644 --- a/src/window_type.h +++ b/src/window_type.h @@ -25,7 +25,6 @@ enum WindowNumberEnum { WN_CONFIRM_POPUP_QUERY_BOOTSTRAP, ///< Query popup confirm for bootstrap. WN_NETWORK_WINDOW_GAME = 0, ///< Network game window. - WN_NETWORK_WINDOW_LOBBY, ///< Network lobby window. WN_NETWORK_WINDOW_CONTENT_LIST, ///< Network content list. WN_NETWORK_WINDOW_START, ///< Network start server. @@ -489,7 +488,6 @@ enum WindowClass { /** * Network window; %Window numbers: * - #WN_NETWORK_WINDOW_GAME = #NetworkGameWidgets - * - #WN_NETWORK_WINDOW_LOBBY = #NetworkLobbyWidgets * - #WN_NETWORK_WINDOW_CONTENT_LIST = #NetworkContentListWidgets * - #WN_NETWORK_WINDOW_START = #NetworkStartServerWidgets */ @@ -508,6 +506,12 @@ enum WindowClass { */ WC_NETWORK_STATUS_WINDOW, + /** + * Network ask relay window; %Window numbers: + * - 0 - #NetworkAskRelayWidgets + */ + WC_NETWORK_ASK_RELAY, + /** * Chatbox; %Window numbers: * - #DestType = #NetWorkChatWidgets