Merge branch 'master' into jgrpp

# Conflicts:
#	cmake/CompileFlags.cmake
#	src/crashlog.cpp
#	src/fileio.cpp
#	src/fileio_func.h
#	src/fios_gui.cpp
#	src/ini_load.cpp
#	src/ini_type.h
#	src/lang/english.txt
#	src/lang/german.txt
#	src/lang/korean.txt
#	src/network/network_client.cpp
#	src/order_base.h
#	src/order_cmd.cpp
#	src/os/windows/win32.cpp
#	src/road_cmd.cpp
#	src/saveload/saveload.cpp
#	src/saveload/saveload.h
#	src/settings.cpp
#	src/station_cmd.cpp
#	src/stdafx.h
#	src/table/settings.ini
#	src/tree_cmd.cpp
#	src/tree_gui.cpp
#	src/vehicle_base.h
#	src/video/cocoa/cocoa_v.mm
#	src/video/cocoa/event.mm
#	src/video/cocoa/wnd_quartz.mm
#	src/viewport.cpp
#	src/widgets/tree_widget.h
pull/217/head
Jonathan G Rennison 3 years ago
commit 6c3e5642f8

@ -94,7 +94,6 @@ jobs:
liblzo2-dev \ liblzo2-dev \
libsdl1.2-dev \ libsdl1.2-dev \
libsdl2-dev \ libsdl2-dev \
libxdg-basedir-dev \
zlib1g-dev \ zlib1g-dev \
# EOF # EOF
echo "::endgroup::" echo "::endgroup::"

@ -479,8 +479,7 @@ jobs:
useVcpkgToolchainFile: false useVcpkgToolchainFile: false
buildDirectory: '${{ github.workspace }}/build-host' buildDirectory: '${{ github.workspace }}/build-host'
buildWithCMakeArgs: '--target tools' buildWithCMakeArgs: '--target tools'
cmakeBuildType: RelWithDebInfo cmakeAppendedArgs: ' -GNinja -DOPTION_TOOLS_ONLY=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo'
cmakeAppendedArgs: ' -GNinja -DOPTION_TOOLS_ONLY=ON'
- name: Install MSVC problem matcher - name: Install MSVC problem matcher
uses: ammaraskar/msvc-problem-matcher@master uses: ammaraskar/msvc-problem-matcher@master
@ -492,8 +491,7 @@ jobs:
cmakeListsOrSettingsJson: CMakeListsTxtAdvanced cmakeListsOrSettingsJson: CMakeListsTxtAdvanced
useVcpkgToolchainFile: true useVcpkgToolchainFile: true
buildDirectory: '${{ github.workspace }}/build' buildDirectory: '${{ github.workspace }}/build'
cmakeBuildType: RelWithDebInfo cmakeAppendedArgs: ' -GNinja -DOPTION_USE_NSIS=ON -DHOST_BINARY_DIR=${{ github.workspace }}/build-host -DCMAKE_BUILD_TYPE=RelWithDebInfo'
cmakeAppendedArgs: ' -GNinja -DOPTION_USE_NSIS=ON -DHOST_BINARY_DIR=${{ github.workspace }}/build-host'
- name: Build (without installer) - name: Build (without installer)
if: needs.source.outputs.is_tag != 'true' || matrix.arch == 'arm64' if: needs.source.outputs.is_tag != 'true' || matrix.arch == 'arm64'
@ -502,8 +500,7 @@ jobs:
cmakeListsOrSettingsJson: CMakeListsTxtAdvanced cmakeListsOrSettingsJson: CMakeListsTxtAdvanced
useVcpkgToolchainFile: true useVcpkgToolchainFile: true
buildDirectory: '${{ github.workspace }}/build' buildDirectory: '${{ github.workspace }}/build'
cmakeBuildType: RelWithDebInfo cmakeAppendedArgs: ' -GNinja -DHOST_BINARY_DIR=${{ github.workspace }}/build-host -DCMAKE_BUILD_TYPE=RelWithDebInfo'
cmakeAppendedArgs: ' -GNinja -DHOST_BINARY_DIR=${{ github.workspace }}/build-host'
- name: Create bundles - name: Create bundles
shell: bash shell: bash

@ -107,7 +107,6 @@ if(NOT WIN32)
find_package(Fluidsynth) find_package(Fluidsynth)
find_package(Fontconfig) find_package(Fontconfig)
find_package(ICU OPTIONAL_COMPONENTS i18n lx) find_package(ICU OPTIONAL_COMPONENTS i18n lx)
find_package(XDG_basedir)
else() else()
find_package(Iconv) find_package(Iconv)
@ -264,7 +263,6 @@ link_package(PNG TARGET PNG::PNG ENCOURAGED)
link_package(ZLIB TARGET ZLIB::ZLIB ENCOURAGED) link_package(ZLIB TARGET ZLIB::ZLIB ENCOURAGED)
link_package(LIBLZMA TARGET LibLZMA::LibLZMA ENCOURAGED) link_package(LIBLZMA TARGET LibLZMA::LibLZMA ENCOURAGED)
link_package(LZO) link_package(LZO)
link_package(XDG_basedir)
if(NOT OPTION_DEDICATED) if(NOT OPTION_DEDICATED)
link_package(Fluidsynth) link_package(Fluidsynth)
@ -291,7 +289,6 @@ if(APPLE)
add_definitions( add_definitions(
-DWITH_COCOA -DWITH_COCOA
-DENABLE_COCOA_QUARTZ
) )
endif() endif()
@ -301,6 +298,8 @@ if(EMSCRIPTEN)
# Allow heap-growth, and start with a bigger memory size. # 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 ALLOW_MEMORY_GROWTH=1")
target_link_libraries(WASM::WASM INTERFACE "-s INITIAL_MEMORY=33554432") target_link_libraries(WASM::WASM INTERFACE "-s INITIAL_MEMORY=33554432")
target_link_libraries(WASM::WASM INTERFACE "-s DISABLE_EXCEPTION_CATCHING=0")
add_definitions(-s DISABLE_EXCEPTION_CATCHING=0)
# Export functions to Javascript. # Export functions to Javascript.
target_link_libraries(WASM::WASM INTERFACE "-s EXPORTED_FUNCTIONS='[\"_main\", \"_em_openttd_add_server\"]' -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"cwrap\"]'") target_link_libraries(WASM::WASM INTERFACE "-s EXPORTED_FUNCTIONS='[\"_main\", \"_em_openttd_add_server\"]' -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"cwrap\"]'")

@ -81,6 +81,9 @@ cmake ..
make make
``` ```
For more information on how to use CMake (including how to make Release builds),
we urge you to read [their excellent manual](https://cmake.org/cmake/help/latest/guide/user-interaction/index.html).
## Supported compilers ## Supported compilers
Every compiler that is supported by CMake and supports C++17, should be Every compiler that is supported by CMake and supports C++17, should be

@ -133,10 +133,20 @@ macro(compile_flags)
) )
endif() endif()
if(APPLE) if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
add_compile_options( add_compile_options(
-fno-stack-check -fno-stack-check
) )
include(CheckCXXCompilerFlag)
check_cxx_compiler_flag("-mno-sse4" NO_SSE4_FOUND)
if(NO_SSE4_FOUND)
add_compile_options(
# Don't use SSE4 for general sources to increase compatibility.
-mno-sse4
)
endif()
endif() endif()
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
add_compile_options( add_compile_options(

@ -1,65 +0,0 @@
#[=======================================================================[.rst:
FindXDG_basedir
-------
Finds the xdg-basedir library.
Result Variables
^^^^^^^^^^^^^^^^
This will define the following variables:
``XDG_basedir_FOUND``
True if the system has the xdg-basedir library.
``XDG_basedir_INCLUDE_DIRS``
Include directories needed to use xdg-basedir.
``XDG_basedir_LIBRARIES``
Libraries needed to link to xdg-basedir.
``XDG_basedir_VERSION``
The version of the xdg-basedir library which was found.
Cache Variables
^^^^^^^^^^^^^^^
The following cache variables may also be set:
``XDG_basedir_INCLUDE_DIR``
The directory containing ``xdg-basedir.h``.
``XDG_basedir_LIBRARY``
The path to the xdg-basedir library.
#]=======================================================================]
find_package(PkgConfig QUIET)
pkg_check_modules(PC_XDG_basedir QUIET libxdg-basedir)
find_path(XDG_basedir_INCLUDE_DIR
NAMES basedir.h
PATHS ${PC_XDG_basedir_INCLUDE_DIRS}
)
find_library(XDG_basedir_LIBRARY
NAMES xdg-basedir
PATHS ${PC_XDG_basedir_LIBRARY_DIRS}
)
set(XDG_basedir_VERSION ${PC_XDG_basedir_VERSION})
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(XDG_basedir
FOUND_VAR XDG_basedir_FOUND
REQUIRED_VARS
XDG_basedir_LIBRARY
XDG_basedir_INCLUDE_DIR
VERSION_VAR XDG_basedir_VERSION
)
if(XDG_basedir_FOUND)
set(XDG_basedir_LIBRARIES ${XDG_basedir_LIBRARY})
set(XDG_basedir_INCLUDE_DIRS ${XDG_basedir_INCLUDE_DIR})
endif()
mark_as_advanced(
XDG_basedir_INCLUDE_DIR
XDG_basedir_LIBRARY
)

@ -123,25 +123,37 @@ elseif(UNIX)
OUTPUT_VARIABLE LSB_RELEASE_ID OUTPUT_VARIABLE LSB_RELEASE_ID
OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_STRIP_TRAILING_WHITESPACE
) )
if(NOT LSB_RELEASE_ID) if(LSB_RELEASE_ID)
set(PLATFORM "generic") if(LSB_RELEASE_ID STREQUAL "Ubuntu" OR LSB_RELEASE_ID STREQUAL "Debian")
set(CPACK_GENERATOR "TXZ") execute_process(COMMAND ${LSB_RELEASE_EXEC} -cs
OUTPUT_VARIABLE LSB_RELEASE_CODENAME
message(WARNING "Unknown Linux distribution found for packaging; can only pack to a txz. Please consider creating a Pull Request to add support for this distribution.") OUTPUT_STRIP_TRAILING_WHITESPACE
elseif(LSB_RELEASE_ID STREQUAL "Ubuntu" OR LSB_RELEASE_ID STREQUAL "Debian") )
execute_process(COMMAND ${LSB_RELEASE_EXEC} -cs string(TOLOWER "${LSB_RELEASE_ID}-${LSB_RELEASE_CODENAME}" PLATFORM)
OUTPUT_VARIABLE LSB_RELEASE_CODENAME
OUTPUT_STRIP_TRAILING_WHITESPACE set(CPACK_GENERATOR "DEB")
) include(PackageDeb)
string(TOLOWER "${LSB_RELEASE_ID}-${LSB_RELEASE_CODENAME}" PLATFORM) else()
set(UNSUPPORTED_PLATFORM_NAME "LSB-based Linux distribution '${LSB_RELEASE_ID}'")
set(CPACK_GENERATOR "DEB") endif()
include(PackageDeb) elseif(EXISTS "/etc/os-release")
file(STRINGS "/etc/os-release" OS_RELEASE_CONTENTS REGEX "^ID=")
string(REGEX MATCH "ID=(.*)" _ ${OS_RELEASE_CONTENTS})
set(DISTRO_ID ${CMAKE_MATCH_1})
if(DISTRO_ID STREQUAL "arch")
set(PLATFORM "generic")
set(CPACK_GENERATOR "TXZ")
else()
set(UNSUPPORTED_PLATFORM_NAME "Linux distribution '${DISTRO_ID}' from /etc/os-release")
endif()
else() else()
set(PLATFORM "unknown") set(UNSUPPORTED_PLATFORM_NAME "Linux distribution")
set(CPACK_GENERATOR "TXZ") endif()
message(WARNING "Unknown LSB-based Linux distribution '${LSB_RELEASE_ID}' found for packaging; can only pack to a txz. Please consider creating a Pull Request to add support for this distribution.") if(NOT PLATFORM)
set(PLATFORM "generic")
set(CPACK_GENERATOR "TXZ")
message(WARNING "Unknown ${UNSUPPORTED_PLATFORM_NAME} found for packaging; can only pack to a txz. Please consider creating a Pull Request to add support for this distribution.")
endif() endif()
set(CPACK_PACKAGE_FILE_NAME "openttd-#CPACK_PACKAGE_VERSION#-linux-${PLATFORM}-${CPACK_SYSTEM_NAME}") set(CPACK_PACKAGE_FILE_NAME "openttd-#CPACK_PACKAGE_VERSION#-linux-${PLATFORM}-${CPACK_SYSTEM_NAME}")

@ -8,6 +8,7 @@ source_group("MD5" REGULAR_EXPRESSION "src/3rdparty/md5/")
source_group("Misc" REGULAR_EXPRESSION "src/misc/") source_group("Misc" REGULAR_EXPRESSION "src/misc/")
source_group("Music" REGULAR_EXPRESSION "src/music/") source_group("Music" REGULAR_EXPRESSION "src/music/")
source_group("Network Core" REGULAR_EXPRESSION "src/network/core/") source_group("Network Core" REGULAR_EXPRESSION "src/network/core/")
source_group("OSX" REGULAR_EXPRESSION "src/os/macosx/")
source_group("Pathfinder" REGULAR_EXPRESSION "src/pathfinder/") source_group("Pathfinder" REGULAR_EXPRESSION "src/pathfinder/")
source_group("Save/Load handlers" REGULAR_EXPRESSION "src/saveload/") source_group("Save/Load handlers" REGULAR_EXPRESSION "src/saveload/")
source_group("Sound" REGULAR_EXPRESSION "src/sound/") source_group("Sound" REGULAR_EXPRESSION "src/sound/")

@ -97,6 +97,8 @@ struct AIListWindow : public Window {
this->selected = i; this->selected = i;
break; break;
} }
i++;
} }
} }
} }
@ -324,8 +326,6 @@ struct AISettingsWindow : public Window {
this->vscroll = this->GetScrollbar(WID_AIS_SCROLLBAR); this->vscroll = this->GetScrollbar(WID_AIS_SCROLLBAR);
this->FinishInitNested(slot); // Initializes 'this->line_height' as side effect. this->FinishInitNested(slot); // Initializes 'this->line_height' as side effect.
this->SetWidgetDisabledState(WID_AIS_RESET, _game_mode != GM_MENU && Company::IsValidID(this->slot));
this->RebuildVisibleSettings(); this->RebuildVisibleSettings();
} }
@ -533,10 +533,8 @@ struct AISettingsWindow : public Window {
break; break;
case WID_AIS_RESET: case WID_AIS_RESET:
if (_game_mode == GM_MENU || !Company::IsValidID(this->slot)) { this->ai_config->ResetEditableSettings(_game_mode == GM_MENU || ((this->slot != OWNER_DEITY) && !Company::IsValidID(this->slot)));
this->ai_config->ResetSettings(); this->SetDirty();
this->SetDirty();
}
break; break;
} }
} }

@ -32,8 +32,7 @@ void AIScannerInfo::Initialize()
ScriptAllocatorScope alloc_scope(this->engine); ScriptAllocatorScope alloc_scope(this->engine);
/* Create the dummy AI */ /* Create the dummy AI */
free(this->main_script); this->main_script = "%_dummy";
this->main_script = stredup("%_dummy");
extern void Script_CreateDummyInfo(HSQUIRRELVM vm, const char *type, const char *dir); extern void Script_CreateDummyInfo(HSQUIRRELVM vm, const char *type, const char *dir);
Script_CreateDummyInfo(this->engine->GetVM(), "AI", "ai"); Script_CreateDummyInfo(this->engine->GetVM(), "AI", "ai");
} }

