From d1fa6b129c94b7c4ae6e45184a25962d49d074b8 Mon Sep 17 00:00:00 2001 From: glx22 Date: Sun, 13 Dec 2020 00:24:55 +0100 Subject: [PATCH 01/20] Add: [CMake] Option to only build tools/docs --- CMakeLists.txt | 134 ++++++++++++++++++---------------- cmake/Options.cmake | 6 ++ src/CMakeLists.txt | 11 ++- src/script/CMakeLists.txt | 4 + src/script/api/CMakeLists.txt | 4 + src/strgen/CMakeLists.txt | 4 + 6 files changed, 98 insertions(+), 65 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a8f7aa071a..1a0dd5b759 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,6 +32,78 @@ set_directory_options() include(Static) set_static_if_needed() +if(MSVC) + # C++17 for MSVC + set(CMAKE_CXX_STANDARD 17) +else() + # C++11 for all other targets + set(CMAKE_CXX_STANDARD 11) +endif() + +set(CMAKE_CXX_STANDARD_REQUIRED YES) +set(CMAKE_CXX_EXTENSIONS NO) + +set(CMAKE_EXPORT_COMPILE_COMMANDS YES) + +# An empty target for the tools +add_custom_target(tools) + +include(Endian) +add_endian_definition() + +include(CompileFlags) +compile_flags() + +if(APPLE OR UNIX) + add_definitions(-DUNIX) +endif() + +if(UNIX) + find_package(Doxygen) +endif() + +list(APPEND GENERATED_SOURCE_FILES "${CMAKE_BINARY_DIR}/generated/rev.cpp") +if(WIN32) + list(APPEND GENERATED_SOURCE_FILES "${CMAKE_BINARY_DIR}/generated/ottdres.rc") +endif() + +# Generate a target to determine version, which is execute every 'make' run +add_custom_target(find_version + ${CMAKE_COMMAND} + -DFIND_VERSION_BINARY_DIR=${CMAKE_BINARY_DIR}/generated + -DCPACK_BINARY_DIR=${CMAKE_BINARY_DIR} + -P "${CMAKE_SOURCE_DIR}/cmake/scripts/FindVersion.cmake" + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + BYPRODUCTS ${GENERATED_SOURCE_FILES} +) + +# Documentation +if(DOXYGEN_EXECUTABLE) + add_custom_target(docs) + add_custom_target(docs_source + ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/docs + COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_BINARY_DIR}/Doxyfile + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + COMMENT "Generating documentation for source" + ) + add_dependencies(docs_source + find_version + ) + add_dependencies(docs + docs_source + ) +endif() + +include(AddCustomXXXTimestamp) + +if(OPTION_TOOLS_ONLY) + if(HOST_BINARY_DIR) + unset(HOST_BINARY_DIR CACHE) + endif() + add_subdirectory(${CMAKE_SOURCE_DIR}/src) + return() +endif() + # Prefer -pthread over -lpthread, which is often the better option of the two. set(CMAKE_THREAD_PREFER_PTHREAD YES) # Make sure we have Threads available. @@ -72,10 +144,6 @@ find_package(Xaudio2) find_package(Grfcodec) -if(UNIX) - find_package(Doxygen) -endif() - # IPO is only properly supported from CMake 3.9. Despite the fact we are # CMake 3.5, still enable IPO if we detect we are 3.9+. if(POLICY CMP0069) @@ -103,57 +171,7 @@ if(APPLE) endif() endif() -if(MSVC) - # C++17 for MSVC - set(CMAKE_CXX_STANDARD 17) -else() - # C++11 for all other targets - set(CMAKE_CXX_STANDARD 11) -endif() - -set(CMAKE_CXX_STANDARD_REQUIRED YES) -set(CMAKE_CXX_EXTENSIONS NO) - -set(CMAKE_EXPORT_COMPILE_COMMANDS YES) - -list(APPEND GENERATED_SOURCE_FILES "${CMAKE_BINARY_DIR}/generated/rev.cpp") -if(WIN32) - list(APPEND GENERATED_SOURCE_FILES "${CMAKE_BINARY_DIR}/generated/ottdres.rc") -endif() - -# Generate a target to determine version, which is execute every 'make' run -add_custom_target(find_version - ${CMAKE_COMMAND} - -DFIND_VERSION_BINARY_DIR=${CMAKE_BINARY_DIR}/generated - -DCPACK_BINARY_DIR=${CMAKE_BINARY_DIR} - -P "${CMAKE_SOURCE_DIR}/cmake/scripts/FindVersion.cmake" - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - BYPRODUCTS ${GENERATED_SOURCE_FILES} -) - -# An empty target for the tools -add_custom_target(tools) - -# Documentation -if(DOXYGEN_EXECUTABLE) - add_custom_target(docs) - add_custom_target(docs_source - ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/docs - COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_BINARY_DIR}/Doxyfile - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - COMMENT "Generating documentation for source" - ) - add_dependencies(docs_source - find_version - ) - add_dependencies(docs - docs_source - ) -endif() - include(SourceList) -include(Endian) -add_endian_definition() # Needed by rev.cpp include_directories(${CMAKE_SOURCE_DIR}/src) @@ -162,14 +180,10 @@ include_directories(${CMAKE_SOURCE_DIR}/src/3rdparty/squirrel/include) include(MSVCFilters) -include(CompileFlags) -compile_flags() - add_executable(openttd WIN32 ${GENERATED_SOURCE_FILES}) set_target_properties(openttd PROPERTIES OUTPUT_NAME "${BINARY_NAME}") # All other files are added via target_sources() -include(AddCustomXXXTimestamp) add_subdirectory(${CMAKE_SOURCE_DIR}/src) add_subdirectory(${CMAKE_SOURCE_DIR}/media/baseset) @@ -192,10 +206,6 @@ endif() set_target_properties(openttd PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/bin") process_compile_flags() -if(APPLE OR UNIX) - add_definitions(-DUNIX) -endif() - include(LinkPackage) link_package(PNG TARGET PNG::PNG ENCOURAGED) link_package(ZLIB TARGET ZLIB::ZLIB ENCOURAGED) diff --git a/cmake/Options.cmake b/cmake/Options.cmake index 005bb19cae..977d54f061 100644 --- a/cmake/Options.cmake +++ b/cmake/Options.cmake @@ -57,6 +57,12 @@ function(set_options) option(OPTION_USE_ASSERTS "Use assertions; leave enabled for nightlies, betas, and RCs" ON) option(OPTION_USE_THREADS "Use threads" ON) option(OPTION_USE_NSIS "Use NSIS to create windows installer; enable only for stable releases" OFF) + option(OPTION_TOOLS_ONLY "Build only tools target" OFF) + option(OPTION_DOCS_ONLY "Build only docs target" OFF) + + if (OPTION_DOCS_ONLY) + set(OPTION_TOOLS_ONLY ON PARENT_SCOPE) + endif() endfunction() # Show the values of the generic options. diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0a0ac406a3..bbe66b7645 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,3 +1,11 @@ +add_subdirectory(script) +add_subdirectory(settingsgen) +add_subdirectory(strgen) + +if(OPTION_TOOLS_ONLY) + return() +endif() + add_subdirectory(3rdparty) add_subdirectory(ai) add_subdirectory(blitter) @@ -11,11 +19,8 @@ add_subdirectory(network) add_subdirectory(os) add_subdirectory(pathfinder) add_subdirectory(saveload) -add_subdirectory(script) -add_subdirectory(settingsgen) add_subdirectory(sound) add_subdirectory(spriteloader) -add_subdirectory(strgen) add_subdirectory(table) add_subdirectory(video) add_subdirectory(widgets) diff --git a/src/script/CMakeLists.txt b/src/script/CMakeLists.txt index e5915332c4..f4b87dc3b8 100644 --- a/src/script/CMakeLists.txt +++ b/src/script/CMakeLists.txt @@ -1,5 +1,9 @@ add_subdirectory(api) +if(OPTION_TOOLS_ONLY) + return() +endif() + add_files( script_config.cpp script_config.hpp diff --git a/src/script/api/CMakeLists.txt b/src/script/api/CMakeLists.txt index 9bc4183f19..c21707d431 100644 --- a/src/script/api/CMakeLists.txt +++ b/src/script/api/CMakeLists.txt @@ -131,6 +131,10 @@ foreach(API "ai;AI" "game;GS" "template;Template") ) endforeach() +if(OPTION_TOOLS_ONLY) + return() +endif() + add_library(openttd::script_api ALIAS script_api) diff --git a/src/strgen/CMakeLists.txt b/src/strgen/CMakeLists.txt index c638b5c6e7..08c1223350 100644 --- a/src/strgen/CMakeLists.txt +++ b/src/strgen/CMakeLists.txt @@ -22,6 +22,10 @@ if (NOT HOST_BINARY_DIR) add_dependencies(tools strgen) endif() +if(OPTION_TOOLS_ONLY) + return() +endif() + # Source Files add_files(strgen_base.cpp) From b14e3b9b9df2294e1f0b7fab8b2c23381e32ade7 Mon Sep 17 00:00:00 2001 From: Owen Rudge Date: Sun, 13 Dec 2020 22:43:37 +0000 Subject: [PATCH 02/20] Feature: Switch to bzip2 compression for DMG files (supported by OS X 10.4+) --- cmake/PackageBundle.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/PackageBundle.cmake b/cmake/PackageBundle.cmake index a443da3c4b..7f96e05fa8 100644 --- a/cmake/PackageBundle.cmake +++ b/cmake/PackageBundle.cmake @@ -5,6 +5,7 @@ set(CPACK_BUNDLE_ICON "${CMAKE_SOURCE_DIR}/os/macosx/openttd.icns") set(CPACK_BUNDLE_PLIST "${CMAKE_CURRENT_BINARY_DIR}/Info.plist") set(CPACK_BUNDLE_STARTUP_COMMAND "${CMAKE_SOURCE_DIR}/os/macosx/launch.sh") set(CPACK_DMG_BACKGROUND_IMAGE "${CMAKE_SOURCE_DIR}/os/macosx/splash.png") +set(CPACK_DMG_FORMAT "UDBZ") # Create a temporary Info.plist.in, where we will fill in the version via # CPackProperties.cmake.in. This because at this point in time the version From 68f9925cd4c8b29dbdac301e86bd9fc6f5a7fb27 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Mon, 14 Dec 2020 20:25:01 +0100 Subject: [PATCH 03/20] Codechange: use \u to indicate unicode chars in strings (#8379) With \x, we sometimes had to do the "" trick, as the length is not predefined. With C++11 bringing \u to the specs, which has a preset length, we no longer need the "" trick. We set the strings to u8, to ensure all compilers use UTF-8 encoding for the \u characters. This was triggered by newer CLangs, which start to warn if you use "" in the middle of a string, wondering if that was your intention. It is a good question. And this is our answer :) --- src/currency.cpp | 16 +- src/misc_gui.cpp | 126 ++--- src/string_type.h | 4 +- src/table/townname.h | 1150 +++++++++++++++++++++--------------------- src/textfile_gui.cpp | 2 +- src/townname.cpp | 2 +- 6 files changed, 650 insertions(+), 650 deletions(-) diff --git a/src/currency.cpp b/src/currency.cpp index b68584f015..5c758c48df 100644 --- a/src/currency.cpp +++ b/src/currency.cpp @@ -26,14 +26,14 @@ * | | | | | | | */ /** The original currency specifications. */ static const CurrencySpec origin_currency_specs[CURRENCY_END] = { - { 1, "", CF_NOEURO, "\xC2\xA3", "", 0, STR_GAME_OPTIONS_CURRENCY_GBP }, ///< british pound + { 1, "", CF_NOEURO, u8"\u00a3", "", 0, STR_GAME_OPTIONS_CURRENCY_GBP }, ///< british pound { 2, "", CF_NOEURO, "$", "", 0, STR_GAME_OPTIONS_CURRENCY_USD }, ///< american dollar - { 2, "", CF_ISEURO, "\xE2\x82\xAC", "", 0, STR_GAME_OPTIONS_CURRENCY_EUR }, ///< euro - { 220, "", CF_NOEURO, "\xC2\xA5", "", 0, STR_GAME_OPTIONS_CURRENCY_JPY }, ///< japanese yen + { 2, "", CF_ISEURO, u8"\u20ac", "", 0, STR_GAME_OPTIONS_CURRENCY_EUR }, ///< euro + { 220, "", CF_NOEURO, u8"\u00a5", "", 0, STR_GAME_OPTIONS_CURRENCY_JPY }, ///< japanese yen { 27, "", 2002, "", NBSP "S.", 1, STR_GAME_OPTIONS_CURRENCY_ATS }, ///< austrian schilling { 81, "", 2002, "BEF" NBSP, "", 0, STR_GAME_OPTIONS_CURRENCY_BEF }, ///< belgian franc { 2, "", CF_NOEURO, "CHF" NBSP, "", 0, STR_GAME_OPTIONS_CURRENCY_CHF }, ///< swiss franc - { 41, "", CF_NOEURO, "", NBSP "K\xC4\x8D", 1, STR_GAME_OPTIONS_CURRENCY_CZK }, ///< czech koruna + { 41, "", CF_NOEURO, "", NBSP u8"K\u010d", 1, STR_GAME_OPTIONS_CURRENCY_CZK }, ///< czech koruna { 4, "", 2002, "DM" NBSP, "", 0, STR_GAME_OPTIONS_CURRENCY_DEM }, ///< deutsche mark { 11, "", CF_NOEURO, "", NBSP "kr", 1, STR_GAME_OPTIONS_CURRENCY_DKK }, ///< danish krone { 333, "", 2002, "Pts" NBSP, "", 0, STR_GAME_OPTIONS_CURRENCY_ESP }, ///< spanish peseta @@ -45,7 +45,7 @@ static const CurrencySpec origin_currency_specs[CURRENCY_END] = { { 3873, "", 2002, "", NBSP "L.", 1, STR_GAME_OPTIONS_CURRENCY_ITL }, ///< italian lira { 4, "", 2002, "NLG" NBSP, "", 0, STR_GAME_OPTIONS_CURRENCY_NLG }, ///< dutch gulden { 12, "", CF_NOEURO, "", NBSP "Kr", 1, STR_GAME_OPTIONS_CURRENCY_NOK }, ///< norwegian krone - { 6, "", CF_NOEURO, "", NBSP "z\xC5\x82", 1, STR_GAME_OPTIONS_CURRENCY_PLN }, ///< polish zloty + { 6, "", CF_NOEURO, "", NBSP u8"z\u0142", 1, STR_GAME_OPTIONS_CURRENCY_PLN }, ///< polish zloty { 5, "", CF_NOEURO, "", NBSP "Lei", 1, STR_GAME_OPTIONS_CURRENCY_RON }, ///< romanian leu { 50, "", CF_NOEURO, "", NBSP "p", 1, STR_GAME_OPTIONS_CURRENCY_RUR }, ///< russian rouble { 479, "", 2007, "", NBSP "SIT", 1, STR_GAME_OPTIONS_CURRENCY_SIT }, ///< slovenian tolar @@ -55,7 +55,7 @@ static const CurrencySpec origin_currency_specs[CURRENCY_END] = { { 4, "", CF_NOEURO, "R$" NBSP, "", 0, STR_GAME_OPTIONS_CURRENCY_BRL }, ///< brazil real { 31, "", 2011, "", NBSP "EEK", 1, STR_GAME_OPTIONS_CURRENCY_EEK }, ///< estonian krooni { 4, "", 2015, "", NBSP "Lt", 1, STR_GAME_OPTIONS_CURRENCY_LTL }, ///< lithuanian litas - { 1850, "", CF_NOEURO, "\xE2\x82\xA9", "", 0, STR_GAME_OPTIONS_CURRENCY_KRW }, ///< south korean won + { 1850, "", CF_NOEURO, u8"\u20a9", "", 0, STR_GAME_OPTIONS_CURRENCY_KRW }, ///< south korean won { 13, "", CF_NOEURO, "R" NBSP, "", 0, STR_GAME_OPTIONS_CURRENCY_ZAR }, ///< south african rand { 1, "", CF_NOEURO, "", "", 2, STR_GAME_OPTIONS_CURRENCY_CUSTOM }, ///< custom currency (add further languages below) { 3, "", CF_NOEURO, "", NBSP "GEL", 1, STR_GAME_OPTIONS_CURRENCY_GEL }, ///< Georgian Lari @@ -63,9 +63,9 @@ static const CurrencySpec origin_currency_specs[CURRENCY_END] = { { 80, "", CF_NOEURO, "", NBSP "rub", 1, STR_GAME_OPTIONS_CURRENCY_RUB }, ///< New Russian Ruble { 24, "", CF_NOEURO, "$", "", 0, STR_GAME_OPTIONS_CURRENCY_MXN }, ///< Mexican peso { 40, "", CF_NOEURO, "NTD" NBSP, "", 0, STR_GAME_OPTIONS_CURRENCY_NTD }, ///< new taiwan dollar - { 8, "", CF_NOEURO, "\xC2\xA5", "", 0, STR_GAME_OPTIONS_CURRENCY_CNY }, ///< chinese renminbi + { 8, "", CF_NOEURO, u8"\u00a5", "", 0, STR_GAME_OPTIONS_CURRENCY_CNY }, ///< chinese renminbi { 10, "", CF_NOEURO, "HKD" NBSP, "", 0, STR_GAME_OPTIONS_CURRENCY_HKD }, ///< hong kong dollar - { 90, "", CF_NOEURO, "\xE2\x82\xB9", "", 0, STR_GAME_OPTIONS_CURRENCY_INR }, ///< Indian Rupee + { 90, "", CF_NOEURO, u8"\u20b9", "", 0, STR_GAME_OPTIONS_CURRENCY_INR }, ///< Indian Rupee }; /** Array of currencies used by the system */ diff --git a/src/misc_gui.cpp b/src/misc_gui.cpp index ff2fc3a23c..f7345416c1 100644 --- a/src/misc_gui.cpp +++ b/src/misc_gui.cpp @@ -412,69 +412,69 @@ static WindowDesc _about_desc( ); static const char * const _credits[] = { - "Original design by Chris Sawyer", - "Original graphics by Simon Foster", - "", - "The OpenTTD team (in alphabetical order):", - " Grzegorz Duczy\xC5\x84ski (adf88) - General coding (since 1.7.2)", - " Albert Hofkamp (Alberth) - GUI expert (since 0.7)", - " Matthijs Kooijman (blathijs) - Pathfinder-guru, Debian port (since 0.3)", - " Ulf Hermann (fonsinchen) - Cargo Distribution (since 1.3)", - " Christoph Elsenhans (frosch) - General coding (since 0.6)", - " Lo\xC3\xAF""c Guilloux (glx) - General / Windows Expert (since 0.4.5)", - " Charles Pigott (LordAro) - General / Correctness police (since 1.9)", - " Michael Lutz (michi_cc) - Path based signals (since 0.7)", - " Niels Martin Hansen (nielsm) - Music system, general coding (since 1.9)", - " Owen Rudge (orudge) - Forum host, OS/2 port (since 0.1)", - " Peter Nelson (peter1138) - Spiritual descendant from NewGRF gods (since 0.4.5)", - " Ingo von Borstel (planetmaker) - General, Support (since 1.1)", - " Remko Bijker (Rubidium) - Lead coder and way more (since 0.4.5)", - " Jos\xC3\xA9 Soler (Terkhen) - General coding (since 1.0)", - " Leif Linse (Zuu) - AI/Game Script (since 1.2)", - "", - "Inactive Developers:", - " Jean-Fran\xC3\xA7ois Claeys (Belugas) - GUI, NewGRF and more (0.4.5 - 1.0)", - " Bjarni Corfitzen (Bjarni) - MacOSX port, coder and vehicles (0.3 - 0.7)", - " Victor Fischer (Celestar) - Programming everywhere you need him to (0.3 - 0.6)", - " Jaroslav Mazanec (KUDr) - YAPG (Yet Another Pathfinder God) ;) (0.4.5 - 0.6)", - " Jonathan Coome (Maedhros) - High priest of the NewGRF Temple (0.5 - 0.6)", - " Attila B\xC3\xA1n (MiHaMiX) - Developer WebTranslator 1 and 2 (0.3 - 0.5)", - " Zden\xC4\x9Bk Sojka (SmatZ) - Bug finder and fixer (0.6 - 1.3)", - " Christoph Mallon (Tron) - Programmer, code correctness police (0.3 - 0.5)", - " Patric Stout (TrueBrain) - NoAI, NoGo, Network (0.3 - 1.2), sys op (active)", - " Thijs Marinussen (Yexo) - AI Framework, General (0.6 - 1.3)", - "", - "Retired Developers:", - " Tam\xC3\xA1s Farag\xC3\xB3 (Darkvater) - Ex-Lead coder (0.3 - 0.5)", - " Dominik Scherer (dominik81) - Lead programmer, GUI expert (0.3 - 0.3)", - " Emil Djupfeld (egladil) - MacOSX (0.4.5 - 0.6)", - " Simon Sasburg (HackyKid) - Many bugfixes (0.4 - 0.4.5)", - " Ludvig Strigeus (ludde) - Original author of OpenTTD, main coder (0.1 - 0.3)", - " Cian Duffy (MYOB) - BeOS port / manual writing (0.1 - 0.3)", - " Petr Baudi\xC5\xA1 (pasky) - Many patches, NewGRF support (0.3 - 0.3)", - " Benedikt Br\xC3\xBCggemeier (skidd13) - Bug fixer and code reworker (0.6 - 0.7)", - " Serge Paquet (vurlix) - 2nd contributor after ludde (0.1 - 0.3)", - "", - "Special thanks go out to:", - " Josef Drexler - For his great work on TTDPatch", - " Marcin Grzegorczyk - Track foundations and for describing TTD internals", - " Stefan Mei\xC3\x9Fner (sign_de) - For his work on the console", - " Mike Ragsdale - OpenTTD installer", - " Christian Rosentreter (tokai) - MorphOS / AmigaOS port", - " Richard Kempton (richK) - additional airports, initial TGP implementation", - "", - " Alberto Demichelis - Squirrel scripting language \xC2\xA9 2003-2008", - " L. Peter Deutsch - MD5 implementation \xC2\xA9 1999, 2000, 2002", - " Michael Blunck - Pre-signals and semaphores \xC2\xA9 2003", - " George - Canal/Lock graphics \xC2\xA9 2003-2004", - " Andrew Parkhouse (andythenorth) - River graphics", - " David Dallaston (Pikka) - Tram tracks", - " All Translators - Who made OpenTTD a truly international game", - " Bug Reporters - Without whom OpenTTD would still be full of bugs!", - "", - "", - "And last but not least:", - " Chris Sawyer - For an amazing game!" + u8"Original design by Chris Sawyer", + u8"Original graphics by Simon Foster", + u8"", + u8"The OpenTTD team (in alphabetical order):", + u8" Grzegorz Duczy\u0144ski (adf88) - General coding (since 1.7.2)", + u8" Albert Hofkamp (Alberth) - GUI expert (since 0.7)", + u8" Matthijs Kooijman (blathijs) - Pathfinder-guru, Debian port (since 0.3)", + u8" Ulf Hermann (fonsinchen) - Cargo Distribution (since 1.3)", + u8" Christoph Elsenhans (frosch) - General coding (since 0.6)", + u8" Lo\u00efc Guilloux (glx) - General / Windows Expert (since 0.4.5)", + u8" Charles Pigott (LordAro) - General / Correctness police (since 1.9)", + u8" Michael Lutz (michi_cc) - Path based signals (since 0.7)", + u8" Niels Martin Hansen (nielsm) - Music system, general coding (since 1.9)", + u8" Owen Rudge (orudge) - Forum host, OS/2 port (since 0.1)", + u8" Peter Nelson (peter1138) - Spiritual descendant from NewGRF gods (since 0.4.5)", + u8" Ingo von Borstel (planetmaker) - General, Support (since 1.1)", + u8" Remko Bijker (Rubidium) - Lead coder and way more (since 0.4.5)", + u8" Jos\u00e9 Soler (Terkhen) - General coding (since 1.0)", + u8" Leif Linse (Zuu) - AI/Game Script (since 1.2)", + u8"", + u8"Inactive Developers:", + u8" Jean-Fran\u00e7ois Claeys (Belugas) - GUI, NewGRF and more (0.4.5 - 1.0)", + u8" Bjarni Corfitzen (Bjarni) - MacOSX port, coder and vehicles (0.3 - 0.7)", + u8" Victor Fischer (Celestar) - Programming everywhere you need him to (0.3 - 0.6)", + u8" Jaroslav Mazanec (KUDr) - YAPG (Yet Another Pathfinder God) ;) (0.4.5 - 0.6)", + u8" Jonathan Coome (Maedhros) - High priest of the NewGRF Temple (0.5 - 0.6)", + u8" Attila B\u00e1n (MiHaMiX) - Developer WebTranslator 1 and 2 (0.3 - 0.5)", + u8" Zden\u011bk Sojka (SmatZ) - Bug finder and fixer (0.6 - 1.3)", + u8" Christoph Mallon (Tron) - Programmer, code correctness police (0.3 - 0.5)", + u8" Patric Stout (TrueBrain) - NoAI, NoGo, Network (0.3 - 1.2), sys op (active)", + u8" Thijs Marinussen (Yexo) - AI Framework, General (0.6 - 1.3)", + u8"", + u8"Retired Developers:", + u8" Tam\u00e1s Farag\u00f3 (Darkvater) - Ex-Lead coder (0.3 - 0.5)", + u8" Dominik Scherer (dominik81) - Lead programmer, GUI expert (0.3 - 0.3)", + u8" Emil Djupfeld (egladil) - MacOSX (0.4.5 - 0.6)", + u8" Simon Sasburg (HackyKid) - Many bugfixes (0.4 - 0.4.5)", + u8" Ludvig Strigeus (ludde) - Original author of OpenTTD, main coder (0.1 - 0.3)", + u8" Cian Duffy (MYOB) - BeOS port / manual writing (0.1 - 0.3)", + u8" Petr Baudi\u0161 (pasky) - Many patches, NewGRF support (0.3 - 0.3)", + u8" Benedikt Br\u00fcggemeier (skidd13) - Bug fixer and code reworker (0.6 - 0.7)", + u8" Serge Paquet (vurlix) - 2nd contributor after ludde (0.1 - 0.3)", + u8"", + u8"Special thanks go out to:", + u8" Josef Drexler - For his great work on TTDPatch", + u8" Marcin Grzegorczyk - Track foundations and for describing TTD internals", + u8" Stefan Mei\u00dfner (sign_de) - For his work on the console", + u8" Mike Ragsdale - OpenTTD installer", + u8" Christian Rosentreter (tokai) - MorphOS / AmigaOS port", + u8" Richard Kempton (richK) - additional airports, initial TGP implementation", + u8"", + u8" Alberto Demichelis - Squirrel scripting language \u00a9 2003-2008", + u8" L. Peter Deutsch - MD5 implementation \u00a9 1999, 2000, 2002", + u8" Michael Blunck - Pre-signals and semaphores \u00a9 2003", + u8" George - Canal/Lock graphics \u00a9 2003-2004", + u8" Andrew Parkhouse (andythenorth) - River graphics", + u8" David Dallaston (Pikka) - Tram tracks", + u8" All Translators - Who made OpenTTD a truly international game", + u8" Bug Reporters - Without whom OpenTTD would still be full of bugs!", + u8"", + u8"", + u8"And last but not least:", + u8" Chris Sawyer - For an amazing game!" }; struct AboutWindow : public Window { diff --git a/src/string_type.h b/src/string_type.h index 623d74661c..25ea65598e 100644 --- a/src/string_type.h +++ b/src/string_type.h @@ -15,10 +15,10 @@ #include /** A non-breaking space. */ -#define NBSP "\xC2\xA0" +#define NBSP u8"\u00a0" /** A left-to-right marker, marks the next character as left-to-right. */ -#define LRM "\xE2\x80\x8E" +#define LRM u8"\u200e" /** * Valid filter types for IsValidChar. diff --git a/src/table/townname.h b/src/table/townname.h index 4a7da93e9a..086fc4f116 100644 --- a/src/table/townname.h +++ b/src/table/townname.h @@ -310,7 +310,7 @@ static const char * const _name_austrian_a2[] = { "Aus", "Alten", "Braun", - "V\xC3\xB6sl", + u8"V\u00f6sl", "Mittern", "Nuss", "Neu", @@ -332,9 +332,9 @@ static const char * const _name_austrian_a2[] = { "Frauen", "Herren", "Hof", - "H\xC3\xBCtt", + u8"H\u00fctt", "Kaisers", - "K\xC3\xB6nigs", + u8"K\u00f6nigs", "Knittel", "Lang", "Ober", @@ -346,7 +346,7 @@ static const char * const _name_austrian_a2[] = { "Stocker", "Unter", "Utten", - "V\xC3\xB6sen", + u8"V\u00f6sen", "Vill", "Weissen", }; @@ -392,7 +392,7 @@ static const char * const _name_austrian_a5[] = { static const char * const _name_austrian_a6[] = { "Aegyd", - "Andr\xC3\xA4", + u8"Andr\u00e4", "Georgen", "Jakob", "Johann", @@ -405,7 +405,7 @@ static const char * const _name_austrian_a6[] = { "Nikolai", "Oswald", "Peter", - "P\xC3\xB6lten", + u8"P\u00f6lten", "Stefan", "Stephan", "Thomas", @@ -466,10 +466,10 @@ static const char * const _name_german_real[] = { "Gera", "Kassel", "Kiel", - "K\xC3\xB6ln", - "L\xC3\xBC""beck", + u8"K\u00f6ln", + u8"L\u00fcbeck", "Magdeburg", - "M\xC3\xBCnchen", + u8"M\u00fcnchen", "Potsdam", "Stuttgart", "Wiesbaden", @@ -492,7 +492,7 @@ static const char * const _name_german_1[] = { "Cloppen", "Co", "Duis", - "D\xC3\xBCssel", + u8"D\u00fcssel", "Dannen", "Elb", "Els", @@ -506,7 +506,7 @@ static const char * const _name_german_1[] = { "Frei", "Freuden", "Fried", - "F\xC3\xBCrsten", + u8"F\u00fcrsten", "Hahn", "Ham", "Harz", @@ -527,10 +527,10 @@ static const char * const _name_german_1[] = { "Langen", "Lim", "Lohr", - "L\xC3\xBCne", + u8"L\u00fcne", "Mel", "Michels", - "M\xC3\xBChl", + u8"M\u00fchl", "Naum", "Nest", "Nord", @@ -538,7 +538,7 @@ static const char * const _name_german_1[] = { "Nien", "Nidda", "Nieder", - "N\xC3\xBCrn", + u8"N\u00fcrn", "Ober", "Offen", "Osna", @@ -552,18 +552,18 @@ static const char * const _name_german_1[] = { "Regens", "Rott", "Ros", - "R\xC3\xBCssels", + u8"R\u00fcssels", "Saal", "Saar", "Salz", - "Sch\xC3\xB6ne", + u8"Sch\u00f6ne", "Schwein", "Sonder", "Sonnen", "Stein", "Strals", "Straus", - "S\xC3\xBC""d", + u8"S\u00fcd", "Ton", "Unter", "Ur", @@ -574,14 +574,14 @@ static const char * const _name_german_1[] = { "Wester", "Witten", "Wolfs", - "W\xC3\xBCrz", + u8"W\u00fcrz", }; static const char * const _name_german_2[] = { "bach", "berg", - "br\xC3\xBC""ck", - "br\xC3\xBC""cken", + u8"br\u00fcck", + u8"br\u00fccken", "burg", "dorf", "feld", @@ -591,7 +591,7 @@ static const char * const _name_german_2[] = { "heim", "horst", "mund", - "m\xC3\xBCnster", + u8"m\u00fcnster", "stadt", "wald", }; @@ -625,9 +625,9 @@ static const char * const _name_spanish_real[] = { "Morrocoy", "Cata", "Cataito", - "Ciudad Bol\xC3\xADvar", + u8"Ciudad Bol\u00edvar", "Barquisimeto", - "M\xC3\xA9rida", + u8"M\u00e9rida", "Puerto Ordaz", "Santa Elena", "San Juan", @@ -636,58 +636,58 @@ static const char * const _name_spanish_real[] = { "Santiago", "Barcelona", "Barinas", - "San Crist\xC3\xB3""bal", + u8"San Crist\u00f3bal", "San Francisco", - "San Mart\xC3\xADn", + u8"San Mart\u00edn", "Guayana", "San Carlos", - "El Lim\xC3\xB3n", + u8"El Lim\u00f3n", "Coro", "Coro Coro", "Puerto Ayacucho", "Elorza", "Arismendi", "Trujillo", - "Car\xC3\xBApano", + u8"Car\u00fapano", "Anaco", "Lima", "Cuzco", "Iquitos", "Callao", "Huacho", - "Caman\xC3\xA1", + u8"Caman\u00e1", "Puerto Chala", "Santa Cruz", "Quito", "Cuenca", - "Medell\xC3\xADn", - "Tulc\xC3\xA1n", + u8"Medell\u00edn", + u8"Tulc\u00e1n", "Esmeraldas", "Ibarra", "San Lorenzo", "Macas", - "Mora\xC3\xB1""a", + u8"Mora\u00f1a", "Machala", "Zamora", "Latacunga", "Tena", "Cochabamba", - "Ascensi\xC3\xB3n", + u8"Ascensi\u00f3n", "Magdalena", "Santa Ana", "Manoa", "Sucre", "Oruro", "Uyuni", - "Potos\xC3\xAD", + u8"Potos\u00ed", "Tupiza", "La Quiaca", - "Yacu\xC3\xAD""ba", + u8"Yacu\u00edba", "San Borja", "Fuerte Olimpo", - "Fort\xC3\xADn Esteros", + u8"Fort\u00edn Esteros", "Campo Grande", - "Bogot\xC3\xA1", + u8"Bogot\u00e1", "El Banco", "Zaragoza", "Neiva", @@ -715,7 +715,7 @@ static const char * const _name_french_real[] = { "Bordeaux", "Bayonne", "Montpellier", - "Mont\xC3\xA9limar", + u8"Mont\u00e9limar", "Valence", "Digne", "Nice", @@ -723,16 +723,16 @@ static const char * const _name_french_real[] = { "St. Tropez", "Marseille", "Narbonne", - "S\xC3\xA8te", + u8"S\u00e8te", "Aurillac", - "Gu\xC3\xA9ret", + u8"Gu\u00e9ret", "Le Creusot", "Nevers", "Auxerre", "Versailles", "Meaux", - "Ch\xC3\xA2lons", - "Compi\xC3\xA8gne", + u8"Ch\u00e2lons", + u8"Compi\u00e8gne", "Metz", "Chaumont", "Langres", @@ -745,8 +745,8 @@ static const char * const _name_french_real[] = { "Le Mans", "Angers", "Nantes", - "Ch\xC3\xA2teauroux", - "Orl\xC3\xA9""ans", + u8"Ch\u00e2teauroux", + u8"Orl\u00e9ans", "Lisieux", "Cherbourg", "Morlaix", @@ -757,7 +757,7 @@ static const char * const _name_french_real[] = { "Troyes", "Charolles", "Toulouse", - "Chamb\xC3\xA9ry", + u8"Chamb\u00e9ry", "Tours", "St. Brieuc", "St. Malo", @@ -771,11 +771,11 @@ static const char * const _name_french_real[] = { "Albi", "Paris", "Biarritz", - "B\xC3\xA9ziers", - "N\xC3\xAEmes", + u8"B\u00e9ziers", + u8"N\u00eemes", "Chamonix", - "Angoul\xC3\xA8me", - "Alen\xC3\xA7on", + u8"Angoul\u00e8me", + u8"Alen\u00e7on", }; static const char * const _name_silly_1[] = { @@ -903,7 +903,7 @@ static const char * const _name_swedish_2[] = { "Es", "Fin", "Fisk", - "Gr\xC3\xB6n", + u8"Gr\u00f6n", "Hag", "Halm", "Karl", @@ -922,17 +922,17 @@ static const char * const _name_swedish_2[] = { "Skog", "Stock", "Stor", - "Str\xC3\xB6m", + u8"Str\u00f6m", "Sund", - "S\xC3\xB6""der", + u8"S\u00f6der", "Tall", "Tratt", "Troll", "Upp", "Var", - "V\xC3\xA4ster", - "\xC3\x84ngel", - "\xC3\x96ster", + u8"V\u00e4ster", + u8"\u00c4ngel", + u8"\u00d6ster", }; static const char * const _name_swedish_2a[] = { @@ -987,9 +987,9 @@ static const char * const _name_swedish_2b[] = { "o", "u", "y", - "\xC3\xA5", - "\xC3\xA4", - "\xC3\xB6", + u8"\u00e5", + u8"\u00e4", + u8"\u00f6", }; static const char * const _name_swedish_2c[] = { @@ -1035,25 +1035,25 @@ static const char * const _name_swedish_3[] = { "hamn", "holm", "hus", - "h\xC3\xA4ttan", + u8"h\u00e4ttan", "kulle", - "k\xC3\xB6ping", + u8"k\u00f6ping", "lund", - "l\xC3\xB6v", + u8"l\u00f6v", "sala", "skrona", - "sl\xC3\xA4tt", - "sp\xC3\xA5ng", + u8"sl\u00e4tt", + u8"sp\u00e5ng", "stad", "sund", "svall", "svik", - "s\xC3\xA5ker", + u8"s\u00e5ker", "udde", "valla", "viken", - "\xC3\xA4lv", - "\xC3\xA5s", + u8"\u00e4lv", + u8"\u00e5s", }; static const char * const _name_dutch_1[] = { @@ -1220,7 +1220,7 @@ static const char * const _name_finnish_real[] = { "Espoo", "Helsinki", "Tapiola", - "J\xC3\xA4rvel\xC3\xA4", + u8"J\u00e4rvel\u00e4", "Lahti", "Kotka", "Hamina", @@ -1255,26 +1255,26 @@ static const char * const _name_finnish_1[] = { "Sauna", "Uusi", "Vanha", - "Kes\xC3\xA4", + u8"Kes\u00e4", "Kuusi", "Pelto", "Tuomi", "Terva", "Olki", - "Hein\xC3\xA4", - "Sein\xC3\xA4", + u8"Hein\u00e4", + u8"Sein\u00e4", "Rova", "Koivu", "Kokko", - "M\xC3\xA4nty", + u8"M\u00e4nty", "Pihlaja", - "Pet\xC3\xA4j\xC3\xA4", + u8"Pet\u00e4j\u00e4", "Kielo", "Kauha", "Viita", "Kivi", "Riihi", - "\xC3\x84\xC3\xA4ne", + u8"\u00c4\u00e4ne", "Niini", }; @@ -1283,27 +1283,27 @@ static const char * const _name_finnish_2[] = { "Lohjan", "Savon", "Lapin", - "Pit\xC3\xA4j\xC3\xA4n", + u8"Pit\u00e4j\u00e4n", "Martin", "Kuusan", "Kemi", "Keri", - "H\xC3\xA4meen", + u8"H\u00e4meen", "Kangas", }; static const char * const _name_finnish_3[] = { "harju", "linna", - "j\xC3\xA4rvi", + u8"j\u00e4rvi", "kallio", - "m\xC3\xA4ki", + u8"m\u00e4ki", "nummi", "joki", - "kyl\xC3\xA4", + u8"kyl\u00e4", "lampi", "lahti", - "mets\xC3\xA4", + u8"mets\u00e4", "suo", "laakso", "niitty", @@ -1316,56 +1316,56 @@ static const char * const _name_finnish_3[] = { static const char * const _name_polish_1_m[] = { "Wielki ", - "Ma\xC5\x82y ", - "Z\xC5\x82y ", + u8"Ma\u0142y ", + u8"Z\u0142y ", "Dobry ", "Nowy ", "Stary ", - "Z\xC5\x82oty ", + u8"Z\u0142oty ", "Zielony ", - "Bia\xC5\x82y ", + u8"Bia\u0142y ", "Modry ", - "D\xC4\x99""bowy ", + u8"D\u0119bowy ", }; static const char * const _name_polish_1_f[] = { "Wielka ", - "Ma\xC5\x82""a ", - "Z\xC5\x82""a ", + u8"Ma\u0142a ", + u8"Z\u0142a ", "Dobra ", "Nowa ", "Stara ", - "Z\xC5\x82ota ", + u8"Z\u0142ota ", "Zielona ", - "Bia\xC5\x82""a ", + u8"Bia\u0142a ", "Modra ", - "D\xC4\x99""bowa ", + u8"D\u0119bowa ", }; static const char * const _name_polish_1_n[] = { "Wielkie ", - "Ma\xC5\x82""e ", - "Z\xC5\x82""e ", + u8"Ma\u0142e ", + u8"Z\u0142e ", "Dobre ", "Nowe ", "Stare ", - "Z\xC5\x82ote ", + u8"Z\u0142ote ", "Zielone ", - "Bia\xC5\x82""e ", + u8"Bia\u0142e ", "Modre ", - "D\xC4\x99""bowe ", + u8"D\u0119bowe ", }; static const char * const _name_polish_2_o[] = { "Frombork", "Gniezno", "Olsztyn", - "Toru\xC5\x84", + u8"Toru\u0144", "Bydgoszcz", "Terespol", - "Krak\xC3\xB3w", - "Pozna\xC5\x84", - "Wroc\xC5\x82""aw", + u8"Krak\u00f3w", + u8"Pozna\u0144", + u8"Wroc\u0142aw", "Katowice", "Cieszyn", "Bytom", @@ -1376,7 +1376,7 @@ static const char * const _name_polish_2_o[] = { "Malbork", "Sopot", "Sosnowiec", - "Gda\xC5\x84sk", + u8"Gda\u0144sk", "Gdynia", "Sieradz", "Sandomierz", @@ -1384,7 +1384,7 @@ static const char * const _name_polish_2_o[] = { "Szczytno", "Szczecin", "Zakopane", - "Szklarska Por\xC4\x99""ba", + u8"Szklarska Por\u0119ba", "Bochnia", "Golub-Dobrzyn", "Chojnice", @@ -1396,13 +1396,13 @@ static const char * const _name_polish_2_o[] = { static const char * const _name_polish_2_m[] = { "Jarocin", "Gogolin", - "Tomasz\xC3\xB3w", - "Piotrk\xC3\xB3w", + u8"Tomasz\u00f3w", + u8"Piotrk\u00f3w", "Lidzbark", "Rypin", "Radzymin", - "Wo\xC5\x82omin", - "Pruszk\xC3\xB3w", + u8"Wo\u0142omin", + u8"Pruszk\u00f3w", "Olsztynek", "Rypin", "Cisek", @@ -1412,7 +1412,7 @@ static const char * const _name_polish_2_m[] = { "Lubicz", "Milicz", "Targ", - "Ostr\xC3\xB3w", + u8"Ostr\u00f3w", "Ozimek", "Puck", "Rzepin", @@ -1425,7 +1425,7 @@ static const char * const _name_polish_2_m[] = { "Strzepcz", "Strzebielin", "Sochaczew", - "Gr\xC4\x99""bocin", + u8"Gr\u0119bocin", "Gniew", "Lubliniec", "Lubasz", @@ -1447,7 +1447,7 @@ static const char * const _name_polish_2_m[] = { static const char * const _name_polish_2_f[] = { "Szprotawa", "Pogorzelica", - "Mot\xC5\x82""awa", + u8"Mot\u0142awa", "Lubawa", "Nidzica", "Kruszwica", @@ -1501,7 +1501,7 @@ static const char * const _name_polish_2_n[] = { "Braniewo", "Sulinowo", "Chmielno", - "Jastrz\xC4\x99""bie", + u8"Jastrz\u0119bie", "Gryfino", "Koronowo", "Lubichowo", @@ -1510,182 +1510,182 @@ static const char * const _name_polish_2_n[] = { static const char * const _name_polish_3_m[] = { " Wybudowanie", - " \xC5\x9Awi\xC4\x99tokrzyski", - " G\xC3\xB3rski", + u8" \u015awi\u0119tokrzyski", + u8" G\u00f3rski", " Morski", - " Zdr\xC3\xB3j", + u8" Zdr\u00f3j", " Wody", " Bajoro", - " Kraje\xC5\x84ski", - " \xC5\x9Al\xC4\x85ski", + u8" Kraje\u0144ski", + u8" \u015al\u0105ski", " Mazowiecki", " Pomorski", " Wielki", " Maly", - " Warmi\xC5\x84ski", + u8" Warmi\u0144ski", " Mazurski", " Mniejszy", - " Wi\xC4\x99kszy", - " G\xC3\xB3rny", + u8" Wi\u0119kszy", + u8" G\u00f3rny", " Dolny", " Wielki", " Stary", " Nowy", " Wielkopolski", - " Wzg\xC3\xB3rze", + u8" Wzg\u00f3rze", " Mosty", " Kujawski", - " Ma\xC5\x82opolski", + u8" Ma\u0142opolski", " Podlaski", " Lesny", }; static const char * const _name_polish_3_f[] = { " Wybudowanie", - " \xC5\x9Awi\xC4\x99tokrzyska", - " G\xC3\xB3rska", + u8" \u015awi\u0119tokrzyska", + u8" G\u00f3rska", " Morska", - " Zdr\xC3\xB3j", + u8" Zdr\u00f3j", " Woda", " Bajoro", - " Kraje\xC5\x84ska", - " \xC5\x9Al\xC4\x85ska", + u8" Kraje\u0144ska", + u8" \u015al\u0105ska", " Mazowiecka", " Pomorska", " Wielka", - " Ma\xC5\x82""a", - " Warmi\xC5\x84ska", + u8" Ma\u0142a", + u8" Warmi\u0144ska", " Mazurska", " Mniejsza", - " Wi\xC4\x99ksza", - " G\xC3\xB3rna", + u8" Wi\u0119ksza", + u8" G\u00f3rna", " Dolna", " Wielka", " Stara", " Nowa", " Wielkopolska", - " Wzg\xC3\xB3rza", + u8" Wzg\u00f3rza", " Mosty", " Kujawska", " Malopolska", " Podlaska", - " Le\xC5\x9Bna", + u8" Le\u015bna", }; static const char * const _name_polish_3_n[] = { " Wybudowanie", - " \xC5\x9Awietokrzyskie", - " G\xC3\xB3rskie", + u8" \u015awietokrzyskie", + u8" G\u00f3rskie", " Morskie", - " Zdr\xC3\xB3j", + u8" Zdr\u00f3j", " Wody", " Bajoro", - " Kraje\xC5\x84skie", - " \xC5\x9Al\xC4\x85skie", + u8" Kraje\u0144skie", + u8" \u015al\u0105skie", " Mazowieckie", " Pomorskie", " Wielkie", - " Ma\xC5\x82""e", - " Warmi\xC5\x84skie ", + u8" Ma\u0142e", + u8" Warmi\u0144skie ", " Mazurskie ", " Mniejsze", - " Wi\xC4\x99ksze", - " G\xC3\xB3rne", + u8" Wi\u0119ksze", + u8" G\u00f3rne", " Dolne", " Wielkie", " Stare", " Nowe", " Wielkopolskie", - " Wzg\xC3\xB3rze", + u8" Wzg\u00f3rze", " Mosty", " Kujawskie", - " Ma\xC5\x82opolskie", + u8" Ma\u0142opolskie", " Podlaskie", - " Le\xC5\x9Bne", + u8" Le\u015bne", }; static const char * const _name_czech_real[] = { - "A\xC5\xA1", - "Bene\xC5\xA1ov", + u8"A\u0161", + u8"Bene\u0161ov", "Beroun", - "Bezdru\xC5\xBEice", + u8"Bezdru\u017eice", "Blansko", - "B\xC5\x99""eclav", + u8"B\u0159eclav", "Brno", - "Brunt\xC3\xA1l", - "\xC4\x8C""esk\xC3\xA1 L\xC3\xADpa", - "\xC4\x8C""esk\xC3\xA9 Bud\xC4\x9Bjovice", - "\xC4\x8C""esk\xC3\xBD Krumlov", - "D\xC4\x9B\xC4\x8D\xC3\xADn", - "Doma\xC5\xBElice", - "Dub\xC3\xAD", - "Fr\xC3\xBD""dek-M\xC3\xADstek", - "Havl\xC3\xAD\xC4\x8Dk\xC5\xAFv Brod", - "Hodon\xC3\xADn", - "Hradec Kr\xC3\xA1lov\xC3\xA9", + u8"Brunt\u00e1l", + u8"\u010cesk\u00e1 L\u00edpa", + u8"\u010cesk\u00e9 Bud\u011bjovice", + u8"\u010cesk\u00fd Krumlov", + u8"D\u011b\u010d\u00edn", + u8"Doma\u017elice", + u8"Dub\u00ed", + u8"Fr\u00fddek-M\u00edstek", + u8"Havl\u00ed\u010dk\u016fv Brod", + u8"Hodon\u00edn", + u8"Hradec Kr\u00e1lov\u00e9", "Humpolec", "Cheb", "Chomutov", "Chrudim", "Jablonec nad Nisou", - "Jesen\xC3\xADk", - "Ji\xC4\x8D\xC3\xADn", + u8"Jesen\u00edk", + u8"Ji\u010d\u00edn", "Jihlava", - "Jind\xC5\x99ich\xC5\xAFv Hradec", + u8"Jind\u0159ich\u016fv Hradec", "Karlovy Vary", - "Karvin\xC3\xA1", + u8"Karvin\u00e1", "Kladno", "Klatovy", - "Kol\xC3\xADn", + u8"Kol\u00edn", "Kosmonosy", - "Krom\xC4\x9B\xC5\x99\xC3\xAD\xC5\xBE", - "Kutn\xC3\xA1 Hora", + u8"Krom\u011b\u0159\u00ed\u017e", + u8"Kutn\u00e1 Hora", "Liberec", - "Litom\xC4\x9B\xC5\x99ice", + u8"Litom\u011b\u0159ice", "Louny", - "Man\xC4\x9Bt\xC3\xADn", - "M\xC4\x9Bln\xC3\xADk", - "Mlad\xC3\xA1 Boleslav", + u8"Man\u011bt\u00edn", + u8"M\u011bln\u00edk", + u8"Mlad\u00e1 Boleslav", "Most", - "N\xC3\xA1""chod", - "Nov\xC3\xBD Ji\xC4\x8D\xC3\xADn", + u8"N\u00e1chod", + u8"Nov\u00fd Ji\u010d\u00edn", "Nymburk", "Olomouc", "Opava", - "Or\xC3\xA1\xC4\x8Dov", + u8"Or\u00e1\u010dov", "Ostrava", "Pardubice", - "Pelh\xC5\x99imov", - "Pol\xC5\xBEice", - "P\xC3\xADsek", - "Plze\xC5\x88", + u8"Pelh\u0159imov", + u8"Pol\u017eice", + u8"P\u00edsek", + u8"Plze\u0148", "Praha", "Prachatice", - "P\xC5\x99""erov", - "P\xC5\x99\xC3\xAD""bram", - "Prost\xC4\x9Bjov", - "Rakovn\xC3\xADk", + u8"P\u0159erov", + u8"P\u0159\u00edbram", + u8"Prost\u011bjov", + u8"Rakovn\u00edk", "Rokycany", - "Rudn\xC3\xA1", - "Rychnov nad Kn\xC4\x9B\xC5\xBEnou", + u8"Rudn\u00e1", + u8"Rychnov nad Kn\u011b\u017enou", "Semily", "Sokolov", "Strakonice", - "St\xC5\x99""edokluky", - "\xC5\xA0umperk", + u8"St\u0159edokluky", + u8"\u0160umperk", "Svitavy", - "T\xC3\xA1""bor", + u8"T\u00e1bor", "Tachov", "Teplice", - "T\xC5\x99""eb\xC3\xAD\xC4\x8D", + u8"T\u0159eb\u00ed\u010d", "Trutnov", - "Uhersk\xC3\xA9 Hradi\xC5\xA1t\xC4\x9B", - "\xC3\x9Ast\xC3\xAD nad Labem", - "\xC3\x9Ast\xC3\xAD nad Orlic\xC3\xAD", - "Vset\xC3\xADn", - "Vy\xC5\xA1kov", - "\xC5\xBD\xC4\x8F\xC3\xA1r nad S\xC3\xA1zavou", - "Zl\xC3\xADn", + u8"Uhersk\u00e9 Hradi\u0161t\u011b", + u8"\u00dast\u00ed nad Labem", + u8"\u00dast\u00ed nad Orlic\u00ed", + u8"Vset\u00edn", + u8"Vy\u0161kov", + u8"\u017d\u010f\u00e1r nad S\u00e1zavou", + u8"Zl\u00edn", "Znojmo", }; @@ -1719,12 +1719,12 @@ enum CzechPattern { * by this. * XXX: [CZG_SMASC][CZP_PRIVL] needs special handling: -ovX -> -uv. */ static const char * const _name_czech_patmod[][3] = { - /* CZG_SMASC */ { "\xC3\xAD", "\xC3\xBD", "X" }, - /* CZG_SFEM */ { "\xC3\xAD", "\xC3\xA1", "a" }, - /* CZG_SNEUT */ { "\xC3\xAD", "\xC3\xA9", "o" }, - /* CZG_PMASC */ { "\xC3\xAD", "\xC3\xA9", "y" }, - /* CZG_PFEM */ { "\xC3\xAD", "\xC3\xA9", "y" }, - /* CZG_PNEUT */ { "\xC3\xAD", "\xC3\xA1", "a" } + /* CZG_SMASC */ { u8"\u00ed", u8"\u00fd", "X" }, + /* CZG_SFEM */ { u8"\u00ed", u8"\u00e1", "a" }, + /* CZG_SNEUT */ { u8"\u00ed", u8"\u00e9", "o" }, + /* CZG_PMASC */ { u8"\u00ed", u8"\u00e9", "y" }, + /* CZG_PFEM */ { u8"\u00ed", u8"\u00e9", "y" }, + /* CZG_PNEUT */ { u8"\u00ed", u8"\u00e1", "a" } }; /* This way the substantive can choose only some adjectives/endings: @@ -1764,52 +1764,52 @@ struct CzechNameAdj { /* Some of items which should be common are doubled. */ static const CzechNameAdj _name_czech_adj[] = { - { CZP_JARNI, CZC_ANY, "Horn\xC3\xAD" }, - { CZP_JARNI, CZC_ANY, "Horn\xC3\xAD" }, - { CZP_JARNI, CZC_ANY, "Doln\xC3\xAD" }, - { CZP_JARNI, CZC_ANY, "Doln\xC3\xAD" }, - { CZP_JARNI, CZC_ANY, "P\xC5\x99""edn\xC3\xAD" }, - { CZP_JARNI, CZC_ANY, "Zadn\xC3\xAD" }, - { CZP_JARNI, CZC_ANY, "Kosteln\xC3\xAD" }, - { CZP_JARNI, CZC_ANY, "Havran\xC3\xAD" }, - { CZP_JARNI, CZC_ANY, "\xC5\x98\xC3\xAD\xC4\x8Dn\xC3\xAD" }, - { CZP_JARNI, CZC_ANY, "Jezern\xC3\xAD" }, - { CZP_MLADY, CZC_ANY, "Velk\xC3\xBD" }, - { CZP_MLADY, CZC_ANY, "Velk\xC3\xBD" }, - { CZP_MLADY, CZC_ANY, "Mal\xC3\xBD" }, - { CZP_MLADY, CZC_ANY, "Mal\xC3\xBD" }, - { CZP_MLADY, CZC_ANY, "Vysok\xC3\xBD" }, - { CZP_MLADY, CZC_ANY, "\xC4\x8C""esk\xC3\xBD" }, - { CZP_MLADY, CZC_ANY, "Moravsk\xC3\xBD" }, - { CZP_MLADY, CZC_ANY, "Slov\xC3\xA1""ck\xC3\xBD" }, - { CZP_MLADY, CZC_ANY, "Slezsk\xC3\xBD" }, - { CZP_MLADY, CZC_ANY, "Uhersk\xC3\xBD" }, - { CZP_MLADY, CZC_ANY, "Star\xC3\xBD" }, - { CZP_MLADY, CZC_ANY, "Star\xC3\xBD" }, - { CZP_MLADY, CZC_ANY, "Nov\xC3\xBD" }, - { CZP_MLADY, CZC_ANY, "Nov\xC3\xBD" }, - { CZP_MLADY, CZC_ANY, "Mlad\xC3\xBD" }, - { CZP_MLADY, CZC_ANY, "Kr\xC3\xA1lovsk\xC3\xBD" }, - { CZP_MLADY, CZC_ANY, "Kamenn\xC3\xBD" }, - { CZP_MLADY, CZC_ANY, "Cihlov\xC3\xBD" }, - { CZP_MLADY, CZC_ANY, "Divn\xC3\xBD" }, - { CZP_MLADY, CZC_COLOR, "\xC4\x8C""erven\xC3\xA1" }, - { CZP_MLADY, CZC_COLOR, "\xC4\x8C""erven\xC3\xA1" }, - { CZP_MLADY, CZC_COLOR, "\xC4\x8C""erven\xC3\xA1" }, - { CZP_MLADY, CZC_COLOR, "Zelen\xC3\xA1" }, - { CZP_MLADY, CZC_COLOR, "\xC5\xBDlut\xC3\xA1" }, - { CZP_MLADY, CZC_COLOR, "Siv\xC3\xA1" }, - { CZP_MLADY, CZC_COLOR, "\xC5\xA0""ed\xC3\xA1" }, - { CZP_MLADY, CZC_COLOR, "B\xC3\xADl\xC3\xA1" }, - { CZP_MLADY, CZC_COLOR, "B\xC3\xADl\xC3\xA1" }, - { CZP_MLADY, CZC_COLOR, "Modr\xC3\xA1" }, - { CZP_MLADY, CZC_COLOR, "R\xC5\xAF\xC5\xBEov\xC3\xA1" }, - { CZP_MLADY, CZC_COLOR, "\xC4\x8C""ern\xC3\xA1" }, - { CZP_PRIVL, CZC_ANY, "Kr\xC3\xA1lova" }, + { CZP_JARNI, CZC_ANY, u8"Horn\u00ed" }, + { CZP_JARNI, CZC_ANY, u8"Horn\u00ed" }, + { CZP_JARNI, CZC_ANY, u8"Doln\u00ed" }, + { CZP_JARNI, CZC_ANY, u8"Doln\u00ed" }, + { CZP_JARNI, CZC_ANY, u8"P\u0159edn\u00ed" }, + { CZP_JARNI, CZC_ANY, u8"Zadn\u00ed" }, + { CZP_JARNI, CZC_ANY, u8"Kosteln\u00ed" }, + { CZP_JARNI, CZC_ANY, u8"Havran\u00ed" }, + { CZP_JARNI, CZC_ANY, u8"\u0158\u00ed\u010dn\u00ed" }, + { CZP_JARNI, CZC_ANY, u8"Jezern\u00ed" }, + { CZP_MLADY, CZC_ANY, u8"Velk\u00fd" }, + { CZP_MLADY, CZC_ANY, u8"Velk\u00fd" }, + { CZP_MLADY, CZC_ANY, u8"Mal\u00fd" }, + { CZP_MLADY, CZC_ANY, u8"Mal\u00fd" }, + { CZP_MLADY, CZC_ANY, u8"Vysok\u00fd" }, + { CZP_MLADY, CZC_ANY, u8"\u010cesk\u00fd" }, + { CZP_MLADY, CZC_ANY, u8"Moravsk\u00fd" }, + { CZP_MLADY, CZC_ANY, u8"Slov\u00e1ck\u00fd" }, + { CZP_MLADY, CZC_ANY, u8"Slezsk\u00fd" }, + { CZP_MLADY, CZC_ANY, u8"Uhersk\u00fd" }, + { CZP_MLADY, CZC_ANY, u8"Star\u00fd" }, + { CZP_MLADY, CZC_ANY, u8"Star\u00fd" }, + { CZP_MLADY, CZC_ANY, u8"Nov\u00fd" }, + { CZP_MLADY, CZC_ANY, u8"Nov\u00fd" }, + { CZP_MLADY, CZC_ANY, u8"Mlad\u00fd" }, + { CZP_MLADY, CZC_ANY, u8"Kr\u00e1lovsk\u00fd" }, + { CZP_MLADY, CZC_ANY, u8"Kamenn\u00fd" }, + { CZP_MLADY, CZC_ANY, u8"Cihlov\u00fd" }, + { CZP_MLADY, CZC_ANY, u8"Divn\u00fd" }, + { CZP_MLADY, CZC_COLOR, u8"\u010cerven\u00e1" }, + { CZP_MLADY, CZC_COLOR, u8"\u010cerven\u00e1" }, + { CZP_MLADY, CZC_COLOR, u8"\u010cerven\u00e1" }, + { CZP_MLADY, CZC_COLOR, u8"Zelen\u00e1" }, + { CZP_MLADY, CZC_COLOR, u8"\u017dlut\u00e1" }, + { CZP_MLADY, CZC_COLOR, u8"Siv\u00e1" }, + { CZP_MLADY, CZC_COLOR, u8"\u0160ed\u00e1" }, + { CZP_MLADY, CZC_COLOR, u8"B\u00edl\u00e1" }, + { CZP_MLADY, CZC_COLOR, u8"B\u00edl\u00e1" }, + { CZP_MLADY, CZC_COLOR, u8"Modr\u00e1" }, + { CZP_MLADY, CZC_COLOR, u8"R\u016f\u017eov\u00e1" }, + { CZP_MLADY, CZC_COLOR, u8"\u010cern\u00e1" }, + { CZP_PRIVL, CZC_ANY, u8"Kr\u00e1lova" }, { CZP_PRIVL, CZC_ANY, "Janova" }, { CZP_PRIVL, CZC_ANY, "Karlova" }, - { CZP_PRIVL, CZC_ANY, "Kry\xC5\xA1tofova" }, - { CZP_PRIVL, CZC_ANY, "Ji\xC5\x99\xC3\xADkova" }, + { CZP_PRIVL, CZC_ANY, u8"Kry\u0161tofova" }, + { CZP_PRIVL, CZC_ANY, u8"Ji\u0159\u00edkova" }, { CZP_PRIVL, CZC_ANY, "Petrova" }, { CZP_PRIVL, CZC_ANY, "Sudovo" }, }; @@ -1819,17 +1819,17 @@ static const CzechNameSubst _name_czech_subst_full[] = { { CZG_SMASC, CZA_ALL, CZC_COLOR, "Sedlec" }, { CZG_SMASC, CZA_ALL, CZC_COLOR, "Brod" }, { CZG_SMASC, CZA_ALL, CZC_COLOR, "Brod" }, - { CZG_SMASC, CZA_ALL, CZC_NONE, "\xC3\x9Aval" }, - { CZG_SMASC, CZA_ALL, CZC_COLOR, "\xC5\xBD\xC4\x8F\xC3\xA1r" }, + { CZG_SMASC, CZA_ALL, CZC_NONE, u8"\u00daval" }, + { CZG_SMASC, CZA_ALL, CZC_COLOR, u8"\u017d\u010f\u00e1r" }, { CZG_SMASC, CZA_ALL, CZC_COLOR, "Smrk" }, { CZG_SFEM, CZA_ALL, CZC_COLOR, "Hora" }, { CZG_SFEM, CZA_ALL, CZC_COLOR, "Lhota" }, { CZG_SFEM, CZA_ALL, CZC_COLOR, "Lhota" }, { CZG_SFEM, CZA_ALL, CZC_COLOR, "Hlava" }, - { CZG_SFEM, CZA_ALL, CZC_COLOR, "L\xC3\xADpa" }, + { CZG_SFEM, CZA_ALL, CZC_COLOR, u8"L\u00edpa" }, { CZG_SNEUT, CZA_ALL, CZC_COLOR, "Pole" }, - { CZG_SNEUT, CZA_ALL, CZC_COLOR, "\xC3\x9A""dol\xC3\xAD" }, - { CZG_PMASC, CZA_ALL, CZC_NONE, "\xC3\x9Avaly" }, + { CZG_SNEUT, CZA_ALL, CZC_COLOR, u8"\u00dadol\u00ed" }, + { CZG_PMASC, CZA_ALL, CZC_NONE, u8"\u00davaly" }, { CZG_PFEM, CZA_ALL, CZC_COLOR, "Luka" }, { CZG_PNEUT, CZA_ALL, CZC_COLOR, "Pole" }, }; @@ -1837,46 +1837,46 @@ static const CzechNameSubst _name_czech_subst_full[] = { /* TODO: More stems needed. --pasky */ static const CzechNameSubst _name_czech_subst_stem[] = { { CZG_SMASC, CZA_MIDDLE, CZC_COLOR, "Kostel" }, - { CZG_SMASC, CZA_MIDDLE, CZC_COLOR, "Kl\xC3\xA1\xC5\xA1ter" }, + { CZG_SMASC, CZA_MIDDLE, CZC_COLOR, u8"Kl\u00e1\u0161ter" }, { CZG_SMASC, CZA_SHORT, CZC_COLOR, "Lhot" }, { CZG_SFEM, CZA_SHORT, CZC_COLOR, "Lhot" }, { CZG_SFEM, CZA_SHORT, CZC_COLOR, "Hur" }, { CZG_FREE, CZA_MIDDLE | CZA_LONG, CZC_NONE, "Sedl" }, { CZG_FREE, CZA_SHORT | CZA_MIDDLE | CZA_LONG, CZC_COLOR, "Hrad" }, { CZG_NFREE, CZA_MIDDLE, CZC_NONE, "Pras" }, - { CZG_NFREE, CZA_MIDDLE, CZC_NONE, "Ba\xC5\xBE" }, + { CZG_NFREE, CZA_MIDDLE, CZC_NONE, u8"Ba\u017e" }, { CZG_NFREE, CZA_MIDDLE, CZC_NONE, "Tes" }, - { CZG_NFREE, CZA_MIDDLE, CZC_NONE, "U\xC5\xBE" }, - { CZG_NFREE, CZA_MIDDLE | CZA_LONG, CZC_POSTFIX, "B\xC5\x99" }, + { CZG_NFREE, CZA_MIDDLE, CZC_NONE, u8"U\u017e" }, + { CZG_NFREE, CZA_MIDDLE | CZA_LONG, CZC_POSTFIX, u8"B\u0159" }, { CZG_NFREE, CZA_MIDDLE | CZA_LONG, CZC_NONE, "Vod" }, { CZG_NFREE, CZA_MIDDLE | CZA_LONG, CZC_NONE, "Jan" }, { CZG_NFREE, CZA_LONG, CZC_NONE, "Prach" }, { CZG_NFREE, CZA_LONG, CZC_NONE, "Kunr" }, { CZG_NFREE, CZA_LONG, CZC_NONE, "Strak" }, - { CZG_NFREE, CZA_LONG, CZC_NONE, "V\xC3\xADt" }, - { CZG_NFREE, CZA_LONG, CZC_NONE, "Vy\xC5\xA1" }, - { CZG_NFREE, CZA_LONG, CZC_NONE, "\xC5\xBD""at" }, - { CZG_NFREE, CZA_LONG, CZC_NONE, "\xC5\xBD""er" }, - { CZG_NFREE, CZA_LONG, CZC_NONE, "St\xC5\x99""ed" }, + { CZG_NFREE, CZA_LONG, CZC_NONE, u8"V\u00edt" }, + { CZG_NFREE, CZA_LONG, CZC_NONE, u8"Vy\u0161" }, + { CZG_NFREE, CZA_LONG, CZC_NONE, u8"\u017dat" }, + { CZG_NFREE, CZA_LONG, CZC_NONE, u8"\u017der" }, + { CZG_NFREE, CZA_LONG, CZC_NONE, u8"St\u0159ed" }, { CZG_NFREE, CZA_LONG, CZC_NONE, "Harv" }, { CZG_NFREE, CZA_LONG, CZC_NONE, "Pruh" }, { CZG_NFREE, CZA_LONG, CZC_NONE, "Tach" }, - { CZG_NFREE, CZA_LONG, CZC_NONE, "P\xC3\xADsn" }, + { CZG_NFREE, CZA_LONG, CZC_NONE, u8"P\u00edsn" }, { CZG_NFREE, CZA_LONG, CZC_NONE, "Jin" }, { CZG_NFREE, CZA_LONG, CZC_NONE, "Jes" }, { CZG_NFREE, CZA_LONG, CZC_NONE, "Jar" }, { CZG_NFREE, CZA_LONG, CZC_NONE, "Sok" }, { CZG_NFREE, CZA_LONG, CZC_NONE, "Hod" }, { CZG_NFREE, CZA_LONG, CZC_NONE, "Net" }, - { CZG_FREE, CZA_LONG, CZC_NONE, "Pra\xC5\xBE" }, + { CZG_FREE, CZA_LONG, CZC_NONE, u8"Pra\u017e" }, { CZG_FREE, CZA_LONG, CZC_NONE, "Nerat" }, { CZG_FREE, CZA_LONG, CZC_NONE, "Kral" }, { CZG_FREE, CZA_LONG, CZC_NONE, "Hut" }, { CZG_FREE, CZA_LONG, CZC_NOPOSTFIX, "Pan" }, - { CZG_FREE, CZA_SHORT | CZA_MIDDLE | CZA_LONG, CZC_NOPOSTFIX, "Odst\xC5\x99""ed" }, + { CZG_FREE, CZA_SHORT | CZA_MIDDLE | CZA_LONG, CZC_NOPOSTFIX, u8"Odst\u0159ed" }, { CZG_FREE, CZA_SHORT | CZA_MIDDLE | CZA_LONG, CZC_COLOR, "Mrat" }, { CZG_FREE, CZA_LONG, CZC_COLOR, "Hlav" }, - { CZG_FREE, CZA_SHORT | CZA_MIDDLE, CZC_NONE, "M\xC4\x9B\xC5\x99" }, + { CZG_FREE, CZA_SHORT | CZA_MIDDLE, CZC_NONE, u8"M\u011b\u0159" }, { CZG_FREE, CZA_MIDDLE | CZA_LONG, CZC_NONE, "Lip" }, }; @@ -1890,47 +1890,47 @@ static const char * const _name_czech_subst_postfix[] = { /* This array must have the both neutral genders at the end! */ static const CzechNameSubst _name_czech_subst_ending[] = { { CZG_SMASC, CZA_SHORT | CZA_MIDDLE, CZC_ANY, "ec" }, - { CZG_SMASC, CZA_SHORT | CZA_MIDDLE, CZC_ANY, "\xC3\xADn" }, + { CZG_SMASC, CZA_SHORT | CZA_MIDDLE, CZC_ANY, u8"\u00edn" }, { CZG_SMASC, CZA_SHORT | CZA_MIDDLE | CZA_LONG, CZC_ANY, "ov" }, { CZG_SMASC, CZA_SHORT | CZA_LONG, CZC_ANY, "kov" }, - { CZG_SMASC, CZA_LONG, CZC_POSTFIX, "\xC3\xADn" }, - { CZG_SMASC, CZA_LONG, CZC_POSTFIX, "n\xC3\xADk" }, + { CZG_SMASC, CZA_LONG, CZC_POSTFIX, u8"\u00edn" }, + { CZG_SMASC, CZA_LONG, CZC_POSTFIX, u8"n\u00edk" }, { CZG_SMASC, CZA_LONG, CZC_ANY, "burk" }, { CZG_SFEM, CZA_SHORT, CZC_ANY, "ka" }, { CZG_SFEM, CZA_MIDDLE, CZC_ANY, "inka" }, - { CZG_SFEM, CZA_MIDDLE, CZC_ANY, "n\xC3\xA1" }, + { CZG_SFEM, CZA_MIDDLE, CZC_ANY, u8"n\u00e1" }, { CZG_SFEM, CZA_LONG, CZC_ANY, "ava" }, - { CZG_PMASC, CZA_LONG, CZC_POSTFIX, "\xC3\xADky" }, + { CZG_PMASC, CZA_LONG, CZC_POSTFIX, u8"\u00edky" }, { CZG_PMASC, CZA_LONG, CZC_ANY, "upy" }, { CZG_PMASC, CZA_LONG, CZC_ANY, "olupy" }, { CZG_PFEM, CZA_LONG, CZC_ANY, "avy" }, { CZG_PFEM, CZA_SHORT | CZA_MIDDLE | CZA_LONG, CZC_ANY, "ice" }, - { CZG_PFEM, CZA_SHORT | CZA_MIDDLE | CZA_LONG, CZC_ANY, "i\xC4\x8Dky" }, + { CZG_PFEM, CZA_SHORT | CZA_MIDDLE | CZA_LONG, CZC_ANY, u8"i\u010dky" }, { CZG_PNEUT, CZA_SHORT | CZA_MIDDLE, CZC_ANY, "na" }, { CZG_SNEUT, CZA_SHORT | CZA_MIDDLE, CZC_ANY, "no" }, - { CZG_SNEUT, CZA_LONG, CZC_ANY, "i\xC5\xA1t\xC4\x9B" }, + { CZG_SNEUT, CZA_LONG, CZC_ANY, u8"i\u0161t\u011b" }, }; static const char * const _name_czech_suffix[] = { "nad Cidlinou", - "nad Dyj\xC3\xAD", + u8"nad Dyj\u00ed", "nad Jihlavou", "nad Labem", "nad Lesy", "nad Moravou", "nad Nisou", "nad Odrou", - "nad Ostravic\xC3\xAD", - "nad S\xC3\xA1zavou", + u8"nad Ostravic\u00ed", + u8"nad S\u00e1zavou", "nad Vltavou", - "pod Prad\xC4\x9B""dem", - "pod Radho\xC5\xA1t\xC4\x9Bm", - "pod \xC5\x98\xC3\xADpem", - "pod Sn\xC4\x9B\xC5\xBEkou", - "pod \xC5\xA0pi\xC4\x8D\xC3\xA1kem", + u8"pod Prad\u011bdem", + u8"pod Radho\u0161t\u011bm", + u8"pod \u0158\u00edpem", + u8"pod Sn\u011b\u017ekou", + u8"pod \u0160pi\u010d\u00e1kem", "pod Sedlem", - "v \xC4\x8C""ech\xC3\xA1""ch", - "na Morav\xC4\x9B", + u8"v \u010cech\u00e1ch", + u8"na Morav\u011b", }; @@ -1940,197 +1940,197 @@ static const char * const _name_romanian_real[] = { "Alba Iulia", "Alexandria", "Babadag", - "Bac\xC4\x83u", + u8"Bac\u0103u", "Baia Mare", - "B\xC4\x83ile Herculane", - "B\xC4\x83ilesti", - "B\xC3\xA2rlad", + u8"B\u0103ile Herculane", + u8"B\u0103ilesti", + u8"B\u00e2rlad", "Bicaz", - "Bistri\xC8\x9B""a", + u8"Bistri\u021ba", "Blaj", "Borsec", - "Boto\xC8\x99""ani", - "Br\xC4\x83ila", - "Bra\xC8\x9Bov", - "Bucure\xC8\x99ti", + u8"Boto\u0219ani", + u8"Br\u0103ila", + u8"Bra\u021bov", + u8"Bucure\u0219ti", "Buftea", - "Buz\xC4\x83u", - "C\xC4\x83l\xC4\x83rasi", - "Caransebe\xC8\x99", - "Cernavod\xC4\x83", + u8"Buz\u0103u", + u8"C\u0103l\u0103rasi", + u8"Caransebe\u0219", + u8"Cernavod\u0103", "Cluj-Napoca", - "Constan\xC8\x9B""a", + u8"Constan\u021ba", "Covasna", "Craiova", "Dej", "Deva", "Dorohoi", "Drobeta-Turnu Severin", - "Dr\xC4\x83g\xC4\x83sani", - "F\xC4\x83g\xC4\x83ras", - "F\xC4\x83lticeni", - "Fete\xC8\x99ti", - "Foc\xC8\x99""ani", - "Gala\xC8\x99i", + u8"Dr\u0103g\u0103sani", + u8"F\u0103g\u0103ras", + u8"F\u0103lticeni", + u8"Fete\u0219ti", + u8"Foc\u0219ani", + u8"Gala\u0219i", "Gheorgheni", "Giurgiu", - "H\xC3\xA2r\xC8\x99ova", + u8"H\u00e2r\u0219ova", "Hunedoara", - "Hu\xC8\x99i", - "Ia\xC8\x99i", + u8"Hu\u0219i", + u8"Ia\u0219i", "Isaccea", "Lugoj", - "M\xC4\x83""cin", + u8"M\u0103cin", "Mangalia", "Medgidia", - "Media\xC8\x99", + u8"Media\u0219", "Miercurea Ciuc", "Mizil", "Motru", - "N\xC4\x83s\xC4\x83ud", - "N\xC4\x83vodari", - "Odobe\xC8\x99ti", - "Olteni\xC8\x9B""a", - "One\xC8\x99ti", + u8"N\u0103s\u0103ud", + u8"N\u0103vodari", + u8"Odobe\u0219ti", + u8"Olteni\u021ba", + u8"One\u0219ti", "Oradea", - "Or\xC8\x99ova", - "Petro\xC8\x99""ani", - "Piatra Neam\xC8\x9B", - "Pite\xC8\x99ti", - "Ploie\xC8\x99ti", + u8"Or\u0219ova", + u8"Petro\u0219ani", + u8"Piatra Neam\u021b", + u8"Pite\u0219ti", + u8"Ploie\u0219ti", "Predeal", - "R\xC3\xA2mnicu V\xC3\xA2lcea", + u8"R\u00e2mnicu V\u00e2lcea", "Reghin", - "Re\xC8\x99i\xC8\x9B""a", + u8"Re\u0219i\u021ba", "Roman", - "Ro\xC8\x99iorii de Vede", + u8"Ro\u0219iorii de Vede", "Satu Mare", - "Sebe\xC8\x99", - "Sf\xC3\xA2ntu Gheorghe", + u8"Sebe\u0219", + u8"Sf\u00e2ntu Gheorghe", "Sibiu", - "Sighi\xC8\x99oara", + u8"Sighi\u0219oara", "Sinaia", "Slatina", "Slobozia", "Sovata", "Suceava", "Sulina", - "T\xC4\x83nd\xC4\x83rei", - "T\xC3\xA2rgoviste", - "T\xC3\xA2rgu Jiu", - "T\xC3\xA2rgu Mures", + u8"T\u0103nd\u0103rei", + u8"T\u00e2rgoviste", + u8"T\u00e2rgu Jiu", + u8"T\u00e2rgu Mures", "Tecuci", - "Timi\xC8\x99oara", + u8"Timi\u0219oara", "Tulcea", "Turda", - "Turnu M\xC4\x83gurele", + u8"Turnu M\u0103gurele", "Urziceni", "Vaslui", "Vatra Dornei", "Victoria", "Videle", - "Zal\xC4\x83u", + u8"Zal\u0103u", }; static const char * const _name_slovak_real[] = { "Bratislava", - "B\xC3\xA1novce nad Bebravou", - "Bansk\xC3\xA1 Bystrica", - "Bansk\xC3\xA1 \xC5\xA0tiavnica", + u8"B\u00e1novce nad Bebravou", + u8"Bansk\u00e1 Bystrica", + u8"Bansk\u00e1 \u0160tiavnica", "Bardejov", "Brezno", "Brezova pod Bradlom", - "Byt\xC4\x8D""a", - "\xC4\x8C""adca", - "\xC4\x8Cierna nad Tisou", + u8"Byt\u010da", + u8"\u010cadca", + u8"\u010cierna nad Tisou", "Detva", - "Pre\xC5\xA1ov", + u8"Pre\u0161ov", "Dolny Kubin", - "Spi\xC5\xA1sk\xC3\xA1 Nov\xC3\xA1 Ves", - "Dunajsk\xC3\xA1 Streda", - "Gab\xC4\x8D\xC3\xADikovo", + u8"Spi\u0161sk\u00e1 Nov\u00e1 Ves", + u8"Dunajsk\u00e1 Streda", + u8"Gab\u010d\u00edikovo", "Galanta", "Gbely", "Gelnica", - "Handlov\xC3\xA1", + u8"Handlov\u00e1", "Hlohovec", - "Hol\xC3\xAD\xC4\x8D", - "Humenn\xC3\xA9", + u8"Hol\u00ed\u010d", + u8"Humenn\u00e9", "Hurbanovo", "Kezmarok", - "Kom\xC3\xA1rno", - "Ko\xC5\xA1ice", + u8"Kom\u00e1rno", + u8"Ko\u0161ice", "Kremnica", "Krompachy", "Kuty", "Leopoldov", - "Levo\xC4\x8D""a", - "Liptovsk\xC3\xBD Mikul\xC3\xA1\xC5\xA1", - "Lu\xC4\x8D""enec", + u8"Levo\u010da", + u8"Liptovsk\u00fd Mikul\u00e1\u0161", + u8"Lu\u010denec", "Malacky", "Martin", "Medzilaborce", "Michalovce", "Modra", "Myjava", - "N\xC3\xA1mestovo", + u8"N\u00e1mestovo", "Nitra", - "Nov\xC3\xA1 Ba\xC5\x88""a", - "Nov\xC3\xA9"" Mesto nad V\xC3\xA1hom", - "Nov\xC3\xA9"" Z\xC3\xA1""mky", - "Partiz\xC3\xA1nske", + u8"Nov\u00e1 Ba\u0148a", + u8"Nov\u00e9 Mesto nad V\u00e1hom", + u8"Nov\u00e9 Z\u00e1mky", + u8"Partiz\u00e1nske", "Pezinok", - "Pie\xC5\xA1\xC5\xA5""any", - "Polt\xC3\xA1r", + u8"Pie\u0161\u0165any", + u8"Polt\u00e1r", "Poprad", - "Pova\xC5\xBEsk\xC3\xA1 Bystrica", + u8"Pova\u017esk\u00e1 Bystrica", "Prievidza", - "P\xC3\xBA""chov", - "Rev\xC3\xBA""ca", - "Rimavsk\xC3\xA1 Sobota", - "Ro\xC5\xBE\xC5\x88""ava", - "Ru\xC5\xBEomberok", + u8"P\u00fachov", + u8"Rev\u00faca", + u8"Rimavsk\u00e1 Sobota", + u8"Ro\u017e\u0148ava", + u8"Ru\u017eomberok", "Sabinov", - "\xC5\xA0""a\xC4\xBE""a", + u8"\u0160a\u013ea", "Senec", "Senica", - "Sere\xC4\x8F", + u8"Sere\u010f", "Skalica", - "Sl\xC3\xA1""dkovi\xC3\x8Dovo", + u8"Sl\u00e1dkovi\u00cdovo", "Smolenice", "Snina", - "Star\xC3\xA1 \xC4\xBDubov\xC5\x88""a", - "Star\xC3\xA1 Tur\xC3\xA1", - "Str\xC3\xA1\xC5\xBEske", + u8"Star\u00e1 \u013dubov\u0148a", + u8"Star\u00e1 Tur\u00e1", + u8"Str\u00e1\u017eske", "Stropkov", "Stupava", - "\xC5\xA0t\xC3\xBArovo", - "\xC4\xA0ulekovo", - "Topo\xC4\xBE\xC4\x8D""any", - "Trebi\xC5\xA1ov", - "Tren\xC4\x8D\xC3\xADn", + u8"\u0160t\u00farovo", + u8"\u0120ulekovo", + u8"Topo\u013e\u010dany", + u8"Trebi\u0161ov", + u8"Tren\u010d\u00edn", "Trnava", - "Tur\xC4\x8Dianske Teplice", - "Tvrdo\xC5\xA1\xC3\xADn", - "Vr\xC3\xA1""ble", - "Vranov nad Top\xC4\xBEou", - "Z\xC3\xA1horsk\xC3\xA1 Bystrica", - "\xC5\xBD""diar", - "\xC4\xBDiar nad Hronom", - "\xC5\xBDilina", - "Zlat\xC3\xA9 Moravce", + u8"Tur\u010dianske Teplice", + u8"Tvrdo\u0161\u00edn", + u8"Vr\u00e1ble", + u8"Vranov nad Top\u013eou", + u8"Z\u00e1horsk\u00e1 Bystrica", + u8"\u017ddiar", + u8"\u013diar nad Hronom", + u8"\u017dilina", + u8"Zlat\u00e9 Moravce", "Zvolen", }; static const char * const _name_norwegian_1[] = { "Arna", "Aust", - "Bj\xC3\xB8rk", - "Bj\xC3\xB8rn", + u8"Bj\u00f8rk", + u8"Bj\u00f8rn", "Brand", - "B\xC3\xB8ver", + u8"B\u00f8ver", "Drag", - "Dr\xC3\xB8", + u8"Dr\u00f8", "Eids", "Egge", "Fager", @@ -2143,12 +2143,12 @@ static const char * const _name_norwegian_1[] = { "Gaus", "Galte", "Geir", - "Gl\xC3\xB8s", + u8"Gl\u00f8s", "Gran", "Grind", "Grims", - "Gr\xC3\xB8n", - "Gr\xC3\xB8t", + u8"Gr\u00f8n", + u8"Gr\u00f8t", "Gulle", "Haka", "Hammer", @@ -2163,7 +2163,7 @@ static const char * const _name_norwegian_1[] = { "Kjerring", "Knatte", "Krok", - "K\xC3\xB8y", + u8"K\u00f8y", "Lang", "Lauv", "Leir", @@ -2171,7 +2171,7 @@ static const char * const _name_norwegian_1[] = { "Logn", "Lo", "Lyng", - "L\xC3\xB8n", + u8"L\u00f8n", "Mesna", "Mel", "Mo", @@ -2191,9 +2191,9 @@ static const char * const _name_norwegian_1[] = { "Sel", "Sol", "Sjur", - "Sk\xC3\xA5r", - "Sl\xC3\xA5tt", - "Stj\xC3\xB8r", + u8"Sk\u00e5r", + u8"Sl\u00e5tt", + u8"Stj\u00f8r", "Stor", "Svart", "Svens", @@ -2206,7 +2206,7 @@ static const char * const _name_norwegian_1[] = { "Vest", "Vesle", "Vik", - "V\xC3\xA5g", + u8"V\u00e5g", }; static const char * const _name_norwegian_2[] = { @@ -2221,7 +2221,7 @@ static const char * const _name_norwegian_2[] = { "bugen", "by", "bygd", - "b\xC3\xB8", + u8"b\u00f8", "dal", "egga", "eid", @@ -2239,10 +2239,10 @@ static const char * const _name_norwegian_2[] = { "heim", "hella", "hovda", - "h\xC3\xB8""a", - "h\xC3\xB8gda", + u8"h\u00f8a", + u8"h\u00f8gda", "kampen", - "kj\xC3\xB8len", + u8"kj\u00f8len", "kollen", "kroken", "land", @@ -2257,7 +2257,7 @@ static const char * const _name_norwegian_2[] = { "rud", "sand", "set", - "sj\xC3\xB8""en", + u8"sj\u00f8en", "skogen", "slette", "snipa", @@ -2266,7 +2266,7 @@ static const char * const _name_norwegian_2[] = { "stulen", "sund", "svingen", - "s\xC3\xA6tra", + u8"s\u00e6tra", "tinden", "tun", "vang", @@ -2274,9 +2274,9 @@ static const char * const _name_norwegian_2[] = { "veid", "vik", "voll", - "v\xC3\xA5g", + u8"v\u00e5g", "um", - "\xC3\xA5sen", + u8"\u00e5sen", }; static const char * const _name_norwegian_real[] = { @@ -2284,12 +2284,12 @@ static const char * const _name_norwegian_real[] = { "Arendal", "Askim", "Bergen", - "Bod\xC3\xB8", + u8"Bod\u00f8", "Brevik", "Bryne", - "Br\xC3\xB8nn\xC3\xB8ysund", + u8"Br\u00f8nn\u00f8ysund", "Drammen", - "Dr\xC3\xB8""bak", + u8"Dr\u00f8bak", "Egersund", "Elverum", "Farsund", @@ -2297,10 +2297,10 @@ static const char * const _name_norwegian_real[] = { "Finnsnes", "Flekkefjord", "Flora", - "Fosnav\xC3\xA5g", + u8"Fosnav\u00e5g", "Fredrikstad", - "F\xC3\xB8rde", - "Gj\xC3\xB8vik", + u8"F\u00f8rde", + u8"Gj\u00f8vik", "Grimstad", "Halden", "Hamar", @@ -2309,13 +2309,13 @@ static const char * const _name_norwegian_real[] = { "Haugesund", "Holmestrand", "Horten", - "J\xC3\xB8rpeland", + u8"J\u00f8rpeland", "Kirkenes", "Kolvereid", "Kongsberg", "Kongsvinger", "Kopervik", - "Krager\xC3\xB8", + u8"Krager\u00f8", "Kristiansand", "Kristiansund", "Langesund", @@ -2325,16 +2325,16 @@ static const char * const _name_norwegian_real[] = { "Levanger", "Lillehammer", "Lillesand", - "Lillestr\xC3\xB8m", + u8"Lillestr\u00f8m", "Lyngdal", - "L\xC3\xB8renskog", + u8"L\u00f8renskog", "Mandal", "Mo i Rana", "Molde", - "Mosj\xC3\xB8""en", + u8"Mosj\u00f8en", "Moss", "Mysen", - "M\xC3\xA5l\xC3\xB8y", + u8"M\u00e5l\u00f8y", "Namsos", "Narvik", "Notodden", @@ -2343,11 +2343,11 @@ static const char * const _name_norwegian_real[] = { "Otta", "Porsgrunn", "Ringerike", - "Ris\xC3\xB8r", + u8"Ris\u00f8r", "Rjukan", "Sandefjord", "Sandnes", - "Sandnessj\xC3\xB8""en", + u8"Sandnessj\u00f8en", "Sandvika", "Sarpsborg", "Sauda", @@ -2358,152 +2358,152 @@ static const char * const _name_norwegian_real[] = { "Stathelle", "Stavanger", "Steinkjer", - "Stj\xC3\xB8rdal", + u8"Stj\u00f8rdal", "Stokmarknes", "Stord", "Svelvik", - "Svolv\xC3\xA6r", - "Troms\xC3\xB8", + u8"Svolv\u00e6r", + u8"Troms\u00f8", "Trondheim", "Tvedestrand", - "T\xC3\xB8nsberg", + u8"T\u00f8nsberg", "Ulsteinvik", - "Vads\xC3\xB8", - "Vard\xC3\xB8", - "Verdals\xC3\xB8ra", - "\xC3\x85krehamn", - "\xC3\x85lesund", - "\xC3\x85ndalsnes", + u8"Vads\u00f8", + u8"Vard\u00f8", + u8"Verdals\u00f8ra", + u8"\u00c5krehamn", + u8"\u00c5lesund", + u8"\u00c5ndalsnes", }; static const char * const _name_hungarian_1[] = { "Nagy-", "Kis-", - "Fels\xC5\x91-", - "Als\xC3\xB3-", - "\xC3\x9Aj-", + u8"Fels\u0151-", + u8"Als\u00f3-", + u8"\u00daj-", }; static const char * const _name_hungarian_2[] = { "Bodrog", - "Dr\xC3\xA1va", + u8"Dr\u00e1va", "Duna", - "Hej\xC5\x91", - "Hern\xC3\xA1""d", - "R\xC3\xA1""ba", - "Saj\xC3\xB3", + u8"Hej\u0151", + u8"Hern\u00e1d", + u8"R\u00e1ba", + u8"Saj\u00f3", "Szamos", "Tisza", "Zala", "Balaton", - "Fert\xC5\x91", + u8"Fert\u0151", "Bakony", - "Cserh\xC3\xA1t", + u8"Cserh\u00e1t", "Bihar", - "Hajd\xC3\xBA", - "J\xC3\xA1sz", + u8"Hajd\u00fa", + u8"J\u00e1sz", "Kun", "Magyar", - "N\xC3\xB3gr\xC3\xA1""d", - "Ny\xC3\xADr", + u8"N\u00f3gr\u00e1d", + u8"Ny\u00edr", "Somogy", - "Sz\xC3\xA9kely", + u8"Sz\u00e9kely", "Buda", - "Gy\xC5\x91r", + u8"Gy\u0151r", "Pest", - "Feh\xC3\xA9r", - "Cser\xC3\xA9p", - "Erd\xC5\x91", + u8"Feh\u00e9r", + u8"Cser\u00e9p", + u8"Erd\u0151", "Hegy", "Homok", - "Mez\xC5\x91", + u8"Mez\u0151", "Puszta", - "S\xC3\xA1r", - "Cs\xC3\xA1sz\xC3\xA1r", + u8"S\u00e1r", + u8"Cs\u00e1sz\u00e1r", "Herceg", - "Kir\xC3\xA1ly", + u8"Kir\u00e1ly", "Nemes", - "P\xC3\xBCsp\xC3\xB6k", + u8"P\u00fcsp\u00f6k", "Szent", - "Alm\xC3\xA1s", - "Szilv\xC3\xA1s", + u8"Alm\u00e1s", + u8"Szilv\u00e1s", "Agg", "Aranyos", - "B\xC3\xA9k\xC3\xA9s", - "Egyh\xC3\xA1zas", + u8"B\u00e9k\u00e9s", + u8"Egyh\u00e1zas", "Gagy", "Heves", "Kapos", - "T\xC3\xA1pi\xC3\xB3", + u8"T\u00e1pi\u00f3", "Torna", "Vas", - "V\xC3\xA1mos", - "V\xC3\xA1s\xC3\xA1ros", + u8"V\u00e1mos", + u8"V\u00e1s\u00e1ros", }; static const char * const _name_hungarian_3[] = { - "ap\xC3\xA1ti", - "b\xC3\xA1""ba", + u8"ap\u00e1ti", + u8"b\u00e1ba", "bikk", "dob", "fa", - "f\xC3\xB6ld", + u8"f\u00f6ld", "hegyes", "kak", "kereszt", - "k\xC3\xBCrt", - "lad\xC3\xA1ny", - "m\xC3\xA9rges", + u8"k\u00fcrt", + u8"lad\u00e1ny", + u8"m\u00e9rges", "szalonta", "telek", "vas", - "v\xC3\xB6lgy", + u8"v\u00f6lgy", }; static const char * const _name_hungarian_4[] = { "alja", - "egyh\xC3\xA1za", - "h\xC3\xA1za", - "\xC3\xBAr", - "v\xC3\xA1r", + u8"egyh\u00e1za", + u8"h\u00e1za", + u8"\u00far", + u8"v\u00e1r", }; static const char * const _name_hungarian_real[] = { "Ajka", - "Asz\xC3\xB3""d", + u8"Asz\u00f3d", "Badacsony", "Baja", "Budapest", "Debrecen", "Eger", - "Fony\xC3\xB3""d", - "G\xC3\xB6""d\xC3\xB6ll\xC5\x91", - "Gy\xC5\x91r", + u8"Fony\u00f3d", + u8"G\u00f6d\u00f6ll\u0151", + u8"Gy\u0151r", "Gyula", "Karcag", - "Kecskem\xC3\xA9t", + u8"Kecskem\u00e9t", "Keszthely", - "Kisk\xC3\xB6re", + u8"Kisk\u00f6re", "Kocsord", - "Kom\xC3\xA1rom", - "K\xC5\x91szeg", - "Mak\xC3\xB3", - "Moh\xC3\xA1""cs", + u8"Kom\u00e1rom", + u8"K\u0151szeg", + u8"Mak\u00f3", + u8"Moh\u00e1cs", "Miskolc", - "\xC3\x93zd", + u8"\u00d3zd", "Paks", - "P\xC3\xA1pa", - "P\xC3\xA9""cs", - "Polg\xC3\xA1r", + u8"P\u00e1pa", + u8"P\u00e9cs", + u8"Polg\u00e1r", "Sarkad", - "Si\xC3\xB3""fok", + u8"Si\u00f3fok", "Szeged", "Szentes", "Szolnok", "Tihany", "Tokaj", - "V\xC3\xA1""c", - "Z\xC3\xA1hony", + u8"V\u00e1c", + u8"Z\u00e1hony", "Zirc", }; @@ -2514,7 +2514,7 @@ static const char * const _name_swiss_real[] = { "Arosa", "Appenzell", "Arbon", - "Altst\xC3\xA4tten", + u8"Altst\u00e4tten", "Baar", "Baden", "Bellinzona", @@ -2525,20 +2525,20 @@ static const char * const _name_swiss_real[] = { "Burgdorf", "Bern", "Basel", - "B\xC3\xBClach", + u8"B\u00fclach", "Carouge", "Cham", "Chiasso", "Chur", "Davos", - "Del\xC3\xA9mont", + u8"Del\u00e9mont", "Dietikon", - "D\xC3\xBC""bendorf", + u8"D\u00fcbendorf", "Emmen", - "Freienbach-Pf\xC3\xA4""ffikon", + u8"Freienbach-Pf\u00e4ffikon", "Fribourg", "Frauenfeld", - "Gen\xC3\xA8ve", + u8"Gen\u00e8ve", "Glarus", "Gossau", "Grenchen", @@ -2550,9 +2550,9 @@ static const char * const _name_swiss_real[] = { "Jona", "Kriens", "Kloten", - "K\xC3\xB6niz", + u8"K\u00f6niz", "Kreuzlingen", - "K\xC3\xBCsnacht", + u8"K\u00fcsnacht", "Agen", "Lancy", "La Chaux-de-Fonds", @@ -2569,7 +2569,7 @@ static const char * const _name_swiss_real[] = { "Lyss", "Luzern", "Martigny", - "M\xC3\xBCnchenstein", + u8"M\u00fcnchenstein", "Meyrin", "Montreux", "Monthey", @@ -2577,7 +2577,7 @@ static const char * const _name_swiss_real[] = { "Murten", "Moutier", "Muttenz", - "Neuch\xC3\xA2tel", + u8"Neuch\u00e2tel", "Neuhausen am Rheinfall", "Nyon", "Olten", @@ -2606,11 +2606,11 @@ static const char * const _name_swiss_real[] = { "St. Moritz", "Sion", "Spiez", - "St\xC3\xA4""fa", + u8"St\u00e4fa", "Sursee", "Schwyz", "Thalwil", - "Th\xC3\xB4nex", + u8"Th\u00f4nex", "Thun", "Uster", "Uzwil", @@ -2618,7 +2618,7 @@ static const char * const _name_swiss_real[] = { "Volketswil", "Versoix", "Vevey", - "W\xC3\xA4""denswil", + u8"W\u00e4denswil", "Wettingen", "Wil", "Wallisellen", @@ -2629,7 +2629,7 @@ static const char * const _name_swiss_real[] = { "Yverdon-les-Bains", "Zollikon", "Zofingen", - "Z\xC3\xBCrich", + u8"Z\u00fcrich", "Zug", }; @@ -2639,12 +2639,12 @@ static const char * const _name_danish_1[] = { "Nye ", "Store ", "Kirke ", - "N\xC3\xB8rre ", + u8"N\u00f8rre ", "Vester ", - "S\xC3\xB8nder ", - "\xC3\x98ster ", + u8"S\u00f8nder ", + u8"\u00d8ster ", "Hvide ", - "H\xC3\xB8je ", + u8"H\u00f8je ", "Kongens ", }; @@ -2656,7 +2656,7 @@ static const char * const _name_danish_2[] = { "Bede", "Birke", "Bjerring", - "Bj\xC3\xA6ver", + u8"Bj\u00e6ver", "Blommens", "Blok", "Bolder", @@ -2669,7 +2669,7 @@ static const char * const _name_danish_2[] = { "Fredens", "Frederiks", "Fugle", - "F\xC3\xA5re", + u8"F\u00e5re", "Gille", "Gis", "Givs", @@ -2686,11 +2686,11 @@ static const char * const _name_danish_2[] = { "Hol", "Horn", "Humle", - "H\xC3\xB8j", - "H\xC3\xB8r", + u8"H\u00f8j", + u8"H\u00f8r", "Is", "Jyde", - "J\xC3\xA6gers", + u8"J\u00e6gers", "Karls", "Klov", "Kokke", @@ -2702,24 +2702,24 @@ static const char * const _name_danish_2[] = { "Ny", "Oks", "Ring", - "R\xC3\xB8""de", + u8"R\u00f8de", "Rung", - "R\xC3\xB8r", + u8"R\u00f8r", "Rud", "Saks", "Salt", "Skam", "Silke", "Skod", - "Sk\xC3\xA6l", - "Sk\xC3\xA6r", + u8"Sk\u00e6l", + u8"Sk\u00e6r", "Sol", "Svend", "Svine", "Strand", "Stubbe", "Ting", - "Tj\xC3\xA6re", + u8"Tj\u00e6re", "Tore", "Uger", "Ulf", @@ -2727,9 +2727,9 @@ static const char * const _name_danish_2[] = { "Vand", "Vej", "Vor", - "V\xC3\xA6r", - "\xC3\x98r", - "\xC3\x85l", + u8"V\u00e6r", + u8"\u00d8r", + u8"\u00c5l", }; static const char * const _name_danish_3[] = { @@ -2742,21 +2742,21 @@ static const char * const _name_danish_3[] = { "strup", "holm", "hus", - "k\xC3\xB8""bing", + u8"k\u00f8bing", "lund", "lunde", "sund", "ovre", - "h\xC3\xB8j", + u8"h\u00f8j", "dal", "sted", "sten", - "l\xC3\xB8se", - "r\xC3\xB8""d", + u8"l\u00f8se", + u8"r\u00f8d", "magle", - "s\xC3\xB8", + u8"s\u00f8", "bjerg", - "b\xC3\xA6k", + u8"b\u00e6k", "drup", "lev", "bo", @@ -2766,32 +2766,32 @@ static const char * const _name_danish_3[] = { }; static const char * const _name_turkish_prefix[] = { - "Ak\xC3\xA7""a", - "Alt\xC4\xB1n", - "Bah\xC3\xA7""e", + u8"Ak\u00e7a", + u8"Alt\u0131n", + u8"Bah\u00e7e", "Boz", - "B\xC3\xBCy\xC3\xBCk", - "\xC3\x87""ay", - "Do\xC4\x9Fu", + u8"B\u00fcy\u00fck", + u8"\u00c7ay", + u8"Do\u011fu", "Eski", - "G\xC3\xBCzel", - "K\xC4\xB1z\xC4\xB1l", - "K\xC3\xBC\xC3\xA7\xC3\xBCk", + u8"G\u00fczel", + u8"K\u0131z\u0131l", + u8"K\u00fc\u00e7\u00fck", "Orta", - "Sar\xC4\xB1", + u8"Sar\u0131", "Sultan", "Ulu", "Yeni", }; static const char * const _name_turkish_middle[] = { - "aga\xC3\xA7", + u8"aga\u00e7", "ayva", - "\xC3\xA7""am", + u8"\u00e7am", "elma", "kurt", "pazar", - "yal\xC4\xB1", + u8"yal\u0131", }; static const char * const _name_turkish_suffix[] = { @@ -2800,10 +2800,10 @@ static const char * const _name_turkish_suffix[] = { "kale", "kaya", "kent", - "k\xC3\xB6y", + u8"k\u00f6y", "ova", - "\xC3\xB6z\xC3\xBC", - "\xC3\xB6ren", + u8"\u00f6z\u00fc", + u8"\u00f6ren", "pazar", "saray", "tepe", @@ -2813,48 +2813,48 @@ static const char * const _name_turkish_suffix[] = { static const char * const _name_turkish_real[] = { "Adana", - "Ad\xC4\xB1yaman", + u8"Ad\u0131yaman", "Afyon", - "A\xC4\x9Fr\xC4\xB1", + u8"A\u011fr\u0131", "Amasya", "Antalya", "Artvin", - "Bal\xC4\xB1kesir", + u8"Bal\u0131kesir", "Bilecik", "Bitlis", "Bolu", "Burdur", "Bursa", - "\xC3\x87""anakkale", - "\xC3\x87""ank\xC4\xB1r\xC4\xB1", + u8"\u00c7anakkale", + u8"\u00c7ank\u0131r\u0131", "Denizli", - "Diyarbak\xC4\xB1r", + u8"Diyarbak\u0131r", "Edirne", - "Elaz\xC4\xB1\xC4\x9F", + u8"Elaz\u0131\u011f", "Erzurum", - "Eski\xC5\x9F""ehir", + u8"Eski\u015fehir", "Giresun", - "G\xC3\xBCm\xC3\xBC\xC5\x9Fhane", + u8"G\u00fcm\u00fc\u015fhane", "Hatay", "Isparta", - "\xC4\xB0\xC3\xA7""el", - "\xC4\xB0stanbul", - "\xC4\xB0zmir", + u8"\u0130\u00e7el", + u8"\u0130stanbul", + u8"\u0130zmir", "Kars", "Kastamonu", "Kayseri", "Kirklareli", "Kocaeli", "Konya", - "K\xC3\xBCtahya", + u8"K\u00fctahya", "Malatya", "Manisa", - "Kahramanmara\xC5\x9F", + u8"Kahramanmara\u015f", "Mardin", - "Mu\xC4\x9Fla", - "Mu\xC5\x9F", - "Nev\xC5\x9F""ehir", - "Ni\xC4\x9F""de", + u8"Mu\u011fla", + u8"Mu\u015f", + u8"Nev\u015fehir", + u8"Ni\u011fde", "Rize", "Sakarya", "Samsun", @@ -2862,21 +2862,21 @@ static const char * const _name_turkish_real[] = { "Sinop", "Sivas", "Trabzon", - "\xC5\x9E""anl\xC4\xB1urfa", + u8"\u015eanl\u0131urfa", "Van", "Yozgat", "Zonguldak", "Aksaray", "Bayburt", "Karaman", - "\xC5\x9E\xC4\xB1rnak", - "Bart\xC4\xB1n", + u8"\u015e\u0131rnak", + u8"Bart\u0131n", "Ardahan", - "I\xC4\x9F""d\xC4\xB1r", + u8"I\u011fd\u0131r", "Yalova", - "Karab\xC3\xBCk", + u8"Karab\u00fck", "Osmaniye", - "D\xC3\xBCzce", + u8"D\u00fczce", }; static const char * const _name_italian_real[] = { @@ -3168,7 +3168,7 @@ static const char * const _name_catalan_real[] = { "Banyoles", "Figueres", "Balaguer", - "Vilafranca del Pened\xC3\xA8s", + u8"Vilafranca del Pened\u00e8s", "La Seu d'Urgell", "El Pont de Suert", "Igualada", @@ -3184,21 +3184,21 @@ static const char * const _name_catalan_real[] = { "Ripoll", "Cervera", "Gandesa", - "Matar\xC3\xB3", + u8"Matar\u00f3", "Montblanc", - "Vilanova i la Geltr\xC3\xBA", - "T\xC3\xA0rrega", + u8"Vilanova i la Geltr\u00fa", + u8"T\u00e0rrega", "Camprodon", - "Campdev\xC3\xA0nol", + u8"Campdev\u00e0nol", "Cambrils", "Begur", "Setcases", "Palafrugell", "Begues", "El Bruc", - "Cadaqu\xC3\xA9s", - "Collbat\xC3\xB3", - "Cervell\xC3\xB3", + u8"Cadaqu\u00e9s", + u8"Collbat\u00f3", + u8"Cervell\u00f3", "Esparreguera", "Abrera", "Alp", @@ -3209,7 +3209,7 @@ static const char * const _name_catalan_real[] = { "Molins de Rei", "Monistrol", "Rocallaura", - "Rub\xC3\xAD", + u8"Rub\u00ed", "Ripollet", "Sitges", "Roses", @@ -3239,14 +3239,14 @@ static const char * const _name_catalan_pref[] = { "Sant Joan de ", "Sant Feliu de ", "Sant Quirze de ", - "Sant Sadurn\xC3\xAD de ", + u8"Sant Sadurn\u00ed de ", "Santa Coloma de ", "Santa Margarida de ", "Santa Maria de ", - "Sant Mart\xC3\xAD de ", + u8"Sant Mart\u00ed de ", "Sant Pere de ", - "Sant Juli\xC3\xA0 de ", - "Sant Vicen\xC3\xA7 de ", + u8"Sant Juli\u00e0 de ", + u8"Sant Vicen\u00e7 de ", }; @@ -3275,10 +3275,10 @@ static const char * const _name_catalan_2m[] = { "baix", "fosc", "pelat", - "vent\xC3\xB3s", + u8"vent\u00f3s", "negre", "roig", - "gr\xC3\xADs", + u8"gr\u00eds", }; static const char * const _name_catalan_2f[] = { @@ -3293,14 +3293,14 @@ static const char * const _name_catalan_2f[] = { }; static const char * const _name_catalan_3[] = { - " Desp\xC3\xAD", + u8" Desp\u00ed", " Desvern", - " del Cam\xC3\xAD", + u8" del Cam\u00ed", " de Mar", " de Dalt", " de Baix", - " del Vall\xC3\xA8s", - " de Bergued\xC3\xA0", + u8" del Vall\u00e8s", + u8" de Bergued\u00e0", " de Conflent", " de la Plana", }; @@ -3311,5 +3311,5 @@ static const char * const _name_catalan_river1[] = { " de Llobregat", " d'Ebre", " de Segre", - " de Francol\xC3\xAD", + u8" de Francol\u00ed", }; diff --git a/src/textfile_gui.cpp b/src/textfile_gui.cpp index e44d9178d9..3519c27508 100644 --- a/src/textfile_gui.cpp +++ b/src/textfile_gui.cpp @@ -359,7 +359,7 @@ static void Xunzip(byte **bufp, size_t *sizep) } /* Check for the byte-order-mark, and skip it if needed. */ - char *p = this->text + (strncmp("\xEF\xBB\xBF", this->text, 3) == 0 ? 3 : 0); + char *p = this->text + (strncmp(u8"\ufeff", this->text, 3) == 0 ? 3 : 0); /* Make sure the string is a valid UTF-8 sequence. */ str_validate(p, this->text + filesize, SVS_REPLACE_WITH_QUESTION_MARK | SVS_ALLOW_NEWLINE); diff --git a/src/townname.cpp b/src/townname.cpp index 77dfb448b2..e7999f9a53 100644 --- a/src/townname.cpp +++ b/src/townname.cpp @@ -505,7 +505,7 @@ static char *MakeFinnishTownName(char *buf, const char *last, uint32 seed) strstr(orig, "A") != nullptr || strstr(orig, "O") != nullptr || strstr(orig, "U") != nullptr) { buf = strecpy(buf, "la", last); } else { - buf = strecpy(buf, "l\xC3\xA4", last); + buf = strecpy(buf, u8"l\u00e4", last); } return buf; } From c9fd85528a804060473364c54248149e96da0508 Mon Sep 17 00:00:00 2001 From: Pavel Stupnikov Date: Tue, 15 Dec 2020 01:35:07 +0300 Subject: [PATCH 04/20] Add: new economy "frozen" that stops production changes and industry closures (#8282) --- src/economy_type.h | 9 ++++++++ src/industry_cmd.cpp | 47 +++++++++++++++++++++--------------------- src/industry_gui.cpp | 4 ++-- src/industrytype.h | 2 +- src/lang/english.txt | 7 +++++-- src/settings_gui.cpp | 2 +- src/settings_type.h | 3 ++- src/table/settings.ini | 15 +++++++++----- 8 files changed, 54 insertions(+), 35 deletions(-) diff --git a/src/economy_type.h b/src/economy_type.h index 87e4482672..842e2711c3 100644 --- a/src/economy_type.h +++ b/src/economy_type.h @@ -15,6 +15,15 @@ typedef OverflowSafeInt64 Money; +/** Type of the game economy. */ +enum EconomyType : uint8 { + ET_BEGIN = 0, + ET_ORIGINAL = 0, + ET_SMOOTH = 1, + ET_FROZEN = 2, + ET_END = 3, +}; + /** Data of the economy. */ struct Economy { Money max_loan; ///< NOSAVE: Maximum possible loan diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index 443702993e..b8b92e5bf9 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -1736,8 +1736,8 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type, MemSetT(i->incoming_cargo_waiting, 0, lengthof(i->incoming_cargo_waiting)); MemSetT(i->last_cargo_accepted_at, 0, lengthof(i->last_cargo_accepted_at)); - /* don't use smooth economy for industries using production related callbacks */ - if (indspec->UsesSmoothEconomy()) { + /* Randomize inital production if non-original economy is used and there are no production related callbacks. */ + if (!indspec->UsesOriginalEconomy()) { for (size_t ci = 0; ci < lengthof(i->production_rate); ci++) { i->production_rate[ci] = min((RandomRange(256) + 128) * i->production_rate[ci] >> 8, 255); } @@ -2304,7 +2304,7 @@ static void UpdateIndustryStatistics(Industry *i) void Industry::RecomputeProductionMultipliers() { const IndustrySpec *indspec = GetIndustrySpec(this->type); - assert(!indspec->UsesSmoothEconomy()); + assert(indspec->UsesOriginalEconomy()); /* Rates are rounded up, so e.g. oilrig always produces some passengers */ for (size_t i = 0; i < lengthof(this->production_rate); i++) { @@ -2604,8 +2604,8 @@ static void ChangeIndustryProduction(Industry *i, bool monthly) bool standard = false; bool suppress_message = false; bool recalculate_multipliers = false; ///< reinitialize production_rate to match prod_level - /* don't use smooth economy for industries using production related callbacks */ - bool smooth_economy = indspec->UsesSmoothEconomy(); + /* use original economy for industries using production related callbacks */ + bool original_economy = indspec->UsesOriginalEconomy(); byte div = 0; byte mul = 0; int8 increment = 0; @@ -2640,7 +2640,8 @@ static void ChangeIndustryProduction(Industry *i, bool monthly) } } } else { - if (monthly != smooth_economy) return; + if (monthly == original_economy) return; + if (!original_economy && _settings_game.economy.type == ET_FROZEN) return; if (indspec->life_type == INDUSTRYLIFE_BLACK_HOLE) return; } @@ -2648,7 +2649,16 @@ static void ChangeIndustryProduction(Industry *i, bool monthly) /* decrease or increase */ bool only_decrease = (indspec->behaviour & INDUSTRYBEH_DONT_INCR_PROD) && _settings_game.game_creation.landscape == LT_TEMPERATE; - if (smooth_economy) { + if (original_economy) { + if (only_decrease || Chance16(1, 3)) { + /* If more than 60% transported, 66% chance of increase, else 33% chance of increase */ + if (!only_decrease && (i->last_month_pct_transported[0] > PERCENT_TRANSPORTED_60) != Chance16(1, 3)) { + mul = 1; // Increase production + } else { + div = 1; // Decrease production + } + } + } else if (_settings_game.economy.type == ET_SMOOTH) { closeit = true; for (byte j = 0; j < lengthof(i->produced_cargo); j++) { if (i->produced_cargo[j] == CT_INVALID) continue; @@ -2698,20 +2708,11 @@ static void ChangeIndustryProduction(Industry *i, bool monthly) ReportNewsProductionChangeIndustry(i, i->produced_cargo[j], percent); } } - } else { - if (only_decrease || Chance16(1, 3)) { - /* If more than 60% transported, 66% chance of increase, else 33% chance of increase */ - if (!only_decrease && (i->last_month_pct_transported[0] > PERCENT_TRANSPORTED_60) != Chance16(1, 3)) { - mul = 1; // Increase production - } else { - div = 1; // Decrease production - } - } } } if (!callback_enabled && (indspec->life_type & INDUSTRYLIFE_PROCESSING)) { - if ( (byte)(_cur_year - i->last_prod_year) >= 5 && Chance16(1, smooth_economy ? 180 : 2)) { + if ( (byte)(_cur_year - i->last_prod_year) >= 5 && Chance16(1, original_economy ? 2 : 180)) { closeit = true; } } @@ -2934,14 +2935,14 @@ Money IndustrySpec::GetRemovalCost() const } /** - * Determines whether this industrytype uses smooth economy or whether it uses standard/newgrf production changes. - * @return true if smooth economy is used. + * Determines whether this industrytype uses standard/newgrf production changes. + * @return true if original economy is used. */ -bool IndustrySpec::UsesSmoothEconomy() const +bool IndustrySpec::UsesOriginalEconomy() const { - return _settings_game.economy.smooth_economy && - !(HasBit(this->callback_mask, CBM_IND_PRODUCTION_256_TICKS) || HasBit(this->callback_mask, CBM_IND_PRODUCTION_CARGO_ARRIVAL)) && // production callbacks - !(HasBit(this->callback_mask, CBM_IND_MONTHLYPROD_CHANGE) || HasBit(this->callback_mask, CBM_IND_PRODUCTION_CHANGE) || HasBit(this->callback_mask, CBM_IND_PROD_CHANGE_BUILD)); // production change callbacks + return _settings_game.economy.type == ET_ORIGINAL || + HasBit(this->callback_mask, CBM_IND_PRODUCTION_256_TICKS) || HasBit(this->callback_mask, CBM_IND_PRODUCTION_CARGO_ARRIVAL) || // production callbacks + HasBit(this->callback_mask, CBM_IND_MONTHLYPROD_CHANGE) || HasBit(this->callback_mask, CBM_IND_PRODUCTION_CHANGE) || HasBit(this->callback_mask, CBM_IND_PROD_CHANGE_BUILD); // production change callbacks } IndustrySpec::~IndustrySpec() diff --git a/src/industry_gui.cpp b/src/industry_gui.cpp index a795b6a0ed..e54b1b2a4b 100644 --- a/src/industry_gui.cpp +++ b/src/industry_gui.cpp @@ -1080,7 +1080,7 @@ public: const Industry *i = Industry::Get(this->window_number); if (IsProductionAlterable(i)) { const IndustrySpec *ind = GetIndustrySpec(i->type); - this->editable = ind->UsesSmoothEconomy() ? EA_RATE : EA_MULTIPLIER; + this->editable = ind->UsesOriginalEconomy() ? EA_MULTIPLIER : EA_RATE; } else { this->editable = EA_NONE; } @@ -1100,7 +1100,7 @@ public: static void UpdateIndustryProduction(Industry *i) { const IndustrySpec *indspec = GetIndustrySpec(i->type); - if (!indspec->UsesSmoothEconomy()) i->RecomputeProductionMultipliers(); + if (indspec->UsesOriginalEconomy()) i->RecomputeProductionMultipliers(); for (byte j = 0; j < lengthof(i->produced_cargo); j++) { if (i->produced_cargo[j] != CT_INVALID) { diff --git a/src/industrytype.h b/src/industrytype.h index 8af486c210..937ff62cb9 100644 --- a/src/industrytype.h +++ b/src/industrytype.h @@ -144,7 +144,7 @@ struct IndustrySpec { bool IsProcessingIndustry() const; Money GetConstructionCost() const; Money GetRemovalCost() const; - bool UsesSmoothEconomy() const; + bool UsesOriginalEconomy() const; ~IndustrySpec(); }; diff --git a/src/lang/english.txt b/src/lang/english.txt index 510e29279b..142cc83f97 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1553,8 +1553,11 @@ STR_CONFIG_SETTING_ENDING_YEAR :Scoring end yea STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Year the game ends for scoring purposes. At the end of this year, the company's score is recorded and the high-score screen is displayed, but the players can continue playing after that.{}If this is before the starting year, the high-score screen is never displayed. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Never -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Enable smooth economy (more, smaller changes): {STRING2} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :When enabled, industry production changes more often, and in smaller steps. This setting has usually no effect, if industry types are provided by a NewGRF +STR_CONFIG_SETTING_ECONOMY_TYPE :Economy type: {STRING2} +STR_CONFIG_SETTING_ECONOMY_TYPE_HELPTEXT :Smooth economy makes production changes more often, and in smaller steps. Frozen economy stops production changes and industry closures. This setting may have no effect if industry types are provided by a NewGRF. +STR_CONFIG_SETTING_ECONOMY_TYPE_ORIGINAL :Original +STR_CONFIG_SETTING_ECONOMY_TYPE_SMOOTH :Smooth +STR_CONFIG_SETTING_ECONOMY_TYPE_FROZEN :Frozen STR_CONFIG_SETTING_ALLOW_SHARES :Allow buying shares from other companies: {STRING2} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :When enabled, allow buying and selling of company shares. Shares will only be available for companies reaching a certain age STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Minimum company age to trade shares: {STRING2} diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index a124d69894..cfb6bc5b81 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -1729,7 +1729,7 @@ static SettingsContainer &GetSettingsTree() industries->Add(new SettingEntry("construction.industry_platform")); industries->Add(new SettingEntry("economy.multiple_industry_per_town")); industries->Add(new SettingEntry("game_creation.oil_refinery_limit")); - industries->Add(new SettingEntry("economy.smooth_economy")); + industries->Add(new SettingEntry("economy.type")); industries->Add(new SettingEntry("station.serve_neutral_industries")); } diff --git a/src/settings_type.h b/src/settings_type.h index fdb2b0f862..2dbca59d82 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -11,6 +11,7 @@ #define SETTINGS_TYPE_H #include "date_type.h" +#include "economy_type.h" #include "town_type.h" #include "transport_type.h" #include "network/core/config.h" @@ -470,7 +471,7 @@ struct VehicleSettings { struct EconomySettings { bool inflation; ///< disable inflation bool bribe; ///< enable bribing the local authority - bool smooth_economy; ///< smooth economy + EconomyType type; ///< economy type (original/smooth/frozen) bool allow_shares; ///< allow the buying/selling of shares uint8 min_years_for_shares; ///< minimum age of a company for it to trade shares uint8 feeder_payment_share; ///< percentage of leg payment to virtually pay in feeder systems diff --git a/src/table/settings.ini b/src/table/settings.ini index c7dbd2128b..bba7d61e82 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -1429,12 +1429,17 @@ strhelp = STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT strval = STR_CONFIG_SETTING_ENDING_YEAR_VALUE cat = SC_ADVANCED -[SDT_BOOL] +[SDT_VAR] base = GameSettings -var = economy.smooth_economy -def = true -str = STR_CONFIG_SETTING_SMOOTH_ECONOMY -strhelp = STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT +var = economy.type +type = SLE_UINT8 +guiflags = SGF_MULTISTRING +def = ET_SMOOTH +min = ET_BEGIN +max = ET_END - 1 +str = STR_CONFIG_SETTING_ECONOMY_TYPE +strhelp = STR_CONFIG_SETTING_ECONOMY_TYPE_HELPTEXT +strval = STR_CONFIG_SETTING_ECONOMY_TYPE_ORIGINAL proc = InvalidateIndustryViewWindow cat = SC_BASIC From 5d278b62ccdacbf16b482c1d10247def85ceb71c Mon Sep 17 00:00:00 2001 From: frosch Date: Sun, 13 Dec 2020 22:24:36 +0100 Subject: [PATCH 05/20] Codechange: switch to C++17 on all platforms. --- CMakeLists.txt | 9 +-------- COMPILING.md | 4 ++-- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1a0dd5b759..15c6e03c0d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,14 +32,7 @@ set_directory_options() include(Static) set_static_if_needed() -if(MSVC) - # C++17 for MSVC - set(CMAKE_CXX_STANDARD 17) -else() - # C++11 for all other targets - set(CMAKE_CXX_STANDARD 11) -endif() - +set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED YES) set(CMAKE_CXX_EXTENSIONS NO) diff --git a/COMPILING.md b/COMPILING.md index 64f25f9c22..759dd2e9c4 100644 --- a/COMPILING.md +++ b/COMPILING.md @@ -83,9 +83,9 @@ make ## Supported compilers -Every compiler that is supported by CMake and supports C++11, should be +Every compiler that is supported by CMake and supports C++17, should be able to compile OpenTTD. As the exact list of compilers changes constantly, -we refer to the compiler manual to see if it supports C++11, and to CMake +we refer to the compiler manual to see if it supports C++17, and to CMake to see if it supports your compiler. ## Compilation of base sets From 484ea62a62d7e09ea550a40ea3ded24dcab8a6d0 Mon Sep 17 00:00:00 2001 From: frosch Date: Mon, 14 Dec 2020 21:46:35 +0100 Subject: [PATCH 06/20] Cleanup: use std::optional instead of custom implementation. --- src/3rdparty/optional/LICENSE_1_0.txt | 23 - src/3rdparty/optional/optional.hpp | 1066 ------------------------- src/3rdparty/optional/ottd_optional.h | 33 - src/ini_type.h | 4 +- 4 files changed, 2 insertions(+), 1124 deletions(-) delete mode 100644 src/3rdparty/optional/LICENSE_1_0.txt delete mode 100644 src/3rdparty/optional/optional.hpp delete mode 100644 src/3rdparty/optional/ottd_optional.h diff --git a/src/3rdparty/optional/LICENSE_1_0.txt b/src/3rdparty/optional/LICENSE_1_0.txt deleted file mode 100644 index 36b7cd93cd..0000000000 --- a/src/3rdparty/optional/LICENSE_1_0.txt +++ /dev/null @@ -1,23 +0,0 @@ -Boost Software License - Version 1.0 - August 17th, 2003 - -Permission is hereby granted, free of charge, to any person or organization -obtaining a copy of the software and accompanying documentation covered by -this license (the "Software") to use, reproduce, display, distribute, -execute, and transmit the Software, and to prepare derivative works of the -Software, and to permit third-parties to whom the Software is furnished to -do so, all subject to the following: - -The copyright notices in the Software and this entire statement, including -the above license grant, this restriction and the following disclaimer, -must be included in all copies of the Software, in whole or in part, and -all derivative works of the Software, unless such copies or derivative -works are solely in the form of machine-executable object code generated by -a source language processor. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/src/3rdparty/optional/optional.hpp b/src/3rdparty/optional/optional.hpp deleted file mode 100644 index fe1832b2ae..0000000000 --- a/src/3rdparty/optional/optional.hpp +++ /dev/null @@ -1,1066 +0,0 @@ -// Copyright (C) 2011 - 2012 Andrzej Krzemienski. -// -// Use, modification, and distribution is subject to the Boost Software -// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The idea and interface is based on Boost.Optional library -// authored by Fernando Luis Cacciola Carballal - -# ifndef ___OPTIONAL_HPP___ -# define ___OPTIONAL_HPP___ - -# include -# include -# include -# include -# include -# include -# include - -# define TR2_OPTIONAL_REQUIRES(...) typename enable_if<__VA_ARGS__::value, bool>::type = false - -# if defined __GNUC__ // NOTE: GNUC is also defined for Clang -# if (__GNUC__ == 4) && (__GNUC_MINOR__ >= 8) -# define TR2_OPTIONAL_GCC_4_8_AND_HIGHER___ -# elif (__GNUC__ > 4) -# define TR2_OPTIONAL_GCC_4_8_AND_HIGHER___ -# endif -# -# if (__GNUC__ == 4) && (__GNUC_MINOR__ >= 7) -# define TR2_OPTIONAL_GCC_4_7_AND_HIGHER___ -# elif (__GNUC__ > 4) -# define TR2_OPTIONAL_GCC_4_7_AND_HIGHER___ -# endif -# -# if (__GNUC__ == 4) && (__GNUC_MINOR__ == 8) && (__GNUC_PATCHLEVEL__ >= 1) -# define TR2_OPTIONAL_GCC_4_8_1_AND_HIGHER___ -# elif (__GNUC__ == 4) && (__GNUC_MINOR__ >= 9) -# define TR2_OPTIONAL_GCC_4_8_1_AND_HIGHER___ -# elif (__GNUC__ > 4) -# define TR2_OPTIONAL_GCC_4_8_1_AND_HIGHER___ -# endif -# endif -# -# if defined __clang_major__ -# if (__clang_major__ == 3 && __clang_minor__ >= 5) -# define TR2_OPTIONAL_CLANG_3_5_AND_HIGHTER_ -# elif (__clang_major__ > 3) -# define TR2_OPTIONAL_CLANG_3_5_AND_HIGHTER_ -# endif -# if defined TR2_OPTIONAL_CLANG_3_5_AND_HIGHTER_ -# define TR2_OPTIONAL_CLANG_3_4_2_AND_HIGHER_ -# elif (__clang_major__ == 3 && __clang_minor__ == 4 && __clang_patchlevel__ >= 2) -# define TR2_OPTIONAL_CLANG_3_4_2_AND_HIGHER_ -# endif -# endif -# -# if defined _MSC_VER -# if (_MSC_VER >= 1900) -# define TR2_OPTIONAL_MSVC_2015_AND_HIGHER___ -# endif -# endif - -# if defined __clang__ -# if (__clang_major__ > 2) || (__clang_major__ == 2) && (__clang_minor__ >= 9) -# define OPTIONAL_HAS_THIS_RVALUE_REFS 1 -# else -# define OPTIONAL_HAS_THIS_RVALUE_REFS 0 -# endif -# elif defined TR2_OPTIONAL_GCC_4_8_1_AND_HIGHER___ -# define OPTIONAL_HAS_THIS_RVALUE_REFS 1 -# elif defined TR2_OPTIONAL_MSVC_2015_AND_HIGHER___ -# define OPTIONAL_HAS_THIS_RVALUE_REFS 1 -# else -# define OPTIONAL_HAS_THIS_RVALUE_REFS 0 -# endif - - -# if defined TR2_OPTIONAL_GCC_4_8_1_AND_HIGHER___ -# define OPTIONAL_HAS_CONSTEXPR_INIT_LIST 1 -# define OPTIONAL_CONSTEXPR_INIT_LIST constexpr -# else -# define OPTIONAL_HAS_CONSTEXPR_INIT_LIST 0 -# define OPTIONAL_CONSTEXPR_INIT_LIST -# endif - -# if defined TR2_OPTIONAL_CLANG_3_5_AND_HIGHTER_ && (defined __cplusplus) && (__cplusplus != 201103L) -# define OPTIONAL_HAS_MOVE_ACCESSORS 1 -# else -# define OPTIONAL_HAS_MOVE_ACCESSORS 0 -# endif - -# // In C++11 constexpr implies const, so we need to make non-const members also non-constexpr -# if (defined __cplusplus) && (__cplusplus == 201103L) -# define OPTIONAL_MUTABLE_CONSTEXPR -# else -# define OPTIONAL_MUTABLE_CONSTEXPR constexpr -# endif - -namespace std{ - -namespace experimental{ - -// BEGIN workaround for missing is_trivially_destructible -# if defined TR2_OPTIONAL_GCC_4_8_AND_HIGHER___ - // leave it: it is already there -# elif defined TR2_OPTIONAL_CLANG_3_4_2_AND_HIGHER_ - // leave it: it is already there -# elif defined TR2_OPTIONAL_MSVC_2015_AND_HIGHER___ - // leave it: it is already there -# elif defined TR2_OPTIONAL_DISABLE_EMULATION_OF_TYPE_TRAITS - // leave it: the user doesn't want it -# else - template - using is_trivially_destructible = std::has_trivial_destructor; -# endif -// END workaround for missing is_trivially_destructible - -# if (defined TR2_OPTIONAL_GCC_4_7_AND_HIGHER___) - // leave it; our metafunctions are already defined. -# elif defined TR2_OPTIONAL_CLANG_3_4_2_AND_HIGHER_ - // leave it; our metafunctions are already defined. -# elif defined TR2_OPTIONAL_MSVC_2015_AND_HIGHER___ - // leave it: it is already there -# elif defined TR2_OPTIONAL_DISABLE_EMULATION_OF_TYPE_TRAITS - // leave it: the user doesn't want it -# else - - -// workaround for missing traits in GCC and CLANG -template -struct is_nothrow_move_constructible -{ - constexpr static bool value = std::is_nothrow_constructible::value; -}; - - -template -struct is_assignable -{ - template - constexpr static bool has_assign(...) { return false; } - - template () = std::declval(), true)) > - // the comma operator is necessary for the cases where operator= returns void - constexpr static bool has_assign(bool) { return true; } - - constexpr static bool value = has_assign(true); -}; - - -template -struct is_nothrow_move_assignable -{ - template - struct has_nothrow_move_assign { - constexpr static bool value = false; - }; - - template - struct has_nothrow_move_assign { - constexpr static bool value = noexcept( std::declval() = std::declval() ); - }; - - constexpr static bool value = has_nothrow_move_assign::value>::value; -}; -// end workaround - - -# endif - - - -// 20.5.4, optional for object types -template class optional; - -// 20.5.5, optional for lvalue reference types -template class optional; - - -// workaround: std utility functions aren't constexpr yet -template inline constexpr T&& constexpr_forward(typename std::remove_reference::type& t) noexcept -{ - return static_cast(t); -} - -template inline constexpr T&& constexpr_forward(typename std::remove_reference::type&& t) noexcept -{ - static_assert(!std::is_lvalue_reference::value, "!!"); - return static_cast(t); -} - -template inline constexpr typename std::remove_reference::type&& constexpr_move(T&& t) noexcept -{ - return static_cast::type&&>(t); -} - - -#if defined NDEBUG -# define TR2_OPTIONAL_ASSERTED_EXPRESSION(CHECK, EXPR) (EXPR) -#else -# define TR2_OPTIONAL_ASSERTED_EXPRESSION(CHECK, EXPR) ((CHECK) ? (EXPR) : ([]{assert(!#CHECK);}(), (EXPR))) -#endif - - -namespace detail_ -{ - -// static_addressof: a constexpr version of addressof -template -struct has_overloaded_addressof -{ - template - constexpr static bool has_overload(...) { return false; } - - template ().operator&()) > - constexpr static bool has_overload(bool) { return true; } - - constexpr static bool value = has_overload(true); -}; - -template )> -constexpr T* static_addressof(T& ref) -{ - return &ref; -} - -template )> -T* static_addressof(T& ref) -{ - return std::addressof(ref); -} - - -// the call to convert(b) has return type A and converts b to type A iff b decltype(b) is implicitly convertible to A -template -constexpr U convert(U v) { return v; } - - -namespace swap_ns -{ - using std::swap; - - template - void adl_swap(T& t, T& u) noexcept(noexcept(swap(t, u))) - { - swap(t, u); - } - -} // namespace swap_ns - -} // namespace detail - - -constexpr struct trivial_init_t{} trivial_init{}; - - -// 20.5.6, In-place construction -constexpr struct in_place_t{} in_place{}; - - -// 20.5.7, Disengaged state indicator -struct nullopt_t -{ - struct init{}; - constexpr explicit nullopt_t(init){} -}; -constexpr nullopt_t nullopt{nullopt_t::init()}; - - -// 20.5.8, class bad_optional_access -class bad_optional_access : public logic_error { -public: - explicit bad_optional_access(const string& what_arg) : logic_error{what_arg} {} - explicit bad_optional_access(const char* what_arg) : logic_error{what_arg} {} -}; - - -template -union storage_t -{ - unsigned char dummy_; - T value_; - - constexpr storage_t( trivial_init_t ) noexcept : dummy_() {}; - - template - constexpr storage_t( Args&&... args ) : value_(constexpr_forward(args)...) {} - - ~storage_t(){} -}; - - -template -union constexpr_storage_t -{ - unsigned char dummy_; - T value_; - - constexpr constexpr_storage_t( trivial_init_t ) noexcept : dummy_() {}; - - template - constexpr constexpr_storage_t( Args&&... args ) : value_(constexpr_forward(args)...) {} - - ~constexpr_storage_t() = default; -}; - - -template -struct optional_base -{ - bool init_; - storage_t storage_; - - constexpr optional_base() noexcept : init_(false), storage_(trivial_init) {}; - - explicit constexpr optional_base(const T& v) : init_(true), storage_(v) {} - - explicit constexpr optional_base(T&& v) : init_(true), storage_(constexpr_move(v)) {} - - template explicit optional_base(in_place_t, Args&&... args) - : init_(true), storage_(constexpr_forward(args)...) {} - - template >)> - explicit optional_base(in_place_t, std::initializer_list il, Args&&... args) - : init_(true), storage_(il, std::forward(args)...) {} - - ~optional_base() { if (init_) storage_.value_.T::~T(); } -}; - - -template -struct constexpr_optional_base -{ - bool init_; - constexpr_storage_t storage_; - - constexpr constexpr_optional_base() noexcept : init_(false), storage_(trivial_init) {}; - - explicit constexpr constexpr_optional_base(const T& v) : init_(true), storage_(v) {} - - explicit constexpr constexpr_optional_base(T&& v) : init_(true), storage_(constexpr_move(v)) {} - - template explicit constexpr constexpr_optional_base(in_place_t, Args&&... args) - : init_(true), storage_(constexpr_forward(args)...) {} - - template >)> - OPTIONAL_CONSTEXPR_INIT_LIST explicit constexpr_optional_base(in_place_t, std::initializer_list il, Args&&... args) - : init_(true), storage_(il, std::forward(args)...) {} - - ~constexpr_optional_base() = default; -}; - -template -using OptionalBase = typename std::conditional< - is_trivially_destructible::value, // if possible - constexpr_optional_base::type>, // use base with trivial destructor - optional_base::type> ->::type; - - - -template -class optional : private OptionalBase -{ - static_assert( !std::is_same::type, nullopt_t>::value, "bad T" ); - static_assert( !std::is_same::type, in_place_t>::value, "bad T" ); - - - constexpr bool initialized() const noexcept { return OptionalBase::init_; } - typename std::remove_const::type* dataptr() { return std::addressof(OptionalBase::storage_.value_); } - constexpr const T* dataptr() const { return detail_::static_addressof(OptionalBase::storage_.value_); } - -# if OPTIONAL_HAS_THIS_RVALUE_REFS == 1 - constexpr const T& contained_val() const& { return OptionalBase::storage_.value_; } -# if OPTIONAL_HAS_MOVE_ACCESSORS == 1 - OPTIONAL_MUTABLE_CONSTEXPR T&& contained_val() && { return std::move(OptionalBase::storage_.value_); } - OPTIONAL_MUTABLE_CONSTEXPR T& contained_val() & { return OptionalBase::storage_.value_; } -# else - T& contained_val() & { return OptionalBase::storage_.value_; } - T&& contained_val() && { return std::move(OptionalBase::storage_.value_); } -# endif -# else - constexpr const T& contained_val() const { return OptionalBase::storage_.value_; } - T& contained_val() { return OptionalBase::storage_.value_; } -# endif - - void clear() noexcept { - if (initialized()) dataptr()->T::~T(); - OptionalBase::init_ = false; - } - - template - void initialize(Args&&... args) noexcept(noexcept(T(std::forward(args)...))) - { - assert(!OptionalBase::init_); - ::new (static_cast(dataptr())) T(std::forward(args)...); - OptionalBase::init_ = true; - } - - template - void initialize(std::initializer_list il, Args&&... args) noexcept(noexcept(T(il, std::forward(args)...))) - { - assert(!OptionalBase::init_); - ::new (static_cast(dataptr())) T(il, std::forward(args)...); - OptionalBase::init_ = true; - } - -public: - typedef T value_type; - - // 20.5.5.1, constructors - constexpr optional() noexcept : OptionalBase() {}; - constexpr optional(nullopt_t) noexcept : OptionalBase() {}; - - optional(const optional& rhs) - : OptionalBase() - { - if (rhs.initialized()) { - ::new (static_cast(dataptr())) T(*rhs); - OptionalBase::init_ = true; - } - } - - optional(optional&& rhs) noexcept(is_nothrow_move_constructible::value) - : OptionalBase() - { - if (rhs.initialized()) { - ::new (static_cast(dataptr())) T(std::move(*rhs)); - OptionalBase::init_ = true; - } - } - - constexpr optional(const T& v) : OptionalBase(v) {} - - constexpr optional(T&& v) : OptionalBase(constexpr_move(v)) {} - - template - explicit constexpr optional(in_place_t, Args&&... args) - : OptionalBase(in_place_t{}, constexpr_forward(args)...) {} - - template >)> - OPTIONAL_CONSTEXPR_INIT_LIST explicit optional(in_place_t, std::initializer_list il, Args&&... args) - : OptionalBase(in_place_t{}, il, constexpr_forward(args)...) {} - - // 20.5.4.2, Destructor - ~optional() = default; - - // 20.5.4.3, assignment - optional& operator=(nullopt_t) noexcept - { - clear(); - return *this; - } - - optional& operator=(const optional& rhs) - { - if (initialized() == true && rhs.initialized() == false) clear(); - else if (initialized() == false && rhs.initialized() == true) initialize(*rhs); - else if (initialized() == true && rhs.initialized() == true) contained_val() = *rhs; - return *this; - } - - optional& operator=(optional&& rhs) - noexcept(is_nothrow_move_assignable::value && is_nothrow_move_constructible::value) - { - if (initialized() == true && rhs.initialized() == false) clear(); - else if (initialized() == false && rhs.initialized() == true) initialize(std::move(*rhs)); - else if (initialized() == true && rhs.initialized() == true) contained_val() = std::move(*rhs); - return *this; - } - - template - auto operator=(U&& v) - -> typename enable_if - < - is_same::type, T>::value, - optional& - >::type - { - if (initialized()) { contained_val() = std::forward(v); } - else { initialize(std::forward(v)); } - return *this; - } - - - template - void emplace(Args&&... args) - { - clear(); - initialize(std::forward(args)...); - } - - template - void emplace(initializer_list il, Args&&... args) - { - clear(); - initialize(il, std::forward(args)...); - } - - // 20.5.4.4, Swap - void swap(optional& rhs) noexcept(is_nothrow_move_constructible::value - && noexcept(detail_::swap_ns::adl_swap(declval(), declval()))) - { - if (initialized() == true && rhs.initialized() == false) { rhs.initialize(std::move(**this)); clear(); } - else if (initialized() == false && rhs.initialized() == true) { initialize(std::move(*rhs)); rhs.clear(); } - else if (initialized() == true && rhs.initialized() == true) { using std::swap; swap(**this, *rhs); } - } - - // 20.5.4.5, Observers - - explicit constexpr operator bool() const noexcept { return initialized(); } - constexpr bool has_value() const noexcept { return initialized(); } - - constexpr T const* operator ->() const { - return TR2_OPTIONAL_ASSERTED_EXPRESSION(initialized(), dataptr()); - } - -# if OPTIONAL_HAS_MOVE_ACCESSORS == 1 - - OPTIONAL_MUTABLE_CONSTEXPR T* operator ->() { - assert (initialized()); - return dataptr(); - } - - constexpr T const& operator *() const& { - return TR2_OPTIONAL_ASSERTED_EXPRESSION(initialized(), contained_val()); - } - - OPTIONAL_MUTABLE_CONSTEXPR T& operator *() & { - assert (initialized()); - return contained_val(); - } - - OPTIONAL_MUTABLE_CONSTEXPR T&& operator *() && { - assert (initialized()); - return constexpr_move(contained_val()); - } - - constexpr T const& value() const& { - return initialized() ? contained_val() : (throw bad_optional_access("bad optional access"), contained_val()); - } - - OPTIONAL_MUTABLE_CONSTEXPR T& value() & { - return initialized() ? contained_val() : (throw bad_optional_access("bad optional access"), contained_val()); - } - - OPTIONAL_MUTABLE_CONSTEXPR T&& value() && { - if (!initialized()) throw bad_optional_access("bad optional access"); - return std::move(contained_val()); - } - -# else - - T* operator ->() { - assert (initialized()); - return dataptr(); - } - - constexpr T const& operator *() const { - return TR2_OPTIONAL_ASSERTED_EXPRESSION(initialized(), contained_val()); - } - - T& operator *() { - assert (initialized()); - return contained_val(); - } - - constexpr T const& value() const { - return initialized() ? contained_val() : (throw bad_optional_access("bad optional access"), contained_val()); - } - - T& value() { - return initialized() ? contained_val() : (throw bad_optional_access("bad optional access"), contained_val()); - } - -# endif - -# if OPTIONAL_HAS_THIS_RVALUE_REFS == 1 - - template - constexpr T value_or(V&& v) const& - { - return *this ? **this : detail_::convert(constexpr_forward(v)); - } - -# if OPTIONAL_HAS_MOVE_ACCESSORS == 1 - - template - OPTIONAL_MUTABLE_CONSTEXPR T value_or(V&& v) && - { - return *this ? constexpr_move(const_cast&>(*this).contained_val()) : detail_::convert(constexpr_forward(v)); - } - -# else - - template - T value_or(V&& v) && - { - return *this ? constexpr_move(const_cast&>(*this).contained_val()) : detail_::convert(constexpr_forward(v)); - } - -# endif - -# else - - template - constexpr T value_or(V&& v) const - { - return *this ? **this : detail_::convert(constexpr_forward(v)); - } - -# endif - - // 20.6.3.6, modifiers - void reset() noexcept { clear(); } -}; - - -template -class optional -{ - static_assert( !std::is_same::value, "bad T" ); - static_assert( !std::is_same::value, "bad T" ); - T* ref; - -public: - - // 20.5.5.1, construction/destruction - constexpr optional() noexcept : ref(nullptr) {} - - constexpr optional(nullopt_t) noexcept : ref(nullptr) {} - - constexpr optional(T& v) noexcept : ref(detail_::static_addressof(v)) {} - - optional(T&&) = delete; - - constexpr optional(const optional& rhs) noexcept : ref(rhs.ref) {} - - explicit constexpr optional(in_place_t, T& v) noexcept : ref(detail_::static_addressof(v)) {} - - explicit optional(in_place_t, T&&) = delete; - - ~optional() = default; - - // 20.5.5.2, mutation - optional& operator=(nullopt_t) noexcept { - ref = nullptr; - return *this; - } - - // optional& operator=(const optional& rhs) noexcept { - // ref = rhs.ref; - // return *this; - // } - - // optional& operator=(optional&& rhs) noexcept { - // ref = rhs.ref; - // return *this; - // } - - template - auto operator=(U&& rhs) noexcept - -> typename enable_if - < - is_same::type, optional>::value, - optional& - >::type - { - ref = rhs.ref; - return *this; - } - - template - auto operator=(U&& rhs) noexcept - -> typename enable_if - < - !is_same::type, optional>::value, - optional& - >::type - = delete; - - void emplace(T& v) noexcept { - ref = detail_::static_addressof(v); - } - - void emplace(T&&) = delete; - - - void swap(optional& rhs) noexcept - { - std::swap(ref, rhs.ref); - } - - // 20.5.5.3, observers - constexpr T* operator->() const { - return TR2_OPTIONAL_ASSERTED_EXPRESSION(ref, ref); - } - - constexpr T& operator*() const { - return TR2_OPTIONAL_ASSERTED_EXPRESSION(ref, *ref); - } - - constexpr T& value() const { - return ref ? *ref : (throw bad_optional_access("bad optional access"), *ref); - } - - explicit constexpr operator bool() const noexcept { - return ref != nullptr; - } - - constexpr bool has_value() const noexcept { - return ref != nullptr; - } - - template - constexpr typename decay::type value_or(V&& v) const - { - return *this ? **this : detail_::convert::type>(constexpr_forward(v)); - } - - // x.x.x.x, modifiers - void reset() noexcept { ref = nullptr; } -}; - - -template -class optional -{ - static_assert( sizeof(T) == 0, "optional rvalue references disallowed" ); -}; - - -// 20.5.8, Relational operators -template constexpr bool operator==(const optional& x, const optional& y) -{ - return bool(x) != bool(y) ? false : bool(x) == false ? true : *x == *y; -} - -template constexpr bool operator!=(const optional& x, const optional& y) -{ - return !(x == y); -} - -template constexpr bool operator<(const optional& x, const optional& y) -{ - return (!y) ? false : (!x) ? true : *x < *y; -} - -template constexpr bool operator>(const optional& x, const optional& y) -{ - return (y < x); -} - -template constexpr bool operator<=(const optional& x, const optional& y) -{ - return !(y < x); -} - -template constexpr bool operator>=(const optional& x, const optional& y) -{ - return !(x < y); -} - - -// 20.5.9, Comparison with nullopt -template constexpr bool operator==(const optional& x, nullopt_t) noexcept -{ - return (!x); -} - -template constexpr bool operator==(nullopt_t, const optional& x) noexcept -{ - return (!x); -} - -template constexpr bool operator!=(const optional& x, nullopt_t) noexcept -{ - return bool(x); -} - -template constexpr bool operator!=(nullopt_t, const optional& x) noexcept -{ - return bool(x); -} - -template constexpr bool operator<(const optional&, nullopt_t) noexcept -{ - return false; -} - -template constexpr bool operator<(nullopt_t, const optional& x) noexcept -{ - return bool(x); -} - -template constexpr bool operator<=(const optional& x, nullopt_t) noexcept -{ - return (!x); -} - -template constexpr bool operator<=(nullopt_t, const optional&) noexcept -{ - return true; -} - -template constexpr bool operator>(const optional& x, nullopt_t) noexcept -{ - return bool(x); -} - -template constexpr bool operator>(nullopt_t, const optional&) noexcept -{ - return false; -} - -template constexpr bool operator>=(const optional&, nullopt_t) noexcept -{ - return true; -} - -template constexpr bool operator>=(nullopt_t, const optional& x) noexcept -{ - return (!x); -} - - - -// 20.5.10, Comparison with T -template constexpr bool operator==(const optional& x, const T& v) -{ - return bool(x) ? *x == v : false; -} - -template constexpr bool operator==(const T& v, const optional& x) -{ - return bool(x) ? v == *x : false; -} - -template constexpr bool operator!=(const optional& x, const T& v) -{ - return bool(x) ? *x != v : true; -} - -template constexpr bool operator!=(const T& v, const optional& x) -{ - return bool(x) ? v != *x : true; -} - -template constexpr bool operator<(const optional& x, const T& v) -{ - return bool(x) ? *x < v : true; -} - -template constexpr bool operator>(const T& v, const optional& x) -{ - return bool(x) ? v > *x : true; -} - -template constexpr bool operator>(const optional& x, const T& v) -{ - return bool(x) ? *x > v : false; -} - -template constexpr bool operator<(const T& v, const optional& x) -{ - return bool(x) ? v < *x : false; -} - -template constexpr bool operator>=(const optional& x, const T& v) -{ - return bool(x) ? *x >= v : false; -} - -template constexpr bool operator<=(const T& v, const optional& x) -{ - return bool(x) ? v <= *x : false; -} - -template constexpr bool operator<=(const optional& x, const T& v) -{ - return bool(x) ? *x <= v : true; -} - -template constexpr bool operator>=(const T& v, const optional& x) -{ - return bool(x) ? v >= *x : true; -} - - -// Comparison of optional with T -template constexpr bool operator==(const optional& x, const T& v) -{ - return bool(x) ? *x == v : false; -} - -template constexpr bool operator==(const T& v, const optional& x) -{ - return bool(x) ? v == *x : false; -} - -template constexpr bool operator!=(const optional& x, const T& v) -{ - return bool(x) ? *x != v : true; -} - -template constexpr bool operator!=(const T& v, const optional& x) -{ - return bool(x) ? v != *x : true; -} - -template constexpr bool operator<(const optional& x, const T& v) -{ - return bool(x) ? *x < v : true; -} - -template constexpr bool operator>(const T& v, const optional& x) -{ - return bool(x) ? v > *x : true; -} - -template constexpr bool operator>(const optional& x, const T& v) -{ - return bool(x) ? *x > v : false; -} - -template constexpr bool operator<(const T& v, const optional& x) -{ - return bool(x) ? v < *x : false; -} - -template constexpr bool operator>=(const optional& x, const T& v) -{ - return bool(x) ? *x >= v : false; -} - -template constexpr bool operator<=(const T& v, const optional& x) -{ - return bool(x) ? v <= *x : false; -} - -template constexpr bool operator<=(const optional& x, const T& v) -{ - return bool(x) ? *x <= v : true; -} - -template constexpr bool operator>=(const T& v, const optional& x) -{ - return bool(x) ? v >= *x : true; -} - -// Comparison of optional with T -template constexpr bool operator==(const optional& x, const T& v) -{ - return bool(x) ? *x == v : false; -} - -template constexpr bool operator==(const T& v, const optional& x) -{ - return bool(x) ? v == *x : false; -} - -template constexpr bool operator!=(const optional& x, const T& v) -{ - return bool(x) ? *x != v : true; -} - -template constexpr bool operator!=(const T& v, const optional& x) -{ - return bool(x) ? v != *x : true; -} - -template constexpr bool operator<(const optional& x, const T& v) -{ - return bool(x) ? *x < v : true; -} - -template constexpr bool operator>(const T& v, const optional& x) -{ - return bool(x) ? v > *x : true; -} - -template constexpr bool operator>(const optional& x, const T& v) -{ - return bool(x) ? *x > v : false; -} - -template constexpr bool operator<(const T& v, const optional& x) -{ - return bool(x) ? v < *x : false; -} - -template constexpr bool operator>=(const optional& x, const T& v) -{ - return bool(x) ? *x >= v : false; -} - -template constexpr bool operator<=(const T& v, const optional& x) -{ - return bool(x) ? v <= *x : false; -} - -template constexpr bool operator<=(const optional& x, const T& v) -{ - return bool(x) ? *x <= v : true; -} - -template constexpr bool operator>=(const T& v, const optional& x) -{ - return bool(x) ? v >= *x : true; -} - - -// 20.5.12, Specialized algorithms -template -void swap(optional& x, optional& y) noexcept(noexcept(x.swap(y))) -{ - x.swap(y); -} - - -template -constexpr optional::type> make_optional(T&& v) -{ - return optional::type>(constexpr_forward(v)); -} - -template -constexpr optional make_optional(reference_wrapper v) -{ - return optional(v.get()); -} - - -} // namespace experimental -} // namespace std - -namespace std -{ - template - struct hash> - { - typedef typename hash::result_type result_type; - typedef std::experimental::optional argument_type; - - constexpr result_type operator()(argument_type const& arg) const { - return arg ? std::hash{}(*arg) : result_type{}; - } - }; - - template - struct hash> - { - typedef typename hash::result_type result_type; - typedef std::experimental::optional argument_type; - - constexpr result_type operator()(argument_type const& arg) const { - return arg ? std::hash{}(*arg) : result_type{}; - } - }; -} - -# undef TR2_OPTIONAL_REQUIRES -# undef TR2_OPTIONAL_ASSERTED_EXPRESSION - -# endif //___OPTIONAL_HPP___ diff --git a/src/3rdparty/optional/ottd_optional.h b/src/3rdparty/optional/ottd_optional.h deleted file mode 100644 index 19b44c5055..0000000000 --- a/src/3rdparty/optional/ottd_optional.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * 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 ottd_optional.h Header to select between native. */ - -#ifndef OTTD_OPTIONAL_H -#define OTTD_OPTIONAL_H - -#if defined(__has_include) -# if __has_include() -# include -# endif -#endif - -#if (__cplusplus >= 201703L) || (defined(__cpp_lib_optional) && __cpp_lib_optional >= 201606L) - -/* Native std::optional. */ -#include -namespace opt = std; - -#else - -/* No std::optional, use local copy instead. */ -#include "optional.hpp" -namespace opt = std::experimental; - -#endif - -#endif /* OTTD_OPTIONAL_H */ diff --git a/src/ini_type.h b/src/ini_type.h index f98b6395b9..b5f8398d97 100644 --- a/src/ini_type.h +++ b/src/ini_type.h @@ -12,7 +12,7 @@ #include "fileio_type.h" #include -#include "3rdparty/optional/ottd_optional.h" +#include /** Types of groups */ enum IniGroupType { @@ -25,7 +25,7 @@ enum IniGroupType { struct IniItem { IniItem *next; ///< The next item in this group std::string name; ///< The name of this item - opt::optional value; ///< The value of this item + std::optional value; ///< The value of this item std::string comment; ///< The comment associated with this item IniItem(struct IniGroup *parent, const std::string &name); From cc1679e3171bf6982164c4072a773fdd687ea885 Mon Sep 17 00:00:00 2001 From: frosch Date: Mon, 14 Dec 2020 22:25:07 +0100 Subject: [PATCH 07/20] Codechange: Apple LLVM fails to implement std::optional::value() also on pretty recent version. Use operator* instead. --- src/base_media_func.h | 6 +++--- src/gfxinit.cpp | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/base_media_func.h b/src/base_media_func.h index 02c445c21a..c5e2a6da23 100644 --- a/src/base_media_func.h +++ b/src/base_media_func.h @@ -55,15 +55,15 @@ bool BaseSet::FillSetDetails(IniFile *ini, const } fetch_metadata("shortname"); - for (uint i = 0; item->value.value()[i] != '\0' && i < 4; i++) { - this->shortname |= ((uint8)item->value.value()[i]) << (i * 8); + for (uint i = 0; (*item->value)[i] != '\0' && i < 4; i++) { + this->shortname |= ((uint8)(*item->value)[i]) << (i * 8); } fetch_metadata("version"); this->version = atoi(item->value->c_str()); item = metadata->GetItem("fallback", false); - this->fallback = (item != nullptr && item->value && item->value.value() != "0" && item->value.value() != "false"); + this->fallback = (item != nullptr && item->value && *item->value != "0" && *item->value != "false"); /* For each of the file types we want to find the file, MD5 checksums and warning messages. */ IniGroup *files = ini->GetGroup("files"); diff --git a/src/gfxinit.cpp b/src/gfxinit.cpp index d1d05f4bd0..95c9540959 100644 --- a/src/gfxinit.cpp +++ b/src/gfxinit.cpp @@ -357,11 +357,11 @@ bool GraphicsSet::FillSetDetails(IniFile *ini, const char *path, const char *ful IniItem *item; fetch_metadata("palette"); - this->palette = (item->value.value()[0] == 'D' || item->value.value()[0] == 'd') ? PAL_DOS : PAL_WINDOWS; + this->palette = ((*item->value)[0] == 'D' || (*item->value)[0] == 'd') ? PAL_DOS : PAL_WINDOWS; /* Get optional blitter information. */ item = metadata->GetItem("blitter", false); - this->blitter = (item != nullptr && item->value.value()[0] == '3') ? BLT_32BPP : BLT_8BPP; + this->blitter = (item != nullptr && (*item->value)[0] == '3') ? BLT_32BPP : BLT_8BPP; } return ret; } From 79240eab1ee4abb2882a40c7ac18e4915b4dc820 Mon Sep 17 00:00:00 2001 From: Michael Lutz Date: Tue, 15 Dec 2020 00:22:04 +0100 Subject: [PATCH 08/20] Codechange: Make use of the improved C++17 emplace_back function. --- src/bridge_gui.cpp | 3 +-- src/core/smallmap_type.hpp | 3 +-- src/engine.cpp | 3 +-- src/fios.h | 3 +-- src/industry_gui.cpp | 12 ++++-------- src/newgrf.cpp | 6 ++---- src/newgrf_commons.cpp | 6 ++---- src/saveload/afterload.cpp | 3 +-- src/saveload/engine_sl.cpp | 3 +-- src/saveload/waypoint_sl.cpp | 3 +-- src/settingsgen/settingsgen.cpp | 3 +-- src/stringfilter.cpp | 3 +-- src/tunnelbridge_cmd.cpp | 3 +-- src/viewport.cpp | 12 ++++-------- 14 files changed, 22 insertions(+), 44 deletions(-) diff --git a/src/bridge_gui.cpp b/src/bridge_gui.cpp index 44cc99ba3e..a69ed74489 100644 --- a/src/bridge_gui.cpp +++ b/src/bridge_gui.cpp @@ -433,8 +433,7 @@ void ShowBuildBridgeWindow(TileIndex start, TileIndex end, TransportType transpo type_check = CheckBridgeAvailability(brd_type, bridge_len); if (type_check.Succeeded()) { /* bridge is accepted, add to list */ - /*C++17: BuildBridgeData &item = */ bl->emplace_back(); - BuildBridgeData &item = bl->back(); + BuildBridgeData &item = bl->emplace_back(); item.index = brd_type; item.spec = GetBridgeSpec(brd_type); /* Add to terraforming & bulldozing costs the cost of the diff --git a/src/core/smallmap_type.hpp b/src/core/smallmap_type.hpp index 931a4848b3..744f9fd265 100644 --- a/src/core/smallmap_type.hpp +++ b/src/core/smallmap_type.hpp @@ -142,8 +142,7 @@ struct SmallMap : std::vector > { for (uint i = 0; i < std::vector::size(); i++) { if (key == std::vector::operator[](i).first) return std::vector::operator[](i).second; } - /*C++17: Pair &n = */ std::vector::emplace_back(); - Pair &n = std::vector::back(); + Pair &n = std::vector::emplace_back(); n.first = key; return n.second; } diff --git a/src/engine.cpp b/src/engine.cpp index 41849b8a21..311a936ed4 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -486,8 +486,7 @@ void EngineOverrideManager::ResetToDefaultMapping() this->clear(); for (VehicleType type = VEH_TRAIN; type <= VEH_AIRCRAFT; type++) { for (uint internal_id = 0; internal_id < _engine_counts[type]; internal_id++) { - /*C++17: EngineIDMapping &eid = */ this->emplace_back(); - EngineIDMapping &eid = this->back(); + EngineIDMapping &eid = this->emplace_back(); eid.type = type; eid.grfid = INVALID_GRFID; eid.internal_id = internal_id; diff --git a/src/fios.h b/src/fios.h index 6a7b6bf01f..259e493b24 100644 --- a/src/fios.h +++ b/src/fios.h @@ -119,8 +119,7 @@ public: */ inline FiosItem *Append() { - /*C++17: return &*/ this->files.emplace_back(); - return &this->files.back(); + return &this->files.emplace_back(); } /** diff --git a/src/industry_gui.cpp b/src/industry_gui.cpp index e54b1b2a4b..caa18c8e3e 100644 --- a/src/industry_gui.cpp +++ b/src/industry_gui.cpp @@ -2625,8 +2625,7 @@ struct IndustryCargoesWindow : public Window { _displayed_industries.set(it); this->fields.clear(); - /*C++17: CargoesRow &row = */ this->fields.emplace_back(); - CargoesRow &row = this->fields.back(); + CargoesRow &row = this->fields.emplace_back(); row.columns[0].MakeHeader(STR_INDUSTRY_CARGOES_PRODUCERS); row.columns[1].MakeEmpty(CFT_SMALL_EMPTY); row.columns[2].MakeEmpty(CFT_SMALL_EMPTY); @@ -2641,8 +2640,7 @@ struct IndustryCargoesWindow : public Window { int num_cust = CountMatchingAcceptingIndustries(central_sp->produced_cargo, lengthof(central_sp->produced_cargo)) + houses_accept; int num_indrows = max(3, max(num_supp, num_cust)); // One is needed for the 'it' industry, and 2 for the cargo labels. for (int i = 0; i < num_indrows; i++) { - /*C++17: CargoesRow &row = */ this->fields.emplace_back(); - CargoesRow &row = this->fields.back(); + CargoesRow &row = this->fields.emplace_back(); row.columns[0].MakeEmpty(CFT_EMPTY); row.columns[1].MakeCargo(central_sp->accepts_cargo, lengthof(central_sp->accepts_cargo)); row.columns[2].MakeEmpty(CFT_EMPTY); @@ -2705,8 +2703,7 @@ struct IndustryCargoesWindow : public Window { _displayed_industries.reset(); this->fields.clear(); - /*C++17: CargoesRow &row = */ this->fields.emplace_back(); - CargoesRow &row = this->fields.back(); + CargoesRow &row = this->fields.emplace_back(); row.columns[0].MakeHeader(STR_INDUSTRY_CARGOES_PRODUCERS); row.columns[1].MakeEmpty(CFT_SMALL_EMPTY); row.columns[2].MakeHeader(STR_INDUSTRY_CARGOES_CUSTOMERS); @@ -2719,8 +2716,7 @@ struct IndustryCargoesWindow : public Window { int num_cust = CountMatchingAcceptingIndustries(&cid, 1) + houses_accept; int num_indrows = max(num_supp, num_cust); for (int i = 0; i < num_indrows; i++) { - /*C++17: CargoesRow &row = */ this->fields.emplace_back(); - CargoesRow &row = this->fields.back(); + CargoesRow &row = this->fields.emplace_back(); row.columns[0].MakeEmpty(CFT_EMPTY); row.columns[1].MakeCargo(&cid, 1); row.columns[2].MakeEmpty(CFT_EMPTY); diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 4abbcb3b72..21dc9ffb4e 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -1916,8 +1916,7 @@ static ChangeInfoResult StationChangeInfo(uint stid, int numinfo, int prop, Byte tmp_layout.clear(); for (;;) { /* no relative bounding box support */ - /*C++17: DrawTileSeqStruct &dtss = */ tmp_layout.emplace_back(); - DrawTileSeqStruct &dtss = tmp_layout.back(); + DrawTileSeqStruct &dtss = tmp_layout.emplace_back(); MemSetT(&dtss, 0); dtss.delta_x = buf->ReadByte(); @@ -5020,8 +5019,7 @@ static void NewSpriteGroup(ByteReader *buf) /* Loop through the var adjusts. Unfortunately we don't know how many we have * from the outset, so we shall have to keep reallocing. */ do { - /*C++17: DeterministicSpriteGroupAdjust &adjust = */ adjusts.emplace_back(); - DeterministicSpriteGroupAdjust &adjust = adjusts.back(); + DeterministicSpriteGroupAdjust &adjust = adjusts.emplace_back(); /* The first var adjust doesn't have an operation specified, so we set it to add. */ adjust.operation = adjusts.size() == 1 ? DSGA_OP_ADD : (DeterministicSpriteGroupAdjustOperation)buf->ReadByte(); diff --git a/src/newgrf_commons.cpp b/src/newgrf_commons.cpp index 8209d675cd..64eed8139a 100644 --- a/src/newgrf_commons.cpp +++ b/src/newgrf_commons.cpp @@ -664,8 +664,7 @@ uint32 NewGRFSpriteLayout::PrepareLayout(uint32 orig_offset, uint32 newgrf_groun /* Create a copy of the spritelayout, so we can modify some values. * Also include the groundsprite into the sequence for easier processing. */ - /*C++17: DrawTileSeqStruct *result = &*/ result_seq.emplace_back(); - DrawTileSeqStruct *result = &result_seq.back(); + DrawTileSeqStruct *result = &result_seq.emplace_back(); result->image = ground; result->delta_x = 0; result->delta_y = 0; @@ -675,8 +674,7 @@ uint32 NewGRFSpriteLayout::PrepareLayout(uint32 orig_offset, uint32 newgrf_groun foreach_draw_tile_seq(dtss, this->seq) { result_seq.push_back(*dtss); } - result_seq.emplace_back() /*C++17: .MakeTerminator()*/; - result_seq.back().MakeTerminator(); + result_seq.emplace_back().MakeTerminator(); /* Determine the var10 values the action-1-2-3 chains needs to be resolved for, * and apply the default sprite offsets (unless disabled). */ const TileLayoutRegisters *regs = this->registers; diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 163ded73cd..7d1e70212a 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -2924,8 +2924,7 @@ bool AfterLoadGame() cur_skip = prev_tile_skip; } - /*C++17: uint &this_skip = */ skip_frames.push_back(prev_tile_skip); - uint &this_skip = skip_frames.back(); + uint &this_skip = skip_frames.emplace_back(prev_tile_skip); /* The following 3 curves now take longer than before */ switch (u->state) { diff --git a/src/saveload/engine_sl.cpp b/src/saveload/engine_sl.cpp index 863aabff07..b0b9d02d4d 100644 --- a/src/saveload/engine_sl.cpp +++ b/src/saveload/engine_sl.cpp @@ -191,8 +191,7 @@ static void Load_EIDS() _engine_mngr.clear(); while (SlIterateArray() != -1) { - /*C++17: EngineIDMapping *eid = &*/ _engine_mngr.emplace_back(); - EngineIDMapping *eid = &_engine_mngr.back(); + EngineIDMapping *eid = &_engine_mngr.emplace_back(); SlObject(eid, _engine_id_mapping_desc); } } diff --git a/src/saveload/waypoint_sl.cpp b/src/saveload/waypoint_sl.cpp index 4117a591ee..663c61f6a8 100644 --- a/src/saveload/waypoint_sl.cpp +++ b/src/saveload/waypoint_sl.cpp @@ -192,8 +192,7 @@ static void Load_WAYP() int index; while ((index = SlIterateArray()) != -1) { - /*C++17: OldWaypoint *wp = &*/ _old_waypoints.emplace_back(); - OldWaypoint *wp = &_old_waypoints.back(); + OldWaypoint *wp = &_old_waypoints.emplace_back(); wp->index = index; SlObject(wp, _old_waypoint_desc); diff --git a/src/settingsgen/settingsgen.cpp b/src/settingsgen/settingsgen.cpp index 764f370bde..b2a3c76f64 100644 --- a/src/settingsgen/settingsgen.cpp +++ b/src/settingsgen/settingsgen.cpp @@ -118,8 +118,7 @@ public: text += stored_size; } while (length > 0) { - /*C++17: OutputBuffer &block =*/ this->output_buffer.emplace_back(); - OutputBuffer &block = this->output_buffer.back(); + OutputBuffer &block = this->output_buffer.emplace_back(); block.Clear(); // Initialize the new block. size_t stored_size = block.Add(text, length); length -= stored_size; diff --git a/src/stringfilter.cpp b/src/stringfilter.cpp index 30876a82d8..4765a880e1 100644 --- a/src/stringfilter.cpp +++ b/src/stringfilter.cpp @@ -74,8 +74,7 @@ void StringFilter::SetFilterTerm(const char *str) /* Add to word */ if (word == nullptr) { - /*C++17: word = &*/ this->word_index.push_back({dest, false}); - word = &this->word_index.back(); + word = &this->word_index.emplace_back(WordState{ dest, false }); } memcpy(dest, pos, len); diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index 1a66d530f0..47bb34f194 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -710,8 +710,7 @@ CommandCost CmdBuildTunnel(TileIndex start_tile, DoCommandFlag flags, uint32 p1, * Do this for all tiles (like trees), not only objects. */ ClearedObjectArea *coa = FindClearedObject(end_tile); if (coa == nullptr) { - /*C++17: coa = &*/ _cleared_object_areas.push_back({end_tile, TileArea(end_tile, 1, 1)}); - coa = &_cleared_object_areas.back(); + coa = &_cleared_object_areas.emplace_back(ClearedObjectArea{ end_tile, TileArea(end_tile, 1, 1) }); } /* Hide the tile from the terraforming command */ diff --git a/src/viewport.cpp b/src/viewport.cpp index e28a2e606e..bf1f34acd6 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -498,8 +498,7 @@ static void AddTileSpriteToDraw(SpriteID image, PaletteID pal, int32 x, int32 y, { assert((image & SPRITE_MASK) < MAX_SPRITES); - /*C++17: TileSpriteToDraw &ts = */ _vd.tile_sprites_to_draw.emplace_back(); - TileSpriteToDraw &ts = _vd.tile_sprites_to_draw.back(); + TileSpriteToDraw &ts = _vd.tile_sprites_to_draw.emplace_back(); ts.image = image; ts.pal = pal; ts.sub = sub; @@ -708,8 +707,7 @@ void AddSortableSpriteToDraw(SpriteID image, PaletteID pal, int x, int y, int w, return; } - /*C++17: ParentSpriteToDraw &ps = */ _vd.parent_sprites_to_draw.emplace_back(); - ParentSpriteToDraw &ps = _vd.parent_sprites_to_draw.back(); + ParentSpriteToDraw &ps = _vd.parent_sprites_to_draw.emplace_back(); ps.x = tmp_x; ps.y = tmp_y; @@ -827,8 +825,7 @@ void AddChildSpriteScreen(SpriteID image, PaletteID pal, int x, int y, bool tran *_vd.last_child = (uint)_vd.child_screen_sprites_to_draw.size(); - /*C++17: ChildScreenSpriteToDraw &cs = */ _vd.child_screen_sprites_to_draw.emplace_back(); - ChildScreenSpriteToDraw &cs = _vd.child_screen_sprites_to_draw.back(); + ChildScreenSpriteToDraw &cs = _vd.child_screen_sprites_to_draw.emplace_back(); cs.image = image; cs.pal = pal; cs.sub = sub; @@ -847,8 +844,7 @@ void AddChildSpriteScreen(SpriteID image, PaletteID pal, int x, int y, bool tran static void AddStringToDraw(int x, int y, StringID string, uint64 params_1, uint64 params_2, Colours colour, uint16 width) { assert(width != 0); - /*C++17: StringSpriteToDraw &ss = */ _vd.string_sprites_to_draw.emplace_back(); - StringSpriteToDraw &ss = _vd.string_sprites_to_draw.back(); + StringSpriteToDraw &ss = _vd.string_sprites_to_draw.emplace_back(); ss.string = string; ss.x = x; ss.y = y; From b1cf79da5b2c9b3a920d8489513f6995cc53e48c Mon Sep 17 00:00:00 2001 From: jostephd Date: Mon, 14 Dec 2020 23:39:57 +0000 Subject: [PATCH 09/20] Feature: new velocity unit "tiles/day" (#8278) --- src/lang/english.txt | 2 ++ src/strings.cpp | 31 +++++++++++++++++-------------- src/table/gameopt_settings.ini | 2 +- src/table/settings.ini | 2 +- 4 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/lang/english.txt b/src/lang/english.txt index 142cc83f97..b8756049d2 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -194,6 +194,7 @@ STR_COLOUR_DEFAULT :Default STR_UNITS_VELOCITY_IMPERIAL :{COMMA}{NBSP}mph STR_UNITS_VELOCITY_METRIC :{COMMA}{NBSP}km/h STR_UNITS_VELOCITY_SI :{COMMA}{NBSP}m/s +STR_UNITS_VELOCITY_GAMEUNITS :{DECIMAL}{NBSP}tiles/day STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}hp STR_UNITS_POWER_METRIC :{COMMA}{NBSP}hp @@ -1678,6 +1679,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Whenever a spee STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :Imperial (mph) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :Metric (km/h) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :SI (m/s) +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS :Game units (tiles/day) STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Vehicle power units: {STRING2} STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :Whenever a vehicle's power is shown in the user interface, show it in the selected units diff --git a/src/strings.cpp b/src/strings.cpp index f7ef999859..c2edf8e171 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -665,6 +665,7 @@ struct UnitConversion { struct Units { UnitConversion c; ///< Conversion StringID s; ///< String for the unit + unsigned int decimal_places; ///< Number of decimal places embedded in the value. For example, 1 if the value is in tenths, and 3 if the value is in thousandths. }; /** Information about a specific unit system with a long variant. */ @@ -676,16 +677,17 @@ struct UnitsLong { /** Unit conversions for velocity. */ static const Units _units_velocity[] = { - { { 1, 0}, STR_UNITS_VELOCITY_IMPERIAL }, - { { 103, 6}, STR_UNITS_VELOCITY_METRIC }, - { {1831, 12}, STR_UNITS_VELOCITY_SI }, + { { 1, 0}, STR_UNITS_VELOCITY_IMPERIAL, 0 }, + { { 103, 6}, STR_UNITS_VELOCITY_METRIC, 0 }, + { { 1831, 12}, STR_UNITS_VELOCITY_SI, 0 }, + { {37888, 16}, STR_UNITS_VELOCITY_GAMEUNITS, 1 }, }; /** Unit conversions for velocity. */ static const Units _units_power[] = { - { { 1, 0}, STR_UNITS_POWER_IMPERIAL }, - { {4153, 12}, STR_UNITS_POWER_METRIC }, - { {6109, 13}, STR_UNITS_POWER_SI }, + { { 1, 0}, STR_UNITS_POWER_IMPERIAL, 0 }, + { {4153, 12}, STR_UNITS_POWER_METRIC, 0 }, + { {6109, 13}, STR_UNITS_POWER_SI, 0 }, }; /** Unit conversions for weight. */ @@ -704,16 +706,16 @@ static const UnitsLong _units_volume[] = { /** Unit conversions for force. */ static const Units _units_force[] = { - { {3597, 4}, STR_UNITS_FORCE_IMPERIAL }, - { {3263, 5}, STR_UNITS_FORCE_METRIC }, - { { 1, 0}, STR_UNITS_FORCE_SI }, + { {3597, 4}, STR_UNITS_FORCE_IMPERIAL, 0 }, + { {3263, 5}, STR_UNITS_FORCE_METRIC, 0 }, + { { 1, 0}, STR_UNITS_FORCE_SI, 0 }, }; /** Unit conversions for height. */ static const Units _units_height[] = { - { { 3, 0}, STR_UNITS_HEIGHT_IMPERIAL }, // "Wrong" conversion factor for more nicer GUI values - { { 1, 0}, STR_UNITS_HEIGHT_METRIC }, - { { 1, 0}, STR_UNITS_HEIGHT_SI }, + { { 3, 0}, STR_UNITS_HEIGHT_IMPERIAL, 0 }, // "Wrong" conversion factor for more nicer GUI values + { { 1, 0}, STR_UNITS_HEIGHT_METRIC, 0 }, + { { 1, 0}, STR_UNITS_HEIGHT_SI, 0 }, }; /** @@ -1228,8 +1230,9 @@ static char *FormatString(char *buff, const char *str_arg, StringParameters *arg case SCC_VELOCITY: { // {VELOCITY} assert(_settings_game.locale.units_velocity < lengthof(_units_velocity)); - int64 args_array[] = {ConvertKmhishSpeedToDisplaySpeed(args->GetInt64(SCC_VELOCITY))}; - StringParameters tmp_params(args_array); + unsigned int decimal_places = _units_velocity[_settings_game.locale.units_velocity].decimal_places; + uint64 args_array[] = {ConvertKmhishSpeedToDisplaySpeed(args->GetInt64(SCC_VELOCITY)), decimal_places}; + StringParameters tmp_params(args_array, decimal_places ? 2 : 1, nullptr); buff = FormatString(buff, GetStringPtr(_units_velocity[_settings_game.locale.units_velocity].s), &tmp_params, last); break; } diff --git a/src/table/gameopt_settings.ini b/src/table/gameopt_settings.ini index d1634e349d..08253be93c 100644 --- a/src/table/gameopt_settings.ini +++ b/src/table/gameopt_settings.ini @@ -13,7 +13,7 @@ uint8 _old_units; ///< Old units from old s /* Most of these strings are used both for gameopt-backward compatibility * and the settings tables. The rest is here for consistency. */ static const char *_locale_currencies = "GBP|USD|EUR|YEN|ATS|BEF|CHF|CZK|DEM|DKK|ESP|FIM|FRF|GRD|HUF|ISK|ITL|NLG|NOK|PLN|RON|RUR|SIT|SEK|YTL|SKK|BRL|EEK|custom"; -static const char *_locale_units = "imperial|metric|si"; +static const char *_locale_units = "imperial|metric|si|gameunits"; static const char *_town_names = "english|french|german|american|latin|silly|swedish|dutch|finnish|polish|slovak|norwegian|hungarian|austrian|romanian|czech|swiss|danish|turkish|italian|catalan"; static const char *_climates = "temperate|arctic|tropic|toyland"; static const char *_autosave_interval = "off|monthly|quarterly|half year|yearly"; diff --git a/src/table/settings.ini b/src/table/settings.ini index bba7d61e82..b578d462b5 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -2475,7 +2475,7 @@ from = SLV_184 flags = SLF_NO_NETWORK_SYNC guiflags = SGF_MULTISTRING def = 1 -max = 2 +max = 3 full = _locale_units proc = RedrawScreen cat = SC_BASIC From 8c42f3a8d4a93fc2c613fa76b6ea9eb7dc277af1 Mon Sep 17 00:00:00 2001 From: translators Date: Mon, 14 Dec 2020 23:45:41 +0000 Subject: [PATCH 10/20] Update: Translations from eints french: 1 change by glx22 --- src/lang/afrikaans.txt | 2 -- src/lang/arabic_egypt.txt | 1 - src/lang/basque.txt | 2 -- src/lang/belarusian.txt | 2 -- src/lang/brazilian_portuguese.txt | 2 -- src/lang/bulgarian.txt | 2 -- src/lang/catalan.txt | 2 -- src/lang/croatian.txt | 2 -- src/lang/czech.txt | 2 -- src/lang/danish.txt | 2 -- src/lang/dutch.txt | 2 -- src/lang/english_AU.txt | 2 -- src/lang/english_US.txt | 2 -- src/lang/esperanto.txt | 1 - src/lang/estonian.txt | 2 -- src/lang/faroese.txt | 2 -- src/lang/finnish.txt | 2 -- src/lang/french.txt | 3 +-- src/lang/gaelic.txt | 2 -- src/lang/galician.txt | 2 -- src/lang/german.txt | 2 -- src/lang/greek.txt | 2 -- src/lang/hebrew.txt | 2 -- src/lang/hungarian.txt | 2 -- src/lang/icelandic.txt | 2 -- src/lang/indonesian.txt | 2 -- src/lang/irish.txt | 2 -- src/lang/italian.txt | 2 -- src/lang/japanese.txt | 2 -- src/lang/korean.txt | 2 -- src/lang/latin.txt | 2 -- src/lang/latvian.txt | 2 -- src/lang/lithuanian.txt | 2 -- src/lang/luxembourgish.txt | 2 -- src/lang/malay.txt | 1 - src/lang/norwegian_bokmal.txt | 2 -- src/lang/norwegian_nynorsk.txt | 1 - src/lang/polish.txt | 2 -- src/lang/portuguese.txt | 2 -- src/lang/romanian.txt | 2 -- src/lang/russian.txt | 2 -- src/lang/serbian.txt | 2 -- src/lang/simplified_chinese.txt | 2 -- src/lang/slovak.txt | 2 -- src/lang/slovenian.txt | 2 -- src/lang/spanish.txt | 2 -- src/lang/spanish_MX.txt | 2 -- src/lang/swedish.txt | 2 -- src/lang/tamil.txt | 1 - src/lang/thai.txt | 2 -- src/lang/traditional_chinese.txt | 2 -- src/lang/turkish.txt | 2 -- src/lang/ukrainian.txt | 2 -- src/lang/unfinished/frisian.txt | 1 - src/lang/unfinished/persian.txt | 1 - src/lang/unfinished/urdu.txt | 1 - src/lang/vietnamese.txt | 2 -- src/lang/welsh.txt | 2 -- 58 files changed, 1 insertion(+), 108 deletions(-) diff --git a/src/lang/afrikaans.txt b/src/lang/afrikaans.txt index 215c4dfcba..abb65269a5 100644 --- a/src/lang/afrikaans.txt +++ b/src/lang/afrikaans.txt @@ -1545,8 +1545,6 @@ STR_CONFIG_SETTING_ENDING_YEAR :Telling jaarein STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Die jaar wat die speletjie eindig vir telling doeleindes. Aan die einde van hierdie jaar word die maatskappy se telling aangeteken en die skerm met 'n hoogste telling word vertoon, maar die spelers kan daarna speel.{} As dit voor die beginjaar is, word die skerm met 'n hoogste telling nooit vertoon nie. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Nooit -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Aktiveer geleike ekonomie (meer, kleiner veranderings): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :As dit geaktiveer is sal nywerheidsvervaarding meer gereeld verander met kleiner veranderinge elke keer. Hierdie stelling het gewoonlik geen effek met nywerhede van NewGRFs nie. STR_CONFIG_SETTING_ALLOW_SHARES :Laat die koop van aandeele van ander maatskappye toe: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :As dit geaktiveer is, kan aandele in maatskappye gekoop en verkoop word. Aandele is net in maatskappye beskikbaar na 'n sekere aantal jaar. STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Minimum maatskappyouderdom om aandele te verhandel: {STRING} diff --git a/src/lang/arabic_egypt.txt b/src/lang/arabic_egypt.txt index 36d0fcd69a..c5df571ea2 100644 --- a/src/lang/arabic_egypt.txt +++ b/src/lang/arabic_egypt.txt @@ -1281,7 +1281,6 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :ممتلئ STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :الاخبار الملونة تظهر في: {STRING} STR_CONFIG_SETTING_STARTING_YEAR :سنة البدايه: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY :السماح بأقتصاد ثابت )تغيرات صغيرة اكثر): {STRING} STR_CONFIG_SETTING_ALLOW_SHARES :السماح بشراء حصص من الشركات الاخرى: {STRING} STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :اتاحة استخدام الأشارات بالأعلام قبل :{STRING} STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI :السماح باستخدام اشارات واجهة المستخدم الرسومية: {STRING} diff --git a/src/lang/basque.txt b/src/lang/basque.txt index d42ff546a4..088783db8a 100644 --- a/src/lang/basque.txt +++ b/src/lang/basque.txt @@ -1452,8 +1452,6 @@ STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Kolorezko albis STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Egunkarien mezuak kolorean imprimatuko diren urtea. Urte hau baino lehenago txuri/beltz monokromoa erabiliko da STR_CONFIG_SETTING_STARTING_YEAR :Hasierako urtea: {STRING} STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Gaitu ekonomia leuna (aldaketa gehiago baina txikiagoak): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Gaitua dagoenean, industrien ekoizpena gehiagotan aldatuko da baina urrats txikiagotan. Aukera honek gehienetan ez du eraginik izango industriak NewGRF batek ezartzen baditu STR_CONFIG_SETTING_ALLOW_SHARES :Beste konpainien akzioak erostea baimendu: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Gaitua dagoenean, konpainiaren akzioak erostea eta saltzea baimendu. Konpainiak akzioak izateko gutxiengo adin batera iritsi beharko dira STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Elikadura sistemetan ordaindu beharreko irabazien ehunekoa: {STRING} diff --git a/src/lang/belarusian.txt b/src/lang/belarusian.txt index 1230e327c9..29df4c3c2a 100644 --- a/src/lang/belarusian.txt +++ b/src/lang/belarusian.txt @@ -1854,8 +1854,6 @@ STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Год, у як STR_CONFIG_SETTING_STARTING_YEAR :Год пачатку гульні: {STRING} STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Ніколі -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Уключыць лагодную эканоміку (больш дробных зьменаў): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Калі ўключана, вытворчасьць прадпрыемстваў зьмяняецца часьцей ды малымі крокамі. Гэтая наладка звычайна не дае эфэкту, калі тыпы прадпрыемстваў вызначае набор новай ґрафікі (NewGRF). STR_CONFIG_SETTING_ALLOW_SHARES :Дазволіць купляць акцыі іншых кампаніяў: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Калі ўключана, дазваляецца купляць і прадаваць долі ў кампаніях. Акцыі даступны для кампаніяў, якія дасягнулі пэўнага ўзросту. STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Мін. узрост кампаніі для выпуску акцыяў: {STRING} diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index ee695d2385..040a6e0499 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -1554,8 +1554,6 @@ STR_CONFIG_SETTING_ENDING_YEAR :Pontuação no STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Ano em que o jogo termina para fins de pontuação. No final deste ano, a pontuação da empresa é registrada e a tela de pontuação máxima é exibida, mas os jogadores podem continuar jogando depois disso.{} Se isso for antes do ano inicial, a tela de pontuação máxima nunca será exibida. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Nunca -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Ativar economia regular (alterações menores): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Quando ativado, a produção de indústrias muda com mais frequência, e mais sutilmente STR_CONFIG_SETTING_ALLOW_SHARES :Permite comprar ações de outras empresas: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Se ativado, permite a compra e venda de ações de companhias. Ações de outras empresas poderão serem compradas após um período de tempo após a fundação da empresa STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Idade mínima da companhia para trocar ações: {STRING} diff --git a/src/lang/bulgarian.txt b/src/lang/bulgarian.txt index 9987253fc4..37ead463bd 100644 --- a/src/lang/bulgarian.txt +++ b/src/lang/bulgarian.txt @@ -1501,8 +1501,6 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Пълно STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Цветни новини се появяват през: {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Годината, когато вестникарските заглавия, ще станат цветни. Преди тази година, те са черно-бели STR_CONFIG_SETTING_STARTING_YEAR :Начална година: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Разреши плавна икономика (повече по-малки промени): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Ако тази опция бъде активирана, промишленото производство ще се променя по-често и по-плавно. Тази опция обикновено няма ефект, ако даденият вид промишленост е предоставен от NewGRF STR_CONFIG_SETTING_ALLOW_SHARES :Разреши купуване на акции от други компании: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Ако тази опция бъде активирана, ще можете да купувате и продавате дялове на компании. Това ще бъде възможно единствено когато дадената компания достигне определена възраст STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Процент от leg profit to pay in feeder systems: {STRING} diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index 0d9aa9bece..958632690b 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -1554,8 +1554,6 @@ STR_CONFIG_SETTING_ENDING_YEAR :Any de puntuaci STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Estableix l'any en què finalitza la partida i es puntua les companyies. Al final d'aquest any, la puntuació de la companyia es guarda i es mostra a la llista de classificació, però els jugadors poden continuar jugant.{}Si l'any de finalització és anterior a l'any d'inici, no es guardaran les puntuacions ni es mostrarà la llista de classificació. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Mai -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Activa economia suau (més canvis però més petits): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Quan està activat, els canvis de producció de la indústria són més habituals, i en passos més petits. Aquest paràmetre usualment no té efecte, si el tipus d'indústria estan proveïts per un NewGRF STR_CONFIG_SETTING_ALLOW_SHARES :Permet comprar participacions d'altres companyies: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Permet comprar i vendre accions de les companyies. Les accions només estan disponibles per companyies d'una certa edat. STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Edat mínima de la companyia per negociar participacions: {STRING} diff --git a/src/lang/croatian.txt b/src/lang/croatian.txt index 42734c289f..8b44a0aea0 100644 --- a/src/lang/croatian.txt +++ b/src/lang/croatian.txt @@ -1649,8 +1649,6 @@ STR_CONFIG_SETTING_ENDING_YEAR :Godina kraja bo STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Godina koje igra završava u smislu bodovanja. Na kraju ove godine, bilježe se bodovi kompanije i prikazuje se tablica najviših bodova ali igrači mogu nastaviti igru.{}Ako je ovo prije početne godine, tablica najviših bodova se nikada neće prikazati. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Nikada -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Uključi stabilno gospodarstvo (više manjih izazova): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Kada je uključeno, promjene u industrijskoj proizvodnji su češće ali u manjim rasponima. Ova postavka obično nema efekta ukoliko su industrije postavljene iz nekog NewGRF-a STR_CONFIG_SETTING_ALLOW_SHARES :Dopusti kupovanje udjela u drugim tvrtkama: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Kada je uključeno, dopušta se kupnja i prodaja dionica tvrtki. Dionice će postati dostupne samo za tvrtke određene starosti STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Najmanja starost tvrtke za trgovanje udjelima: {STRING} diff --git a/src/lang/czech.txt b/src/lang/czech.txt index 8b55d4db7e..4f03a803d0 100644 --- a/src/lang/czech.txt +++ b/src/lang/czech.txt @@ -1640,8 +1640,6 @@ STR_CONFIG_SETTING_ENDING_YEAR :Rok vyhodnocen STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Rok, kdy je ve hře uzavřeno hodnocení společností. Na konci tohoto roku je zaznamenáno skóre společností a je zobrazena tabulka nejlepších společností, ale ve hře je možné pokračovat i dál.{}Pokud je nastaven rok před rokem počátku hry, tabulka s hodnocením nebude zobrazena nikdy. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Nikdy -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Plynulé změny ekonomiky (více menších změn): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Pokud je zapnuto, produkce průmyslu se mění častěji ale změny jsou menší. Toto nastavení většinou nemá vliv na průmysl, který je přidaný novou grafikou STR_CONFIG_SETTING_ALLOW_SHARES :Povolit kupování podílu z ostatních společností: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Pokud je zapnuto, umožní kupovaní akcií ve společnostech. Akcie jsou k dispozici pouze u společností od určitého stáří STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Minimální stáří společnosti pro obchod s akciemi: {STRING} diff --git a/src/lang/danish.txt b/src/lang/danish.txt index eadbe1b088..10852b899f 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -1553,8 +1553,6 @@ STR_CONFIG_SETTING_ENDING_YEAR :Slutår for poi STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Årstal hvor spillet slutter pointoptælling. Ved slutningen af dette år bliver selskabets point optaget, og topresultater-skærmen bliver vist. Spillerne kan fortsætte med at spille efter dette.{}Hvis dette er før spillets start år, bliver topresultater-skærmen aldrig vist. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Aldrig -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Aktiver rolig økonomi (flere små ændringer): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Når slået til, ændre industriproduktion oftere, og i små trin. Denne indstilling har normalt ingen effekt, hvis industrityper er fastsat af NewGRF STR_CONFIG_SETTING_ALLOW_SHARES :Tillad at købe aktier i andre selskaber: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Hvis aktiveret, tillades køb og salg af selskabsaktier. Aktier vil kun være tilgængelige for selskaber der er nået en hvis alder STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Mindste selskabsalder for aktiehandel: {STRING} diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index b2fcf6260d..e7d28ce112 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -1553,8 +1553,6 @@ STR_CONFIG_SETTING_ENDING_YEAR :Eindjaar voor s STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Jaar dat het spel eindigt ten behoeve van de score. Aan het einde van dit jaar wordt de score van het bedrijf vastgelegd en verschijnt het venster met topscores. De spelers kunnen echter doorgaan met spelen.{}Als dit voor het startjaar ligt, verschijnt het venster met topscores niet. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Nooit -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Vloeiende economie inschakelen (meer, kleinere veranderingen): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Wanneer dit is ingeschakeld, verandert de productie van industrieën vaker en in kleinere stappen. Deze instelling heeft meestal geen effect als de industriesoorten worden geleverd door een NewGRF. STR_CONFIG_SETTING_ALLOW_SHARES :Kopen van aandelen in andere bedrijven toestaan: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Wanneer ingeschakeld is het toegestaan om bedrijfsaandelen te kopen en te verkopen. Aandelen zullen alleen beschikbaar zijn voor bedrijven die een bepaalde leeftijd hebben bereikt STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Minimale leeftijd van bedrijf om aandelen te kunnen verhandelen: {STRING} diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index 3b1f923fc4..177c9eb2b2 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -1485,8 +1485,6 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Full STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Coloured news appears in: {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Year that the newspaper announcements get printed in colour. Before this year, it uses monochrome black/white STR_CONFIG_SETTING_STARTING_YEAR :Starting year: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Enable smooth economy (more, smaller changes): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :When enabled, industry production changes more often, and in smaller steps. This setting has usually no effect, if industry types are provided by a NewGRF STR_CONFIG_SETTING_ALLOW_SHARES :Allow buying shares from other companies: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :When enabled, allow buying and selling of company shares. Shares will only be available for companies reaching a certain age STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Percentage of leg profit to pay in feeder systems: {STRING} diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index e9ac45f263..b633514294 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -1551,8 +1551,6 @@ STR_CONFIG_SETTING_ENDING_YEAR :Scoring end yea STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Year the game ends for scoring purposes. At the end of this year, the company's score is recorded and the high-score screen is displayed, but the players can continue playing after that.{}If this is before the starting year, the high-score screen is never displayed. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Never -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Enable smooth economy (more, smaller changes): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :When enabled, industry production changes more often, and in smaller steps. This setting has usually no effect, if industry types are provided by a NewGRF STR_CONFIG_SETTING_ALLOW_SHARES :Allow buying shares from other companies: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :When enabled, allow buying and selling of company shares. Shares will only be available for companies reaching a certain age STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Minimum company age to trade shares: {STRING} diff --git a/src/lang/esperanto.txt b/src/lang/esperanto.txt index cb2bb5a3d2..6a03087e33 100644 --- a/src/lang/esperanto.txt +++ b/src/lang/esperanto.txt @@ -1297,7 +1297,6 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Plene STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Koloraj novaĵoj aperas en: {STRING} STR_CONFIG_SETTING_STARTING_YEAR :Komenca jaro: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Aktivigu glatan ekonomion (pliaj, etaj ŝanĝoj): {STRING} STR_CONFIG_SETTING_ALLOW_SHARES :Permesu aĉetadon de dividaĵoj en aliaj kompanioj: {STRING} STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Aŭtomate konstruu semaforojn antaŭ: {STRING} STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI :Ebligu la signal-GUI-on: {STRING} diff --git a/src/lang/estonian.txt b/src/lang/estonian.txt index 6fd55dc426..383357dbc2 100644 --- a/src/lang/estonian.txt +++ b/src/lang/estonian.txt @@ -1574,8 +1574,6 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Täielik STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Värvilised uudised ilmuvad aastast {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Värviliste uudiste ilmumise algusaasta. Varasematel aastatel ilmuvad uudised must-valgelt STR_CONFIG_SETTING_STARTING_YEAR :Alustamise aeg: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Sujuv majandus (rohkem, kuid väikesed muutused): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Toodangumahtude muutused on väiksemad ja sagedasemad. Juhul kui tööstused tulevad NewGRF-ist ei oma see seade tavaliselt mõju STR_CONFIG_SETTING_ALLOW_SHARES :Aktsiatehingud teiste ettevõtetega: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Kui on aktiveeritud siis on ettevõtte aktsiate ostmine ja müümine lubatud. Aktsiad on saadaval ainult ettevõtetel mille vanus on üle teatud piiri STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Protsent tuludest mis läheb 'kanna edasi' süsteemis alumistesse lülidesse: {STRING} diff --git a/src/lang/faroese.txt b/src/lang/faroese.txt index 80805b1301..4f9592eb60 100644 --- a/src/lang/faroese.txt +++ b/src/lang/faroese.txt @@ -1441,8 +1441,6 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Fult STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Litaði tíðindir koma frám í: {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Ári har tíðindabløð verða prentaði í litum. Áðrenn hetta ári eru tíðindabløð svørt/hvít STR_CONFIG_SETTING_STARTING_YEAR :Byrjunar ár: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Gilda mjúkan búskap (fleiri, smærri broytingar): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Um gilda, ídnaðar framleiðsla broytist títtari og í smærri stigum. Henda ásetanin hevur vanliga onga ávirkan um ídnaðinir koma frá einum NewGRF STR_CONFIG_SETTING_ALLOW_SHARES :Loyv keypi av partabrøvum frá øðrum fyritøkum: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Um gilda, er loyvt at keypa og selja fyritøku partabrøv. Partabrøv verða einans tøk hjá fyritøkum ið hava rokki ein ávísan aldur STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Prosentpartur av deilvinningi at gjalda í veitingar kervum: {STRING} diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index dd1670ccb2..2c19c6e80b 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -1553,8 +1553,6 @@ STR_CONFIG_SETTING_ENDING_YEAR :Pistelaskun pä STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Pelin päättymisvuosi pisteiden laskemista varten. Tämän vuoden lopussa talletetaan yhtiön pistemäärä ja näytetään ennätysluettelo; pelaajat voivat jatkaa pelaamista tämän jälkeenkin.{}Jos päättymisvuosi on ennen alkamisvuotta, ennätyksiä ei näytetä koskaan. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Ei koskaan -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Tasainen talous (enemmän pieniä muutoksia): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Mikäli käytössä, teollisuuden tuotanto muuttuu useammin ja vähemmän kerrallaan. Tällä asetuksella ei ole yleensä vaikutusta mikäli teollisuustyypit ovat NewGRF:n tarjoamia STR_CONFIG_SETTING_ALLOW_SHARES :Salli toisten yhtiöiden osakkeiden ostaminen: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Mikäli käytössä, toisten yhtiöiden osakkeiden ostaminen ja myyminen on mahdollista. Osakkeet ovat saatavilla vain yhtiöille, jotka ovat saavuttaneet tietyn iän STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Yhtiön vähimmäisikä osakekaupoille: {STRING} diff --git a/src/lang/french.txt b/src/lang/french.txt index 2c025c586e..78ecd8dd0c 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -1554,8 +1554,7 @@ STR_CONFIG_SETTING_ENDING_YEAR :Année de fin d STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :À la fin de cette année, le score de la compagnie est enregistré et la fenêtre des meilleurs scores est affichée. Il est quand même possible de continuer de jouer après, mais le score ne sera pas enregistré.{}Si le jeu commence après cette année, les meilleurs scores ne sont jamais affichés. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Jamais -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Permettre une économie stable (petits changements plus nombreux){NBSP}: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Lorsqu'il est activé, la production des industries change plus souvent, et plus faiblement. Ce paramètre est généralement sans effets si les types d'industries sont fournis par un NewGRF +STR_CONFIG_SETTING_ECONOMY_TYPE :Type d'économie{NBSP}: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES :Permettre d'acheter des actions d'autres compagnies{NBSP}: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Lorsqu'il est activé, l'achat et la vente des parts de compagnie sont autorisées. Les parts ne seront disponibles que pour les compagnies ayant atteint un certain âge STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Âge minimum de la compagnie pour la vente d'actions{NBSP}: {STRING} diff --git a/src/lang/gaelic.txt b/src/lang/gaelic.txt index f00a366680..37f180cce3 100644 --- a/src/lang/gaelic.txt +++ b/src/lang/gaelic.txt @@ -1716,8 +1716,6 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Slàn STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Nochdaidh naidheachdan dathte ann an: {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Am bliadhna a thèid pàipear-naidheachd dathte a chlò-bhualadh a' chiad turas. Bidh na pàipearan-naidheachd ann an dubh is geal roimhe seo STR_CONFIG_SETTING_STARTING_YEAR :Bliadhna tòiseachaidh: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Cuir eaconamaidh rèidh an comas (atharraichean nas trice is nas beaga): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Ma tha seo air, atharraichidh saothrachadh nan gnìomhachasan nas trice is le ceuman nas lugha. Chan eil buaidh aig seo air seòrsaichean gnìomhachais a chaidh a sholar le NewGRF mar as trice STR_CONFIG_SETTING_ALLOW_SHARES :Ceadaich gun tèid stoca a cheannach bho chompanaidhean eile: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Ma tha seo air, ’s urrainn dhut stocan chompanaidhean a cheannach is a reic. Cha bhi stoca ri làimh ach aig companaidhean aig a bheil aois shònraichte STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :A' cheudad dhen phrothaid a gheibh carbadan le tar-aiseag carago: {STRING} diff --git a/src/lang/galician.txt b/src/lang/galician.txt index 4ee552731e..577789b6b3 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -1546,8 +1546,6 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Completo STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Data de aparición das novas en cor: {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Ano no que os avisos dos xornais son impresos en cor. Antes deste ano, emprégase monocromo branco e negro STR_CONFIG_SETTING_STARTING_YEAR :Data de comezo: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Habilita-la economía "estable" (máis cambios, pero máis pequenos): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Cando se activa, as producións industriais cambian máis frecuentemente, e a pasos máis curtos STR_CONFIG_SETTING_ALLOW_SHARES :Permiti-la compra de accións de outras compañías: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Cando se activa, permite comprar ou vender accións da compañía. As accións só estarán dispoñíbeis para compañías que acaden certa idade STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Idade mínima da compañía para compraventa de accións: {STRING} diff --git a/src/lang/german.txt b/src/lang/german.txt index 1660f010ef..2d1ea45741 100644 --- a/src/lang/german.txt +++ b/src/lang/german.txt @@ -1541,8 +1541,6 @@ STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Jahr in dem die STR_CONFIG_SETTING_STARTING_YEAR :Startdatum: {STRING} STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Nie -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Feinere Wirtschaft aktivieren (mehrere, kleinere Veränderungen): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Wird diese Option ausgewählt, ändert sich die Produktionsmenge der Industrien häufiger, aber dafür in kleineren Schritten. Diese Einstellung hat gewöhnlicherweise KEINEN Effekt, wenn die Industrien von NewGRFs bereitgestellt werden STR_CONFIG_SETTING_ALLOW_SHARES :Handel mit Firmenanteilen erlauben: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Erlaube das Kaufen und Verkaufen von Firmenanteilen. Firmenanteile sind nur verfügbar für Firmen, die hinreichend lange existieren STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Minimales Alter einer Firma, um an der Börse gehandelt zu werden: {STRING} diff --git a/src/lang/greek.txt b/src/lang/greek.txt index 9f567b9c50..65e565e3e8 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -1641,8 +1641,6 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Ολόκληρ STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Τα έγχρωμα νέα εμφανίζονται από το: {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Το έτος κατά το οποίο οι ανακοινώσεις στην εφημερίδα εκτυπώνονται έγχρωμες. Πριν από αυτό το έτος, εκτυπώνονται μονόχρωμες και ασπρόμαυρες STR_CONFIG_SETTING_STARTING_YEAR :Έτος εκκίνησης: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Ενεργοποίηση ομαλής οικονομίας (περισσότερες, μικρότερες αλλαγές): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Όταν είναι ενεργοποιημένη, η παραγωγή των βιομηχανιών αλλάζει συχνότερα και σε μικρότερα βήματα. Αυτή η ρύθμιση συνήθως δεν έχει καμία επίδραση όταν οι τύποι των βιομηχανιών παρέχονται από NewGRF STR_CONFIG_SETTING_ALLOW_SHARES :Ενεργοποίηση της δυνατότητας αγοράς μετοχών από άλλες εταιρίες: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Όταν είναι ενεργοποιημένη, επιτρέπεται η αγοραπωλησία εταιρικών μετοχών. Οι μετοχές θα είναι διαθέσιμες μόνο όταν οι εταιρείες φτάνουν μια ορισμένη ηλικία STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Το ποσοστό κέρδους από το σκέλος μεταφοράς στα συστήματα τροφοδότησης: {STRING} diff --git a/src/lang/hebrew.txt b/src/lang/hebrew.txt index eebb7d78a9..2bdba01d9d 100644 --- a/src/lang/hebrew.txt +++ b/src/lang/hebrew.txt @@ -1531,8 +1531,6 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :מלא STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :{STRING} :הצג חדשות צבעוניות החל משנת STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :השנה בה הודעות העיתונות מודפסות בצבע. לפני שנה זו הן מודפסות בשחור-לבן. STR_CONFIG_SETTING_STARTING_YEAR :{STRING} :שנת התחלה -STR_CONFIG_SETTING_SMOOTH_ECONOMY :אפשר כלכלה עדינה (יותר, שינויים קטנים יותר): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :כאשר מאופשר, הייצור של תעשיה משתנה לעיתים קרובות יותר, ובצעדים קטנים יותר. להגדרה זו בדרך כלל אין שום השפעה אם סוגי תעשיות מסופקים ע"י NewGRF STR_CONFIG_SETTING_ALLOW_SHARES :אפשר קניית מניות מחברות אחרות: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :כאשר מאופשר, מתיר קנייה ומכירה של מניות של חברות. מניות יהיו זמינות רק עבור חברות המגיעות לגיל מסוים STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :אחוז הרווח מקטע נסיעה לתשלום במערכות הזנה: {STRING} diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index 4dbbbf8e9b..8520f8fead 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -1617,8 +1617,6 @@ STR_CONFIG_SETTING_ENDING_YEAR :Játék végi p STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :A játék ebben az évben ér véget pontozás szempontjából. Ennek az évnek a végén a vállalat teljesítménypontszáma rögzítésre kerül, és adott esetben megjelenik a rekord táblán, de a játékosok ezután folytathatják a játékot.{}Ha ez a kezdő év elé van állítva, akkor a rekord tábla sosem jelenik meg. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Soha -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Egyenletes gazdaság (több, kisebb változás): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Bekapcsolva a gazdasági épületek termelése gyakrabban és kisebb lépésekben változik. Ennek a beállításnak általában nincs hatása, ha a gazdasági épületeket NewGRF nyújta STR_CONFIG_SETTING_ALLOW_SHARES :Más vállalatokból lehet részvényt vásárolni: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Bekapcsolva engedélyezi más vállalatok részvényeinek megvásárlását. A részvények csak akkor elérhetőek, ha a vállalat elért egy bizonyos kort STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Vállalatok minimális életkora részvénykibocsátáshoz: {STRING} diff --git a/src/lang/icelandic.txt b/src/lang/icelandic.txt index 1cdc2c3c9d..f25b2d3154 100644 --- a/src/lang/icelandic.txt +++ b/src/lang/icelandic.txt @@ -1440,8 +1440,6 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Allt STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Fréttir byrja að birtast í lit árið: {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Árið sem tilkynningar í dagblöðuðum byrja að vera í lit. Fram að þessum tíma eru blöð í svart/hvítu STR_CONFIG_SETTING_STARTING_YEAR :Upphafsár: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Virkja jafnan efnahag (fleiri og minni breytingar): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Ef þessi stilling er virk breytist framleiðsla í iðnaði oftar og í smærri skrefum. Þessi stilling hefur yfirleitt engin áhrif ef tegund iðnaðar er ákveðinn með NewGRF STR_CONFIG_SETTING_ALLOW_SHARES :Leyfa hlutabréfakaup í öðrum fyrirtækjum: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Ef þessi stilling er virk er hægt að kaupa og selja hlutabréf í fyrirtækjum. Hlutabréf eru aðeins aðgengileg fyrir fyrirtæki sem hafa náð ákveðnum aldri STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Hlutfall hagnaðar sem greiðist til tengiþjónustu: {STRING} diff --git a/src/lang/indonesian.txt b/src/lang/indonesian.txt index e5e1fae79b..70a240208e 100644 --- a/src/lang/indonesian.txt +++ b/src/lang/indonesian.txt @@ -1553,8 +1553,6 @@ STR_CONFIG_SETTING_ENDING_YEAR :Penilaian akhir STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Tahun pertandingan berakhir untuk tujuan mencetak gol. Pada akhir tahun ini, skor perusahaan dicatat dan layar skor tertinggi ditampilkan, tetapi para pemain dapat terus bermain setelah itu.{} Jika ini sebelum tahun mulai, layar skor tinggi tidak pernah ditampilkan. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Tidak pernah -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Aktifkan pertumbuhan ekonomi yang stabil (jarang berubah): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Ketika diaktifkan, produksi industri mengalami perubahan lebih sering, dalam gerakan kecil. Pengaturan tidak berpengaruh jika jenis industri disediakan oleh NewGRF STR_CONFIG_SETTING_ALLOW_SHARES :Ijinkan pembelian saham perusahaan lain: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Jika diaktifkan, pemain dibolehkan membeli saham suatu perusahaan. Saham hanya bisa dibeli saat perusahaan memasuki umur tertentu STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Usia minimum perusahaan untuk memperdagangkan saham: {STRING} diff --git a/src/lang/irish.txt b/src/lang/irish.txt index 63de2d9172..527daebf1b 100644 --- a/src/lang/irish.txt +++ b/src/lang/irish.txt @@ -1506,8 +1506,6 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Iomlán STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Bíonn nuacht daite ann don chéad uair in: {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :An bhliain a thosaítear ar fhógraí nuachtáin daite a chlóbhualadh. Roimh an bhliain sin, úsáidtear dubh/bán monacrómach STR_CONFIG_SETTING_STARTING_YEAR :Bliain tosaigh: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Cumasaigh geilleagar níos míne (tuilleadh athruithe, agus iad níos lú): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Má dhéantar é a chumasú, athraíonn táirgeadh na dtionscal níos minice, agus i gcéimeanna níos lú. Is iondúil nach mbíonn aon tionchar ag an socrú seo má chuirtear na cineálacha tioinscail ar fáil in NewGRF STR_CONFIG_SETTING_ALLOW_SHARES :Ceadaigh scaireanna a cheannach ó chuideachtaí eile: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Má tá sé cumasaithe, tá cead scaireanna i gcuideachta a cheannach agus a dhíol. Ní bheidh scaireanna ar fáil ach do chuideachtaí a bhfuil aois áirithe bainte amach acu STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :An céatadán den bhrabús a íocfar ar chuid den turas i gcórais fhriothálacha: {STRING} diff --git a/src/lang/italian.txt b/src/lang/italian.txt index 04d9da9b22..94784dc454 100644 --- a/src/lang/italian.txt +++ b/src/lang/italian.txt @@ -1577,8 +1577,6 @@ STR_CONFIG_SETTING_ENDING_YEAR :Punteggi a fine STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Anno in cui il gioco finisce per poter calcolare i punteggi. Alla fine di ques'tanno il punteggio della compagnia viene registrato e viene mostrata la schermata con i punteggi più alti, ma il giocatore può continuare a giocare anche dopo.{}Se quest'anno precede quello di inizio, la schermata dei punteggi non verrà mai mostrata. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Mai -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Abilita economia fluida (cambiamenti piccoli e frequenti): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Se abilitata, la produzione industriale cambia più spesso e a passi più piccoli. Questa impostazione non ha in genere effetto per i tipi di industria aggiunti da un NewGRF STR_CONFIG_SETTING_ALLOW_SHARES :Permetti l'acquisto di azioni di altre compagnie: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Se abilitata, consente l'acquisto e la vendita di azioni delle compagnie. Le azioni sono disponibili solo per le compagnie che hanno raggiunto una certa età minima STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Età minima della compagnia per lo scambio delle sue azioni: {STRING} diff --git a/src/lang/japanese.txt b/src/lang/japanese.txt index 9a1a148e21..5a157e91df 100644 --- a/src/lang/japanese.txt +++ b/src/lang/japanese.txt @@ -1506,8 +1506,6 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :新聞 STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :カラー新聞の開始年: {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :新聞がカラー版になる境目の年を設定します STR_CONFIG_SETTING_STARTING_YEAR :開始年: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY :緩やかな経済変動: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :有効にすると、一次産業での生産量はより小幅な変動がより頻繁に起こるようになります。この設定はNewGRFで提供されるような、デフォルト以外の産業に対してはほとんど効果がありません STR_CONFIG_SETTING_ALLOW_SHARES :他社株の取引許容: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :有効にすると、ライバル会社の株式を取引できるようになります。この設定を有効にしても、目的の社が設立から丸5年経過していない場合は取引できません STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :区間払いの割合: {STRING} diff --git a/src/lang/korean.txt b/src/lang/korean.txt index aaee99eae3..ab2089ac48 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -1554,8 +1554,6 @@ STR_CONFIG_SETTING_ENDING_YEAR :게임 종료 STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :점수를 기록할 게임 종료 연도를 설정합니다. 이 연도가 지나면, 회사의 점수가 고득점 순위표에 기록되어 표시됩니다. 하지만 플레이어는 계속해서 게임을 진행할 수 있습니다.{}이 값이 시작 연도보다 이전으로 설정되어 있다면, 고득점 순위표는 나타나지 않습니다. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :안 함 -STR_CONFIG_SETTING_SMOOTH_ECONOMY :부드러운 경제 변화 사용 (자주, 조금씩 변화): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :이 설정을 켜면, 1차 산업시설의 생산량이 소량으로 자주 변하게 됩니다. NewGRF로 추가한 산업시설에는 적용되지 않습니다. STR_CONFIG_SETTING_ALLOW_SHARES :다른 회사의 지분을 사는 것을 허용: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :이 설정을 켜면, 회사의 지분을 거래할 수 있게 됩니다. 회사의 지분을 거래하려면 해당 회사가 어느 정도 오래되어야 합니다. STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :지분 거래를 허용할 최소 회사 나이: {STRING} diff --git a/src/lang/latin.txt b/src/lang/latin.txt index fc0aa1e5f1..3fe5a1129b 100644 --- a/src/lang/latin.txt +++ b/src/lang/latin.txt @@ -1719,8 +1719,6 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Completa STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Ephemeris colorata apparet anno: {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Eligere annum in quo nuntia periodicorum colorata apparet. Antea, nuntia nigra albaque sunt STR_CONFIG_SETTING_STARTING_YEAR :Annus initii: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Sinere oeconomiam teretem esse (i.e. plures ac minores mutationes): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Electa, productio industriarum saepius mutat, et minores per gradus. Sed haec electio nihil affert si industriae apparatae sunt a NewGRF STR_CONFIG_SETTING_ALLOW_SHARES :Sinere mercari sortes societatum: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Sinere mercari sortes a societatibus. Sortes societatum satis aetatis modo mercari licet STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Centesimae partes lucri pendenda in translatione: {STRING} diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt index fc0d6b3bcd..5a9c86f247 100644 --- a/src/lang/latvian.txt +++ b/src/lang/latvian.txt @@ -1555,8 +1555,6 @@ STR_CONFIG_SETTING_ENDING_YEAR :Vērtēšanas b STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Spēles beigas gads (tiek izmantots rezultāta noteikšanai). Šī gada beigās uzņēmuma rezultāti tiek ierakstīti un uz ekrāna tiek parādīti labākie rezultāti, bet spēlētāji var turpināt spēlēt arī pēc šī datuma.{}Ja tas ir norādīts pirms spēles sākuma datuma, labākie rezultāti nekad netiek parādīti. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Nekad -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Atļaut vienmērīgas izmaiņas ekonomikā: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Ja ieslēgts, ražošanas izmaiņas notiek biežāk un ar mazākiem soļiem. Šim iestatījumam parasti nav ietekmes, ja ražotņu veidi ir ieviesti ar NewGRF STR_CONFIG_SETTING_ALLOW_SHARES :Atļaut akciju pirkšanu no citiem uzņēmumiem: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Ja iespējots, ir atļauts pirkt un pārdodot uzņēmumu akcijas. Akcijas būs pieejamas tikai atbilstošu vecumu sasniegušiem uzņēmumiem STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Minimālais uzņēmuma vecums, lai tirgotos ar akcijām: {STRING} diff --git a/src/lang/lithuanian.txt b/src/lang/lithuanian.txt index 0a5619885b..1e052710a1 100644 --- a/src/lang/lithuanian.txt +++ b/src/lang/lithuanian.txt @@ -1721,8 +1721,6 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Pilnas STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Spalvotos naujienos atsiranda: {STRING} metais STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Metai, kai laikraščių antraštės tampa spalvotos. Iki tol jos būna monochominės STR_CONFIG_SETTING_STARTING_YEAR :Žaidimo pradžia: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Tolygi ekonomika (daug, bet nežymių pokyčių): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Įgalinus nuostatą pramonės įmonių gamybos pajėgumai kis dažniau ir mažesniais žingsniais. Ši nuostata greičiausiai neturės jokios įtakos, jei pramonės įmonė yra aprašyta papildomame plėtinyjeipai yra numatyti NewGRF STR_CONFIG_SETTING_ALLOW_SHARES :Leisti pirkti kitų kompanijų akcijas: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Leisti pirkti bei parduoti kitų kompanijų akcijas. Akcijos yra platinamos tik įmonei sulaukus tam tikro amžiaus STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Grynojo pelno dalis, mokama tiekėjų sistemoms: {STRING} diff --git a/src/lang/luxembourgish.txt b/src/lang/luxembourgish.txt index 638e1b49b4..d1fc27a6bc 100644 --- a/src/lang/luxembourgish.txt +++ b/src/lang/luxembourgish.txt @@ -1552,8 +1552,6 @@ STR_CONFIG_SETTING_ENDING_YEAR :End-Joer vum Sc STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Joer wou d'Spill opgrond vum Scoring ophält. Um Enn vun desem Joer gëtt der Firma hiere Score gespäichert an an der Highscore-Lëscht ugewisen, mee de Spiller kann dono weider spillen.{}Wann dese Wert virum Startjoer ass, gëtt d'Highscorelëscht nie ugewisen. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Nie -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Gläichméisseg Wiertschaft aschalten (méi oft an kleng Wiessel): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Wann ugeschalt, ännert d'Industrieproduktioun méi oft, an méi kléngen Schrëtter. Dës Astellung huet keng Auswierkung op NewGRF-Industrien STR_CONFIG_SETTING_ALLOW_SHARES :Undeeler vun aaneren Firmen kafen: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Wann ugeschalt, dierfen Aktien vu Firmen kaf an verkaf ginn. Aktien si just fir Firme verfügbar, déi en gewëssen Alter erreecht hunn STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Minimalt Firmenalter fir Aktien ze handelen: {STRING} diff --git a/src/lang/malay.txt b/src/lang/malay.txt index 4358dfdaf8..051bb4f3b9 100644 --- a/src/lang/malay.txt +++ b/src/lang/malay.txt @@ -1365,7 +1365,6 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Penuh STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Berita berwarna muncul pada tahun: {STRING} STR_CONFIG_SETTING_STARTING_YEAR :Tahun permulaan: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Gunakan ekonomi baik (perubahan yang lebih kecil): {STRING} STR_CONFIG_SETTING_ALLOW_SHARES :Benarkan membeli saham syarikat lain: {STRING} STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Bina semafor secara automatik sebelum: {STRING} STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Tetapkan tahun apabila isyarat berjenis elektrik digunakan untuk landasan. Sebelum tahun ini, isyarat bukan elektrik akan digunakan (memiliki fungsi yang sama, tetapi berlainan reka bentuk) diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index f8e19bcef2..474d6c2b64 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -1555,8 +1555,6 @@ STR_CONFIG_SETTING_ENDING_YEAR :Poengsum ved sl STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Året spillet slutter med tanke på poeng. På slutten av dette året, vil firmaets poengsum bli lagret og tavlen med høyeste poengsummer vil vises. Spilleren kan fortsette å spille etter dette.{}Hvis dette er før start året, vil tavlen med høyeste poengsummer aldri vises. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Aldri -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Jevn økonomi (flere, mindre endringer): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Når denne er aktivert, endrer industriproduksjonen seg oftere, og i mindre trinn. Denne innstillingen har vanligvis ingen effekt hvis industriene er fra en NewGRF STR_CONFIG_SETTING_ALLOW_SHARES :Tillat aksjekjøp i andre firmaer: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Når aktivert, tillates kjøp og salg av selskapers aksjer. Aksjer vil kun være tilgjengelig selskaper som når en viss alder STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES_HELPTEXT :Sett minimum levetid for et selskap, før andre kan kjøpe og selge aksjer fra dem. diff --git a/src/lang/norwegian_nynorsk.txt b/src/lang/norwegian_nynorsk.txt index 5845a10491..36db98b654 100644 --- a/src/lang/norwegian_nynorsk.txt +++ b/src/lang/norwegian_nynorsk.txt @@ -1452,7 +1452,6 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Fullt STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Avisa vert trykt i fargar i: {STRING} STR_CONFIG_SETTING_STARTING_YEAR :Start spelet i år {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Jamn økonomi (fleire, mindre endringar): {STRING} STR_CONFIG_SETTING_ALLOW_SHARES :Tillet kjøp av aksjar i andre firma: {STRING} STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :Ved trekking, plasser signal kvar: {STRING} STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} ruter{P 0 "" s} diff --git a/src/lang/polish.txt b/src/lang/polish.txt index aeab9e3058..3cb810848b 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -1933,8 +1933,6 @@ STR_CONFIG_SETTING_ENDING_YEAR :Punktacja na ko STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Rok, w którym gra się kończy na cel punktacji. Na koniec tego roku, punkty firmy są zarejestrowane i ekran wyników najwyższych jest pokazywany, ale gracze mogą po tym dalej grać.{}Jeżeli jest to przed rokiem startowym, ekran wyników najwyższych nie jest nigdy pokazywany. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Nigdy -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Pozwól na łagodną ekonomię (więcej małych zmian): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Kiedy włączone, produkcja zakładów zmienia się częściej, ale mniejszymi krokami. To ustawienie zazwyczaj nie daje żadnego efektu, jeśli typy zakładów są pobierane z NewGRFów STR_CONFIG_SETTING_ALLOW_SHARES :Pozwól kupować udziały w innych firmach: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Kiedy włączone, pozwala na kupowanie i sprzedawanie udziałów w firmie. Udziały będą dostępne tylko dla firm z odpowiednim stażem STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Minimalny wiek firmy pozwalający na handel udziałami: {STRING} diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 6af854ea69..342aa839db 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -1542,8 +1542,6 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Completo STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Noticias a cores aparecem em: {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Ano em que os anúncios de jornal começam a ser mostrados a cores. Antes deste ano, serão mostrados a preto e branco. STR_CONFIG_SETTING_STARTING_YEAR :Data de início: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Activar economia regular (alterações menores): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Quando activa, a produção de indústrias muda frequentemente, em pequenos incrementos. Esta preferência não costuma ter efeito, se os tipos de indústria forem provenientes de um NewGRF STR_CONFIG_SETTING_ALLOW_SHARES :Permite comprar acções de outras empresas: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Quando activo, permite a compra e venda de acções de companhias. As acções apenas estarão disponíveis quando a companhia atinge uma determinada idade. STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES_HELPTEXT :Definir a idade mínima de uma companhia a partir da qual outros jogadores poderão comprar ou vender ações da mesma. diff --git a/src/lang/romanian.txt b/src/lang/romanian.txt index 79c3a4706c..eecd07d703 100644 --- a/src/lang/romanian.txt +++ b/src/lang/romanian.txt @@ -1512,8 +1512,6 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Pe larg STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Ştirile color apar în: {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Anul începând cu care anunțurile din ziar sunt tipărite color. Înainte de acest an, anunturile sunt monocrome (alb/negru) STR_CONFIG_SETTING_STARTING_YEAR :Anul de început al jocului: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Economie cu schimbări mai reduse, dar mai frecvente: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Dacă este activată, nivelul de producție al industriilor se schimbă mai des și în pași mai mici. Această opțiune de regulă nu are efect dacă tipul industriei este furnizat printr-un NewGRF STR_CONFIG_SETTING_ALLOW_SHARES :Permite cumpărarea de acţiuni de la alte companii: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Dacă este activată, se permite cumpărarea și vânzarea de acțiuni ale companiilor. Acțiunile devin disponibile doar când compania depășește o anumită vârstă STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Procentul din profitul pe secţiune care să fie plătit pentru alimentare: {STRING} diff --git a/src/lang/russian.txt b/src/lang/russian.txt index e7d922855b..cbe8e523af 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -1705,8 +1705,6 @@ STR_CONFIG_SETTING_ENDING_YEAR :Последн STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :По прошествии указанного года рассчитывается рейтинг компании и выводится таблица рекордов. После этого игру можно продолжить.{}Если указанный год предшествует году начала игры, то таблица рекордов не отображается. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Никогда -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Включить плавную экономику (частые, небольшие изменения): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :При включении производительность предприятий меняется чаще и более плавно. Эта настройка обычно не влияет на предприятия, внесённые в игру модулями NewGRF. STR_CONFIG_SETTING_ALLOW_SHARES :Разрешить торговлю акциями других компаний: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Разрешает торговлю акциями транспортных компаний. Акции выпускаются компаниями через некоторое время после основания. STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Мин. возраст компании для выпуска акций: {STRING} diff --git a/src/lang/serbian.txt b/src/lang/serbian.txt index dc7bf9cb7b..4131acf754 100644 --- a/src/lang/serbian.txt +++ b/src/lang/serbian.txt @@ -1713,8 +1713,6 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Potpuno STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Vesti u boji se objavljuju počev od godine: {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Godina počev od koje se vesti objavljuju u boji. Pre ove godine se objavljuju u crno/beloj tehnici. STR_CONFIG_SETTING_STARTING_YEAR :Početna godina: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Uključena glatka ekonomija (više, manjih promena): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Ako je omogućeno, industrijska proizvodnja se češće menja u manjim koracima. Ako se vrste industrija učitavaju preko NewGRF dodataka ovo podešavanje uglavnom nema efekta STR_CONFIG_SETTING_ALLOW_SHARES :Dozvoljena kupovina deonica drugih preduzeća: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Ako je omogućeno, dozvoljava kupovinu i prodaju deonica preduzeća. Deonice su dostupne tek kad preduzeće dostigne određenu starost STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Procenat prihoda koji će biti predan srednjim dionicama prevoza u fider sustavima: {STRING} diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index 3977294b37..971d405aa8 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -1553,8 +1553,6 @@ STR_CONFIG_SETTING_ENDING_YEAR :结束计分年 STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :游戏结束计分的年份。在这一年的年底,公司的分数将被记录,并展示高分榜;在此之后玩家仍可继续游戏。{}如果该年份早于游戏开始年份,则高分榜将不会展示。 STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :从不 -STR_CONFIG_SETTING_SMOOTH_ECONOMY :启用平滑经济模式 (更多小的经济变化):{STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :“打开”时,工业产量变化频繁而幅度小,如果工业是由NewGRF控制的,本选项不起作用 STR_CONFIG_SETTING_ALLOW_SHARES :允许购买其他公司的股份:{STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :“打开”时,允许买卖其它公司股份。被入股公司必须经营一定年限 STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :公司可发售股份的最小已存续年份数:{STRING} diff --git a/src/lang/slovak.txt b/src/lang/slovak.txt index b1b3bf1cde..094a5969ad 100644 --- a/src/lang/slovak.txt +++ b/src/lang/slovak.txt @@ -1621,8 +1621,6 @@ STR_CONFIG_SETTING_ENDING_YEAR :Rok ukončenia STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Rok v ktorom končí hra pre zaznamenanie skóre. Na konci tohto roku sa nahrá skóre spoločnosti a zobrazí sa tabuľka s najvyšším skóre, avšak hráči môžu v hre naďalej pokračovať.{}Ak je tento rok pred začiatkom hry, tabuľka sa nikdy nezobrazí. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Nikdy -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Povoliť zmeny ekonomiky (viac menších zmien): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Ak je zapnuté, zmeny v produkcii sa budú diať častejšie v malých krokoch. STR_CONFIG_SETTING_ALLOW_SHARES :Povoliť kupovanie podielov v ostatných spoločnostiach: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Ak je zapnuté, povolí sa nákup a predaj podielov spoločností. Podiely budú prístupné len pre spoločnosti od urcitého veku. STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Minimálny vek spoločnosti na obchodovanie s podielmi: {STRING} diff --git a/src/lang/slovenian.txt b/src/lang/slovenian.txt index a8b288f5a8..6112a6a823 100644 --- a/src/lang/slovenian.txt +++ b/src/lang/slovenian.txt @@ -1661,8 +1661,6 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Polno STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Barvni časopis se pojavi leta: {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Leto začetka barvnega časopisa. Pred tem je črno-bel. STR_CONFIG_SETTING_STARTING_YEAR :Začetno leto: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Omogoči gladko ekonomijo (več manjših sprememb): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Če je omogočeno, se proizvodnja industrij večkrat spreminja in v manjših razlikah. Nima vpliva na industrije NewGRF. STR_CONFIG_SETTING_ALLOW_SHARES :Dovoli kupovanje delnic od drugih podjetij: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Če je omogočeno, se lahko trguje z delnicami podjetij. Na voljo samo po določeni starosti podjetja. STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Procent osnovnega dobička za plačilo v sklade: {STRING} diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt index 12acd9a383..0fba4df700 100644 --- a/src/lang/spanish.txt +++ b/src/lang/spanish.txt @@ -1554,8 +1554,6 @@ STR_CONFIG_SETTING_ENDING_YEAR :Año de clasifi STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Año en el que finaliza el juego para establecer la clasificación. Al final de este año se guarda la puntuación de las empresas y se muestra la pantalla de las puntuaciones más altas, aunque se puede continuar jugando la partida.{}Si este año es posterior al año de comienzo, la pantalla de puntuaciones más altas no se mostrará nunca. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Nunca -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Activar economía suave (cambios más pequeños): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Si se activa, se producirán cambios de producción en las industrias más frecuentemente y en pasos menores. Si se usa un NewGRF para proveer industrias, esta opción generalmente no tiene efecto STR_CONFIG_SETTING_ALLOW_SHARES :Permitir comprar acciones de otras empresas: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Cuando se activa, permite comprar y vender acciones de empresas. Las acciones de una empresa solamente estarán disponibles cuando la empresa cumpla una edad determinada STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Edad mínima de una empresa para comerciar con sus acciones: {STRING} diff --git a/src/lang/spanish_MX.txt b/src/lang/spanish_MX.txt index 64344f42ef..2c4fe437bc 100644 --- a/src/lang/spanish_MX.txt +++ b/src/lang/spanish_MX.txt @@ -1554,8 +1554,6 @@ STR_CONFIG_SETTING_ENDING_YEAR :Año de fin de STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Año en el que se termina el juego para registrar la puntuación de la empresa y mostrar la tabla de puntuaciones, aunque el jugador puede continuar el juego.{}Cualquier fecha anterior al año de incio hará que la tabla de puntuaciones nunca se muestre. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Nunca -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Activar economía fácil (cambios más pequeños): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Al activarse, habrá cambios en la producción industrial continuamente y en menor escala. Normalmente esta opción no afecta los NewGRF de industrias STR_CONFIG_SETTING_ALLOW_SHARES :Permitir comprar acciones de otras empresas: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Al activarse, se pueden comprar y vender acciones de otras empresas. Las acciones de una empresa solamente estarán disponibles cuando la empresa cumpla una edad determinada STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Edad mínima de la empresa para intercambiar acciones: {STRING} diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index 65b1ee1ec2..21c811345a 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -1553,8 +1553,6 @@ STR_CONFIG_SETTING_ENDING_YEAR :Slutår för po STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Årtal då spelet slutar räkna poäng. Vid slutet av detta år sparas företagets poäng och listan med de bästa spelresultaten visas, men därefter kan spelarna fortsätta att spela.{}Om årtalet är satt till innan startåret visas aldrig de bästa spelresultaten. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Aldrig -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Lugn ekonomi (flera små ändringar): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :När det är aktiverat ändras industriproduktionen oftare och i mindre steg. Den här inställningen har vanligtvis ingen effekt om de olika industrityperna kommer från en NewGRF STR_CONFIG_SETTING_ALLOW_SHARES :Tillåt köp av aktier från andra företag: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :När det är aktiverat blir det tillåtet att köpa och sälja andelar i företag. För att dess andelar ska bli tillgängliga måste ett företag ha uppnått en viss ålder STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Lägsta företagsålder för aktiehandel: {STRING} diff --git a/src/lang/tamil.txt b/src/lang/tamil.txt index 4bad1f00b1..f4cdbe0586 100644 --- a/src/lang/tamil.txt +++ b/src/lang/tamil.txt @@ -1404,7 +1404,6 @@ STR_CONFIG_SETTING_STARTING_YEAR :தொடங் STR_CONFIG_SETTING_ENDING_YEAR :மதிப்பீட்டிற்கான இறுதி ஆண்டு: {STRING} STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :என்றுமில்லை -STR_CONFIG_SETTING_SMOOTH_ECONOMY :இயல்பான பொருளாதாரத்தினைச் செயல்படுத்தவும் (அதிகமான, சிறிய மாற்றங்கள்): {STRING} STR_CONFIG_SETTING_ALLOW_SHARES :மற்ற நிறுவனங்களின் பங்குகளை வாங்குவதை அனுமதிக்கவும்: {STRING} STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :பங்குகள் பரிமாற்றத்திற்கு தேவையான குறைந்தபட்ச நிறுவன வயது: {STRING} STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :இழுத்தால், சிக்னல்களை இடவும், ஒவ்வொறு: {STRING} diff --git a/src/lang/thai.txt b/src/lang/thai.txt index cb00ecdd59..95b051e085 100644 --- a/src/lang/thai.txt +++ b/src/lang/thai.txt @@ -1467,8 +1467,6 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :แสดงข STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :เริ่มใช้งานหนังสือพิมพ์สีในปี: {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :เป็นการกำหนดว่าจะเริ่มต้นการใช้งานหนังสือพิมพ์แบบสีเมื่อปีใด STR_CONFIG_SETTING_STARTING_YEAR :ปีที่เริ่มต้น: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY :ยอมให้มีเศรษฐกิจที่ราบรื่น (มากขึ้น, เปลี่ยนแปลงเล็กน้อย): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :เมื่อเปิดใช้งาน อุดสาหกรรมจะมีการเปลี่ยนแปลงผลผลผลิต STR_CONFIG_SETTING_ALLOW_SHARES :อนุญาตให้ซื้อหุ้นจากบริษัทอื่นได้: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :เมื่อเปิดการใช้งาน จะสามารถซื้่อชขายหุ้นระหว่างบริษัท จะสามารถซื้อขายหุ้นได้ต่อเมื่อบริษัทเปิดตัวมานานแล้วเท่านั้น STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :เปอเซนต์ของผลกำไรที่จะส่งเข้าสู่ระบบกระจายรายได้: {STRING} diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index 6b6dc6b87d..eabbb03608 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -1508,8 +1508,6 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :詳細 STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :彩色報紙登場年份:{STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :設定報紙轉用彩色印刷的年份。在此之前,所有在報紙上的圖像皆為黑白 STR_CONFIG_SETTING_STARTING_YEAR :開始年份:{STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY :開啟平滑經濟模式 (更多、更小的變動):{STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :如啟用此選項,工業會較頻繁地更改其產量,但幅度則較輕微。此選項不會影響由 NewGRF 提供的工業種類 STR_CONFIG_SETTING_ALLOW_SHARES :允許購買其它公司的股票:{STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :啟用此選項以容許公司買賣股票。一所公司必須達到一定的年齡方能買賣股票 STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :轉運服務所得的收入百分比: {STRING} diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt index 240b3041d8..6246e05b7e 100644 --- a/src/lang/turkish.txt +++ b/src/lang/turkish.txt @@ -1554,8 +1554,6 @@ STR_CONFIG_SETTING_ENDING_YEAR :Yıl sonu puan STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Oyunun puan sonucuna göre bittiği yıl. Bu yılın sonunda, şirketin puanı kaydedilir ve yüksek puan ekranında gösterilir ama oyuncular oynamaya devam edebilir.{}Eğer bu başlama yılından önce ise, yüksek puan ekranı gösterilmez. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Asla -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Yüzeysel ekonomi (daha çok ve küçük çapta değişiklikler): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Etkinleştirildiğinde, endüstri üretim miktarı daha sık ve daha küçük adımlarla değişir. Eğer endüstriler bir NewGRF dosyası tarafından sağlanıyorsa bu özellik genellikle etkisiz kalır STR_CONFIG_SETTING_ALLOW_SHARES :Diğer şirketlerin hisseleri alınabilsin: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Etkinleştirildiğinde, şirketlerin hisse senetlerinin alınıp satılması mümkün olur. Hisse senetleri sadece belli bir yaşa ulaşan şirketler için geçerlidir STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Hisse satmak için gerekli minimum şirket yaşı: {STRING} diff --git a/src/lang/ukrainian.txt b/src/lang/ukrainian.txt index 6b9545d1a9..e0799eddae 100644 --- a/src/lang/ukrainian.txt +++ b/src/lang/ukrainian.txt @@ -1681,8 +1681,6 @@ STR_CONFIG_SETTING_ENDING_YEAR :Рік закі STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Рік закінчення гри для підрахунку очок. У кінці року додають очки компанії і показують загальний результат, але гравці можуть грати далі.{}Якщо встановлено рік раніший початкового, загальний результат не зʼявиться. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Ніколи -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Стабільна економіка: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :При включенні обсяги виробництва підприємств змінюються часто, але не дуже суттєво. Зазвичай ця опція не впливає на підприємства, додані за допомогою NewGRF. STR_CONFIG_SETTING_ALLOW_SHARES :Дозволити придбання акції інших компаній: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :При включенні дозволяє придбання та продаж акцій команій. Акції компанії стають доступними після досягнення деякого віку. STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Мінімальний вік компанії для торгівлі акціями: {STRING} diff --git a/src/lang/unfinished/frisian.txt b/src/lang/unfinished/frisian.txt index fd8b8e1e64..97b3746b8f 100644 --- a/src/lang/unfinished/frisian.txt +++ b/src/lang/unfinished/frisian.txt @@ -1495,7 +1495,6 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Folslein STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Krante verskient yn kleur yn: {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :It jier wêrop kranteberjochten oergean op kleur. Foar dit jier oan binne sy swart/wyt STR_CONFIG_SETTING_STARTING_YEAR :Begjin jier: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Jou de ekonomy mear lytse veroarings: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES :Stea it keapjen fan oandielen ta: {STRING} STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :By slepe, pleats seinen eltse: {STRING} STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} tegel{P 0 "" s} diff --git a/src/lang/unfinished/persian.txt b/src/lang/unfinished/persian.txt index 30af9b9364..dde996e034 100644 --- a/src/lang/unfinished/persian.txt +++ b/src/lang/unfinished/persian.txt @@ -1311,7 +1311,6 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :کامل STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :نمایش خبرهای رنگی در سال: {STRING} STR_CONFIG_SETTING_STARTING_YEAR :سال شروع: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY :فعال بودن اقتصاد ملایم (بیشتر،تغییرات کوچک انجام می‌شود): {STRING} STR_CONFIG_SETTING_ALLOW_SHARES :قابلیت خرید سهام بقیه شرکت‌ها: {STRING} STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :نصب علمک مکانیکی به جای چراغ راهنمایی قبل از سال: {STRING} STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI :فعال کردن صفحه واسط کاربری برای نشانگر: {STRING} diff --git a/src/lang/unfinished/urdu.txt b/src/lang/unfinished/urdu.txt index 61ed5a2d93..2e8266c230 100644 --- a/src/lang/unfinished/urdu.txt +++ b/src/lang/unfinished/urdu.txt @@ -1238,7 +1238,6 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :مکمل STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :رنگین خبریں کون سے سال سے شروع ہوں: {STRING} STR_CONFIG_SETTING_STARTING_YEAR :شروعاتی سال: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY :مستحکم معیشت فعال کریں: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES :دوسری کمپنیوں کے حصص خریدنے کی اجازت: {STRING} STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :پہلے خودکار طریقے سے semaphores بنائیں: {STRING} STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI :اشاروں والی GUI فعال کریں: {STRING} diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index 0211530fef..e317952ff1 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -1553,8 +1553,6 @@ STR_CONFIG_SETTING_ENDING_YEAR :Năm kết thú STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Năm mà ván chơi sẽ kết thúc và tính điểm. Khi năm đó kết thúc, điểm số của công ty sẽ được lưu lại và hiển thị bảng điểm chơi cao nhất, sau đó người chơi vẫn có thể tiếp tục ván chơi.{} Nếu năm được đặt nhỏ hơn năm bắt đầu, bảng điểm chơi cao nhất sẽ không bao giờ được hiển thị. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Không bao giờ -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Nền kinh tế ít biến động: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Nếu bật, sản lượng của nhà máy sẽ thay đổi thường xuyên hơn, và thay đổi với mức độ nhỏ hơn. Thiết lập này sẽ không có tác dụng nếu kiểu nhà máy định nghĩa bởi NewGRF STR_CONFIG_SETTING_ALLOW_SHARES :Cho phép mua cổ phần của các công ty khác: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Nếu bật, cho phép mua và bán cổ phần công ty. Cổ phần chỉ có thể mua bán nếu công ty đã tồn tại một thời gian nhất định nào đó STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Tuổi công ty tối thiểu để bán cổ phần: {STRING} diff --git a/src/lang/welsh.txt b/src/lang/welsh.txt index e905391461..2f267f488b 100644 --- a/src/lang/welsh.txt +++ b/src/lang/welsh.txt @@ -1512,8 +1512,6 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Llawn STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Bydd newyddion lliw yn ymddangos yn: {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Y blwyddyn y caiff cyhoeddiadau newyddion eu hargraffu mewn lliw. Cyn y dyddiad yma rhai du a gwyn fyddent STR_CONFIG_SETTING_STARTING_YEAR :Blwyddyn dechreuol: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Galluogi economi llyfn (mwy o newidiadau llai): {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Pan fe wedi'i alluogi, mae gweithgynhyrchiant diwydiant yn newid yn fwy aml, ac mewn cammau llai. Ni fydd y gosodiad yma yn cael effaith os y defnyddir diwydiannau NewGRF, fel rheol STR_CONFIG_SETTING_ALLOW_SHARES :Caniatáu prynu cyfranddaliadau mewn cwmnïau eraill: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Pan fo wedi'i alluogi, fe ganiateir prynnu a gwerthu cyfrandalaidau cwmni. Rhaid i gwmni gyrraedd oed penodol cyn y daw eu cyfrandaliadau ar gael STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Canran elw y cymal i'w dalu mewn systemau trosglwyddo: {STRING} From f2a93dba0d7c4e4f23d9d5cb36e1ede8c02eeeca Mon Sep 17 00:00:00 2001 From: Tyler Trahan <55058389+2TallTyler@users.noreply.github.com> Date: Tue, 15 Dec 2020 03:58:37 -0500 Subject: [PATCH 11/20] Change: set the default setting for autorenew to on for new games (#8352) --- regression/regression/main.nut | 1 + regression/regression/result.txt | 3 ++- src/table/company_settings.ini | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/regression/regression/main.nut b/regression/regression/main.nut index 65742d71b3..0434524d2c 100644 --- a/regression/regression/main.nut +++ b/regression/regression/main.nut @@ -433,6 +433,7 @@ function Regression::Company() print(" GetAutoRenewStatus(); " + AICompany.GetAutoRenewStatus(AICompany.COMPANY_SELF)); print(" SetAutoRenewStatus(true); " + AICompany.SetAutoRenewStatus(true)); print(" SetAutoRenewStatus(false); " + AICompany.SetAutoRenewStatus(false)); + print(" GetAutoRenewStatus(); " + AICompany.GetAutoRenewStatus(AICompany.COMPANY_SELF)); print(" GetAutoRenewMonths(); " + AICompany.GetAutoRenewMonths(AICompany.COMPANY_SELF)); print(" SetAutoRenewMonths(-12); " + AICompany.SetAutoRenewMonths(-12)); print(" GetAutoRenewMonths(); " + AICompany.GetAutoRenewMonths(AICompany.COMPANY_SELF)); diff --git a/regression/regression/result.txt b/regression/regression/result.txt index 4cb74aaa54..ab441256d5 100644 --- a/regression/regression/result.txt +++ b/regression/regression/result.txt @@ -615,11 +615,12 @@ ERROR: IsEnd() is invalid as Begin() is never called GetCompanyHQ(): 33153 BuildCompanyHQ(): false GetLastErrorString(): ERR_AREA_NOT_CLEAR - GetAutoRenewStatus(); false + GetAutoRenewStatus(); true SetAutoRenewStatus(true); true GetAutoRenewStatus(); true SetAutoRenewStatus(true); true SetAutoRenewStatus(false); true + GetAutoRenewStatus(); false GetAutoRenewMonths(); 6 SetAutoRenewMonths(-12); true GetAutoRenewMonths(); -12 diff --git a/src/table/company_settings.ini b/src/table/company_settings.ini index 86035b9d77..8f9bee3bfe 100644 --- a/src/table/company_settings.ini +++ b/src/table/company_settings.ini @@ -38,7 +38,7 @@ cat = SC_ADVANCED [SDT_BOOL] base = CompanySettings var = engine_renew -def = false +def = true str = STR_CONFIG_SETTING_AUTORENEW_VEHICLE strhelp = STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT cat = SC_BASIC From 2da07f76154d841bcfe9aaff4833144550186deb Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sun, 6 Dec 2020 20:38:34 +0100 Subject: [PATCH 12/20] Codechange: unroll the SDL2 main loop This commit prepares for the next commit, as Emscripten needs to have a way to trigger a single iteration of the main loop. To keep the real changes more clear, this commit only unrolls the loop, and makes no changes to the logic itself. --- src/video/sdl2_v.cpp | 161 +++++++++++++++++++++++-------------------- src/video/sdl2_v.h | 9 +++ 2 files changed, 94 insertions(+), 76 deletions(-) diff --git a/src/video/sdl2_v.cpp b/src/video/sdl2_v.cpp index c599de65e2..09d0e8a0bc 100644 --- a/src/video/sdl2_v.cpp +++ b/src/video/sdl2_v.cpp @@ -664,19 +664,90 @@ void VideoDriver_SDL::Stop() } } -void VideoDriver_SDL::MainLoop() +void VideoDriver_SDL::LoopOnce() { - uint32 cur_ticks = SDL_GetTicks(); - uint32 last_cur_ticks = cur_ticks; - uint32 next_tick = cur_ticks + MILLISECONDS_PER_TICK; uint32 mod; int numkeys; const Uint8 *keys; + uint32 prev_cur_ticks = cur_ticks; // to check for wrapping + InteractiveRandom(); // randomness + + while (PollEvent() == -1) {} + if (_exit_game) return; + + mod = SDL_GetModState(); + keys = SDL_GetKeyboardState(&numkeys); + +#if defined(_DEBUG) + if (_shift_pressed) +#else + /* Speedup when pressing tab, except when using ALT+TAB + * to switch to another application */ + if (keys[SDL_SCANCODE_TAB] && (mod & KMOD_ALT) == 0) +#endif /* defined(_DEBUG) */ + { + if (!_networking && _game_mode != GM_MENU) _fast_forward |= 2; + } else if (_fast_forward & 2) { + _fast_forward = 0; + } + + cur_ticks = SDL_GetTicks(); + if (SDL_TICKS_PASSED(cur_ticks, next_tick) || (_fast_forward && !_pause_mode) || cur_ticks < prev_cur_ticks) { + _realtime_tick += cur_ticks - last_cur_ticks; + last_cur_ticks = cur_ticks; + next_tick = cur_ticks + MILLISECONDS_PER_TICK; + + bool old_ctrl_pressed = _ctrl_pressed; + + _ctrl_pressed = !!(mod & KMOD_CTRL); + _shift_pressed = !!(mod & KMOD_SHIFT); + + /* determine which directional keys are down */ + _dirkeys = + (keys[SDL_SCANCODE_LEFT] ? 1 : 0) | + (keys[SDL_SCANCODE_UP] ? 2 : 0) | + (keys[SDL_SCANCODE_RIGHT] ? 4 : 0) | + (keys[SDL_SCANCODE_DOWN] ? 8 : 0); + if (old_ctrl_pressed != _ctrl_pressed) HandleCtrlChanged(); + + /* The gameloop is the part that can run asynchronously. The rest + * except sleeping can't. */ + if (_draw_mutex != nullptr) draw_lock.unlock(); + + GameLoop(); + + if (_draw_mutex != nullptr) draw_lock.lock(); + + UpdateWindows(); + _local_palette = _cur_palette; + } else { + /* Release the thread while sleeping */ + if (_draw_mutex != nullptr) draw_lock.unlock(); + CSleep(1); + if (_draw_mutex != nullptr) draw_lock.lock(); + + NetworkDrawChatMessage(); + DrawMouseCursor(); + } + + /* End of the critical part. */ + if (_draw_mutex != nullptr && !HasModalProgress()) { + _draw_signal->notify_one(); + } else { + /* Oh, we didn't have threads, then just draw unthreaded */ + CheckPaletteAnim(); + DrawSurfaceToScreen(); + } +} + +void VideoDriver_SDL::MainLoop() +{ + cur_ticks = SDL_GetTicks(); + last_cur_ticks = cur_ticks; + next_tick = cur_ticks + MILLISECONDS_PER_TICK; CheckPaletteAnim(); - std::thread draw_thread; - std::unique_lock draw_lock; if (_draw_threaded) { /* Initialise the mutex first, because that's the thing we *need* * directly in the newly created thread. */ @@ -707,78 +778,16 @@ void VideoDriver_SDL::MainLoop() DEBUG(driver, 1, "SDL2: using %sthreads", _draw_threaded ? "" : "no "); - for (;;) { - uint32 prev_cur_ticks = cur_ticks; // to check for wrapping - InteractiveRandom(); // randomness - - while (PollEvent() == -1) {} - if (_exit_game) break; - - mod = SDL_GetModState(); - keys = SDL_GetKeyboardState(&numkeys); - -#if defined(_DEBUG) - if (_shift_pressed) -#else - /* Speedup when pressing tab, except when using ALT+TAB - * to switch to another application */ - if (keys[SDL_SCANCODE_TAB] && (mod & KMOD_ALT) == 0) -#endif /* defined(_DEBUG) */ - { - if (!_networking && _game_mode != GM_MENU) _fast_forward |= 2; - } else if (_fast_forward & 2) { - _fast_forward = 0; - } - - cur_ticks = SDL_GetTicks(); - if (SDL_TICKS_PASSED(cur_ticks, next_tick) || (_fast_forward && !_pause_mode) || cur_ticks < prev_cur_ticks) { - _realtime_tick += cur_ticks - last_cur_ticks; - last_cur_ticks = cur_ticks; - next_tick = cur_ticks + MILLISECONDS_PER_TICK; - - bool old_ctrl_pressed = _ctrl_pressed; - - _ctrl_pressed = !!(mod & KMOD_CTRL); - _shift_pressed = !!(mod & KMOD_SHIFT); - - /* determine which directional keys are down */ - _dirkeys = - (keys[SDL_SCANCODE_LEFT] ? 1 : 0) | - (keys[SDL_SCANCODE_UP] ? 2 : 0) | - (keys[SDL_SCANCODE_RIGHT] ? 4 : 0) | - (keys[SDL_SCANCODE_DOWN] ? 8 : 0); - if (old_ctrl_pressed != _ctrl_pressed) HandleCtrlChanged(); - - /* The gameloop is the part that can run asynchronously. The rest - * except sleeping can't. */ - if (_draw_mutex != nullptr) draw_lock.unlock(); - - GameLoop(); - - if (_draw_mutex != nullptr) draw_lock.lock(); - - UpdateWindows(); - _local_palette = _cur_palette; - } else { - /* Release the thread while sleeping */ - if (_draw_mutex != nullptr) draw_lock.unlock(); - CSleep(1); - if (_draw_mutex != nullptr) draw_lock.lock(); - - NetworkDrawChatMessage(); - DrawMouseCursor(); - } - - /* End of the critical part. */ - if (_draw_mutex != nullptr && !HasModalProgress()) { - _draw_signal->notify_one(); - } else { - /* Oh, we didn't have threads, then just draw unthreaded */ - CheckPaletteAnim(); - DrawSurfaceToScreen(); - } + while (!_exit_game) { + LoopOnce(); } + MainLoopCleanup(); +#endif +} + +void VideoDriver_SDL::MainLoopCleanup() +{ if (_draw_mutex != nullptr) { _draw_continue = false; /* Sending signal if there is no thread blocked diff --git a/src/video/sdl2_v.h b/src/video/sdl2_v.h index 80d4018a77..6318c403f7 100644 --- a/src/video/sdl2_v.h +++ b/src/video/sdl2_v.h @@ -42,12 +42,21 @@ public: const char *GetName() const override { return "sdl"; } private: int PollEvent(); + void LoopOnce(); + void MainLoopCleanup(); bool CreateMainSurface(uint w, uint h, bool resize); /** * This is true to indicate that keyboard input is in text input mode, and SDL_TEXTINPUT events are enabled. */ bool edit_box_focused; + + uint32 cur_ticks; + uint32 last_cur_ticks; + uint32 next_tick; + + std::thread draw_thread; + std::unique_lock draw_lock; }; /** Factory for the SDL video driver. */ From d15dc9f40f5a20bff452547a2dcb15231f9f969d Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sat, 5 Dec 2020 21:57:47 +0100 Subject: [PATCH 13/20] Add: support for emscripten (play-OpenTTD-in-the-browser) Emscripten compiles to WASM, which can be loaded via HTML / JavaScript. This allows you to play OpenTTD inside a browser. Co-authored-by: milek7 --- .github/workflows/ci-build.yml | 49 ++++++ CMakeLists.txt | 37 +++++ cmake/Options.cmake | 8 +- os/emscripten/Dockerfile | 4 + os/emscripten/README.md | 40 +++++ os/emscripten/cmake/FindLibLZMA.cmake | 20 +++ os/emscripten/cmake/FindPNG.cmake | 7 + os/emscripten/cmake/FindSDL2.cmake | 7 + os/emscripten/cmake/FindZLIB.cmake | 7 + os/emscripten/emsdk-liblzma.patch | 213 ++++++++++++++++++++++++++ os/emscripten/loading.png | Bin 0 -> 4824 bytes os/emscripten/pre.js | 93 +++++++++++ os/emscripten/shell.html | 205 +++++++++++++++++++++++++ src/fontcache.cpp | 3 +- src/gfx_type.h | 8 +- src/ini.cpp | 7 + src/network/core/address.cpp | 10 +- src/network/core/os_abstraction.h | 24 ++- src/network/network.cpp | 11 ++ src/network/network_content.cpp | 15 ++ src/network/network_gui.cpp | 17 ++ src/openttd.cpp | 14 ++ src/saveload/saveload.cpp | 7 + src/video/sdl2_v.cpp | 45 +++++- src/video/sdl2_v.h | 5 + 25 files changed, 844 insertions(+), 12 deletions(-) create mode 100644 os/emscripten/Dockerfile create mode 100644 os/emscripten/README.md create mode 100644 os/emscripten/cmake/FindLibLZMA.cmake create mode 100644 os/emscripten/cmake/FindPNG.cmake create mode 100644 os/emscripten/cmake/FindSDL2.cmake create mode 100644 os/emscripten/cmake/FindZLIB.cmake create mode 100644 os/emscripten/emsdk-liblzma.patch create mode 100755 os/emscripten/loading.png create mode 100644 os/emscripten/pre.js create mode 100644 os/emscripten/shell.html diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index 31d0b511da..8794b79dae 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -10,6 +10,55 @@ env: CTEST_OUTPUT_ON_FAILURE: 1 jobs: + emscripten: + name: Emscripten + + runs-on: ubuntu-20.04 + container: + # If you change this version, change the number in the cache step too. + image: emscripten/emsdk:2.0.10 + + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Setup cache + uses: actions/cache@v2 + with: + path: /emsdk/upstream/emscripten/cache + key: 2.0.10-${{ runner.os }} + + - name: Build (host tools) + run: | + mkdir build-host + cd build-host + + echo "::group::CMake" + cmake .. -DOPTION_TOOLS_ONLY=ON + echo "::endgroup::" + + echo "::group::Build" + echo "Running on $(nproc) cores" + make -j$(nproc) tools + echo "::endgroup::" + + - name: Install GCC problem matcher + uses: ammaraskar/gcc-problem-matcher@master + + - name: Build + run: | + mkdir build + cd build + + echo "::group::CMake" + emcmake cmake .. -DHOST_BINARY_DIR=../build-host + echo "::endgroup::" + + echo "::group::Build" + echo "Running on $(nproc) cores" + emmake make -j$(nproc) + echo "::endgroup::" + linux: name: Linux diff --git a/CMakeLists.txt b/CMakeLists.txt index 15c6e03c0d..ca2284ffc1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,6 +15,10 @@ if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Debug) endif() +if (EMSCRIPTEN) + set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/os/emscripten/cmake") +endif() + set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake") set(CMAKE_OSX_DEPLOYMENT_TARGET 10.9) @@ -232,6 +236,39 @@ if(APPLE) ) endif() +if(EMSCRIPTEN) + add_library(WASM::WASM INTERFACE IMPORTED) + + # Allow heap-growth, and start with a bigger memory size. + target_link_libraries(WASM::WASM INTERFACE "-s ALLOW_MEMORY_GROWTH=1") + target_link_libraries(WASM::WASM INTERFACE "-s INITIAL_MEMORY=33554432") + + # Export functions to Javascript. + target_link_libraries(WASM::WASM INTERFACE "-s EXPORTED_FUNCTIONS='[\"_main\", \"_em_openttd_add_server\"]' -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"cwrap\"]'") + + # Preload all the files we generate during build. + # As we do not compile with FreeType / FontConfig, we also have no way to + # render several languages (like Chinese, ..), so where do you draw the + # line what languages to include and which not? In the end, especially as + # the more languages you add the slower downloading becomes, we decided to + # only ship the English language. + target_link_libraries(WASM::WASM INTERFACE "--preload-file ${CMAKE_BINARY_DIR}/baseset@/baseset") + target_link_libraries(WASM::WASM INTERFACE "--preload-file ${CMAKE_BINARY_DIR}/lang/english.lng@/lang/english.lng") + target_link_libraries(WASM::WASM INTERFACE "--preload-file ${CMAKE_SOURCE_DIR}/bin/ai@/ai") + target_link_libraries(WASM::WASM INTERFACE "--preload-file ${CMAKE_SOURCE_DIR}/bin/game@/game") + + # We use IDBFS for persistent storage. + target_link_libraries(WASM::WASM INTERFACE "-lidbfs.js") + + # Use custom pre-js and shell.html. + target_link_libraries(WASM::WASM INTERFACE "--pre-js ${CMAKE_SOURCE_DIR}/os/emscripten/pre.js") + target_link_libraries(WASM::WASM INTERFACE "--shell-file ${CMAKE_SOURCE_DIR}/os/emscripten/shell.html") + + # Build the .html (which builds the .js, .wasm, and .data too). + set_target_properties(openttd PROPERTIES SUFFIX ".html") + target_link_libraries(openttd WASM::WASM) +endif() + if(NOT PERSONAL_DIR STREQUAL "(not set)") add_definitions( -DWITH_PERSONAL_DIR diff --git a/cmake/Options.cmake b/cmake/Options.cmake index 977d54f061..c94a193b32 100644 --- a/cmake/Options.cmake +++ b/cmake/Options.cmake @@ -55,7 +55,13 @@ function(set_options) option(OPTION_DEDICATED "Build dedicated server only (no GUI)" OFF) option(OPTION_INSTALL_FHS "Install with Filesystem Hierarchy Standard folders" ${DEFAULT_OPTION_INSTALL_FHS}) option(OPTION_USE_ASSERTS "Use assertions; leave enabled for nightlies, betas, and RCs" ON) - option(OPTION_USE_THREADS "Use threads" ON) + if(EMSCRIPTEN) + # Although pthreads is supported, it is not in a way yet that is + # useful for us. + option(OPTION_USE_THREADS "Use threads" OFF) + else() + option(OPTION_USE_THREADS "Use threads" ON) + endif() option(OPTION_USE_NSIS "Use NSIS to create windows installer; enable only for stable releases" OFF) option(OPTION_TOOLS_ONLY "Build only tools target" OFF) option(OPTION_DOCS_ONLY "Build only docs target" OFF) diff --git a/os/emscripten/Dockerfile b/os/emscripten/Dockerfile new file mode 100644 index 0000000000..1278a088ff --- /dev/null +++ b/os/emscripten/Dockerfile @@ -0,0 +1,4 @@ +FROM emscripten/emsdk + +COPY emsdk-liblzma.patch / +RUN cd /emsdk/upstream/emscripten && patch -p1 < /emsdk-liblzma.patch diff --git a/os/emscripten/README.md b/os/emscripten/README.md new file mode 100644 index 0000000000..4c5d7508cc --- /dev/null +++ b/os/emscripten/README.md @@ -0,0 +1,40 @@ +## How to build with Emscripten + +Building with Emscripten works with emsdk 2.0.10 and above. + +Currently there is no LibLZMA support upstream; for this we suggest to apply +the provided patch in this folder to your emsdk installation. + +For convenience, a Dockerfile is supplied that does this patches for you +against upstream emsdk docker. Best way to use it: + +Build the docker image: +``` + docker build -t emsdk-lzma . +``` + +Build the host tools first: +``` + mkdir build-host + docker run -it --rm -v $(pwd):$(pwd) -u $(id -u):$(id -g) --workdir $(pwd)/build-host emsdk-lzma cmake .. -DOPTION_TOOLS_ONLY=ON + docker run -it --rm -v $(pwd):$(pwd) -u $(id -u):$(id -g) --workdir $(pwd)/build-host emsdk-lzma make -j5 tools +``` + +Next, build the game with emscripten: + +``` + mkdir build + docker run -it --rm -v $(pwd):$(pwd) -u $(id -u):$(id -g) --workdir $(pwd)/build emsdk-lzma emcmake cmake .. -DHOST_BINARY_DIR=$(pwd)/build-host -DCMAKE_BUILD_TYPE=RelWithDebInfo -DOPTION_USE_ASSERTS=OFF + docker run -it --rm -v $(pwd):$(pwd) -u $(id -u):$(id -g) --workdir $(pwd)/build emsdk-lzma emmake make -j5 +``` + +And now you have in your build folder files like "openttd.html". + +To run it locally, you would have to start a local webserver, like: + +``` + cd build + python3 -m http.server +```` + +Now you can play the game via http://127.0.0.1:8000/openttd.html . diff --git a/os/emscripten/cmake/FindLibLZMA.cmake b/os/emscripten/cmake/FindLibLZMA.cmake new file mode 100644 index 0000000000..99d1ca640a --- /dev/null +++ b/os/emscripten/cmake/FindLibLZMA.cmake @@ -0,0 +1,20 @@ +# LibLZMA is a recent addition to the emscripten SDK, so it is possible +# someone hasn't updated his SDK yet. Test out if the SDK supports LibLZMA. +include(CheckCXXSourceCompiles) +set(CMAKE_REQUIRED_FLAGS "-sUSE_LIBLZMA=1") + +check_cxx_source_compiles(" + #include + int main() { return 0; }" + LIBLZMA_FOUND +) + +if (LIBLZMA_FOUND) + add_library(LibLZMA::LibLZMA INTERFACE IMPORTED) + set_target_properties(LibLZMA::LibLZMA PROPERTIES + INTERFACE_COMPILE_OPTIONS "-sUSE_LIBLZMA=1" + INTERFACE_LINK_LIBRARIES "-sUSE_LIBLZMA=1" + ) +else() + message(WARNING "You are using an emscripten SDK without LibLZMA support. Many savegames won't be able to load in OpenTTD. Please apply 'emsdk-liblzma.patch' to your local emsdk installation.") +endif() diff --git a/os/emscripten/cmake/FindPNG.cmake b/os/emscripten/cmake/FindPNG.cmake new file mode 100644 index 0000000000..2616af33d9 --- /dev/null +++ b/os/emscripten/cmake/FindPNG.cmake @@ -0,0 +1,7 @@ +add_library(PNG::PNG INTERFACE IMPORTED) +set_target_properties(PNG::PNG PROPERTIES + INTERFACE_COMPILE_OPTIONS "-sUSE_LIBPNG=1" + INTERFACE_LINK_LIBRARIES "-sUSE_LIBPNG=1" +) + +set(PNG_FOUND on) diff --git a/os/emscripten/cmake/FindSDL2.cmake b/os/emscripten/cmake/FindSDL2.cmake new file mode 100644 index 0000000000..54553958b6 --- /dev/null +++ b/os/emscripten/cmake/FindSDL2.cmake @@ -0,0 +1,7 @@ +add_library(SDL2::SDL2 INTERFACE IMPORTED) +set_target_properties(SDL2::SDL2 PROPERTIES + INTERFACE_COMPILE_OPTIONS "-sUSE_SDL=2" + INTERFACE_LINK_LIBRARIES "-sUSE_SDL=2" +) + +set(SDL2_FOUND on) diff --git a/os/emscripten/cmake/FindZLIB.cmake b/os/emscripten/cmake/FindZLIB.cmake new file mode 100644 index 0000000000..2ade2ba1b0 --- /dev/null +++ b/os/emscripten/cmake/FindZLIB.cmake @@ -0,0 +1,7 @@ +add_library(ZLIB::ZLIB INTERFACE IMPORTED) +set_target_properties(ZLIB::ZLIB PROPERTIES + INTERFACE_COMPILE_OPTIONS "-sUSE_ZLIB=1" + INTERFACE_LINK_LIBRARIES "-sUSE_ZLIB=1" +) + +set(ZLIB_FOUND on) diff --git a/os/emscripten/emsdk-liblzma.patch b/os/emscripten/emsdk-liblzma.patch new file mode 100644 index 0000000000..103adae0cc --- /dev/null +++ b/os/emscripten/emsdk-liblzma.patch @@ -0,0 +1,213 @@ +From 90dd4d4c6b1cedec338ff5b375fffca93700f7bc Mon Sep 17 00:00:00 2001 +From: milek7 +Date: Tue, 8 Dec 2020 01:03:31 +0100 +Subject: [PATCH] Add liblzma port + +--- +Source: https://github.com/emscripten-core/emscripten/pull/12990 + +Modifed by OpenTTD to have the bare minimum needed to work. Otherwise there +are constantly conflicts when trying to apply this patch to different versions +of emsdk. + +diff --git a/embuilder.py b/embuilder.py +index 818262190ed..ab7d5adb7b2 100755 +--- a/embuilder.py ++++ b/embuilder.py +@@ -60,6 +60,7 @@ + 'harfbuzz', + 'icu', + 'libjpeg', ++ 'liblzma', + 'libpng', + 'ogg', + 'regal', +@@ -197,6 +198,8 @@ def main(): + build_port('ogg', libname('libogg')) + elif what == 'libjpeg': + build_port('libjpeg', libname('libjpeg')) ++ elif what == 'liblzma': ++ build_port('liblzma', libname('liblzma')) + elif what == 'libpng': + build_port('libpng', libname('libpng')) + elif what == 'sdl2': +diff --git a/src/settings.js b/src/settings.js +index 61cd98939ba..be6fcb678c6 100644 +--- a/src/settings.js ++++ b/src/settings.js +@@ -1197,6 +1197,9 @@ var USE_BZIP2 = 0; + // 1 = use libjpeg from emscripten-ports + var USE_LIBJPEG = 0; + ++// 1 = use liblzma from emscripten-ports ++var USE_LIBLZMA = 0; ++ + // 1 = use libpng from emscripten-ports + var USE_LIBPNG = 0; + +diff --git a/tools/ports/liblzma.py b/tools/ports/liblzma.py +new file mode 100644 +index 00000000000..e9567ef36ff +--- /dev/null ++++ b/tools/ports/liblzma.py +@@ -0,0 +1,160 @@ ++# Copyright 2020 The Emscripten Authors. All rights reserved. ++# Emscripten is available under two separate licenses, the MIT license and the ++# University of Illinois/NCSA Open Source License. Both these licenses can be ++# found in the LICENSE file. ++ ++import os ++import shutil ++ ++VERSION = '5.2.5' ++HASH = '7443674247deda2935220fbc4dfc7665e5bb5a260be8ad858c8bd7d7b9f0f868f04ea45e62eb17c0a5e6a2de7c7500ad2d201e2d668c48ca29bd9eea5a73a3ce' ++ ++ ++def needed(settings): ++ return settings.USE_LIBLZMA ++ ++ ++def get(ports, settings, shared): ++ libname = ports.get_lib_name('liblzma') ++ ports.fetch_project('liblzma', 'https://tukaani.org/xz/xz-' + VERSION + '.tar.gz', 'xz-' + VERSION, sha512hash=HASH) ++ ++ def create(): ++ ports.clear_project_build('liblzma') ++ ++ source_path = os.path.join(ports.get_dir(), 'liblzma', 'xz-' + VERSION) ++ dest_path = os.path.join(ports.get_build_dir(), 'liblzma') ++ ++ shared.try_delete(dest_path) ++ os.makedirs(dest_path) ++ shutil.rmtree(dest_path, ignore_errors=True) ++ shutil.copytree(source_path, dest_path) ++ ++ build_flags = ['-DHAVE_CONFIG_H', '-DTUKLIB_SYMBOL_PREFIX=lzma_', '-fvisibility=hidden'] ++ exclude_dirs = ['xzdec', 'xz', 'lzmainfo'] ++ exclude_files = ['crc32_small.c', 'crc64_small.c', 'crc32_tablegen.c', 'crc64_tablegen.c', 'price_tablegen.c', 'fastpos_tablegen.c' ++ 'tuklib_exit.c', 'tuklib_mbstr_fw.c', 'tuklib_mbstr_width.c', 'tuklib_open_stdxxx.c', 'tuklib_progname.c'] ++ include_dirs_rel = ['../common', 'api', 'common', 'check', 'lz', 'rangecoder', 'lzma', 'delta', 'simple'] ++ ++ open(os.path.join(dest_path, 'src', 'config.h'), 'w').write(config_h) ++ ++ final = os.path.join(dest_path, libname) ++ include_dirs = [os.path.join(dest_path, 'src', 'liblzma', p) for p in include_dirs_rel] ++ ports.build_port(os.path.join(dest_path, 'src'), final, flags=build_flags, exclude_dirs=exclude_dirs, exclude_files=exclude_files, includes=include_dirs) ++ ++ ports.install_headers(os.path.join(dest_path, 'src', 'liblzma', 'api'), 'lzma.h') ++ ports.install_headers(os.path.join(dest_path, 'src', 'liblzma', 'api', 'lzma'), '*.h', 'lzma') ++ ++ return final ++ ++ return [shared.Cache.get(libname, create, what='port')] ++ ++ ++def clear(ports, settings, shared): ++ shared.Cache.erase_file(ports.get_lib_name('liblzma')) ++ ++ ++def process_args(ports): ++ return [] ++ ++ ++def show(): ++ return 'liblzma (USE_LIBLZMA=1; public domain)' ++ ++ ++config_h = r''' ++#define ASSUME_RAM 128 ++#define ENABLE_NLS 1 ++#define HAVE_CHECK_CRC32 1 ++#define HAVE_CHECK_CRC64 1 ++#define HAVE_CHECK_SHA256 1 ++#define HAVE_CLOCK_GETTIME 1 ++#define HAVE_DCGETTEXT 1 ++#define HAVE_DECL_CLOCK_MONOTONIC 1 ++#define HAVE_DECL_PROGRAM_INVOCATION_NAME 1 ++#define HAVE_DECODERS 1 ++#define HAVE_DECODER_ARM 1 ++#define HAVE_DECODER_ARMTHUMB 1 ++#define HAVE_DECODER_DELTA 1 ++#define HAVE_DECODER_IA64 1 ++#define HAVE_DECODER_LZMA1 1 ++#define HAVE_DECODER_LZMA2 1 ++#define HAVE_DECODER_POWERPC 1 ++#define HAVE_DECODER_SPARC 1 ++#define HAVE_DECODER_X86 1 ++#define HAVE_DLFCN_H 1 ++#define HAVE_ENCODERS 1 ++#define HAVE_ENCODER_ARM 1 ++#define HAVE_ENCODER_ARMTHUMB 1 ++#define HAVE_ENCODER_DELTA 1 ++#define HAVE_ENCODER_IA64 1 ++#define HAVE_ENCODER_LZMA1 1 ++#define HAVE_ENCODER_LZMA2 1 ++#define HAVE_ENCODER_POWERPC 1 ++#define HAVE_ENCODER_SPARC 1 ++#define HAVE_ENCODER_X86 1 ++#define HAVE_FCNTL_H 1 ++#define HAVE_FUTIMENS 1 ++#define HAVE_GETOPT_H 1 ++#define HAVE_GETOPT_LONG 1 ++#define HAVE_GETTEXT 1 ++#define HAVE_IMMINTRIN_H 1 ++#define HAVE_INTTYPES_H 1 ++#define HAVE_LIMITS_H 1 ++#define HAVE_MBRTOWC 1 ++#define HAVE_MEMORY_H 1 ++#define HAVE_MF_BT2 1 ++#define HAVE_MF_BT3 1 ++#define HAVE_MF_BT4 1 ++#define HAVE_MF_HC3 1 ++#define HAVE_MF_HC4 1 ++#define HAVE_OPTRESET 1 ++#define HAVE_POSIX_FADVISE 1 ++#define HAVE_PTHREAD_CONDATTR_SETCLOCK 1 ++#define HAVE_PTHREAD_PRIO_INHERIT 1 ++#define HAVE_STDBOOL_H 1 ++#define HAVE_STDINT_H 1 ++#define HAVE_STDLIB_H 1 ++#define HAVE_STRINGS_H 1 ++#define HAVE_STRING_H 1 ++#define HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC 1 ++#define HAVE_SYS_PARAM_H 1 ++#define HAVE_SYS_STAT_H 1 ++#define HAVE_SYS_TIME_H 1 ++#define HAVE_SYS_TYPES_H 1 ++#define HAVE_UINTPTR_T 1 ++#define HAVE_UNISTD_H 1 ++#define HAVE_VISIBILITY 1 ++#define HAVE_WCWIDTH 1 ++#define HAVE__BOOL 1 ++#define HAVE___BUILTIN_ASSUME_ALIGNED 1 ++#define HAVE___BUILTIN_BSWAPXX 1 ++#define MYTHREAD_POSIX 1 ++#define NDEBUG 1 ++#define PACKAGE "xz" ++#define PACKAGE_BUGREPORT "lasse.collin@tukaani.org" ++#define PACKAGE_NAME "XZ Utils" ++#define PACKAGE_STRING "XZ Utils 5.2.5" ++#define PACKAGE_TARNAME "xz" ++#define PACKAGE_VERSION "5.2.5" ++#define SIZEOF_SIZE_T 4 ++#define STDC_HEADERS 1 ++#define TUKLIB_CPUCORES_SYSCONF 1 ++#define TUKLIB_FAST_UNALIGNED_ACCESS 1 ++#define TUKLIB_PHYSMEM_SYSCONF 1 ++#ifndef _ALL_SOURCE ++# define _ALL_SOURCE 1 ++#endif ++#ifndef _GNU_SOURCE ++# define _GNU_SOURCE 1 ++#endif ++#ifndef _POSIX_PTHREAD_SEMANTICS ++# define _POSIX_PTHREAD_SEMANTICS 1 ++#endif ++#ifndef _TANDEM_SOURCE ++# define _TANDEM_SOURCE 1 ++#endif ++#ifndef __EXTENSIONS__ ++# define __EXTENSIONS__ 1 ++#endif ++#define VERSION "5.2.5" ++''' diff --git a/os/emscripten/loading.png b/os/emscripten/loading.png new file mode 100755 index 0000000000000000000000000000000000000000..d4c4aaf75e34c7e22018990178313bc0fcf4a6fc GIT binary patch literal 4824 zcmV;}5-076P)^^xTz~KLFHKpJMWQ(}P-8X%BmtxU-w2R~Y&KcUtaQ&@Z^DNb+|2odvpK+l zKmYF!Pxj%*{okbcHP%18$X|VM$#kTL6Tr^C9P^@L`v+IwPUMev&^!9Q77yL^CN7^d zcQ5I;Zjx*KnV|@;zjcoyq_yt~l=m^bS(*^a7vJakQP#~0u}cOwmejSc<= z=w-UNrdM4W?xY{%YKq-)u|uaCLO=#@Mkzh3=~6Dn8ai@SlxrmMu$&X7GyMI(zT2gT zp&okIyN<@|QA8n3SxW9KX;IcOzZ&fY+p?b8E&F`Y4{3NO!M7aVYyQog3k`Hk3dJAb zytgAtx7y7-FiBw+va@Z|8TGn}S<-+pakSxK%Zu?khDDFvNHMo0aH6-EDT+8|nwXUi zqw0ZCIL2E@rC&S-1bAe<&-pseft;MbtR0pt!}$Hb?8*KQ!>>{Ws{&VEItrsXEYbGf6Q3K{%Nk7N!rc+1wQaN3Tp(Yh z*+iMrqyt@ z3?9}iWprPwVKOG@?T#b~$Hg($q_!_NhD_164^zr?-k?7t^|6KD5>n!%VZOp~oASNz zdtW>a&HdrVx`_{FR;a?=nlsECkr?x(B=-yIZS;cWE`d2@ z9h?KEDgrka^#B587vD!pLX`EkOR$iBA?+{%7kjjL%~UOB(+r(DU*}sj-jt4ia12)S zDZ;n^W46yna(rFmFW0HreNyRR`R706WjX!N5&uEYq1h+5XZc)3$IA?#&FhA*UUu}$ z**w#!0sFF&TVxxTD%M5dwiPfMa0Wpo|*dK|{aP^{UCh$7lSQNMo z5(Vy|atiUt!a0lZhJuP!Gq!}7f}>Iopbu|e6C~61jpv_%!F$->1rz!BiZ|Oka(qej zkNtJjq_;0SL%Q7DeEbPKPMf!Bh+$gGUXuP+{0%L;8hp#)2cLb5?M=u}u&A~5tZ3P=6LYW8=8fp1#4ljpLK|D$ z=J1Y!q+Qw|37B#hozW8eU{FYuoq*#W%E=@+AHc$pkP%&>NO4s39YBD_sf~P`i*0_l z2$~{Yq5MK2$AA%^+OcToPDzh{_}BNAUaLEun(xE7vE|qKf_{@$3U19LYs|AqS1Wx6Wbi%lQJf&0zOe`CU|;16+>CGX!_cXjBhwbNv}5kGlD z<_n3z4auJ%k$U_vy4MUG3w+Dh=PsOLe=k<8yhNz4LUIyeYe+5Kz+w5917Xs4sY5-q zIWl>#`lYjYNdk09l4ba)t-?r*iz9)oDkONs+<_+Z9B7Drz@vW^XNTzNc*mHJl^jpR5?c_dK~O*ePbl9+Yiidd1Zq>YkOZ{=X)Rd2}vryUu#G-^_o zAi!b37WV;3V?6{2vH|b^Gj`9%8va>0f>>pw4Y~?T%cp! zI2(HQUFvY>*(~Im=aLsQ)R7Gu0TCrOO%u~(u8rf>B*h84bp+N9k1*f>Jp?GtkP2|t z7XS3W5*7|Q*}bS=n$x>u#uxGLi?S)+`0ByFZ8cs}vT~&LQv~BV<$H5Y;QI7BUybt> zDg%@0H;-^4yX2vJ+{Cx(u92r$*n5J+!u|-^84^ofDeX-4j`(zOo$s?|8Pd+J*}DLQ z9r>(nEOH{;(pze_L3D&8lF!h`v3)nY#%Iq7E{#_RP!FuLD0Z8)(7623pRW}xei4yh z)BVDKY0sassuy8paD%drv?t?0P^>Jx|VS@TZx)sv2B{N&FaQc%x5*bK8kW}@L*9#5Fso8kFnZD zD-|?aMx65%6V_P-Q6Q9Ka=+f*%wVoia$U|ulQEf(zIaH?_t*54@I80?20g~4Xy!IT zr4+vl{cbT+4n7X>T%@a#9mt=9VJeFDy_|t!A$|24`9Al3t|uR%&BJRCkl7SFN!yuT zm^%n_r|jJOrl3b&NK7!{c503FGLCX$c5xP@tPt0B@RJ-&`~+k^YX{>FX*^CAK}Lx0 z7l1$f_jdYYo4k8DJ$(?n$2I=q%g4lg4+Du;V~_>eJS6tLWM3Dp6TEKbF5PvRe=pgi zG!jHL19_VaD7LzxI?S5&XjqkZaw2t53v zp&({84Zap(ALv*wMjDwC27u~a&A>MG?`bvx^K~9B@BHRu7RZ)Er`W7Luh9w<(x#QZR`--*v>dqvH5GLo-* z`Lq`Mi+n9>`@;2&q~Fkd7_UacrhRp%zW+~Zjt)M3Z_#`+oSg)5yhsXg-!7rrfWQr?LKSs_npD^rZ}% zegAzl{5OX9Cvf>8=m>AmzRyuQ?y`eh()hOD{Ct`8^6Sg*_oo4kkK>s@)`yuvI_UiW zsSZW7D@hRuLY}4L9W_ZB@v5ZW1EoL|(N&p5f-1xfVj>av-OqcRUX~L@>B#)%Mg5ZI zfP*95J=*$iBL6h68#OwR3}KF8Jcl{9`L|lVGI`&F)3@#k%m@Y~sws=Nag@nWpRbE3 zrd7Ni;e$L!DDPu*Tw1V%-dr=|bmWWscf7~N^Js9Ov(^*r*5W=g_q}TvEO5LqD6r6= zJXvT^G_g>?Zp*TPKw-QBfnaE4xI&ZS_dg%cIue0}8W^SPqc>Rs2J!X zRBvuP))DsyRI~~V9IZF;jbjF+tpoocc13j};xjBcX>-iIL{uQsGtiWB3N zw-~9FL!-cX47T|G=N(QjL+Cfzt)+FwZ?AKcpp_*xb*t;tq~#^G-=+68Ti!49tI+RH z@&PjgMhc_3xRuid(o~)6$nuBfCD!~+_!~{$Xmwtc&iD>;neOKt-=gVY=G=EB z&GWV4xMFTktG8yHw6+EKVA)AuW3t>T_JRWL=VgX1t@ukKIPlwrkm+m zfva&!L0O3#?yI?hL~nRHLf+VAKWW7PukeScm>2c}O_^p0-+ugZgp*995WB#sNc5*d_S$zb)=%Ye<*z+gbc_C;qEe0mc{RR|YrK zRnPThUQB6kRD2b3lipq>+&?ufm{D?jp7p}#kFZZg^^$5mHn{WlG`vE&VZ{K^3b=F{0iNEa)5n5G zF1s2sOZuofjD+-3AR%QqYpErD>U-1M#n6eXGACuZN`2r;0ssIiI+zW9SmX8IYnXQc z2IjV-y(aQI2=M4GxZc0&=bM`4`S(V7KP01_tMm|9zg$p^Zj^Y4Sry7xyxgSVcr_1V zbK&|<;umHQn!JH|lcF@KW=@I}?_2YHz2+s!K=QD-frA3&jU9wBfYTTftG0n5zF^4L zndcG*z;m<$*&9A-|CHw6+Rq8tg5CCBHV;!e1UJtSn=c$9&T~Vy6 zyBVo`v{zJblAG%&W#BanIgaL_5^A=|O`|TEvU(%ld+`S5jgK1<4m7^TVLMKifOwLN z2A3Qi18rB6bM@L~qn8nJg@!%FF)@1y&jWg)v0*+^bvpUM&?%`TwHy*dAz`jUmRqYe zyLpJF?C?~ltk!U$sPh6uYiNbLL zEyj4!3VQDNh4|DO%){D3!(vj28-B7@Pc$jDg<1x{dk^Jbe_}?Acc04Nhktz8|Ba>% z^Xt)G0|=p~uJ{umi|eD{ak8F(%tv$SeOH3dia%UBVL@AwQu?O%Z3aF>?v}3Je49Y3 zgAzPb9B29()BIImVpjBhzXow%i5#%F}QF0000 + + + + + OpenTTD + + + +
+
+
+ Loading ... +
+
+
+
+
+
+
+ Warning: savegames are stored in the Indexed DB of your browser.
Your browser can delete savegames without notice! +
+
+
+ +
+ + + {{{ SCRIPT }}} + + diff --git a/src/fontcache.cpp b/src/fontcache.cpp index 051c4ee1db..79683d193c 100644 --- a/src/fontcache.cpp +++ b/src/fontcache.cpp @@ -26,7 +26,6 @@ #include "safeguards.h" static const int ASCII_LETTERSTART = 32; ///< First printable ASCII letter. -static const int MAX_FONT_SIZE = 72; ///< Maximum font size. /** Default heights for the different sizes of fonts. */ static const int _default_font_height[FS_END] = {10, 6, 18, 10}; @@ -202,6 +201,8 @@ bool SpriteFontCache::GetDrawGlyphShadow() FreeTypeSettings _freetype; +static const int MAX_FONT_SIZE = 72; ///< Maximum font size. + static const byte FACE_COLOUR = 1; static const byte SHADOW_COLOUR = 2; diff --git a/src/gfx_type.h b/src/gfx_type.h index 6fca2228df..452bc2c7e8 100644 --- a/src/gfx_type.h +++ b/src/gfx_type.h @@ -162,7 +162,9 @@ struct DrawPixelInfo { union Colour { uint32 data; ///< Conversion of the channel information to a 32 bit number. struct { -#if TTD_ENDIAN == TTD_BIG_ENDIAN +#if defined(__EMSCRIPTEN__) + uint8 r, g, b, a; ///< colour channels as used in browsers +#elif TTD_ENDIAN == TTD_BIG_ENDIAN uint8 a, r, g, b; ///< colour channels in BE order #else uint8 b, g, r, a; ///< colour channels in LE order @@ -177,7 +179,9 @@ union Colour { * @param a The channel for the alpha/transparency. */ Colour(uint8 r, uint8 g, uint8 b, uint8 a = 0xFF) : -#if TTD_ENDIAN == TTD_BIG_ENDIAN +#if defined(__EMSCRIPTEN__) + r(r), g(g), b(b), a(a) +#elif TTD_ENDIAN == TTD_BIG_ENDIAN a(a), r(r), g(g), b(b) #else b(b), g(g), r(r), a(a) diff --git a/src/ini.cpp b/src/ini.cpp index 6948bc1ea3..fc9b1e8fd2 100644 --- a/src/ini.cpp +++ b/src/ini.cpp @@ -13,6 +13,9 @@ #include "string_func.h" #include "fileio_func.h" #include +#ifdef __EMSCRIPTEN__ +# include +#endif #if (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309L) || (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 500) # include @@ -115,6 +118,10 @@ bool IniFile::SaveToDisk(const char *filename) } #endif +#ifdef __EMSCRIPTEN__ + EM_ASM(if (window["openttd_syncfs"]) openttd_syncfs()); +#endif + return true; } diff --git a/src/network/core/address.cpp b/src/network/core/address.cpp index c2fecc7ff2..1aaa0b5fba 100644 --- a/src/network/core/address.cpp +++ b/src/network/core/address.cpp @@ -299,7 +299,15 @@ static SOCKET ConnectLoopProc(addrinfo *runp) if (!SetNoDelay(sock)) DEBUG(net, 1, "[%s] setting TCP_NODELAY failed", type); - if (connect(sock, runp->ai_addr, (int)runp->ai_addrlen) != 0) { + int err = connect(sock, runp->ai_addr, (int)runp->ai_addrlen); +#ifdef __EMSCRIPTEN__ + /* Emscripten is asynchronous, and as such a connect() is still in + * progress by the time the call returns. */ + if (err != 0 && errno != EINPROGRESS) +#else + if (err != 0) +#endif + { DEBUG(net, 1, "[%s] could not connect %s socket: %s", type, family, strerror(errno)); closesocket(sock); return INVALID_SOCKET; diff --git a/src/network/core/os_abstraction.h b/src/network/core/os_abstraction.h index 01ab68b278..be8b8f919a 100644 --- a/src/network/core/os_abstraction.h +++ b/src/network/core/os_abstraction.h @@ -83,6 +83,16 @@ typedef unsigned long in_addr_t; # include # include # include + +# if defined(__EMSCRIPTEN__) +/* Emscripten doesn't support AI_ADDRCONFIG and errors out on it. */ +# undef AI_ADDRCONFIG +# define AI_ADDRCONFIG 0 +/* Emscripten says it supports FD_SETSIZE fds, but it really only supports 64. + * https://github.com/emscripten-core/emscripten/issues/1711 */ +# undef FD_SETSIZE +# define FD_SETSIZE 64 +# endif #endif /* UNIX */ /* OS/2 stuff */ @@ -148,12 +158,16 @@ typedef unsigned long in_addr_t; */ static inline bool SetNonBlocking(SOCKET d) { -#ifdef _WIN32 - u_long nonblocking = 1; +#ifdef __EMSCRIPTEN__ + return true; #else +# ifdef _WIN32 + u_long nonblocking = 1; +# else int nonblocking = 1; -#endif +# endif return ioctlsocket(d, FIONBIO, &nonblocking) == 0; +#endif } /** @@ -163,10 +177,14 @@ static inline bool SetNonBlocking(SOCKET d) */ static inline bool SetNoDelay(SOCKET d) { +#ifdef __EMSCRIPTEN__ + return true; +#else /* XXX should this be done at all? */ int b = 1; /* The (const char*) cast is needed for windows */ return setsockopt(d, IPPROTO_TCP, TCP_NODELAY, (const char*)&b, sizeof(b)) == 0; +#endif } /* Make sure these structures have the size we expect them to be */ diff --git a/src/network/network.cpp b/src/network/network.cpp index 0e3d086301..a100b6b959 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -1154,3 +1154,14 @@ bool IsNetworkCompatibleVersion(const char *other) const char *hash2 = ExtractNetworkRevisionHash(other); return hash1 && hash2 && (strncmp(hash1, hash2, GITHASH_SUFFIX_LEN) == 0); } + +#ifdef __EMSCRIPTEN__ +extern "C" { + +void CDECL em_openttd_add_server(const char *host, int port) +{ + NetworkUDPQueryServer(NetworkAddress(host, port), true); +} + +} +#endif diff --git a/src/network/network_content.cpp b/src/network/network_content.cpp index 5e401d3e92..0140d3ef20 100644 --- a/src/network/network_content.cpp +++ b/src/network/network_content.cpp @@ -23,6 +23,10 @@ #include #endif +#ifdef __EMSCRIPTEN__ +# include +#endif + #include "../safeguards.h" extern bool HasScenario(const ContentInfo *ci, bool md5sum); @@ -289,6 +293,13 @@ void ClientNetworkContentSocketHandler::DownloadSelectedContent(uint &files, uin { bytes = 0; +#ifdef __EMSCRIPTEN__ + /* Emscripten is loaded via an HTTPS connection. As such, it is very + * difficult to make HTTP connections. So always use the TCP method of + * downloading content. */ + fallback = true; +#endif + ContentIDList content; for (const ContentInfo *ci : this->infos) { if (!ci->IsSelected() || ci->state == ContentInfo::ALREADY_HERE) continue; @@ -535,6 +546,10 @@ void ClientNetworkContentSocketHandler::AfterDownload() unlink(GetFullFilename(this->curInfo, false)); } +#ifdef __EMSCRIPTEN__ + EM_ASM(if (window["openttd_syncfs"]) openttd_syncfs()); +#endif + this->OnDownloadComplete(this->curInfo->id); } else { ShowErrorMessage(STR_CONTENT_ERROR_COULD_NOT_EXTRACT, INVALID_STRING_ID, WL_ERROR); diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index c430c47e5e..47bf8fb69c 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -39,6 +39,9 @@ #include "../safeguards.h" +#ifdef __EMSCRIPTEN__ +# include +#endif static void ShowNetworkStartServerWindow(); static void ShowNetworkLobbyWindow(NetworkGameList *ngl); @@ -475,6 +478,14 @@ 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 + * 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. */ +#ifdef __EMSCRIPTEN__ + EM_ASM(if (window["openttd_server_list"]) openttd_server_list()); +#endif + this->last_joined = NetworkGameListAddItem(NetworkAddress(_settings_client.network.last_host, _settings_client.network.last_port)); this->server = this->last_joined; if (this->last_joined != nullptr) NetworkUDPQueryServer(this->last_joined->address); @@ -615,6 +626,12 @@ public: this->GetWidget(WID_NG_NEWGRF_SEL)->SetDisplayedPlane(sel == nullptr || !sel->online || sel->info.grfconfig == nullptr); this->GetWidget(WID_NG_NEWGRF_MISSING_SEL)->SetDisplayedPlane(sel == nullptr || !sel->online || sel->info.grfconfig == nullptr || !sel->info.version_compatible || sel->info.compatible); +#ifdef __EMSCRIPTEN__ + this->SetWidgetDisabledState(WID_NG_FIND, true); + this->SetWidgetDisabledState(WID_NG_ADD, true); + this->SetWidgetDisabledState(WID_NG_START, true); +#endif + this->DrawWidgets(); } diff --git a/src/openttd.cpp b/src/openttd.cpp index 4aeed39282..9cc5d2f205 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -73,6 +73,11 @@ #include "safeguards.h" +#ifdef __EMSCRIPTEN__ +# include +# include +#endif + void CallLandscapeTick(); void IncreaseDate(); void DoPaletteAnimations(); @@ -104,6 +109,15 @@ void CDECL usererror(const char *s, ...) ShowOSErrorBox(buf, false); if (VideoDriver::GetInstance() != nullptr) VideoDriver::GetInstance()->Stop(); +#ifdef __EMSCRIPTEN__ + emscripten_exit_pointerlock(); + /* In effect, the game ends here. As emscripten_set_main_loop() caused + * the stack to be unwound, the code after MainLoop() in + * openttd_main() is never executed. */ + EM_ASM(if (window["openttd_syncfs"]) openttd_syncfs()); + EM_ASM(if (window["openttd_abort"]) openttd_abort()); +#endif + exit(1); } diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index 999a381d71..5288f9047d 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -45,6 +45,9 @@ #include "../error.h" #include #include +#ifdef __EMSCRIPTEN__ +# include +#endif #include "table/strings.h" @@ -2495,6 +2498,10 @@ static void SaveFileDone() InvalidateWindowData(WC_STATUS_BAR, 0, SBI_SAVELOAD_FINISH); _sl.saveinprogress = false; + +#ifdef __EMSCRIPTEN__ + EM_ASM(if (window["openttd_syncfs"]) openttd_syncfs()); +#endif } /** Set the error message from outside of the actual loading/saving of the game (AfterLoadGame and friends) */ diff --git a/src/video/sdl2_v.cpp b/src/video/sdl2_v.cpp index 09d0e8a0bc..68b0aa983d 100644 --- a/src/video/sdl2_v.cpp +++ b/src/video/sdl2_v.cpp @@ -27,6 +27,10 @@ #include #include #include +#ifdef __EMSCRIPTEN__ +# include +# include +#endif #include "../safeguards.h" @@ -673,7 +677,19 @@ void VideoDriver_SDL::LoopOnce() InteractiveRandom(); // randomness while (PollEvent() == -1) {} - if (_exit_game) return; + if (_exit_game) { +#ifdef __EMSCRIPTEN__ + /* Emscripten is event-driven, and as such the main loop is inside + * the browser. So if _exit_game goes true, the main loop ends (the + * cancel call), but we still have to call the cleanup that is + * normally done at the end of the main loop for non-Emscripten. + * After that, Emscripten just halts, and the HTML shows a nice + * "bye, see you next time" message. */ + emscripten_cancel_main_loop(); + MainLoopCleanup(); +#endif + return; + } mod = SDL_GetModState(); keys = SDL_GetKeyboardState(&numkeys); @@ -722,9 +738,17 @@ void VideoDriver_SDL::LoopOnce() _local_palette = _cur_palette; } else { /* Release the thread while sleeping */ - if (_draw_mutex != nullptr) draw_lock.unlock(); - CSleep(1); - if (_draw_mutex != nullptr) draw_lock.lock(); + if (_draw_mutex != nullptr) { + draw_lock.unlock(); + CSleep(1); + draw_lock.lock(); + } else { +/* Emscripten is running an event-based mainloop; there is already some + * downtime between each iteration, so no need to sleep. */ +#ifndef __EMSCRIPTEN__ + CSleep(1); +#endif + } NetworkDrawChatMessage(); DrawMouseCursor(); @@ -778,6 +802,10 @@ void VideoDriver_SDL::MainLoop() DEBUG(driver, 1, "SDL2: using %sthreads", _draw_threaded ? "" : "no "); +#ifdef __EMSCRIPTEN__ + /* Run the main loop event-driven, based on RequestAnimationFrame. */ + emscripten_set_main_loop_arg(&this->EmscriptenLoop, this, 0, 1); +#else while (!_exit_game) { LoopOnce(); } @@ -803,6 +831,15 @@ void VideoDriver_SDL::MainLoopCleanup() _draw_mutex = nullptr; _draw_signal = nullptr; } + +#ifdef __EMSCRIPTEN__ + emscripten_exit_pointerlock(); + /* In effect, the game ends here. As emscripten_set_main_loop() caused + * the stack to be unwound, the code after MainLoop() in + * openttd_main() is never executed. */ + EM_ASM(if (window["openttd_syncfs"]) openttd_syncfs()); + EM_ASM(if (window["openttd_exit"]) openttd_exit()); +#endif } bool VideoDriver_SDL::ChangeResolution(int w, int h) diff --git a/src/video/sdl2_v.h b/src/video/sdl2_v.h index 6318c403f7..c2ac87a062 100644 --- a/src/video/sdl2_v.h +++ b/src/video/sdl2_v.h @@ -46,6 +46,11 @@ private: void MainLoopCleanup(); bool CreateMainSurface(uint w, uint h, bool resize); +#ifdef __EMSCRIPTEN__ + /* Convert a constant pointer back to a non-constant pointer to a member function. */ + static void EmscriptenLoop(void *self) { ((VideoDriver_SDL *)self)->LoopOnce(); } +#endif + /** * This is true to indicate that keyboard input is in text input mode, and SDL_TEXTINPUT events are enabled. */ From d5b9f7ac37c7d27d1ffe50e55aa73361da64189b Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sun, 6 Dec 2020 20:18:19 +0100 Subject: [PATCH 14/20] Add: [Emscripten] use "relative mouse mode" with SDL2 This mode doesn't wrap the mouse constantly, but requests SDL to lock the mouse pointer. This is needed, as with Emscripten you are not allowed to change the mouse poisition (only to lock it into place). --- src/gfx.cpp | 24 ++++++++++++++++++++++++ src/gfx_type.h | 1 + src/video/sdl2_v.cpp | 35 ++++++++++++++++++++++++++++++++++- 3 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/gfx.cpp b/src/gfx.cpp index 6039946fc6..8027dad265 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -1784,6 +1784,30 @@ void SetAnimatedMouseCursor(const AnimCursor *table) SwitchAnimatedCursor(); } +/** + * Update cursor position on mouse movement for relative modes. + * @param delta_x How much change in the X position. + * @param delta_y How much change in the Y position. + */ +void CursorVars::UpdateCursorPositionRelative(int delta_x, int delta_y) +{ + if (this->fix_at) { + this->delta.x = delta_x; + this->delta.y = delta_y; + } else { + int last_position_x = this->pos.x; + int last_position_y = this->pos.y; + + this->pos.x = Clamp(this->pos.x + delta_x, 0, _cur_resolution.width - 1); + this->pos.y = Clamp(this->pos.y + delta_y, 0, _cur_resolution.height - 1); + + this->delta.x = last_position_x - this->pos.x; + this->delta.y = last_position_y - this->pos.y; + + this->dirty = true; + } +} + /** * Update cursor position on mouse movement. * @param x New X position. diff --git a/src/gfx_type.h b/src/gfx_type.h index 452bc2c7e8..ab802c45e4 100644 --- a/src/gfx_type.h +++ b/src/gfx_type.h @@ -143,6 +143,7 @@ struct CursorVars { /* Drag data */ bool vehchain; ///< vehicle chain is dragged + void UpdateCursorPositionRelative(int delta_x, int delta_y); bool UpdateCursorPosition(int x, int y, bool queued_warp); private: diff --git a/src/video/sdl2_v.cpp b/src/video/sdl2_v.cpp index 68b0aa983d..852f7298d9 100644 --- a/src/video/sdl2_v.cpp +++ b/src/video/sdl2_v.cpp @@ -51,6 +51,11 @@ static volatile bool _draw_continue; static Palette _local_palette; static SDL_Palette *_sdl_palette; +#ifdef __EMSCRIPTEN__ +/** Whether we just had a window-enter event. */ +static bool _cursor_new_in_window = false; +#endif + #define MAX_DIRTY_RECTS 100 static SDL_Rect _dirty_rects[MAX_DIRTY_RECTS]; static int _num_dirty_rects; @@ -350,6 +355,9 @@ bool VideoDriver_SDL::CreateMainSurface(uint w, uint h, bool resize) bool VideoDriver_SDL::ClaimMousePointer() { SDL_ShowCursor(0); +#ifdef __EMSCRIPTEN__ + SDL_SetRelativeMouseMode(SDL_TRUE); +#endif return true; } @@ -509,9 +517,27 @@ int VideoDriver_SDL::PollEvent() switch (ev.type) { case SDL_MOUSEMOTION: +#ifdef __EMSCRIPTEN__ + if (_cursor_new_in_window) { + /* The cursor just moved into the window; this means we don't + * know the absolutely position yet to move relative from. + * Before this time, SDL didn't know it either, and this is + * why we postpone it till now. Update the absolute position + * for this once, and work relative after. */ + _cursor.pos.x = ev.motion.x; + _cursor.pos.y = ev.motion.y; + _cursor.dirty = true; + + _cursor_new_in_window = false; + SDL_SetRelativeMouseMode(SDL_TRUE); + } else { + _cursor.UpdateCursorPositionRelative(ev.motion.xrel, ev.motion.yrel); + } +#else if (_cursor.UpdateCursorPosition(ev.motion.x, ev.motion.y, true)) { SDL_WarpMouseInWindow(_sdl_window, _cursor.pos.x, _cursor.pos.y); } +#endif HandleMouseEvents(); break; @@ -615,6 +641,12 @@ int VideoDriver_SDL::PollEvent() } else if (ev.window.event == SDL_WINDOWEVENT_ENTER) { // mouse entered the window, enable cursor _cursor.in_window = true; +#ifdef __EMSCRIPTEN__ + /* Disable relative mouse mode for the first mouse motion, + * so we can pick up the absolutely position again. */ + _cursor_new_in_window = true; + SDL_SetRelativeMouseMode(SDL_FALSE); +#endif } else if (ev.window.event == SDL_WINDOWEVENT_LEAVE) { // mouse left the window, undraw cursor UndrawMouseCursor(); @@ -631,7 +663,8 @@ const char *VideoDriver_SDL::Start(const StringList &parm) /* Explicitly disable hardware acceleration. Enabling this causes * UpdateWindowSurface() to update the window's texture instead of * its surface. */ - SDL_SetHint(SDL_HINT_FRAMEBUFFER_ACCELERATION , "0"); + SDL_SetHint(SDL_HINT_FRAMEBUFFER_ACCELERATION, "0"); + SDL_SetHint(SDL_HINT_MOUSE_RELATIVE_MODE_WARP, "1"); /* Just on the offchance the audio subsystem started before the video system, * check whether any part of SDL has been initialised before getting here. From 8fbf5bef60568cd4dcd56921c37be64b8234d9bb Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Wed, 9 Dec 2020 17:13:34 +0100 Subject: [PATCH 15/20] Fix: workarounds for two emscripten bugs in the network stack --- src/network/core/address.cpp | 12 ++++++++++++ src/network/core/os_abstraction.h | 22 ++++++++++++++++++++++ src/network/core/tcp_listen.h | 3 +++ src/network/core/udp.cpp | 3 +++ 4 files changed, 40 insertions(+) diff --git a/src/network/core/address.cpp b/src/network/core/address.cpp index 1aaa0b5fba..2e00b5b193 100644 --- a/src/network/core/address.cpp +++ b/src/network/core/address.cpp @@ -267,6 +267,18 @@ SOCKET NetworkAddress::Resolve(int family, int socktype, int flags, SocketList * this->address_length = (int)runp->ai_addrlen; assert(sizeof(this->address) >= runp->ai_addrlen); memcpy(&this->address, runp->ai_addr, runp->ai_addrlen); +#ifdef __EMSCRIPTEN__ + /* Emscripten doesn't zero sin_zero, but as we compare addresses + * to see if they are the same address, we need them to be zero'd. + * Emscripten is, as far as we know, the only OS not doing this. + * + * https://github.com/emscripten-core/emscripten/issues/12998 + */ + if (this->address.ss_family == AF_INET) { + sockaddr_in *address_ipv4 = (sockaddr_in *)&this->address; + memset(address_ipv4->sin_zero, 0, sizeof(address_ipv4->sin_zero)); + } +#endif break; } diff --git a/src/network/core/os_abstraction.h b/src/network/core/os_abstraction.h index be8b8f919a..8aa072aefb 100644 --- a/src/network/core/os_abstraction.h +++ b/src/network/core/os_abstraction.h @@ -151,6 +151,28 @@ typedef unsigned long in_addr_t; #endif /* OS/2 */ +#ifdef __EMSCRIPTEN__ +/** + * Emscripten doesn't set 'addrlen' for accept(), getsockname(), getpeername() + * and recvfrom(), which confuses other functions and causes them to crash. + * This function needs to be called after these four functions to make sure + * 'addrlen' is patched up. + * + * https://github.com/emscripten-core/emscripten/issues/12996 + * + * @param address The address returned by those four functions. + * @return The correct value for addrlen. + */ +static inline socklen_t FixAddrLenForEmscripten(struct sockaddr_storage &address) +{ + switch (address.ss_family) { + case AF_INET6: return sizeof(struct sockaddr_in6); + case AF_INET: return sizeof(struct sockaddr_in); + default: NOT_REACHED(); + } +} +#endif + /** * Try to set the socket into non-blocking mode. * @param d The socket to set the non-blocking more for. diff --git a/src/network/core/tcp_listen.h b/src/network/core/tcp_listen.h index d2982363e6..1f073aa735 100644 --- a/src/network/core/tcp_listen.h +++ b/src/network/core/tcp_listen.h @@ -42,6 +42,9 @@ public: socklen_t sin_len = sizeof(sin); SOCKET s = accept(ls, (struct sockaddr*)&sin, &sin_len); if (s == INVALID_SOCKET) return; +#ifdef __EMSCRIPTEN__ + sin_len = FixAddrLenForEmscripten(sin); +#endif SetNonBlocking(s); // XXX error handling? diff --git a/src/network/core/udp.cpp b/src/network/core/udp.cpp index 57352412b4..aa6d39cbba 100644 --- a/src/network/core/udp.cpp +++ b/src/network/core/udp.cpp @@ -129,6 +129,9 @@ void NetworkUDPSocketHandler::ReceivePackets() /* Did we get the bytes for the base header of the packet? */ if (nbytes <= 0) break; // No data, i.e. no packet if (nbytes <= 2) continue; // Invalid data; try next packet +#ifdef __EMSCRIPTEN__ + client_len = FixAddrLenForEmscripten(client_addr); +#endif NetworkAddress address(client_addr, client_len); p.PrepareToRead(); From 93ef759a257a1aebf98b9a54fc6698b4732b05f7 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Tue, 8 Dec 2020 13:49:22 +0100 Subject: [PATCH 16/20] Add: [Actions] preview workflow, where PRs can be reviewed in the browser When a developer attaches the "preview" label, a build is created and published on https://preview.openttd.org/. After that, new pushes to the PR are automatically build (as long as the "preview" label exists). If a non-developer attaches the "preview" label, it will be removed. --- .github/workflows/preview_build.yml | 133 ++++++++++++++++++++++++++++ .github/workflows/preview_label.yml | 66 ++++++++++++++ .github/workflows/preview_push.yml | 66 ++++++++++++++ 3 files changed, 265 insertions(+) create mode 100644 .github/workflows/preview_build.yml create mode 100644 .github/workflows/preview_label.yml create mode 100644 .github/workflows/preview_push.yml diff --git a/.github/workflows/preview_build.yml b/.github/workflows/preview_build.yml new file mode 100644 index 0000000000..9aea890bce --- /dev/null +++ b/.github/workflows/preview_build.yml @@ -0,0 +1,133 @@ +name: Preview build + +on: + repository_dispatch: + types: + - Preview* + +jobs: + preview: + name: Build preview + + runs-on: ubuntu-20.04 + container: + # If you change this version, change the number in the cache step too. + image: emscripten/emsdk:2.0.10 + # uid=1001(runner) gid=121(docker) + options: -u 1001:121 + + steps: + - name: Update deployment status to in progress + uses: octokit/request-action@v2.x + with: + route: POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses + mediaType: | + previews: + - ant-man + - flash + owner: ${{ github.event.repository.owner.login }} + repo: ${{ github.event.repository.name }} + deployment_id: ${{ github.event.client_payload.deployment_id }} + state: in_progress + env: + GITHUB_TOKEN: ${{ secrets.PREVIEW_GITHUB_TOKEN }} + + - name: Checkout + uses: actions/checkout@v2 + with: + ref: ${{ github.event.client_payload.sha }} + + - name: Name branch + run: | + name=$(echo "${{ github.event.client_payload.folder }}") + git checkout -b ${name} + + - name: Setup cache + uses: actions/cache@v2 + with: + path: /emsdk/upstream/emscripten/cache + key: 2.0.10-${{ runner.os }} + + - name: Build (host tools) + run: | + mkdir build-host + cd build-host + + echo "::group::CMake" + cmake .. -DOPTION_TOOLS_ONLY=ON + echo "::endgroup::" + + echo "::group::Build" + echo "Running on $(nproc) cores" + make -j$(nproc) tools + echo "::endgroup::" + + - name: Install GCC problem matcher + uses: ammaraskar/gcc-problem-matcher@master + + - name: Build + run: | + mkdir build + cd build + + echo "::group::CMake" + emcmake cmake .. \ + -DHOST_BINARY_DIR=../build-host \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + # EOF + echo "::endgroup::" + + echo "::group::Build" + echo "Running on $(nproc) cores" + emmake make -j$(nproc) + echo "::endgroup::" + + - name: Publish preview + run: | + # setuptools is missing in this Docker image, which breaks installing + # awscli. So we need to do this in two steps to recover sanity. + pip3 install setuptools + pip3 install awscli + + ~/.local/bin/aws s3 cp --only-show-errors build/openttd.data s3://${{ secrets.PREVIEW_S3_BUCKET }}/${{ github.event.client_payload.folder }}/ + ~/.local/bin/aws s3 cp --only-show-errors build/openttd.html s3://${{ secrets.PREVIEW_S3_BUCKET }}/${{ github.event.client_payload.folder }}/ + ~/.local/bin/aws s3 cp --only-show-errors build/openttd.js s3://${{ secrets.PREVIEW_S3_BUCKET }}/${{ github.event.client_payload.folder }}/ + ~/.local/bin/aws s3 cp --only-show-errors build/openttd.wasm s3://${{ secrets.PREVIEW_S3_BUCKET }}/${{ github.event.client_payload.folder }}/ + + # Invalidate the cache of the CloudFront distribution + ~/.local/bin/aws cloudfront create-invalidation --distribution-id ${{ secrets.PREVIEW_CF_DISTRIBUTION_ID }} --paths "/${{ github.event.client_payload.folder }}/*" + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + + - name: Update deployment status to success + uses: octokit/request-action@v2.x + with: + route: POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses + mediaType: | + previews: + - ant-man + - flash + owner: ${{ github.event.repository.owner.login }} + repo: ${{ github.event.repository.name }} + deployment_id: ${{ github.event.client_payload.deployment_id }} + state: success + environment_url: https://preview.openttd.org/${{ github.event.client_payload.folder }}/ + env: + GITHUB_TOKEN: ${{ secrets.PREVIEW_GITHUB_TOKEN }} + + - if: failure() + name: Update deployment status to failure + uses: octokit/request-action@v2.x + with: + route: POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses + mediaType: | + previews: + - ant-man + - flash + owner: ${{ github.event.repository.owner.login }} + repo: ${{ github.event.repository.name }} + deployment_id: ${{ github.event.client_payload.deployment_id }} + state: failure + env: + GITHUB_TOKEN: ${{ secrets.PREVIEW_GITHUB_TOKEN }} diff --git a/.github/workflows/preview_label.yml b/.github/workflows/preview_label.yml new file mode 100644 index 0000000000..6b3e17ea1a --- /dev/null +++ b/.github/workflows/preview_label.yml @@ -0,0 +1,66 @@ +name: Preview label + +on: + pull_request_target: + types: + - labeled + +env: + TEAM_CORE_DEVELOPER: core-developers + +jobs: + check_preview_label: + name: Check for preview label + if: github.event.action == 'labeled' && github.event.label.name == 'preview' + + runs-on: ubuntu-20.04 + + steps: + - name: Check if label was added by core developer + id: core_developer + continue-on-error: true + uses: octokit/request-action@v2.x + with: + route: GET /orgs/OpenTTD/teams/${{ env.TEAM_CORE_DEVELOPER }}/memberships/${{ github.event.sender.login }} + env: + GITHUB_TOKEN: ${{ secrets.PREVIEW_GITHUB_TOKEN }} + + - if: steps.core_developer.outcome == 'failure' + name: Remove preview label if not core developer + uses: octokit/request-action@v2.x + with: + route: DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/preview + owner: ${{ github.event.repository.owner.login }} + repo: ${{ github.event.repository.name }} + issue_number: ${{ github.event.number }} + env: + GITHUB_TOKEN: ${{ secrets.PREVIEW_GITHUB_TOKEN }} + + - if: steps.core_developer.outcome == 'success' + name: Create deployment + id: deployment + uses: octokit/request-action@v2.x + with: + route: POST /repos/{owner}/{repo}/deployments + mediaType: | + previews: + - ant-man + - flash + owner: ${{ github.event.repository.owner.login }} + repo: ${{ github.event.repository.name }} + ref: ${{ github.event.pull_request.head.sha }} + task: deploy:preview + auto_merge: false + required_contexts: "[]" + environment: preview-pr-${{ github.event.number }} + description: "Preview for Pull Request #${{ github.event.number }}" + env: + GITHUB_TOKEN: ${{ secrets.PREVIEW_GITHUB_TOKEN }} + + - if: steps.core_developer.outcome == 'success' + name: Trigger 'preview build' + uses: peter-evans/repository-dispatch@v1 + with: + token: ${{ secrets.PREVIEW_GITHUB_TOKEN }} + event-type: "Preview build #${{ github.event.number }}" + client-payload: '{"folder": "pr${{ github.event.number }}", "sha": "${{ github.event.pull_request.head.sha }}", "deployment_id": "${{ fromJson(steps.deployment.outputs.data).id }}"}' diff --git a/.github/workflows/preview_push.yml b/.github/workflows/preview_push.yml new file mode 100644 index 0000000000..cb68c8f6ce --- /dev/null +++ b/.github/workflows/preview_push.yml @@ -0,0 +1,66 @@ +name: Preview push + +on: + pull_request_target: + types: + - synchronize + +jobs: + check_new_preview: + name: Check preview needs update + + runs-on: ubuntu-20.04 + + steps: + - name: Check if earlier preview exists + id: earlier_preview + uses: octokit/request-action@v2.x + with: + route: GET /repos/{owner}/{repo}/deployments + owner: ${{ github.event.repository.owner.login }} + repo: ${{ github.event.repository.name }} + environment: preview-pr-${{ github.event.number }} + per_page: 1 + env: + GITHUB_TOKEN: ${{ secrets.PREVIEW_GITHUB_TOKEN }} + + - if: toJson(fromJson(steps.earlier_preview.outputs.data)) != '[]' + name: Check for preview label + id: preview_label + uses: octokit/request-action@v2.x + with: + route: GET /repos/{owner}/{repo}/issues/{issue_number}/labels + owner: ${{ github.event.repository.owner.login }} + repo: ${{ github.event.repository.name }} + issue_number: ${{ github.event.number }} + env: + GITHUB_TOKEN: ${{ secrets.PREVIEW_GITHUB_TOKEN }} + + - if: toJson(fromJson(steps.earlier_preview.outputs.data)) != '[]' && contains(fromJson(steps.preview_label.outputs.data).*.name, 'preview') + name: Create deployment + id: deployment + uses: octokit/request-action@v2.x + with: + route: POST /repos/{owner}/{repo}/deployments + mediaType: | + previews: + - ant-man + - flash + owner: ${{ github.event.repository.owner.login }} + repo: ${{ github.event.repository.name }} + ref: ${{ github.event.pull_request.head.sha }} + task: deploy:preview + auto_merge: false + required_contexts: "[]" + environment: preview-pr-${{ github.event.number }} + description: "Preview for Pull Request #${{ github.event.number }}" + env: + GITHUB_TOKEN: ${{ secrets.PREVIEW_GITHUB_TOKEN }} + + - if: toJson(fromJson(steps.earlier_preview.outputs.data)) != '[]' && contains(fromJson(steps.preview_label.outputs.data).*.name, 'preview') + name: Trigger 'preview build' + uses: peter-evans/repository-dispatch@v1 + with: + token: ${{ secrets.PREVIEW_GITHUB_TOKEN }} + event-type: "Preview build #${{ github.event.number }}" + client-payload: '{"folder": "pr${{ github.event.number }}", "sha": "${{ github.event.pull_request.head.sha }}", "deployment_id": "${{ fromJson(steps.deployment.outputs.data).id }}"}' From d6c54e7eef5e271c2bbd69e2f052fe14be1c236b Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Mon, 14 Dec 2020 11:58:34 +0100 Subject: [PATCH 17/20] Fix: [Git] ignore any build folder you might have Instructions now suggest using build-host, etc. It is easier to just ignore all build* folders. --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 1e68f57074..4eed0f0e47 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ /.vs -/build +/build* CMakeSettings.json docs/aidocs/* docs/gamedocs/* From 1a67954ff9e6d2ebd50b1ec60dd481df195da9dc Mon Sep 17 00:00:00 2001 From: translators Date: Tue, 15 Dec 2020 17:57:40 +0000 Subject: [PATCH 18/20] Update: Translations from eints korean: 29 changes by telk5093 finnish: 8 changes by hpiirai slovak: 6 changes by FuryPapaya french: 6 changes by glx22 --- src/lang/finnish.txt | 9 +++++++- src/lang/french.txt | 6 ++++++ src/lang/korean.txt | 51 +++++++++++++++++++++++++------------------- src/lang/slovak.txt | 10 +++++---- 4 files changed, 49 insertions(+), 27 deletions(-) diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index 2c19c6e80b..b85a8ac0de 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -194,6 +194,7 @@ STR_COLOUR_DEFAULT :Oletus STR_UNITS_VELOCITY_IMPERIAL :{COMMA}{NBSP}mph STR_UNITS_VELOCITY_METRIC :{COMMA}{NBSP}km/h STR_UNITS_VELOCITY_SI :{COMMA}{NBSP}m/s +STR_UNITS_VELOCITY_GAMEUNITS :{DECIMAL}{NBSP}ruutua/vrk STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}hv STR_UNITS_POWER_METRIC :{COMMA}{NBSP}hv @@ -1553,6 +1554,11 @@ STR_CONFIG_SETTING_ENDING_YEAR :Pistelaskun pä STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Pelin päättymisvuosi pisteiden laskemista varten. Tämän vuoden lopussa talletetaan yhtiön pistemäärä ja näytetään ennätysluettelo; pelaajat voivat jatkaa pelaamista tämän jälkeenkin.{}Jos päättymisvuosi on ennen alkamisvuotta, ennätyksiä ei näytetä koskaan. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Ei koskaan +STR_CONFIG_SETTING_ECONOMY_TYPE :Talouden laji: {STRING} +STR_CONFIG_SETTING_ECONOMY_TYPE_HELPTEXT :Tasaisessa taloudessa tuotanto muuttuu useammin, ja pienemmissä askeleissa, kuin alkuperäisessä. Jäädytetty talous estää tuotantomuutokset ja laitosten sulkeutumiset. Tämä asetus ei välttämättä vaikuta, jos teollisuustyypit tulevat NewGRF:stä. +STR_CONFIG_SETTING_ECONOMY_TYPE_ORIGINAL :Alkuperäinen +STR_CONFIG_SETTING_ECONOMY_TYPE_SMOOTH :Tasainen +STR_CONFIG_SETTING_ECONOMY_TYPE_FROZEN :Jäädytetty STR_CONFIG_SETTING_ALLOW_SHARES :Salli toisten yhtiöiden osakkeiden ostaminen: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Mikäli käytössä, toisten yhtiöiden osakkeiden ostaminen ja myyminen on mahdollista. Osakkeet ovat saatavilla vain yhtiöille, jotka ovat saavuttaneet tietyn iän STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Yhtiön vähimmäisikä osakekaupoille: {STRING} @@ -1673,6 +1679,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Kun käyttölii STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :Brittiläinen (mph) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :Metrinen (km/h) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :SI (m/s) +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS :Pelin yksiköt (ruutuja vuorokaudessa) STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Kulkuneuvon tehon yksikkö: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :Kun käyttöliittymässä näytetään kulkuneuvon teho, näytä se valittua yksikköä käyttäen @@ -3800,7 +3807,7 @@ STR_VEHICLE_DETAILS_ROAD_VEHICLE_RENAME :{BLACK}Nimeä a STR_VEHICLE_DETAILS_SHIP_RENAME :{BLACK}Nimeä laiva STR_VEHICLE_DETAILS_AIRCRAFT_RENAME :{BLACK}Nimeä ilma-alus -STR_VEHICLE_INFO_AGE_RUNNING_COST_YR :{BLACK}Ikä: {LTBLUE}{STRING}{BLACK} Käyttökustannukset: {LTBLUE}{CURRENCY_LONG}/yr +STR_VEHICLE_INFO_AGE_RUNNING_COST_YR :{BLACK}Ikä: {LTBLUE}{STRING}{BLACK} Käyttökustannukset: {LTBLUE}{CURRENCY_LONG}/v # The next two need to stay in this order STR_VEHICLE_INFO_AGE :{COMMA} vuo{P si tta} ({COMMA}) STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} vuo{P si tta} ({COMMA}) diff --git a/src/lang/french.txt b/src/lang/french.txt index 78ecd8dd0c..f256421614 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -195,6 +195,7 @@ STR_COLOUR_DEFAULT :Défaut STR_UNITS_VELOCITY_IMPERIAL :{COMMA}{NBSP}mph STR_UNITS_VELOCITY_METRIC :{COMMA}{NBSP}km/h STR_UNITS_VELOCITY_SI :{COMMA}{NBSP}m/s +STR_UNITS_VELOCITY_GAMEUNITS :{DECIMAL}{NBSP}cases/jour STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}hp STR_UNITS_POWER_METRIC :{COMMA}{NBSP}ch @@ -1555,6 +1556,10 @@ STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :À la fin de ce STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Jamais STR_CONFIG_SETTING_ECONOMY_TYPE :Type d'économie{NBSP}: {STRING} +STR_CONFIG_SETTING_ECONOMY_TYPE_HELPTEXT :Une économie stable entraîne des changements de production plus fréquents, mais de plus faible intensité. Une économie gelée bloque les changements de production et les fermetures d'industries. Ce paramètre peut n'avoir aucun effet si les types d'industries proviennent d'un NewGRF. +STR_CONFIG_SETTING_ECONOMY_TYPE_ORIGINAL :Original +STR_CONFIG_SETTING_ECONOMY_TYPE_SMOOTH :Stable +STR_CONFIG_SETTING_ECONOMY_TYPE_FROZEN :Gelée STR_CONFIG_SETTING_ALLOW_SHARES :Permettre d'acheter des actions d'autres compagnies{NBSP}: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Lorsqu'il est activé, l'achat et la vente des parts de compagnie sont autorisées. Les parts ne seront disponibles que pour les compagnies ayant atteint un certain âge STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Âge minimum de la compagnie pour la vente d'actions{NBSP}: {STRING} @@ -1675,6 +1680,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Quand une vites STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :Impérial (mph) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :Métrique (km/h) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :SI (m/s) +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS :Unités du jeu (cases/jour) STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Unité de puissance de véhicule{NBSP}: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :Quand une puissance de véhicule est affichée dans l'interface utilisateur, utiliser l'unité sélectionnée diff --git a/src/lang/korean.txt b/src/lang/korean.txt index ab2089ac48..80046c2ad0 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -192,36 +192,37 @@ STR_COLOUR_RANDOM :무작위 STR_COLOUR_DEFAULT :기본 # Units used in OpenTTD -STR_UNITS_VELOCITY_IMPERIAL :{COMMA}{NBSP}mph -STR_UNITS_VELOCITY_METRIC :{COMMA}{NBSP}km/h -STR_UNITS_VELOCITY_SI :{COMMA}{NBSP}m/s +STR_UNITS_VELOCITY_IMPERIAL :{COMMA}mph +STR_UNITS_VELOCITY_METRIC :{COMMA}km/h +STR_UNITS_VELOCITY_SI :{COMMA}m/s +STR_UNITS_VELOCITY_GAMEUNITS :{DECIMAL}칸/일 -STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}마력 -STR_UNITS_POWER_METRIC :{COMMA}{NBSP}마력 -STR_UNITS_POWER_SI :{COMMA}{NBSP}kW +STR_UNITS_POWER_IMPERIAL :{COMMA}마력 +STR_UNITS_POWER_METRIC :{COMMA}마력 +STR_UNITS_POWER_SI :{COMMA}kW -STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t -STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t -STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg +STR_UNITS_WEIGHT_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}톤 -STR_UNITS_WEIGHT_LONG_METRIC :{COMMA}{NBSP}톤 -STR_UNITS_WEIGHT_LONG_SI :{COMMA}{NBSP}kg +STR_UNITS_WEIGHT_LONG_IMPERIAL :{COMMA}톤 +STR_UNITS_WEIGHT_LONG_METRIC :{COMMA}톤 +STR_UNITS_WEIGHT_LONG_SI :{COMMA}kg -STR_UNITS_VOLUME_SHORT_IMPERIAL :{COMMA}{NBSP}갤런 -STR_UNITS_VOLUME_SHORT_METRIC :{COMMA}{NBSP}l -STR_UNITS_VOLUME_SHORT_SI :{COMMA}{NBSP}m³ +STR_UNITS_VOLUME_SHORT_IMPERIAL :{COMMA}갤런 +STR_UNITS_VOLUME_SHORT_METRIC :{COMMA}l +STR_UNITS_VOLUME_SHORT_SI :{COMMA}m³ -STR_UNITS_VOLUME_LONG_IMPERIAL :{COMMA}{NBSP}갤런 -STR_UNITS_VOLUME_LONG_METRIC :{COMMA}{NBSP}리터 -STR_UNITS_VOLUME_LONG_SI :{COMMA}{NBSP}m³ +STR_UNITS_VOLUME_LONG_IMPERIAL :{COMMA}갤런 +STR_UNITS_VOLUME_LONG_METRIC :{COMMA}리터 +STR_UNITS_VOLUME_LONG_SI :{COMMA}m³ -STR_UNITS_FORCE_IMPERIAL :{COMMA}{NBSP}파운드중 -STR_UNITS_FORCE_METRIC :{COMMA}{NBSP}kg중 +STR_UNITS_FORCE_IMPERIAL :{COMMA}파운드중 +STR_UNITS_FORCE_METRIC :{COMMA}kg중 STR_UNITS_FORCE_SI :{COMMA}kN -STR_UNITS_HEIGHT_IMPERIAL :{COMMA}{NBSP}피트 -STR_UNITS_HEIGHT_METRIC :{COMMA}{NBSP}m +STR_UNITS_HEIGHT_IMPERIAL :{COMMA}피트 +STR_UNITS_HEIGHT_METRIC :{COMMA}m STR_UNITS_HEIGHT_SI :{COMMA}m # Common window strings @@ -1554,6 +1555,11 @@ STR_CONFIG_SETTING_ENDING_YEAR :게임 종료 STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :점수를 기록할 게임 종료 연도를 설정합니다. 이 연도가 지나면, 회사의 점수가 고득점 순위표에 기록되어 표시됩니다. 하지만 플레이어는 계속해서 게임을 진행할 수 있습니다.{}이 값이 시작 연도보다 이전으로 설정되어 있다면, 고득점 순위표는 나타나지 않습니다. STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_ZERO :안 함 +STR_CONFIG_SETTING_ECONOMY_TYPE :경제 변화: {STRING} +STR_CONFIG_SETTING_ECONOMY_TYPE_HELPTEXT :부드러운 경제에서는 생산량이 소량으로 자주 변하게 됩니다. 멈춘 경제에서는 생산량이 변하지 않고 산업 시설의 폐쇄를 막습니다. 이 설정은 NewGRF로 추가한 산업 시설에는 적용되지 않을 수 있습니다. +STR_CONFIG_SETTING_ECONOMY_TYPE_ORIGINAL :기본 +STR_CONFIG_SETTING_ECONOMY_TYPE_SMOOTH :부드러움 +STR_CONFIG_SETTING_ECONOMY_TYPE_FROZEN :멈춤 STR_CONFIG_SETTING_ALLOW_SHARES :다른 회사의 지분을 사는 것을 허용: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :이 설정을 켜면, 회사의 지분을 거래할 수 있게 됩니다. 회사의 지분을 거래하려면 해당 회사가 어느 정도 오래되어야 합니다. STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :지분 거래를 허용할 최소 회사 나이: {STRING} @@ -1674,6 +1680,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :속력를 표 STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :임페리얼법 (mph) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :미터법 (km/h) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :국제표준규격 (m/s) +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS :게임 단위 (칸/일) STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :차량의 힘 단위: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :출력할 차량의 힘 단위를 선택합니다. diff --git a/src/lang/slovak.txt b/src/lang/slovak.txt index 094a5969ad..fe0ebc1bac 100644 --- a/src/lang/slovak.txt +++ b/src/lang/slovak.txt @@ -258,6 +258,7 @@ STR_COLOUR_DEFAULT :Predvolená STR_UNITS_VELOCITY_IMPERIAL :{COMMA} mph STR_UNITS_VELOCITY_METRIC :{COMMA} km/h STR_UNITS_VELOCITY_SI :{COMMA} m/s +STR_UNITS_VELOCITY_GAMEUNITS :{DECIMAL}{NBSP}políč{P ko ka ok}/deň STR_UNITS_POWER_IMPERIAL :{COMMA}hp STR_UNITS_POWER_METRIC :{COMMA}hp @@ -383,7 +384,7 @@ STR_SORT_BY_RATING :Hodnotenie STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Pozastaviť hru STR_TOOLBAR_TOOLTIP_FORWARD :{BLACK}Zrýchliť priebeh hry STR_TOOLBAR_TOOLTIP_OPTIONS :{BLACK}Nastavenia -STR_TOOLBAR_TOOLTIP_SAVE_GAME_ABANDON_GAME :{BLACK}Uložiť hru, opustiť hru, ukončiť program +STR_TOOLBAR_TOOLTIP_SAVE_GAME_ABANDON_GAME :{BLACK}Uložiť hru, opustiť hru, ukončiť STR_TOOLBAR_TOOLTIP_DISPLAY_MAP :{BLACK}Zobraziť mapu STR_TOOLBAR_TOOLTIP_DISPLAY_TOWN_DIRECTORY :{BLACK}Zobraziť zoznam miest STR_TOOLBAR_TOOLTIP_DISPLAY_SUBSIDIES :{BLACK}Zobraziť dotácie @@ -413,7 +414,7 @@ STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION :{BLACK}Informá STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR :{BLACK}Prepnúť panely nástrojov # Extra tooltips for the scenario editor toolbar -STR_SCENEDIT_TOOLBAR_TOOLTIP_SAVE_SCENARIO_LOAD_SCENARIO :{BLACK}Uložiť scenár, nahrať scenár, opustiť editor scenára, ukončiť program +STR_SCENEDIT_TOOLBAR_TOOLTIP_SAVE_SCENARIO_LOAD_SCENARIO :{BLACK}Uložiť scenár, nahrať scenár, opustiť editor scenára, ukončiť STR_SCENEDIT_TOOLBAR_OPENTTD :{YELLOW}OpenTTD STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR :{YELLOW}Editor scenára STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD :{BLACK}Posunúť začiatok o rok dozadu @@ -436,7 +437,7 @@ STR_SCENEDIT_FILE_MENU_SAVE_HEIGHTMAP :Uložiť výšk STR_SCENEDIT_FILE_MENU_LOAD_HEIGHTMAP :Nahrať výškovú mapu STR_SCENEDIT_FILE_MENU_QUIT_EDITOR :Opustiť editor scenára STR_SCENEDIT_FILE_MENU_SEPARATOR : -STR_SCENEDIT_FILE_MENU_QUIT :Ukončiť program +STR_SCENEDIT_FILE_MENU_QUIT :Ukončiť ############ range for SE file menu starts ############ range for settings menu starts @@ -461,7 +462,7 @@ STR_FILE_MENU_SAVE_GAME :Uložiť hru STR_FILE_MENU_LOAD_GAME :Nahrať hru STR_FILE_MENU_QUIT_GAME :Opustiť hru STR_FILE_MENU_SEPARATOR : -STR_FILE_MENU_EXIT :Ukončiť program +STR_FILE_MENU_EXIT :Ukončiť ############ range ends here # map menu @@ -1741,6 +1742,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Vždy, keď sa STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :Imperiálne (mph) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :Metrické (km/h) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :SI (m/s) +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS :Jednotky hry (políčka/deň) STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Jednotky výkonu vozidiel: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :Vždy, keď sa zobrazí výkon vozidla v užívateľskom rozhraní, zobrazí sa vo vybraných jednotkách From ca65f19b03f28bd6a2283d740ca6ae449bdc01e7 Mon Sep 17 00:00:00 2001 From: stormcone <48624099+stormcone@users.noreply.github.com> Date: Sun, 13 Sep 2020 23:24:46 +0200 Subject: [PATCH 19/20] Feature: Show group name as part of the default vehicle name. Only if the vehicle is member of a group and does not have a user defined name. --- src/group_cmd.cpp | 4 ++++ src/lang/english.txt | 1 + src/strings.cpp | 5 +++++ 3 files changed, 10 insertions(+) diff --git a/src/group_cmd.cpp b/src/group_cmd.cpp index fd63bd153a..bf25dae862 100644 --- a/src/group_cmd.cpp +++ b/src/group_cmd.cpp @@ -456,6 +456,8 @@ CommandCost CmdAlterGroup(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 InvalidateWindowData(WC_REPLACE_VEHICLE, g->vehicle_type, 1); InvalidateWindowData(GetWindowClassForVehicleType(g->vehicle_type), VehicleListIdentifier(VL_GROUP_LIST, g->vehicle_type, _current_company).Pack()); InvalidateWindowData(WC_COMPANY_COLOUR, g->owner, g->vehicle_type); + InvalidateWindowClassesData(WC_VEHICLE_VIEW); + InvalidateWindowClassesData(WC_VEHICLE_DETAILS); } return CommandCost(); @@ -545,6 +547,8 @@ CommandCost CmdAddVehicleGroup(TileIndex tile, DoCommandFlag flags, uint32 p1, u SetWindowDirty(WC_VEHICLE_VIEW, v->index); SetWindowDirty(WC_VEHICLE_DETAILS, v->index); InvalidateWindowData(GetWindowClassForVehicleType(v->type), VehicleListIdentifier(VL_GROUP_LIST, v->type, _current_company).Pack()); + InvalidateWindowData(WC_VEHICLE_VIEW, v->index); + InvalidateWindowData(WC_VEHICLE_DETAILS, v->index); } return CommandCost(); diff --git a/src/lang/english.txt b/src/lang/english.txt index b8756049d2..f08272d37a 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -5037,6 +5037,7 @@ STR_FORMAT_BUOY_NAME :{TOWN} Buoy STR_FORMAT_BUOY_NAME_SERIAL :{TOWN} Buoy #{COMMA} STR_FORMAT_COMPANY_NUM :(Company {COMMA}) STR_FORMAT_GROUP_NAME :Group {COMMA} +STR_FORMAT_GROUP_VEHICLE_NAME :{GROUP} #{COMMA} STR_FORMAT_INDUSTRY_NAME :{TOWN} {STRING} STR_FORMAT_WAYPOINT_NAME :{TOWN} Waypoint STR_FORMAT_WAYPOINT_NAME_SERIAL :{TOWN} Waypoint #{COMMA} diff --git a/src/strings.cpp b/src/strings.cpp index c2edf8e171..ae0ab2c906 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -1467,6 +1467,11 @@ static char *FormatString(char *buff, const char *str_arg, StringParameters *arg int64 args_array[] = {(int64)(size_t)v->name.c_str()}; StringParameters tmp_params(args_array); buff = GetStringWithArgs(buff, STR_JUST_RAW_STRING, &tmp_params, last); + } else if (v->group_id != DEFAULT_GROUP) { + /* The vehicle has no name, but is member of a group, so print group name */ + int64 args_array[] = {v->group_id, v->unitnumber}; + StringParameters tmp_params(args_array); + buff = GetStringWithArgs(buff, STR_FORMAT_GROUP_VEHICLE_NAME, &tmp_params, last); } else { int64 args_array[] = {v->unitnumber}; StringParameters tmp_params(args_array); From f7b8e7e46c4864f518d7455c80946938e29077ba Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Tue, 15 Dec 2020 10:36:19 +0100 Subject: [PATCH 20/20] Fix: prefix the Nth vehicle with "#" when ungrouped This is for consistency; most other objects add a # to indicate it is the Nth of that object, except for Trains / RVs / Ships / Aircrafts. This becomes painfully apparent with unnamed vehicles in groups, which do get a "#". --- regression/regression/result.txt | 2 +- src/lang/english.txt | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/regression/regression/result.txt b/regression/regression/result.txt index ab441256d5..9ae029932d 100644 --- a/regression/regression/result.txt +++ b/regression/regression/result.txt @@ -9075,7 +9075,7 @@ ERROR: IsEnd() is invalid as Begin() is never called --Accounting-- GetCosts(): -5947 Should be: -5947 - GetName(): Road Vehicle 1 + GetName(): Road Vehicle #1 SetName(): true GetName(): MyVehicleName CloneVehicle(): 13 diff --git a/src/lang/english.txt b/src/lang/english.txt index f08272d37a..d3cf0de961 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -4732,10 +4732,10 @@ STR_INDUSTRY_NAME_SUGAR_MINE :Sugar Mine ##id 0x6000 STR_SV_EMPTY : STR_SV_UNNAMED :Unnamed -STR_SV_TRAIN_NAME :Train {COMMA} -STR_SV_ROAD_VEHICLE_NAME :Road Vehicle {COMMA} -STR_SV_SHIP_NAME :Ship {COMMA} -STR_SV_AIRCRAFT_NAME :Aircraft {COMMA} +STR_SV_TRAIN_NAME :Train #{COMMA} +STR_SV_ROAD_VEHICLE_NAME :Road Vehicle #{COMMA} +STR_SV_SHIP_NAME :Ship #{COMMA} +STR_SV_AIRCRAFT_NAME :Aircraft #{COMMA} STR_SV_STNAME :{STRING1} STR_SV_STNAME_NORTH :{STRING1} North