@ -180,9 +180,8 @@ static bool VerifyAutoreplaceRefitForOrders(const Vehicle *v, EngineID engine_ty
CargoTypes union_refit_mask_a = GetUnionOfArticulatedRefitMasks(v->engine_type, false); CargoTypes union_refit_mask_a = GetUnionOfArticulatedRefitMasks(v->engine_type, false);
CargoTypes union_refit_mask_b = GetUnionOfArticulatedRefitMasks(engine_type, false); CargoTypes union_refit_mask_b = GetUnionOfArticulatedRefitMasks(engine_type, false);
const Order *o;
const Vehicle *u = (v->type == VEH_TRAIN) ? v->First() : v; const Vehicle *u = (v->type == VEH_TRAIN) ? v->First() : v;
FOR_VEHICLE_ORDERS(u, o) { for (const Order *o : u->Orders()) {
if (!o->IsRefit() || o->IsAutoRefit()) continue; if (!o->IsRefit() || o->IsAutoRefit()) continue;
CargoID cargo_type = o->GetRefitCargo(); CargoID cargo_type = o->GetRefitCargo();

@ -167,7 +167,7 @@ protected:
static Tbase_set *duplicate_sets; ///< All sets that aren't available, but needed for not downloading base sets when a newer version than the one on BaNaNaS is loaded. static Tbase_set *duplicate_sets; ///< All sets that aren't available, but needed for not downloading base sets when a newer version than the one on BaNaNaS is loaded.
static const Tbase_set *used_set; ///< The currently used set static const Tbase_set *used_set; ///< The currently used set
bool AddFile(const char *filename, size_t basepath_length, const char *tar_filename) override; bool AddFile(const std::string &filename, size_t basepath_length, const std::string &tar_filename) override;
/** /**
* Get the extension that is used to identify this set. * Get the extension that is used to identify this set.

@ -150,24 +150,24 @@ bool BaseSet<T, Tnum_files, Tsearch_in_tars>::FillSetDetails(IniFile *ini, const
} }
template <class Tbase_set> template <class Tbase_set>
bool BaseMedia<Tbase_set>::AddFile(const char *filename, size_t basepath_length, const char *tar_filename) bool BaseMedia<Tbase_set>::AddFile(const std::string &filename, size_t basepath_length, const std::string &tar_filename)
{ {
bool ret = false; bool ret = false;
DEBUG(grf, 1, "Checking %s for base " SET_TYPE " set", filename); DEBUG(grf, 1, "Checking %s for base " SET_TYPE " set", filename.c_str());
Tbase_set *set = new Tbase_set(); Tbase_set *set = new Tbase_set();
IniFile *ini = new IniFile(); IniFile *ini = new IniFile();
char *path = stredup(filename + basepath_length); std::string path{ filename, basepath_length };
ini->LoadFromDisk(path, BASESET_DIR); ini->LoadFromDisk(path, BASESET_DIR);
char *psep = strrchr(path, PATHSEPCHAR); auto psep = path.rfind(PATHSEPCHAR);
if (psep != nullptr) { if (psep != std::string::npos) {
psep[1] = '\0'; path.erase(psep + 1);
} else { } else {
*path = '\0'; path.clear();
} }
if (set->FillSetDetails(ini, path, filename)) { if (set->FillSetDetails(ini, path.c_str(), filename.c_str())) {
Tbase_set *duplicate = nullptr; Tbase_set *duplicate = nullptr;
for (Tbase_set *c = BaseMedia<Tbase_set>::available_sets; c != nullptr; c = c->next) { for (Tbase_set *c = BaseMedia<Tbase_set>::available_sets; c != nullptr; c = c->next) {
if (c->name == set->name || c->shortname == set->shortname) { if (c->name == set->name || c->shortname == set->shortname) {
@ -214,7 +214,6 @@ bool BaseMedia<Tbase_set>::AddFile(const char *filename, size_t basepath_length,
} else { } else {
delete set; delete set;
} }
free(path);
delete ini; delete ini;
return ret; return ret;
@ -378,7 +377,7 @@ template <class Tbase_set>
#define INSTANTIATE_BASE_MEDIA_METHODS(repl_type, set_type) \ #define INSTANTIATE_BASE_MEDIA_METHODS(repl_type, set_type) \
template std::string repl_type::ini_set; \ template std::string repl_type::ini_set; \
template const char *repl_type::GetExtension(); \ template const char *repl_type::GetExtension(); \
template bool repl_type::AddFile(const char *filename, size_t pathlength, const char *tar_filename); \ template bool repl_type::AddFile(const std::string &filename, size_t pathlength, const std::string &tar_filename); \
template bool repl_type::HasSet(const struct ContentInfo *ci, bool md5sum); \ template bool repl_type::HasSet(const struct ContentInfo *ci, bool md5sum); \
template bool repl_type::SetSet(const std::string &name); \ template bool repl_type::SetSet(const std::string &name); \
template char *repl_type::GetSetsList(char *p, const char *last); \ template char *repl_type::GetSetsList(char *p, const char *last); \

@ -31,7 +31,7 @@ public:
uint8 m; uint8 m;
uint8 v; uint8 v;
}; };
assert_compile(sizeof(MapValue) == 2); static_assert(sizeof(MapValue) == 2);
/** Helper for creating specialised functions for specific optimisations. */ /** Helper for creating specialised functions for specific optimisations. */
enum ReadMode { enum ReadMode {

@ -47,8 +47,8 @@ enum CargoCompanyBits {
CCB_COMPANY_LENGTH = 4, ///< Number of bits of the company field. CCB_COMPANY_LENGTH = 4, ///< Number of bits of the company field.
}; };
assert_compile(NUM_CARGO <= (1 << CCB_CARGO_TYPE_LENGTH)); static_assert(NUM_CARGO <= (1 << CCB_CARGO_TYPE_LENGTH));
assert_compile(MAX_COMPANIES <= (1 << CCB_COMPANY_LENGTH)); static_assert(MAX_COMPANIES <= (1 << CCB_COMPANY_LENGTH));
/** /**

@ -740,8 +740,8 @@ void VehicleCargoList::InvalidateCache()
template<VehicleCargoList::MoveToAction Tfrom, VehicleCargoList::MoveToAction Tto> template<VehicleCargoList::MoveToAction Tfrom, VehicleCargoList::MoveToAction Tto>
uint VehicleCargoList::Reassign(uint max_move, TileOrStationID) uint VehicleCargoList::Reassign(uint max_move, TileOrStationID)
{ {
assert_tcompile(Tfrom != MTA_TRANSFER && Tto != MTA_TRANSFER); static_assert(Tfrom != MTA_TRANSFER && Tto != MTA_TRANSFER);
assert_tcompile(Tfrom - Tto == 1 || Tto - Tfrom == 1); static_assert(Tfrom - Tto == 1 || Tto - Tfrom == 1);
max_move = min(this->action_counts[Tfrom], max_move); max_move = min(this->action_counts[Tfrom], max_move);
this->action_counts[Tfrom] -= max_move; this->action_counts[Tfrom] -= max_move;
this->action_counts[Tto] += max_move; this->action_counts[Tto] += max_move;

@ -205,7 +205,7 @@ static bool IsCheatAllowed(CheatNetworkMode mode)
return false; return false;
} }
assert_compile(CHT_NUM_CHEATS == lengthof(_cheats_ui)); static_assert(CHT_NUM_CHEATS == lengthof(_cheats_ui));
/** Widget definitions of the cheat GUI. */ /** Widget definitions of the cheat GUI. */
static const NWidgetPart _nested_cheat_widgets[] = { static const NWidgetPart _nested_cheat_widgets[] = {

@ -24,9 +24,9 @@
template<typename T, uint S, uint N, typename U> static inline T Extract(U v) template<typename T, uint S, uint N, typename U> static inline T Extract(U v)
{ {
/* Check if there are enough bits in v */ /* Check if there are enough bits in v */
assert_tcompile(N == EnumPropsT<T>::num_bits); static_assert(N == EnumPropsT<T>::num_bits);
assert_tcompile(S + N <= sizeof(U) * 8); static_assert(S + N <= sizeof(U) * 8);
assert_tcompile(EnumPropsT<T>::end <= (1 << N)); static_assert(EnumPropsT<T>::end <= (1 << N));
U masked = GB(v, S, N); U masked = GB(v, S, N);
return IsInsideMM(masked, EnumPropsT<T>::begin, EnumPropsT<T>::end) ? (T)masked : EnumPropsT<T>::invalid; return IsInsideMM(masked, EnumPropsT<T>::begin, EnumPropsT<T>::end) ? (T)masked : EnumPropsT<T>::invalid;
} }

@ -672,7 +672,7 @@ bool IsCommandAllowedWhilePaused(uint32 cmd)
CMDPL_NO_ACTIONS, ///< CMDT_SERVER_SETTING CMDPL_NO_ACTIONS, ///< CMDT_SERVER_SETTING
CMDPL_NO_ACTIONS, ///< CMDT_CHEAT CMDPL_NO_ACTIONS, ///< CMDT_CHEAT
}; };
assert_compile(lengthof(command_type_lookup) == CMDT_END); static_assert(lengthof(command_type_lookup) == CMDT_END);
assert(IsValidCommand(cmd)); assert(IsValidCommand(cmd));
return _game_mode == GM_EDITOR || command_type_lookup[_command_proc_table[cmd & CMD_ID_MASK].type] <= _settings_game.construction.command_pause_level; return _game_mode == GM_EDITOR || command_type_lookup[_command_proc_table[cmd & CMD_ID_MASK].type] <= _settings_game.construction.command_pause_level;

@ -2469,7 +2469,7 @@ struct CompanyWindow : Window
if (amounts[0] + amounts[1] + amounts[2] + amounts[3] == 0) { if (amounts[0] + amounts[1] + amounts[2] + amounts[3] == 0) {
DrawString(r.left, r.right, y, STR_COMPANY_VIEW_VEHICLES_NONE); DrawString(r.left, r.right, y, STR_COMPANY_VIEW_VEHICLES_NONE);
} else { } else {
assert_compile(lengthof(amounts) == lengthof(_company_view_vehicle_count_strings)); static_assert(lengthof(amounts) == lengthof(_company_view_vehicle_count_strings));
for (uint i = 0; i < lengthof(amounts); i++) { for (uint i = 0; i < lengthof(amounts); i++) {
if (amounts[i] != 0) { if (amounts[i] != 0) {

@ -83,7 +83,7 @@ static const CompanyManagerFaceBitsInfo _cmf_info[] = {
/* CMFV_GLASSES */ { 31, 1, { 2, 2, 2, 2 }, { 0x347, 0x347, 0x3AE, 0x3AE } } ///< Depends on CMFV_HAS_GLASSES /* CMFV_GLASSES */ { 31, 1, { 2, 2, 2, 2 }, { 0x347, 0x347, 0x3AE, 0x3AE } } ///< Depends on CMFV_HAS_GLASSES
}; };
/** Make sure the table's size is right. */ /** Make sure the table's size is right. */
assert_compile(lengthof(_cmf_info) == CMFV_END); static_assert(lengthof(_cmf_info) == CMFV_END);
/** /**
* Gets the company manager's face bits for the given company manager's face variable * Gets the company manager's face bits for the given company manager's face variable

@ -1903,7 +1903,7 @@ struct ConsoleContentCallback : public ContentCallback {
static void OutputContentState(const ContentInfo *const ci) static void OutputContentState(const ContentInfo *const ci)
{ {
static const char * const types[] = { "Base graphics", "NewGRF", "AI", "AI library", "Scenario", "Heightmap", "Base sound", "Base music", "Game script", "GS library" }; static const char * const types[] = { "Base graphics", "NewGRF", "AI", "AI library", "Scenario", "Heightmap", "Base sound", "Base music", "Game script", "GS library" };
assert_compile(lengthof(types) == CONTENT_TYPE_END - CONTENT_TYPE_BEGIN); static_assert(lengthof(types) == CONTENT_TYPE_END - CONTENT_TYPE_BEGIN);
static const char * const states[] = { "Not selected", "Selected", "Dep Selected", "Installed", "Unknown" }; static const char * const states[] = { "Not selected", "Selected", "Dep Selected", "Installed", "Unknown" };
static const TextColour state_to_colour[] = { CC_COMMAND, CC_INFO, CC_INFO, CC_WHITE, CC_ERROR }; static const TextColour state_to_colour[] = { CC_COMMAND, CC_INFO, CC_INFO, CC_WHITE, CC_ERROR };

@ -112,7 +112,7 @@ static inline T Align(const T x, uint n)
template <typename T> template <typename T>
static inline T *AlignPtr(T *x, uint n) static inline T *AlignPtr(T *x, uint n)
{ {
assert_compile(sizeof(size_t) == sizeof(void *)); static_assert(sizeof(size_t) == sizeof(void *));
return reinterpret_cast<T *>(Align((size_t)x, n)); return reinterpret_cast<T *>(Align((size_t)x, n));
} }

@ -80,7 +80,7 @@ private:
template <class Titem, typename Tindex, size_t Tgrowth_step, size_t Tmax_size, PoolType Tpool_type = PT_NORMAL, bool Tcache = false, bool Tzero = true> template <class Titem, typename Tindex, size_t Tgrowth_step, size_t Tmax_size, PoolType Tpool_type = PT_NORMAL, bool Tcache = false, bool Tzero = true>
struct Pool : PoolBase { struct Pool : PoolBase {
/* Ensure Tmax_size is within the bounds of Tindex. */ /* Ensure Tmax_size is within the bounds of Tindex. */
assert_compile((uint64)(Tmax_size - 1) >> 8 * sizeof(Tindex) == 0); static_assert((uint64)(Tmax_size - 1) >> 8 * sizeof(Tindex) == 0);
static const size_t MAX_SIZE = Tmax_size; ///< Make template parameter accessible from outside static const size_t MAX_SIZE = Tmax_size; ///< Make template parameter accessible from outside

@ -66,6 +66,12 @@ uint64 ottd_rdtsc()
# define RDTSC_AVAILABLE # define RDTSC_AVAILABLE
#endif #endif
#if defined(__EMSCRIPTEN__) && !defined(RDTSC_AVAILABLE)
/* On emscripten doing TIC/TOC would be ill-advised */
uint64 ottd_rdtsc() {return 0;}
# define RDTSC_AVAILABLE
#endif
/* In all other cases we have no support for rdtsc. No major issue, /* In all other cases we have no support for rdtsc. No major issue,
* you just won't be able to profile your code with TIC()/TOC() */ * you just won't be able to profile your code with TIC()/TOC() */
#if !defined(RDTSC_AVAILABLE) #if !defined(RDTSC_AVAILABLE)

@ -548,7 +548,7 @@ char *CrashLog::FillVersionInfoLog(char *buffer, const char *last) const
*/ */
bool CrashLog::WriteCrashLog(const char *buffer, char *filename, const char *filename_last, const char *name, FILE **crashlog_file) const bool CrashLog::WriteCrashLog(const char *buffer, char *filename, const char *filename_last, const char *name, FILE **crashlog_file) const
{ {
seprintf(filename, filename_last, "%s%s.log", _personal_dir, name); seprintf(filename, filename_last, "%s%s.log", _personal_dir.c_str(), name);
FILE *file = FioFOpenFile(filename, "w", NO_DIRECTORY); FILE *file = FioFOpenFile(filename, "w", NO_DIRECTORY);
if (file == nullptr) return false; if (file == nullptr) return false;
@ -587,7 +587,7 @@ bool CrashLog::WriteSavegame(char *filename, const char *filename_last, const ch
try { try {
GamelogEmergency(); GamelogEmergency();
seprintf(filename, filename_last, "%s%s.sav", _personal_dir, name); seprintf(filename, filename_last, "%s%s.sav", _personal_dir.c_str(), name);
/* Don't do a threaded saveload. */ /* Don't do a threaded saveload. */
return SaveOrLoad(filename, SLO_SAVE, DFT_GAME_FILE, NO_DIRECTORY, false) == SL_OK; return SaveOrLoad(filename, SLO_SAVE, DFT_GAME_FILE, NO_DIRECTORY, false) == SL_OK;

@ -148,9 +148,7 @@ protected:
for (const Vehicle *v : Vehicle::Iterate()) { for (const Vehicle *v : Vehicle::Iterate()) {
if (v->type < 4 && this->show_types[v->type] && v->IsPrimaryVehicle()) { if (v->type < 4 && this->show_types[v->type] && v->IsPrimaryVehicle()) {
const Order *order; for(const Order *order : v->Orders()) {
FOR_VEHICLE_ORDERS(v, order) {
if ((order->IsType(OT_GOTO_STATION) || order->IsType(OT_GOTO_WAYPOINT) || order->IsType(OT_IMPLICIT)) if ((order->IsType(OT_GOTO_STATION) || order->IsType(OT_GOTO_WAYPOINT) || order->IsType(OT_IMPLICIT))
&& order->GetDestination() == this->station) { && order->GetDestination() == this->station) {
this->vehicles.push_back(v); this->vehicles.push_back(v);

@ -1342,7 +1342,7 @@ void PrepareUnload(Vehicle *front_v)
assert(front_v->cargo_payment == nullptr); assert(front_v->cargo_payment == nullptr);
/* One CargoPayment per vehicle and the vehicle limit equals the /* One CargoPayment per vehicle and the vehicle limit equals the
* limit in number of CargoPayments. Can't go wrong. */ * limit in number of CargoPayments. Can't go wrong. */
assert_compile(CargoPaymentPool::MAX_SIZE == VehiclePool::MAX_SIZE); static_assert(CargoPaymentPool::MAX_SIZE == VehiclePool::MAX_SIZE);
assert(CargoPayment::CanAllocateItem()); assert(CargoPayment::CanAllocateItem());
front_v->cargo_payment = new CargoPayment(front_v); front_v->cargo_payment = new CargoPayment(front_v);

@ -224,6 +224,10 @@ static const int INVALID_PRICE_MODIFIER = MIN_PRICE_MODIFIER - 1;
static const uint TUNNELBRIDGE_TRACKBIT_FACTOR = 4; static const uint TUNNELBRIDGE_TRACKBIT_FACTOR = 4;
/** Multiplier for how many regular track bits a level crossing counts. */ /** Multiplier for how many regular track bits a level crossing counts. */
static const uint LEVELCROSSING_TRACKBIT_FACTOR = 2; static const uint LEVELCROSSING_TRACKBIT_FACTOR = 2;
/** Multiplier for how many regular track bits a road depot counts. */
static const uint ROAD_DEPOT_TRACKBIT_FACTOR = 2;
/** Multiplier for how many regular track bits a bay stop counts. */
static const uint ROAD_STOP_TRACKBIT_FACTOR = 2;
/** Multiplier for how many regular tiles a lock counts. */ /** Multiplier for how many regular tiles a lock counts. */
static const uint LOCK_DEPOT_TILE_FACTOR = 2; static const uint LOCK_DEPOT_TILE_FACTOR = 2;

@ -572,7 +572,7 @@ static EffectInitProc * const _effect_init_procs[] = {
SmokeInit, // EV_BREAKDOWN_SMOKE_AIRCRAFT SmokeInit, // EV_BREAKDOWN_SMOKE_AIRCRAFT
SmokeInit, // EV_COPPER_MINE_SMOKE SmokeInit, // EV_COPPER_MINE_SMOKE
}; };
assert_compile(lengthof(_effect_init_procs) == EV_END); static_assert(lengthof(_effect_init_procs) == EV_END);
/** Functions for controlling effect vehicles at each tick. */ /** Functions for controlling effect vehicles at each tick. */
static EffectTickProc * const _effect_tick_procs[] = { static EffectTickProc * const _effect_tick_procs[] = {
@ -589,7 +589,7 @@ static EffectTickProc * const _effect_tick_procs[] = {
SmokeTick, // EV_BREAKDOWN_SMOKE_AIRCRAFT SmokeTick, // EV_BREAKDOWN_SMOKE_AIRCRAFT
SmokeTick, // EV_COPPER_MINE_SMOKE SmokeTick, // EV_COPPER_MINE_SMOKE
}; };
assert_compile(lengthof(_effect_tick_procs) == EV_END); static_assert(lengthof(_effect_tick_procs) == EV_END);
/** Transparency options affecting the effects. */ /** Transparency options affecting the effects. */
static const TransparencyOption _effect_transparency_options[] = { static const TransparencyOption _effect_transparency_options[] = {
@ -606,7 +606,7 @@ static const TransparencyOption _effect_transparency_options[] = {
TO_INVALID, // EV_BREAKDOWN_SMOKE_AIRCRAFT TO_INVALID, // EV_BREAKDOWN_SMOKE_AIRCRAFT
TO_INDUSTRIES, // EV_COPPER_MINE_SMOKE TO_INDUSTRIES, // EV_COPPER_MINE_SMOKE
}; };
assert_compile(lengthof(_effect_transparency_options) == EV_END); static_assert(lengthof(_effect_transparency_options) == EV_END);
/** /**

@ -63,7 +63,7 @@ const uint8 _engine_offsets[4] = {
lengthof(_orig_rail_vehicle_info) + lengthof(_orig_road_vehicle_info) + lengthof(_orig_ship_vehicle_info), lengthof(_orig_rail_vehicle_info) + lengthof(_orig_road_vehicle_info) + lengthof(_orig_ship_vehicle_info),
}; };
assert_compile(lengthof(_orig_rail_vehicle_info) + lengthof(_orig_road_vehicle_info) + lengthof(_orig_ship_vehicle_info) + lengthof(_orig_aircraft_vehicle_info) == lengthof(_orig_engine_info)); static_assert(lengthof(_orig_rail_vehicle_info) + lengthof(_orig_road_vehicle_info) + lengthof(_orig_ship_vehicle_info) + lengthof(_orig_aircraft_vehicle_info) == lengthof(_orig_engine_info));
const uint EngineOverrideManager::NUM_DEFAULT_ENGINES = _engine_counts[VEH_TRAIN] + _engine_counts[VEH_ROAD] + _engine_counts[VEH_SHIP] + _engine_counts[VEH_AIRCRAFT]; const uint EngineOverrideManager::NUM_DEFAULT_ENGINES = _engine_counts[VEH_TRAIN] + _engine_counts[VEH_ROAD] + _engine_counts[VEH_SHIP] + _engine_counts[VEH_AIRCRAFT];
@ -663,9 +663,8 @@ void StartupOneEngine(Engine *e, Date aging_date)
e->company_avail = 0; e->company_avail = 0;
e->company_hidden = 0; e->company_hidden = 0;
/* Don't randomise the start-date in the first two years after gamestart to ensure availability /* Vehicles with the same base_intro date shall be introduced at the same time.
* of engines in early starting games. * Make sure they use the same randomisation of the date. */
* Note: TTDP uses fixed 1922 */
SavedRandomSeeds saved_seeds; SavedRandomSeeds saved_seeds;
SaveRandomSeeds(&saved_seeds); SaveRandomSeeds(&saved_seeds);
SetRandomSeed(_settings_game.game_creation.generation_seed ^ SetRandomSeed(_settings_game.game_creation.generation_seed ^
@ -674,6 +673,9 @@ void StartupOneEngine(Engine *e, Date aging_date)
e->GetGRFID()); e->GetGRFID());
uint32 r = Random(); uint32 r = Random();
/* Don't randomise the start-date in the first two years after gamestart to ensure availability
* of engines in early starting games.
* Note: TTDP uses fixed 1922 */
e->intro_date = ei->base_intro <= ConvertYMDToDate(_settings_game.game_creation.starting_year + 2, 0, 1) ? ei->base_intro : (Date)GB(r, 0, 9) + ei->base_intro; e->intro_date = ei->base_intro <= ConvertYMDToDate(_settings_game.game_creation.starting_year + 2, 0, 1) ? ei->base_intro : (Date)GB(r, 0, 9) + ei->base_intro;
if (e->intro_date <= _date) { if (e->intro_date <= _date) {
e->age = (aging_date - e->intro_date) >> 5; e->age = (aging_date - e->intro_date) >> 5;
@ -681,19 +683,20 @@ void StartupOneEngine(Engine *e, Date aging_date)
e->flags |= ENGINE_AVAILABLE; e->flags |= ENGINE_AVAILABLE;
} }
e->reliability_start = GB(r, 16, 14) + 0x7AE0; RestoreRandomSeeds(saved_seeds);
r = Random(); r = Random();
e->reliability_start = GB(r, 16, 14) + 0x7AE0;
e->reliability_max = GB(r, 0, 14) + 0xBFFF; e->reliability_max = GB(r, 0, 14) + 0xBFFF;
e->reliability_final = GB(r, 16, 14) + 0x3FFF;
r = Random(); r = Random();
e->reliability_final = GB(r, 16, 14) + 0x3FFF;
e->duration_phase_1 = GB(r, 0, 5) + 7; e->duration_phase_1 = GB(r, 0, 5) + 7;
e->duration_phase_2 = GB(r, 5, 4) + ei->base_life * 12 - 96; e->duration_phase_2 = GB(r, 5, 4) + ei->base_life * 12 - 96;
e->duration_phase_3 = GB(r, 9, 7) + 120; e->duration_phase_3 = GB(r, 9, 7) + 120;
e->reliability_spd_dec = ei->decay_speed << 2; e->reliability_spd_dec = ei->decay_speed << 2;
RestoreRandomSeeds(saved_seeds);
CalcEngineReliability(e); CalcEngineReliability(e);
/* prevent certain engines from ever appearing. */ /* prevent certain engines from ever appearing. */

File diff suppressed because it is too large Load Diff

@ -12,6 +12,7 @@
#include "core/enum_type.hpp" #include "core/enum_type.hpp"
#include "fileio_type.h" #include "fileio_type.h"
#include <string>
void FioSeekTo(size_t pos, int mode); void FioSeekTo(size_t pos, int mode);
void FioSeekToFile(uint slot, size_t pos); void FioSeekToFile(uint slot, size_t pos);
@ -21,50 +22,38 @@ byte FioReadByte();
uint16 FioReadWord(); uint16 FioReadWord();
uint32 FioReadDword(); uint32 FioReadDword();
void FioCloseAll(); void FioCloseAll();
void FioOpenFile(uint slot, const char *filename, Subdirectory subdir, char **output_filename = nullptr); void FioOpenFile(int slot, const std::string &filename, Subdirectory subdir, std::string *output_filename = nullptr);
void FioReadBlock(void *ptr, size_t size); void FioReadBlock(void *ptr, size_t size);
void FioSkipBytes(int n); void FioSkipBytes(int n);
/**
* The search paths OpenTTD could search through.
* At least one of the slots has to be filled with a path.
* nullptr paths tell that there is no such path for the
* current operating system.
*/
extern const char *_searchpaths[NUM_SEARCHPATHS];
/** /**
* Checks whether the given search path is a valid search path * Checks whether the given search path is a valid search path
* @param sp the search path to check * @param sp the search path to check
* @return true if the search path is valid * @return true if the search path is valid
*/ */
static inline bool IsValidSearchPath(Searchpath sp) bool IsValidSearchPath(Searchpath sp);
{
return sp < NUM_SEARCHPATHS && _searchpaths[sp] != nullptr;
}
/** Iterator for all the search paths */ /** Iterator for all the search paths */
#define FOR_ALL_SEARCHPATHS(sp) for (sp = SP_FIRST_DIR; sp < NUM_SEARCHPATHS; sp++) if (IsValidSearchPath(sp)) #define FOR_ALL_SEARCHPATHS(sp) for (sp = SP_FIRST_DIR; sp < NUM_SEARCHPATHS; sp++) if (IsValidSearchPath(sp))
void FioFCloseFile(FILE *f); void FioFCloseFile(FILE *f);
FILE *FioFOpenFile(const char *filename, const char *mode, Subdirectory subdir, size_t *filesize = nullptr, char **output_filename = nullptr); FILE *FioFOpenFile(const std::string &filename, const char *mode, Subdirectory subdir, size_t *filesize = nullptr, std::string *output_filename = nullptr);
bool FioCheckFileExists(const char *filename, Subdirectory subdir); bool FioCheckFileExists(const std::string &filename, Subdirectory subdir);
char *FioGetFullPath(char *buf, const char *last, Searchpath sp, Subdirectory subdir, const char *filename); std::string FioFindFullPath(Subdirectory subdir, const char *filename);
char *FioFindFullPath(char *buf, const char *last, Subdirectory subdir, const char *filename); std::string FioGetDirectory(Searchpath sp, Subdirectory subdir);
char *FioAppendDirectory(char *buf, const char *last, Searchpath sp, Subdirectory subdir); std::string FioFindDirectory(Subdirectory subdir);
char *FioGetDirectory(char *buf, const char *last, Subdirectory subdir); void FioCreateDirectory(const std::string &name);
void FioCreateDirectory(const char *name);
const char *FiosGetScreenshotDir(); const char *FiosGetScreenshotDir();
void SanitizeFilename(char *filename); void SanitizeFilename(char *filename);
bool AppendPathSeparator(char *buf, const char *last); void AppendPathSeparator(std::string &buf);
void DeterminePaths(const char *exe); void DeterminePaths(const char *exe);
void *ReadFileToMem(const char *filename, size_t *lenp, size_t maxsize); std::unique_ptr<char> ReadFileToMem(const std::string &filename, size_t &lenp, size_t maxsize);
bool FileExists(const char *filename); bool FileExists(const std::string &filename);
bool ExtractTar(const char *tar_filename, Subdirectory subdir); bool ExtractTar(const std::string &tar_filename, Subdirectory subdir);
extern const char *_personal_dir; ///< custom directory for personal settings, saves, newgrf, etc. extern std::string _personal_dir; ///< custom directory for personal settings, saves, newgrf, etc.
/** Helper for scanning for files with a given name */ /** Helper for scanning for files with a given name */
class FileScanner { class FileScanner {
@ -85,7 +74,7 @@ public:
* @param tar_filename the name of the tar file the file is read from. * @param tar_filename the name of the tar file the file is read from.
* @return true if the file is added. * @return true if the file is added.
*/ */
virtual bool AddFile(const char *filename, size_t basepath_length, const char *tar_filename) = 0; virtual bool AddFile(const std::string &filename, size_t basepath_length, const std::string &tar_filename) = 0;
}; };
/** Helper for scanning for files with tar as extension */ /** Helper for scanning for files with tar as extension */
@ -103,9 +92,9 @@ public:
ALL = BASESET | NEWGRF | AI | SCENARIO | GAME, ///< Scan for everything. ALL = BASESET | NEWGRF | AI | SCENARIO | GAME, ///< Scan for everything.
}; };
bool AddFile(const char *filename, size_t basepath_length, const char *tar_filename = nullptr) override; bool AddFile(const std::string &filename, size_t basepath_length, const std::string &tar_filename = {}) override;
bool AddFile(Subdirectory sd, const char *filename); bool AddFile(Subdirectory sd, const std::string &filename);
/** Do the scan for Tars. */ /** Do the scan for Tars. */
static uint DoScan(TarScanner::Mode mode); static uint DoScan(TarScanner::Mode mode);

@ -128,10 +128,10 @@ enum Subdirectory {
/** /**
* Types of searchpaths OpenTTD might use * Types of searchpaths OpenTTD might use
*/ */
enum Searchpath { enum Searchpath : unsigned {
SP_FIRST_DIR, SP_FIRST_DIR,
SP_WORKING_DIR = SP_FIRST_DIR, ///< Search in the working directory SP_WORKING_DIR = SP_FIRST_DIR, ///< Search in the working directory
#if defined(WITH_XDG_BASEDIR) && defined(WITH_PERSONAL_DIR) #ifdef USE_XDG
SP_PERSONAL_DIR_XDG, ///< Search in the personal directory from the XDG specification SP_PERSONAL_DIR_XDG, ///< Search in the personal directory from the XDG specification
#endif #endif
SP_PERSONAL_DIR, ///< Search in the personal directory SP_PERSONAL_DIR, ///< Search in the personal directory
@ -140,6 +140,8 @@ enum Searchpath {
SP_INSTALLATION_DIR, ///< Search in the installation directory SP_INSTALLATION_DIR, ///< Search in the installation directory
SP_APPLICATION_BUNDLE_DIR, ///< Search within the application bundle SP_APPLICATION_BUNDLE_DIR, ///< Search within the application bundle
SP_AUTODOWNLOAD_DIR, ///< Search within the autodownload directory SP_AUTODOWNLOAD_DIR, ///< Search within the autodownload directory
SP_AUTODOWNLOAD_PERSONAL_DIR, ///< Search within the autodownload directory located in the personal directory
SP_AUTODOWNLOAD_PERSONAL_DIR_XDG, ///< Search within the autodownload directory located in the personal directory (XDG variant)
NUM_SEARCHPATHS NUM_SEARCHPATHS
}; };

@ -19,6 +19,8 @@
#include "string_func.h" #include "string_func.h"
#include "tar_type.h" #include "tar_type.h"
#include <sys/stat.h> #include <sys/stat.h>
#include <functional>
#include <optional>
#ifndef _WIN32 #ifndef _WIN32
# include <unistd.h> # include <unistd.h>
@ -29,8 +31,7 @@
#include "safeguards.h" #include "safeguards.h"
/* Variables to display file lists */ /* Variables to display file lists */
static char *_fios_path; static std::string *_fios_path = nullptr;
static const char *_fios_path_last;
SortingBits _savegame_sort_order = SORT_BY_DATE | SORT_DESCENDING; SortingBits _savegame_sort_order = SORT_BY_DATE | SORT_DESCENDING;
/* OS-specific functions are taken from their respective files (win32/unix/os2 .c) */ /* OS-specific functions are taken from their respective files (win32/unix/os2 .c) */
@ -41,7 +42,7 @@ extern void FiosGetDrives(FileList &file_list);
extern bool FiosGetDiskFreeSpace(const char *path, uint64 *tot); extern bool FiosGetDiskFreeSpace(const char *path, uint64 *tot);
/* get the name of an oldstyle savegame */ /* get the name of an oldstyle savegame */
extern void GetOldSaveGameName(const char *file, char *title, const char *last); extern void GetOldSaveGameName(const std::string &file, char *title, const char *last);
/** /**
* Compare two FiosItem's. Used with sort when sorting the file list. * Compare two FiosItem's. Used with sort when sorting the file list.
@ -138,7 +139,7 @@ const FiosItem *FileList::FindItem(const char *file)
*/ */
StringID FiosGetDescText(const char **path, uint64 *total_free) StringID FiosGetDescText(const char **path, uint64 *total_free)
{ {
*path = _fios_path; *path = _fios_path->c_str();
return FiosGetDiskFreeSpace(*path, total_free) ? STR_SAVELOAD_BYTES_FREE : STR_ERROR_UNABLE_TO_READ_DRIVE; return FiosGetDiskFreeSpace(*path, total_free) ? STR_SAVELOAD_BYTES_FREE : STR_ERROR_UNABLE_TO_READ_DRIVE;
} }
@ -152,7 +153,8 @@ const char *FiosBrowseTo(const FiosItem *item)
switch (item->type) { switch (item->type) {
case FIOS_TYPE_DRIVE: case FIOS_TYPE_DRIVE:
#if defined(_WIN32) || defined(__OS2__) #if defined(_WIN32) || defined(__OS2__)
seprintf(_fios_path, _fios_path_last, "%c:" PATHSEP, item->title[0]); assert(_fios_path != nullptr);
*_fios_path = std::string{ item->title[0] } + ":" PATHSEP;
#endif #endif
break; break;
@ -160,25 +162,28 @@ const char *FiosBrowseTo(const FiosItem *item)
break; break;
case FIOS_TYPE_PARENT: { case FIOS_TYPE_PARENT: {
/* Check for possible nullptr ptr */ assert(_fios_path != nullptr);
char *s = strrchr(_fios_path, PATHSEPCHAR); auto s = _fios_path->find_last_of(PATHSEPCHAR);
if (s != nullptr && s != _fios_path) { if (s != std::string::npos && s != 0) {
s[0] = '\0'; // Remove last path separator character, so we can go up one level. _fios_path->erase(s); // Remove last path separator character, so we can go up one level.
} }
s = strrchr(_fios_path, PATHSEPCHAR);
if (s != nullptr) { s = _fios_path->find_last_of(PATHSEPCHAR);
s[1] = '\0'; // go up a directory if (s != std::string::npos) {
_fios_path->erase(s + 1); // go up a directory
} }
break; break;
} }
case FIOS_TYPE_DIR: case FIOS_TYPE_DIR:
strecat(_fios_path, item->name, _fios_path_last); assert(_fios_path != nullptr);
strecat(_fios_path, PATHSEP, _fios_path_last); *_fios_path += item->name;
*_fios_path += PATHSEP;
break; break;
case FIOS_TYPE_DIRECT: case FIOS_TYPE_DIRECT:
seprintf(_fios_path, _fios_path_last, "%s", item->name); assert(_fios_path != nullptr);
*_fios_path = item->name;
break; break;
case FIOS_TYPE_FILE: case FIOS_TYPE_FILE:
@ -195,26 +200,26 @@ const char *FiosBrowseTo(const FiosItem *item)
/** /**
* Construct a filename from its components in destination buffer \a buf. * Construct a filename from its components in destination buffer \a buf.
* @param buf Destination buffer.
* @param path Directory path, may be \c nullptr. * @param path Directory path, may be \c nullptr.
* @param name Filename. * @param name Filename.
* @param ext Filename extension (use \c "" for no extension). * @param ext Filename extension (use \c "" for no extension).
* @param last Last element of buffer \a buf. * @return The completed filename.
*/ */
static void FiosMakeFilename(char *buf, const char *path, const char *name, const char *ext, const char *last) static std::string FiosMakeFilename(const std::string *path, const char *name, const char *ext)
{ {
std::string buf;
if (path != nullptr) { if (path != nullptr) {
const char *buf_start = buf; buf = *path;
buf = strecpy(buf, path, last);
/* Remove trailing path separator, if present */ /* Remove trailing path separator, if present */
if (buf > buf_start && buf[-1] == PATHSEPCHAR) buf--; if (!buf.empty() && buf.back() == PATHSEPCHAR) buf.pop_back();
} }
/* Don't append the extension if it is already there */ /* Don't append the extension if it is already there */
const char *period = strrchr(name, '.'); const char *period = strrchr(name, '.');
if (period != nullptr && strcasecmp(period, ext) == 0) ext = ""; if (period != nullptr && strcasecmp(period, ext) == 0) ext = "";
seprintf(buf, last, PATHSEP "%s%s", name, ext); return buf + PATHSEP + name + ext;
} }
/** /**
@ -222,27 +227,26 @@ static void FiosMakeFilename(char *buf, const char *path, const char *name, cons
* @param buf Destination buffer for saving the filename. * @param buf Destination buffer for saving the filename.
* @param name Name of the file. * @param name Name of the file.
* @param last Last element of buffer \a buf. * @param last Last element of buffer \a buf.
* @return The completed filename.
*/ */
void FiosMakeSavegameName(char *buf, const char *name, const char *last) std::string FiosMakeSavegameName(const char *name)
{ {
const char *extension = (_game_mode == GM_EDITOR) ? ".scn" : ".sav"; const char *extension = (_game_mode == GM_EDITOR) ? ".scn" : ".sav";
FiosMakeFilename(buf, _fios_path, name, extension, last); return FiosMakeFilename(_fios_path, name, extension);
} }
/** /**
* Construct a filename for a height map. * Construct a filename for a height map.
* @param buf Destination buffer.
* @param name Filename. * @param name Filename.
* @param last Last element of buffer \a buf. * @return The completed filename.
*/ */
void FiosMakeHeightmapName(char *buf, const char *name, const char *last) std::string FiosMakeHeightmapName(const char *name)
{ {
char ext[5]; std::string ext(".");
ext[0] = '.'; ext += GetCurrentScreenshotExtension();
strecpy(ext + 1, GetCurrentScreenshotExtension(), lastof(ext));
FiosMakeFilename(buf, _fios_path, name, ext, last); return FiosMakeFilename(_fios_path, name, ext.c_str());
} }
/** /**
@ -252,13 +256,11 @@ void FiosMakeHeightmapName(char *buf, const char *name, const char *last)
*/ */
bool FiosDelete(const char *name) bool FiosDelete(const char *name)
{ {
char filename[512]; std::string filename = FiosMakeSavegameName(name);
return unlink(filename.c_str()) == 0;
FiosMakeSavegameName(filename, name, lastof(filename));
return unlink(filename) == 0;
} }
typedef FiosType fios_getlist_callback_proc(SaveLoadOperation fop, const char *filename, const char *ext, char *title, const char *last); typedef FiosType fios_getlist_callback_proc(SaveLoadOperation fop, const std::string &filename, const char *ext, char *title, const char *last);
/** /**
* Scanner to scan for a particular type of FIOS file. * Scanner to scan for a particular type of FIOS file.
@ -278,7 +280,7 @@ public:
fop(fop), callback_proc(callback_proc), file_list(file_list) fop(fop), callback_proc(callback_proc), file_list(file_list)
{} {}
bool AddFile(const char *filename, size_t basepath_length, const char *tar_filename) override; bool AddFile(const std::string &filename, size_t basepath_length, const std::string &tar_filename) override;
}; };
/** /**
@ -287,25 +289,26 @@ public:
* @param basepath_length amount of characters to chop of before to get a relative filename * @param basepath_length amount of characters to chop of before to get a relative filename
* @return true if the file is added. * @return true if the file is added.
*/ */
bool FiosFileScanner::AddFile(const char *filename, size_t basepath_length, const char *tar_filename) bool FiosFileScanner::AddFile(const std::string &filename, size_t basepath_length, const std::string &tar_filename)
{ {
const char *ext = strrchr(filename, '.'); auto sep = filename.rfind('.');
if (ext == nullptr) return false; if (sep == std::string::npos) return false;
std::string ext = filename.substr(sep);
char fios_title[64]; char fios_title[64];
fios_title[0] = '\0'; // reset the title; fios_title[0] = '\0'; // reset the title;
FiosType type = this->callback_proc(this->fop, filename, ext, fios_title, lastof(fios_title)); FiosType type = this->callback_proc(this->fop, filename, ext.c_str(), fios_title, lastof(fios_title));
if (type == FIOS_TYPE_INVALID) return false; if (type == FIOS_TYPE_INVALID) return false;
for (const FiosItem *fios = file_list.Begin(); fios != file_list.End(); fios++) { for (const FiosItem *fios = file_list.Begin(); fios != file_list.End(); fios++) {
if (strcmp(fios->name, filename) == 0) return false; if (filename == fios->name) return false;
} }
FiosItem *fios = file_list.Append(); FiosItem *fios = file_list.Append();
#ifdef _WIN32 #ifdef _WIN32
// Retrieve the file modified date using GetFileTime rather than stat to work around an obscure MSVC bug that affects Windows XP // Retrieve the file modified date using GetFileTime rather than stat to work around an obscure MSVC bug that affects Windows XP
HANDLE fh = CreateFile(OTTD2FS(filename), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, nullptr); HANDLE fh = CreateFile(OTTD2FS(filename.c_str()), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, nullptr);
if (fh != INVALID_HANDLE_VALUE) { if (fh != INVALID_HANDLE_VALUE) {
FILETIME ft; FILETIME ft;
@ -324,7 +327,7 @@ bool FiosFileScanner::AddFile(const char *filename, size_t basepath_length, cons
CloseHandle(fh); CloseHandle(fh);
#else #else
struct stat sb; struct stat sb;
if (stat(filename, &sb) == 0) { if (stat(filename.c_str(), &sb) == 0) {
fios->mtime = sb.st_mtime; fios->mtime = sb.st_mtime;
#endif #endif
} else { } else {
@ -332,13 +335,13 @@ bool FiosFileScanner::AddFile(const char *filename, size_t basepath_length, cons
} }
fios->type = type; fios->type = type;
strecpy(fios->name, filename, lastof(fios->name)); strecpy(fios->name, filename.c_str(), lastof(fios->name));
/* If the file doesn't have a title, use its filename */ /* If the file doesn't have a title, use its filename */
const char *t = fios_title; const char *t = fios_title;
if (StrEmpty(fios_title)) { if (StrEmpty(fios_title)) {
t = strrchr(filename, PATHSEPCHAR); auto ps = filename.rfind(PATHSEPCHAR);
t = (t == nullptr) ? filename : (t + 1); t = filename.c_str() + (ps == std::string::npos ? 0 : ps + 1);
} }
strecpy(fios->title, t, lastof(fios->title)); strecpy(fios->title, t, lastof(fios->title));
str_validate(fios->title, lastof(fios->title)); str_validate(fios->title, lastof(fios->title));
@ -365,8 +368,10 @@ static void FiosGetFileList(SaveLoadOperation fop, fios_getlist_callback_proc *c
file_list.Clear(); file_list.Clear();
assert(_fios_path != nullptr);
/* A parent directory link exists if we are not in the root directory */ /* A parent directory link exists if we are not in the root directory */
if (!FiosIsRoot(_fios_path)) { if (!FiosIsRoot(_fios_path->c_str())) {
fios = file_list.Append(); fios = file_list.Append();
fios->type = FIOS_TYPE_PARENT; fios->type = FIOS_TYPE_PARENT;
fios->mtime = 0; fios->mtime = 0;
@ -375,12 +380,12 @@ static void FiosGetFileList(SaveLoadOperation fop, fios_getlist_callback_proc *c
} }
/* Show subdirectories */ /* Show subdirectories */
if ((dir = ttd_opendir(_fios_path)) != nullptr) { if ((dir = ttd_opendir(_fios_path->c_str())) != nullptr) {
while ((dirent = readdir(dir)) != nullptr) { while ((dirent = readdir(dir)) != nullptr) {
strecpy(d_name, FS2OTTD(dirent->d_name), lastof(d_name)); strecpy(d_name, FS2OTTD(dirent->d_name), lastof(d_name));
/* found file must be directory, but not '.' or '..' */ /* found file must be directory, but not '.' or '..' */
if (FiosIsValidFile(_fios_path, dirent, &sb) && S_ISDIR(sb.st_mode) && if (FiosIsValidFile(_fios_path->c_str(), dirent, &sb) && S_ISDIR(sb.st_mode) &&
(!FiosIsHiddenFile(dirent) || strncasecmp(d_name, PERSONAL_DIR, strlen(d_name)) == 0) && (!FiosIsHiddenFile(dirent) || strncasecmp(d_name, PERSONAL_DIR, strlen(d_name)) == 0) &&
strcmp(d_name, ".") != 0 && strcmp(d_name, "..") != 0) { strcmp(d_name, ".") != 0 && strcmp(d_name, "..") != 0) {
fios = file_list.Append(); fios = file_list.Append();
@ -408,7 +413,7 @@ static void FiosGetFileList(SaveLoadOperation fop, fios_getlist_callback_proc *c
/* Show files */ /* Show files */
FiosFileScanner scanner(fop, callback_proc, file_list); FiosFileScanner scanner(fop, callback_proc, file_list);
if (subdir == NO_DIRECTORY) { if (subdir == NO_DIRECTORY) {
scanner.Scan(nullptr, _fios_path, false); scanner.Scan(nullptr, _fios_path->c_str(), false);
} else { } else {
scanner.Scan(nullptr, subdir, true, true); scanner.Scan(nullptr, subdir, true, true);
} }
@ -429,11 +434,10 @@ static void FiosGetFileList(SaveLoadOperation fop, fios_getlist_callback_proc *c
* @param last the last element in the title buffer * @param last the last element in the title buffer
* @param subdir the sub directory to search in * @param subdir the sub directory to search in
*/ */
static void GetFileTitle(const char *file, char *title, const char *last, Subdirectory subdir) static void GetFileTitle(const std::string &file, char *title, const char *last, Subdirectory subdir)
{ {
char buf[MAX_PATH]; std::string buf = file;
strecpy(buf, file, lastof(buf)); buf += ".title";
strecat(buf, ".title", lastof(buf));
FILE *f = FioFOpenFile(buf, "r", subdir); FILE *f = FioFOpenFile(buf, "r", subdir);
if (f == nullptr) return; if (f == nullptr) return;
@ -456,7 +460,7 @@ static void GetFileTitle(const char *file, char *title, const char *last, Subdir
* @see FiosGetFileList * @see FiosGetFileList
* @see FiosGetSavegameList * @see FiosGetSavegameList
*/ */
FiosType FiosGetSavegameListCallback(SaveLoadOperation fop, const char *file, const char *ext, char *title, const char *last) FiosType FiosGetSavegameListCallback(SaveLoadOperation fop, const std::string &file, const char *ext, char *title, const char *last)
{ {
/* Show savegame files /* Show savegame files
* .SAV OpenTTD saved game * .SAV OpenTTD saved game
@ -491,17 +495,11 @@ FiosType FiosGetSavegameListCallback(SaveLoadOperation fop, const char *file, co
*/ */
void FiosGetSavegameList(SaveLoadOperation fop, FileList &file_list) void FiosGetSavegameList(SaveLoadOperation fop, FileList &file_list)
{ {
static char *fios_save_path = nullptr; static std::optional<std::string> fios_save_path;
static char *fios_save_path_last = nullptr;
if (fios_save_path == nullptr) { if (!fios_save_path) fios_save_path = FioFindDirectory(SAVE_DIR);
fios_save_path = MallocT<char>(MAX_PATH);
fios_save_path_last = fios_save_path + MAX_PATH - 1;
FioGetDirectory(fios_save_path, fios_save_path_last, SAVE_DIR);
}
_fios_path = fios_save_path; _fios_path = &(*fios_save_path);
_fios_path_last = fios_save_path_last;
FiosGetFileList(fop, &FiosGetSavegameListCallback, NO_DIRECTORY, file_list); FiosGetFileList(fop, &FiosGetSavegameListCallback, NO_DIRECTORY, file_list);
} }
@ -517,7 +515,7 @@ void FiosGetSavegameList(SaveLoadOperation fop, FileList &file_list)
* @see FiosGetFileList * @see FiosGetFileList
* @see FiosGetScenarioList * @see FiosGetScenarioList
*/ */
static FiosType FiosGetScenarioListCallback(SaveLoadOperation fop, const char *file, const char *ext, char *title, const char *last) static FiosType FiosGetScenarioListCallback(SaveLoadOperation fop, const std::string &file, const char *ext, char *title, const char *last)
{ {
/* Show scenario files /* Show scenario files
* .SCN OpenTTD style scenario file * .SCN OpenTTD style scenario file
@ -546,27 +544,19 @@ static FiosType FiosGetScenarioListCallback(SaveLoadOperation fop, const char *f
*/ */
void FiosGetScenarioList(SaveLoadOperation fop, FileList &file_list) void FiosGetScenarioList(SaveLoadOperation fop, FileList &file_list)
{ {
static char *fios_scn_path = nullptr; static std::optional<std::string> fios_scn_path;
static char *fios_scn_path_last = nullptr;
/* Copy the default path on first run or on 'New Game' */ /* Copy the default path on first run or on 'New Game' */
if (fios_scn_path == nullptr) { if (!fios_scn_path) fios_scn_path = FioFindDirectory(SCENARIO_DIR);
fios_scn_path = MallocT<char>(MAX_PATH);
fios_scn_path_last = fios_scn_path + MAX_PATH - 1;
FioGetDirectory(fios_scn_path, fios_scn_path_last, SCENARIO_DIR);
}
_fios_path = fios_scn_path;
_fios_path_last = fios_scn_path_last;
char base_path[MAX_PATH]; _fios_path = &(*fios_scn_path);
FioGetDirectory(base_path, lastof(base_path), SCENARIO_DIR);
Subdirectory subdir = (fop == SLO_LOAD && strcmp(base_path, _fios_path) == 0) ? SCENARIO_DIR : NO_DIRECTORY; std::string base_path = FioFindDirectory(SCENARIO_DIR);
Subdirectory subdir = (fop == SLO_LOAD && base_path == *_fios_path) ? SCENARIO_DIR : NO_DIRECTORY;
FiosGetFileList(fop, &FiosGetScenarioListCallback, subdir, file_list); FiosGetFileList(fop, &FiosGetScenarioListCallback, subdir, file_list);
} }
static FiosType FiosGetHeightmapListCallback(SaveLoadOperation fop, const char *file, const char *ext, char *title, const char *last) static FiosType FiosGetHeightmapListCallback(SaveLoadOperation fop, const std::string &file, const char *ext, char *title, const char *last)
{ {
/* Show heightmap files /* Show heightmap files
* .PNG PNG Based heightmap files * .PNG PNG Based heightmap files
@ -593,10 +583,9 @@ static FiosType FiosGetHeightmapListCallback(SaveLoadOperation fop, const char *
bool match = false; bool match = false;
Searchpath sp; Searchpath sp;
FOR_ALL_SEARCHPATHS(sp) { FOR_ALL_SEARCHPATHS(sp) {
char buf[MAX_PATH]; std::string buf = FioGetDirectory(sp, HEIGHTMAP_DIR);
FioAppendDirectory(buf, lastof(buf), sp, HEIGHTMAP_DIR);
if (strncmp(buf, it->second.tar_filename, strlen(buf)) == 0) { if (buf.compare(0, buf.size(), it->second.tar_filename, 0, buf.size()) == 0) {
match = true; match = true;
break; break;
} }
@ -617,22 +606,14 @@ static FiosType FiosGetHeightmapListCallback(SaveLoadOperation fop, const char *
*/ */
void FiosGetHeightmapList(SaveLoadOperation fop, FileList &file_list) void FiosGetHeightmapList(SaveLoadOperation fop, FileList &file_list)
{ {
static char *fios_hmap_path = nullptr; static std::optional<std::string> fios_hmap_path;
static char *fios_hmap_path_last = nullptr;
if (fios_hmap_path == nullptr) { if (!fios_hmap_path) fios_hmap_path = FioFindDirectory(HEIGHTMAP_DIR);
fios_hmap_path = MallocT<char>(MAX_PATH);
fios_hmap_path_last = fios_hmap_path + MAX_PATH - 1;
FioGetDirectory(fios_hmap_path, fios_hmap_path_last, HEIGHTMAP_DIR);
}
_fios_path = fios_hmap_path;
_fios_path_last = fios_hmap_path_last;
char base_path[MAX_PATH]; _fios_path = &(*fios_hmap_path);
FioGetDirectory(base_path, lastof(base_path), HEIGHTMAP_DIR);
Subdirectory subdir = strcmp(base_path, _fios_path) == 0 ? HEIGHTMAP_DIR : NO_DIRECTORY; std::string base_path = FioFindDirectory(HEIGHTMAP_DIR);
Subdirectory subdir = base_path == *_fios_path ? HEIGHTMAP_DIR : NO_DIRECTORY;
FiosGetFileList(fop, &FiosGetHeightmapListCallback, subdir, file_list); FiosGetFileList(fop, &FiosGetHeightmapListCallback, subdir, file_list);
} }
@ -642,14 +623,11 @@ void FiosGetHeightmapList(SaveLoadOperation fop, FileList &file_list)
*/ */
const char *FiosGetScreenshotDir() const char *FiosGetScreenshotDir()
{ {
static char *fios_screenshot_path = nullptr; static std::optional<std::string> fios_screenshot_path;
if (fios_screenshot_path == nullptr) { if (!fios_screenshot_path) fios_screenshot_path = FioFindDirectory(SCREENSHOT_DIR);
fios_screenshot_path = MallocT<char>(MAX_PATH);
FioGetDirectory(fios_screenshot_path, fios_screenshot_path + MAX_PATH - 1, SCREENSHOT_DIR);
}
return fios_screenshot_path; return fios_screenshot_path->c_str();
} }
/** Basic data to distinguish a scenario. Used in the server list window */ /** Basic data to distinguish a scenario. Used in the server list window */
@ -691,7 +669,7 @@ public:
this->scanned = true; this->scanned = true;
} }
bool AddFile(const char *filename, size_t basepath_length, const char *tar_filename) override bool AddFile(const std::string &filename, size_t basepath_length, const std::string &tar_filename) override
{ {
FILE *f = FioFOpenFile(filename, "r", SCENARIO_DIR); FILE *f = FioFOpenFile(filename, "r", SCENARIO_DIR);
if (f == nullptr) return false; if (f == nullptr) return false;
@ -700,19 +678,16 @@ public:
int fret = fscanf(f, "%u", &id.scenid); int fret = fscanf(f, "%u", &id.scenid);
FioFCloseFile(f); FioFCloseFile(f);
if (fret != 1) return false; if (fret != 1) return false;
strecpy(id.filename, filename, lastof(id.filename)); strecpy(id.filename, filename.c_str(), lastof(id.filename));
Md5 checksum; Md5 checksum;
uint8 buffer[1024]; uint8 buffer[1024];
char basename[MAX_PATH]; ///< \a filename without the extension.
size_t len, size; size_t len, size;
/* open the scenario file, but first get the name. /* open the scenario file, but first get the name.
* This is safe as we check on extension which * This is safe as we check on extension which
* must always exist. */ * must always exist. */
strecpy(basename, filename, lastof(basename)); f = FioFOpenFile(filename.substr(0, filename.rfind('.')), "rb", SCENARIO_DIR, &size);
*strrchr(basename, '.') = '\0';
f = FioFOpenFile(basename, "rb", SCENARIO_DIR, &size);
if (f == nullptr) return false; if (f == nullptr) return false;
/* calculate md5sum */ /* calculate md5sum */

@ -227,9 +227,9 @@ const char *FiosBrowseTo(const FiosItem *item);
StringID FiosGetDescText(const char **path, uint64 *total_free); StringID FiosGetDescText(const char **path, uint64 *total_free);
bool FiosDelete(const char *name); bool FiosDelete(const char *name);
void FiosMakeHeightmapName(char *buf, const char *name, const char *last); std::string FiosMakeHeightmapName(const char *name);
void FiosMakeSavegameName(char *buf, const char *name, const char *last); std::string FiosMakeSavegameName(const char *name);
FiosType FiosGetSavegameListCallback(SaveLoadOperation fop, const char *file, const char *ext, char *title, const char *last); FiosType FiosGetSavegameListCallback(SaveLoadOperation fop, const std::string &file, const char *ext, char *title, const char *last);
#endif /* FIOS_H */ #endif /* FIOS_H */

@ -373,22 +373,24 @@ public:
/* Select the initial directory. */ /* Select the initial directory. */
o_dir.type = FIOS_TYPE_DIRECT; o_dir.type = FIOS_TYPE_DIRECT;
std::string dir;
switch (this->abstract_filetype) { switch (this->abstract_filetype) {
case FT_SAVEGAME: case FT_SAVEGAME:
FioGetDirectory(o_dir.name, lastof(o_dir.name), SAVE_DIR); dir = FioFindDirectory(SAVE_DIR);
break; break;
case FT_SCENARIO: case FT_SCENARIO:
FioGetDirectory(o_dir.name, lastof(o_dir.name), SCENARIO_DIR); dir = FioFindDirectory(SCENARIO_DIR);
break; break;
case FT_HEIGHTMAP: case FT_HEIGHTMAP:
FioGetDirectory(o_dir.name, lastof(o_dir.name), HEIGHTMAP_DIR); dir = FioFindDirectory(HEIGHTMAP_DIR);
break; break;
default: default:
strecpy(o_dir.name, _personal_dir, lastof(o_dir.name)); dir = _personal_dir;
} }
strecpy(o_dir.name, dir.c_str(), lastof(o_dir.name));
switch (this->fop) { switch (this->fop) {
case SLO_SAVE: case SLO_SAVE:
@ -785,7 +787,7 @@ public:
} }
} else if (this->IsWidgetLowered(WID_SL_SAVE_GAME)) { // Save button clicked } else if (this->IsWidgetLowered(WID_SL_SAVE_GAME)) { // Save button clicked
if (this->abstract_filetype == FT_SAVEGAME || this->abstract_filetype == FT_SCENARIO) { if (this->abstract_filetype == FT_SAVEGAME || this->abstract_filetype == FT_SCENARIO) {
FiosMakeSavegameName(_file_to_saveload.name, this->filename_editbox.text.buf, lastof(_file_to_saveload.name)); _file_to_saveload.name = FiosMakeSavegameName(this->filename_editbox.text.buf);
const bool known_id = _load_check_data.settings.game_creation.generation_unique_id != 0; const bool known_id = _load_check_data.settings.game_creation.generation_unique_id != 0;
const bool different_id = known_id && _load_check_data.settings.game_creation.generation_unique_id != _settings_game.game_creation.generation_unique_id; const bool different_id = known_id && _load_check_data.settings.game_creation.generation_unique_id != _settings_game.game_creation.generation_unique_id;
if (_settings_client.gui.savegame_overwrite_confirm >= 1 && different_id) { if (_settings_client.gui.savegame_overwrite_confirm >= 1 && different_id) {
@ -798,7 +800,7 @@ public:
_switch_mode = SM_SAVE_GAME; _switch_mode = SM_SAVE_GAME;
} }
} else { } else {
FiosMakeHeightmapName(_file_to_saveload.name, this->filename_editbox.text.buf, lastof(_file_to_saveload.name)); _file_to_saveload.name = FiosMakeHeightmapName(this->filename_editbox.text.buf);
if (_settings_client.gui.savegame_overwrite_confirm >= 1 && FioCheckFileExists(_file_to_saveload.name, Subdirectory::SAVE_DIR)) { if (_settings_client.gui.savegame_overwrite_confirm >= 1 && FioCheckFileExists(_file_to_saveload.name, Subdirectory::SAVE_DIR)) {
ShowQuery(STR_SAVELOAD_OVERWRITE_TITLE, STR_SAVELOAD_OVERWRITE_WARNING, this, SaveLoadWindow::SaveHeightmapConfirmationCallback); ShowQuery(STR_SAVELOAD_OVERWRITE_TITLE, STR_SAVELOAD_OVERWRITE_WARNING, this, SaveLoadWindow::SaveHeightmapConfirmationCallback);
} else { } else {

@ -567,8 +567,27 @@ static void LoadFreeTypeFont(FontSize fs)
} }
FT_Face face = nullptr; FT_Face face = nullptr;
/* If font is an absolute path to a ttf, try loading that first. */
FT_Error error = FT_New_Face(_library, settings->font, 0, &face); FT_Error error = FT_New_Face(_library, settings->font, 0, &face);
#if defined(WITH_COCOA)
extern void MacOSRegisterExternalFont(const char *file_path);
if (error == FT_Err_Ok) MacOSRegisterExternalFont(settings->font);
#endif
if (error != FT_Err_Ok) {
/* Check if font is a relative filename in one of our search-paths. */
std::string full_font = FioFindFullPath(BASE_DIR, settings->font);
if (!full_font.empty()) {
error = FT_New_Face(_library, full_font.c_str(), 0, &face);
#if defined(WITH_COCOA)
if (error == FT_Err_Ok) MacOSRegisterExternalFont(full_font.c_str());
#endif
}
}
/* Try loading based on font face name (OS-wide fonts). */
if (error != FT_Err_Ok) error = GetFontByFaceName(settings->font, &face); if (error != FT_Err_Ok) error = GetFontByFaceName(settings->font, &face);
if (error == FT_Err_Ok) { if (error == FT_Err_Ok) {
@ -978,42 +997,55 @@ static void LoadWin32Font(FontSize fs)
if (settings->os_handle != nullptr) { if (settings->os_handle != nullptr) {
logfont = *(const LOGFONT *)settings->os_handle; logfont = *(const LOGFONT *)settings->os_handle;
} else if (strchr(settings->font, '.') != nullptr && FileExists(settings->font)) { } else if (strchr(settings->font, '.') != nullptr) {
/* Might be a font file name, try load it. */ /* Might be a font file name, try load it. */
TCHAR fontPath[MAX_PATH];
convert_to_fs(settings->font, fontPath, lengthof(fontPath), false);
if (AddFontResourceEx(fontPath, FR_PRIVATE, 0) != 0) { TCHAR fontPath[MAX_PATH] = {};
/* Try a nice little undocumented function first for getting the internal font name.
* Some documentation is found at: http://www.undocprint.org/winspool/getfontresourceinfo */ /* See if this is an absolute path. */
typedef BOOL(WINAPI * PFNGETFONTRESOURCEINFO)(LPCTSTR, LPDWORD, LPVOID, DWORD); if (FileExists(settings->font)) {
convert_to_fs(settings->font, fontPath, lengthof(fontPath), false);
} else {
/* Scan the search-paths to see if it can be found. */
std::string full_font = FioFindFullPath(BASE_DIR, settings->font);
if (!full_font.empty()) {
convert_to_fs(full_font.c_str(), fontPath, lengthof(fontPath), false);
}
}
if (fontPath[0] != 0) {
if (AddFontResourceEx(fontPath, FR_PRIVATE, 0) != 0) {
/* Try a nice little undocumented function first for getting the internal font name.
* Some documentation is found at: http://www.undocprint.org/winspool/getfontresourceinfo */
typedef BOOL(WINAPI * PFNGETFONTRESOURCEINFO)(LPCTSTR, LPDWORD, LPVOID, DWORD);
#ifdef UNICODE #ifdef UNICODE
static PFNGETFONTRESOURCEINFO GetFontResourceInfo = (PFNGETFONTRESOURCEINFO)GetProcAddress(GetModuleHandle(_T("Gdi32")), "GetFontResourceInfoW"); static PFNGETFONTRESOURCEINFO GetFontResourceInfo = (PFNGETFONTRESOURCEINFO)GetProcAddress(GetModuleHandle(_T("Gdi32")), "GetFontResourceInfoW");
#else #else
static PFNGETFONTRESOURCEINFO GetFontResourceInfo = (PFNGETFONTRESOURCEINFO)GetProcAddress(GetModuleHandle(_T("Gdi32")), "GetFontResourceInfoA"); static PFNGETFONTRESOURCEINFO GetFontResourceInfo = (PFNGETFONTRESOURCEINFO)GetProcAddress(GetModuleHandle(_T("Gdi32")), "GetFontResourceInfoA");
#endif #endif
if (GetFontResourceInfo != nullptr) { if (GetFontResourceInfo != nullptr) {
/* Try to query an array of LOGFONTs that describe the file. */ /* Try to query an array of LOGFONTs that describe the file. */
DWORD len = 0; DWORD len = 0;
if (GetFontResourceInfo(fontPath, &len, nullptr, 2) && len >= sizeof(LOGFONT)) { if (GetFontResourceInfo(fontPath, &len, nullptr, 2) && len >= sizeof(LOGFONT)) {
LOGFONT *buf = (LOGFONT *)AllocaM(byte, len); LOGFONT *buf = (LOGFONT *)AllocaM(byte, len);
if (GetFontResourceInfo(fontPath, &len, buf, 2)) { if (GetFontResourceInfo(fontPath, &len, buf, 2)) {
logfont = *buf; // Just use first entry. logfont = *buf; // Just use first entry.
}
} }
} }
}
/* No dice yet. Use the file name as the font face name, hoping it matches. */ /* No dice yet. Use the file name as the font face name, hoping it matches. */
if (logfont.lfFaceName[0] == 0) { if (logfont.lfFaceName[0] == 0) {
TCHAR fname[_MAX_FNAME]; TCHAR fname[_MAX_FNAME];
_tsplitpath(fontPath, nullptr, nullptr, fname, nullptr); _tsplitpath(fontPath, nullptr, nullptr, fname, nullptr);
_tcsncpy_s(logfont.lfFaceName, lengthof(logfont.lfFaceName), fname, _TRUNCATE); _tcsncpy_s(logfont.lfFaceName, lengthof(logfont.lfFaceName), fname, _TRUNCATE);
logfont.lfWeight = strcasestr(settings->font, " bold") != nullptr || strcasestr(settings->font, "-bold") != nullptr ? FW_BOLD : FW_NORMAL; // Poor man's way to allow selecting bold fonts. logfont.lfWeight = strcasestr(settings->font, " bold") != nullptr || strcasestr(settings->font, "-bold") != nullptr ? FW_BOLD : FW_NORMAL; // Poor man's way to allow selecting bold fonts.
}
} else {
ShowInfoF("Unable to load file '%s' for %s font, using default windows font selection instead", settings->font, SIZE_TO_NAME[fs]);
} }
} else {
ShowInfoF("Unable to load file '%s' for %s font, using default windows font selection instead", settings->font, SIZE_TO_NAME[fs]);
} }
} }

@ -399,7 +399,7 @@ FT_Error GetFontByFaceName(const char *font_name, FT_Face *face)
* We instead query the list of all font descriptors that match the given name which * We instead query the list of all font descriptors that match the given name which
* does not do this stupid name fallback. */ * does not do this stupid name fallback. */
CFAutoRelease<CTFontDescriptorRef> name_desc(CTFontDescriptorCreateWithNameAndSize(name.get(), 0.0)); CFAutoRelease<CTFontDescriptorRef> name_desc(CTFontDescriptorCreateWithNameAndSize(name.get(), 0.0));
CFAutoRelease<CFSetRef> mandatory_attribs(CFSetCreate(kCFAllocatorDefault, (const void **)&kCTFontNameAttribute, 1, &kCFTypeSetCallBacks)); CFAutoRelease<CFSetRef> mandatory_attribs(CFSetCreate(kCFAllocatorDefault, const_cast<const void **>(reinterpret_cast<const void * const *>(&kCTFontNameAttribute)), 1, &kCFTypeSetCallBacks));
CFAutoRelease<CFArrayRef> descs(CTFontDescriptorCreateMatchingFontDescriptors(name_desc.get(), mandatory_attribs.get())); CFAutoRelease<CFArrayRef> descs(CTFontDescriptorCreateMatchingFontDescriptors(name_desc.get(), mandatory_attribs.get()));
/* Loop over all matches until we can get a path for one of them. */ /* Loop over all matches until we can get a path for one of them. */
@ -441,13 +441,13 @@ bool SetFallbackFont(FreeTypeSettings *settings, const char *language_isocode, i
lang_codes[0] = CFStringCreateWithCString(kCFAllocatorDefault, lang, kCFStringEncodingUTF8); lang_codes[0] = CFStringCreateWithCString(kCFAllocatorDefault, lang, kCFStringEncodingUTF8);
lang_codes[1] = CFSTR("en"); lang_codes[1] = CFSTR("en");
CFArrayRef lang_arr = CFArrayCreate(kCFAllocatorDefault, (const void **)lang_codes, lengthof(lang_codes), &kCFTypeArrayCallBacks); CFArrayRef lang_arr = CFArrayCreate(kCFAllocatorDefault, (const void **)lang_codes, lengthof(lang_codes), &kCFTypeArrayCallBacks);
CFAutoRelease<CFDictionaryRef> lang_attribs(CFDictionaryCreate(kCFAllocatorDefault, (const void**)&kCTFontLanguagesAttribute, (const void **)&lang_arr, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks)); CFAutoRelease<CFDictionaryRef> lang_attribs(CFDictionaryCreate(kCFAllocatorDefault, const_cast<const void **>(reinterpret_cast<const void * const *>(&kCTFontLanguagesAttribute)), (const void **)&lang_arr, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
CFAutoRelease<CTFontDescriptorRef> lang_desc(CTFontDescriptorCreateWithAttributes(lang_attribs.get())); CFAutoRelease<CTFontDescriptorRef> lang_desc(CTFontDescriptorCreateWithAttributes(lang_attribs.get()));
CFRelease(lang_arr); CFRelease(lang_arr);
CFRelease(lang_codes[0]); CFRelease(lang_codes[0]);
/* Get array of all font descriptors for the wanted language. */ /* Get array of all font descriptors for the wanted language. */
CFAutoRelease<CFSetRef> mandatory_attribs(CFSetCreate(kCFAllocatorDefault, (const void **)&kCTFontLanguagesAttribute, 1, &kCFTypeSetCallBacks)); CFAutoRelease<CFSetRef> mandatory_attribs(CFSetCreate(kCFAllocatorDefault, const_cast<const void **>(reinterpret_cast<const void * const *>(&kCTFontLanguagesAttribute)), 1, &kCFTypeSetCallBacks));
CFAutoRelease<CFArrayRef> descs(CTFontDescriptorCreateMatchingFontDescriptors(lang_desc.get(), mandatory_attribs.get())); CFAutoRelease<CFArrayRef> descs(CTFontDescriptorCreateMatchingFontDescriptors(lang_desc.get(), mandatory_attribs.get()));
bool result = false; bool result = false;

@ -66,7 +66,7 @@ void NORETURN CDECL strgen_fatal(const char *s, ...)
LanguageStrings ReadRawLanguageStrings(const std::string &file) LanguageStrings ReadRawLanguageStrings(const std::string &file)
{ {
size_t to_read; size_t to_read;
FILE *fh = FioFOpenFile(file.c_str(), "rb", GAME_DIR, &to_read); FILE *fh = FioFOpenFile(file, "rb", GAME_DIR, &to_read);
if (fh == nullptr) return LanguageStrings(); if (fh == nullptr) return LanguageStrings();
FileCloser fhClose(fh); FileCloser fhClose(fh);
@ -206,7 +206,7 @@ public:
this->FileScanner::Scan(".txt", directory, false); this->FileScanner::Scan(".txt", directory, false);
} }
bool AddFile(const char *filename, size_t basepath_length, const char *tar_filename) override bool AddFile(const std::string &filename, size_t basepath_length, const std::string &tar_filename) override
{ {
if (exclude == filename) return true; if (exclude == filename) return true;
@ -244,9 +244,9 @@ GameStrings *LoadTranslations()
LanguageScanner scanner(gs, filename); LanguageScanner scanner(gs, filename);
std::string ldir = basename + "lang" PATHSEP; std::string ldir = basename + "lang" PATHSEP;
const char *tar_filename = info->GetTarFile(); const std::string tar_filename = info->GetTarFile();
TarList::iterator iter; TarList::iterator iter;
if (tar_filename != nullptr && (iter = _tar_list[GAME_DIR].find(tar_filename)) != _tar_list[GAME_DIR].end()) { if (!tar_filename.empty() && (iter = _tar_list[GAME_DIR].find(tar_filename)) != _tar_list[GAME_DIR].end()) {
/* The main script is in a tar file, so find all files that /* The main script is in a tar file, so find all files that
* are in the same tar and add them to the langfile scanner. */ * are in the same tar and add them to the langfile scanner. */
TarFileList::iterator tar; TarFileList::iterator tar;
@ -258,7 +258,7 @@ GameStrings *LoadTranslations()
if (tar->first.size() <= ldir.size() || tar->first.compare(0, ldir.size(), ldir) != 0) continue; if (tar->first.size() <= ldir.size() || tar->first.compare(0, ldir.size(), ldir) != 0) continue;
if (tar->first.compare(tar->first.size() - 4, 4, ".txt") != 0) continue; if (tar->first.compare(tar->first.size() - 4, 4, ".txt") != 0) continue;
scanner.AddFile(tar->first.c_str(), 0, tar_filename); scanner.AddFile(tar->first, 0, tar_filename);
} }
} else { } else {
/* Scan filesystem */ /* Scan filesystem */

@ -144,7 +144,7 @@ static const char * const la_text[] = {
"emergency savegame", "emergency savegame",
}; };
assert_compile(lengthof(la_text) == GLAT_END); static_assert(lengthof(la_text) == GLAT_END);
/** /**
* Information about the presence of a Grf at a certain point during gamelog history * Information about the presence of a Grf at a certain point during gamelog history

@ -330,7 +330,7 @@ static const StringID _num_towns[] = {STR_NUM_VERY_LOW, STR_NUM_LOW, STR_NUM_N
static const StringID _num_inds[] = {STR_FUNDING_ONLY, STR_MINIMAL, STR_NUM_VERY_LOW, STR_NUM_LOW, STR_NUM_NORMAL, STR_NUM_HIGH, INVALID_STRING_ID}; static const StringID _num_inds[] = {STR_FUNDING_ONLY, STR_MINIMAL, STR_NUM_VERY_LOW, STR_NUM_LOW, STR_NUM_NORMAL, STR_NUM_HIGH, INVALID_STRING_ID};
static const StringID _variety[] = {STR_VARIETY_NONE, STR_VARIETY_VERY_LOW, STR_VARIETY_LOW, STR_VARIETY_MEDIUM, STR_VARIETY_HIGH, STR_VARIETY_VERY_HIGH, INVALID_STRING_ID}; static const StringID _variety[] = {STR_VARIETY_NONE, STR_VARIETY_VERY_LOW, STR_VARIETY_LOW, STR_VARIETY_MEDIUM, STR_VARIETY_HIGH, STR_VARIETY_VERY_HIGH, INVALID_STRING_ID};
assert_compile(lengthof(_num_inds) == ID_END + 1); static_assert(lengthof(_num_inds) == ID_END + 1);
struct GenerateLandscapeWindow : public Window { struct GenerateLandscapeWindow : public Window {
uint widget_id; uint widget_id;
@ -874,7 +874,7 @@ static void _ShowGenerateLandscape(GenerateLandscapeWindowMode mode)
if (mode == GLWM_HEIGHTMAP) { if (mode == GLWM_HEIGHTMAP) {
/* If the function returns negative, it means there was a problem loading the heightmap */ /* If the function returns negative, it means there was a problem loading the heightmap */
if (!GetHeightmapDimensions(_file_to_saveload.detail_ftype, _file_to_saveload.name, &x, &y)) return; if (!GetHeightmapDimensions(_file_to_saveload.detail_ftype, _file_to_saveload.name.c_str(), &x, &y)) return;
} }
WindowDesc *desc = (mode == GLWM_HEIGHTMAP) ? &_heightmap_load_desc : &_generate_landscape_desc; WindowDesc *desc = (mode == GLWM_HEIGHTMAP) ? &_heightmap_load_desc : &_generate_landscape_desc;
@ -1222,7 +1222,7 @@ static const StringID _generation_class_table[] = {
STR_GENERATION_PREPARING_SCRIPT, STR_GENERATION_PREPARING_SCRIPT,
STR_GENERATION_PREPARING_GAME STR_GENERATION_PREPARING_GAME
}; };
assert_compile(lengthof(_generation_class_table) == GWP_CLASS_COUNT); static_assert(lengthof(_generation_class_table) == GWP_CLASS_COUNT);
static void AbortGeneratingWorldCallback(Window *w, bool confirmed) static void AbortGeneratingWorldCallback(Window *w, bool confirmed)
@ -1324,7 +1324,7 @@ void ShowGenerateWorldProgress()
static void _SetGeneratingWorldProgress(GenWorldProgress cls, uint progress, uint total) static void _SetGeneratingWorldProgress(GenWorldProgress cls, uint progress, uint total)
{ {
static const int percent_table[] = {0, 5, 14, 17, 20, 40, 60, 65, 80, 85, 95, 99, 100 }; static const int percent_table[] = {0, 5, 14, 17, 20, 40, 60, 65, 80, 85, 95, 99, 100 };
assert_compile(lengthof(percent_table) == GWP_CLASS_COUNT + 1); static_assert(lengthof(percent_table) == GWP_CLASS_COUNT + 1);
assert(cls < GWP_CLASS_COUNT); assert(cls < GWP_CLASS_COUNT);
/* Do not run this function if we aren't in a thread */ /* Do not run this function if we aren't in a thread */

@ -1987,7 +1987,7 @@ void UpdateCursorSize()
/* Ignore setting any cursor before the sprites are loaded. */ /* Ignore setting any cursor before the sprites are loaded. */
if (GetMaxSpriteID() == 0) return; if (GetMaxSpriteID() == 0) return;
assert_compile(lengthof(_cursor.sprite_seq) == lengthof(_cursor.sprite_pos)); static_assert(lengthof(_cursor.sprite_seq) == lengthof(_cursor.sprite_pos));
assert(_cursor.sprite_count <= lengthof(_cursor.sprite_seq)); assert(_cursor.sprite_count <= lengthof(_cursor.sprite_seq));
for (uint i = 0; i < _cursor.sprite_count; ++i) { for (uint i = 0; i < _cursor.sprite_count; ++i) {
const Sprite *p = GetSprite(GB(_cursor.sprite_seq[i].sprite, 0, SPRITE_WIDTH), ST_NORMAL); const Sprite *p = GetSprite(GB(_cursor.sprite_seq[i].sprite, 0, SPRITE_WIDTH), ST_NORMAL);

@ -200,7 +200,7 @@ union Colour {
} }
}; };
assert_compile(sizeof(Colour) == sizeof(uint32)); static_assert(sizeof(Colour) == sizeof(uint32));
/** Available font sizes */ /** Available font sizes */

@ -162,7 +162,7 @@ void CheckExternalFiles()
if (sounds_set->GetNumInvalid() != 0) { if (sounds_set->GetNumInvalid() != 0) {
add_pos += seprintf(add_pos, last, "Trying to load sound set '%s', but it is incomplete. The game will probably not run correctly until you properly install this set or select another one. See section 4.1 of README.md.\n\nThe following files are corrupted or missing:\n", sounds_set->name.c_str()); add_pos += seprintf(add_pos, last, "Trying to load sound set '%s', but it is incomplete. The game will probably not run correctly until you properly install this set or select another one. See section 4.1 of README.md.\n\nThe following files are corrupted or missing:\n", sounds_set->name.c_str());
assert_compile(SoundsSet::NUM_FILES == 1); static_assert(SoundsSet::NUM_FILES == 1);
/* No need to loop each file, as long as there is only a single /* No need to loop each file, as long as there is only a single
* sound file. */ * sound file. */
add_pos += seprintf(add_pos, last, "\t%s is %s (%s)\n", sounds_set->files->filename, SoundsSet::CheckMD5(sounds_set->files, BASESET_DIR) == MD5File::CR_MISMATCH ? "corrupt" : "missing", sounds_set->files->missing_warning); add_pos += seprintf(add_pos, last, "\t%s is %s (%s)\n", sounds_set->files->filename, SoundsSet::CheckMD5(sounds_set->files, BASESET_DIR) == MD5File::CR_MISMATCH ? "corrupt" : "missing", sounds_set->files->missing_warning);

@ -248,7 +248,7 @@ CommandCost CmdGoalQuestion(TileIndex tile, DoCommandFlag flags, uint32 p1, uint
CompanyID company = (CompanyID)GB(p1, 16, 8); CompanyID company = (CompanyID)GB(p1, 16, 8);
ClientID client = (ClientID)GB(p1, 16, 16); ClientID client = (ClientID)GB(p1, 16, 16);
assert_compile(GOAL_QUESTION_BUTTON_COUNT < 29); static_assert(GOAL_QUESTION_BUTTON_COUNT < 29);
uint32 button_mask = GB(p2, 0, GOAL_QUESTION_BUTTON_COUNT); uint32 button_mask = GB(p2, 0, GOAL_QUESTION_BUTTON_COUNT);
byte type = GB(p2, 29, 2); byte type = GB(p2, 29, 2);
bool is_client = HasBit(p2, 31); bool is_client = HasBit(p2, 31);

@ -357,14 +357,13 @@ void ShowGoalsList(CompanyID company)
/** Ask a question about a goal. */ /** Ask a question about a goal. */
struct GoalQuestionWindow : public Window { struct GoalQuestionWindow : public Window {
char *question; ///< Question to ask (private copy). char *question; ///< Question to ask (private copy).
int buttons; ///< Number of valid buttons in #button. int buttons; ///< Number of valid buttons in #button.
int button[3]; ///< Buttons to display. int button[3]; ///< Buttons to display.
byte type; ///< Type of question. TextColour colour; ///< Colour of the question text.
GoalQuestionWindow(WindowDesc *desc, WindowNumber window_number, byte type, uint32 button_mask, const char *question) : Window(desc), type(type) GoalQuestionWindow(WindowDesc *desc, WindowNumber window_number, TextColour colour, uint32 button_mask, const char *question) : Window(desc), colour(colour)
{ {
assert(type < GOAL_QUESTION_TYPE_COUNT);
this->question = stredup(question); this->question = stredup(question);
/* Figure out which buttons we have to enable. */ /* Figure out which buttons we have to enable. */
@ -391,10 +390,6 @@ struct GoalQuestionWindow : public Window {
void SetStringParameters(int widget) const override void SetStringParameters(int widget) const override
{ {
switch (widget) { switch (widget) {
case WID_GQ_CAPTION:
SetDParam(0, STR_GOAL_QUESTION_CAPTION_QUESTION + this->type);
break;
case WID_GQ_BUTTON_1: case WID_GQ_BUTTON_1:
SetDParam(0, STR_GOAL_QUESTION_BUTTON_CANCEL + this->button[0]); SetDParam(0, STR_GOAL_QUESTION_BUTTON_CANCEL + this->button[0]);
break; break;
@ -442,15 +437,15 @@ struct GoalQuestionWindow : public Window {
if (widget != WID_GQ_QUESTION) return; if (widget != WID_GQ_QUESTION) return;
SetDParamStr(0, this->question); SetDParamStr(0, this->question);
DrawStringMultiLine(r.left, r.right, r.top, UINT16_MAX, STR_JUST_RAW_STRING, TC_BLACK, SA_TOP | SA_HOR_CENTER); DrawStringMultiLine(r.left, r.right, r.top, UINT16_MAX, STR_JUST_RAW_STRING, this->colour, SA_TOP | SA_HOR_CENTER);
} }
}; };
/** Widgets of the goal question window. */ /** Widgets of the goal question window. */
static const NWidgetPart _nested_goal_question_widgets[] = { static const NWidgetPart _nested_goal_question_widgets_question[] = {
NWidget(NWID_HORIZONTAL), NWidget(NWID_HORIZONTAL),
NWidget(WWT_CLOSEBOX, COLOUR_LIGHT_BLUE), NWidget(WWT_CLOSEBOX, COLOUR_LIGHT_BLUE),
NWidget(WWT_CAPTION, COLOUR_LIGHT_BLUE, WID_GQ_CAPTION), SetDataTip(STR_WHITE_STRING, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), NWidget(WWT_CAPTION, COLOUR_LIGHT_BLUE, WID_GQ_CAPTION), SetDataTip(STR_GOAL_QUESTION_CAPTION_QUESTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
EndContainer(), EndContainer(),
NWidget(WWT_PANEL, COLOUR_LIGHT_BLUE), NWidget(WWT_PANEL, COLOUR_LIGHT_BLUE),
NWidget(WWT_EMPTY, INVALID_COLOUR, WID_GQ_QUESTION), SetMinimalSize(300, 0), SetPadding(8, 8, 8, 8), SetFill(1, 0), NWidget(WWT_EMPTY, INVALID_COLOUR, WID_GQ_QUESTION), SetMinimalSize(300, 0), SetPadding(8, 8, 8, 8), SetFill(1, 0),
@ -472,12 +467,107 @@ static const NWidgetPart _nested_goal_question_widgets[] = {
EndContainer(), EndContainer(),
}; };
static WindowDesc _goal_question_list_desc( static const NWidgetPart _nested_goal_question_widgets_info[] = {
WDP_CENTER, nullptr, 0, 0, NWidget(NWID_HORIZONTAL),
WC_GOAL_QUESTION, WC_NONE, NWidget(WWT_CLOSEBOX, COLOUR_LIGHT_BLUE),
WDF_CONSTRUCTION, NWidget(WWT_CAPTION, COLOUR_LIGHT_BLUE, WID_GQ_CAPTION), SetDataTip(STR_GOAL_QUESTION_CAPTION_INFORMATION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
_nested_goal_question_widgets, lengthof(_nested_goal_question_widgets) EndContainer(),
); NWidget(WWT_PANEL, COLOUR_LIGHT_BLUE),
NWidget(WWT_EMPTY, INVALID_COLOUR, WID_GQ_QUESTION), SetMinimalSize(300, 0), SetPadding(8, 8, 8, 8), SetFill(1, 0),
NWidget(NWID_SELECTION, INVALID_COLOUR, WID_GQ_BUTTONS),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(85, 10, 85),
NWidget(WWT_PUSHTXTBTN, COLOUR_LIGHT_BLUE, WID_GQ_BUTTON_1), SetDataTip(STR_BLACK_STRING, STR_NULL), SetFill(1, 0),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(65, 10, 65),
NWidget(WWT_PUSHTXTBTN, COLOUR_LIGHT_BLUE, WID_GQ_BUTTON_1), SetDataTip(STR_BLACK_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_PUSHTXTBTN, COLOUR_LIGHT_BLUE, WID_GQ_BUTTON_2), SetDataTip(STR_BLACK_STRING, STR_NULL), SetFill(1, 0),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(25, 10, 25),
NWidget(WWT_PUSHTXTBTN, COLOUR_LIGHT_BLUE, WID_GQ_BUTTON_1), SetDataTip(STR_BLACK_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_PUSHTXTBTN, COLOUR_LIGHT_BLUE, WID_GQ_BUTTON_2), SetDataTip(STR_BLACK_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_PUSHTXTBTN, COLOUR_LIGHT_BLUE, WID_GQ_BUTTON_3), SetDataTip(STR_BLACK_STRING, STR_NULL), SetFill(1, 0),
EndContainer(),
EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(0, 8),
EndContainer(),
};
static const NWidgetPart _nested_goal_question_widgets_warning[] = {
NWidget(NWID_HORIZONTAL),
NWidget(WWT_CLOSEBOX, COLOUR_YELLOW),
NWidget(WWT_CAPTION, COLOUR_YELLOW, WID_GQ_CAPTION), SetDataTip(STR_GOAL_QUESTION_CAPTION_WARNING, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
EndContainer(),
NWidget(WWT_PANEL, COLOUR_YELLOW),
NWidget(WWT_EMPTY, INVALID_COLOUR, WID_GQ_QUESTION), SetMinimalSize(300, 0), SetPadding(8, 8, 8, 8), SetFill(1, 0),
NWidget(NWID_SELECTION, INVALID_COLOUR, WID_GQ_BUTTONS),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(85, 10, 85),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GQ_BUTTON_1), SetDataTip(STR_BLACK_STRING, STR_NULL), SetFill(1, 0),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(65, 10, 65),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GQ_BUTTON_1), SetDataTip(STR_BLACK_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GQ_BUTTON_2), SetDataTip(STR_BLACK_STRING, STR_NULL), SetFill(1, 0),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(25, 10, 25),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GQ_BUTTON_1), SetDataTip(STR_BLACK_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GQ_BUTTON_2), SetDataTip(STR_BLACK_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GQ_BUTTON_3), SetDataTip(STR_BLACK_STRING, STR_NULL), SetFill(1, 0),
EndContainer(),
EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(0, 8),
EndContainer(),
};
static const NWidgetPart _nested_goal_question_widgets_error[] = {
NWidget(NWID_HORIZONTAL),
NWidget(WWT_CLOSEBOX, COLOUR_RED),
NWidget(WWT_CAPTION, COLOUR_RED, WID_GQ_CAPTION), SetDataTip(STR_GOAL_QUESTION_CAPTION_ERROR, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
EndContainer(),
NWidget(WWT_PANEL, COLOUR_RED),
NWidget(WWT_EMPTY, INVALID_COLOUR, WID_GQ_QUESTION), SetMinimalSize(300, 0), SetPadding(8, 8, 8, 8), SetFill(1, 0),
NWidget(NWID_SELECTION, INVALID_COLOUR, WID_GQ_BUTTONS),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(85, 10, 85),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GQ_BUTTON_1), SetDataTip(STR_BLACK_STRING, STR_NULL), SetFill(1, 0),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(65, 10, 65),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GQ_BUTTON_1), SetDataTip(STR_BLACK_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GQ_BUTTON_2), SetDataTip(STR_BLACK_STRING, STR_NULL), SetFill(1, 0),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(25, 10, 25),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GQ_BUTTON_1), SetDataTip(STR_BLACK_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GQ_BUTTON_2), SetDataTip(STR_BLACK_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GQ_BUTTON_3), SetDataTip(STR_BLACK_STRING, STR_NULL), SetFill(1, 0),
EndContainer(),
EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(0, 8),
EndContainer(),
};
static WindowDesc _goal_question_list_desc[] = {
{
WDP_CENTER, nullptr, 0, 0,
WC_GOAL_QUESTION, WC_NONE,
WDF_CONSTRUCTION,
_nested_goal_question_widgets_question, lengthof(_nested_goal_question_widgets_question),
},
{
WDP_CENTER, nullptr, 0, 0,
WC_GOAL_QUESTION, WC_NONE,
WDF_CONSTRUCTION,
_nested_goal_question_widgets_info, lengthof(_nested_goal_question_widgets_info),
},
{
WDP_CENTER, nullptr, 0, 0,
WC_GOAL_QUESTION, WC_NONE,
WDF_CONSTRUCTION,
_nested_goal_question_widgets_warning, lengthof(_nested_goal_question_widgets_warning),
},
{
WDP_CENTER, nullptr, 0, 0,
WC_GOAL_QUESTION, WC_NONE,
WDF_CONSTRUCTION,
_nested_goal_question_widgets_error, lengthof(_nested_goal_question_widgets_error),
},
};
/** /**
* Display a goal question. * Display a goal question.
@ -488,5 +578,6 @@ static WindowDesc _goal_question_list_desc(
*/ */
void ShowGoalQuestion(uint16 id, byte type, uint32 button_mask, const char *question) void ShowGoalQuestion(uint16 id, byte type, uint32 button_mask, const char *question)
{ {
new GoalQuestionWindow(&_goal_question_list_desc, id, type, button_mask, question); assert(type < GOAL_QUESTION_TYPE_COUNT);
new GoalQuestionWindow(&_goal_question_list_desc[type], id, type == 3 ? TC_WHITE : TC_BLACK, button_mask, question);
} }

@ -289,7 +289,7 @@ protected:
/* the colours and cost array of GraphDrawer must accommodate /* the colours and cost array of GraphDrawer must accommodate
* both values for cargo and companies. So if any are higher, quit */ * both values for cargo and companies. So if any are higher, quit */
assert_compile(GRAPH_MAX_DATASETS >= (int)NUM_CARGO && GRAPH_MAX_DATASETS >= (int)MAX_COMPANIES); static_assert(GRAPH_MAX_DATASETS >= (int)NUM_CARGO && GRAPH_MAX_DATASETS >= (int)MAX_COMPANIES);
assert(this->num_vert_lines > 0); assert(this->num_vert_lines > 0);
byte grid_colour = _colour_gradient[COLOUR_GREY][4]; byte grid_colour = _colour_gradient[COLOUR_GREY][4];
@ -1527,7 +1527,7 @@ static NWidgetBase *MakePerformanceDetailPanels(int *biggest_index)
STR_PERFORMANCE_DETAIL_TOTAL_TOOLTIP, STR_PERFORMANCE_DETAIL_TOTAL_TOOLTIP,
}; };
assert_compile(lengthof(performance_tips) == SCORE_END - SCORE_BEGIN); static_assert(lengthof(performance_tips) == SCORE_END - SCORE_BEGIN);
NWidgetVertical *vert = new NWidgetVertical(NC_EQUALSIZE); NWidgetVertical *vert = new NWidgetVertical(NC_EQUALSIZE);
for (int widnum = WID_PRD_SCORE_FIRST; widnum <= WID_PRD_SCORE_LAST; widnum++) { for (int widnum = WID_PRD_SCORE_FIRST; widnum <= WID_PRD_SCORE_LAST; widnum++) {

@ -301,8 +301,8 @@ bool GroundVehicle<T, Type>::IsChainInDepot() const
{ {
const T *v = this->First(); const T *v = this->First();
/* Is the front engine stationary in the depot? */ /* Is the front engine stationary in the depot? */
assert_compile((int)TRANSPORT_RAIL == (int)VEH_TRAIN); static_assert((int)TRANSPORT_RAIL == (int)VEH_TRAIN);
assert_compile((int)TRANSPORT_ROAD == (int)VEH_ROAD); static_assert((int)TRANSPORT_ROAD == (int)VEH_ROAD);
if (!IsDepotTypeTile(v->tile, (TransportType)Type) || v->cur_speed != 0) return false; if (!IsDepotTypeTile(v->tile, (TransportType)Type) || v->cur_speed != 0) return false;
/* Check whether the rest is also already trying to enter the depot. */ /* Check whether the rest is also already trying to enter the depot. */

@ -20,7 +20,7 @@
#include "safeguards.h" #include "safeguards.h"
HighScore _highscore_table[SP_HIGHSCORE_END][5]; ///< various difficulty-settings; top 5 HighScore _highscore_table[SP_HIGHSCORE_END][5]; ///< various difficulty-settings; top 5
char *_highscore_file; ///< The file to store the highscore data in. std::string _highscore_file; ///< The file to store the highscore data in.
static const StringID _endgame_perf_titles[] = { static const StringID _endgame_perf_titles[] = {
STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN, STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN,
@ -123,7 +123,7 @@ int8 SaveHighScoreValueNetwork()
/** Save HighScore table to file */ /** Save HighScore table to file */
void SaveToHighScore() void SaveToHighScore()
{ {
FILE *fp = fopen(_highscore_file, "wb"); FILE *fp = fopen(_highscore_file.c_str(), "wb");
if (fp != nullptr) { if (fp != nullptr) {
uint i; uint i;
@ -151,7 +151,7 @@ void SaveToHighScore()
/** Initialize the highscore table to 0 and if any file exists, load in values */ /** Initialize the highscore table to 0 and if any file exists, load in values */
void LoadFromHighScore() void LoadFromHighScore()
{ {
FILE *fp = fopen(_highscore_file, "rb"); FILE *fp = fopen(_highscore_file.c_str(), "rb");
memset(_highscore_table, 0, sizeof(_highscore_table)); memset(_highscore_table, 0, sizeof(_highscore_table));

@ -16,7 +16,7 @@
#include "safeguards.h" #include "safeguards.h"
char *_hotkeys_file; std::string _hotkeys_file;
/** /**
* List of all HotkeyLists. * List of all HotkeyLists.

@ -64,7 +64,7 @@ enum HouseZonesBits {
HZB_TOWN_CENTRE, HZB_TOWN_CENTRE,
HZB_END, HZB_END,
}; };
assert_compile(HZB_END == 5); static_assert(HZB_END == 5);
DECLARE_POSTFIX_INCREMENT(HouseZonesBits) DECLARE_POSTFIX_INCREMENT(HouseZonesBits)

@ -2682,8 +2682,7 @@ static int WhoCanServiceIndustry(Industry *ind)
* We cannot check the first of shared orders only, since the first vehicle in such a chain * We cannot check the first of shared orders only, since the first vehicle in such a chain
* may have a different cargo type. * may have a different cargo type.
*/ */
const Order *o; for (const Order *o : v->Orders()) {
FOR_VEHICLE_ORDERS(v, o) {
if (o->IsType(OT_GOTO_STATION) && !(o->GetUnloadType() & OUFB_TRANSFER)) { if (o->IsType(OT_GOTO_STATION) && !(o->GetUnloadType() & OUFB_TRANSFER)) {
/* Vehicle visits a station to load or unload */ /* Vehicle visits a station to load or unload */
Station *st = Station::Get(o->GetDestination()); Station *st = Station::Get(o->GetDestination());

@ -145,7 +145,7 @@ enum CargoSuffixInOut {
template <typename TC, typename TS> template <typename TC, typename TS>
static inline void GetAllCargoSuffixes(CargoSuffixInOut use_input, CargoSuffixType cst, const Industry *ind, IndustryType ind_type, const IndustrySpec *indspec, const TC &cargoes, TS &suffixes) static inline void GetAllCargoSuffixes(CargoSuffixInOut use_input, CargoSuffixType cst, const Industry *ind, IndustryType ind_type, const IndustrySpec *indspec, const TC &cargoes, TS &suffixes)
{ {
assert_compile(lengthof(cargoes) <= lengthof(suffixes)); static_assert(lengthof(cargoes) <= lengthof(suffixes));
if (indspec->behaviour & INDUSTRYBEH_CARGOTYPES_UNLIMITED) { if (indspec->behaviour & INDUSTRYBEH_CARGOTYPES_UNLIMITED) {
/* Reworked behaviour with new many-in-many-out scheme */ /* Reworked behaviour with new many-in-many-out scheme */
@ -2201,8 +2201,8 @@ private:
} }
}; };
assert_compile(MAX_CARGOES >= cpp_lengthof(IndustrySpec, produced_cargo)); static_assert(MAX_CARGOES >= cpp_lengthof(IndustrySpec, produced_cargo));
assert_compile(MAX_CARGOES >= cpp_lengthof(IndustrySpec, accepts_cargo)); static_assert(MAX_CARGOES >= cpp_lengthof(IndustrySpec, accepts_cargo));
int CargoesField::small_height; ///< Height of the header row. int CargoesField::small_height; ///< Height of the header row.
int CargoesField::normal_height; ///< Height of the non-header rows. int CargoesField::normal_height; ///< Height of the non-header rows.

@ -258,8 +258,7 @@ bool CheckSharingChangePossible(VehicleType type)
/* Check order list */ /* Check order list */
if (v->FirstShared() != v) continue; if (v->FirstShared() != v) continue;
Order *o; for(const Order *o : v->Orders()) {
FOR_VEHICLE_ORDERS(v, o) {
if (!OrderDestinationIsAllowed(o, v)) { if (!OrderDestinationIsAllowed(o, v)) {
error_message = STR_CONFIG_SETTING_SHARING_ORDERS_TO_OTHERS; error_message = STR_CONFIG_SETTING_SHARING_ORDERS_TO_OTHERS;
} }

@ -43,7 +43,7 @@ IniFile::IniFile(const char * const *list_group_names) : IniLoadFile(list_group_
* @param filename the file to save to. * @param filename the file to save to.
* @return true if saving succeeded. * @return true if saving succeeded.
*/ */
bool IniFile::SaveToDisk(const char *filename) bool IniFile::SaveToDisk(const std::string &filename)
{ {
/* /*
* First write the configuration to a (temporary) file and then rename * First write the configuration to a (temporary) file and then rename
@ -96,7 +96,7 @@ bool IniFile::SaveToDisk(const char *filename)
# undef strncpy # undef strncpy
/* Allocate space for one more \0 character. */ /* Allocate space for one more \0 character. */
TCHAR tfilename[MAX_PATH + 1], tfile_new[MAX_PATH + 1]; TCHAR tfilename[MAX_PATH + 1], tfile_new[MAX_PATH + 1];
_tcsncpy(tfilename, OTTD2FS(filename), MAX_PATH); _tcsncpy(tfilename, OTTD2FS(filename.c_str()), MAX_PATH);
_tcsncpy(tfile_new, OTTD2FS(file_new.c_str()), MAX_PATH); _tcsncpy(tfile_new, OTTD2FS(file_new.c_str()), MAX_PATH);
/* SHFileOperation wants a double '\0' terminated string. */ /* SHFileOperation wants a double '\0' terminated string. */
tfilename[MAX_PATH - 1] = '\0'; tfilename[MAX_PATH - 1] = '\0';
@ -113,8 +113,8 @@ bool IniFile::SaveToDisk(const char *filename)
shfopt.pTo = tfilename; shfopt.pTo = tfilename;
SHFileOperation(&shfopt); SHFileOperation(&shfopt);
#else #else
if (rename(file_new.c_str(), filename) < 0) { if (rename(file_new.c_str(), filename.c_str()) < 0) {
DEBUG(misc, 0, "Renaming %s to %s failed; configuration not saved", file_new.c_str(), filename); DEBUG(misc, 0, "Renaming %s to %s failed; configuration not saved", file_new.c_str(), filename.c_str());
} }
#endif #endif
@ -125,7 +125,7 @@ bool IniFile::SaveToDisk(const char *filename)
return true; return true;
} }
/* virtual */ FILE *IniFile::OpenFile(const char *filename, Subdirectory subdir, size_t *size) /* virtual */ FILE *IniFile::OpenFile(const std::string &filename, Subdirectory subdir, size_t *size)
{ {
/* Open the text file in binary mode to prevent end-of-line translations /* Open the text file in binary mode to prevent end-of-line translations
* done by ftell() and friends, as defined by K&R. */ * done by ftell() and friends, as defined by K&R. */

@ -192,7 +192,7 @@ void IniLoadFile::RemoveGroup(const char *name)
* @param subdir the sub directory to load the file from. * @param subdir the sub directory to load the file from.
* @pre nothing has been loaded yet. * @pre nothing has been loaded yet.
*/ */
void IniLoadFile::LoadFromDisk(const char *filename, Subdirectory subdir, std::string *save) void IniLoadFile::LoadFromDisk(const std::string &filename, Subdirectory subdir, std::string *save)
{ {
assert(this->last_group == &this->group); assert(this->last_group == &this->group);

@ -66,7 +66,7 @@ struct IniLoadFile {
IniGroup *GetGroup(const std::string &name, bool create_new = true); IniGroup *GetGroup(const std::string &name, bool create_new = true);
void RemoveGroup(const char *name); void RemoveGroup(const char *name);
void LoadFromDisk(const char *filename, Subdirectory subdir, std::string *save = nullptr); void LoadFromDisk(const std::string &filename, Subdirectory subdir, std::string *save = nullptr);
/** /**
* Open the INI file. * Open the INI file.
@ -75,7 +75,7 @@ struct IniLoadFile {
* @param[out] size Size of the opened file. * @param[out] size Size of the opened file.
* @return File handle of the opened file, or \c nullptr. * @return File handle of the opened file, or \c nullptr.
*/ */
virtual FILE *OpenFile(const char *filename, Subdirectory subdir, size_t *size) = 0; virtual FILE *OpenFile(const std::string &filename, Subdirectory subdir, size_t *size) = 0;
/** /**
* Report an error about the file contents. * Report an error about the file contents.
@ -90,9 +90,9 @@ struct IniLoadFile {
struct IniFile : IniLoadFile { struct IniFile : IniLoadFile {
IniFile(const char * const *list_group_names = nullptr); IniFile(const char * const *list_group_names = nullptr);
bool SaveToDisk(const char *filename); bool SaveToDisk(const std::string &filename);
virtual FILE *OpenFile(const char *filename, Subdirectory subdir, size_t *size); virtual FILE *OpenFile(const std::string &filename, Subdirectory subdir, size_t *size);
virtual void ReportFileError(const char * const pre, const char * const buffer, const char * const post); virtual void ReportFileError(const char * const pre, const char * const buffer, const char * const post);
}; };

@ -823,7 +823,7 @@ void RunTileLoop()
0xD8F, 0x1296, 0x2496, 0x4357, 0x8679, 0x1030E, 0x206CD, 0x403FE, 0x807B8, 0x1004B2, 0x2006A8, 0xD8F, 0x1296, 0x2496, 0x4357, 0x8679, 0x1030E, 0x206CD, 0x403FE, 0x807B8, 0x1004B2, 0x2006A8,
0x4004B2, 0x800B87, 0x10004F3, 0x200072D, 0x40006AE, 0x80009E3, 0x4004B2, 0x800B87, 0x10004F3, 0x200072D, 0x40006AE, 0x80009E3,
}; };
assert_compile(lengthof(feedbacks) == MAX_MAP_TILES_BITS - 2 * MIN_MAP_SIZE_BITS + 1); static_assert(lengthof(feedbacks) == MAX_MAP_TILES_BITS - 2 * MIN_MAP_SIZE_BITS + 1);
const uint32 feedback = feedbacks[MapLogX() + MapLogY() - 2 * MIN_MAP_SIZE_BITS]; const uint32 feedback = feedbacks[MapLogX() + MapLogY() - 2 * MIN_MAP_SIZE_BITS];
/* We update every tile every 256 ticks, so divide the map size by 2^8 = 256 */ /* We update every tile every 256 ticks, so divide the map size by 2^8 = 256 */
@ -1319,7 +1319,7 @@ void GenerateLandscape(byte mode)
if (mode == GWM_HEIGHTMAP) { if (mode == GWM_HEIGHTMAP) {
SetGeneratingWorldProgress(GWP_LANDSCAPE, steps + GLS_HEIGHTMAP); SetGeneratingWorldProgress(GWP_LANDSCAPE, steps + GLS_HEIGHTMAP);
LoadHeightmap(_file_to_saveload.detail_ftype, _file_to_saveload.name); LoadHeightmap(_file_to_saveload.detail_ftype, _file_to_saveload.name.c_str());
IncreaseGeneratingWorldProgress(GWP_LANDSCAPE); IncreaseGeneratingWorldProgress(GWP_LANDSCAPE);
} else if (_settings_game.game_creation.land_generator == LG_TERRAGENESIS) { } else if (_settings_game.game_creation.land_generator == LG_TERRAGENESIS) {
SetGeneratingWorldProgress(GWP_LANDSCAPE, steps + GLS_TERRAGENESIS); SetGeneratingWorldProgress(GWP_LANDSCAPE, steps + GLS_TERRAGENESIS);

@ -2504,7 +2504,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Grootte:
STR_OBJECT_CLASS_LTHS :Vuurtorings STR_OBJECT_CLASS_LTHS :Vuurtorings
STR_OBJECT_CLASS_TRNS :Stuurders STR_OBJECT_CLASS_TRNS :Stuurders
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Boome STR_PLANT_TREE_CAPTION :{WHITE}Boome
STR_PLANT_TREE_TOOLTIP :{BLACK}Kies tipe boom om te plant. Indien die teel reeds 'n boom op het sal enige tipe bome by geplant word, ongeag van die gekose tipe STR_PLANT_TREE_TOOLTIP :{BLACK}Kies tipe boom om te plant. Indien die teel reeds 'n boom op het sal enige tipe bome by geplant word, ongeag van die gekose tipe
STR_TREES_RANDOM_TYPE :{BLACK}Bome van lukraake tipe STR_TREES_RANDOM_TYPE :{BLACK}Bome van lukraake tipe

@ -2101,7 +2101,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}حجم:
STR_OBJECT_CLASS_LTHS :مناراة ضوئية STR_OBJECT_CLASS_LTHS :مناراة ضوئية
STR_OBJECT_CLASS_TRNS :النواقل STR_OBJECT_CLASS_TRNS :النواقل
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}اشجار STR_PLANT_TREE_CAPTION :{WHITE}اشجار
STR_PLANT_TREE_TOOLTIP :{BLACK} اختر نوع الشجر لزراعتة, اذا المربع يحتوي على اشجار فهذا الامر يضيف المزيد STR_PLANT_TREE_TOOLTIP :{BLACK} اختر نوع الشجر لزراعتة, اذا المربع يحتوي على اشجار فهذا الامر يضيف المزيد
STR_TREES_RANDOM_TYPE :{BLACK}شجر عشوائي STR_TREES_RANDOM_TYPE :{BLACK}شجر عشوائي

@ -2362,7 +2362,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Tamainua
STR_OBJECT_CLASS_LTHS :Itsasargiak STR_OBJECT_CLASS_LTHS :Itsasargiak
STR_OBJECT_CLASS_TRNS :Igorgailuak STR_OBJECT_CLASS_TRNS :Igorgailuak
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Zuhaitzak STR_PLANT_TREE_CAPTION :{WHITE}Zuhaitzak
STR_PLANT_TREE_TOOLTIP :{BLACK} Aukeratu landatuko diren zuhaitz motak. Laukiak zuhaitza badauka mota ezberdinetako zuhaitz gehio geituko ditu STR_PLANT_TREE_TOOLTIP :{BLACK} Aukeratu landatuko diren zuhaitz motak. Laukiak zuhaitza badauka mota ezberdinetako zuhaitz gehio geituko ditu
STR_TREES_RANDOM_TYPE :{BLACK}Ausazko zuhaitz motak STR_TREES_RANDOM_TYPE :{BLACK}Ausazko zuhaitz motak

@ -2830,7 +2830,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Паме
STR_OBJECT_CLASS_LTHS :Маякi STR_OBJECT_CLASS_LTHS :Маякi
STR_OBJECT_CLASS_TRNS :Перадатчыкi STR_OBJECT_CLASS_TRNS :Перадатчыкi
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Дрэвы STR_PLANT_TREE_CAPTION :{WHITE}Дрэвы
STR_PLANT_TREE_TOOLTIP :{BLACK}Выберыце тып дрэваў для пасадкі. Калі на ўчастку ўжо ёсьць дрэвы, будуць дададзены некалькі дрэваў рознага тыпу, незалежна ад выбранага. STR_PLANT_TREE_TOOLTIP :{BLACK}Выберыце тып дрэваў для пасадкі. Калі на ўчастку ўжо ёсьць дрэвы, будуць дададзены некалькі дрэваў рознага тыпу, незалежна ад выбранага.
STR_TREES_RANDOM_TYPE :{BLACK}Дрэвы розных відаў STR_TREES_RANDOM_TYPE :{BLACK}Дрэвы розных відаў

@ -2514,7 +2514,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Tamanho:
STR_OBJECT_CLASS_LTHS :Faróis STR_OBJECT_CLASS_LTHS :Faróis
STR_OBJECT_CLASS_TRNS :Transmissores STR_OBJECT_CLASS_TRNS :Transmissores
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Árvores STR_PLANT_TREE_CAPTION :{WHITE}Árvores
STR_PLANT_TREE_TOOLTIP :{BLACK}Selecionar um tipo de árvore para plantar. Se o local já tiver uma árvore, isso irá adicionar mais árvores do tipo misto indepentendemente do tipo selecionado STR_PLANT_TREE_TOOLTIP :{BLACK}Selecionar um tipo de árvore para plantar. Se o local já tiver uma árvore, isso irá adicionar mais árvores do tipo misto indepentendemente do tipo selecionado
STR_TREES_RANDOM_TYPE :{BLACK}Árvores de tipo aleatório STR_TREES_RANDOM_TYPE :{BLACK}Árvores de tipo aleatório

@ -2416,7 +2416,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Разм
STR_OBJECT_CLASS_LTHS :Фарове STR_OBJECT_CLASS_LTHS :Фарове
STR_OBJECT_CLASS_TRNS :Предаватели STR_OBJECT_CLASS_TRNS :Предаватели
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Дървета STR_PLANT_TREE_CAPTION :{WHITE}Дървета
STR_PLANT_TREE_TOOLTIP :{BLACK}Избор на вид дърво за засаждане. Ако на полето вече съществува дърво, ще бъдат добавени повече дървета от различни видове, независимо от избора на вид STR_PLANT_TREE_TOOLTIP :{BLACK}Избор на вид дърво за засаждане. Ако на полето вече съществува дърво, ще бъдат добавени повече дървета от различни видове, независимо от избора на вид
STR_TREES_RANDOM_TYPE :{BLACK}Дървета от произволен тип STR_TREES_RANDOM_TYPE :{BLACK}Дървета от произволен тип

@ -316,8 +316,15 @@ STR_SORT_BY_CARGO_CAPACITY :Capacitat de c
STR_SORT_BY_RANGE :Abast STR_SORT_BY_RANGE :Abast
STR_SORT_BY_POPULATION :Població STR_SORT_BY_POPULATION :Població
STR_SORT_BY_RATING :Qualificació STR_SORT_BY_RATING :Qualificació
STR_SORT_BY_NUM_VEHICLES :Nombre de vehicles
STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Benefici total de l'any passat
STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :Benefici total d'aquest any
STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Benefici mitjà de l'any passat
STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Benefici mitjà aquest any
# Group by options for vehicle list # Group by options for vehicle list
STR_GROUP_BY_NONE :Cap
STR_GROUP_BY_SHARED_ORDERS :Ordres compartides
# Tooltips for the main toolbar # Tooltips for the main toolbar
STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Posa en pausa o reprèn la partida STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Posa en pausa o reprèn la partida
@ -774,6 +781,7 @@ STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}Mostra t
STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Mostra el darrer missatge o notícia STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Mostra el darrer missatge o notícia
STR_STATUSBAR_COMPANY_NAME :{SILVER}- - {COMPANY} - - STR_STATUSBAR_COMPANY_NAME :{SILVER}- - {COMPANY} - -
STR_STATUSBAR_PAUSED :{YELLOW}* * EN PAUSA * * STR_STATUSBAR_PAUSED :{YELLOW}* * EN PAUSA * *
STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * EN PAUSA (s'espera que s'actualitzi el graf de distribució) * *
STR_STATUSBAR_AUTOSAVE :{RED}DESADA AUTOMÀTICA STR_STATUSBAR_AUTOSAVE :{RED}DESADA AUTOMÀTICA
STR_STATUSBAR_SAVING_GAME :{RED}* * DESANT PARTIDA * * STR_STATUSBAR_SAVING_GAME :{RED}* * DESANT PARTIDA * *
@ -1613,6 +1621,10 @@ STR_CONFIG_SETTING_TOWN_CARGOGENMODE_BITCOUNT :Lineal
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :Disposició de nous arbres durant la partida: {STRING} STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :Disposició de nous arbres durant la partida: {STRING}
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :Controla l'aparició aleatòria dels arbres durant una partida. Això podria afectar a les indústries que es basen en el creixement dels arbres, per exemple les serradores STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :Controla l'aparició aleatòria dels arbres durant una partida. Això podria afectar a les indústries que es basen en el creixement dels arbres, per exemple les serradores
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_SPREAD :Creixen però no n'apareixen més {RED}(trenca el funcionament de les serradores)
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_RAINFOREST :Creixen però només n'apareixen més a la selva tropical
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_ALL :Creixen i n'apareixen per tot arreu
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_GROWTH_NO_SPREAD :No creixen ni n'apareixen més {RED}(trenca el funcionament les serradores)
STR_CONFIG_SETTING_TOOLBAR_POS :Posició de la barra d'eines principal: {STRING} STR_CONFIG_SETTING_TOOLBAR_POS :Posició de la barra d'eines principal: {STRING}
STR_CONFIG_SETTING_TOOLBAR_POS_HELPTEXT :Posició horitzontal de la barra principal a la part superior de la pantalla STR_CONFIG_SETTING_TOOLBAR_POS_HELPTEXT :Posició horitzontal de la barra principal a la part superior de la pantalla
@ -1976,6 +1988,10 @@ STR_NETWORK_SERVER_LIST_JOIN_GAME :{BLACK}Connecta
STR_NETWORK_SERVER_LIST_REFRESH :{BLACK}Actualitza servidor STR_NETWORK_SERVER_LIST_REFRESH :{BLACK}Actualitza servidor
STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}Actualitza la informació del servidor STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}Actualitza la informació del servidor
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET :{BLACK}Cerca a Internet
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET_TOOLTIP :{BLACK}Cerca servidors públics a Internet
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN :{BLACK}Cerca a la LAN
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN_TOOLTIP :{BLACK}Cerca servidors a la xarxa local
STR_NETWORK_SERVER_LIST_ADD_SERVER :{BLACK}Afegeix un servidor STR_NETWORK_SERVER_LIST_ADD_SERVER :{BLACK}Afegeix un servidor
STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Afegeix un servidor a la llista que sempre es comprovarà per buscar partides en marxa STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Afegeix un servidor a la llista que sempre es comprovarà per buscar partides en marxa
STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Inicia el servidor STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Inicia el servidor
@ -2201,11 +2217,13 @@ STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_1 :Partida encara
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_2 :Partida encara en pausa ({STRING}, {STRING}) STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_2 :Partida encara en pausa ({STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_3 :Partida encara en pausa ({STRING}, {STRING}, {STRING}) STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_3 :Partida encara en pausa ({STRING}, {STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_4 :La partida encara està en pausa ({STRING}, {STRING}, {STRING}, {STRING}) STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_4 :La partida encara està en pausa ({STRING}, {STRING}, {STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_5 :La partida encara està en pausa ({STRING}, {STRING}, {STRING}, {STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_UNPAUSED :Partida represa ({STRING}) STR_NETWORK_SERVER_MESSAGE_GAME_UNPAUSED :Partida represa ({STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_NOT_ENOUGH_PLAYERS :nombre de jugadors STR_NETWORK_SERVER_MESSAGE_GAME_REASON_NOT_ENOUGH_PLAYERS :nombre de jugadors
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_CONNECTING_CLIENTS :connectant clients STR_NETWORK_SERVER_MESSAGE_GAME_REASON_CONNECTING_CLIENTS :connectant clients
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_MANUAL :manual STR_NETWORK_SERVER_MESSAGE_GAME_REASON_MANUAL :manual
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_GAME_SCRIPT :script de la partida STR_NETWORK_SERVER_MESSAGE_GAME_REASON_GAME_SCRIPT :script de la partida
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :s'està esperant que s'actualitzi el graf de distribució
############ End of leave-in-this-order ############ End of leave-in-this-order
STR_NETWORK_MESSAGE_CLIENT_LEAVING :deixant STR_NETWORK_MESSAGE_CLIENT_LEAVING :deixant
STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} s'ha unit a la partida STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} s'ha unit a la partida
@ -2522,13 +2540,19 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Mida: {G
STR_OBJECT_CLASS_LTHS :Fars STR_OBJECT_CLASS_LTHS :Fars
STR_OBJECT_CLASS_TRNS :Transmissors STR_OBJECT_CLASS_TRNS :Transmissors
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Arbres STR_PLANT_TREE_CAPTION :{WHITE}Arbres
STR_PLANT_TREE_TOOLTIP :{BLACK}Selecciona el tipus d'arbre a plantar. Si la casella ja conté un arbre, s'afegiran més arbres d'altres espècies independentment de quin estigui seleccionat STR_PLANT_TREE_TOOLTIP :{BLACK}Selecciona el tipus d'arbre a plantar. Si la casella ja conté un arbre, s'afegiran més arbres d'altres espècies independentment de quin estigui seleccionat
STR_TREES_RANDOM_TYPE :{BLACK}Arbres de tipus aleatori STR_TREES_RANDOM_TYPE :{BLACK}Arbres de tipus aleatori
STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Situar arbres de tipus aleatori. Shift commuta construeix/mostra el cost estimat STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Situar arbres de tipus aleatori. Shift commuta construeix/mostra el cost estimat
STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Arbres Aleatoris STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Arbres Aleatoris
STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Planta arbres aleatòriament al paisatge STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Planta arbres aleatòriament al paisatge
STR_TREES_MODE_NORMAL_BUTTON :{BLACK}Normal
STR_TREES_MODE_NORMAL_TOOLTIP :{BLACK}Planta un arbre a cada casella arrossegant el ratolí pel paisatge.
STR_TREES_MODE_FOREST_SM_BUTTON :Arbreda
STR_TREES_MODE_FOREST_SM_TOOLTIP :{BLACK}Planta petits boscos arrossegant el ratolí pel paisatge.
STR_TREES_MODE_FOREST_LG_BUTTON :{BLACK}Bosc
STR_TREES_MODE_FOREST_LG_TOOLTIP :{BLACK}Planta grans boscos arrossegant el ratolí pel paisatge.
# Land generation window (SE) # Land generation window (SE)
STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}Generador de Terreny STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}Generador de Terreny
@ -3158,10 +3182,10 @@ STR_GOALS_COMPANY_TITLE :{BLACK}Objectiu
STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Clica sobre l'objectiu per centrar la vista principal sobre la indústria/població/cel·la. Ctrl+clic per obrir una nova vista sobre la indústria/població/cel·la STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Clica sobre l'objectiu per centrar la vista principal sobre la indústria/població/cel·la. Ctrl+clic per obrir una nova vista sobre la indústria/població/cel·la
# Goal question window # Goal question window
STR_GOAL_QUESTION_CAPTION_QUESTION :Pregunta STR_GOAL_QUESTION_CAPTION_QUESTION :{BLACK}Pregunta
STR_GOAL_QUESTION_CAPTION_INFORMATION :Informació STR_GOAL_QUESTION_CAPTION_INFORMATION :{BLACK}Informació
STR_GOAL_QUESTION_CAPTION_WARNING :Alerta STR_GOAL_QUESTION_CAPTION_WARNING :{BLACK}Avís
STR_GOAL_QUESTION_CAPTION_ERROR :Error STR_GOAL_QUESTION_CAPTION_ERROR :{YELLOW}Error
############ Start of Goal Question button list ############ Start of Goal Question button list
STR_GOAL_QUESTION_BUTTON_CANCEL :Cancel·la STR_GOAL_QUESTION_BUTTON_CANCEL :Cancel·la
@ -4240,6 +4264,7 @@ STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :La partida est
STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE :No es pot llegir l'arxiu STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE :No es pot llegir l'arxiu
STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE :No es pot escriure a l'arxiu STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE :No es pot escriure a l'arxiu
STR_GAME_SAVELOAD_ERROR_DATA_INTEGRITY_CHECK_FAILED :El test d'integritat de dades ha fallat STR_GAME_SAVELOAD_ERROR_DATA_INTEGRITY_CHECK_FAILED :El test d'integritat de dades ha fallat
STR_GAME_SAVELOAD_ERROR_PATCHPACK :La desada es va fer amb una versió modificada.
STR_GAME_SAVELOAD_NOT_AVAILABLE :<no disponible> STR_GAME_SAVELOAD_NOT_AVAILABLE :<no disponible>
STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}La partida es va desar amb una versió sense suport de tramvies. S'han eliminat tots els tramvies STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}La partida es va desar amb una versió sense suport de tramvies. S'han eliminat tots els tramvies

@ -2609,7 +2609,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Veličin
STR_OBJECT_CLASS_LTHS :Svjetionici STR_OBJECT_CLASS_LTHS :Svjetionici
STR_OBJECT_CLASS_TRNS :Odašiljači STR_OBJECT_CLASS_TRNS :Odašiljači
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Drveće STR_PLANT_TREE_CAPTION :{WHITE}Drveće
STR_PLANT_TREE_TOOLTIP :{BLACK}Odaberi vrstu drveta za sadnju. Ako polje već ima drvo, ovo će dodati još drveća raznih vrsta neovisno o odabranoj vrsti STR_PLANT_TREE_TOOLTIP :{BLACK}Odaberi vrstu drveta za sadnju. Ako polje već ima drvo, ovo će dodati još drveća raznih vrsta neovisno o odabranoj vrsti
STR_TREES_RANDOM_TYPE :{BLACK}Raznovrsno drveće STR_TREES_RANDOM_TYPE :{BLACK}Raznovrsno drveće

@ -3130,7 +3130,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Velikost
STR_OBJECT_CLASS_LTHS :Majáky STR_OBJECT_CLASS_LTHS :Majáky
STR_OBJECT_CLASS_TRNS :Vysílače STR_OBJECT_CLASS_TRNS :Vysílače
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Stromy STR_PLANT_TREE_CAPTION :{WHITE}Stromy
STR_PLANT_TREE_TOOLTIP :{BLACK}Zvol druh stromu na vysazení. Pokud se na políčku už nějaký strom nachází, přidá se k němu několik různých druhů bez ohledu na výběr druhu STR_PLANT_TREE_TOOLTIP :{BLACK}Zvol druh stromu na vysazení. Pokud se na políčku už nějaký strom nachází, přidá se k němu několik různých druhů bez ohledu na výběr druhu
STR_TREES_RANDOM_TYPE :{BLACK}Různé stromy STR_TREES_RANDOM_TYPE :{BLACK}Různé stromy

@ -2514,7 +2514,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Størrel
STR_OBJECT_CLASS_LTHS :Fyrtårn STR_OBJECT_CLASS_LTHS :Fyrtårn
STR_OBJECT_CLASS_TRNS :Sendere STR_OBJECT_CLASS_TRNS :Sendere
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Træer STR_PLANT_TREE_CAPTION :{WHITE}Træer
STR_PLANT_TREE_TOOLTIP :{BLACK}Vælg typen af træer der skal plantes. Hvis feltet allerede har et træ, vil dette tilføje flere træer i blandede typer, uafhængigt af den valgte type STR_PLANT_TREE_TOOLTIP :{BLACK}Vælg typen af træer der skal plantes. Hvis feltet allerede har et træ, vil dette tilføje flere træer i blandede typer, uafhængigt af den valgte type
STR_TREES_RANDOM_TYPE :{BLACK}Træer af tilfældig type STR_TREES_RANDOM_TYPE :{BLACK}Træer af tilfældig type

@ -2513,7 +2513,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Grootte:
STR_OBJECT_CLASS_LTHS :Vuurtorens STR_OBJECT_CLASS_LTHS :Vuurtorens
STR_OBJECT_CLASS_TRNS :Zendmasten STR_OBJECT_CLASS_TRNS :Zendmasten
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Bomen STR_PLANT_TREE_CAPTION :{WHITE}Bomen
STR_PLANT_TREE_TOOLTIP :{BLACK}Kies een soort boom om te planten. Als de tegel al bomen bevat, komen er meer bomen van verschillende typen bij, onafhankelijk van het geselecteerde type. STR_PLANT_TREE_TOOLTIP :{BLACK}Kies een soort boom om te planten. Als de tegel al bomen bevat, komen er meer bomen van verschillende typen bij, onafhankelijk van het geselecteerde type.
STR_TREES_RANDOM_TYPE :{BLACK}Willekeurige soorten bomen STR_TREES_RANDOM_TYPE :{BLACK}Willekeurige soorten bomen

@ -3216,7 +3216,7 @@ STR_BASIC_HOUSE_SET_NAME :Basic houses
STR_SELECT_TOWN_CAPTION :{WHITE}Select town STR_SELECT_TOWN_CAPTION :{WHITE}Select town
STR_SELECT_TOWN_LIST_ITEM :{BLACK}{TOWN} STR_SELECT_TOWN_LIST_ITEM :{BLACK}{TOWN}
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Trees STR_PLANT_TREE_CAPTION :{WHITE}Trees
STR_PLANT_TREE_TOOLTIP :{BLACK}Select tree type to plant. If the tile already has a tree, this will add more trees of mixed types independent of the selected type STR_PLANT_TREE_TOOLTIP :{BLACK}Select tree type to plant. If the tile already has a tree, this will add more trees of mixed types independent of the selected type
STR_TREES_RANDOM_TYPE :{BLACK}Trees of random type STR_TREES_RANDOM_TYPE :{BLACK}Trees of random type
@ -3225,6 +3225,12 @@ STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Random T
STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Plant trees randomly throughout the landscape STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Plant trees randomly throughout the landscape
STR_TREES_REMOVE_TREES_BUTTON :{BLACK}Remove all Trees STR_TREES_REMOVE_TREES_BUTTON :{BLACK}Remove all Trees
STR_TREES_REMOVE_TREES_TOOLTIP :{BLACK}Remove all Trees over landscape STR_TREES_REMOVE_TREES_TOOLTIP :{BLACK}Remove all Trees over landscape
STR_TREES_MODE_NORMAL_BUTTON :{BLACK}Normal
STR_TREES_MODE_NORMAL_TOOLTIP :{BLACK}Plant single trees by dragging over the landscape.
STR_TREES_MODE_FOREST_SM_BUTTON :{BLACK}Grove
STR_TREES_MODE_FOREST_SM_TOOLTIP :{BLACK}Plant small forests by dragging over the landscape.
STR_TREES_MODE_FOREST_LG_BUTTON :{BLACK}Forest
STR_TREES_MODE_FOREST_LG_TOOLTIP :{BLACK}Plant large forests by dragging over the landscape.
# Land generation window (SE) # Land generation window (SE)
STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}Land Generation STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}Land Generation
@ -3881,10 +3887,10 @@ STR_GOALS_COMPANY_TITLE :{BLACK}Company
STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Click on goal to centre main view on industry/town/tile. Ctrl+Click opens a new viewport on industry/town/tile location STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Click on goal to centre main view on industry/town/tile. Ctrl+Click opens a new viewport on industry/town/tile location
# Goal question window # Goal question window
STR_GOAL_QUESTION_CAPTION_QUESTION :Question STR_GOAL_QUESTION_CAPTION_QUESTION :{BLACK}Question
STR_GOAL_QUESTION_CAPTION_INFORMATION :Information STR_GOAL_QUESTION_CAPTION_INFORMATION :{BLACK}Information
STR_GOAL_QUESTION_CAPTION_WARNING :Warning STR_GOAL_QUESTION_CAPTION_WARNING :{BLACK}Warning
STR_GOAL_QUESTION_CAPTION_ERROR :Error STR_GOAL_QUESTION_CAPTION_ERROR :{YELLOW}Error
############ Start of Goal Question button list ############ Start of Goal Question button list
STR_GOAL_QUESTION_BUTTON_CANCEL :Cancel STR_GOAL_QUESTION_BUTTON_CANCEL :Cancel

@ -2425,7 +2425,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Size: {G
STR_OBJECT_CLASS_LTHS :Lighthouses STR_OBJECT_CLASS_LTHS :Lighthouses
STR_OBJECT_CLASS_TRNS :Transmitters STR_OBJECT_CLASS_TRNS :Transmitters
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Trees STR_PLANT_TREE_CAPTION :{WHITE}Trees
STR_PLANT_TREE_TOOLTIP :{BLACK}Select tree type to plant. If the tile already has a tree, this will add more trees of mixed types independent of the selected type STR_PLANT_TREE_TOOLTIP :{BLACK}Select tree type to plant. If the tile already has a tree, this will add more trees of mixed types independent of the selected type
STR_TREES_RANDOM_TYPE :{BLACK}Trees of random type STR_TREES_RANDOM_TYPE :{BLACK}Trees of random type

@ -2509,7 +2509,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Size: {G
STR_OBJECT_CLASS_LTHS :Lighthouses STR_OBJECT_CLASS_LTHS :Lighthouses
STR_OBJECT_CLASS_TRNS :Transmitters STR_OBJECT_CLASS_TRNS :Transmitters
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Trees STR_PLANT_TREE_CAPTION :{WHITE}Trees
STR_PLANT_TREE_TOOLTIP :{BLACK}Select tree type to plant. If the tile already has a tree, this will add more trees of mixed types independent of the selected type STR_PLANT_TREE_TOOLTIP :{BLACK}Select tree type to plant. If the tile already has a tree, this will add more trees of mixed types independent of the selected type
STR_TREES_RANDOM_TYPE :{BLACK}Trees of random type STR_TREES_RANDOM_TYPE :{BLACK}Trees of random type

@ -2059,7 +2059,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Grandeco
STR_OBJECT_CLASS_LTHS :Lumturoj STR_OBJECT_CLASS_LTHS :Lumturoj
STR_OBJECT_CLASS_TRNS :Transigantoj STR_OBJECT_CLASS_TRNS :Transigantoj
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Arboj STR_PLANT_TREE_CAPTION :{WHITE}Arboj
STR_PLANT_TREE_TOOLTIP :{BLACK}Elektu arbo-tipon por planti. Kiam la regiono jam havas arbojn, aliaj arb-tipoj plantiĝos STR_PLANT_TREE_TOOLTIP :{BLACK}Elektu arbo-tipon por planti. Kiam la regiono jam havas arbojn, aliaj arb-tipoj plantiĝos
STR_TREES_RANDOM_TYPE :{BLACK}Arboj de hazardaj tipoj STR_TREES_RANDOM_TYPE :{BLACK}Arboj de hazardaj tipoj

@ -2523,7 +2523,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Suurus:
STR_OBJECT_CLASS_LTHS :Majakad STR_OBJECT_CLASS_LTHS :Majakad
STR_OBJECT_CLASS_TRNS :Saatejaamad STR_OBJECT_CLASS_TRNS :Saatejaamad
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Puud STR_PLANT_TREE_CAPTION :{WHITE}Puud
STR_PLANT_TREE_TOOLTIP :{BLACK}Vali istutatava puu liik. Kui ruudus juba on puu, siis lisatakse rohkem eri liikide puid, olenemata valikust STR_PLANT_TREE_TOOLTIP :{BLACK}Vali istutatava puu liik. Kui ruudus juba on puu, siis lisatakse rohkem eri liikide puid, olenemata valikust
STR_TREES_RANDOM_TYPE :{BLACK}Suvalised puutüübid STR_TREES_RANDOM_TYPE :{BLACK}Suvalised puutüübid

@ -2205,7 +2205,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Stødd:
STR_OBJECT_CLASS_LTHS :Vitar STR_OBJECT_CLASS_LTHS :Vitar
STR_OBJECT_CLASS_TRNS :Sendarir STR_OBJECT_CLASS_TRNS :Sendarir
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Trø STR_PLANT_TREE_CAPTION :{WHITE}Trø
STR_TREES_RANDOM_TYPE :{BLACK}Tilvildarlig træ sløg STR_TREES_RANDOM_TYPE :{BLACK}Tilvildarlig træ sløg
STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Tilvildarlig trø STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Tilvildarlig trø

@ -59,37 +59,37 @@ STR_CARGO_PLURAL_FIZZY_DRINKS :Sihijuomaa
# Singular cargo name # Singular cargo name
STR_CARGO_SINGULAR_NOTHING : STR_CARGO_SINGULAR_NOTHING :
STR_CARGO_SINGULAR_PASSENGER :Matkustaja STR_CARGO_SINGULAR_PASSENGER :matkustaja
STR_CARGO_SINGULAR_COAL :Kivihiili STR_CARGO_SINGULAR_COAL :kivihiili
STR_CARGO_SINGULAR_MAIL :Posti STR_CARGO_SINGULAR_MAIL :posti
STR_CARGO_SINGULAR_OIL :Öljy STR_CARGO_SINGULAR_OIL :öljy
STR_CARGO_SINGULAR_LIVESTOCK :Karja STR_CARGO_SINGULAR_LIVESTOCK :karja
STR_CARGO_SINGULAR_GOODS :Tavara STR_CARGO_SINGULAR_GOODS :tavara
STR_CARGO_SINGULAR_GRAIN :Vilja STR_CARGO_SINGULAR_GRAIN :vilja
STR_CARGO_SINGULAR_WOOD :Raakapuu STR_CARGO_SINGULAR_WOOD :raakapuu
STR_CARGO_SINGULAR_IRON_ORE :Rautamalmi STR_CARGO_SINGULAR_IRON_ORE :rautamalmi
STR_CARGO_SINGULAR_STEEL :Teräs STR_CARGO_SINGULAR_STEEL :teräs
STR_CARGO_SINGULAR_VALUABLES :Arvotavara STR_CARGO_SINGULAR_VALUABLES :arvotavara
STR_CARGO_SINGULAR_COPPER_ORE :Kuparimalmi STR_CARGO_SINGULAR_COPPER_ORE :kuparimalmi
STR_CARGO_SINGULAR_MAIZE :Maissi STR_CARGO_SINGULAR_MAIZE :maissi
STR_CARGO_SINGULAR_FRUIT :Hedelmä STR_CARGO_SINGULAR_FRUIT :hedelmä
STR_CARGO_SINGULAR_DIAMOND :Jalokivi STR_CARGO_SINGULAR_DIAMOND :timantti
STR_CARGO_SINGULAR_FOOD :Ruoka STR_CARGO_SINGULAR_FOOD :ruoka
STR_CARGO_SINGULAR_PAPER :Paperi STR_CARGO_SINGULAR_PAPER :paperi
STR_CARGO_SINGULAR_GOLD :Kulta STR_CARGO_SINGULAR_GOLD :kulta
STR_CARGO_SINGULAR_WATER :Vesi STR_CARGO_SINGULAR_WATER :vesi
STR_CARGO_SINGULAR_WHEAT :Vehnä STR_CARGO_SINGULAR_WHEAT :vehnä
STR_CARGO_SINGULAR_RUBBER :Kumi STR_CARGO_SINGULAR_RUBBER :kumi
STR_CARGO_SINGULAR_SUGAR :Sokeri STR_CARGO_SINGULAR_SUGAR :sokeri
STR_CARGO_SINGULAR_TOY :Lelu STR_CARGO_SINGULAR_TOY :lelu
STR_CARGO_SINGULAR_SWEETS :Karkki STR_CARGO_SINGULAR_SWEETS :karkki
STR_CARGO_SINGULAR_COLA :Limsa STR_CARGO_SINGULAR_COLA :limsa
STR_CARGO_SINGULAR_CANDYFLOSS :Hattara STR_CARGO_SINGULAR_CANDYFLOSS :hattara
STR_CARGO_SINGULAR_BUBBLE :Kupla STR_CARGO_SINGULAR_BUBBLE :kupla
STR_CARGO_SINGULAR_TOFFEE :Toffee STR_CARGO_SINGULAR_TOFFEE :toffee
STR_CARGO_SINGULAR_BATTERY :Paristo STR_CARGO_SINGULAR_BATTERY :paristo
STR_CARGO_SINGULAR_PLASTIC :Muovi STR_CARGO_SINGULAR_PLASTIC :muovi
STR_CARGO_SINGULAR_FIZZY_DRINK :Sihijuoma STR_CARGO_SINGULAR_FIZZY_DRINK :sihijuoma
# Quantity of cargo # Quantity of cargo
STR_QUANTITY_NOTHING : STR_QUANTITY_NOTHING :
@ -688,10 +688,10 @@ STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLA
STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Soittolista ”{STRING}” STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Soittolista ”{STRING}”
STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}Tyhjennä STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}Tyhjennä
STR_PLAYLIST_CHANGE_SET :{BLACK}Vaihda kokoelma STR_PLAYLIST_CHANGE_SET :{BLACK}Vaihda kokoelma
STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Tyhjennä nykyinen soittolista (vain Oma1 tai Oma2) STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Tyhjennä nykyinen soittolista (vain oma{NBSP}1 tai oma{NBSP}2)
STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}Valitse toinen asennettu kokoelma musiikkivalikoimaksesi STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}Valitse toinen asennettu kokoelma musiikkivalikoimaksesi
STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Valitse musiikkiraita lisätäksesi sen nykyiseen soittolistaan (vain Oma1 tai Oma2). STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Valitse musiikkiraita lisätäksesi sen nykyiseen soittolistaan (vain oma{NBSP}1 tai oma{NBSP}2).
STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Poista musiikkiraita nykyseiltä soittolistalta napsauttamalla (ainoastaan Custom1 tai Custom2) STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Poista musiikkiraita nykyiseltä soittolistalta napsauttamalla (vain oma{NBSP}1 tai oma{NBSP}2)
# Highscore window # Highscore window
STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Parhaat yhtiöt, jotka saavuttivat vuoden {NUM} STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Parhaat yhtiöt, jotka saavuttivat vuoden {NUM}
@ -2539,13 +2539,19 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Koko: {G
STR_OBJECT_CLASS_LTHS :Majakat STR_OBJECT_CLASS_LTHS :Majakat
STR_OBJECT_CLASS_TRNS :Lähettimet STR_OBJECT_CLASS_TRNS :Lähettimet
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Puita STR_PLANT_TREE_CAPTION :{WHITE}Puita
STR_PLANT_TREE_TOOLTIP :{BLACK}Valitse istutettava puutyyppi. Jos ruudussa on jo puu, tämä lisää uusia puita riippumatta valitun puun tyypistä STR_PLANT_TREE_TOOLTIP :{BLACK}Valitse istutettava puutyyppi. Jos ruudussa on jo puu, tämä lisää uusia puita riippumatta valitun puun tyypistä
STR_TREES_RANDOM_TYPE :{BLACK}Sattumanvaraisia puita STR_TREES_RANDOM_TYPE :{BLACK}Sattumanvaraisia puita
STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Aseta sattumanvaraisia puita. Shift vaihtaa istutustilan ja kustannusarvion välillä STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Aseta sattumanvaraisia puita. Shift vaihtaa istutustilan ja kustannusarvion välillä
STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Satunnaisia puita. STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Satunnaisia puita.
STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Istuta puita satunnaisesti maastoon STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Istuta puita satunnaisesti maastoon
STR_TREES_MODE_NORMAL_BUTTON :{BLACK}Tavallinen
STR_TREES_MODE_NORMAL_TOOLTIP :{BLACK}Istuta yksittäisiä puita vetämällä.
STR_TREES_MODE_FOREST_SM_BUTTON :{BLACK}Metsikkö
STR_TREES_MODE_FOREST_SM_TOOLTIP :{BLACK}Istuta pieniä metsiä vetämällä.
STR_TREES_MODE_FOREST_LG_BUTTON :{BLACK}Metsä
STR_TREES_MODE_FOREST_LG_TOOLTIP :{BLACK}Istuta isoja metsiä vetämällä.
# Land generation window (SE) # Land generation window (SE)
STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}Maanrakennus STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}Maanrakennus
@ -3175,10 +3181,10 @@ STR_GOALS_COMPANY_TITLE :{BLACK}Yhtiön
STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Keskitä päänäkymä laitokseen/kuntaan/ruutuun napsauttamalla tavoitetta. Ctrl+Klik avaa uuden näkymän laitoksen/kunnan/ruudun sijaintiin STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Keskitä päänäkymä laitokseen/kuntaan/ruutuun napsauttamalla tavoitetta. Ctrl+Klik avaa uuden näkymän laitoksen/kunnan/ruudun sijaintiin
# Goal question window # Goal question window
STR_GOAL_QUESTION_CAPTION_QUESTION :Kysymys STR_GOAL_QUESTION_CAPTION_QUESTION :{BLACK}Kysymys
STR_GOAL_QUESTION_CAPTION_INFORMATION :Tietoa STR_GOAL_QUESTION_CAPTION_INFORMATION :{BLACK}Tietoa
STR_GOAL_QUESTION_CAPTION_WARNING :Varoitus STR_GOAL_QUESTION_CAPTION_WARNING :{BLACK}Varoitus
STR_GOAL_QUESTION_CAPTION_ERROR :Virhe STR_GOAL_QUESTION_CAPTION_ERROR :{YELLOW}Virhe
############ Start of Goal Question button list ############ Start of Goal Question button list
STR_GOAL_QUESTION_BUTTON_CANCEL :Peruuta STR_GOAL_QUESTION_BUTTON_CANCEL :Peruuta
@ -3252,7 +3258,7 @@ STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Näytä
STR_STATION_VIEW_SUPPLY_RATINGS_TITLE :{BLACK}Kuukausittainen tarjonta ja paikallinen arvio: STR_STATION_VIEW_SUPPLY_RATINGS_TITLE :{BLACK}Kuukausittainen tarjonta ja paikallinen arvio:
STR_STATION_VIEW_CARGO_SUPPLY_RATING :{WHITE}{STRING}: {YELLOW}{COMMA} / {STRING} ({COMMA}{NBSP}%) STR_STATION_VIEW_CARGO_SUPPLY_RATING :{WHITE}{STRING}: {YELLOW}{COMMA} / {STRING} ({COMMA}{NBSP}%)
STR_STATION_VIEW_GROUP :{BLACK}Järjestä STR_STATION_VIEW_GROUP :{BLACK}Ryhmittele
STR_STATION_VIEW_WAITING_STATION :Asema: Odottaa STR_STATION_VIEW_WAITING_STATION :Asema: Odottaa
STR_STATION_VIEW_WAITING_AMOUNT :Määrä: Odottaa STR_STATION_VIEW_WAITING_AMOUNT :Määrä: Odottaa
STR_STATION_VIEW_PLANNED_STATION :Asema: Suunniteltu STR_STATION_VIEW_PLANNED_STATION :Asema: Suunniteltu
@ -3685,11 +3691,11 @@ STR_ENGINE_PREVIEW_ELRAIL_LOCOMOTIVE :sähköradan ve
STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :yksiraiteisen veturi STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :yksiraiteisen veturi
STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :Maglev-veturi STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :Maglev-veturi
STR_ENGINE_PREVIEW_ROAD_VEHICLE :ajoneuvon STR_ENGINE_PREVIEW_ROAD_VEHICLE :ajoneuvo
STR_ENGINE_PREVIEW_TRAM_VEHICLE :raitiovaunun STR_ENGINE_PREVIEW_TRAM_VEHICLE :raitiovaunu
STR_ENGINE_PREVIEW_AIRCRAFT :ilma-aluksen STR_ENGINE_PREVIEW_AIRCRAFT :ilma-alus
STR_ENGINE_PREVIEW_SHIP :laivan STR_ENGINE_PREVIEW_SHIP :laiva
STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Hinta: {CURRENCY_LONG} Paino: {WEIGHT_SHORT}{}Nopeus: {VELOCITY} Teho: {POWER}{}Käyttökustannukset: {CURRENCY_LONG}/vuosi{}Kapasiteetti: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Hinta: {CURRENCY_LONG} Paino: {WEIGHT_SHORT}{}Nopeus: {VELOCITY} Teho: {POWER}{}Käyttökustannukset: {CURRENCY_LONG}/vuosi{}Kapasiteetti: {CARGO_LONG}
STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Hinta: {CURRENCY_LONG} Paino: {WEIGHT_SHORT}{}Nopeus: {VELOCITY} Teho: {POWER} Maks. vetovoima: {6:FORCE}{}Käyttökustannukset: {4:CURRENCY_LONG}/v{}Kapasiteetti: {5:CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Hinta: {CURRENCY_LONG} Paino: {WEIGHT_SHORT}{}Nopeus: {VELOCITY} Teho: {POWER} Maks. vetovoima: {6:FORCE}{}Käyttökustannukset: {4:CURRENCY_LONG}/v{}Kapasiteetti: {5:CARGO_LONG}
@ -3894,7 +3900,7 @@ STR_REFIT_SHIP_LIST_TOOLTIP :{BLACK}Valitse
STR_REFIT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Valitse kuljetettavan rahdin tyyppi STR_REFIT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Valitse kuljetettavan rahdin tyyppi
STR_REFIT_TRAIN_REFIT_BUTTON :{BLACK}Sovita juna STR_REFIT_TRAIN_REFIT_BUTTON :{BLACK}Sovita juna
STR_REFIT_ROAD_VEHICLE_REFIT_BUTTON :{BLACK}Korjaa ajoneuvo. STR_REFIT_ROAD_VEHICLE_REFIT_BUTTON :{BLACK}Sovita ajoneuvo
STR_REFIT_SHIP_REFIT_BUTTON :{BLACK}Sovita laiva STR_REFIT_SHIP_REFIT_BUTTON :{BLACK}Sovita laiva
STR_REFIT_AIRCRAFT_REFIT_BUTTON :{BLACK}Sovita ilma-alus STR_REFIT_AIRCRAFT_REFIT_BUTTON :{BLACK}Sovita ilma-alus
@ -4561,7 +4567,7 @@ STR_ERROR_SHIP_IN_THE_WAY :{WHITE}Laiva on
STR_ERROR_AIRCRAFT_IN_THE_WAY :{WHITE}Ilma-alus on tiellä STR_ERROR_AIRCRAFT_IN_THE_WAY :{WHITE}Ilma-alus on tiellä
STR_ERROR_CAN_T_REFIT_TRAIN :{WHITE}Junaa ei voi sovittaa... STR_ERROR_CAN_T_REFIT_TRAIN :{WHITE}Junaa ei voi sovittaa...
STR_ERROR_CAN_T_REFIT_ROAD_VEHICLE :{WHITE}Ajoneuvoa ei voida korjata. STR_ERROR_CAN_T_REFIT_ROAD_VEHICLE :{WHITE}Ajoneuvoa ei voi sovittaa…
STR_ERROR_CAN_T_REFIT_SHIP :{WHITE}Laivaa ei voi sovittaa... STR_ERROR_CAN_T_REFIT_SHIP :{WHITE}Laivaa ei voi sovittaa...
STR_ERROR_CAN_T_REFIT_AIRCRAFT :{WHITE}Ilma-alusta ei voi sovittaa... STR_ERROR_CAN_T_REFIT_AIRCRAFT :{WHITE}Ilma-alusta ei voi sovittaa...
@ -4724,7 +4730,7 @@ STR_INDUSTRY_NAME_FOOD_PROCESSING_PLANT :Ruoanjalostamo
STR_INDUSTRY_NAME_PAPER_MILL :Paperitehdas STR_INDUSTRY_NAME_PAPER_MILL :Paperitehdas
STR_INDUSTRY_NAME_GOLD_MINE :Kultakaivos STR_INDUSTRY_NAME_GOLD_MINE :Kultakaivos
STR_INDUSTRY_NAME_BANK_TROPIC_ARCTIC :Pankki STR_INDUSTRY_NAME_BANK_TROPIC_ARCTIC :Pankki
STR_INDUSTRY_NAME_DIAMOND_MINE :Jalokivikaivos STR_INDUSTRY_NAME_DIAMOND_MINE :Timanttikaivos
STR_INDUSTRY_NAME_IRON_ORE_MINE :Rautakaivos STR_INDUSTRY_NAME_IRON_ORE_MINE :Rautakaivos
STR_INDUSTRY_NAME_FRUIT_PLANTATION :Hedelmäviljelmä STR_INDUSTRY_NAME_FRUIT_PLANTATION :Hedelmäviljelmä
STR_INDUSTRY_NAME_RUBBER_PLANTATION :Kumiviljelmä STR_INDUSTRY_NAME_RUBBER_PLANTATION :Kumiviljelmä

@ -316,8 +316,15 @@ STR_SORT_BY_CARGO_CAPACITY :Capacité
STR_SORT_BY_RANGE :Rayon d'action STR_SORT_BY_RANGE :Rayon d'action
STR_SORT_BY_POPULATION :Population STR_SORT_BY_POPULATION :Population
STR_SORT_BY_RATING :Qualité de service STR_SORT_BY_RATING :Qualité de service
STR_SORT_BY_NUM_VEHICLES :Nombre de véhicules
STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Profit total l'année précédente
STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :Profit total cette année
STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Profit moyen l'année précédente
STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Profit moyen cette année
# Group by options for vehicle list # Group by options for vehicle list
STR_GROUP_BY_NONE :Aucun
STR_GROUP_BY_SHARED_ORDERS :Ordres partagés
# Tooltips for the main toolbar # Tooltips for the main toolbar
STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Mettre le jeu en pause STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Mettre le jeu en pause
@ -774,6 +781,7 @@ STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}Afficher
STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Afficher le dernier message ou bulletin STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Afficher le dernier message ou bulletin
STR_STATUSBAR_COMPANY_NAME :{SILVER}- - {COMPANY} - - STR_STATUSBAR_COMPANY_NAME :{SILVER}- - {COMPANY} - -
STR_STATUSBAR_PAUSED :{YELLOW}* * SUSPENDU * * STR_STATUSBAR_PAUSED :{YELLOW}* * SUSPENDU * *
STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * SUSPENDU (en attente du recalcul des liens du graphique) * *
STR_STATUSBAR_AUTOSAVE :{RED}ENREGISTREMENT AUTOMATIQUE STR_STATUSBAR_AUTOSAVE :{RED}ENREGISTREMENT AUTOMATIQUE
STR_STATUSBAR_SAVING_GAME :{RED}* * SAUVEGARDE EN COURS * * STR_STATUSBAR_SAVING_GAME :{RED}* * SAUVEGARDE EN COURS * *
@ -1613,6 +1621,10 @@ STR_CONFIG_SETTING_TOWN_CARGOGENMODE_BITCOUNT :Linéaire
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :Plantation d'arbres durant la partie{NBSP}: {STRING} STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :Plantation d'arbres durant la partie{NBSP}: {STRING}
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :Contrôle l'apparition aléatoire des arbres durant la partie. Cela peut affecter les industries qui dépendent de la croissance des arbres, par exemple les scieries STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :Contrôle l'apparition aléatoire des arbres durant la partie. Cela peut affecter les industries qui dépendent de la croissance des arbres, par exemple les scieries
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_SPREAD :Croissance sans propagation {RED}(casse les scieries)
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_RAINFOREST :Croissance mais propagation uniquement dans les régions tropicales
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_ALL :Croissance et propagation partout
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_GROWTH_NO_SPREAD :Pas de croissance, pas de propagation {RED}(casse les scieries)
STR_CONFIG_SETTING_TOOLBAR_POS :Position de la barre d'outils principale{NBSP}: {STRING} STR_CONFIG_SETTING_TOOLBAR_POS :Position de la barre d'outils principale{NBSP}: {STRING}
STR_CONFIG_SETTING_TOOLBAR_POS_HELPTEXT :Position horizontale de la barre d'outils principale en haut de l'écran STR_CONFIG_SETTING_TOOLBAR_POS_HELPTEXT :Position horizontale de la barre d'outils principale en haut de l'écran
@ -1650,10 +1662,10 @@ STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :Aucune
STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Multiplicateur initial pour la taille des métropoles{NBSP}: {STRING} STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Multiplicateur initial pour la taille des métropoles{NBSP}: {STRING}
STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Taille moyenne des métropoles par rapport aux villes normales au début de la partie STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Taille moyenne des métropoles par rapport aux villes normales au début de la partie
STR_CONFIG_SETTING_LINKGRAPH_INTERVAL :Réactualiser le graphique de la distribution tous les {STRING}{NBSP}jour{P 0:2 "" s} STR_CONFIG_SETTING_LINKGRAPH_INTERVAL :Recalculer le graphe de distribution tous les {STRING}{NBSP}jour{P 0:2 "" s}
STR_CONFIG_SETTING_LINKGRAPH_INTERVAL_HELPTEXT :Intervalle entre la recalculation des liens du graphique. À chaque itération, une seule composante du graphique est recalculée. Donc, une valeur X pour ce réglage ne signifie pas que le graphique est réactualisé entièrement tous les X jours. Plus l'intervalle est court, plus de temps CPU est nécessaire pour la recalculation. Plus il est long, et plus de temps sera nécessaire pour que la distribution s'effectue sur de nouvelles routes. STR_CONFIG_SETTING_LINKGRAPH_INTERVAL_HELPTEXT :Intervalle entre le recalcul du graphe de distribution. À chaque itération, une seule composante du graphe est recalculée. Donc, une valeur X pour ce réglage ne signifie pas que le graphe est réactualisé entièrement tous les X jours. Plus l'intervalle est court, plus de temps CPU est nécessaire pour la recalcul. Plus il est long, et plus de temps sera nécessaire pour que la distribution s'effectue sur de nouvelles routes.
STR_CONFIG_SETTING_LINKGRAPH_TIME :Prendre {STRING}{NBSP}jour{P 0:2 "" s} pour recalculer le graphe de distribution STR_CONFIG_SETTING_LINKGRAPH_TIME :Prendre {STRING}{NBSP}jour{P 0:2 "" s} pour recalculer le graphe de distribution
STR_CONFIG_SETTING_LINKGRAPH_TIME_HELPTEXT :Durée maximale (en jours) de la réactualisation d'une composante du graphique. À chaque itération, un thread est initié, qui a une durée maximale définie par ce réglage. Plus celui-ci est court, plus la probabilité que le thread ne termine pas sa tâche à temps est élevée. Le jeu s'interrompt alors jusqu'à la fin de la recalculation ("lag"). Plus le réglage est long, et moins rapidement la distribution sera réactualisée en cas de changement de routes. STR_CONFIG_SETTING_LINKGRAPH_TIME_HELPTEXT :Durée maximale (en jours) du recalcul d'une composante du graphe. À chaque itération, un thread est initié, qui a une durée maximale définie par ce réglage. Plus celui-ci est court, plus la probabilité que le thread ne termine pas sa tâche à temps est élevée. Le jeu s'interrompt alors jusqu'à la fin du recalcul ("lag"). Plus le réglage est long, et moins rapidement la distribution sera réactualisée en cas de changement de routes.
STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :manuel STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :manuel
STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC :asymétrique STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC :asymétrique
STR_CONFIG_SETTING_DISTRIBUTION_SYMMETRIC :symétrique STR_CONFIG_SETTING_DISTRIBUTION_SYMMETRIC :symétrique
@ -1666,7 +1678,7 @@ STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :La classe de ca
STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :Type de distribution pour les autres classes de cargaison{NBSP}: {STRING} STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :Type de distribution pour les autres classes de cargaison{NBSP}: {STRING}
STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :"asymétrique" signifie qu'une quantité arbitraire de cargaison peut être envoyée dans les deux directions. "manuel" signifie qu'aucune distribution n'est mise en place pour la cargaison. STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :"asymétrique" signifie qu'une quantité arbitraire de cargaison peut être envoyée dans les deux directions. "manuel" signifie qu'aucune distribution n'est mise en place pour la cargaison.
STR_CONFIG_SETTING_LINKGRAPH_ACCURACY :Précision de la distribution{NBSP}: {STRING} STR_CONFIG_SETTING_LINKGRAPH_ACCURACY :Précision de la distribution{NBSP}: {STRING}
STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :Plus ce réglage est élevé, plus la réactualisation du graphique de distribution occupe de temps CPU. S'il est trop élevé, cela peut produire de la latence ("lag"). Au contraire, plus la valeur est basse, plus la distribution sera imprécise et l'on risque de voir des cargaisons ne pas aller vers la destination attendue. STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :Plus ce réglage est élevé, plus le recalcul du graphe de distribution occupe de temps CPU. S'il est trop élevé, cela peut produire de la latence ("lag"). Au contraire, plus la valeur est basse, plus la distribution sera imprécise et l'on risque de voir des cargaisons ne pas aller vers la destination attendue.
STR_CONFIG_SETTING_DEMAND_DISTANCE :Effet de la distance sur la demande{NBSP}: {STRING} STR_CONFIG_SETTING_DEMAND_DISTANCE :Effet de la distance sur la demande{NBSP}: {STRING}
STR_CONFIG_SETTING_DEMAND_DISTANCE_HELPTEXT :Si cette valeur est supérieure à 0, la distance entre la station d'origine A d'une cargaison et une possible destination B a un impact sur la quantité de cargaison envoyée de A vers B. Plus la distance est grande entre les deux, moins de cargaison sera envoyée. Plus cette valeur est élevée, moins de cargaison sera envoyée vers des stations lointaines, et plus vers les stations plus proches. STR_CONFIG_SETTING_DEMAND_DISTANCE_HELPTEXT :Si cette valeur est supérieure à 0, la distance entre la station d'origine A d'une cargaison et une possible destination B a un impact sur la quantité de cargaison envoyée de A vers B. Plus la distance est grande entre les deux, moins de cargaison sera envoyée. Plus cette valeur est élevée, moins de cargaison sera envoyée vers des stations lointaines, et plus vers les stations plus proches.
STR_CONFIG_SETTING_DEMAND_SIZE :Quantité de cargaison renvoyée en mode symétrique{NBSP}: {STRING} STR_CONFIG_SETTING_DEMAND_SIZE :Quantité de cargaison renvoyée en mode symétrique{NBSP}: {STRING}
@ -1976,6 +1988,10 @@ STR_NETWORK_SERVER_LIST_JOIN_GAME :{BLACK}Rejoindr
STR_NETWORK_SERVER_LIST_REFRESH :{BLACK}Actualiser STR_NETWORK_SERVER_LIST_REFRESH :{BLACK}Actualiser
STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}Actualiser les informations sur le serveur STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}Actualiser les informations sur le serveur
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET :{BLACK}Recherche internet
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET_TOOLTIP :{BLACK}Rechercher des serveurs publiés sur internet
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN :{BLACK}Recherche LAN
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN_TOOLTIP :{BLACK}Rechercher des serveurs sur le réseau local
STR_NETWORK_SERVER_LIST_ADD_SERVER :{BLACK}Ajouter un serveur STR_NETWORK_SERVER_LIST_ADD_SERVER :{BLACK}Ajouter un serveur
STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Ajouter un serveur à la liste de ceux parmi lesquels des parties en cours seront toujours cherchées STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Ajouter un serveur à la liste de ceux parmi lesquels des parties en cours seront toujours cherchées
STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Démarrer le serveur STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Démarrer le serveur
@ -2201,11 +2217,13 @@ STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_1 :Partie toujours
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_2 :Partie toujours suspendue ({STRING}, {STRING}) STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_2 :Partie toujours suspendue ({STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_3 :Partie toujours suspendue ({STRING}, {STRING}, {STRING}) STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_3 :Partie toujours suspendue ({STRING}, {STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_4 :Partie toujours suspendue ({STRING}, {STRING}, {STRING}, {STRING}) STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_4 :Partie toujours suspendue ({STRING}, {STRING}, {STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_5 :Partie toujours suspendue ({STRING}, {STRING}, {STRING}, {STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_UNPAUSED :Reprise de la partie ({STRING}) STR_NETWORK_SERVER_MESSAGE_GAME_UNPAUSED :Reprise de la partie ({STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_NOT_ENOUGH_PLAYERS :nombre de joueurs STR_NETWORK_SERVER_MESSAGE_GAME_REASON_NOT_ENOUGH_PLAYERS :nombre de joueurs
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_CONNECTING_CLIENTS :connexion de clients STR_NETWORK_SERVER_MESSAGE_GAME_REASON_CONNECTING_CLIENTS :connexion de clients
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_MANUAL :manuel STR_NETWORK_SERVER_MESSAGE_GAME_REASON_MANUAL :manuel
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_GAME_SCRIPT :script de jeu STR_NETWORK_SERVER_MESSAGE_GAME_REASON_GAME_SCRIPT :script de jeu
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :en attente du recalcul du graphe de liens
############ End of leave-in-this-order ############ End of leave-in-this-order
STR_NETWORK_MESSAGE_CLIENT_LEAVING :départ STR_NETWORK_MESSAGE_CLIENT_LEAVING :départ
STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} a rejoint la partie STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} a rejoint la partie
@ -2522,13 +2540,19 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Taille{N
STR_OBJECT_CLASS_LTHS :Phares STR_OBJECT_CLASS_LTHS :Phares
STR_OBJECT_CLASS_TRNS :Transmetteurs STR_OBJECT_CLASS_TRNS :Transmetteurs
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Arbres STR_PLANT_TREE_CAPTION :{WHITE}Arbres
STR_PLANT_TREE_TOOLTIP :{BLACK}Choix du type d'arbre. S'il y a déjà un arbre dans la case, plusieurs arbres de types différents y seront ajoutés, indépendamment du type sélectionné. STR_PLANT_TREE_TOOLTIP :{BLACK}Choix du type d'arbre. S'il y a déjà un arbre dans la case, plusieurs arbres de types différents y seront ajoutés, indépendamment du type sélectionné.
STR_TREES_RANDOM_TYPE :{BLACK}Au hasard STR_TREES_RANDOM_TYPE :{BLACK}Au hasard
STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Planter des arbres provenant d'espèces choisies au hasard.{}Shift pour afficher seulement le coût estimé. STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Planter des arbres provenant d'espèces choisies au hasard.{}Shift pour afficher seulement le coût estimé.
STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Ajouter des arbres au hasard STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Ajouter des arbres au hasard
STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Semer des arbres au hasard sur l'ensemble du terrain STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Semer des arbres au hasard sur l'ensemble du terrain
STR_TREES_MODE_NORMAL_BUTTON :{BLACK}Normal
STR_TREES_MODE_NORMAL_TOOLTIP :{BLACK}Planter de simples arbres en glissant sur le terrain
STR_TREES_MODE_FOREST_SM_BUTTON :{BLACK}Bosquet
STR_TREES_MODE_FOREST_SM_TOOLTIP :{BLACK}Planter de petites forêts en glissant sur le terrain
STR_TREES_MODE_FOREST_LG_BUTTON :{BLACK}Forêt
STR_TREES_MODE_FOREST_LG_TOOLTIP :{BLACK}Planter de larges forêts en glissant sur le terrain
# Land generation window (SE) # Land generation window (SE)
STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}Création du terrain STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}Création du terrain
@ -2761,7 +2785,7 @@ STR_FRAMERATE_GL_ROADVEHS :{WHITE} Ticks
STR_FRAMERATE_GL_SHIPS :{BLACK} Ticks des navires{NBSP}: STR_FRAMERATE_GL_SHIPS :{BLACK} Ticks des navires{NBSP}:
STR_FRAMERATE_GL_AIRCRAFT :{BLACK} Ticks des aéroplanes{NBSP}: STR_FRAMERATE_GL_AIRCRAFT :{BLACK} Ticks des aéroplanes{NBSP}:
STR_FRAMERATE_GL_LANDSCAPE :{BLACK} Ticks du monde{NBSP}: STR_FRAMERATE_GL_LANDSCAPE :{BLACK} Ticks du monde{NBSP}:
STR_FRAMERATE_GL_LINKGRAPH :{BLACK} Délai du flux des marchandises{NBSP}: STR_FRAMERATE_GL_LINKGRAPH :{BLACK} Délai du graphe de distribution{NBSP}:
STR_FRAMERATE_DRAWING :{BLACK}Rendu des graphismes{NBSP}: STR_FRAMERATE_DRAWING :{BLACK}Rendu des graphismes{NBSP}:
STR_FRAMERATE_DRAWING_VIEWPORTS :{BLACK} Vues{NBSP}: STR_FRAMERATE_DRAWING_VIEWPORTS :{BLACK} Vues{NBSP}:
STR_FRAMERATE_VIDEO :{BLACK}Sortie vidéo{NBSP}: STR_FRAMERATE_VIDEO :{BLACK}Sortie vidéo{NBSP}:
@ -2778,7 +2802,7 @@ STR_FRAMETIME_CAPTION_GL_ROADVEHS :Ticks des véhi
STR_FRAMETIME_CAPTION_GL_SHIPS :Ticks des navires STR_FRAMETIME_CAPTION_GL_SHIPS :Ticks des navires
STR_FRAMETIME_CAPTION_GL_AIRCRAFT :Ticks des aéroplanes STR_FRAMETIME_CAPTION_GL_AIRCRAFT :Ticks des aéroplanes
STR_FRAMETIME_CAPTION_GL_LANDSCAPE :Ticks du monde STR_FRAMETIME_CAPTION_GL_LANDSCAPE :Ticks du monde
STR_FRAMETIME_CAPTION_GL_LINKGRAPH :Délai du flux des marchandises STR_FRAMETIME_CAPTION_GL_LINKGRAPH :Délai du graphe de distribution
STR_FRAMETIME_CAPTION_DRAWING :Rendu des graphismes STR_FRAMETIME_CAPTION_DRAWING :Rendu des graphismes
STR_FRAMETIME_CAPTION_DRAWING_VIEWPORTS :Rendu des vues STR_FRAMETIME_CAPTION_DRAWING_VIEWPORTS :Rendu des vues
STR_FRAMETIME_CAPTION_VIDEO :Sortie vidéo STR_FRAMETIME_CAPTION_VIDEO :Sortie vidéo
@ -3158,10 +3182,10 @@ STR_GOALS_COMPANY_TITLE :{BLACK}Objectif
STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Cliquer sur l'objectif pour centrer la vue principale sur l'industrie, la ville ou la case. Ctrl-clic pour ouvrir une nouvelle vue sur l'industrie, la ville ou la case. STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Cliquer sur l'objectif pour centrer la vue principale sur l'industrie, la ville ou la case. Ctrl-clic pour ouvrir une nouvelle vue sur l'industrie, la ville ou la case.
# Goal question window # Goal question window
STR_GOAL_QUESTION_CAPTION_QUESTION :Question STR_GOAL_QUESTION_CAPTION_QUESTION :{BLACK}Question
STR_GOAL_QUESTION_CAPTION_INFORMATION :Informations STR_GOAL_QUESTION_CAPTION_INFORMATION :{BLACK}Informations
STR_GOAL_QUESTION_CAPTION_WARNING :Attention STR_GOAL_QUESTION_CAPTION_WARNING :{BLACK}Attention
STR_GOAL_QUESTION_CAPTION_ERROR :Erreur STR_GOAL_QUESTION_CAPTION_ERROR :{YELLOW}Erreur
############ Start of Goal Question button list ############ Start of Goal Question button list
STR_GOAL_QUESTION_BUTTON_CANCEL :Annuler STR_GOAL_QUESTION_BUTTON_CANCEL :Annuler
@ -4240,6 +4264,7 @@ STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Sauvegarde modi
STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE :Fichier illisible STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE :Fichier illisible
STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE :Fichier protégé en écriture STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE :Fichier protégé en écriture
STR_GAME_SAVELOAD_ERROR_DATA_INTEGRITY_CHECK_FAILED :Échec du contrôle d'intégrité des données STR_GAME_SAVELOAD_ERROR_DATA_INTEGRITY_CHECK_FAILED :Échec du contrôle d'intégrité des données
STR_GAME_SAVELOAD_ERROR_PATCHPACK :Sauvegarde créée avec une version modifiée
STR_GAME_SAVELOAD_NOT_AVAILABLE :<non disponible> STR_GAME_SAVELOAD_NOT_AVAILABLE :<non disponible>
STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}Partie sauvegardée avec une version sans support des tramways. Tous les tramways ont été supprimés. STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}Partie sauvegardée avec une version sans support des tramways. Tous les tramways ont été supprimés.

@ -2683,7 +2683,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Meud: {G
STR_OBJECT_CLASS_LTHS :Taighean-solais STR_OBJECT_CLASS_LTHS :Taighean-solais
STR_OBJECT_CLASS_TRNS :Tùir chraobh-sgaoilidh STR_OBJECT_CLASS_TRNS :Tùir chraobh-sgaoilidh
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Craobhan STR_PLANT_TREE_CAPTION :{WHITE}Craobhan
STR_PLANT_TREE_TOOLTIP :{BLACK}Tagh seòrsa na craoibhe airson cur. Ma tha craobh air an leac mu thràth, cuiridh seo barrachd chraobhan aig a bheil caochladh dhe sheòrsachan a tha neo-eisimeileach on t-seòrsa a thagh thu STR_PLANT_TREE_TOOLTIP :{BLACK}Tagh seòrsa na craoibhe airson cur. Ma tha craobh air an leac mu thràth, cuiridh seo barrachd chraobhan aig a bheil caochladh dhe sheòrsachan a tha neo-eisimeileach on t-seòrsa a thagh thu
STR_TREES_RANDOM_TYPE :{BLACK}Craobhan dhe sheòrsa air thuaiream STR_TREES_RANDOM_TYPE :{BLACK}Craobhan dhe sheòrsa air thuaiream

@ -2504,7 +2504,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Tamaño:
STR_OBJECT_CLASS_LTHS :Faros STR_OBJECT_CLASS_LTHS :Faros
STR_OBJECT_CLASS_TRNS :Transmisores STR_OBJECT_CLASS_TRNS :Transmisores
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Árbores STR_PLANT_TREE_CAPTION :{WHITE}Árbores
STR_PLANT_TREE_TOOLTIP :{BLACK}Selecciona-lo tipo de árbore a plantar. Se xa hai unha árbore no cadro, isto engadirá máis árbores de varios tipos independentemente do tipo seleccionado STR_PLANT_TREE_TOOLTIP :{BLACK}Selecciona-lo tipo de árbore a plantar. Se xa hai unha árbore no cadro, isto engadirá máis árbores de varios tipos independentemente do tipo seleccionado
STR_TREES_RANDOM_TYPE :{BLACK}Árbores de tipo aleatorio STR_TREES_RANDOM_TYPE :{BLACK}Árbores de tipo aleatorio

@ -267,7 +267,7 @@ STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}Zeigt au
STR_BUTTON_DEFAULT :{BLACK}Standard STR_BUTTON_DEFAULT :{BLACK}Standard
STR_BUTTON_CANCEL :{BLACK}Abbrechen STR_BUTTON_CANCEL :{BLACK}Abbrechen
STR_BUTTON_OK :{BLACK}OK STR_BUTTON_OK :{BLACK}OK
STR_WARNING_PASSWORD_SECURITY :{YELLOW}Achtung: Server-Administratoren könnten in der Lage sein den eingegebenen Text zu lesen. STR_WARNING_PASSWORD_SECURITY :{YELLOW}Warnung: Serveradministratoren können diesen Text einsehen.
# On screen keyboard window # On screen keyboard window
STR_OSK_KEYBOARD_LAYOUT :^1234567890ß'€qwertzuiopü+asdfghjklöä#<yxcvbnm,.- . STR_OSK_KEYBOARD_LAYOUT :^1234567890ß'€qwertzuiopü+asdfghjklöä#<yxcvbnm,.- .
@ -320,8 +320,14 @@ STR_SORT_BY_VEHICLE_COUNT :Fahrzeuganzahl
STR_SORT_BY_RANGE :Reichweite STR_SORT_BY_RANGE :Reichweite
STR_SORT_BY_POPULATION :Bevölkerung STR_SORT_BY_POPULATION :Bevölkerung
STR_SORT_BY_RATING :Bewertung STR_SORT_BY_RATING :Bewertung
STR_SORT_BY_NUM_VEHICLES :Anzahl der Fahrzeuge
STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Gewinn im letzten Jahr
STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :Gewinn in diesem Jahr
STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Durchschnittlicher Gewinn im letzten Jahr
STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Durchschnittlicher Gewinn in diesem Jahr
# Group by options for vehicle list # Group by options for vehicle list
STR_GROUP_BY_NONE :Keine
# Tooltips for the main toolbar # Tooltips for the main toolbar
STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Spiel anhalten STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Spiel anhalten
@ -347,7 +353,7 @@ STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}Ansicht
STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}Ansicht verkleinern (herauszoomen) STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}Ansicht verkleinern (herauszoomen)
STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Gleise legen STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Gleise legen
STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}Straßen bauen STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}Straßen bauen
STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}Straßenbahngleise legen STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}Straßenbahngleise bauen
STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}Häfen und Wasserstraßen bauen STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}Häfen und Wasserstraßen bauen
STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}Flughäfen bauen STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}Flughäfen bauen
STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}Landschaftsbau: Land heben/senken, Bäume pflanzen etc. STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}Landschaftsbau: Land heben/senken, Bäume pflanzen etc.
@ -368,7 +374,7 @@ STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}Landflä
STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Städte gründen STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Städte gründen
STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Industrie errichten STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Industrie errichten
STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Straße bauen STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Straße bauen
STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Straßenbahngleise legen STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Straßenbahngleise bauen
STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Bäume pflanzen. Shift schaltet zwischen Bauen und Kostenvoranschlag um STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Bäume pflanzen. Shift schaltet zwischen Bauen und Kostenvoranschlag um
STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Schild aufstellen STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Schild aufstellen
STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Objekt platzieren. Shift schaltet zwischen Bauen und Kostenvoranschlag um STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Objekt platzieren. Shift schaltet zwischen Bauen und Kostenvoranschlag um
@ -457,7 +463,7 @@ STR_RAIL_MENU_MAGLEV_CONSTRUCTION :Magnetschwebeba
############ range for road construction menu starts ############ range for road construction menu starts
STR_ROAD_MENU_ROAD_CONSTRUCTION :Straßenbau STR_ROAD_MENU_ROAD_CONSTRUCTION :Straßenbau
STR_ROAD_MENU_TRAM_CONSTRUCTION :Straßenbahnbau STR_ROAD_MENU_TRAM_CONSTRUCTION :Straßenbahn bauen
############ range ends here ############ range ends here
############ range for waterways construction menu starts ############ range for waterways construction menu starts
@ -880,7 +886,7 @@ STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE :{BIG_FONT}{BLAC
STR_NEWS_NEW_VEHICLE_TYPE :{BIG_FONT}{BLACK}{ENGINE} STR_NEWS_NEW_VEHICLE_TYPE :{BIG_FONT}{BLACK}{ENGINE}
STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE :{BLACK}Neue{G r "" s ""} {STRING} jetzt erhältlich! - {ENGINE} STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE :{BLACK}Neue{G r "" s ""} {STRING} jetzt erhältlich! - {ENGINE}
STR_NEWS_SHOW_VEHICLE_GROUP_TOOLTIP :{BLACK}Öffne das Gruppenfenster mit ausgewählter Fahrzeuggruppe STR_NEWS_SHOW_VEHICLE_GROUP_TOOLTIP :{BLACK}Das Gruppenfenster mit der bereits ausgewählten Fahrzeuggruppe öffnen
STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO :{WHITE}{STATION} nimmt kein{G "en" "e" "" "e"} {STRING} mehr an STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO :{WHITE}{STATION} nimmt kein{G "en" "e" "" "e"} {STRING} mehr an
STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO_OR_CARGO :{WHITE}{STATION} nimmt kein{G "en" "e" "" "e"} {STRING} und kein{G "en" "e" "" "e"} {STRING} mehr an STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO_OR_CARGO :{WHITE}{STATION} nimmt kein{G "en" "e" "" "e"} {STRING} und kein{G "en" "e" "" "e"} {STRING} mehr an
@ -1015,10 +1021,10 @@ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Doppelt
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Vierfach STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Vierfach
STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Schriftgröße STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Schriftgröße
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Wähle die Schriftgröße der Bedienelemente STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Die Schriftgröße der Spieloberfläche auswählen
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Doppelt STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Zweifach
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Vierfach STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Vierfach
STR_GAME_OPTIONS_BASE_GRF :{BLACK}Basisgrafiken STR_GAME_OPTIONS_BASE_GRF :{BLACK}Basisgrafiken
@ -1205,8 +1211,8 @@ STR_CONFIG_SETTING_AUTOSLOPE :Landschaftsbau
STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :Erlaube Erdbauarbeiten unter Gebäuden oder Infrastruktur ohne sie zu entfernen STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :Erlaube Erdbauarbeiten unter Gebäuden oder Infrastruktur ohne sie zu entfernen
STR_CONFIG_SETTING_CATCHMENT :Verschiedene Stationstypen haben unterschiedlich große Einzugsgebiete: {STRING} STR_CONFIG_SETTING_CATCHMENT :Verschiedene Stationstypen haben unterschiedlich große Einzugsgebiete: {STRING}
STR_CONFIG_SETTING_CATCHMENT_HELPTEXT :Wird diese Option eingeschaltet, besitzen unterschiedliche Stationsarten bzw. Flughäfen unterschiedlich große Einzugsgebiete STR_CONFIG_SETTING_CATCHMENT_HELPTEXT :Wird diese Option eingeschaltet, besitzen unterschiedliche Stationsarten bzw. Flughäfen unterschiedlich große Einzugsgebiete
STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES :Eigene Stationen können Industrien mit intergrierter Haltestelle bedienen: {STRING} STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES :Firmenstationen können Industrien mit integrierter Haltestelle bedienen: {STRING}
STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES_HELPTEXT :Falls aktiv, können Industrien mit integrierter Haltestelle (wie Ölbohrtürme) auch von nahegelegenen Stationen der Spieler bedient werden. Falls inaktive, können diese Industrien ausschließlich mittels ihrer eigenen Stationen bedient werden. Die integrierten Stationen bedienen dabei keine anderen Industrien in der Nähe STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES_HELPTEXT :Falls aktiv, können Industrien mit integrierter Haltestelle (wie Ölbohrtürme) auch von nahegelegenen Stationen der Spieler bedient werden. Falls inaktiv, können diese Industrien ausschließlich mittels ihrer eigenen Stationen bedient werden. Die integrierten Stationen bedienen dabei keine anderen Industrien in der Nähe
STR_CONFIG_SETTING_CATCHMENT_INCREASE :Vergrößere das Stationseinzugsgebiet: {STRING} STR_CONFIG_SETTING_CATCHMENT_INCREASE :Vergrößere das Stationseinzugsgebiet: {STRING}
STR_CONFIG_SETTING_CATCHMENT_INCREASE_HELPTEXT :Vergrößere das Stationseinzugsgebiet um die angegebene Anzahl an Kacheln STR_CONFIG_SETTING_CATCHMENT_INCREASE_HELPTEXT :Vergrößere das Stationseinzugsgebiet um die angegebene Anzahl an Kacheln
STR_CONFIG_SETTING_STATION_RATING_CARGO_CLASS_WAIT_TIME :Toleranz der Wartezeit für die Stationsbewertung hängt von der Fachtart ab: {STRING} STR_CONFIG_SETTING_STATION_RATING_CARGO_CLASS_WAIT_TIME :Toleranz der Wartezeit für die Stationsbewertung hängt von der Fachtart ab: {STRING}
@ -1360,8 +1366,8 @@ STR_CONFIG_SETTING_POPULATION_IN_LABEL :Zeige die Einwo
STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Zeige die Einwohneranzahl neben den Städtenamen auf der Karte an STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Zeige die Einwohneranzahl neben den Städtenamen auf der Karte an
STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Linienstärke in Diagrammen: {STRING} STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Linienstärke in Diagrammen: {STRING}
STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Strichdicke der Linien in Diagrammen. Dünnere Linien sind genauer ablesbar, dickere Linien sind besser sichtbar und erlauben es, Farben leichter zu unterscheiden STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Strichdicke der Linien in Diagrammen. Dünnere Linien sind genauer ablesbar, dickere Linien sind besser sichtbar und erlauben es, Farben leichter zu unterscheiden
STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :Zeige Name des NewGRFS im Neue-Fahrzeuge-Fenster: {STRING} STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :NewGRF-Namen im Fahrzeugbaumenü zeigen: {STRING}
STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Fügt eine Zeile zur Fahrzeugbeschreibung im Neue-Fahrzeuge-Fenster hinzu, in der anzeigt wird, aus welchem NewGRF das ausgewählte Fahrzeug stammt STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Eine Textzeile mit dem Namen des NewGRF, von dem ein Fahrzeug stammt, hinzufügen.
STR_CONFIG_SETTING_SHOW_TRAIN_LENGTH_IN_DETAILS :Zuglänge in den Fahrzeugdetails anzeigen: {STRING} STR_CONFIG_SETTING_SHOW_TRAIN_LENGTH_IN_DETAILS :Zuglänge in den Fahrzeugdetails anzeigen: {STRING}
STR_CONFIG_SETTING_SHOW_TRAIN_LENGTH_IN_DETAILS_HELPTEXT :Zeige die Zuglänge im Fenster für die Fahrzeugdetails an STR_CONFIG_SETTING_SHOW_TRAIN_LENGTH_IN_DETAILS_HELPTEXT :Zeige die Zuglänge im Fenster für die Fahrzeugdetails an
STR_CONFIG_SETTING_SHOW_VEHICLE_GROUP_IN_DETAILS :Gruppe in den Fahrzeugdetails anzeigen: {STRING} STR_CONFIG_SETTING_SHOW_VEHICLE_GROUP_IN_DETAILS :Gruppe in den Fahrzeugdetails anzeigen: {STRING}
@ -1399,7 +1405,7 @@ STR_CONFIG_SETTING_ADV_SIG_BRIDGE_TUN_MODES :Aktiviere erwei
STR_CONFIG_SETTING_ADV_SIG_BRIDGE_TUN_MODES_HELPTEXT :Aktiviert die Benutzung des erweiterten Modus zur Emulation von Signalen auf Brücken und in Tunneln. Falls deaktiviert, können Brücken/Tunnel, die sich nicht bereits im erweiterten Modus befinden, nicht in den erweiterten Modus versetzt werden. Andere Spieler können dennoch diese Option setzen und den erweiterten Modus verwenden. STR_CONFIG_SETTING_ADV_SIG_BRIDGE_TUN_MODES_HELPTEXT :Aktiviert die Benutzung des erweiterten Modus zur Emulation von Signalen auf Brücken und in Tunneln. Falls deaktiviert, können Brücken/Tunnel, die sich nicht bereits im erweiterten Modus befinden, nicht in den erweiterten Modus versetzt werden. Andere Spieler können dennoch diese Option setzen und den erweiterten Modus verwenden.
STR_CONFIG_SETTING_LANDSCAPE :Landschaftstyp: {STRING} STR_CONFIG_SETTING_LANDSCAPE :Landschaftstyp: {STRING}
STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Der Landschaftstyp definiert grundlegende Spielszenarien in Bezug auf verfügbare Fracht und Wachstumsvoraussetzungen für Städte. NewGRFs und Spielskripte erlauben weitgehendere Kontrolle dieser Parameter STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Landschaftstypen definieren grundlegende Spielszenarien mit verschiedenen Frachtarten und Bedingungen für das Wachstum von Städten. Mit NewGRFs und Spielskripten können diese allerdings genauer angepasst werden
STR_CONFIG_SETTING_LAND_GENERATOR :Algorithmus zur Landschaftserzeugung: {STRING} STR_CONFIG_SETTING_LAND_GENERATOR :Algorithmus zur Landschaftserzeugung: {STRING}
STR_CONFIG_SETTING_LAND_GENERATOR_HELPTEXT :Der orginale Generator hängt von den verwendeten Basisgrafiken ab und setzt vorgefertigte Landschaftsformen zusammen. terraGenesis ist ein auf Perlinrauschen basierter Generator mit erweiterten Einstellmöglichkeiten STR_CONFIG_SETTING_LAND_GENERATOR_HELPTEXT :Der orginale Generator hängt von den verwendeten Basisgrafiken ab und setzt vorgefertigte Landschaftsformen zusammen. terraGenesis ist ein auf Perlinrauschen basierter Generator mit erweiterten Einstellmöglichkeiten
STR_CONFIG_SETTING_MAX_SIGNAL_EVALUATIONS :Maximal erlaubte Anzahl von gleichzeitigen Veränderungen an Programmierbaren Signalen: {STRING} STR_CONFIG_SETTING_MAX_SIGNAL_EVALUATIONS :Maximal erlaubte Anzahl von gleichzeitigen Veränderungen an Programmierbaren Signalen: {STRING}
@ -1731,15 +1737,15 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Zeitung
STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Farbige Nachrichten erscheinen ab: {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Farbige Nachrichten erscheinen ab: {STRING}
STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Jahr in dem die Zeitung in Farbe herausgebracht wird. Vor diesem Jahr erscheint sie in Schwarz-Weiß-Druck STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Jahr in dem die Zeitung in Farbe herausgebracht wird. Vor diesem Jahr erscheint sie in Schwarz-Weiß-Druck
STR_CONFIG_SETTING_STARTING_YEAR :Startdatum: {STRING} STR_CONFIG_SETTING_STARTING_YEAR :Startdatum: {STRING}
STR_CONFIG_SETTING_ENDING_YEAR :Datum für Leistungsbewertung: {STRING} STR_CONFIG_SETTING_ENDING_YEAR :Beurteilungsjahr der Firma: {STRING}
STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Jahr, in dem das Spiel zum Zweck der Leistungsbewertung endet. Am Ende dieses Jahres wird der Punktestand der Firmen berechnet und die Bestenliste angezeigt, aber das Spiel kann danach fortgesetzt werden.{}Wenn das Jahr vor dem Startdatum liegt, wird die Bestenliste nie angezeigt. STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Jahr in dem das Spiel zwecks Beurteilung endet. Am Ende diesen Jahres wird die Punktezahl der Firma ermittelt und die Bestenliste wird angezeigt, es kann danach aber noch weitergespielt werden.{}Wenn dieser Wert kleiner als das Anfangsjahr ist, wird die Bestenliste nie angezeigt.
STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM}
STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Nie STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Nie
STR_CONFIG_SETTING_ECONOMY_TYPE :Wirtschaftstyp: {STRING} STR_CONFIG_SETTING_ECONOMY_TYPE :Wirtschaftstyp: {STRING}
STR_CONFIG_SETTING_ECONOMY_TYPE_HELPTEXT :Kleinteilige Wirtschaft macht häufigere Produktionsänderungen in kleineren Schritten. Eingefrorene Wirtschaft stoppt Änderungen der Produktion sowie Industrieschließungen. Diese Einstellung hat möglicherweise keinen Effekt, wenn Industrietypen durch ein NewGRF bereitgestellt werden. STR_CONFIG_SETTING_ECONOMY_TYPE_HELPTEXT :"Geglättet" sorgt für öftere, kleinere Produktionsänderungen. "Statisch" stoppt Produktionsänderungen und Industrieschließungen. Diese Einstellung hat womöglich keinen Effekt, wenn durch NewGRFs eigene Industrietypen bereitgestellt werden.
STR_CONFIG_SETTING_ECONOMY_TYPE_ORIGINAL :Original STR_CONFIG_SETTING_ECONOMY_TYPE_ORIGINAL :Original
STR_CONFIG_SETTING_ECONOMY_TYPE_SMOOTH :Kleinteilig STR_CONFIG_SETTING_ECONOMY_TYPE_SMOOTH :Geglättet
STR_CONFIG_SETTING_ECONOMY_TYPE_FROZEN :Eingefroren STR_CONFIG_SETTING_ECONOMY_TYPE_FROZEN :Statisch
STR_CONFIG_SETTING_ALLOW_SHARES :Handel mit Firmenanteilen erlauben: {STRING} 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_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} STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Minimales Alter einer Firma, um an der Börse gehandelt zu werden: {STRING}
@ -1788,8 +1794,8 @@ STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Erlaube Spieler
STR_CONFIG_SETTING_TOWN_FOUNDING_FORBIDDEN :Verboten STR_CONFIG_SETTING_TOWN_FOUNDING_FORBIDDEN :Verboten
STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED :Erlaubt STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED :Erlaubt
STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED_CUSTOM_LAYOUT :Erlaubt, mit wählbarem Straßenbauplan STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED_CUSTOM_LAYOUT :Erlaubt, mit wählbarem Straßenbauplan
STR_CONFIG_SETTING_TOWN_CARGOGENMODE :Erzeugung von städtischer Fracht: {STRING} STR_CONFIG_SETTING_TOWN_CARGOGENMODE :Güterproduktion in Städten: {STRING}
STR_CONFIG_SETTING_TOWN_CARGOGENMODE_HELPTEXT :Beeinflusst wie viel Passagiere, Post und andere städtische Fracht von Häusern relativ zur Einwohnerzahl einer Stadt produziert wird.{}Quadratisches Wachstum: Eine doppelt so große Stadt produziert vier mal so viel Fracht.{}Lineares Wachstum: Eine doppelt so große Stadt produziert die doppelte Menge an Fracht. STR_CONFIG_SETTING_TOWN_CARGOGENMODE_HELPTEXT :Die Gütermenge, die von Häusern einer Stadt relativ zur Gesamtbevölkerung der Stadt produziert wird.{}Quadratisch: eine doppelt so große Stadt generiert viermal so viele Passagiere.{}Linear: eine doppelt so große Stadt generiert doppelt so viele Passagiere.
STR_CONFIG_SETTING_TOWN_CARGOGENMODE_ORIGINAL :Quadratisch (orginal) STR_CONFIG_SETTING_TOWN_CARGOGENMODE_ORIGINAL :Quadratisch (orginal)
STR_CONFIG_SETTING_TOWN_CARGOGENMODE_BITCOUNT :Linear STR_CONFIG_SETTING_TOWN_CARGOGENMODE_BITCOUNT :Linear
STR_CONFIG_SETTING_TOWN_CARGO_FACTOR :Faktor für die Erzeugung von städtischer Fracht (weniger < 0 < mehr): {STRING} STR_CONFIG_SETTING_TOWN_CARGO_FACTOR :Faktor für die Erzeugung von städtischer Fracht (weniger < 0 < mehr): {STRING}
@ -1799,6 +1805,10 @@ STR_CONFIG_SETTING_INDUSTRY_CARGO_FACTOR_HELPTEXT :Die Frachterzeu
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :Platzierung von Bäumen während des Spiels: {STRING} STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :Platzierung von Bäumen während des Spiels: {STRING}
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :Lege das Ausmaß des zufälligen Baumwachstums während des Spiels fest. Dies kann Industrien wie die Sägemühle beeinflussen, welche auf nachwachsende Bäume angewiesen sind STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :Lege das Ausmaß des zufälligen Baumwachstums während des Spiels fest. Dies kann Industrien wie die Sägemühle beeinflussen, welche auf nachwachsende Bäume angewiesen sind
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_SPREAD :Wachsen und nicht ausbreiten {RED}(Macht Sägemühlen unhaltbar)
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_RAINFOREST :Wachsen und nur in Regenwäldern ausbreiten
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_ALL :Wachsen und überall ausbreiten
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_GROWTH_NO_SPREAD :Nicht wachsen und nicht ausbreiten {RED}(Macht Sägemühlen unhaltbar)
STR_CONFIG_SETTING_TREES_AROUND_SNOWLINE :Angepasste Platzierung von subarktischen Bäumen: {STRING} STR_CONFIG_SETTING_TREES_AROUND_SNOWLINE :Angepasste Platzierung von subarktischen Bäumen: {STRING}
STR_CONFIG_SETTING_TREES_AROUND_SNOWLINE_HELPTEXT :Passt die Platzierung von Bäumen um die Schneegrenze im arktischen Klima an. Bäume dünnen oberhalb der Schneegrenze aus. Bäume direkt unterhalb der Schneegrenze sind eine Mischung aus subarktischen und gemäßigten Bäumen. Darunter werden gemäßigte Bäume platziert. STR_CONFIG_SETTING_TREES_AROUND_SNOWLINE_HELPTEXT :Passt die Platzierung von Bäumen um die Schneegrenze im arktischen Klima an. Bäume dünnen oberhalb der Schneegrenze aus. Bäume direkt unterhalb der Schneegrenze sind eine Mischung aus subarktischen und gemäßigten Bäumen. Darunter werden gemäßigte Bäume platziert.
@ -1853,7 +1863,7 @@ STR_CONFIG_SETTING_TOWN_GROWTH_VERY_FAST :Sehr schnell
STR_CONFIG_SETTING_LARGER_TOWNS :Anteil der Städte, die Großstädte werden: {STRING} STR_CONFIG_SETTING_LARGER_TOWNS :Anteil der Städte, die Großstädte werden: {STRING}
STR_CONFIG_SETTING_LARGER_TOWNS_HELPTEXT :Anzahl Städte, die eine Großstadt werden, d.h. derjenigen Städte, die schon zu Beginn des Spiels größer sind und auch schneller wachsen werden STR_CONFIG_SETTING_LARGER_TOWNS_HELPTEXT :Anzahl Städte, die eine Großstadt werden, d.h. derjenigen Städte, die schon zu Beginn des Spiels größer sind und auch schneller wachsen werden
STR_CONFIG_SETTING_LARGER_TOWNS_VALUE :1 von {COMMA} STR_CONFIG_SETTING_LARGER_TOWNS_VALUE :1 von {COMMA}
STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :keine STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :Keine
STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Größe von Großstädten bei Spielbeginn: {STRING}x STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Größe von Großstädten bei Spielbeginn: {STRING}x
STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Durchschnittliche Größe von Großstädten relativ zu normalen Städten bei Spielbeginn STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Durchschnittliche Größe von Großstädten relativ zu normalen Städten bei Spielbeginn
STR_CONFIG_SETTING_RANDOM_ROAD_RECONSTRUCTION :Wahrscheinlichkeit zufälliger Straßenreparaturen: {STRING} STR_CONFIG_SETTING_RANDOM_ROAD_RECONSTRUCTION :Wahrscheinlichkeit zufälliger Straßenreparaturen: {STRING}
@ -1898,7 +1908,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Immer wenn die
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :Imperial (mph) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :Imperial (mph)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :Metrisch (km/h) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :Metrisch (km/h)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :SI (m/s) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :SI (m/s)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS :Spieleinheit (Kacheln/Tag) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS :Spieleinheiten (Spielfeldkacheln/Tag)
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Leistungseinheit von Fahrzeugen: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Leistungseinheit von Fahrzeugen: {STRING}
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :Immer wenn die Leistung eins Fahrzeugs angezeigt wird, zeige es in den gewählten Einheiten STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :Immer wenn die Leistung eins Fahrzeugs angezeigt wird, zeige es in den gewählten Einheiten
@ -2280,6 +2290,10 @@ STR_NETWORK_SERVER_LIST_JOIN_GAME :{BLACK}Spiel be
STR_NETWORK_SERVER_LIST_REFRESH :{BLACK}Aktualisieren STR_NETWORK_SERVER_LIST_REFRESH :{BLACK}Aktualisieren
STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}Aktualisiert die Serverinformationen STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}Aktualisiert die Serverinformationen
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET :{BLACK}Internet durchsuchen
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET_TOOLTIP :{BLACK}Internet nach öffentlichen Spielservern durchsuchen
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN :{BLACK}LAN durchsuchen
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN_TOOLTIP :{BLACK}Lokales Netzwerk nach Spielservern durchsuchen
STR_NETWORK_SERVER_LIST_ADD_SERVER :{BLACK}Server hinzufügen STR_NETWORK_SERVER_LIST_ADD_SERVER :{BLACK}Server hinzufügen
STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Fügt einen Server zu der Liste von Servern hinzu, die immer nach laufenden Spielen kontrolliert werden STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Fügt einen Server zu der Liste von Servern hinzu, die immer nach laufenden Spielen kontrolliert werden
STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Server starten STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Server starten
@ -2504,8 +2518,8 @@ STR_NETWORK_SERVER_MESSAGE_GAME_PAUSED :Spiel angehalte
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_1 :Spiel weiterhin angehalten ({STRING}) STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_1 :Spiel weiterhin angehalten ({STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_2 :Spiel weiterhin angehalten ({STRING}, {STRING}) STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_2 :Spiel weiterhin angehalten ({STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_3 :Spiel weiterhin angehalten ({STRING}, {STRING}, {STRING}) STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_3 :Spiel weiterhin angehalten ({STRING}, {STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_4 :Spiel immer noch angehalten ({STRING}, {STRING}, {STRING}, {STRING}) STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_4 :Spiel weiterhin angehalten ({STRING}, {STRING}, {STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_5 :Spiel immer noch angehalten ({STRING}, {STRING}, {STRING}, {STRING}, {STRING}) STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_5 :Spiel weiterhin angehalten ({STRING}, {STRING}, {STRING}, {STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_UNPAUSED :Spiel fortgesetzt ({STRING}) STR_NETWORK_SERVER_MESSAGE_GAME_UNPAUSED :Spiel fortgesetzt ({STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_NOT_ENOUGH_PLAYERS :Spieleranzahl STR_NETWORK_SERVER_MESSAGE_GAME_REASON_NOT_ENOUGH_PLAYERS :Spieleranzahl
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_CONNECTING_CLIENTS :Teilnehmer meldet sich an STR_NETWORK_SERVER_MESSAGE_GAME_REASON_CONNECTING_CLIENTS :Teilnehmer meldet sich an
@ -2527,7 +2541,7 @@ STR_NETWORK_MESSAGE_MONEY_GIVEN :*** {STRING} ga
STR_NETWORK_MESSAGE_MONEY_GIVE_SRC_DESCRIPTION :{STRING} ({COMPANY}) STR_NETWORK_MESSAGE_MONEY_GIVE_SRC_DESCRIPTION :{STRING} ({COMPANY})
STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}Der Server hat das Spiel beendet STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}Der Server hat das Spiel beendet
STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Der Server startet neu...{}Bitte warten... STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Der Server startet neu...{}Bitte warten...
STR_NETWORK_MESSAGE_KICKED :*** {STRING} wurde hinausgeworfen. Grund: ({STRING}) STR_NETWORK_MESSAGE_KICKED :*** {STRING} wurde vom Server hinausgeworfen. Grund: ({STRING})
# Content downloading window # Content downloading window
STR_CONTENT_TITLE :{WHITE}Herunterladen von Erweiterungen STR_CONTENT_TITLE :{WHITE}Herunterladen von Erweiterungen
@ -3053,7 +3067,7 @@ STR_BRIDGE_TUBULAR_SILICON :Siliziumrundbr
# Road construction toolbar # Road construction toolbar
STR_ROAD_TOOLBAR_ROAD_CONSTRUCTION_CAPTION :{WHITE}Straßenbau STR_ROAD_TOOLBAR_ROAD_CONSTRUCTION_CAPTION :{WHITE}Straßenbau
STR_ROAD_TOOLBAR_TRAM_CONSTRUCTION_CAPTION :{WHITE}Straßenbahnbau STR_ROAD_TOOLBAR_TRAM_CONSTRUCTION_CAPTION :{WHITE}Straßenbahn bauen
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION :{BLACK}Straße bauen. Strg halten, um zwischen Bauen und Entfernen umzuschalten. Shift schaltet zwischen Bauen und Kostenvoranschlag um STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION :{BLACK}Straße bauen. Strg halten, um zwischen Bauen und Entfernen umzuschalten. Shift schaltet zwischen Bauen und Kostenvoranschlag um
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}Straßenbahngleis bauen. Strg halten, um zwischen Bauen und Entfernen umzuschalten. Shift schaltet zwischen Bauen und Kostenvoranschlag um STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}Straßenbahngleis bauen. Strg halten, um zwischen Bauen und Entfernen umzuschalten. Shift schaltet zwischen Bauen und Kostenvoranschlag um
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}Straße mit automatischer Wahl der Ausrichtung bauen. Strg halten, um zwischen Bauen und Entfernen umzuschalten. Shift schaltet zwischen Bauen und Kostenvoranschlag um STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}Straße mit automatischer Wahl der Ausrichtung bauen. Strg halten, um zwischen Bauen und Entfernen umzuschalten. Shift schaltet zwischen Bauen und Kostenvoranschlag um
@ -3071,8 +3085,8 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Straßen
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Straßenbahntunnel bauen. Shift schaltet zwischen Bauen und Kostenvoranschlag um STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Straßenbahntunnel bauen. Shift schaltet zwischen Bauen und Kostenvoranschlag um
STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}Zwischen Bau und Abriss der Straße umschalten STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}Zwischen Bau und Abriss der Straße umschalten
STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Zwischen Bau und Abriss von Straßenbahngleisen umschalten STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Zwischen Bau und Abriss von Straßenbahngleisen umschalten
STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD :{BLACK}Konvertiere/Upgrade den Straßentyp. Shift schaltet zwischen Bauen und Kostenvoranschlag um STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD :{BLACK}Straßentyp in den ausgewählten umwandeln. Shift schaltet zwischen Bauen und Kostenvoranschlag um
STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM :{BLACK}Konvertiere/Upgrade den Straßenbahntyp. Shift schaltet zwischen Bauen und Kostenvoranschlag um STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM :{BLACK}Straßenbahntyp in den ausgewählten umwandeln. Shift schaltet zwischen Bauen und Kostenvoranschlag um
STR_ROAD_NAME_ROAD :Straße STR_ROAD_NAME_ROAD :Straße
STR_ROAD_NAME_TRAM :Straßenbahn STR_ROAD_NAME_TRAM :Straßenbahn
@ -3187,7 +3201,7 @@ STR_BASIC_HOUSE_SET_NAME :Standard-Gebäu
STR_SELECT_TOWN_CAPTION :{WHITE}Wähle Stadt STR_SELECT_TOWN_CAPTION :{WHITE}Wähle Stadt
STR_SELECT_TOWN_LIST_ITEM :{BLACK}{TOWN} STR_SELECT_TOWN_LIST_ITEM :{BLACK}{TOWN}
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Bäume STR_PLANT_TREE_CAPTION :{WHITE}Bäume
STR_PLANT_TREE_TOOLTIP :{BLACK}Wähle die zu pflanzende Baumart. Wenn auf dem Feld schon ein Baum steht, wird eine zufällige Baumart gepflanzt STR_PLANT_TREE_TOOLTIP :{BLACK}Wähle die zu pflanzende Baumart. Wenn auf dem Feld schon ein Baum steht, wird eine zufällige Baumart gepflanzt
STR_TREES_RANDOM_TYPE :{BLACK}Zufällige Baumart STR_TREES_RANDOM_TYPE :{BLACK}Zufällige Baumart
@ -3196,6 +3210,12 @@ STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Zufälli
STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Bäume zufällig über die Landschaft verteilen STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Bäume zufällig über die Landschaft verteilen
STR_TREES_REMOVE_TREES_BUTTON :{BLACK}Entferne alle Bäume STR_TREES_REMOVE_TREES_BUTTON :{BLACK}Entferne alle Bäume
STR_TREES_REMOVE_TREES_TOOLTIP :{BLACK}Entferne alle Bäume in der Landschaft STR_TREES_REMOVE_TREES_TOOLTIP :{BLACK}Entferne alle Bäume in der Landschaft
STR_TREES_MODE_NORMAL_BUTTON :{BLACK}Normal
STR_TREES_MODE_NORMAL_TOOLTIP :{BLACK}Einzelne Bäume durch Klicken und Ziehen über die Landschaft pflanzen.
STR_TREES_MODE_FOREST_SM_BUTTON :{BLACK}Hain
STR_TREES_MODE_FOREST_SM_TOOLTIP :{BLACK}Kleine Haine durch Klicken und Ziehen über die Landschaft pflanzen.
STR_TREES_MODE_FOREST_LG_BUTTON :{BLACK}Wald
STR_TREES_MODE_FOREST_LG_TOOLTIP :{BLACK}Große Wälder durch Klicken und Ziehen über die Landschaft pflanzen.
# Land generation window (SE) # Land generation window (SE)
STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}Land erstellen STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}Land erstellen
@ -3448,7 +3468,7 @@ STR_FRAMERATE_DRAWING_VIEWPORTS :{BLACK}Kartenan
STR_FRAMERATE_VIDEO :{BLACK}Videoausgabe: STR_FRAMERATE_VIDEO :{BLACK}Videoausgabe:
STR_FRAMERATE_SOUND :{BLACK}Sound-Abmischung: STR_FRAMERATE_SOUND :{BLACK}Sound-Abmischung:
STR_FRAMERATE_ALLSCRIPTS :{BLACK} GS/KI insgesamt: STR_FRAMERATE_ALLSCRIPTS :{BLACK} GS/KI insgesamt:
STR_FRAMERATE_GAMESCRIPT :{BLACK} Skript: STR_FRAMERATE_GAMESCRIPT :{BLACK} Script:
STR_FRAMERATE_AI :{BLACK} KI {NUM} {STRING} STR_FRAMERATE_AI :{BLACK} KI {NUM} {STRING}
############ End of leave-in-this-order ############ End of leave-in-this-order
############ Leave those lines in this order!! ############ Leave those lines in this order!!
@ -3740,8 +3760,8 @@ STR_BROKEN_VEHICLE_LENGTH :{WHITE}Zug '{VE
STR_NEWGRF_BUGGY :{WHITE}NewGRF '{0:STRING}' liefert falsche Informationen STR_NEWGRF_BUGGY :{WHITE}NewGRF '{0:STRING}' liefert falsche Informationen
STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Fracht / Ersetzungs - Informationen für '{1:ENGINE}' weichen von der Einkaufsliste nach dem Kauf ab. Das kann dazu führen, dass das Umrüsten beim autmatisches Ersetzen oder Erneuern nicht korrekt funktioniert STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Fracht / Ersetzungs - Informationen für '{1:ENGINE}' weichen von der Einkaufsliste nach dem Kauf ab. Das kann dazu führen, dass das Umrüsten beim autmatisches Ersetzen oder Erneuern nicht korrekt funktioniert
STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' verursachte eine Endlosschleife in Produktions-Rückruffunktion STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' verursachte eine Endlosschleife in Produktions-Rückruffunktion
STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT :{WHITE}Callback {1:HEX} lieferte des unbekannte und ungülte Resultat {2:HEX} STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT :{WHITE}Rückruffunktion {1:HEX} lieferte des unbekannte/ungülte Resultat {2:HEX}
STR_NEWGRF_BUGGY_INVALID_CARGO_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' lieferte einen ungültigen Frachttyp im Produktins-Rückruffunktion bei {2:HEX} STR_NEWGRF_BUGGY_INVALID_CARGO_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' lieferte eine ungültige Frachtart in der Produktions-Rückruffunktion {2:HEX}
STR_NEWGRF_TOO_MANY_STRINGS :{WHITE}Nicht genügend String-IDs für alle NewGRFs vorhanden. STR_NEWGRF_TOO_MANY_STRINGS :{WHITE}Nicht genügend String-IDs für alle NewGRFs vorhanden.
STR_NEWGRF_TOO_MANY_STRINGS_DETAIL :{WHITE}Einige Namen oder Textfelder können falsch dargestellt werden. Versuche weniger NewGRFs zu benutzen. STR_NEWGRF_TOO_MANY_STRINGS_DETAIL :{WHITE}Einige Namen oder Textfelder können falsch dargestellt werden. Versuche weniger NewGRFs zu benutzen.
@ -3852,10 +3872,10 @@ STR_GOALS_COMPANY_TITLE :{BLACK}Firmensp
STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Klick auf Ziel zentriert Hauptansicht auf Industrie/Stadt/Feld. Strg+Klick öffnet eine darauf zentrierte Zusatzansicht STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Klick auf Ziel zentriert Hauptansicht auf Industrie/Stadt/Feld. Strg+Klick öffnet eine darauf zentrierte Zusatzansicht
# Goal question window # Goal question window
STR_GOAL_QUESTION_CAPTION_QUESTION :Frage STR_GOAL_QUESTION_CAPTION_QUESTION :{BLACK}Frage
STR_GOAL_QUESTION_CAPTION_INFORMATION :Hinweis STR_GOAL_QUESTION_CAPTION_INFORMATION :{BLACK}Hinweis
STR_GOAL_QUESTION_CAPTION_WARNING :Warnung STR_GOAL_QUESTION_CAPTION_WARNING :{BLACK}Warnung
STR_GOAL_QUESTION_CAPTION_ERROR :Fehler STR_GOAL_QUESTION_CAPTION_ERROR :{YELLOW}Fehler
############ Start of Goal Question button list ############ Start of Goal Question button list
STR_GOAL_QUESTION_BUTTON_CANCEL :Abbruch STR_GOAL_QUESTION_BUTTON_CANCEL :Abbruch
@ -4174,7 +4194,7 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infrastr
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Schienenfelder: STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Schienenfelder:
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Signale STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Signale
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Straßenfelder: STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Straßenfelder:
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAM_SECT :{GOLD}Straßenbahnfelder: STR_COMPANY_INFRASTRUCTURE_VIEW_TRAM_SECT :{GOLD}Straßenbahnfelder
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Wasserfelder: STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Wasserfelder:
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanäle STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanäle
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stationen: STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stationen:
@ -4190,11 +4210,11 @@ STR_INDUSTRY_DIRECTORY_ITEM_NOPROD :{ORANGE}{INDUST
STR_INDUSTRY_DIRECTORY_ITEM_PROD1 :{ORANGE}{INDUSTRY} {STRING} STR_INDUSTRY_DIRECTORY_ITEM_PROD1 :{ORANGE}{INDUSTRY} {STRING}
STR_INDUSTRY_DIRECTORY_ITEM_PROD2 :{ORANGE}{INDUSTRY} {STRING}, {STRING} STR_INDUSTRY_DIRECTORY_ITEM_PROD2 :{ORANGE}{INDUSTRY} {STRING}, {STRING}
STR_INDUSTRY_DIRECTORY_ITEM_PROD3 :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} STR_INDUSTRY_DIRECTORY_ITEM_PROD3 :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING}
STR_INDUSTRY_DIRECTORY_ITEM_PRODMORE :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} und weitere {NUM}... STR_INDUSTRY_DIRECTORY_ITEM_PRODMORE :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} und {NUM} weitere...
STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Industrienamen - Klick auf den Namen zentriert Hauptansicht auf die Industrie. Strg+Klick öffnet neue Zusatzansicht zentriert auf die Industrie STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Industrienamen - Klick auf den Namen zentriert Hauptansicht auf die Industrie. Strg+Klick öffnet neue Zusatzansicht zentriert auf die Industrie
STR_INDUSTRY_DIRECTORY_ACCEPTED_CARGO_FILTER :{BLACK}Akzeptierte Fracht: {SILVER}{STRING} STR_INDUSTRY_DIRECTORY_ACCEPTED_CARGO_FILTER :{BLACK}Angenommene Frachtarten: {SILVER}{STRING}
STR_INDUSTRY_DIRECTORY_PRODUCED_CARGO_FILTER :{BLACK}Produzierte Fracht: {SILVER}{STRING} STR_INDUSTRY_DIRECTORY_PRODUCED_CARGO_FILTER :{BLACK}Produzierte Güter: {SILVER}{STRING}
STR_INDUSTRY_DIRECTORY_FILTER_ALL_TYPES :Alle Frachttypen STR_INDUSTRY_DIRECTORY_FILTER_ALL_TYPES :Alle Frachtarten
STR_INDUSTRY_DIRECTORY_FILTER_NONE :Keine STR_INDUSTRY_DIRECTORY_FILTER_NONE :Keine
# Industry view # Industry view
@ -4510,7 +4530,7 @@ STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :{G=w}Einschiene
STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :{G=w}Magnetschwebebahn STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :{G=w}Magnetschwebebahn
STR_ENGINE_PREVIEW_ROAD_VEHICLE :{G=n}Straßenfahrzeug STR_ENGINE_PREVIEW_ROAD_VEHICLE :{G=n}Straßenfahrzeug
STR_ENGINE_PREVIEW_TRAM_VEHICLE :{G=w}Straßenbahn STR_ENGINE_PREVIEW_TRAM_VEHICLE :Straßenbahnfahrzeug
STR_ENGINE_PREVIEW_AIRCRAFT :{G=n}Flugzeug STR_ENGINE_PREVIEW_AIRCRAFT :{G=n}Flugzeug
STR_ENGINE_PREVIEW_SHIP :{G=n}Schiff STR_ENGINE_PREVIEW_SHIP :{G=n}Schiff
@ -5196,8 +5216,8 @@ STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Skript n
STR_SCREENSHOT_CAPTION :{WHITE}Sreenshot erzeugen STR_SCREENSHOT_CAPTION :{WHITE}Sreenshot erzeugen
STR_SCREENSHOT_SCREENSHOT :{BLACK}Normaler Screenshot STR_SCREENSHOT_SCREENSHOT :{BLACK}Normaler Screenshot
STR_SCREENSHOT_ZOOMIN_SCREENSHOT :{BLACK}Voll hinein gezoomter Screenshot STR_SCREENSHOT_ZOOMIN_SCREENSHOT :{BLACK}Screenshot auf der größten Zoomstufe
STR_SCREENSHOT_DEFAULTZOOM_SCREENSHOT :{BLACK}Screenshot mit Standard-Zoom STR_SCREENSHOT_DEFAULTZOOM_SCREENSHOT :{BLACK}Screenshot auf der Standard-Zoomstufe
STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Screenshot des ganzen Spielfeldes STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Screenshot des ganzen Spielfeldes
STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Reliefkarten-Screenshot STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Reliefkarten-Screenshot
STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Minimap Screenshot STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Minimap Screenshot
@ -5279,11 +5299,11 @@ STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Datei ka
STR_ERROR_GAME_LOAD_FAILED :{WHITE}Laden des Spieles fehlgeschlagen{}{STRING} STR_ERROR_GAME_LOAD_FAILED :{WHITE}Laden des Spieles fehlgeschlagen{}{STRING}
STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Interner Fehler: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Interner Fehler: {STRING}
STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Spielstandsdatei defekt - {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Spielstandsdatei defekt - {STRING}
STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Spielstand wurde mit neuerer Version erstellt STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Spielstand wurde mit einer neueren Spielversion erstellt
STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE :Datei kann nicht gelesen werden STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE :Datei kann nicht gelesen werden
STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE :Datei kann nicht geschrieben werden STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE :Datei kann nicht geschrieben werden
STR_GAME_SAVELOAD_ERROR_DATA_INTEGRITY_CHECK_FAILED :Prüfung der Datenintegrität fehlgeschlagen STR_GAME_SAVELOAD_ERROR_DATA_INTEGRITY_CHECK_FAILED :Prüfung der Datenintegrität fehlgeschlagen
STR_GAME_SAVELOAD_ERROR_PATCHPACK :Spielstand wurde mit einer modifizierten Version erstellt STR_GAME_SAVELOAD_ERROR_PATCHPACK :Spielstand wurde mit einer modifizierten Spielversion erstellt
STR_GAME_SAVELOAD_NOT_AVAILABLE :<nicht verfügbar> STR_GAME_SAVELOAD_NOT_AVAILABLE :<nicht verfügbar>
STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}Spiel wurde in einer Version ohne Straßenbahnunterstützung gespeichert. Alle Straßenbahnen wurden entfernt STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}Spiel wurde in einer Version ohne Straßenbahnunterstützung gespeichert. Alle Straßenbahnen wurden entfernt
@ -5606,7 +5626,7 @@ STR_ERROR_GROUP_CAN_T_CREATE :{WHITE}Gruppe k
STR_ERROR_GROUP_CAN_T_DELETE :{WHITE}Gruppe kann nicht gelöscht werden... STR_ERROR_GROUP_CAN_T_DELETE :{WHITE}Gruppe kann nicht gelöscht werden...
STR_ERROR_GROUP_CAN_T_RENAME :{WHITE}Gruppe kann nicht umbenannt werden... STR_ERROR_GROUP_CAN_T_RENAME :{WHITE}Gruppe kann nicht umbenannt werden...
STR_ERROR_GROUP_CAN_T_SET_PARENT :{WHITE}Übergeordnete Gruppe kann nicht gesetzt werden... STR_ERROR_GROUP_CAN_T_SET_PARENT :{WHITE}Übergeordnete Gruppe kann nicht gesetzt werden...
STR_ERROR_GROUP_CAN_T_SET_PARENT_RECURSION :{WHITE}... Schleifen in der Gruppenhierarchy sind nicht erlaubt STR_ERROR_GROUP_CAN_T_SET_PARENT_RECURSION :{WHITE}... Schleifen sind in der Gruppenhierarchie nicht erlaubt
STR_ERROR_GROUP_CAN_T_REMOVE_ALL_VEHICLES :{WHITE}Entfernen aller Fahrzeuge dieser Gruppe nicht möglich... STR_ERROR_GROUP_CAN_T_REMOVE_ALL_VEHICLES :{WHITE}Entfernen aller Fahrzeuge dieser Gruppe nicht möglich...
STR_ERROR_GROUP_CAN_T_ADD_VEHICLE :{WHITE}Fahrzeug kann nicht zu dieser Gruppe hinzugefügt werden... STR_ERROR_GROUP_CAN_T_ADD_VEHICLE :{WHITE}Fahrzeug kann nicht zu dieser Gruppe hinzugefügt werden...
STR_ERROR_GROUP_CAN_T_ADD_SHARED_VEHICLE :{WHITE}Fahrzeuge mit gemeinsamen Fahrplan können nicht zur Gruppe hinzugefügt werden... STR_ERROR_GROUP_CAN_T_ADD_SHARED_VEHICLE :{WHITE}Fahrzeuge mit gemeinsamen Fahrplan können nicht zur Gruppe hinzugefügt werden...
@ -5816,10 +5836,10 @@ STR_INDUSTRY_NAME_SUGAR_MINE :{G=w}Zuckermine
##id 0x6000 ##id 0x6000
STR_SV_EMPTY : STR_SV_EMPTY :
STR_SV_UNNAMED :Unbenannt STR_SV_UNNAMED :Unbenannt
STR_SV_TRAIN_NAME :Zug {COMMA} STR_SV_TRAIN_NAME :Zug #{COMMA}
STR_SV_ROAD_VEHICLE_NAME :Straßenfahrzeug {COMMA} STR_SV_ROAD_VEHICLE_NAME :Straßenfahrzeug #{COMMA}
STR_SV_SHIP_NAME :Schiff {COMMA} STR_SV_SHIP_NAME :Schiff #{COMMA}
STR_SV_AIRCRAFT_NAME :Flugzeug {COMMA} STR_SV_AIRCRAFT_NAME :Flugzeug #{COMMA}
STR_SV_STNAME :{STRING} STR_SV_STNAME :{STRING}
STR_SV_STNAME_NORTH :{STRING} Nord STR_SV_STNAME_NORTH :{STRING} Nord
@ -6126,6 +6146,7 @@ STR_FORMAT_BUOY_NAME :{TOWN} Boje
STR_FORMAT_BUOY_NAME_SERIAL :{TOWN} Boje #{COMMA} STR_FORMAT_BUOY_NAME_SERIAL :{TOWN} Boje #{COMMA}
STR_FORMAT_COMPANY_NUM :(Firma {COMMA}) STR_FORMAT_COMPANY_NUM :(Firma {COMMA})
STR_FORMAT_GROUP_NAME :Gruppe {COMMA} STR_FORMAT_GROUP_NAME :Gruppe {COMMA}
STR_FORMAT_GROUP_VEHICLE_NAME :{GROUP} #{COMMA}
STR_FORMAT_INDUSTRY_NAME :{TOWN} {STRING} STR_FORMAT_INDUSTRY_NAME :{TOWN} {STRING}
STR_FORMAT_WAYPOINT_NAME :Wegpunkt {TOWN} STR_FORMAT_WAYPOINT_NAME :Wegpunkt {TOWN}
STR_FORMAT_WAYPOINT_NAME_SERIAL :Wegpunkt {TOWN} #{COMMA} STR_FORMAT_WAYPOINT_NAME_SERIAL :Wegpunkt {TOWN} #{COMMA}

@ -2593,7 +2593,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Μέγε
STR_OBJECT_CLASS_LTHS :Φάροι STR_OBJECT_CLASS_LTHS :Φάροι
STR_OBJECT_CLASS_TRNS :Αναμεταδότες STR_OBJECT_CLASS_TRNS :Αναμεταδότες
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Δέντρα STR_PLANT_TREE_CAPTION :{WHITE}Δέντρα
STR_PLANT_TREE_TOOLTIP :{BLACK}Επιλέξτε τύπο δέντρου για φύτευση. Αν το τετραγωνίδιο έχει ήδη ένα δέντρο, αυτό θα προσθέσει περισσότερα δέντρα μεικτών τύπων ανεξάρτητα από τον επιλεγμένο τύπο STR_PLANT_TREE_TOOLTIP :{BLACK}Επιλέξτε τύπο δέντρου για φύτευση. Αν το τετραγωνίδιο έχει ήδη ένα δέντρο, αυτό θα προσθέσει περισσότερα δέντρα μεικτών τύπων ανεξάρτητα από τον επιλεγμένο τύπο
STR_TREES_RANDOM_TYPE :{BLACK}Δέντρα τυχαίου τύπου STR_TREES_RANDOM_TYPE :{BLACK}Δέντρα τυχαίου τύπου

@ -2476,7 +2476,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}גודל
STR_OBJECT_CLASS_LTHS :מגדלורים STR_OBJECT_CLASS_LTHS :מגדלורים
STR_OBJECT_CLASS_TRNS :אנטנות STR_OBJECT_CLASS_TRNS :אנטנות
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}עצים STR_PLANT_TREE_CAPTION :{WHITE}עצים
STR_PLANT_TREE_TOOLTIP :{BLACK}בחר סוג עץ לנטיעה. במידה ויש עץ במשבצת, יתווספו עצים נוספים מסוגים שונים ללא קשר לסוג הנבחר STR_PLANT_TREE_TOOLTIP :{BLACK}בחר סוג עץ לנטיעה. במידה ויש עץ במשבצת, יתווספו עצים נוספים מסוגים שונים ללא קשר לסוג הנבחר
STR_TREES_RANDOM_TYPE :{BLACK}עצים מסוג אקראי STR_TREES_RANDOM_TYPE :{BLACK}עצים מסוג אקראי

@ -2577,7 +2577,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Méret:
STR_OBJECT_CLASS_LTHS :Világítótornyok STR_OBJECT_CLASS_LTHS :Világítótornyok
STR_OBJECT_CLASS_TRNS :Adótornyok STR_OBJECT_CLASS_TRNS :Adótornyok
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Fák STR_PLANT_TREE_CAPTION :{WHITE}Fák
STR_PLANT_TREE_TOOLTIP :{BLACK}Ültetendő fa kiválasztása. Ha már van fa a mezőn, akkor újabb fák ültetése a kiválasztott fatípustól függetlenül STR_PLANT_TREE_TOOLTIP :{BLACK}Ültetendő fa kiválasztása. Ha már van fa a mezőn, akkor újabb fák ültetése a kiválasztott fatípustól függetlenül
STR_TREES_RANDOM_TYPE :{BLACK}Véletlenszerű fafélék STR_TREES_RANDOM_TYPE :{BLACK}Véletlenszerű fafélék

@ -2302,7 +2302,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Stærð:
STR_OBJECT_CLASS_LTHS :Vitar STR_OBJECT_CLASS_LTHS :Vitar
STR_OBJECT_CLASS_TRNS :Sendar STR_OBJECT_CLASS_TRNS :Sendar
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Tré STR_PLANT_TREE_CAPTION :{WHITE}Tré
STR_PLANT_TREE_TOOLTIP :{BLACK}Veldu trjátegund sem á að gróðursetja. Ef það er fyrir tré á reitnum, verðu fleiri trjám mismunandi trjám plantað óhað hvaða tegund hefur verið valin STR_PLANT_TREE_TOOLTIP :{BLACK}Veldu trjátegund sem á að gróðursetja. Ef það er fyrir tré á reitnum, verðu fleiri trjám mismunandi trjám plantað óhað hvaða tegund hefur verið valin
STR_TREES_RANDOM_TYPE :{BLACK}Tré af handahófskenndri gerð STR_TREES_RANDOM_TYPE :{BLACK}Tré af handahófskenndri gerð

@ -2513,7 +2513,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Ukuran:
STR_OBJECT_CLASS_LTHS :Mercusuar STR_OBJECT_CLASS_LTHS :Mercusuar
STR_OBJECT_CLASS_TRNS :Pemancar STR_OBJECT_CLASS_TRNS :Pemancar
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Pepohonan STR_PLANT_TREE_CAPTION :{WHITE}Pepohonan
STR_PLANT_TREE_TOOLTIP :{BLACK}Pilih jenis pohon untuk ditanam. Jika pohon sudah tertanam, ini akan menambah jenis pohon secara acak dari tipe yang sama. STR_PLANT_TREE_TOOLTIP :{BLACK}Pilih jenis pohon untuk ditanam. Jika pohon sudah tertanam, ini akan menambah jenis pohon secara acak dari tipe yang sama.
STR_TREES_RANDOM_TYPE :{BLACK}Tanam pohon secara acak STR_TREES_RANDOM_TYPE :{BLACK}Tanam pohon secara acak

@ -2450,7 +2450,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Méid: {
STR_OBJECT_CLASS_LTHS :Tithe solais STR_OBJECT_CLASS_LTHS :Tithe solais
STR_OBJECT_CLASS_TRNS :Tarchuradóirí STR_OBJECT_CLASS_TRNS :Tarchuradóirí
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Crainnte STR_PLANT_TREE_CAPTION :{WHITE}Crainnte
STR_PLANT_TREE_TOOLTIP :{BLACK}Roghnaigh an cineál crainn le cur STR_PLANT_TREE_TOOLTIP :{BLACK}Roghnaigh an cineál crainn le cur
STR_TREES_RANDOM_TYPE :{BLACK}Crainnte randamacha STR_TREES_RANDOM_TYPE :{BLACK}Crainnte randamacha

@ -2543,7 +2543,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Dimensio
STR_OBJECT_CLASS_LTHS :Fari STR_OBJECT_CLASS_LTHS :Fari
STR_OBJECT_CLASS_TRNS :Trasmettitori STR_OBJECT_CLASS_TRNS :Trasmettitori
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Alberi STR_PLANT_TREE_CAPTION :{WHITE}Alberi
STR_PLANT_TREE_TOOLTIP :{BLACK}Seleziona il tipo di albero da piantare. Se nel riquadro sono già presenti alberi, ne aggiunge altri di vari tipi, indipendentemente dal tipo selezionato STR_PLANT_TREE_TOOLTIP :{BLACK}Seleziona il tipo di albero da piantare. Se nel riquadro sono già presenti alberi, ne aggiunge altri di vari tipi, indipendentemente dal tipo selezionato
STR_TREES_RANDOM_TYPE :{BLACK}Alberi casuali STR_TREES_RANDOM_TYPE :{BLACK}Alberi casuali

@ -2458,7 +2458,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}サイ
STR_OBJECT_CLASS_LTHS :灯台 STR_OBJECT_CLASS_LTHS :灯台
STR_OBJECT_CLASS_TRNS :電波塔 STR_OBJECT_CLASS_TRNS :電波塔
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}植林 STR_PLANT_TREE_CAPTION :{WHITE}植林
STR_PLANT_TREE_TOOLTIP :{BLACK}植林する樹類を選択します。既に木がある場合は追加で植林されます STR_PLANT_TREE_TOOLTIP :{BLACK}植林する樹類を選択します。既に木がある場合は追加で植林されます
STR_TREES_RANDOM_TYPE :{BLACK}ランダムな樹類 STR_TREES_RANDOM_TYPE :{BLACK}ランダムな樹類

@ -1268,7 +1268,7 @@ STR_CONFIG_SETTING_SIGNALSIDE_HELPTEXT :선로의 어
STR_CONFIG_SETTING_SIGNALSIDE_LEFT :왼쪽에 STR_CONFIG_SETTING_SIGNALSIDE_LEFT :왼쪽에
STR_CONFIG_SETTING_SIGNALSIDE_DRIVING_SIDE :진행 방향에 STR_CONFIG_SETTING_SIGNALSIDE_DRIVING_SIDE :진행 방향에
STR_CONFIG_SETTING_SIGNALSIDE_RIGHT :오른쪽에 STR_CONFIG_SETTING_SIGNALSIDE_RIGHT :오른쪽에
STR_CONFIG_SETTING_SHOWFINANCES :연말에 자동으로 재정 창을 띄: {STRING} STR_CONFIG_SETTING_SHOWFINANCES :연말에 자동으로 재정 창을 띄우기: {STRING}
STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT :이 설정을 켜면. 회사의 재정 상태를 확인하기 쉽도록 매년 말에 재정 창이 자동으로 뜹니다. STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT :이 설정을 켜면. 회사의 재정 상태를 확인하기 쉽도록 매년 말에 재정 창이 자동으로 뜹니다.
STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :새로 지정하는 경로는 기본적으로 '직행'으로 처리: {STRING} STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :새로 지정하는 경로는 기본적으로 '직행'으로 처리: {STRING}
STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :일반적으로 차량은 경로 상에 있는 모든 역에 정차하게 되어있습니다. 이 설정을 켜면, 차량이 마지막 목적지까지 정차없이 모든 역을 통과할 것입니다. 이 설정은 새로 경로를 지정하는 차량에만 적용되는 점을 알아두십시오. 하지만 각 차량의 경로는 두 가지 방법 중에 원하는 대로 다시 설정할 수 있습니다. STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :일반적으로 차량은 경로 상에 있는 모든 역에 정차하게 되어있습니다. 이 설정을 켜면, 차량이 마지막 목적지까지 정차없이 모든 역을 통과할 것입니다. 이 설정은 새로 경로를 지정하는 차량에만 적용되는 점을 알아두십시오. 하지만 각 차량의 경로는 두 가지 방법 중에 원하는 대로 다시 설정할 수 있습니다.
@ -1335,7 +1335,7 @@ STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_HELPTEXT :새 회사에
STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :옛날 공항을 사라지지 않고 계속 만들 수 있게 함: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :옛날 공항을 사라지지 않고 계속 만들 수 있게 함: {STRING}
STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :이 설정을 켜면, 소형 공항을 포함한 모든 공항 종류를 도입 이후에 계속 사용할 수 있게 됩니다. STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :이 설정을 켜면, 소형 공항을 포함한 모든 공항 종류를 도입 이후에 계속 사용할 수 있게 됩니다.
STR_CONFIG_SETTING_WARN_LOST_VEHICLE :차량이 길을 잃으면 경고: {STRING} STR_CONFIG_SETTING_WARN_LOST_VEHICLE :차량이 길을 잃으면 경고하기: {STRING}
STR_CONFIG_SETTING_WARN_LOST_VEHICLE_HELPTEXT :다음 목적지로 가기 위한 경로를 찾을 수 없는 차량이 있으면 뉴스 메시지로 알려줍니다. STR_CONFIG_SETTING_WARN_LOST_VEHICLE_HELPTEXT :다음 목적지로 가기 위한 경로를 찾을 수 없는 차량이 있으면 뉴스 메시지로 알려줍니다.
STR_CONFIG_SETTING_WARN_RESTRICTION_WAIT_VEHICLE :열차가 경로 제한 때문에 멈춘 경우 경고: {STRING} STR_CONFIG_SETTING_WARN_RESTRICTION_WAIT_VEHICLE :열차가 경로 제한 때문에 멈춘 경우 경고: {STRING}
STR_CONFIG_SETTING_WARN_RESTRICTION_WAIT_VEHICLE_HELPTEXT :경로 제한 기능때문에 열차가 경로 신호기에서 오랫동안 멈춰있는 경우 뉴스 메시지로 알려줍니다. STR_CONFIG_SETTING_WARN_RESTRICTION_WAIT_VEHICLE_HELPTEXT :경로 제한 기능때문에 열차가 경로 신호기에서 오랫동안 멈춰있는 경우 뉴스 메시지로 알려줍니다.
@ -1367,7 +1367,7 @@ STR_CONFIG_SETTING_ERRMSG_DURATION_HELPTEXT :오류 메시
STR_CONFIG_SETTING_ERRMSG_DURATION_VALUE :{COMMA}초 동안 STR_CONFIG_SETTING_ERRMSG_DURATION_VALUE :{COMMA}초 동안
STR_CONFIG_SETTING_HOVER_DELAY :도움말 보이기: {STRING} STR_CONFIG_SETTING_HOVER_DELAY :도움말 보이기: {STRING}
STR_CONFIG_SETTING_HOVER_DELAY_HELPTEXT :마우스를 올려놓았을 때 도움말이 뜨는데 걸리는 시간을 설정합니다. 마우스 오른쪽 클릭으로 바로 뜨도록 할 수도 있습니다. STR_CONFIG_SETTING_HOVER_DELAY_HELPTEXT :마우스를 올려놓았을 때 도움말이 뜨는데 걸리는 시간을 설정합니다. 마우스 오른쪽 클릭으로 바로 뜨도록 할 수도 있습니다.
STR_CONFIG_SETTING_HOVER_DELAY_VALUE :마우스를 {COMMA}밀리초 동안 올려놓기 (1밀리초 = 1/1000초) STR_CONFIG_SETTING_HOVER_DELAY_VALUE :마우스를 {COMMA}밀리초 동안 올려놓기
STR_CONFIG_SETTING_HOVER_DELAY_DISABLED :마우스 오른쪽 클릭 STR_CONFIG_SETTING_HOVER_DELAY_DISABLED :마우스 오른쪽 클릭
STR_CONFIG_SETTING_POPULATION_IN_LABEL :도시 이름 옆에 도시의 인구 수를 표시함: {STRING} STR_CONFIG_SETTING_POPULATION_IN_LABEL :도시 이름 옆에 도시의 인구 수를 표시함: {STRING}
STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :도시 이름 옆에 도시의 인구 수를 표시합니다. STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :도시 이름 옆에 도시의 인구 수를 표시합니다.
@ -1457,7 +1457,7 @@ STR_CONFIG_SETTING_SERVICEATHELIPAD :헬리콥터를
STR_CONFIG_SETTING_SERVICEATHELIPAD_HELPTEXT :공항에 격납고가 없어도 헬리콥터가 공항에 착륙할 때마다 점검을 하도록 합니다. STR_CONFIG_SETTING_SERVICEATHELIPAD_HELPTEXT :공항에 격납고가 없어도 헬리콥터가 공항에 착륙할 때마다 점검을 하도록 합니다.
STR_CONFIG_SETTING_NONSTOP_ORDER_ONLY :직통 경로만 허용: {STRING} STR_CONFIG_SETTING_NONSTOP_ORDER_ONLY :직통 경로만 허용: {STRING}
STR_CONFIG_SETTING_NONSTOP_ORDER_ONLY_HELPTEXT :열차와 자동차에 직통 경로만 추가할 수 있게 합니다 STR_CONFIG_SETTING_NONSTOP_ORDER_ONLY_HELPTEXT :열차와 자동차에 직통 경로만 추가할 수 있게 합니다
STR_CONFIG_SETTING_LINK_TERRAFORM_TOOLBAR :철도/도로/항만/공항 건설창을 띄울 때 지형 편집창도 같이 띄: {STRING} STR_CONFIG_SETTING_LINK_TERRAFORM_TOOLBAR :철도/도로/항만/공항 건설창을 띄울 때 지형 편집창도 같이 띄우기: {STRING}
STR_CONFIG_SETTING_LINK_TERRAFORM_TOOLBAR_HELPTEXT :수송 시설과 관련된 건설 창을 열 때 지형 편집 창을 같이 엽니다. STR_CONFIG_SETTING_LINK_TERRAFORM_TOOLBAR_HELPTEXT :수송 시설과 관련된 건설 창을 열 때 지형 편집 창을 같이 엽니다.
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR :소형지도 창에 표시될 땅의 색상: {STRING} STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR :소형지도 창에 표시될 땅의 색상: {STRING}
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :소형지도 창에 사용할 지형의 색상을 선택합니다. STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :소형지도 창에 사용할 지형의 색상을 선택합니다.
@ -1540,7 +1540,7 @@ STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :게임을 자
STR_CONFIG_SETTING_AUTOSAVE_ON_NETWORK_DISCONNECT :네트워크 연결이 끊어지면 자동 저장: {STRING} STR_CONFIG_SETTING_AUTOSAVE_ON_NETWORK_DISCONNECT :네트워크 연결이 끊어지면 자동 저장: {STRING}
STR_CONFIG_SETTING_AUTOSAVE_ON_NETWORK_DISCONNECT_HELPTEXT :이 설정을 켜면 서버와의 연결이 끊어졌을 때 게임을 자동으로 저장합니다. STR_CONFIG_SETTING_AUTOSAVE_ON_NETWORK_DISCONNECT_HELPTEXT :이 설정을 켜면 서버와의 연결이 끊어졌을 때 게임을 자동으로 저장합니다.
STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :저장 파일 이름으로 {STRING} 날짜 형식을 사용합니다. STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :저장 파일 이름으로 {STRING} 날짜 형식을 사용
STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :게임 저장 파일 이름에 사용할 날짜 형식을 선택합니다. STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :게임 저장 파일 이름에 사용할 날짜 형식을 선택합니다.
STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_LONG :긴 (2012년 1월 1일) STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_LONG :긴 (2012년 1월 1일)
STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_SHORT :짧은 (2012.01.01) STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_SHORT :짧은 (2012.01.01)
@ -1668,7 +1668,7 @@ STR_CONFIG_SETTING_AI_IN_MULTIPLAYER_HELPTEXT :멀티 플레
STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES :게임 스크립트가 중지되기 직전에 계산할 수 있는 최대 횟수: {STRING} STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES :게임 스크립트가 중지되기 직전에 계산할 수 있는 최대 횟수: {STRING}
STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES_HELPTEXT :게임 스크립트가 한 단계에서 계산할 수 있는 최대 계산 횟수를 설정합니다. STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES_HELPTEXT :게임 스크립트가 한 단계에서 계산할 수 있는 최대 계산 횟수를 설정합니다.
STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY :스크립트당 최대 메모리 사용량: {STRING} STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY :스크립트당 최대 메모리 사용량: {STRING}
STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_HELPTEXT :강제로 종료되기 전에 단일 스크립트가 사용할 수 있는 메모리의 양입니다. 크기가 큰 맵에서는 값을 크게 설정해야할 수도 있습니다. STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_HELPTEXT :스크립트 하나가 강제 종료되기 전까지 사용할 수 있는 메모리의 양입니다. 크기가 큰 맵에서는 값을 크게 설정해야할 수도 있습니다.
STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_VALUE :{COMMA} MiB STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_VALUE :{COMMA} MiB
STR_CONFIG_SETTING_SHARING_RAIL :철도 공유: {STRING} STR_CONFIG_SETTING_SHARING_RAIL :철도 공유: {STRING}
@ -1755,7 +1755,7 @@ STR_CONFIG_SETTING_ECONOMY_TYPE_SMOOTH :부드러움
STR_CONFIG_SETTING_ECONOMY_TYPE_FROZEN :멈춤 STR_CONFIG_SETTING_ECONOMY_TYPE_FROZEN :멈춤
STR_CONFIG_SETTING_ALLOW_SHARES :다른 회사의 지분을 사는 것을 허용: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES :다른 회사의 지분을 사는 것을 허용: {STRING}
STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :이 설정을 켜면, 회사의 지분을 거래할 수 있게 됩니다. 회사의 지분을 거래하려면 해당 회사가 어느 정도 오래되어야 합니다. STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :이 설정을 켜면, 회사의 지분을 거래할 수 있게 됩니다. 회사의 지분을 거래하려면 해당 회사가 어느 정도 오래되어야 합니다.
STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :지분 거래를 허용할 최소 회사 나이: {STRING} STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :지분 거래를 허용할 최소 회사 나이: {STRING}
STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES_HELPTEXT :지분을 사고 팔기 위해 필요한 회사의 최소 나이를 설정합니다. STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES_HELPTEXT :지분을 사고 팔기 위해 필요한 회사의 최소 나이를 설정합니다.
STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :환승시 벌어들이는 중간 수익의 비율: {STRING} STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :환승시 벌어들이는 중간 수익의 비율: {STRING}
STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :더 많은 수익을 내기 위해, 수송 관계상 중간 구간에게 주어진 수익의 비율을 설정합니다. STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :더 많은 수익을 내기 위해, 수송 관계상 중간 구간에게 주어진 수익의 비율을 설정합니다.
@ -1770,7 +1770,7 @@ STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :드래그할
STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :신호기를 CTRL+드래그 하여 설치할 때의 행동을 선택합니다. 이 설정을 끄면, 신호기가 없는 긴 폐색을 만들지 않기 위해 터널이나 다리 주변에 먼저 신호기가 설치될 것입니다. 이 설정을 켜면, 신호기는 터널/다리와 상관없이 매 n개의 칸마다 설치될 것입니다. STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :신호기를 CTRL+드래그 하여 설치할 때의 행동을 선택합니다. 이 설정을 끄면, 신호기가 없는 긴 폐색을 만들지 않기 위해 터널이나 다리 주변에 먼저 신호기가 설치될 것입니다. 이 설정을 켜면, 신호기는 터널/다리와 상관없이 매 n개의 칸마다 설치될 것입니다.
STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :전자식 신호기의 사용: {STRING}년 이후에 STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :전자식 신호기의 사용: {STRING}년 이후에
STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :전자식 신호기를 사용할 수 있는 연도를 설정합니다. 이 이전에는 구식 신호기만 사용 가능합니다. (두 신호기는 기능적으로는 동일하고 모습만 다릅니다.) STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :전자식 신호기를 사용할 수 있는 연도를 설정합니다. 이 이전에는 구식 신호기만 사용 가능합니다. (두 신호기는 기능적으로는 동일하고 모습만 다릅니다.)
STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI :신호기 설치시 신호기 선택 창을 띄: {STRING} STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI :신호기 설치시 신호기 선택 창을 띄우기: {STRING}
STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI_HELPTEXT :설치할 신호기 종류를 고를 수 있는 신호기 선택 창을 표시합니다. 이 설정을 끄면, 신호기 선택 창 없이 CTRL+클릭 만으로 신호기의 종류를 바꿔야 합니다. STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI_HELPTEXT :설치할 신호기 종류를 고를 수 있는 신호기 선택 창을 표시합니다. 이 설정을 끄면, 신호기 선택 창 없이 CTRL+클릭 만으로 신호기의 종류를 바꿔야 합니다.
STR_CONFIG_SETTING_DEFAULT_SIGNAL_TYPE :기본적으로 만들 신호기 종류: {STRING} STR_CONFIG_SETTING_DEFAULT_SIGNAL_TYPE :기본적으로 만들 신호기 종류: {STRING}
STR_CONFIG_SETTING_DEFAULT_SIGNAL_TYPE_HELPTEXT :기본으로 설치할 신호기의 종류를 선택합니다. STR_CONFIG_SETTING_DEFAULT_SIGNAL_TYPE_HELPTEXT :기본으로 설치할 신호기의 종류를 선택합니다.
@ -1810,8 +1810,12 @@ STR_CONFIG_SETTING_TOWN_CARGO_FACTOR_HELPTEXT :도시가 생
STR_CONFIG_SETTING_INDUSTRY_CARGO_FACTOR :산업 시설 화물 생성 계수 (적음 < 0 < 많음): {STRING} STR_CONFIG_SETTING_INDUSTRY_CARGO_FACTOR :산업 시설 화물 생성 계수 (적음 < 0 < 많음): {STRING}
STR_CONFIG_SETTING_INDUSTRY_CARGO_FACTOR_HELPTEXT :1차 산업 시설이 생산하는 화물의 양을 2^(생성 계수)에 근접하게 조절합니다. 나무를 베는 산업 시설에는 적용되지 않습니다.{}모든 산업 시설 관련 NewGRF와 모두 호환되지는 않을 수 있습니다. STR_CONFIG_SETTING_INDUSTRY_CARGO_FACTOR_HELPTEXT :1차 산업 시설이 생산하는 화물의 양을 2^(생성 계수)에 근접하게 조절합니다. 나무를 베는 산업 시설에는 적용되지 않습니다.{}모든 산업 시설 관련 NewGRF와 모두 호환되지는 않을 수 있습니다.
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :게임 진행 중에 나무가 자동적으로 번식: {STRING} STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :나무의 성장과 확장: {STRING}
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :게임 중에 나무가 자동적으로 번식하는지 여부를 조절합니다. 이 설정을 조정하면, 아열대 기후의 벌목소처럼 나무의 성장에 의존하는 산업시설에 영향을 끼칠 수 있습니다. STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :게임 플레이 중 나무의 성장과 확장 여부를 조절합니다. 이 설정을 조정하면, 아열대 기후의 벌목소처럼 나무의 성장에 의존하는 산업시설에 영향을 끼칠 수 있습니다.
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_SPREAD :성장은 하되 확장은 안 함 {RED}(제재소가 멈출 수 있음)
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_RAINFOREST :성장은 하되 열대 우림에서만 확장함
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_ALL :어디서나 성장하고 확장함
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_GROWTH_NO_SPREAD :성장과 확장 모두 안 함 {RED}(제재소가 멈출 수 있음)
STR_CONFIG_SETTING_TREES_AROUND_SNOWLINE :조정된 눈 쌓인 나무: {STRING} STR_CONFIG_SETTING_TREES_AROUND_SNOWLINE :조정된 눈 쌓인 나무: {STRING}
STR_CONFIG_SETTING_TREES_AROUND_SNOWLINE_HELPTEXT :아한대 기후에서의 설선 근처의 눈 쌓인 나무의 개수를 조정합니다. 설선 위에는 나무가 적어집니다. 설선에서는 온대 기후의 나무와 눈 쌓인 나무가 공존할 것입니다. 설선 아래에선 온대 기후의 나무가 자랄 것입니다. STR_CONFIG_SETTING_TREES_AROUND_SNOWLINE_HELPTEXT :아한대 기후에서의 설선 근처의 눈 쌓인 나무의 개수를 조정합니다. 설선 위에는 나무가 적어집니다. 설선에서는 온대 기후의 나무와 눈 쌓인 나무가 공존할 것입니다. 설선 아래에선 온대 기후의 나무가 자랄 것입니다.
@ -2293,6 +2297,10 @@ STR_NETWORK_SERVER_LIST_JOIN_GAME :{BLACK}게임
STR_NETWORK_SERVER_LIST_REFRESH :{BLACK}새로고침 STR_NETWORK_SERVER_LIST_REFRESH :{BLACK}새로고침
STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}서버 정보를 새로 고칩니다. STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}서버 정보를 새로 고칩니다.
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET :{BLACK}인터넷 검색
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET_TOOLTIP :{BLACK}인터넷에서 공개 서버를 검색합니다
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN :{BLACK}LAN 검색
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN_TOOLTIP :{BLACK}로컬 영역 네트워크에서 서버를 검색합니다
STR_NETWORK_SERVER_LIST_ADD_SERVER :{BLACK}서버 추가 STR_NETWORK_SERVER_LIST_ADD_SERVER :{BLACK}서버 추가
STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}서버를 목록에 수동으로 추가합니다. STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}서버를 목록에 수동으로 추가합니다.
STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}서버 열기 STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}서버 열기
@ -3200,7 +3208,7 @@ STR_BASIC_HOUSE_SET_NAME :기본 건물
STR_SELECT_TOWN_CAPTION :{WHITE}도시 선택 STR_SELECT_TOWN_CAPTION :{WHITE}도시 선택
STR_SELECT_TOWN_LIST_ITEM :{BLACK}{TOWN} STR_SELECT_TOWN_LIST_ITEM :{BLACK}{TOWN}
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}나무 STR_PLANT_TREE_CAPTION :{WHITE}나무
STR_PLANT_TREE_TOOLTIP :{BLACK}심고싶은 나무의 종류를 선택합니다. 이미 나무가 심어져있는 경우에는 선택한 나무의 크기를 키웁니다 STR_PLANT_TREE_TOOLTIP :{BLACK}심고싶은 나무의 종류를 선택합니다. 이미 나무가 심어져있는 경우에는 선택한 나무의 크기를 키웁니다
STR_TREES_RANDOM_TYPE :{BLACK}여러 종류의 나무 같이 심기 STR_TREES_RANDOM_TYPE :{BLACK}여러 종류의 나무 같이 심기
@ -3209,6 +3217,12 @@ STR_TREES_RANDOM_TREES_BUTTON :{BLACK}무작
STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}전 지역에 걸쳐 무작위로 나무를 심습니다 STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}전 지역에 걸쳐 무작위로 나무를 심습니다
STR_TREES_REMOVE_TREES_BUTTON :{BLACK}모든 나무 제거하기 STR_TREES_REMOVE_TREES_BUTTON :{BLACK}모든 나무 제거하기
STR_TREES_REMOVE_TREES_TOOLTIP :{BLACK}전 지역에 걸쳐 나무를 모두 제거합니다. STR_TREES_REMOVE_TREES_TOOLTIP :{BLACK}전 지역에 걸쳐 나무를 모두 제거합니다.
STR_TREES_MODE_NORMAL_BUTTON :{BLACK}일반
STR_TREES_MODE_NORMAL_TOOLTIP :{BLACK}지면을 드래그해서 나무를 하나씩 놓습니다.
STR_TREES_MODE_FOREST_SM_BUTTON :{BLACK}작은 숲
STR_TREES_MODE_FOREST_SM_TOOLTIP :{BLACK}지면을 드래그해서 작은 숲을 만듭니다.
STR_TREES_MODE_FOREST_LG_BUTTON :{BLACK}큰 숲
STR_TREES_MODE_FOREST_LG_TOOLTIP :{BLACK}지면을 드래그해서 큰 숲을 만듭니다.
# Land generation window (SE) # Land generation window (SE)
STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}지형 만들기 STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}지형 만들기
@ -3865,10 +3879,10 @@ STR_GOALS_COMPANY_TITLE :{BLACK}회사
STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}산업시설/마을/칸의 위치로 화면을 이동하려면 클릭하십시오. CTRL+클릭하면 산업시설/마을/칸의 위치를 기준으로 새로운 외부 화면을 엽니다 STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}산업시설/마을/칸의 위치로 화면을 이동하려면 클릭하십시오. CTRL+클릭하면 산업시설/마을/칸의 위치를 기준으로 새로운 외부 화면을 엽니다
# Goal question window # Goal question window
STR_GOAL_QUESTION_CAPTION_QUESTION :{G=m}질문 STR_GOAL_QUESTION_CAPTION_QUESTION :{BLACK}질의
STR_GOAL_QUESTION_CAPTION_INFORMATION :{G=f}정보 STR_GOAL_QUESTION_CAPTION_INFORMATION :{BLACK}정보
STR_GOAL_QUESTION_CAPTION_WARNING :{G=f}경고 STR_GOAL_QUESTION_CAPTION_WARNING :{BLACK}경고
STR_GOAL_QUESTION_CAPTION_ERROR :{G=f}오류 STR_GOAL_QUESTION_CAPTION_ERROR :{YELLOW}오류
############ Start of Goal Question button list ############ Start of Goal Question button list
STR_GOAL_QUESTION_BUTTON_CANCEL :취소 STR_GOAL_QUESTION_BUTTON_CANCEL :취소

@ -2685,7 +2685,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Magnitud
STR_OBJECT_CLASS_LTHS :Phari STR_OBJECT_CLASS_LTHS :Phari
STR_OBJECT_CLASS_TRNS :Emissoria STR_OBJECT_CLASS_TRNS :Emissoria
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Arbores STR_PLANT_TREE_CAPTION :{WHITE}Arbores
STR_PLANT_TREE_TOOLTIP :{BLACK}Eligere arborem serendam. Si tegula iam arborem habet, plures arbores fortuitas addentur (forsitan non idem typus arboris) STR_PLANT_TREE_TOOLTIP :{BLACK}Eligere arborem serendam. Si tegula iam arborem habet, plures arbores fortuitas addentur (forsitan non idem typus arboris)
STR_TREES_RANDOM_TYPE :{BLACK}Arbor fortuita STR_TREES_RANDOM_TYPE :{BLACK}Arbor fortuita

@ -317,8 +317,15 @@ STR_SORT_BY_CARGO_CAPACITY :kravnesības
STR_SORT_BY_RANGE :apgabala STR_SORT_BY_RANGE :apgabala
STR_SORT_BY_POPULATION :iedzīvotāju skaita STR_SORT_BY_POPULATION :iedzīvotāju skaita
STR_SORT_BY_RATING :vērtējuma STR_SORT_BY_RATING :vērtējuma
STR_SORT_BY_NUM_VEHICLES :Autotransporta līdzekļu skaits
STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Kopējā peļņa pagājušajā gadā
STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :Kopējā peļņa šogad
STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Vidējā peļņa iepriekšējā gadā
STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Vidējā peļņa šajā gadā
# Group by options for vehicle list # Group by options for vehicle list
STR_GROUP_BY_NONE :Nav
STR_GROUP_BY_SHARED_ORDERS :Koplietojamie rīkojumi
# Tooltips for the main toolbar # Tooltips for the main toolbar
STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Pauzēt spēli STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Pauzēt spēli
@ -775,6 +782,7 @@ STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}Rādīt
STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Rādīt pēdējo ziņojumu vai avīzes rakstu STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Rādīt pēdējo ziņojumu vai avīzes rakstu
STR_STATUSBAR_COMPANY_NAME :{SILVER}- - {COMPANY} - - STR_STATUSBAR_COMPANY_NAME :{SILVER}- - {COMPANY} - -
STR_STATUSBAR_PAUSED :{YELLOW}* * PAUZE * * STR_STATUSBAR_PAUSED :{YELLOW}* * PAUZE * *
STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE} * * PAUZE (gaida saites diagrammas atjaunināšanu) * *
STR_STATUSBAR_AUTOSAVE :{RED}AUTOMĀTISKĀ SAGLABĀŠANA STR_STATUSBAR_AUTOSAVE :{RED}AUTOMĀTISKĀ SAGLABĀŠANA
STR_STATUSBAR_SAVING_GAME :{RED}* * SPĒLE TIEK SAGLABĀTA * * STR_STATUSBAR_SAVING_GAME :{RED}* * SPĒLE TIEK SAGLABĀTA * *
@ -1614,6 +1622,10 @@ STR_CONFIG_SETTING_TOWN_CARGOGENMODE_BITCOUNT :Lineārs
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :Koku izvietojums spēlē: {STRING} STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :Koku izvietojums spēlē: {STRING}
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :Vadīt nejaušu koku parādīšanos spēles laikā. Tas var ietekmēt no kokaudzēšanas atkarīgas ražotnes, piemēram kokzāģētavas STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :Vadīt nejaušu koku parādīšanos spēles laikā. Tas var ietekmēt no kokaudzēšanas atkarīgas ražotnes, piemēram kokzāģētavas
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_SPREAD :Augt, bet neizplatās {RED} (salauž kokzāģētavas)
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_RAINFOREST :Aug, bet izplatās tikai lietus mežos
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_ALL :Aug un izplatās visur
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_GROWTH_NO_SPREAD :Augt, bet neizplatās {RED} (salauž kokzāģētavas)
STR_CONFIG_SETTING_TOOLBAR_POS :Galvenās rīkjoslas novietojums: {STRING} STR_CONFIG_SETTING_TOOLBAR_POS :Galvenās rīkjoslas novietojums: {STRING}
STR_CONFIG_SETTING_TOOLBAR_POS_HELPTEXT :Galvenās rīkjoslas horizontālais novietojums ekrāna augšējā daļā STR_CONFIG_SETTING_TOOLBAR_POS_HELPTEXT :Galvenās rīkjoslas horizontālais novietojums ekrāna augšējā daļā
@ -1979,6 +1991,10 @@ STR_NETWORK_SERVER_LIST_JOIN_GAME :{BLACK}Pievieno
STR_NETWORK_SERVER_LIST_REFRESH :{BLACK}Atsvaidzināt serveri STR_NETWORK_SERVER_LIST_REFRESH :{BLACK}Atsvaidzināt serveri
STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}Atsvaidzināt servera informāciju STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}Atsvaidzināt servera informāciju
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET :Meklēt internetā
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET_TOOLTIP :{BLACK}Meklēt publiskos serverus internetā
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN :{BLACK}Meklēt LAN
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN_TOOLTIP :{BLACK}Meklēt serverus lokālajā tīklā
STR_NETWORK_SERVER_LIST_ADD_SERVER :{BLACK}Pievienot serveri STR_NETWORK_SERVER_LIST_ADD_SERVER :{BLACK}Pievienot serveri
STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Pievienot serveri sarakstam, kurš vienmēr tiks pārbaudīts vai tajā nav palaistas spēles STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Pievienot serveri sarakstam, kurš vienmēr tiks pārbaudīts vai tajā nav palaistas spēles
STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Palaist serveri STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Palaist serveri
@ -2204,11 +2220,13 @@ STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_1 :Spēle joprojā
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_2 :Spēle joprojām pauzēta ({STRING}, {STRING}) STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_2 :Spēle joprojām pauzēta ({STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_3 :Spēle joprojām pauzēta ({STRING}, {STRING}, {STRING}) STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_3 :Spēle joprojām pauzēta ({STRING}, {STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_4 :Spēle vēl aizvien ir pauzēta ({STRING}, {STRING}, {STRING}, {STRING}) STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_4 :Spēle vēl aizvien ir pauzēta ({STRING}, {STRING}, {STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_5 :Spēle joprojām pauzēta ({STRING}, {STRING}, {STRING}, {STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_UNPAUSED :Spēle atsākta ({STRING}) STR_NETWORK_SERVER_MESSAGE_GAME_UNPAUSED :Spēle atsākta ({STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_NOT_ENOUGH_PLAYERS :spēlētāju skaits STR_NETWORK_SERVER_MESSAGE_GAME_REASON_NOT_ENOUGH_PLAYERS :spēlētāju skaits
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_CONNECTING_CLIENTS :savieno spēlētājus STR_NETWORK_SERVER_MESSAGE_GAME_REASON_CONNECTING_CLIENTS :savieno spēlētājus
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_MANUAL :manuālā STR_NETWORK_SERVER_MESSAGE_GAME_REASON_MANUAL :manuālā
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_GAME_SCRIPT :spēles skripts STR_NETWORK_SERVER_MESSAGE_GAME_REASON_GAME_SCRIPT :spēles skripts
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :gaida uz saišu grafika atjaunošanu
############ End of leave-in-this-order ############ End of leave-in-this-order
STR_NETWORK_MESSAGE_CLIENT_LEAVING :aizeju STR_NETWORK_MESSAGE_CLIENT_LEAVING :aizeju
STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} ir pievienojies spēlei STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} ir pievienojies spēlei
@ -2525,7 +2543,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Izmērs:
STR_OBJECT_CLASS_LTHS :Bākas STR_OBJECT_CLASS_LTHS :Bākas
STR_OBJECT_CLASS_TRNS :Raidītāji STR_OBJECT_CLASS_TRNS :Raidītāji
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Koki STR_PLANT_TREE_CAPTION :{WHITE}Koki
STR_PLANT_TREE_TOOLTIP :{BLACK}Izvēlēties koka veidu stādīšanai. Ja lauciņš jau ir koks, tas pievienos vairāk jauktu veidu kokus neatkarīgi no izvēlētā veida STR_PLANT_TREE_TOOLTIP :{BLACK}Izvēlēties koka veidu stādīšanai. Ja lauciņš jau ir koks, tas pievienos vairāk jauktu veidu kokus neatkarīgi no izvēlētā veida
STR_TREES_RANDOM_TYPE :{BLACK}Nejauši izvēlēta veida koki STR_TREES_RANDOM_TYPE :{BLACK}Nejauši izvēlēta veida koki
@ -4250,6 +4268,7 @@ STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Spēle ir sagla
STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE :Failu nevar nolasīt STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE :Failu nevar nolasīt
STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE :Failā nevar ierakstīt STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE :Failā nevar ierakstīt
STR_GAME_SAVELOAD_ERROR_DATA_INTEGRITY_CHECK_FAILED :Datu integritātes pārbaude neizdevās STR_GAME_SAVELOAD_ERROR_DATA_INTEGRITY_CHECK_FAILED :Datu integritātes pārbaude neizdevās
STR_GAME_SAVELOAD_ERROR_PATCHPACK :Saglabāšana notiek ar modificētu versiju
STR_GAME_SAVELOAD_NOT_AVAILABLE :<nav pieejams> STR_GAME_SAVELOAD_NOT_AVAILABLE :<nav pieejams>
STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}Spēle tika saglabāta bez tramvaju atbalsta. Visi tramvaji tika aizvākti. STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}Spēle tika saglabāta bez tramvaju atbalsta. Visi tramvaji tika aizvākti.

@ -2680,7 +2680,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Dydis la
STR_OBJECT_CLASS_LTHS :Švyturiai STR_OBJECT_CLASS_LTHS :Švyturiai
STR_OBJECT_CLASS_TRNS :Siųstuvai STR_OBJECT_CLASS_TRNS :Siųstuvai
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Pasirinkite medžio rūšį STR_PLANT_TREE_CAPTION :{WHITE}Pasirinkite medžio rūšį
STR_PLANT_TREE_TOOLTIP :{BLACK}Pasirinkite norimų sodinti medžių tipą. Jei langelyje jau auga koks nors medis, bus pasodinti atsitiktiniai, nebūtinai pasirinktos rūšies, medžiai STR_PLANT_TREE_TOOLTIP :{BLACK}Pasirinkite norimų sodinti medžių tipą. Jei langelyje jau auga koks nors medis, bus pasodinti atsitiktiniai, nebūtinai pasirinktos rūšies, medžiai
STR_TREES_RANDOM_TYPE :{BLACK}Atsitiktiniai medžiai tempiant STR_TREES_RANDOM_TYPE :{BLACK}Atsitiktiniai medžiai tempiant

@ -2512,7 +2512,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Gréisst
STR_OBJECT_CLASS_LTHS :Liichttierm STR_OBJECT_CLASS_LTHS :Liichttierm
STR_OBJECT_CLASS_TRNS :Antennen STR_OBJECT_CLASS_TRNS :Antennen
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Beem STR_PLANT_TREE_CAPTION :{WHITE}Beem
STR_PLANT_TREE_TOOLTIP :{BLACK}Wielt de Baamtyp. Wann d'Feld schons e Baam huet, ginn méi Beem vu verschiddenen Arten gesat STR_PLANT_TREE_TOOLTIP :{BLACK}Wielt de Baamtyp. Wann d'Feld schons e Baam huet, ginn méi Beem vu verschiddenen Arten gesat
STR_TREES_RANDOM_TYPE :{BLACK}Zoufälleg Beem STR_TREES_RANDOM_TYPE :{BLACK}Zoufälleg Beem

@ -2201,7 +2201,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Saiz: {G
STR_OBJECT_CLASS_LTHS :Rumah Api STR_OBJECT_CLASS_LTHS :Rumah Api
STR_OBJECT_CLASS_TRNS :Pemancar STR_OBJECT_CLASS_TRNS :Pemancar
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Pokok-pokok STR_PLANT_TREE_CAPTION :{WHITE}Pokok-pokok
STR_PLANT_TREE_TOOLTIP :{BLACK}Pilih jenis pokok untuk ditanam STR_PLANT_TREE_TOOLTIP :{BLACK}Pilih jenis pokok untuk ditanam
STR_TREES_RANDOM_TYPE :{BLACK}Jenis pokok yang rawak STR_TREES_RANDOM_TYPE :{BLACK}Jenis pokok yang rawak

@ -2514,7 +2514,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Størrel
STR_OBJECT_CLASS_LTHS :Fyrtårn STR_OBJECT_CLASS_LTHS :Fyrtårn
STR_OBJECT_CLASS_TRNS :Radiosendere STR_OBJECT_CLASS_TRNS :Radiosendere
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Trær STR_PLANT_TREE_CAPTION :{WHITE}Trær
STR_PLANT_TREE_TOOLTIP :{BLACK}Velg typen tre som skal plantes. Hvis feltet allerede har et tre, vil dette plante flere typer trær uavhengig av den valgte typen STR_PLANT_TREE_TOOLTIP :{BLACK}Velg typen tre som skal plantes. Hvis feltet allerede har et tre, vil dette plante flere typer trær uavhengig av den valgte typen
STR_TREES_RANDOM_TYPE :{BLACK}Trær av tilfeldig type STR_TREES_RANDOM_TYPE :{BLACK}Trær av tilfeldig type

@ -2374,7 +2374,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Storleik
STR_OBJECT_CLASS_LTHS :Fyrtårn STR_OBJECT_CLASS_LTHS :Fyrtårn
STR_OBJECT_CLASS_TRNS :Radiosendarar STR_OBJECT_CLASS_TRNS :Radiosendarar
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Tre STR_PLANT_TREE_CAPTION :{WHITE}Tre
STR_PLANT_TREE_TOOLTIP :{BLACK}Vel typen tre som skal plantast. Om ruta allereie har eit tre, vil dette leggje til fleire tre av ulike typar uavhengig av den valde typen STR_PLANT_TREE_TOOLTIP :{BLACK}Vel typen tre som skal plantast. Om ruta allereie har eit tre, vil dette leggje til fleire tre av ulike typar uavhengig av den valde typen
STR_TREES_RANDOM_TYPE :{BLACK}Tre av tilfeldig type STR_TREES_RANDOM_TYPE :{BLACK}Tre av tilfeldig type

@ -694,8 +694,15 @@ STR_SORT_BY_CARGO_CAPACITY :Ładowność
STR_SORT_BY_RANGE :Zasięg STR_SORT_BY_RANGE :Zasięg
STR_SORT_BY_POPULATION :Liczba mieszkańców STR_SORT_BY_POPULATION :Liczba mieszkańców
STR_SORT_BY_RATING :Ocena STR_SORT_BY_RATING :Ocena
STR_SORT_BY_NUM_VEHICLES :Ilość pojazdów
STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Całkowity zysk w zeszłym roku
STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :Całkowity zysk w obecnym roku
STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Średni zysk w zeszłym roku
STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Średni zysk w obecnym roku
# Group by options for vehicle list # Group by options for vehicle list
STR_GROUP_BY_NONE :Brak
STR_GROUP_BY_SHARED_ORDERS :Polecenia współdzielone
# Tooltips for the main toolbar # Tooltips for the main toolbar
STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Pauza STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Pauza
@ -1153,6 +1160,7 @@ STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}Wyświet
STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Pokaż ostatnią wiadomość lub ogłoszenie STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Pokaż ostatnią wiadomość lub ogłoszenie
STR_STATUSBAR_COMPANY_NAME :{SILVER}- - {COMPANY} - - STR_STATUSBAR_COMPANY_NAME :{SILVER}- - {COMPANY} - -
STR_STATUSBAR_PAUSED :{YELLOW}* * PAUZA * * STR_STATUSBAR_PAUSED :{YELLOW}* * PAUZA * *
STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * PAUZA (oczekiwanie na aktualizację wykresów) * *
STR_STATUSBAR_AUTOSAVE :{RED}AUTOZAPIS STR_STATUSBAR_AUTOSAVE :{RED}AUTOZAPIS
STR_STATUSBAR_SAVING_GAME :{RED}* * ZAPISYWANIE GRY * * STR_STATUSBAR_SAVING_GAME :{RED}* * ZAPISYWANIE GRY * *
@ -1992,6 +2000,10 @@ STR_CONFIG_SETTING_TOWN_CARGOGENMODE_BITCOUNT :Liniowy
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :Rozmieszczenie drzew w grze: {STRING} STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :Rozmieszczenie drzew w grze: {STRING}
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :Losowe pojawianie się drzew podczas gry. Może mieć to wpływ na zakłady opierające się na wyrastaniu drzew, np. tartaki STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :Losowe pojawianie się drzew podczas gry. Może mieć to wpływ na zakłady opierające się na wyrastaniu drzew, np. tartaki
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_SPREAD :Rosną, ale nie rozprzestrzeniają się {RED}(Klimat tropikalny: Tartaki nie działają)
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_RAINFOREST :Rosną, ale rozprzestrzeniają się tylko w lasach deszczowych
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_ALL :Rosną i rozprzestrzeniają się wszędzie
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_GROWTH_NO_SPREAD :Nie rosną, nie rozprzestrzeniają się {RED}(Klimat tropikalny: Tartaki nie działają)
STR_CONFIG_SETTING_TOOLBAR_POS :Pozycja głównego paska narzędzi: {STRING} STR_CONFIG_SETTING_TOOLBAR_POS :Pozycja głównego paska narzędzi: {STRING}
STR_CONFIG_SETTING_TOOLBAR_POS_HELPTEXT :Pozioma pozycja głównego paska narzędzi na górze ekranu STR_CONFIG_SETTING_TOOLBAR_POS_HELPTEXT :Pozioma pozycja głównego paska narzędzi na górze ekranu
@ -2237,8 +2249,8 @@ STR_LIVERY_DIESEL :Lokomotywa spal
STR_LIVERY_ELECTRIC :Lokomotywa elektryczna STR_LIVERY_ELECTRIC :Lokomotywa elektryczna
STR_LIVERY_MONORAIL :Lokomotywa jednoszynowa STR_LIVERY_MONORAIL :Lokomotywa jednoszynowa
STR_LIVERY_MAGLEV :Lokomotywa Maglev STR_LIVERY_MAGLEV :Lokomotywa Maglev
STR_LIVERY_DMU :DMU STR_LIVERY_DMU :SZT
STR_LIVERY_EMU :EMU STR_LIVERY_EMU :EZT
STR_LIVERY_PASSENGER_WAGON_STEAM :Wagon pasażerski (parowóz) STR_LIVERY_PASSENGER_WAGON_STEAM :Wagon pasażerski (parowóz)
STR_LIVERY_PASSENGER_WAGON_DIESEL :Wagon pasażerski (spalinowy) STR_LIVERY_PASSENGER_WAGON_DIESEL :Wagon pasażerski (spalinowy)
STR_LIVERY_PASSENGER_WAGON_ELECTRIC :Wagon pasażerski (elektryczny) STR_LIVERY_PASSENGER_WAGON_ELECTRIC :Wagon pasażerski (elektryczny)
@ -2355,6 +2367,10 @@ STR_NETWORK_SERVER_LIST_JOIN_GAME :{BLACK}Przyłą
STR_NETWORK_SERVER_LIST_REFRESH :{BLACK}Odśwież serwer STR_NETWORK_SERVER_LIST_REFRESH :{BLACK}Odśwież serwer
STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}Odśwież informacje o serwerze STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}Odśwież informacje o serwerze
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET :Przeszukaj internet
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET_TOOLTIP :{BLACK}Znajdź w internecie serwery publiczne
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN :Przeszukaj LAN
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN_TOOLTIP :Znajdź serwery w sieci lokalnej
STR_NETWORK_SERVER_LIST_ADD_SERVER :{BLACK}Dodaj serwer STR_NETWORK_SERVER_LIST_ADD_SERVER :{BLACK}Dodaj serwer
STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Dodaj serwer do listy, która będzie przeszukiwana w poszukiwaniu uruchomionych gier STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Dodaj serwer do listy, która będzie przeszukiwana w poszukiwaniu uruchomionych gier
STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Uruchom serwer STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Uruchom serwer
@ -2580,11 +2596,13 @@ STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_1 :Gra nadal wstrz
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_2 :Gra nadal wstrzymana ({STRING}, {STRING}) STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_2 :Gra nadal wstrzymana ({STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_3 :Gra nadal wstrzymana ({STRING}, {STRING}, {STRING}) STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_3 :Gra nadal wstrzymana ({STRING}, {STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_4 :Gra wciąż wstrzymana ({STRING}, {STRING}, {STRING}, {STRING}) STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_4 :Gra wciąż wstrzymana ({STRING}, {STRING}, {STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_5 :Gra wciąż wstrzymana ({STRING}, {STRING}, {STRING}, {STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_UNPAUSED :Gra wznowiona ({STRING}) STR_NETWORK_SERVER_MESSAGE_GAME_UNPAUSED :Gra wznowiona ({STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_NOT_ENOUGH_PLAYERS :ilość graczy STR_NETWORK_SERVER_MESSAGE_GAME_REASON_NOT_ENOUGH_PLAYERS :ilość graczy
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_CONNECTING_CLIENTS :łączenie klientów STR_NETWORK_SERVER_MESSAGE_GAME_REASON_CONNECTING_CLIENTS :łączenie klientów
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_MANUAL :ręczny STR_NETWORK_SERVER_MESSAGE_GAME_REASON_MANUAL :ręczny
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_GAME_SCRIPT :skrypt gry STR_NETWORK_SERVER_MESSAGE_GAME_REASON_GAME_SCRIPT :skrypt gry
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :oczekiwanie na aktualizację wykresów
############ End of leave-in-this-order ############ End of leave-in-this-order
STR_NETWORK_MESSAGE_CLIENT_LEAVING :opuszczanie STR_NETWORK_MESSAGE_CLIENT_LEAVING :opuszczanie
STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} dołączył do gry. STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} dołączył do gry.
@ -2901,13 +2919,19 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Rozmiar:
STR_OBJECT_CLASS_LTHS :Latarnie morskie STR_OBJECT_CLASS_LTHS :Latarnie morskie
STR_OBJECT_CLASS_TRNS :Nadajniki STR_OBJECT_CLASS_TRNS :Nadajniki
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Drzewa STR_PLANT_TREE_CAPTION :{WHITE}Drzewa
STR_PLANT_TREE_TOOLTIP :{BLACK}Wybierz typ drzew do sadzenia. Jeśli na wybranym miejscu są już drzewa, to dodasz więcej drzew różnego typu, bez względu na wybraną opcję. STR_PLANT_TREE_TOOLTIP :{BLACK}Wybierz typ drzew do sadzenia. Jeśli na wybranym miejscu są już drzewa, to dodasz więcej drzew różnego typu, bez względu na wybraną opcję.
STR_TREES_RANDOM_TYPE :{BLACK}Drzewa różnych rodzajów STR_TREES_RANDOM_TYPE :{BLACK}Drzewa różnych rodzajów
STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Sadzenie drzew różnych rodzajów. Shift przełącza pomiędzy trybem sadzenia a szacowaniem jego kosztów STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Sadzenie drzew różnych rodzajów. Shift przełącza pomiędzy trybem sadzenia a szacowaniem jego kosztów
STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Losowe drzewa STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Losowe drzewa
STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Pokryj losowo krajobraz drzewami STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Pokryj losowo krajobraz drzewami
STR_TREES_MODE_NORMAL_BUTTON :{BLACK}Normalny
STR_TREES_MODE_NORMAL_TOOLTIP :Sadź pojedyncze drzewa, przeciągając nad terenem.
STR_TREES_MODE_FOREST_SM_BUTTON :Zagajnik
STR_TREES_MODE_FOREST_SM_TOOLTIP :Sadź niewielkie lasy, przeciągając nad terenem.
STR_TREES_MODE_FOREST_LG_BUTTON :Las
STR_TREES_MODE_FOREST_LG_TOOLTIP :Sadź duże lasy, przeciągając nad terenem.
# Land generation window (SE) # Land generation window (SE)
STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}Tworzenie terenu STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}Tworzenie terenu
@ -4625,6 +4649,7 @@ STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Zapisana gra zr
STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE :Plik nie jest odczytywalny STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE :Plik nie jest odczytywalny
STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE :Plik nie jest zapisywalny STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE :Plik nie jest zapisywalny
STR_GAME_SAVELOAD_ERROR_DATA_INTEGRITY_CHECK_FAILED :Sprawdzenie integralności danych nie powiodło się STR_GAME_SAVELOAD_ERROR_DATA_INTEGRITY_CHECK_FAILED :Sprawdzenie integralności danych nie powiodło się
STR_GAME_SAVELOAD_ERROR_PATCHPACK :Zapis jest stworzony w zmodyfikowanej wersji gry
STR_GAME_SAVELOAD_NOT_AVAILABLE :<not available> STR_GAME_SAVELOAD_NOT_AVAILABLE :<not available>
STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}Gra została zapisana w wersji nie obsługującej tramwajów. Wszystkie tramwaje zostały usunięte STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}Gra została zapisana w wersji nie obsługującej tramwajów. Wszystkie tramwaje zostały usunięte

@ -2499,7 +2499,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Tamanho:
STR_OBJECT_CLASS_LTHS :Faróis STR_OBJECT_CLASS_LTHS :Faróis
STR_OBJECT_CLASS_TRNS :Transmissores STR_OBJECT_CLASS_TRNS :Transmissores
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Árvores STR_PLANT_TREE_CAPTION :{WHITE}Árvores
STR_PLANT_TREE_TOOLTIP :{BLACK}Escolha um tipo de árvore para plantar. Se o quadrado já tiver uma árvore, serão adicionadas mais árvores de difrentes tipos independentemente do tipo selecionado STR_PLANT_TREE_TOOLTIP :{BLACK}Escolha um tipo de árvore para plantar. Se o quadrado já tiver uma árvore, serão adicionadas mais árvores de difrentes tipos independentemente do tipo selecionado
STR_TREES_RANDOM_TYPE :{BLACK}Árvores de tipo aleatório STR_TREES_RANDOM_TYPE :{BLACK}Árvores de tipo aleatório

@ -2443,7 +2443,7 @@ STR_OBJECT_BUILD_SIZE :{BLACK}Dimensiu
STR_OBJECT_CLASS_LTHS :Faruri STR_OBJECT_CLASS_LTHS :Faruri
STR_OBJECT_CLASS_TRNS :Transmiţătoare STR_OBJECT_CLASS_TRNS :Transmiţătoare
# Tree planting window (last two for SE only) # Tree planting window (last eight for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Arbori STR_PLANT_TREE_CAPTION :{WHITE}Arbori
STR_PLANT_TREE_TOOLTIP :{BLACK}Alege specia de arbori de plantat. Dacă există deja un arbore în locația dorită, se vor adăuga arbori de tip mixt, indiferent de specia selectată STR_PLANT_TREE_TOOLTIP :{BLACK}Alege specia de arbori de plantat. Dacă există deja un arbore în locația dorită, se vor adăuga arbori de tip mixt, indiferent de specia selectată
STR_TREES_RANDOM_TYPE :{BLACK}Arbori din specii aleatoare STR_TREES_RANDOM_TYPE :{BLACK}Arbori din specii aleatoare

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save