diff --git a/cmake/InstallAndPackage.cmake b/cmake/InstallAndPackage.cmake index 0ded934329..5728b0c062 100644 --- a/cmake/InstallAndPackage.cmake +++ b/cmake/InstallAndPackage.cmake @@ -172,6 +172,10 @@ elseif(UNIX) set(CPACK_GENERATOR "DEB") include(PackageDeb) + elseif(LSB_RELEASE_ID STREQUAL "Fedora") + set(PLATFORM "fedora") + set(CPACK_GENERATOR "RPM") + include(PackageRPM) else() set(UNSUPPORTED_PLATFORM_NAME "LSB-based Linux distribution '${LSB_RELEASE_ID}'") endif() diff --git a/cmake/scripts/SquirrelExport.cmake b/cmake/scripts/SquirrelExport.cmake index c1305066ab..e5d83714b9 100644 --- a/cmake/scripts/SquirrelExport.cmake +++ b/cmake/scripts/SquirrelExport.cmake @@ -298,7 +298,7 @@ foreach(LINE IN LISTS SOURCE_LINES) string(APPEND SQUIRREL_EXPORT "\n /* Allow enums to be used as Squirrel parameters */") foreach(ENUM IN LISTS ENUMS) string(APPEND SQUIRREL_EXPORT "\n template <> inline ${ENUM} GetParam(ForceType<${ENUM}>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (${ENUM})tmp; }") - string(APPEND SQUIRREL_EXPORT "\n template <> inline int Return<${ENUM}>(HSQUIRRELVM vm, ${ENUM} res) { sq_pushinteger(vm, (int32)res); return 1; }") + string(APPEND SQUIRREL_EXPORT "\n template <> inline int Return<${ENUM}>(HSQUIRRELVM vm, ${ENUM} res) { sq_pushinteger(vm, res); return 1; }") endforeach() endif() diff --git a/regression/regression/result.txt b/regression/regression/result.txt index 7ce9550599..13a770a8aa 100644 --- a/regression/regression/result.txt +++ b/regression/regression/result.txt @@ -88,9 +88,9 @@ abs( 21): 21 --AIBase-- - Rand(): -2062310602 - Rand(): -1780331126 - Rand(): -397928569 + Rand(): 2232656694 + Rand(): 2514636170 + Rand(): 3897038727 RandRange(0): 0 RandRange(0): 0 RandRange(0): 0 @@ -421,36 +421,36 @@ 1099 => 46158 Randomize ListDump: 1 => 688298322 - 2 => -1709546982 + 2 => 2585420314 1000 => 1701392078 - 1001 => -1630848421 - 1002 => -886500935 - 1003 => -196324972 - 1004 => -436037402 - 1005 => -520341784 - 1006 => -1485224804 - 1007 => -311036236 - 1008 => -1503442439 - 1009 => -110945695 - 1010 => -82825175 + 1001 => 2664118875 + 1002 => 3408466361 + 1003 => 4098642324 + 1004 => 3858929894 + 1005 => 3774625512 + 1006 => 2809742492 + 1007 => 3983931060 + 1008 => 2791524857 + 1009 => 4184021601 + 1010 => 4212142121 1011 => 46859773 - 1012 => -1199223018 - 1013 => -1190555925 + 1012 => 3095744278 + 1013 => 3104411371 1014 => 326384434 1015 => 1486817960 - 1016 => -1411425597 - 1017 => -508426854 + 1016 => 2883541699 + 1017 => 3786540442 1018 => 820019294 1019 => 710762995 - 1020 => -760867032 - 1021 => -709611146 + 1020 => 3534100264 + 1021 => 3585356150 1022 => 732190215 1023 => 236336673 1024 => 740596257 1025 => 1135321785 1026 => 2067474156 - 1027 => -1395683607 - 1028 => -240528699 + 1027 => 2899283689 + 1028 => 4054438597 1029 => 928616892 1030 => 1712486685 1031 => 1994118287 @@ -462,46 +462,46 @@ 1037 => 1359697121 1038 => 1888433963 1039 => 941623020 - 1040 => -1925663292 - 1041 => -771540264 - 1042 => -1058341359 + 1040 => 2369304004 + 1041 => 3523427032 + 1042 => 3236625937 1043 => 182127597 1044 => 646955927 - 1045 => -1424621714 + 1045 => 2870345582 1046 => 623062612 - 1047 => -1986955586 - 1048 => -1268826980 - 1049 => -456776220 - 1051 => -1112555329 - 1052 => -1532134052 + 1047 => 2308011710 + 1048 => 3026140316 + 1049 => 3838191076 + 1051 => 3182411967 + 1052 => 2762833244 1053 => 1960404034 1054 => 1573325453 - 1055 => -316619303 + 1055 => 3978347993 1056 => 699712177 1057 => 863274966 1058 => 1728276475 - 1059 => -246695889 + 1059 => 4048271407 1060 => 1919485436 1061 => 111273464 1062 => 125435213 1063 => 155132602 - 1064 => -171674076 + 1064 => 4123293220 1065 => 655046914 1066 => 1577399562 1067 => 1028818150 1068 => 447058239 - 1069 => -1057920269 - 1070 => -1326215323 - 1071 => -198688588 + 1069 => 3237047027 + 1070 => 2968751973 + 1071 => 4096278708 1072 => 1523643051 1073 => 231373233 1074 => 1121759962 1075 => 1449439846 - 1076 => -1615270753 - 1077 => -1509293864 + 1076 => 2679696543 + 1077 => 2785673432 1078 => 2116903943 1079 => 672822173 - 1080 => -969573911 + 1080 => 3325393385 1081 => 1589904755 1082 => 1148782015 1083 => 663503316 @@ -510,54 +510,54 @@ 1086 => 402172048 1087 => 1812250453 1088 => 667300501 - 1089 => -1838825777 - 1090 => -856474776 + 1089 => 2456141519 + 1090 => 3438492520 1091 => 420696035 1092 => 2131427774 - 1093 => -435303548 - 1094 => -160883878 + 1093 => 3859663748 + 1094 => 4134083418 1095 => 1969629634 - 1096 => -555794155 - 1097 => -835119691 - 1098 => -1460907909 - 1099 => -1146924084 + 1096 => 3739173141 + 1097 => 3459847605 + 1098 => 2834059387 + 1099 => 3148043212 KeepTop(10): 1 => 688298322 - 2 => -1709546982 + 2 => 2585420314 1000 => 1701392078 - 1001 => -1630848421 - 1002 => -886500935 - 1003 => -196324972 - 1004 => -436037402 - 1005 => -520341784 - 1006 => -1485224804 - 1007 => -311036236 + 1001 => 2664118875 + 1002 => 3408466361 + 1003 => 4098642324 + 1004 => 3858929894 + 1005 => 3774625512 + 1006 => 2809742492 + 1007 => 3983931060 KeepBottom(8): 1000 => 1701392078 - 1001 => -1630848421 - 1002 => -886500935 - 1003 => -196324972 - 1004 => -436037402 - 1005 => -520341784 - 1006 => -1485224804 - 1007 => -311036236 + 1001 => 2664118875 + 1002 => 3408466361 + 1003 => 4098642324 + 1004 => 3858929894 + 1005 => 3774625512 + 1006 => 2809742492 + 1007 => 3983931060 RemoveBottom(2): 1000 => 1701392078 - 1001 => -1630848421 - 1002 => -886500935 - 1003 => -196324972 - 1004 => -436037402 - 1005 => -520341784 + 1001 => 2664118875 + 1002 => 3408466361 + 1003 => 4098642324 + 1004 => 3858929894 + 1005 => 3774625512 RemoveTop(2): - 1002 => -886500935 - 1003 => -196324972 - 1004 => -436037402 - 1005 => -520341784 + 1002 => 3408466361 + 1003 => 4098642324 + 1004 => 3858929894 + 1005 => 3774625512 RemoveList({1003, 1004}): - 1002 => -886500935 - 1005 => -520341784 + 1002 => 3408466361 + 1005 => 3774625512 KeepList({1003, 1004, 1005}): - 1005 => -520341784 + 1005 => 3774625512 AddList({1005, 4000, 4001, 4002}): 1005 => 1005 4000 => 8000 diff --git a/src/ai/ai.hpp b/src/ai/ai.hpp index 1e2e99d22f..e090303bd9 100644 --- a/src/ai/ai.hpp +++ b/src/ai/ai.hpp @@ -13,10 +13,6 @@ #include "../script/api/script_event_types.hpp" #include "../core/string_compare_type.hpp" #include "ai_scanner.hpp" -#include - -/** A list that maps AI names to their AIInfo object. */ -typedef std::map ScriptInfoList; /** * Main AI class. Contains all functions needed to start, stop, save and load AIs. diff --git a/src/ai/ai_core.cpp b/src/ai/ai_core.cpp index 8da58692f2..d8030a7b1e 100644 --- a/src/ai/ai_core.cpp +++ b/src/ai/ai_core.cpp @@ -64,7 +64,7 @@ cur_company.Restore(); - InvalidateWindowData(WC_AI_DEBUG, 0, -1); + InvalidateWindowData(WC_SCRIPT_DEBUG, 0, -1); return; } @@ -116,8 +116,8 @@ cur_company.Restore(); - InvalidateWindowData(WC_AI_DEBUG, 0, -1); - DeleteWindowById(WC_AI_SETTINGS, company); + InvalidateWindowData(WC_SCRIPT_DEBUG, 0, -1); + DeleteWindowById(WC_SCRIPT_SETTINGS, company); } /* static */ void AI::Pause(CompanyID company) @@ -336,9 +336,9 @@ AI::scanner_library->RescanDir(); ResetConfig(); - InvalidateWindowData(WC_AI_LIST, 0, 1); - SetWindowClassesDirty(WC_AI_DEBUG); - InvalidateWindowClassesData(WC_AI_SETTINGS); + InvalidateWindowData(WC_SCRIPT_LIST, 0, 1); + SetWindowClassesDirty(WC_SCRIPT_DEBUG); + InvalidateWindowClassesData(WC_SCRIPT_SETTINGS); } /** diff --git a/src/ai/ai_gui.cpp b/src/ai/ai_gui.cpp index 513a597aab..e82617ab5d 100644 --- a/src/ai/ai_gui.cpp +++ b/src/ai/ai_gui.cpp @@ -8,671 +8,23 @@ /** @file ai_gui.cpp %Window for configuring the AIs */ #include "../stdafx.h" -#include "../table/sprites.h" #include "../error.h" -#include "../settings_gui.h" -#include "../querystring_gui.h" -#include "../stringfilter_type.h" #include "../company_base.h" -#include "../company_gui.h" -#include "../strings_func.h" #include "../window_func.h" -#include "../gfx_func.h" -#include "../command_func.h" #include "../network/network.h" #include "../settings_func.h" #include "../network/network_content.h" -#include "../textfile_gui.h" -#include "../widgets/dropdown_type.h" -#include "../widgets/dropdown_func.h" -#include "../hotkeys.h" #include "../core/geometry_func.hpp" -#include "../guitimer_func.h" #include "ai.hpp" #include "ai_gui.hpp" -#include "../script/api/script_log.hpp" #include "ai_config.hpp" #include "ai_info.hpp" -#include "ai_instance.hpp" -#include "../game/game.hpp" -#include "../game/game_config.hpp" -#include "../game/game_info.hpp" -#include "../game/game_instance.hpp" - +#include "../script/script_gui.h" #include "table/strings.h" -#include - #include "../safeguards.h" -static ScriptConfig *GetConfig(CompanyID slot) -{ - if (slot == OWNER_DEITY) return GameConfig::GetConfig(); - return AIConfig::GetConfig(slot); -} - -/** - * Window that let you choose an available AI. - */ -struct AIListWindow : public Window { - const ScriptInfoList *info_list; ///< The list of Scripts. - int selected; ///< The currently selected Script. - CompanyID slot; ///< The company we're selecting a new Script for. - int line_height; ///< Height of a row in the matrix widget. - Scrollbar *vscroll; ///< Cache of the vertical scrollbar. - - /** - * Constructor for the window. - * @param desc The description of the window. - * @param slot The company we're changing the AI for. - */ - AIListWindow(WindowDesc *desc, CompanyID slot) : Window(desc), - slot(slot) - { - if (slot == OWNER_DEITY) { - this->info_list = Game::GetUniqueInfoList(); - } else { - this->info_list = AI::GetUniqueInfoList(); - } - - this->CreateNestedTree(); - this->vscroll = this->GetScrollbar(WID_AIL_SCROLLBAR); - this->FinishInitNested(); // Initializes 'this->line_height' as side effect. - - this->vscroll->SetCount((int)this->info_list->size() + 1); - - /* Try if we can find the currently selected AI */ - this->selected = -1; - if (GetConfig(slot)->HasScript()) { - ScriptInfo *info = GetConfig(slot)->GetInfo(); - int i = 0; - for (const auto &item : *this->info_list) { - if (item.second == info) { - this->selected = i; - break; - } - - i++; - } - } - } - - void SetStringParameters(int widget) const override - { - switch (widget) { - case WID_AIL_CAPTION: - SetDParam(0, (this->slot == OWNER_DEITY) ? STR_AI_LIST_CAPTION_GAMESCRIPT : STR_AI_LIST_CAPTION_AI); - break; - } - } - - void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override - { - if (widget == WID_AIL_LIST) { - this->line_height = FONT_HEIGHT_NORMAL + padding.height; - - resize->width = 1; - resize->height = this->line_height; - size->height = 5 * this->line_height; - } - } - - void DrawWidget(const Rect &r, int widget) const override - { - switch (widget) { - case WID_AIL_LIST: { - /* Draw a list of all available AIs. */ - Rect tr = r.Shrink(WidgetDimensions::scaled.matrix); - /* First AI in the list is hardcoded to random */ - if (this->vscroll->IsVisible(0)) { - DrawString(tr, this->slot == OWNER_DEITY ? STR_AI_CONFIG_NONE : STR_AI_CONFIG_RANDOM_AI, this->selected == -1 ? TC_WHITE : TC_ORANGE); - tr.top += this->line_height; - } - int i = 0; - for (const auto &item : *this->info_list) { - i++; - if (this->vscroll->IsVisible(i)) { - DrawString(tr, item.second->GetName(), (this->selected == i - 1) ? TC_WHITE : TC_ORANGE); - tr.top += this->line_height; - } - } - break; - } - case WID_AIL_INFO_BG: { - ScriptInfo *selected_info = nullptr; - int i = 0; - for (const auto &item : *this->info_list) { - i++; - if (this->selected == i - 1) selected_info = static_cast(item.second); - } - /* Some info about the currently selected AI. */ - if (selected_info != nullptr) { - Rect tr = r.Shrink(WidgetDimensions::scaled.frametext, WidgetDimensions::scaled.framerect); - SetDParamStr(0, selected_info->GetAuthor()); - DrawString(tr, STR_AI_LIST_AUTHOR); - tr.top += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; - SetDParam(0, selected_info->GetVersion()); - DrawString(tr, STR_AI_LIST_VERSION); - tr.top += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; - if (selected_info->GetURL() != nullptr) { - SetDParamStr(0, selected_info->GetURL()); - DrawString(tr, STR_AI_LIST_URL); - tr.top += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; - } - SetDParamStr(0, selected_info->GetDescription()); - DrawStringMultiLine(tr, STR_JUST_RAW_STRING, TC_WHITE); - } - break; - } - } - } - - /** - * Changes the AI of the current slot. - */ - void ChangeAI() - { - if (_game_mode == GM_NORMAL && slot == OWNER_DEITY) Game::Uninitialize(false); - if (this->selected == -1) { - GetConfig(slot)->Change(nullptr); - } else { - ScriptInfoList::const_iterator it = this->info_list->begin(); - for (int i = 0; i < this->selected; i++) it++; - GetConfig(slot)->Change((*it).second->GetName(), (*it).second->GetVersion()); - if (_game_mode == GM_NORMAL && slot == OWNER_DEITY) Game::StartNew(); - } - InvalidateWindowData(WC_GAME_OPTIONS, slot == OWNER_DEITY ? WN_GAME_OPTIONS_GS : WN_GAME_OPTIONS_AI); - InvalidateWindowClassesData(WC_AI_SETTINGS); - DeleteWindowByClass(WC_QUERY_STRING); - InvalidateWindowClassesData(WC_TEXTFILE); - if (_game_mode == GM_NORMAL && slot == OWNER_DEITY) { - InvalidateWindowData(WC_AI_DEBUG, 0, -1); - SetWindowClassesDirty(WC_AI_DEBUG); - } - } - - void OnClick(Point pt, int widget, int click_count) override - { - switch (widget) { - case WID_AIL_LIST: { // Select one of the AIs - int sel = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_AIL_LIST) - 1; - if (sel < (int)this->info_list->size()) { - this->selected = sel; - this->SetDirty(); - if (click_count > 1) { - this->ChangeAI(); - delete this; - } - } - break; - } - - case WID_AIL_ACCEPT: { - this->ChangeAI(); - delete this; - break; - } - - case WID_AIL_CANCEL: - delete this; - break; - } - } - - void OnResize() override - { - this->vscroll->SetCapacityFromWidget(this, WID_AIL_LIST); - } - - /** - * Some data on this window has become invalid. - * @param data Information about the changed data. - * @param gui_scope Whether the call is done from GUI scope. You may not do everything when not in GUI scope. See #InvalidateWindowData() for details. - */ - void OnInvalidateData(int data = 0, bool gui_scope = true) override - { - if (_game_mode == GM_NORMAL && Company::IsValidID(this->slot)) { - delete this; - return; - } - - if (!gui_scope) return; - - this->vscroll->SetCount((int)this->info_list->size() + 1); - - /* selected goes from -1 .. length of ai list - 1. */ - this->selected = std::min(this->selected, this->vscroll->GetCount() - 2); - } -}; - -/** Widgets for the AI list window. */ -static const NWidgetPart _nested_ai_list_widgets[] = { - NWidget(NWID_HORIZONTAL), - NWidget(WWT_CLOSEBOX, COLOUR_MAUVE), - NWidget(WWT_CAPTION, COLOUR_MAUVE, WID_AIL_CAPTION), SetDataTip(STR_AI_LIST_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), - NWidget(WWT_DEFSIZEBOX, COLOUR_MAUVE), - EndContainer(), - NWidget(NWID_HORIZONTAL), - NWidget(WWT_MATRIX, COLOUR_MAUVE, WID_AIL_LIST), SetMinimalSize(188, 112), SetFill(1, 1), SetResize(1, 1), SetMatrixDataTip(1, 0, STR_AI_LIST_TOOLTIP), SetScrollbar(WID_AIL_SCROLLBAR), - NWidget(NWID_VSCROLLBAR, COLOUR_MAUVE, WID_AIL_SCROLLBAR), - EndContainer(), - NWidget(WWT_PANEL, COLOUR_MAUVE, WID_AIL_INFO_BG), SetMinimalTextLines(8, WidgetDimensions::unscaled.framerect.Vertical() + WidgetDimensions::unscaled.vsep_normal * 3), SetResize(1, 0), - EndContainer(), - NWidget(NWID_HORIZONTAL), - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), - NWidget(WWT_PUSHTXTBTN, COLOUR_MAUVE, WID_AIL_ACCEPT), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_AI_LIST_ACCEPT, STR_AI_LIST_ACCEPT_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_MAUVE, WID_AIL_CANCEL), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_AI_LIST_CANCEL, STR_AI_LIST_CANCEL_TOOLTIP), - EndContainer(), - NWidget(WWT_RESIZEBOX, COLOUR_MAUVE), - EndContainer(), -}; - -/** Window definition for the ai list window. */ -static WindowDesc _ai_list_desc( - WDP_CENTER, "settings_script_list", 200, 234, - WC_AI_LIST, WC_NONE, - 0, - _nested_ai_list_widgets, lengthof(_nested_ai_list_widgets) -); - -/** - * Open the AI list window to chose an AI for the given company slot. - * @param slot The slot to change the AI of. - */ -void ShowAIListWindow(CompanyID slot) -{ - DeleteWindowByClass(WC_AI_LIST); - new AIListWindow(&_ai_list_desc, slot); -} - -/** - * Window for settings the parameters of an AI. - */ -struct AISettingsWindow : public Window { - CompanyID slot; ///< The currently show company's setting. - ScriptConfig *ai_config; ///< The configuration we're modifying. - int clicked_button; ///< The button we clicked. - bool clicked_increase; ///< Whether we clicked the increase or decrease button. - bool clicked_dropdown; ///< Whether the dropdown is open. - bool closing_dropdown; ///< True, if the dropdown list is currently closing. - GUITimer timeout; ///< Timeout for unclicking the button. - int clicked_row; ///< The clicked row of settings. - int line_height; ///< Height of a row in the matrix widget. - Scrollbar *vscroll; ///< Cache of the vertical scrollbar. - typedef std::vector VisibleSettingsList; ///< typdef for a vector of script settings - VisibleSettingsList visible_settings; ///< List of visible AI settings - - /** - * Constructor for the window. - * @param desc The description of the window. - * @param slot The company we're changing the settings for. - */ - AISettingsWindow(WindowDesc *desc, CompanyID slot) : Window(desc), - slot(slot), - clicked_button(-1), - clicked_dropdown(false), - closing_dropdown(false), - timeout(0) - { - this->ai_config = GetConfig(slot); - - this->CreateNestedTree(); - this->vscroll = this->GetScrollbar(WID_AIS_SCROLLBAR); - this->FinishInitNested(slot); // Initializes 'this->line_height' as side effect. - - this->RebuildVisibleSettings(); - } - - /** - * Rebuilds the list of visible settings. AI settings with the flag - * AICONFIG_AI_DEVELOPER set will only be visible if the game setting - * gui.ai_developer_tools is enabled. - */ - void RebuildVisibleSettings() - { - visible_settings.clear(); - - for (const auto &item : *this->ai_config->GetConfigList()) { - bool no_hide = (item.flags & SCRIPTCONFIG_DEVELOPER) == 0; - if (no_hide || _settings_client.gui.ai_developer_tools) { - visible_settings.push_back(&item); - } - } - - this->vscroll->SetCount((int)this->visible_settings.size()); - } - - void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override - { - if (widget == WID_AIS_BACKGROUND) { - this->line_height = std::max(SETTING_BUTTON_HEIGHT, FONT_HEIGHT_NORMAL) + padding.height; - - resize->width = 1; - resize->height = this->line_height; - size->height = 5 * this->line_height; - } - } - - void DrawWidget(const Rect &r, int widget) const override - { - if (widget != WID_AIS_BACKGROUND) return; - - ScriptConfig *config = this->ai_config; - VisibleSettingsList::const_iterator it = this->visible_settings.begin(); - int i = 0; - for (; !this->vscroll->IsVisible(i); i++) it++; - - Rect ir = r.Shrink(WidgetDimensions::scaled.framerect); - bool rtl = _current_text_dir == TD_RTL; - Rect br = ir.WithWidth(SETTING_BUTTON_WIDTH, rtl); - Rect tr = ir.Indent(SETTING_BUTTON_WIDTH + WidgetDimensions::scaled.hsep_wide, rtl); - - int y = r.top; - int button_y_offset = (this->line_height - SETTING_BUTTON_HEIGHT) / 2; - int text_y_offset = (this->line_height - FONT_HEIGHT_NORMAL) / 2; - for (; this->vscroll->IsVisible(i) && it != visible_settings.end(); i++, it++) { - const ScriptConfigItem &config_item = **it; - int current_value = config->GetSetting((config_item).name); - bool editable = this->IsEditableItem(config_item); - - StringID str; - TextColour colour; - uint idx = 0; - if (StrEmpty(config_item.description)) { - if (!strcmp(config_item.name, "start_date")) { - /* Build-in translation */ - str = STR_AI_SETTINGS_START_DELAY; - colour = TC_LIGHT_BLUE; - } else { - str = STR_JUST_STRING; - colour = TC_ORANGE; - } - } else { - str = STR_AI_SETTINGS_SETTING; - colour = TC_LIGHT_BLUE; - SetDParamStr(idx++, config_item.description); - } - - if ((config_item.flags & SCRIPTCONFIG_BOOLEAN) != 0) { - DrawBoolButton(br.left, y + button_y_offset, current_value != 0, editable); - SetDParam(idx++, current_value == 0 ? STR_CONFIG_SETTING_OFF : STR_CONFIG_SETTING_ON); - } else { - if (config_item.complete_labels) { - DrawDropDownButton(br.left, y + button_y_offset, COLOUR_YELLOW, this->clicked_row == i && clicked_dropdown, editable); - } else { - DrawArrowButtons(br.left, y + button_y_offset, COLOUR_YELLOW, (this->clicked_button == i) ? 1 + (this->clicked_increase != rtl) : 0, editable && current_value > config_item.min_value, editable && current_value < config_item.max_value); - } - if (config_item.labels != nullptr && config_item.labels->Contains(current_value)) { - SetDParam(idx++, STR_JUST_RAW_STRING); - SetDParamStr(idx++, config_item.labels->Find(current_value)->second); - } else { - SetDParam(idx++, STR_JUST_INT); - SetDParam(idx++, current_value); - } - } - - DrawString(tr.left, tr.right, y + text_y_offset, str, colour); - y += this->line_height; - } - } - - void OnPaint() override - { - if (this->closing_dropdown) { - this->closing_dropdown = false; - this->clicked_dropdown = false; - } - this->DrawWidgets(); - } - - void OnClick(Point pt, int widget, int click_count) override - { - switch (widget) { - case WID_AIS_BACKGROUND: { - Rect r = this->GetWidget(widget)->GetCurrentRect().Shrink(WidgetDimensions::scaled.matrix, RectPadding::zero); - int num = (pt.y - r.top) / this->line_height + this->vscroll->GetPosition(); - if (num >= (int)this->visible_settings.size()) break; - - VisibleSettingsList::const_iterator it = this->visible_settings.begin(); - for (int i = 0; i < num; i++) it++; - const ScriptConfigItem config_item = **it; - if (!this->IsEditableItem(config_item)) return; - - if (this->clicked_row != num) { - DeleteChildWindows(WC_QUERY_STRING); - HideDropDownMenu(this); - this->clicked_row = num; - this->clicked_dropdown = false; - } - - bool bool_item = (config_item.flags & SCRIPTCONFIG_BOOLEAN) != 0; - - int x = pt.x - r.left; - if (_current_text_dir == TD_RTL) x = r.Width() - 1 - x; - - /* One of the arrows is clicked (or green/red rect in case of bool value) */ - int old_val = this->ai_config->GetSetting(config_item.name); - if (!bool_item && IsInsideMM(x, 0, SETTING_BUTTON_WIDTH) && config_item.complete_labels) { - if (this->clicked_dropdown) { - /* unclick the dropdown */ - HideDropDownMenu(this); - this->clicked_dropdown = false; - this->closing_dropdown = false; - } else { - int rel_y = (pt.y - r.top) % this->line_height; - - Rect wi_rect; - wi_rect.left = pt.x - (_current_text_dir == TD_RTL ? SETTING_BUTTON_WIDTH - 1 - x : x); - wi_rect.right = wi_rect.left + SETTING_BUTTON_WIDTH - 1; - wi_rect.top = pt.y - rel_y + (this->line_height - SETTING_BUTTON_HEIGHT) / 2; - wi_rect.bottom = wi_rect.top + SETTING_BUTTON_HEIGHT - 1; - - /* If the mouse is still held but dragged outside of the dropdown list, keep the dropdown open */ - if (pt.y >= wi_rect.top && pt.y <= wi_rect.bottom) { - this->clicked_dropdown = true; - this->closing_dropdown = false; - - DropDownList list; - for (int i = config_item.min_value; i <= config_item.max_value; i++) { - list.emplace_back(new DropDownListCharStringItem(config_item.labels->Find(i)->second, i, false)); - } - - ShowDropDownListAt(this, std::move(list), old_val, -1, wi_rect, COLOUR_ORANGE, true); - } - } - } else if (IsInsideMM(x, 0, SETTING_BUTTON_WIDTH)) { - int new_val = old_val; - if (bool_item) { - new_val = !new_val; - } else if (x >= SETTING_BUTTON_WIDTH / 2) { - /* Increase button clicked */ - new_val += config_item.step_size; - if (new_val > config_item.max_value) new_val = config_item.max_value; - this->clicked_increase = true; - } else { - /* Decrease button clicked */ - new_val -= config_item.step_size; - if (new_val < config_item.min_value) new_val = config_item.min_value; - this->clicked_increase = false; - } - - if (new_val != old_val) { - this->ai_config->SetSetting(config_item.name, new_val); - this->clicked_button = num; - this->timeout.SetInterval(150); - } - } else if (!bool_item && !config_item.complete_labels) { - /* Display a query box so users can enter a custom value. */ - SetDParam(0, old_val); - ShowQueryString(STR_JUST_INT, STR_CONFIG_SETTING_QUERY_CAPTION, 10, this, CS_NUMERAL, QSF_NONE); - } - this->SetDirty(); - break; - } - - case WID_AIS_ACCEPT: - delete this; - break; - - case WID_AIS_RESET: - this->ai_config->ResetEditableSettings(_game_mode == GM_MENU || ((this->slot != OWNER_DEITY) && !Company::IsValidID(this->slot))); - this->SetDirty(); - break; - } - } - - void OnQueryTextFinished(char *str) override - { - if (StrEmpty(str)) return; - int32 value = atoi(str); - - SetValue(value); - } - - void OnDropdownSelect(int widget, int index) override - { - assert(this->clicked_dropdown); - SetValue(index); - } - - void OnDropdownClose(Point pt, int widget, int index, bool instant_close) override - { - /* We cannot raise the dropdown button just yet. OnClick needs some hint, whether - * the same dropdown button was clicked again, and then not open the dropdown again. - * So, we only remember that it was closed, and process it on the next OnPaint, which is - * after OnClick. */ - assert(this->clicked_dropdown); - this->closing_dropdown = true; - this->SetDirty(); - } - - void OnResize() override - { - this->vscroll->SetCapacityFromWidget(this, WID_AIS_BACKGROUND); - } - - void OnRealtimeTick(uint delta_ms) override - { - if (this->timeout.Elapsed(delta_ms)) { - this->clicked_button = -1; - this->SetDirty(); - } - } - - /** - * Some data on this window has become invalid. - * @param data Information about the changed data. - * @param gui_scope Whether the call is done from GUI scope. You may not do everything when not in GUI scope. See #InvalidateWindowData() for details. - */ - void OnInvalidateData(int data = 0, bool gui_scope = true) override - { - this->RebuildVisibleSettings(); - HideDropDownMenu(this); - DeleteChildWindows(WC_QUERY_STRING); - } - -private: - bool IsEditableItem(const ScriptConfigItem &config_item) const - { - return _game_mode == GM_MENU - || _game_mode == GM_EDITOR - || ((this->slot != OWNER_DEITY) && !Company::IsValidID(this->slot)) - || (config_item.flags & SCRIPTCONFIG_INGAME) != 0 - || _settings_client.gui.ai_developer_tools; - } - - void SetValue(int value) - { - VisibleSettingsList::const_iterator it = this->visible_settings.begin(); - for (int i = 0; i < this->clicked_row; i++) it++; - const ScriptConfigItem config_item = **it; - if (_game_mode == GM_NORMAL && ((this->slot == OWNER_DEITY) || Company::IsValidID(this->slot)) && (config_item.flags & SCRIPTCONFIG_INGAME) == 0) return; - this->ai_config->SetSetting(config_item.name, value); - this->SetDirty(); - } -}; - -/** Widgets for the AI settings window. */ -static const NWidgetPart _nested_ai_settings_widgets[] = { - NWidget(NWID_HORIZONTAL), - NWidget(WWT_CLOSEBOX, COLOUR_MAUVE), - NWidget(WWT_CAPTION, COLOUR_MAUVE, WID_AIS_CAPTION), SetDataTip(STR_AI_SETTINGS_CAPTION_AI, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), - NWidget(WWT_DEFSIZEBOX, COLOUR_MAUVE), - EndContainer(), - NWidget(NWID_HORIZONTAL), - NWidget(WWT_MATRIX, COLOUR_MAUVE, WID_AIS_BACKGROUND), SetMinimalSize(188, 182), SetResize(1, 1), SetFill(1, 0), SetMatrixDataTip(1, 0, STR_NULL), SetScrollbar(WID_AIS_SCROLLBAR), - NWidget(NWID_VSCROLLBAR, COLOUR_MAUVE, WID_AIS_SCROLLBAR), - EndContainer(), - NWidget(NWID_HORIZONTAL), - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), - NWidget(WWT_PUSHTXTBTN, COLOUR_MAUVE, WID_AIS_ACCEPT), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_AI_SETTINGS_CLOSE, STR_NULL), - NWidget(WWT_PUSHTXTBTN, COLOUR_MAUVE, WID_AIS_RESET), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_AI_SETTINGS_RESET, STR_NULL), - EndContainer(), - NWidget(WWT_RESIZEBOX, COLOUR_MAUVE), - EndContainer(), -}; - -/** Window definition for the AI settings window. */ -static WindowDesc _ai_settings_desc( - WDP_CENTER, "settings_script", 500, 208, - WC_AI_SETTINGS, WC_NONE, - 0, - _nested_ai_settings_widgets, lengthof(_nested_ai_settings_widgets) -); - -/** - * Open the AI settings window to change the AI settings for an AI. - * @param slot The CompanyID of the AI to change the settings. - */ -static void ShowAISettingsWindow(CompanyID slot) -{ - DeleteWindowByClass(WC_AI_LIST); - DeleteWindowByClass(WC_AI_SETTINGS); - new AISettingsWindow(&_ai_settings_desc, slot); -} - - -/** Window for displaying the textfile of a AI. */ -struct ScriptTextfileWindow : public TextfileWindow { - CompanyID slot; ///< View the textfile of this CompanyID slot. - - ScriptTextfileWindow(TextfileType file_type, CompanyID slot) : TextfileWindow(file_type), slot(slot) - { - this->OnInvalidateData(); - } - - void SetStringParameters(int widget) const override - { - if (widget == WID_TF_CAPTION) { - SetDParam(0, (slot == OWNER_DEITY) ? STR_CONTENT_TYPE_GAME_SCRIPT : STR_CONTENT_TYPE_AI); - SetDParamStr(1, GetConfig(slot)->GetInfo()->GetName()); - } - } - - void OnInvalidateData(int data = 0, bool gui_scope = true) override - { - const char *textfile = GetConfig(slot)->GetTextfile(file_type, slot); - if (textfile == nullptr) { - delete this; - } else { - this->LoadTextfile(textfile, (slot == OWNER_DEITY) ? GAME_DIR : AI_DIR); - } - } -}; - -/** - * Open the AI version of the textfile window. - * @param file_type The type of textfile to display. - * @param slot The slot the Script is using. - */ -void ShowScriptTextfileWindow(TextfileType file_type, CompanyID slot) -{ - DeleteWindowById(WC_TEXTFILE, file_type); - new ScriptTextfileWindow(file_type, slot); -} - - /** Widgets for the configure AI window. */ static const NWidgetPart _nested_ai_config_widgets[] = { NWidget(NWID_HORIZONTAL), @@ -742,8 +94,8 @@ struct AIConfigWindow : public Window { ~AIConfigWindow() { - DeleteWindowByClass(WC_AI_LIST); - DeleteWindowByClass(WC_AI_SETTINGS); + DeleteWindowByClass(WC_SCRIPT_LIST); + DeleteWindowByClass(WC_SCRIPT_SETTINGS); } void SetStringParameters(int widget) const override @@ -818,7 +170,7 @@ struct AIConfigWindow : public Window { void OnClick(Point pt, int widget, int click_count) override { if (widget >= WID_AIC_TEXTFILE && widget < WID_AIC_TEXTFILE + TFT_END) { - if (this->selected_slot == INVALID_COMPANY || GetConfig(this->selected_slot) == nullptr) return; + if (this->selected_slot == INVALID_COMPANY || AIConfig::GetConfig(this->selected_slot) == nullptr) return; ShowScriptTextfileWindow((TextfileType)(widget - WID_AIC_TEXTFILE), this->selected_slot); return; @@ -840,7 +192,7 @@ struct AIConfigWindow : public Window { case WID_AIC_LIST: { // Select a slot this->selected_slot = (CompanyID)this->vscroll->GetScrolledRowFromWidget(pt.y, this, widget); this->InvalidateData(); - if (click_count > 1 && this->selected_slot != INVALID_COMPANY) ShowAIListWindow((CompanyID)this->selected_slot); + if (click_count > 1 && this->selected_slot != INVALID_COMPANY) ShowScriptListWindow((CompanyID)this->selected_slot); break; } @@ -863,11 +215,11 @@ struct AIConfigWindow : public Window { break; case WID_AIC_CHANGE: // choose other AI - ShowAIListWindow((CompanyID)this->selected_slot); + ShowScriptListWindow((CompanyID)this->selected_slot); break; case WID_AIC_CONFIGURE: // change the settings for an AI - ShowAISettingsWindow((CompanyID)this->selected_slot); + ShowScriptSettingsWindow((CompanyID)this->selected_slot); break; case WID_AIC_CLOSE: @@ -900,12 +252,12 @@ struct AIConfigWindow : public Window { this->SetWidgetDisabledState(WID_AIC_DECREASE, GetGameSettings().difficulty.max_no_competitors == 0); this->SetWidgetDisabledState(WID_AIC_INCREASE, GetGameSettings().difficulty.max_no_competitors == MAX_COMPANIES - 1); this->SetWidgetDisabledState(WID_AIC_CHANGE, this->selected_slot == INVALID_COMPANY); - this->SetWidgetDisabledState(WID_AIC_CONFIGURE, this->selected_slot == INVALID_COMPANY || GetConfig(this->selected_slot)->GetConfigList()->size() == 0); + this->SetWidgetDisabledState(WID_AIC_CONFIGURE, this->selected_slot == INVALID_COMPANY || AIConfig::GetConfig(this->selected_slot)->GetConfigList()->size() == 0); this->SetWidgetDisabledState(WID_AIC_MOVE_UP, this->selected_slot == INVALID_COMPANY || !IsEditable((CompanyID)(this->selected_slot - 1))); this->SetWidgetDisabledState(WID_AIC_MOVE_DOWN, this->selected_slot == INVALID_COMPANY || !IsEditable((CompanyID)(this->selected_slot + 1))); for (TextfileType tft = TFT_BEGIN; tft < TFT_END; tft++) { - this->SetWidgetDisabledState(WID_AIC_TEXTFILE + tft, this->selected_slot == INVALID_COMPANY || (GetConfig(this->selected_slot)->GetTextfile(tft, this->selected_slot) == nullptr)); + this->SetWidgetDisabledState(WID_AIC_TEXTFILE + tft, this->selected_slot == INVALID_COMPANY || (AIConfig::GetConfig(this->selected_slot)->GetTextfile(tft, this->selected_slot) == nullptr)); } } }; @@ -916,608 +268,3 @@ void ShowAIConfigWindow() DeleteWindowByClass(WC_GAME_OPTIONS); new AIConfigWindow(); } - -/** - * Set the widget colour of a button based on the - * state of the script. (dead or alive) - * @param button the button to update. - * @param dead true if the script is dead, otherwise false. - * @param paused true if the script is paused, otherwise false. - * @return true if the colour was changed and the window need to be marked as dirty. - */ -static bool SetScriptButtonColour(NWidgetCore &button, bool dead, bool paused) -{ - /* Dead scripts are indicated with red background and - * paused scripts are indicated with yellow background. */ - Colours colour = dead ? COLOUR_RED : - (paused ? COLOUR_YELLOW : COLOUR_GREY); - if (button.colour != colour) { - button.colour = colour; - return true; - } - return false; -} - -/** - * Window with everything an AI prints via ScriptLog. - */ -struct AIDebugWindow : public Window { - static const uint MAX_BREAK_STR_STRING_LENGTH = 256; ///< Maximum length of the break string. - - static CompanyID ai_debug_company; ///< The AI that is (was last) being debugged. - int redraw_timer; ///< Timer for redrawing the window, otherwise it'll happen every tick. - int last_vscroll_pos; ///< Last position of the scrolling. - bool autoscroll; ///< Whether automatically scrolling should be enabled or not. - bool show_break_box; ///< Whether the break/debug box is visible. - static bool break_check_enabled; ///< Stop an AI when it prints a matching string - static char break_string[MAX_BREAK_STR_STRING_LENGTH]; ///< The string to match to the AI output - QueryString break_editbox; ///< Break editbox - static StringFilter break_string_filter; ///< Log filter for break. - static bool case_sensitive_break_check; ///< Is the matching done case-sensitive - int highlight_row; ///< The output row that matches the given string, or -1 - Scrollbar *vscroll; ///< Cache of the vertical scrollbar. - - ScriptLog::LogData *GetLogPointer() const - { - if (ai_debug_company == OWNER_DEITY) return (ScriptLog::LogData *)Game::GetInstance()->GetLogPointer(); - return (ScriptLog::LogData *)Company::Get(ai_debug_company)->ai_instance->GetLogPointer(); - } - - /** - * Check whether the currently selected AI/GS is dead. - * @return true if dead. - */ - bool IsDead() const - { - if (ai_debug_company == OWNER_DEITY) { - GameInstance *game = Game::GetInstance(); - return game == nullptr || game->IsDead(); - } - return !Company::IsValidAiID(ai_debug_company) || Company::Get(ai_debug_company)->ai_instance->IsDead(); - } - - /** - * Check whether a company is a valid AI company or GS. - * @param company Company to check for validity. - * @return true if company is valid for debugging. - */ - bool IsValidDebugCompany(CompanyID company) const - { - switch (company) { - case INVALID_COMPANY: return false; - case OWNER_DEITY: return Game::GetInstance() != nullptr; - default: return Company::IsValidAiID(company); - } - } - - /** - * Ensure that \c ai_debug_company refers to a valid AI company or GS, or is set to #INVALID_COMPANY. - * If no valid company is selected, it selects the first valid AI or GS if any. - */ - void SelectValidDebugCompany() - { - /* Check if the currently selected company is still active. */ - if (this->IsValidDebugCompany(ai_debug_company)) return; - - ai_debug_company = INVALID_COMPANY; - - for (const Company *c : Company::Iterate()) { - if (c->is_ai) { - ChangeToAI(c->index); - return; - } - } - - /* If no AI is available, see if there is a game script. */ - if (Game::GetInstance() != nullptr) ChangeToAI(OWNER_DEITY); - } - - /** - * Constructor for the window. - * @param desc The description of the window. - * @param number The window number (actually unused). - */ - AIDebugWindow(WindowDesc *desc, WindowNumber number) : Window(desc), break_editbox(MAX_BREAK_STR_STRING_LENGTH) - { - this->CreateNestedTree(); - this->vscroll = this->GetScrollbar(WID_AID_SCROLLBAR); - this->show_break_box = _settings_client.gui.ai_developer_tools; - this->GetWidget(WID_AID_BREAK_STRING_WIDGETS)->SetDisplayedPlane(this->show_break_box ? 0 : SZSP_HORIZONTAL); - this->FinishInitNested(number); - - if (!this->show_break_box) break_check_enabled = false; - - this->last_vscroll_pos = 0; - this->autoscroll = true; - this->highlight_row = -1; - - this->querystrings[WID_AID_BREAK_STR_EDIT_BOX] = &this->break_editbox; - - SetWidgetsDisabledState(!this->show_break_box, WID_AID_BREAK_STR_ON_OFF_BTN, WID_AID_BREAK_STR_EDIT_BOX, WID_AID_MATCH_CASE_BTN, WIDGET_LIST_END); - - /* Restore the break string value from static variable */ - this->break_editbox.text.Assign(this->break_string); - - this->SelectValidDebugCompany(); - this->InvalidateData(-1); - } - - void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override - { - if (widget == WID_AID_LOG_PANEL) { - resize->height = FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; - size->height = 14 * resize->height + WidgetDimensions::scaled.framerect.Vertical(); - } - } - - void OnPaint() override - { - this->SelectValidDebugCompany(); - - /* Draw standard stuff */ - this->DrawWidgets(); - - if (this->IsShaded()) return; // Don't draw anything when the window is shaded. - - bool dirty = false; - - /* Paint the company icons */ - for (CompanyID i = COMPANY_FIRST; i < MAX_COMPANIES; i++) { - NWidgetCore *button = this->GetWidget(i + WID_AID_COMPANY_BUTTON_START); - - bool valid = Company::IsValidAiID(i); - - /* Check whether the validity of the company changed */ - dirty |= (button->IsDisabled() == valid); - - /* Mark dead/paused AIs by setting the background colour. */ - bool dead = valid && Company::Get(i)->ai_instance->IsDead(); - bool paused = valid && Company::Get(i)->ai_instance->IsPaused(); - /* Re-paint if the button was updated. - * (note that it is intentional that SetScriptButtonColour is always called) */ - dirty |= SetScriptButtonColour(*button, dead, paused); - - /* Draw company icon only for valid AI companies */ - if (!valid) continue; - - byte offset = (i == ai_debug_company) ? 1 : 0; - DrawCompanyIcon(i, button->pos_x + button->current_x / 2 - 7 + offset, this->GetWidget(WID_AID_COMPANY_BUTTON_START + i)->pos_y + 2 + offset); - } - - /* Set button colour for Game Script. */ - GameInstance *game = Game::GetInstance(); - bool valid = game != nullptr; - bool dead = valid && game->IsDead(); - bool paused = valid && game->IsPaused(); - - NWidgetCore *button = this->GetWidget(WID_AID_SCRIPT_GAME); - dirty |= (button->IsDisabled() == valid) || SetScriptButtonColour(*button, dead, paused); - - if (dirty) this->InvalidateData(-1); - - /* If there are no active companies, don't display anything else. */ - if (ai_debug_company == INVALID_COMPANY) return; - - ScriptLog::LogData *log = this->GetLogPointer(); - - int scroll_count = (log == nullptr) ? 0 : log->used; - if (this->vscroll->GetCount() != scroll_count) { - this->vscroll->SetCount(scroll_count); - - /* We need a repaint */ - this->SetWidgetDirty(WID_AID_SCROLLBAR); - } - - if (log == nullptr) return; - - /* Detect when the user scrolls the window. Enable autoscroll when the - * bottom-most line becomes visible. */ - if (this->last_vscroll_pos != this->vscroll->GetPosition()) { - this->autoscroll = this->vscroll->GetPosition() >= log->used - this->vscroll->GetCapacity(); - } - if (this->autoscroll) { - int scroll_pos = std::max(0, log->used - this->vscroll->GetCapacity()); - if (scroll_pos != this->vscroll->GetPosition()) { - this->vscroll->SetPosition(scroll_pos); - - /* We need a repaint */ - this->SetWidgetDirty(WID_AID_SCROLLBAR); - this->SetWidgetDirty(WID_AID_LOG_PANEL); - } - } - this->last_vscroll_pos = this->vscroll->GetPosition(); - } - - void SetStringParameters(int widget) const override - { - switch (widget) { - case WID_AID_NAME_TEXT: - if (ai_debug_company == OWNER_DEITY) { - const GameInfo *info = Game::GetInfo(); - assert(info != nullptr); - SetDParam(0, STR_AI_DEBUG_NAME_AND_VERSION); - SetDParamStr(1, info->GetName()); - SetDParam(2, info->GetVersion()); - } else if (ai_debug_company == INVALID_COMPANY || !Company::IsValidAiID(ai_debug_company)) { - SetDParam(0, STR_EMPTY); - } else { - const AIInfo *info = Company::Get(ai_debug_company)->ai_info; - assert(info != nullptr); - SetDParam(0, STR_AI_DEBUG_NAME_AND_VERSION); - SetDParamStr(1, info->GetName()); - SetDParam(2, info->GetVersion()); - } - break; - } - } - - void DrawWidget(const Rect &r, int widget) const override - { - if (ai_debug_company == INVALID_COMPANY) return; - - switch (widget) { - case WID_AID_LOG_PANEL: { - ScriptLog::LogData *log = this->GetLogPointer(); - if (log == nullptr) return; - - Rect br = r.Shrink(WidgetDimensions::scaled.bevel); - Rect tr = r.Shrink(WidgetDimensions::scaled.framerect); - for (int i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < log->used; i++) { - int pos = (i + log->pos + 1 - log->used + log->count) % log->count; - if (log->lines[pos] == nullptr) break; - - TextColour colour; - switch (log->type[pos]) { - case ScriptLog::LOG_SQ_INFO: colour = TC_BLACK; break; - case ScriptLog::LOG_SQ_ERROR: colour = TC_WHITE; break; - case ScriptLog::LOG_INFO: colour = TC_BLACK; break; - case ScriptLog::LOG_WARNING: colour = TC_YELLOW; break; - case ScriptLog::LOG_ERROR: colour = TC_RED; break; - default: colour = TC_BLACK; break; - } - - /* Check if the current line should be highlighted */ - if (pos == this->highlight_row) { - GfxFillRect(br.left, tr.top, br.right, tr.top + this->resize.step_height - 1, PC_BLACK); - if (colour == TC_BLACK) colour = TC_WHITE; // Make black text readable by inverting it to white. - } - - DrawString(tr, log->lines[pos], colour, SA_LEFT | SA_FORCE); - tr.top += this->resize.step_height; - } - break; - } - } - } - - /** - * Change all settings to select another AI. - * @param show_ai The new AI to show. - */ - void ChangeToAI(CompanyID show_ai) - { - if (!this->IsValidDebugCompany(show_ai)) return; - - ai_debug_company = show_ai; - - this->highlight_row = -1; // The highlight of one AI make little sense for another AI. - - /* Close AI settings window to prevent confusion */ - DeleteWindowByClass(WC_AI_SETTINGS); - - this->InvalidateData(-1); - - this->autoscroll = true; - this->last_vscroll_pos = this->vscroll->GetPosition(); - } - - void OnClick(Point pt, int widget, int click_count) override - { - /* Also called for hotkeys, so check for disabledness */ - if (this->IsWidgetDisabled(widget)) return; - - /* Check which button is clicked */ - if (IsInsideMM(widget, WID_AID_COMPANY_BUTTON_START, WID_AID_COMPANY_BUTTON_END + 1)) { - ChangeToAI((CompanyID)(widget - WID_AID_COMPANY_BUTTON_START)); - } - - switch (widget) { - case WID_AID_SCRIPT_GAME: - ChangeToAI(OWNER_DEITY); - break; - - case WID_AID_RELOAD_TOGGLE: { - extern bool UserIsAllowedToChangeGameScript(); - if (ai_debug_company == OWNER_DEITY) { - if (UserIsAllowedToChangeGameScript()) { - Game::Uninitialize(true); - Game::StartNew(); - this->InvalidateData(-1); - } - break; - } - /* First kill the company of the AI, then start a new one. This should start the current AI again */ - DoCommandP(0, CCA_DELETE | ai_debug_company << 16 | CRR_MANUAL << 24, 0, CMD_COMPANY_CTRL); - DoCommandP(0, CCA_NEW_AI | ai_debug_company << 16, 0, CMD_COMPANY_CTRL); - break; - } - - case WID_AID_SETTINGS: - ShowAISettingsWindow(ai_debug_company); - break; - - case WID_AID_BREAK_STR_ON_OFF_BTN: - this->break_check_enabled = !this->break_check_enabled; - this->InvalidateData(-1); - break; - - case WID_AID_MATCH_CASE_BTN: - this->case_sensitive_break_check = !this->case_sensitive_break_check; - this->InvalidateData(-1); - break; - - case WID_AID_CONTINUE_BTN: - /* Unpause current AI / game script and mark the corresponding script button dirty. */ - if (!this->IsDead()) { - if (ai_debug_company == OWNER_DEITY) { - Game::Unpause(); - } else { - AI::Unpause(ai_debug_company); - } - } - - /* If the last AI/Game Script is unpaused, unpause the game too. */ - if ((_pause_mode & PM_PAUSED_NORMAL) == PM_PAUSED_NORMAL) { - bool all_unpaused = !Game::IsPaused(); - if (all_unpaused) { - for (const Company *c : Company::Iterate()) { - if (c->is_ai && AI::IsPaused(c->index)) { - all_unpaused = false; - break; - } - } - if (all_unpaused) { - /* All scripts have been unpaused => unpause the game. */ - DoCommandP(0, PM_PAUSED_NORMAL, 0, CMD_PAUSE); - } - } - } - - this->highlight_row = -1; - this->InvalidateData(-1); - break; - } - } - - void OnEditboxChanged(int wid) override - { - if (wid == WID_AID_BREAK_STR_EDIT_BOX) { - /* Save the current string to static member so it can be restored next time the window is opened. */ - strecpy(this->break_string, this->break_editbox.text.buf, lastof(this->break_string)); - break_string_filter.SetFilterTerm(this->break_string); - } - } - - /** - * Some data on this window has become invalid. - * @param data Information about the changed data. - * This is the company ID of the AI/GS which wrote a new log message, or -1 in other cases. - * @param gui_scope Whether the call is done from GUI scope. You may not do everything when not in GUI scope. See #InvalidateWindowData() for details. - */ - void OnInvalidateData(int data = 0, bool gui_scope = true) override - { - /* If the log message is related to the active company tab, check the break string. - * This needs to be done in gameloop-scope, so the AI is suspended immediately. */ - if (!gui_scope && data == ai_debug_company && this->IsValidDebugCompany(ai_debug_company) && this->break_check_enabled && !this->break_string_filter.IsEmpty()) { - /* Get the log instance of the active company */ - ScriptLog::LogData *log = this->GetLogPointer(); - - if (log != nullptr) { - this->break_string_filter.ResetState(); - this->break_string_filter.AddLine(log->lines[log->pos]); - if (this->break_string_filter.GetState()) { - /* Pause execution of script. */ - if (!this->IsDead()) { - if (ai_debug_company == OWNER_DEITY) { - Game::Pause(); - } else { - AI::Pause(ai_debug_company); - } - } - - /* Pause the game. */ - if ((_pause_mode & PM_PAUSED_NORMAL) == PM_UNPAUSED) { - DoCommandP(0, PM_PAUSED_NORMAL, 1, CMD_PAUSE); - } - - /* Highlight row that matched */ - this->highlight_row = log->pos; - } - } - } - - if (!gui_scope) return; - - this->SelectValidDebugCompany(); - - ScriptLog::LogData *log = ai_debug_company != INVALID_COMPANY ? this->GetLogPointer() : nullptr; - this->vscroll->SetCount((log == nullptr) ? 0 : log->used); - - /* Update company buttons */ - for (CompanyID i = COMPANY_FIRST; i < MAX_COMPANIES; i++) { - this->SetWidgetDisabledState(i + WID_AID_COMPANY_BUTTON_START, !Company::IsValidAiID(i)); - this->SetWidgetLoweredState(i + WID_AID_COMPANY_BUTTON_START, ai_debug_company == i); - } - - this->SetWidgetDisabledState(WID_AID_SCRIPT_GAME, Game::GetGameInstance() == nullptr); - this->SetWidgetLoweredState(WID_AID_SCRIPT_GAME, ai_debug_company == OWNER_DEITY); - - this->SetWidgetLoweredState(WID_AID_BREAK_STR_ON_OFF_BTN, this->break_check_enabled); - this->SetWidgetLoweredState(WID_AID_MATCH_CASE_BTN, this->case_sensitive_break_check); - - this->SetWidgetDisabledState(WID_AID_SETTINGS, ai_debug_company == INVALID_COMPANY); - extern CompanyID _local_company; - extern bool UserIsAllowedToChangeGameScript(); - this->SetWidgetDisabledState(WID_AID_RELOAD_TOGGLE, ai_debug_company == INVALID_COMPANY || ai_debug_company == _local_company || (ai_debug_company == OWNER_DEITY && !UserIsAllowedToChangeGameScript())); - this->SetWidgetDisabledState(WID_AID_CONTINUE_BTN, ai_debug_company == INVALID_COMPANY || - (ai_debug_company == OWNER_DEITY ? !Game::IsPaused() : !AI::IsPaused(ai_debug_company))); - } - - void OnResize() override - { - this->vscroll->SetCapacityFromWidget(this, WID_AID_LOG_PANEL, WidgetDimensions::scaled.framerect.Vertical()); - } - - static HotkeyList hotkeys; -}; - -CompanyID AIDebugWindow::ai_debug_company = INVALID_COMPANY; -char AIDebugWindow::break_string[MAX_BREAK_STR_STRING_LENGTH] = ""; -bool AIDebugWindow::break_check_enabled = true; -bool AIDebugWindow::case_sensitive_break_check = false; -StringFilter AIDebugWindow::break_string_filter(&AIDebugWindow::case_sensitive_break_check); - -/** Make a number of rows with buttons for each company for the AI debug window. */ -NWidgetBase *MakeCompanyButtonRowsAIDebug(int *biggest_index) -{ - return MakeCompanyButtonRows(biggest_index, WID_AID_COMPANY_BUTTON_START, WID_AID_COMPANY_BUTTON_END, COLOUR_GREY, 8, STR_AI_DEBUG_SELECT_AI_TOOLTIP); -} - -/** - * Handler for global hotkeys of the AIDebugWindow. - * @param hotkey Hotkey - * @return ES_HANDLED if hotkey was accepted. - */ -static EventState AIDebugGlobalHotkeys(int hotkey) -{ - if (_game_mode != GM_NORMAL) return ES_NOT_HANDLED; - Window *w = ShowAIDebugWindow(INVALID_COMPANY); - if (w == nullptr) return ES_NOT_HANDLED; - return w->OnHotkey(hotkey); -} - -static Hotkey aidebug_hotkeys[] = { - Hotkey('1', "company_1", WID_AID_COMPANY_BUTTON_START), - Hotkey('2', "company_2", WID_AID_COMPANY_BUTTON_START + 1), - Hotkey('3', "company_3", WID_AID_COMPANY_BUTTON_START + 2), - Hotkey('4', "company_4", WID_AID_COMPANY_BUTTON_START + 3), - Hotkey('5', "company_5", WID_AID_COMPANY_BUTTON_START + 4), - Hotkey('6', "company_6", WID_AID_COMPANY_BUTTON_START + 5), - Hotkey('7', "company_7", WID_AID_COMPANY_BUTTON_START + 6), - Hotkey('8', "company_8", WID_AID_COMPANY_BUTTON_START + 7), - Hotkey('9', "company_9", WID_AID_COMPANY_BUTTON_START + 8), - Hotkey((uint16)0, "company_10", WID_AID_COMPANY_BUTTON_START + 9), - Hotkey((uint16)0, "company_11", WID_AID_COMPANY_BUTTON_START + 10), - Hotkey((uint16)0, "company_12", WID_AID_COMPANY_BUTTON_START + 11), - Hotkey((uint16)0, "company_13", WID_AID_COMPANY_BUTTON_START + 12), - Hotkey((uint16)0, "company_14", WID_AID_COMPANY_BUTTON_START + 13), - Hotkey((uint16)0, "company_15", WID_AID_COMPANY_BUTTON_START + 14), - Hotkey('S', "settings", WID_AID_SETTINGS), - Hotkey('0', "game_script", WID_AID_SCRIPT_GAME), - Hotkey((uint16)0, "reload", WID_AID_RELOAD_TOGGLE), - Hotkey('B', "break_toggle", WID_AID_BREAK_STR_ON_OFF_BTN), - Hotkey('F', "break_string", WID_AID_BREAK_STR_EDIT_BOX), - Hotkey('C', "match_case", WID_AID_MATCH_CASE_BTN), - Hotkey(WKC_RETURN, "continue", WID_AID_CONTINUE_BTN), - HOTKEY_LIST_END -}; -HotkeyList AIDebugWindow::hotkeys("aidebug", aidebug_hotkeys, AIDebugGlobalHotkeys); - -/** Widgets for the AI debug window. */ -static const NWidgetPart _nested_ai_debug_widgets[] = { - NWidget(NWID_HORIZONTAL), - NWidget(WWT_CLOSEBOX, COLOUR_GREY), - NWidget(WWT_CAPTION, COLOUR_GREY), SetDataTip(STR_AI_DEBUG, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), - NWidget(WWT_SHADEBOX, COLOUR_GREY), - NWidget(WWT_DEFSIZEBOX, COLOUR_GREY), - NWidget(WWT_STICKYBOX, COLOUR_GREY), - EndContainer(), - NWidget(WWT_PANEL, COLOUR_GREY, WID_AID_VIEW), - NWidgetFunction(MakeCompanyButtonRowsAIDebug), SetPadding(0, 2, 1, 2), - EndContainer(), - NWidget(NWID_HORIZONTAL), - NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_AID_SCRIPT_GAME), SetMinimalSize(100, 20), SetResize(1, 0), SetDataTip(STR_AI_GAME_SCRIPT, STR_AI_GAME_SCRIPT_TOOLTIP), - NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_AID_NAME_TEXT), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_JUST_STRING, STR_AI_DEBUG_NAME_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_AID_SETTINGS), SetMinimalSize(100, 20), SetDataTip(STR_AI_DEBUG_SETTINGS, STR_AI_DEBUG_SETTINGS_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_AID_RELOAD_TOGGLE), SetMinimalSize(100, 20), SetDataTip(STR_AI_DEBUG_RELOAD, STR_AI_DEBUG_RELOAD_TOOLTIP), - EndContainer(), - NWidget(NWID_HORIZONTAL), - NWidget(NWID_VERTICAL), - /* Log panel */ - NWidget(WWT_PANEL, COLOUR_GREY, WID_AID_LOG_PANEL), SetMinimalSize(287, 180), SetResize(1, 1), SetScrollbar(WID_AID_SCROLLBAR), - EndContainer(), - /* Break string widgets */ - NWidget(NWID_SELECTION, INVALID_COLOUR, WID_AID_BREAK_STRING_WIDGETS), - NWidget(NWID_HORIZONTAL), - NWidget(WWT_IMGBTN_2, COLOUR_GREY, WID_AID_BREAK_STR_ON_OFF_BTN), SetFill(0, 1), SetDataTip(SPR_FLAG_VEH_STOPPED, STR_AI_DEBUG_BREAK_STR_ON_OFF_TOOLTIP), - NWidget(WWT_PANEL, COLOUR_GREY), - NWidget(NWID_HORIZONTAL), - NWidget(WWT_LABEL, COLOUR_GREY), SetPadding(2, 2, 2, 4), SetDataTip(STR_AI_DEBUG_BREAK_ON_LABEL, 0x0), - NWidget(WWT_EDITBOX, COLOUR_GREY, WID_AID_BREAK_STR_EDIT_BOX), SetFill(1, 1), SetResize(1, 0), SetPadding(2, 2, 2, 2), SetDataTip(STR_AI_DEBUG_BREAK_STR_OSKTITLE, STR_AI_DEBUG_BREAK_STR_TOOLTIP), - EndContainer(), - EndContainer(), - NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_AID_MATCH_CASE_BTN), SetMinimalSize(100, 0), SetFill(0, 1), SetDataTip(STR_AI_DEBUG_MATCH_CASE, STR_AI_DEBUG_MATCH_CASE_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_AID_CONTINUE_BTN), SetMinimalSize(100, 0), SetFill(0, 1), SetDataTip(STR_AI_DEBUG_CONTINUE, STR_AI_DEBUG_CONTINUE_TOOLTIP), - EndContainer(), - EndContainer(), - EndContainer(), - NWidget(NWID_VERTICAL), - NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_AID_SCROLLBAR), - NWidget(WWT_RESIZEBOX, COLOUR_GREY), - EndContainer(), - EndContainer(), -}; - -/** Window definition for the AI debug window. */ -static WindowDesc _ai_debug_desc( - WDP_AUTO, "script_debug", 600, 450, - WC_AI_DEBUG, WC_NONE, - 0, - _nested_ai_debug_widgets, lengthof(_nested_ai_debug_widgets), - &AIDebugWindow::hotkeys -); - -/** - * Open the AI debug window and select the given company. - * @param show_company Display debug information about this AI company. - */ -Window *ShowAIDebugWindow(CompanyID show_company) -{ - if (!_networking || _network_server) { - AIDebugWindow *w = (AIDebugWindow *)BringWindowToFrontById(WC_AI_DEBUG, 0); - if (w == nullptr) w = new AIDebugWindow(&_ai_debug_desc, 0); - if (show_company != INVALID_COMPANY) w->ChangeToAI(show_company); - return w; - } else { - ShowErrorMessage(STR_ERROR_AI_DEBUG_SERVER_ONLY, INVALID_STRING_ID, WL_INFO); - } - - return nullptr; -} - -/** - * Reset the AI windows to their initial state. - */ -void InitializeAIGui() -{ - AIDebugWindow::ai_debug_company = INVALID_COMPANY; -} - -/** Open the AI debug window if one of the AI scripts has crashed. */ -void ShowAIDebugWindowIfAIError() -{ - /* Network clients can't debug AIs. */ - if (_networking && !_network_server) return; - - for (const Company *c : Company::Iterate()) { - if (c->is_ai && c->ai_instance->IsDead()) { - ShowAIDebugWindow(c->index); - break; - } - } - - GameInstance *g = Game::GetGameInstance(); - if (g != nullptr && g->IsDead()) { - ShowAIDebugWindow(OWNER_DEITY); - } -} diff --git a/src/ai/ai_gui.hpp b/src/ai/ai_gui.hpp index be6263ddd5..6eb28c3841 100644 --- a/src/ai/ai_gui.hpp +++ b/src/ai/ai_gui.hpp @@ -10,13 +10,6 @@ #ifndef AI_GUI_HPP #define AI_GUI_HPP -#include "../company_type.h" - -void ShowAIListWindow(CompanyID slot); -Window* ShowAIDebugWindow(CompanyID show_company = INVALID_COMPANY); void ShowAIConfigWindow(); -void ShowScriptTextfileWindow(TextfileType file_type, CompanyID slot); -void ShowAIDebugWindowIfAIError(); -void InitializeAIGui(); #endif /* AI_GUI_HPP */ diff --git a/src/ai/ai_instance.cpp b/src/ai/ai_instance.cpp index cd31c25b8c..f61e6356a5 100644 --- a/src/ai/ai_instance.cpp +++ b/src/ai/ai_instance.cpp @@ -14,10 +14,10 @@ #include "../script/squirrel_class.hpp" #include "ai_config.hpp" -#include "ai_gui.hpp" #include "ai.hpp" #include "../script/script_storage.hpp" +#include "../script/script_gui.h" #include "ai_info.hpp" #include "ai_instance.hpp" @@ -63,7 +63,7 @@ void AIInstance::Died() /* Intro is not supposed to use AI, but it may have 'dummy' AI which instant dies. */ if (_game_mode == GM_MENU) return; - ShowAIDebugWindow(_current_company); + ShowScriptDebugWindow(_current_company); const AIInfo *info = AIConfig::GetConfig(_current_company, AIConfig::SSS_FORCE_GAME)->GetInfo(); if (info != nullptr) { @@ -79,7 +79,6 @@ void AIInstance::Died() void AIInstance::LoadDummyScript() { ScriptAllocatorScope alloc_scope(this->engine); - extern void Script_CreateDummy(HSQUIRRELVM vm, StringID string, const char *type); Script_CreateDummy(this->engine->GetVM(), STR_ERROR_AI_NO_AI_FOUND, "AI"); } diff --git a/src/ai/ai_scanner.cpp b/src/ai/ai_scanner.cpp index e9ebe72bd0..38639b9cc0 100644 --- a/src/ai/ai_scanner.cpp +++ b/src/ai/ai_scanner.cpp @@ -35,7 +35,6 @@ void AIScannerInfo::Initialize() /* Create the dummy AI */ this->main_script = "%_dummy"; - extern void Script_CreateDummyInfo(HSQUIRRELVM vm, const char *type, const char *dir); Script_CreateDummyInfo(this->engine->GetVM(), "AI", "ai"); } diff --git a/src/aircraft.h b/src/aircraft.h index 7ef093b4c1..417542bf0f 100644 --- a/src/aircraft.h +++ b/src/aircraft.h @@ -143,5 +143,6 @@ struct Aircraft FINAL : public SpecializedVehicle { void GetRotorImage(const Aircraft *v, EngineImageType image_type, VehicleSpriteSeq *result); Station *GetTargetAirportIfValid(const Aircraft *v); +void HandleMissingAircraftOrders(Aircraft *v); #endif /* AIRCRAFT_H */ diff --git a/src/base_media_func.h b/src/base_media_func.h index a4fa6ed6fd..9fec671377 100644 --- a/src/base_media_func.h +++ b/src/base_media_func.h @@ -15,6 +15,8 @@ #include "ini_type.h" #include "string_func.h" +extern void CheckExternalFiles(); + /** * Try to read a single piece of metadata and return false if it doesn't exist. * @param name the name of the item to fetch. @@ -227,8 +229,6 @@ bool BaseMedia::AddFile(const std::string &filename, size_t basepath_ template /* static */ bool BaseMedia::SetSet(const std::string &name) { - extern void CheckExternalFiles(); - if (name.empty()) { if (!BaseMedia::DetermineBestSet()) return false; CheckExternalFiles(); diff --git a/src/command.cpp b/src/command.cpp index 7866536405..5a5f67bc6a 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -189,7 +189,7 @@ CommandProc CmdRemoveGoal; CommandProc CmdSetGoalText; CommandProc CmdSetGoalProgress; CommandProc CmdSetGoalCompleted; -CommandProc CmdGoalQuestion; +CommandProcEx CmdGoalQuestion; CommandProc CmdGoalQuestionAnswer; CommandProc CmdCreateStoryPage; CommandProc CmdCreateStoryPageElement; diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp index 62a756266c..5911dbaf91 100644 --- a/src/company_cmd.cpp +++ b/src/company_cmd.cpp @@ -47,6 +47,7 @@ #include "safeguards.h" void ClearEnginesHiddenFlagOfCompany(CompanyID cid); +void UpdateObjectColours(const Company *c); CompanyID _local_company; ///< Company controlled by the human player at this client. Can also be #COMPANY_SPECTATOR. CompanyID _current_company; ///< Company currently doing an action. @@ -583,7 +584,8 @@ Company *DoStartupNewCompany(DoStartupNewCompanyFlag flags, CompanyID company) ResetCompanyLivery(c); _company_colours[c->index] = (Colours)c->colour; - c->money = c->current_loan = (std::min(INITIAL_LOAN, _economy.max_loan) * _economy.inflation_prices >> 16) / 50000 * 50000; + /* Scale the initial loan based on the inflation rounded down to the loan interval. The maximum loan has already been inflation adjusted. */ + c->money = c->current_loan = std::min((INITIAL_LOAN * _economy.inflation_prices >> 16) / LOAN_INTERVAL * LOAN_INTERVAL, _economy.max_loan); c->share_owners[0] = c->share_owners[1] = c->share_owners[2] = c->share_owners[3] = INVALID_OWNER; @@ -755,11 +757,11 @@ static void HandleBankruptcyTakeover(Company *c) c->bankrupt_last_asked = best->index; c->bankrupt_timeout = TAKE_OVER_TIMEOUT; - if (best->is_ai) { - AI::NewEvent(best->index, new ScriptEventCompanyAskMerger(c->index, ClampToI32(c->bankrupt_value))); - } else if (IsInteractiveCompany(best->index)) { + + AI::NewEvent(best->index, new ScriptEventCompanyAskMerger(c->index, c->bankrupt_value)); + if (IsInteractiveCompany(best->index)) { ShowBuyCompanyDialog(c->index); - } else if (!_networking || (_network_server && !NetworkCompanyHasClients(best->index))) { + } else if ((!_networking || (_network_server && !NetworkCompanyHasClients(best->index))) && !best->is_ai) { /* This company can never accept the offer as there are no clients connected, decline the offer on the company's behalf */ Backup cur_company(_current_company, best->index, FILE_LINE); DoCommandP(0, c->index, 0, CMD_DECLINE_BUY_COMPANY | CMD_NO_SHIFT_ESTIMATE); @@ -1015,8 +1017,8 @@ CommandCost CmdCompanyCtrl(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3 } InvalidateWindowClassesData(WC_GAME_OPTIONS); - InvalidateWindowClassesData(WC_AI_SETTINGS); - InvalidateWindowClassesData(WC_AI_LIST); + InvalidateWindowClassesData(WC_SCRIPT_SETTINGS); + InvalidateWindowClassesData(WC_SCRIPT_LIST); return CommandCost(); } @@ -1143,7 +1145,6 @@ CommandCost CmdSetCompanyColour(TileIndex tile, DoCommandFlag flags, uint32 p1, } } - extern void UpdateObjectColours(const Company *c); UpdateObjectColours(c); } return CommandCost(); diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index 3b6c737129..83fe33be51 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -1199,6 +1199,9 @@ DEF_CONSOLE_CMD(ConReturn) * default console commands ******************************/ extern bool CloseConsoleLogIfActive(); +extern const std::vector &GetAllGRFFiles(); +extern void ConPrintFramerate(); // framerate_gui.cpp +extern void ShowFramerateWindow(); DEF_CONSOLE_CMD(ConScript) { @@ -3344,7 +3347,6 @@ DEF_CONSOLE_CMD(ConNewGRFProfile) return true; } - extern const std::vector &GetAllGRFFiles(); const std::vector &files = GetAllGRFFiles(); /* "list" sub-command */ @@ -3579,8 +3581,6 @@ static void IConsoleDebugLibRegister() DEF_CONSOLE_CMD(ConFramerate) { - extern void ConPrintFramerate(); // framerate_gui.cpp - if (argc == 0) { IConsoleHelp("Show frame rate and game speed information"); return true; @@ -3592,8 +3592,6 @@ DEF_CONSOLE_CMD(ConFramerate) DEF_CONSOLE_CMD(ConFramerateWindow) { - extern void ShowFramerateWindow(); - if (argc == 0) { IConsoleHelp("Open the frame rate window"); return true; diff --git a/src/depot_func.h b/src/depot_func.h index 42ac476ec3..bf0bdb3d93 100644 --- a/src/depot_func.h +++ b/src/depot_func.h @@ -14,6 +14,7 @@ #include "slope_func.h" void ShowDepotWindow(TileIndex tile, VehicleType type); +void InitDepotWindowBlockSizes(); void DeleteDepotHighlightOfVehicle(const Vehicle *v); diff --git a/src/economy.cpp b/src/economy.cpp index 3d724f408c..1e7e92eae7 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -820,8 +820,8 @@ bool AddInflation(bool check_year) */ void RecomputePrices() { - /* Setup maximum loan */ - _economy.max_loan = ((uint64)_settings_game.difficulty.max_loan * _economy.inflation_prices >> 16) / 50000 * 50000; + /* Setup maximum loan as a rounded down multiple of LOAN_INTERVAL. */ + _economy.max_loan = ((uint64)_settings_game.difficulty.max_loan * _economy.inflation_prices >> 16) / LOAN_INTERVAL * LOAN_INTERVAL; /* Setup price bases */ for (Price i = PR_BEGIN; i < PR_END; i++) { diff --git a/src/error.h b/src/error.h index 2d4a194cff..51776081b2 100644 --- a/src/error.h +++ b/src/error.h @@ -10,6 +10,7 @@ #ifndef ERROR_H #define ERROR_H +#include #include "strings_type.h" #include "company_type.h" #include "core/geometry_type.hpp" @@ -58,6 +59,10 @@ public: void CopyOutDParams(); }; +/** Define a queue with errors. */ +typedef std::list ErrorList; + +void ScheduleErrorMessage(ErrorList &datas); void ScheduleErrorMessage(const ErrorMessageData &data); void ShowErrorMessage(StringID summary_msg, StringID detailed_msg, WarningLevel wl, int x = 0, int y = 0, const GRFFile *textref_stack_grffile = nullptr, uint textref_stack_size = 0, const uint32 *textref_stack = nullptr, StringID extra_msg = INVALID_STRING_ID); diff --git a/src/error_gui.cpp b/src/error_gui.cpp index d765358fa4..adafeb5168 100644 --- a/src/error_gui.cpp +++ b/src/error_gui.cpp @@ -176,10 +176,8 @@ void ErrorMessageData::SetDParamStr(uint n, const std::string &str) this->SetDParamStr(n, str.c_str()); } -/** Define a queue with errors. */ -typedef std::list ErrorList; /** The actual queue with errors. */ -ErrorList _error_list; +static ErrorList _error_list; /** Whether the window system is initialized or not. */ bool _window_system_initialized = false; diff --git a/src/fileio.cpp b/src/fileio.cpp index 838527da1f..188689b211 100644 --- a/src/fileio.cpp +++ b/src/fileio.cpp @@ -69,6 +69,8 @@ TarFileList _tar_filelist[NUM_SUBDIRS]; typedef std::map TarLinkList; static TarLinkList _tar_linklist[NUM_SUBDIRS]; ///< List of directory links +extern bool FiosIsValidFile(const char *path, const struct dirent *ent, struct stat *sb); + /** * Checks whether the given search path is a valid search path * @param sp the search path to check @@ -1160,8 +1162,6 @@ static bool MatchesExtension(const char *extension, const char *filename) */ static uint ScanPath(FileScanner *fs, const char *extension, const char *path, size_t basepath_length, bool recursive) { - extern bool FiosIsValidFile(const char *path, const struct dirent *ent, struct stat *sb); - uint num = 0; struct stat sb; struct dirent *dirent; diff --git a/src/fios.h b/src/fios.h index 064ca798e8..999632d313 100644 --- a/src/fios.h +++ b/src/fios.h @@ -130,6 +130,9 @@ std::string FiosMakeSavegameName(const char *name); FiosType FiosGetSavegameListCallback(SaveLoadOperation fop, const std::string &file, const char *ext, char *title, const char *last); +void ScanScenarios(); +const char *FindScenario(const ContentInfo *ci, bool md5sum); + /** * A savegame name automatically numbered. */ diff --git a/src/fontcache.cpp b/src/fontcache.cpp index 533d6b6892..033e7b8976 100644 --- a/src/fontcache.cpp +++ b/src/fontcache.cpp @@ -116,6 +116,15 @@ void SetFont(FontSize fontsize, const std::string& font, uint size, bool aa) if (_save_config) SaveToConfig(); } +#ifdef WITH_FREETYPE +extern void LoadFreeTypeFont(FontSize fs); +extern void UninitFreeType(); +#elif defined(_WIN32) +extern void LoadWin32Font(FontSize fs); +#elif defined(WITH_COCOA) +extern void LoadCoreTextFont(FontSize fs); +#endif + /** * (Re)initialize the font cache related things, i.e. load the non-sprite fonts. * @param monospace Whether to initialise the monospace or regular fonts. @@ -129,13 +138,10 @@ void InitFontCache(bool monospace) if (fc->HasParent()) delete fc; #ifdef WITH_FREETYPE - extern void LoadFreeTypeFont(FontSize fs); LoadFreeTypeFont(fs); #elif defined(_WIN32) - extern void LoadWin32Font(FontSize fs); LoadWin32Font(fs); #elif defined(WITH_COCOA) - extern void LoadCoreTextFont(FontSize fs); LoadCoreTextFont(fs); #endif } @@ -152,7 +158,6 @@ void UninitFontCache() } #ifdef WITH_FREETYPE - extern void UninitFreeType(); UninitFreeType(); #endif /* WITH_FREETYPE */ } diff --git a/src/framerate_type.h b/src/framerate_type.h index 1fa6e35ac8..f0116d8182 100644 --- a/src/framerate_type.h +++ b/src/framerate_type.h @@ -121,5 +121,6 @@ public: }; void ShowFramerateWindow(); +void ProcessPendingPerformanceMeasurements(); #endif /* FRAMERATE_TYPE_H */ diff --git a/src/game/game.hpp b/src/game/game.hpp index 98f436d397..fffa04fa05 100644 --- a/src/game/game.hpp +++ b/src/game/game.hpp @@ -12,10 +12,6 @@ #include "../core/string_compare_type.hpp" #include "game_scanner.hpp" -#include - -/** A list that maps AI names to their AIInfo object. */ -typedef std::map ScriptInfoList; #include "../script/api/script_event_types.hpp" diff --git a/src/game/game_core.cpp b/src/game/game_core.cpp index 18412ad016..6467309963 100644 --- a/src/game/game_core.cpp +++ b/src/game/game_core.cpp @@ -96,7 +96,7 @@ cur_company.Restore(); - InvalidateWindowData(WC_AI_DEBUG, 0, -1); + InvalidateWindowData(WC_SCRIPT_DEBUG, 0, -1); } /* static */ void Game::Uninitialize(bool keepConfig) @@ -198,9 +198,9 @@ Game::scanner_library->RescanDir(); ResetConfig(); - InvalidateWindowData(WC_AI_LIST, 0, 1); - SetWindowClassesDirty(WC_AI_DEBUG); - InvalidateWindowClassesData(WC_AI_SETTINGS); + InvalidateWindowData(WC_SCRIPT_LIST, 0, 1); + SetWindowClassesDirty(WC_SCRIPT_DEBUG); + InvalidateWindowClassesData(WC_SCRIPT_SETTINGS); InvalidateWindowClassesData(WC_GAME_OPTIONS); } diff --git a/src/game/game_gui.cpp b/src/game/game_gui.cpp index dc79bf7720..7e151f91f5 100644 --- a/src/game/game_gui.cpp +++ b/src/game/game_gui.cpp @@ -8,37 +8,21 @@ /** @file game_gui.cpp %Window for configuring the Game Script */ #include "../stdafx.h" -#include "../table/sprites.h" #include "../error.h" #include "../settings_gui.h" #include "../querystring_gui.h" -#include "../stringfilter_type.h" -#include "../company_base.h" -#include "../company_gui.h" -#include "../strings_func.h" #include "../window_func.h" -#include "../window_type.h" -#include "../gfx_func.h" -#include "../command_func.h" #include "../network/network.h" -#include "../settings_func.h" #include "../network/network_content.h" -#include "../textfile_gui.h" -#include "../widgets/dropdown_type.h" #include "../widgets/dropdown_func.h" -#include "../hotkeys.h" -#include "../core/geometry_func.hpp" -#include "../guitimer_func.h" +#include "../settings_type.h" +#include "game.hpp" #include "game_gui.hpp" -#include "../ai/ai_config.hpp" -#include "../ai/ai_gui.hpp" -#include "../widgets/game_widget.h" +#include "game_config.hpp" +#include "game_info.hpp" +#include "../script/script_gui.h" #include "../table/strings.h" -#include "../game/game.hpp" -#include "../game/game_config.hpp" -#include "../game/game_info.hpp" -#include "../game/game_instance.hpp" #include "../safeguards.h" @@ -98,7 +82,7 @@ bool UserIsAllowedToChangeGameScript() * Window to configure which GSs will start. */ struct GSConfigWindow : public Window { - ScriptConfig* gs_config; ///< The configuration we're modifying. + ScriptConfig *gs_config; ///< The configuration we're modifying. int line_height; ///< Height of a single GS-name line. int clicked_button; ///< The button we clicked. bool clicked_increase; ///< Whether we clicked the increase or decrease button. @@ -106,8 +90,8 @@ struct GSConfigWindow : public Window { bool closing_dropdown; ///< True, if the dropdown list is currently closing. GUITimer timeout; ///< Timeout for unclicking the button. int clicked_row; ///< The clicked row of settings. - Scrollbar* vscroll; ///< Cache of the vertical scrollbar. - typedef std::vector VisibleSettingsList; ///< typdef for a vector of script settings + Scrollbar *vscroll; ///< Cache of the vertical scrollbar. + typedef std::vector VisibleSettingsList; ///< typdef for a vector of script settings VisibleSettingsList visible_settings; ///< List of visible GS settings GSConfigWindow() : Window(&_gs_config_desc), @@ -128,7 +112,7 @@ struct GSConfigWindow : public Window { ~GSConfigWindow() { - DeleteWindowByClass(WC_AI_LIST); + DeleteWindowByClass(WC_SCRIPT_LIST); } /** @@ -140,7 +124,7 @@ struct GSConfigWindow : public Window { { visible_settings.clear(); - for (const auto& item : *this->gs_config->GetConfigList()) { + for (const auto &item : *this->gs_config->GetConfigList()) { bool no_hide = (item.flags & SCRIPTCONFIG_DEVELOPER) == 0; if (no_hide || _settings_client.gui.ai_developer_tools) { visible_settings.push_back(&item); @@ -150,7 +134,7 @@ struct GSConfigWindow : public Window { this->vscroll->SetCount((int)this->visible_settings.size()); } - void UpdateWidgetSize(int widget, Dimension* size, const Dimension& padding, Dimension* fill, Dimension* resize) override + void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override { switch (widget) { case WID_GSC_SETTINGS: @@ -176,7 +160,7 @@ struct GSConfigWindow : public Window { return UserIsAllowedToChangeGameScript() || Game::GetInstance() != nullptr; } - void DrawWidget(const Rect& r, int widget) const override + void DrawWidget(const Rect &r, int widget) const override { switch (widget) { case WID_GSC_GSLIST: { @@ -192,7 +176,7 @@ struct GSConfigWindow : public Window { break; } case WID_GSC_SETTINGS: { - ScriptConfig* config = this->gs_config; + ScriptConfig *config = this->gs_config; VisibleSettingsList::const_iterator it = this->visible_settings.begin(); int i = 0; for (; !this->vscroll->IsVisible(i); i++) it++; @@ -206,7 +190,7 @@ struct GSConfigWindow : public Window { int button_y_offset = (this->line_height - SETTING_BUTTON_HEIGHT) / 2; int text_y_offset = (this->line_height - FONT_HEIGHT_NORMAL) / 2; for (; this->vscroll->IsVisible(i) && it != visible_settings.end(); i++, it++) { - const ScriptConfigItem& config_item = **it; + const ScriptConfigItem &config_item = **it; int current_value = config->GetSetting((config_item).name); bool editable = this->IsEditableItem(config_item); @@ -214,14 +198,8 @@ struct GSConfigWindow : public Window { TextColour colour; uint idx = 0; if (StrEmpty(config_item.description)) { - if (!strcmp(config_item.name, "start_date")) { - /* Build-in translation */ - str = STR_AI_SETTINGS_START_DELAY; - colour = TC_LIGHT_BLUE; - } else { - str = STR_JUST_STRING; - colour = TC_ORANGE; - } + str = STR_JUST_STRING; + colour = TC_ORANGE; } else { str = STR_AI_SETTINGS_SETTING; colour = TC_LIGHT_BLUE; @@ -275,12 +253,12 @@ struct GSConfigWindow : public Window { switch (widget) { case WID_GSC_GSLIST: { this->InvalidateData(); - if (click_count > 1 && UserIsAllowedToChangeGameScript()) ShowAIListWindow((CompanyID)OWNER_DEITY); + if (click_count > 1 && UserIsAllowedToChangeGameScript()) ShowScriptListWindow((CompanyID)OWNER_DEITY); break; } case WID_GSC_CHANGE: // choose other Game Script - ShowAIListWindow((CompanyID)OWNER_DEITY); + ShowScriptListWindow((CompanyID)OWNER_DEITY); break; case WID_GSC_CONTENT_DOWNLOAD: @@ -384,7 +362,7 @@ struct GSConfigWindow : public Window { } } - void OnQueryTextFinished(char* str) override + void OnQueryTextFinished(char *str) override { if (StrEmpty(str)) return; int32 value = atoi(str); diff --git a/src/game/game_instance.cpp b/src/game/game_instance.cpp index 52e819ce71..9a263abe83 100644 --- a/src/game/game_instance.cpp +++ b/src/game/game_instance.cpp @@ -13,7 +13,7 @@ #include "../script/squirrel_class.hpp" #include "../script/script_storage.hpp" -#include "../ai/ai_gui.hpp" +#include "../script/script_gui.h" #include "game_config.hpp" #include "game_info.hpp" #include "game_instance.hpp" @@ -66,7 +66,7 @@ void GameInstance::Died() { ScriptInstance::Died(); - ShowAIDebugWindow(OWNER_DEITY); + ShowScriptDebugWindow(OWNER_DEITY); const GameInfo *info = Game::GetInfo(); if (info != nullptr) { diff --git a/src/goal.cpp b/src/goal.cpp index 63fdd45895..356f3754c1 100644 --- a/src/goal.cpp +++ b/src/goal.cpp @@ -234,19 +234,23 @@ CommandCost CmdSetGoalCompleted(TileIndex tile, DoCommandFlag flags, uint32 p1, * @param flags type of operation * @param p1 various bitstuffed elements * - p1 = (bit 0 - 15) - Unique ID to use for this question. - * - p1 = (bit 16 - 31) - Company or client for which this question is. * @param p2 various bitstuffed elements * - p2 = (bit 0 - 17) - Buttons of the question. * - p2 = (bit 29 - 30) - Question type. * - p2 = (bit 31) - Question target: 0 - company, 1 - client. + * @param p3 various bitstuffed elements + * - p3 = (bit 0 - 31) - Company or client for which this question is. * @param text Text of the question. * @return the cost of this operation or an error */ -CommandCost CmdGoalQuestion(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) +CommandCost CmdGoalQuestion(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, uint64 p3, const char *text, const CommandAuxiliaryBase *aux_data) { uint16 uniqueid = (uint16)GB(p1, 0, 16); - CompanyID company = (CompanyID)GB(p1, 16, 8); - ClientID client = (ClientID)GB(p1, 16, 16); + CompanyID company = (CompanyID)GB(p3, 0, 32); + ClientID client = (ClientID)GB(p3, 0, 32); + + static_assert(sizeof(uint32) >= sizeof(CompanyID)); + static_assert(sizeof(uint32) >= sizeof(ClientID)); static_assert(GOAL_QUESTION_BUTTON_COUNT < 29); uint32 button_mask = GB(p2, 0, GOAL_QUESTION_BUTTON_COUNT); diff --git a/src/goal_type.h b/src/goal_type.h index 5bbd8c258c..f8b8030941 100644 --- a/src/goal_type.h +++ b/src/goal_type.h @@ -32,11 +32,11 @@ enum GoalType : byte { GT_STORY_PAGE, ///< Destination is a story page }; -typedef uint32 GoalTypeID; ///< Contains either tile, industry ID, town ID or company ID (or INVALID_GOALTYPE) -static const GoalTypeID INVALID_GOALTYPE = 0xFFFFFFFF; ///< Invalid/unknown index of GoalType +typedef uint32 GoalTypeID; ///< Contains either tile, industry ID, town ID, company ID, or story page ID typedef uint16 GoalID; ///< ID of a goal struct Goal; +static const GoalID INVALID_GOAL = 0xFFFF; ///< Constant representing a non-existing goal. extern GoalID _new_goal_id; diff --git a/src/industry_gui.cpp b/src/industry_gui.cpp index c6082de848..41f8ed08ad 100644 --- a/src/industry_gui.cpp +++ b/src/industry_gui.cpp @@ -91,6 +91,7 @@ struct CargoSuffix { char text[512]; ///< Cargo suffix text. }; +extern void GenerateIndustries(); static void ShowIndustryCargoesWindow(IndustryType id); /** @@ -620,7 +621,6 @@ public: if (Town::GetNumItems() == 0) { ShowErrorMessage(STR_ERROR_CAN_T_GENERATE_INDUSTRIES, STR_ERROR_MUST_FOUND_TOWN_FIRST, WL_INFO); } else { - extern void GenerateIndustries(); Backup old_generating_world(_generating_world, true, FILE_LINE); BasePersistentStorageArray::SwitchMode(PSM_ENTER_GAMELOOP); GenerateIndustries(); diff --git a/src/lang/afrikaans.txt b/src/lang/afrikaans.txt index 4ab3a1459e..9d78a68472 100644 --- a/src/lang/afrikaans.txt +++ b/src/lang/afrikaans.txt @@ -1156,6 +1156,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Regs STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maksimum aanvanklike lening: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maksimum bedrag wat 'n maatskappy kan leen (sonder die inagneming van inflasie) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Rentekoers: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Lening rentekoers: beheer ook inflasie indien aangeskakel @@ -3085,7 +3086,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Waarskuwing: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Fout: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Fataal: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}'n Fataale NewGRF fout het gebeur:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} sal nie met die TTDPatch uitgawe rapporteer deur OpenTTD werk nie. STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} is vir die {STRING} uitgawe van TTD. STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} is onderwerp om saam met {STRING} gebruik te word @@ -4304,7 +4304,7 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Volledig STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Hoogtekaart-skermkiekie STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Minimap-skermkiekie -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :AI STR_AI_SETTINGS_CLOSE :{BLACK}Maak toe STR_AI_SETTINGS_RESET :{BLACK}Herstel diff --git a/src/lang/arabic_egypt.txt b/src/lang/arabic_egypt.txt index 2e9b691539..c3b1470927 100644 --- a/src/lang/arabic_egypt.txt +++ b/src/lang/arabic_egypt.txt @@ -227,6 +227,7 @@ STR_UNITS_FORCE_METRIC :{COMMA}{NBSP}ك STR_UNITS_FORCE_SI :{COMMA}{NBSP} كيلو نيوتن STR_UNITS_HEIGHT_IMPERIAL :{COMMA}{NBSP} قدم +STR_UNITS_HEIGHT_METRIC :{COMMA}{NBSP}م STR_UNITS_HEIGHT_SI :{COMMA}{NBSP} متر # Common window strings @@ -942,6 +943,7 @@ STR_GAME_OPTIONS_CURRENCY_KRW :وون كوري STR_GAME_OPTIONS_CURRENCY_ZAR :راند جنوب أفريقيا (ZAR) STR_GAME_OPTIONS_CURRENCY_CUSTOM :مخصص ... STR_GAME_OPTIONS_CURRENCY_GEL :(GEL) لاري جورجي +STR_GAME_OPTIONS_CURRENCY_NTD :الدولار التايواني الجديد (NTD) STR_GAME_OPTIONS_CURRENCY_CNY :(CNY) الرنمينبي الصيني STR_GAME_OPTIONS_CURRENCY_HKD :(HKD) دولار هونج كونج STR_GAME_OPTIONS_CURRENCY_INR :الروبية الهندية (INR) @@ -972,6 +974,7 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}تسري STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}اخترهذا المربع للسماح لـ OpenTTD بمحاولة استخدام تسريع الأجهزة. سيتم تطبيق الإعداد الذي تم تغييره فقط عند إعادة تشغيل اللعبة STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}لن يعمل الإعداد إلا بعد إعادة تشغيل اللعبة +STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}حدد هذا المربع لمزامنة الشاشة (v-sync). سيتم تطبيق الإعداد الذي تم تغييره فقط عند إعادة تشغيل اللعبة. يعمل فقط مع تمكين تسريع الأجهزة (hardware acceleration) @@ -1108,6 +1111,7 @@ STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}مدد STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}إسحب الكل STR_CONFIG_SETTING_RESET_ALL :{BLACK}اعادة ضبط جميع القيم STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT :(لا يوجد تفسير متوفر) +STR_CONFIG_SETTING_RESET_ALL_CONFIRMATION_DIALOG_CAPTION :{WHITE}تحذير! STR_CONFIG_SETTING_RESTRICT_CATEGORY :{BLACK} فئة: STR_CONFIG_SETTING_RESTRICT_TYPE :{BLACK}نوع: @@ -1145,9 +1149,11 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_LEFT :يسار STR_CONFIG_SETTING_HORIZONTAL_POS_CENTER :متوسط STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :يمين +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :سعر الفائدة على القرض يتحكم أيضًا في التضخم ، إذا تم تمكينه +STR_CONFIG_SETTING_RUNNING_COSTS_HELPTEXT :تحديد مستوى تكاليف الصيانة والتشغيل للمركبات والبنية التحتية STR_CONFIG_SETTING_CONSTRUCTION_SPEED ::سرعة البناء {STRING} @@ -1197,6 +1203,7 @@ STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS :السماح ب STR_CONFIG_SETTING_INFLATION :التضخم: {STRING} STR_CONFIG_SETTING_INFLATION_HELPTEXT :تمكين التضخم في الاقتصاد ، حيث ترتفع التكاليف بشكل أسرع قليلاً من المدفوعات +STR_CONFIG_SETTING_MAX_BRIDGE_LENGTH :أقصى طول للجسر: {STRING} STR_CONFIG_SETTING_MAX_BRIDGE_HEIGHT_HELPTEXT :الارتفاع الأقصى لبناء الجسور @@ -1393,6 +1400,7 @@ STR_CONFIG_SETTING_SCROLLWHEEL_OFF :عدم استخ STR_CONFIG_SETTING_OSK_ACTIVATION :كيبورد على الشاشة: {STRING} ###length 4 STR_CONFIG_SETTING_OSK_ACTIVATION_DISABLED :غير مفعل +STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :نقرة واحدة (عند التركيز) ###length 3 STR_CONFIG_SETTING_USE_RELAY_SERVICE_ALLOW :سماح @@ -1483,6 +1491,7 @@ STR_CONFIG_SETTING_MAX_AIRCRAFT_HELPTEXT :الحد الأ STR_CONFIG_SETTING_MAX_SHIPS :الحد الأعلى لعدد السفن لكل شركة: {STRING} STR_CONFIG_SETTING_AI_BUILDS_TRAINS :حظر القطارات على الحاسوب: {STRING} +STR_CONFIG_SETTING_AI_BUILDS_TRAINS_HELPTEXT :يؤدي تمكين هذا الإعداد إلى جعل بناء القطارات مستحيلًا لللاعب الآلي STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES :حظر العربات على الكمبيوتر: {STRING} @@ -1659,23 +1668,25 @@ STR_CONFIG_SETTING_SHORT_PATH_SATURATION :تشبع الم STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY :وحدات السرعة: {STRING} ###length 4 -STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :(متري (كم / ساعة +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :إمبراطوري (ميل/ساعة) +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :متري (كم / ساعة) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :متري (م / ثانية) STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :وحدات الطاقة في السيارة: {STRING} ###length 3 ###length 3 -STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_METRIC :(متري (طن +STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_METRIC :متري (طن) ###length 3 STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE ::وحدات جهد الجر {STRING} ###length 3 +STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_METRIC :متري (كغ - قوة) ###length 3 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :إمبراطوري (قدم) -STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :م) متري) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :متري (م) STR_CONFIG_SETTING_GRAPHICS :رسوميات {ORANGE} STR_CONFIG_SETTING_SOUND :{ORANGE}الصوت @@ -1788,6 +1799,7 @@ STR_CHEAT_CHANGE_COMPANY :{LTBLUE}الع STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}الجرافة السحرية - لازالة المصانع و الاجسام غير القابلة للازالة.{ORANGE}{STRING} STR_CHEAT_CROSSINGTUNNELS :{LTBLUE}يمكن للانفاق ان تتقاطع: {ORANGE}{STRING} STR_CHEAT_NO_JETCRASH :{LTBLUE}الطائرات النفاثه لا تتحطم (كثيراً) فى المطارات الصغيره: {ORANGE}{STRING} +STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT :{WHITE}تعدبل أقصى ارتفاع لتضاريس الخريطة STR_CHEAT_CHANGE_DATE :{LTBLUE}عدل التاريخ {ORANGE} {DATE_SHORT} STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}غير السنة الحالية STR_CHEAT_SETUP_PROD :{LTBLUE}تفعيل تغيير قيمة الانتاج: {ORANGE}{STRING} @@ -1984,6 +1996,7 @@ STR_NETWORK_COMPANY_LIST_SPECTATE :شاهد # Network client list STR_NETWORK_CLIENT_LIST_CAPTION :{WHITE}اللاعبون عبر الإنترنت STR_NETWORK_CLIENT_LIST_SERVER_NAME :{BLACK}الاسم +STR_NETWORK_CLIENT_LIST_PLAYER_NAME :{BLACK}الاسم STR_NETWORK_CLIENT_LIST_SPECTATORS :المشاهدين STR_NETWORK_CLIENT_LIST_NEW_COMPANY :(شركة جديدة) @@ -2047,6 +2060,7 @@ STR_NETWORK_ERROR_KICKED :{WHITE}لقد STR_NETWORK_ERROR_KICK_MESSAGE :{WHITE}السبب: {STRING} STR_NETWORK_ERROR_CHEATER :{WHITE}الغش ليس مسموحا به في هذه اللعبة STR_NETWORK_ERROR_TOO_MANY_COMMANDS :{WHITE}أنت تقوم بإرسال العديد من الأوامر للخادم +STR_NETWORK_ERROR_INVALID_CLIENT_NAME :{WHITE}اسم اللاعب الخاص بك غير صالح STR_NETWORK_ERROR_CLIENT_GUI_LOST_CONNECTION_CAPTION :{WHITE}احتمال فقد الاتصال STR_NETWORK_ERROR_CLIENT_GUI_LOST_CONNECTION :{WHITE}اخر {NUM} ثواني لم تصل بيانات من السيرفر @@ -2462,6 +2476,7 @@ STR_FUND_INDUSTRY_CAPTION :{WHITE}مول STR_FUND_INDUSTRY_SELECTION_TOOLTIP :{BLACK}اختر المصنع المناسب من القائمة STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES :{BLACK}إنشاء المصانع العشوائية STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_TOOLTIP :{BLACK}غطي الخريطة عشوائيا بالمصانع +STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_CAPTION :{WHITE}إنشاء المصانع العشوائية STR_FUND_INDUSTRY_INDUSTRY_BUILD_COST :{BLACK}التكلفة: {YELLOW}{CURRENCY_LONG} STR_FUND_INDUSTRY_PROSPECT_NEW_INDUSTRY :{BLACK} الاحتمالية STR_FUND_INDUSTRY_BUILD_NEW_INDUSTRY :{BLACK}بناء @@ -2627,6 +2642,7 @@ STR_FRAMERATE_GAMESCRIPT :{BLACK} مخط STR_FRAMERATE_AI :{BLACK} AI {NUM} {STRING} ###length 15 +STR_FRAMETIME_CAPTION_GAMELOOP :تكرارات اللعبة STR_FRAMETIME_CAPTION_GL_TRAINS : تكتكة القطار STR_FRAMETIME_CAPTION_GL_LINKGRAPH :تأخر ارتباط الرسم البياني STR_FRAMETIME_CAPTION_SOUND :اختلاط الصوت @@ -2848,6 +2864,7 @@ STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}حرك ###length 2 +STR_SPRITE_ALIGNER_CROSSHAIR :{BLACK}الخطوت المتقاطعة STR_SPRITE_ALIGNER_OFFSETS_REL :{BLACK}الازاحة (X): {NUM}، الازاحة (Y): {NUM} (نسبي) STR_SPRITE_ALIGNER_PICKER_BUTTON :{BLACK}اختر عفريتة @@ -2860,7 +2877,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED} تحذير: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED} خطأ: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED} خطأ قاتل: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}حدث خظأ في NewGRF لا يمكن اصلاحة:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} لن يعمل مع اصدار الباتش المسجل في النسخة المفتوحة STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} يعمل مع {STRING} اصدار من TTD. STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} مصمم ليستخدم مع {STRING} @@ -3014,9 +3030,11 @@ STR_GOAL_QUESTION_CAPTION_ERROR :{YELLOW}خطا # Goal Question button list ###length 18 +STR_GOAL_QUESTION_BUTTON_OK :موافقة STR_GOAL_QUESTION_BUTTON_NO :لا STR_GOAL_QUESTION_BUTTON_YES :نعم STR_GOAL_QUESTION_BUTTON_RETRY :إعادة المحاولة +STR_GOAL_QUESTION_BUTTON_CONTINUE :الاستمرار STR_GOAL_QUESTION_BUTTON_RESTART :إعادة تشغيل STR_GOAL_QUESTION_BUTTON_POSTPONE :تأجيل STR_GOAL_QUESTION_BUTTON_SURRENDER :استسلام @@ -3217,6 +3235,7 @@ STR_INDUSTRY_VIEW_TRANSPORTED :{YELLOW}{CARGO_ STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}وسط الشاشة على المصنع STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}نسبة الانتاج: {YELLOW}{COMMA}% +STR_INDUSTRY_VIEW_PRODUCES_N_CARGO :{BLACK}ينتج: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_REQUIRES :{BLACK}:يتطلب STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} تنتظر{STRING} @@ -3330,11 +3349,13 @@ STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT :{BLACK} الع STR_PURCHASE_INFO_REFITTABLE_TO :{BLACK}يمكن تعديلها الى: {GOLD}{STRING} STR_PURCHASE_INFO_ALL_TYPES :جميع انواع الحمولة STR_PURCHASE_INFO_NONE :بدون +STR_PURCHASE_INFO_ENGINES_ONLY :محركات فقط STR_PURCHASE_INFO_ALL_BUT :الكل الا {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}تأثير الجذب القصى: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}نوع الطائرة:{GOLD}{STRING} ###length 3 +STR_CARGO_TYPE_FILTER_NONE :لا شيء ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}قائمة اختيار القطارات - اضغط على العربة لعرض معلوماتها @@ -3536,6 +3557,7 @@ STR_REPLACE_TRAM_VEHICLES :مركبات ا STR_REPLACE_REMOVE_WAGON :{BLACK} إزالة العربة ({STRING}): {ORANGE}{STRING} STR_REPLACE_REMOVE_WAGON_HELP :{BLACK} المحافظة على طول القطار بازالة عربات ابتداء من المقدمة عند التبديل - عندما يكون التبدل ينتج قطارا اطول. +STR_REPLACE_REMOVE_WAGON_GROUP_HELP :{STRING}. Ctrl + Click للتطبيق أيضًا على المجموعات الفرعية # Vehicle view STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE} @@ -3814,6 +3836,7 @@ STR_ORDER_REFIT_STOP_ORDER :هيئت الى STR_ORDER_STOP_ORDER :توقف STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING} +STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(لا يمكن استخدام المحطة){POP_COLOUR} {STRING} {STATION} {STRING} STR_ORDER_IMPLICIT :(تلقائى) @@ -3953,7 +3976,7 @@ STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW} شاش # AI configuration window STR_AI_CONFIG_CAPTION_AI :{WHITE}اعدادات االذكاء الاصطناعي STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}تكوين مخطوط اللعبة -STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}مخطوطات اللعبة الذي سيتم تحميله في اللعبة التالية +STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}النص البرمجي الخاص باللعبة الذي سيتم تحميله في اللعبة التالية STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}الذكاء الاصطناعي الذي سيتم تحميله في اللعبة التالية STR_AI_CONFIG_HUMAN_PLAYER :لاعب انساني STR_AI_CONFIG_RANDOM_AI :ذكاء صناعي عشوائي @@ -3969,6 +3992,7 @@ STR_AI_CONFIG_AI :{SILVER} الذ STR_AI_CONFIG_CHANGE_AI :الذكاء الاصطناعي STR_AI_CONFIG_CHANGE_GAMESCRIPT :مخطوط اللعبة +STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}تحميل نص برمجي آخر STR_AI_CONFIG_CONFIGURE :{BLACK} اعداد STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK} اعداد خواص الذكاء الصناعي @@ -3984,10 +4008,11 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK} اخت STR_AI_LIST_CANCEL :{BLACK} الغاء STR_AI_LIST_CANCEL_TOOLTIP :{BLACK} لا تغير الذكاء الصناعي +STR_SCREENSHOT_SCREENSHOT :{BLACK}لقطة شاشة عادية STR_SCREENSHOT_ZOOMIN_SCREENSHOT :{BLACK}التقط لقطة شاشة كاملة STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}صور الخاريطة الكاملة -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CLOSE :{BLACK} اغلاق STR_AI_SETTINGS_RESET :{BLACK} اعادة ضبط STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4240,6 +4265,7 @@ STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE STR_ERROR_AUTOREPLACE_NOTHING_TO_DO :{WHITE}لا يوجد نظام مطبق للتبديل/ التجديد STR_ERROR_AUTOREPLACE_MONEY_LIMIT :(حدود التكلفة للتبديل) STR_ERROR_AUTOREPLACE_INCOMPATIBLE_CARGO :{WHITE}العربة الجديدة لا تستطيع حمل {STRING} +STR_ERROR_AUTOREPLACE_INCOMPATIBLE_REFIT :{WHITE}لا يمكن تجديد السيارة الجديدة بالترتيب {NUM} # Rail construction errors STR_ERROR_IMPOSSIBLE_TRACK_COMBINATION :{WHITE}تركيبة سكك غير صالحة diff --git a/src/lang/basque.txt b/src/lang/basque.txt index b75aad90b3..70a0600210 100644 --- a/src/lang/basque.txt +++ b/src/lang/basque.txt @@ -1119,6 +1119,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Eskuina STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Gehienezko mailegua joko hasieran: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Konpainiek eskatu dezaketen gehienezko mailegua(inflazioa kontua hartu gabe) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Interes tasa: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Maileguen interes tasa; inflazioa ere kontrolatuko du, gaitzen bada @@ -2907,7 +2908,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Kontuz: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Akatsa {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Larria: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}NewGRF-an akats larria gertatu da:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} ez du funtzionatuko OpenTTD-k esandakoTTDPatch bertsioarekin STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} {STRING} TTD bertsioarentzat da STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} {STRING}arekin erabiltzeko diseinatua izan da @@ -4049,7 +4049,7 @@ STR_AI_LIST_CANCEL :{BLACK}Ezeztatu STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Ez aldatu script-a -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :IA STR_AI_SETTINGS_CLOSE :{BLACK}Itxi STR_AI_SETTINGS_RESET :{BLACK}Berrabiarazi diff --git a/src/lang/belarusian.txt b/src/lang/belarusian.txt index d5dd24d623..1ccb2691ce 100644 --- a/src/lang/belarusian.txt +++ b/src/lang/belarusian.txt @@ -1467,6 +1467,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :правару STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Максымальная сума пазыкі: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Максымальная сума пазыкі для кампаніі (без уліку інфляцыі) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Адсоткавая стаўка: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Адсоткавая стаўка па пазыках; таксама кантралюе інфляцыю, калі тая ўключана @@ -3435,8 +3436,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Увага: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Памылка: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Крытычная памылка: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Памылка пры рабоце з NewGRF:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}Памылка, звязаная з модулем NewGRF:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} ня будзе працаваць з вэрсіяй TTDPatch, паведламленай OpenTTD. STR_NEWGRF_ERROR_DOS_OR_WINDOWS :Файл {1:STRING} патрабуе {STRING}-вэрсію TTD. STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} зроблены для выкарыстаньня сумесна з {STRING} @@ -4661,7 +4660,7 @@ STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Не з STR_SCREENSHOT_ZOOMIN_SCREENSHOT :{BLACK}Бачная вобласць у максімальным набліжэнні -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :ШI STR_AI_SETTINGS_CLOSE :{BLACK}Закрыць STR_AI_SETTINGS_RESET :{BLACK}Ськід diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index 936490bb4f..07c400fb3a 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -1219,6 +1219,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Direita STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Empréstimo Inicial Máximo: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Quantia máxima a ser emprestada para uma companhia (sem levar em conta a inflação) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Taxa de Juros: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Juros de empréstimo; também controla inflação, se ativado @@ -1938,13 +1939,13 @@ STR_CONFIG_SETTING_LINKGRAPH_TIME :Demore {STRING} STR_CONFIG_SETTING_LINKGRAPH_TIME_HELPTEXT :Tempo tomado para cada recálculo de um componente de um gráfico. Quando um recálculo começa, um processo é criado e é executado por esse número de dias. Quanto menos dias você define, maior a chance do processo não terminar quando era para ter terminado. Nesse caso, o jogo irá parar até ele terminar ("lag"). Quanto maior você definir isso, mais tempo leva para a distribuição ser atualizada quando as rotas mudarem. STR_CONFIG_SETTING_DISTRIBUTION_PAX :Modo de distribuição para passageiros: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :"simétrico" significa que aproximadamente a mesma quantidade de passageiros será enviada da estação A para a estação B assim como de B para A. "assimétrico" significa que a quantidade de passageiros enviada em ambas as direções será arbitrária. "manual" significa que não haverá distribuição automática. +STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :"Simétrico" significa que aproximadamente o mesmo número de passageiros irá de uma estação A para uma estação B como de B para A. "Assimétrico" significa que um número arbitrário de passageiros pode ir em qualquer direção. "Manual" significa que não haverá distribuição automática para os passageiros. STR_CONFIG_SETTING_DISTRIBUTION_MAIL :Modo de distribuição para correios: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :"simétrico" significa que aproximadamente a mesma quantidade de correio será enviada da estação A para a estação B assim como de B para A. "assimétrico" significa que a quantidade de correio enviada em ambas as direções será arbitrária. "manual" significa que não haverá distribuição automática. +STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :"Simétrico" significa que aproximadamente a mesma quantidade de correspondência será enviada de uma estação A para uma estação B como de B para A. "Assimétrica" significa que quantidades arbitrárias de correspondência podem ser enviadas em qualquer direção. "Manual" significa que nenhuma distribuição automática ocorrerá por correio. STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED :Modo de distribuição para classe BLINDADOS de carga: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :A classe BLINDADO indica objetos de valor no clima temperado, diamantes no subtropical ou ouro no subártico. NewGRF's podem mudar isso. "simétrico" significa que aproximadamente a mesma quantidade de carga será enviada da estação A para a estação B assim como de B para A. "assimétrico" significa que quantidades de carga arbitrárias serão enviadas em ambas as direções. "manual" significa que não haverá distribuição automática. Para objetos de valor, sugere-se usar "assimétrico" ou "manual" para subártico, já que bancos não enviam ouro de volta a minas. Para temperado e subtropical você pode selecionar "simétrico", já que bancos trocam objetos de valor entre si. +STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :A classe de carga BLINDADA contém objetos de valor em clima temperado, diamantes em clima subtropical ou ouro em clima subártico. NewGRFs podem mudar isso. "Simétrica" significa que aproximadamente a mesma quantidade dessa carga será enviada de uma estação A para uma estação B como de B para A. "Assimétrica" significa que quantidades arbitrárias dessa carga podem ser enviadas em qualquer direção. "Manual" significa que não haverá distribuição automática para aquela carga. Recomenda-se definir isso como assimétrico ou manual ao jogar subártico ou subtropical, pois os bancos só recebem carga nesses climas. Para temperado, você também pode escolher simétrico, pois os bancos enviarão objetos de valor de volta ao banco de origem. STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :Modo de distribuição para outras classes de carga: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :"assimétrico" significa que quantidades de carga arbitrárias serão enviadas em ambas as direções. "manual" significa que não haverá distribuição automática. Você provavelmente irá querer usar "assimétrico" ou "manual". +STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :"Assimétrico" significa que quantidades arbitrárias de carga podem ser enviadas em qualquer direção. "Manual" significa que não haverá distribuição automática dessas cargas. ###length 3 STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :manual STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC :assimétrico @@ -2711,6 +2712,10 @@ STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}Aumentar STR_SELECT_RAIL_BRIDGE_CAPTION :{WHITE}Selecionar Ponte Ferroviária STR_SELECT_ROAD_BRIDGE_CAPTION :{WHITE}Selecionar Ponte Rodoviária STR_SELECT_BRIDGE_SELECTION_TOOLTIP :{BLACK}Seleção de ponte - clique na ponte desejada para construir +STR_SELECT_BRIDGE_INFO_NAME :{GOLD}{STRING} +STR_SELECT_BRIDGE_INFO_NAME_MAX_SPEED :{GOLD}{STRING},{} {VELOCITY} +STR_SELECT_BRIDGE_INFO_NAME_COST :{GOLD}{0:STRING},{} {WHITE}{2:CURRENCY_LONG} +STR_SELECT_BRIDGE_INFO_NAME_MAX_SPEED_COST :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY_LONG} STR_BRIDGE_NAME_SUSPENSION_STEEL :Suspensa, Aço STR_BRIDGE_NAME_GIRDER_STEEL :Vigas, Aço STR_BRIDGE_NAME_CANTILEVER_STEEL :Cantilever, Aço @@ -3362,8 +3367,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Atenção: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Erro: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Erro Fatal: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Um erro de NewGRF fatal ocorreu:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}Um erro NewGRF ocorreu:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} não irá funcionar com a versão do TTDPatch encontrada pelo OpenTTD STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} funciona na versão {STRING} de TTD STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} é projetado para ser usado com {2:STRING} @@ -4634,7 +4637,7 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Captura STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Captura de tela do mapa topográfico STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Captura de tela do minimapa -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :{WHITE}Parâmetros de IA STR_AI_SETTINGS_CLOSE :{BLACK}Fechar STR_AI_SETTINGS_RESET :{BLACK}Resetar diff --git a/src/lang/bulgarian.txt b/src/lang/bulgarian.txt index 136a96f64f..24b9950b2e 100644 --- a/src/lang/bulgarian.txt +++ b/src/lang/bulgarian.txt @@ -1135,6 +1135,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :дясно STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Максимален начален заем: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Максимално количество заем за компания (без отчитане на инфлацията) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Лихвен процент: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Лихвен процент на заемите; също така контролира инфлацията ако е разрешена @@ -2960,7 +2961,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Внимание: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Грешка: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Критично: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Настъпи фатална грешка в NewGRF:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} няма да работи с версията на TTDPatch указана от OpenTTD. STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} е за {STRING} версията на TTD. STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} е проектиран да работи с {STRING} @@ -4124,7 +4124,7 @@ STR_AI_LIST_CANCEL :{BLACK}Отме STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Не променяй AI -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :AI STR_AI_SETTINGS_CLOSE :{BLACK}Затвори STR_AI_SETTINGS_RESET :{BLACK}Рестартиране diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index b805caf356..ca6bbfe185 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -1219,6 +1219,9 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Dreta STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Préstec inicial màxim: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Quantitat màxima del préstec que pot demanar una companyia (sense tenir en compte la inflació) +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_VALUE :{CURRENCY_LONG} +###setting-zero-is-special +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_DISABLED :Sense préstec {RED}Fa falta un script de partida que doni els fons inicials STR_CONFIG_SETTING_INTEREST_RATE :Taxa d'interès: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Tipus d'interès dels préstecs; també controla la inflació, si està activada @@ -3368,8 +3371,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Alerta: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Error: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Fatal: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}S'ha produït un error fatal de NewGRF:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}S'ha produït un error relacionat amb els NewGRF:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} no funcionarà amb la versió TTDPatch informada per l'OpenTTD STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} és per a la versió {2:STRING} del TTD STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} està dissenyat per a fer-se servir amb {2:STRING} @@ -4640,8 +4641,10 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Captura STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Captura de pantalla del mapa d'alçades STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Captura de pantalla del minimapa -# AI Parameters -STR_AI_SETTINGS_CAPTION_AI :{WHITE}Paràmetres de la IA +# Script Parameters +STR_AI_SETTINGS_CAPTION :{WHITE}{STRING}Paràmetres +STR_AI_SETTINGS_CAPTION_AI :IA +STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Script de la partida STR_AI_SETTINGS_CLOSE :{BLACK}Tanca STR_AI_SETTINGS_RESET :{BLACK}Restableix STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} diff --git a/src/lang/chuvash.txt b/src/lang/chuvash.txt index 47c0a7f102..792c334fe3 100644 --- a/src/lang/chuvash.txt +++ b/src/lang/chuvash.txt @@ -589,6 +589,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_LEFT :Сулахай STR_CONFIG_SETTING_HORIZONTAL_POS_CENTER :Варринче STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Сылтӑмра +###setting-zero-is-special @@ -1602,7 +1603,7 @@ STR_AI_LIST_VERSION :{LTBLUE}Вер -# AI Parameters +# Script Parameters STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} diff --git a/src/lang/croatian.txt b/src/lang/croatian.txt index 90cce75575..77219685d1 100644 --- a/src/lang/croatian.txt +++ b/src/lang/croatian.txt @@ -1259,6 +1259,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Desno STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Najveći početni zajam: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Najveći iznos koji tvrtka može pozajmiti (ne uzimajući inflaciju u obzir) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Kamatna stopa: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Kamatna stopa zajmova; također kontrolira i inflaciju ako je uključena @@ -3254,7 +3255,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Upozorenje: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Greška: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Kobno: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Dogodila se kobna pogreška u NewGRF-u:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} neće raditi sa TTDPatch verzijom prijavljenom u OpenTTD STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} je za {STRING} verziju TTD-a. STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} je napravljen da se koristi sa {STRING} @@ -4489,7 +4489,7 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Slika ci STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Slika visinske mape STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Slika mini-mape -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :UI STR_AI_SETTINGS_CLOSE :{BLACK}Zatvori STR_AI_SETTINGS_RESET :{BLACK}Resetiraj diff --git a/src/lang/czech.txt b/src/lang/czech.txt index 9975517b82..c5991c5eed 100644 --- a/src/lang/czech.txt +++ b/src/lang/czech.txt @@ -1313,6 +1313,8 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :vpravo STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maximální půjčka: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Jak moc si může společnost půjčit (bez ohledu na inflaci) +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_VALUE :{CURRENCY_LONG} +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Výše úroků: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Výše úroků z půjček; rovněž ovlivňuje inflaci, pokud je zapnuta @@ -3990,8 +3992,8 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Varování: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Chyba: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Závažná chyba: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Vyskytla se kritická chyba v NewGRF:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}Došlo k chybě v NewGRF:{}{STRING} +STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}V NewGRF "{STRING}" se vyskytla kritická chyba:{}{STRING} +STR_NEWGRF_ERROR_POPUP :{WHITE}V NewGRF "{STRING}" došlo k chybě{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} nebude fungovat s verzí TTDPatche, kterou OpenTTD hlásí STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} je pro TTD verzi {2:STRING} STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} je navržen pro práci s {STRING} @@ -5265,8 +5267,10 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Snímek STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Snímek výškové mapy STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Snímek (náhledové) mapy světa -# AI Parameters +# Script Parameters +STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametry STR_AI_SETTINGS_CAPTION_AI :{WHITE}Parametry AI +STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Herní skript STR_AI_SETTINGS_CLOSE :{BLACK}Zavřít STR_AI_SETTINGS_RESET :{BLACK}Obnovit nastavení STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} diff --git a/src/lang/danish.txt b/src/lang/danish.txt index 428c18193e..a888663c8f 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -1194,6 +1194,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Højre STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maksimum startlån: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maksimumbeløb et selskab kan låne (uden at tage inflation i betragtning) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Lånerente: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Lånerente; kontrollerer også inflationen hvis aktiveret @@ -3310,8 +3311,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Advarsel: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Fejl: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Fatalt: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}En fatal NewGRF-fejl er opstået:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}Der er opstået en NewGRF-fejl:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} virker ikke med TTDPatch-versionen rapporteret af OpenTTD. STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} er beregnet til {STRING}-versionen af TTD. STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} er designet til brug sammen med {STRING} @@ -4559,7 +4558,7 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Fuldt ko STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Højdekort skærmbillede STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Minikort skærmbillede -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :AI STR_AI_SETTINGS_CLOSE :{BLACK}Luk STR_AI_SETTINGS_RESET :{BLACK}Nulstil diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index 520589e805..4d0eb47dfe 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -1218,6 +1218,9 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Rechts STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maximale beginlening: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maximaal bedrag dat een bedrijf kan lenen (zonder rekening te houden met de inflatie) +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_VALUE :{CURRENCY_LONG} +###setting-zero-is-special +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_DISABLED :Geen lening {RED}Spelscript vereist voor aanvankelijk saldo STR_CONFIG_SETTING_INTEREST_RATE :Rente van lening: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Percentage rente op lening; bepaald ook het inflatiecijfer wanneer ingeschakeld @@ -3367,8 +3370,8 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Waarschuwing: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Fout: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Fatale fout: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Een fatale NewGRF-fout is ontstaan:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}Er is een NewGRF-fout opgetreden:{}{STRING} +STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}De NewGRF "{STRING}" heeft een fatale fout veroorzaakt:{}{STRING} +STR_NEWGRF_ERROR_POPUP :{WHITE}De NewGRF "{STRING}" heeft een fout veroorzaakt:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} werkt niet met de TTDPatch-versie die is opgegeven door OpenTTD STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} is voor versie {2:STRING} van TTD STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} is ontwikkeld voor {2:STRING} @@ -4639,8 +4642,10 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Schermaf STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Schermafbeelding van de hoogtekaart STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Schermafbeelding van de minikaart -# AI Parameters +# Script Parameters +STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameters STR_AI_SETTINGS_CAPTION_AI :{WHITE}AI-parameters +STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Spelscript STR_AI_SETTINGS_CLOSE :{BLACK}Sluiten STR_AI_SETTINGS_RESET :{BLACK}Terugstellen STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} diff --git a/src/lang/english.txt b/src/lang/english.txt index 1ce6311940..d739d06e30 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1266,6 +1266,9 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Right STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maximum initial loan: {STRING2} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maximum amount a company can loan (without taking inflation into account) +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_VALUE :{CURRENCY_LONG} +###setting-zero-is-special +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_DISABLED :No loan {RED}Requires Game Script to provide initial funds STR_CONFIG_SETTING_INTEREST_RATE :Interest rate: {STRING2} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Loan interest rate; also controls inflation, if enabled @@ -4370,8 +4373,8 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{RAW_ST STR_NEWGRF_ERROR_MSG_WARNING :{RED}Warning: {SILVER}{RAW_STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Error: {SILVER}{RAW_STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Fatal: {SILVER}{RAW_STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}A fatal NewGRF error has occurred: {}{STRING7} -STR_NEWGRF_ERROR_POPUP :{WHITE}A NewGRF error has occurred: {}{STRING7} +STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}The NewGRF "{RAW_STRING}" has returned a fatal error: {}{STRING7} +STR_NEWGRF_ERROR_POPUP :{WHITE}The NewGRF "{RAW_STRING}" has returned an error: {}{STRING7} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:RAW_STRING} will not work with the TTDPatch version reported by OpenTTD STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:RAW_STRING} is for the {2:RAW_STRING} version of TTD STR_NEWGRF_ERROR_UNSET_SWITCH :{1:RAW_STRING} is designed to be used with {2:RAW_STRING} @@ -5929,7 +5932,7 @@ STR_TIMETABLE_CLEAR_SPEED :{BLACK}Clear Sp STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Clear the maximum travel speed of the highlighted order. Ctrl+Click clears the speed for all orders STR_TIMETABLE_RESET_LATENESS :{BLACK}Reset Late Counter -STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Reset the lateness counter, so the vehicle will be on time +STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Reset the lateness counter, so the vehicle will be on time. Ctrl+Click will reset the entire group so the latest vehicle will be on time and all others will be early STR_TIMETABLE_AUTOFILL :{BLACK}Autofill STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Fill the timetable automatically with the values from the next journey. Ctrl+Click to try to keep waiting times @@ -6087,8 +6090,10 @@ STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Minimap STR_SCREENSHOT_TOPOGRAPHY_SCREENSHOT :{BLACK}Topography screenshot STR_SCREENSHOT_INDUSTRY_SCREENSHOT :{BLACK}Industries screenshot -# AI Parameters -STR_AI_SETTINGS_CAPTION_AI :{WHITE}AI Parameters +# Script Parameters +STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameters +STR_AI_SETTINGS_CAPTION_AI :AI +STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Game Script STR_AI_SETTINGS_CLOSE :{BLACK}Close STR_AI_SETTINGS_RESET :{BLACK}Reset STR_AI_SETTINGS_SETTING :{RAW_STRING}: {ORANGE}{STRING1} diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index eebf3da0da..0842afb50d 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -1217,6 +1217,9 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Right STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maximum initial loan: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maximum amount a company can loan (without taking inflation into account) +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_VALUE :{CURRENCY_LONG} +###setting-zero-is-special +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_DISABLED :No loan {RED}Requires Game Script to provide initial funds STR_CONFIG_SETTING_INTEREST_RATE :Interest rate: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Loan interest rate; also controls inflation, if enabled @@ -3392,8 +3395,8 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Warning: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Error: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Fatal: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}A fatal NewGRF error has occurred:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}A NewGRF error has occurred:{}{STRING} +STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}The NewGRF "{STRING}" has returned a fatal error:{}{STRING} +STR_NEWGRF_ERROR_POPUP :{WHITE}The NewGRF "{STRING}" has returned an error:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} will not work with the TTDPatch version reported by OpenTTD STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} is for the {2:STRING} version of TTD STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} is designed to be used with {2:STRING} @@ -4664,8 +4667,10 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Whole ma STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Heightmap screenshot STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Minimap screenshot -# AI Parameters -STR_AI_SETTINGS_CAPTION_AI :{WHITE}AI Parameters +# Script Parameters +STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameters +STR_AI_SETTINGS_CAPTION_AI :AI +STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Game Script STR_AI_SETTINGS_CLOSE :{BLACK}Close STR_AI_SETTINGS_RESET :{BLACK}Reset STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index 62f9204946..7734379ab1 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -1218,6 +1218,9 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Right STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maximum initial loan: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maximum amount a company can loan (without taking inflation into account) +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_VALUE :{CURRENCY_LONG} +###setting-zero-is-special +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_DISABLED :No loan {RED}Requires Game Script to provide initial funds STR_CONFIG_SETTING_INTEREST_RATE :Interest rate: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Loan interest rate; also controls inflation, if enabled @@ -3393,8 +3396,8 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Warning: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Error: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Fatal: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}A fatal NewGRF error has occurred:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}A NewGRF error has occurred:{}{STRING} +STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}The NewGRF "{STRING}" has returned a fatal error:{}{STRING} +STR_NEWGRF_ERROR_POPUP :{WHITE}The NewGRF "{STRING}" has returned an error:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} will not work with the TTDPatch version reported by OpenTTD STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} is for the {2:STRING} version of TTD STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} is designed to be used with {2:STRING} @@ -4665,8 +4668,10 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Whole ma STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Heightmap screenshot STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Minimap screenshot -# AI Parameters -STR_AI_SETTINGS_CAPTION_AI :{WHITE}AI Parameters +# Script Parameters +STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameters +STR_AI_SETTINGS_CAPTION_AI :AI +STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Game Script STR_AI_SETTINGS_CLOSE :{BLACK}Close STR_AI_SETTINGS_RESET :{BLACK}Reset STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} diff --git a/src/lang/esperanto.txt b/src/lang/esperanto.txt index 359e94b1d6..76a7892a5f 100644 --- a/src/lang/esperanto.txt +++ b/src/lang/esperanto.txt @@ -1101,6 +1101,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_CENTER :Centre STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Dekstre STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maksimuma komenca prunto: {STRING} +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Rentumtarifoj: {STRING} @@ -2566,7 +2567,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Averto: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Eraro: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Fatalo: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Neriparebla NewGRF-eraro okazis:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} ne funkcios kun la versio de TTDPatch menciata de OpenTTD. STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} estas por la {STRING} versio de TTD. STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} estas intencita por uzo kun {STRING} @@ -3561,7 +3561,7 @@ STR_AI_LIST_CANCEL :{BLACK}Nuligi STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Ne ŝanĝu AI-on -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :AI STR_AI_SETTINGS_CLOSE :{BLACK}Fermi STR_AI_SETTINGS_RESET :{BLACK}Reŝargo diff --git a/src/lang/estonian.txt b/src/lang/estonian.txt index 01cefdf6c6..ddb565fd82 100644 --- a/src/lang/estonian.txt +++ b/src/lang/estonian.txt @@ -262,6 +262,15 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}hj STR_UNITS_POWER_METRIC :{COMMA}hj STR_UNITS_POWER_SI :{COMMA}kW +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}hj/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}hj/t +STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_SI :{DECIMAL}{NBSP}hj/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}hj/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}hj/t +STR_UNITS_POWER_METRIC_TO_WEIGHT_SI :{DECIMAL}{NBSP}hj/t +STR_UNITS_POWER_SI_TO_WEIGHT_IMPERIAL :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_METRIC :{DECIMAL}{NBSP}kW/t +STR_UNITS_POWER_SI_TO_WEIGHT_SI :{DECIMAL}{NBSP}W/kg STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}t @@ -289,8 +298,8 @@ STR_UNITS_HEIGHT_SI :{COMMA} m # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Märksõna: -STR_LIST_FILTER_OSKTITLE :{BLACK}Sisesta märksõna -STR_LIST_FILTER_TOOLTIP :{BLACK}Sisesta märksõna mida loendist otsida +STR_LIST_FILTER_OSKTITLE :{BLACK}Sisesta üks või enam märksõna mille järgi nimekirja filtreerida +STR_LIST_FILTER_TOOLTIP :{BLACK}Sisesta üks või enam märksõna mida loendist otsida STR_TOOLTIP_GROUP_ORDER :{BLACK}Vali jaotamise järjestus STR_TOOLTIP_SORT_ORDER :{BLACK}Vali järjestus (kahanev/kasvav) @@ -390,6 +399,8 @@ STR_GROUP_BY_NONE :Puudub STR_GROUP_BY_SHARED_ORDERS :Jagatud korraldused # Order button in shared orders vehicle list +STR_GOTO_ORDER_VIEW :{BLACK}Korraldused +STR_GOTO_ORDER_VIEW_TOOLTIP :{BLACK}Ava korralduste vaade # Tooltips for the main toolbar ###length 31 @@ -438,9 +449,9 @@ STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Asustust STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Tööstuste tekitamine STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Maanteede ehitamine STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Trammiteede ehitamine -STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Istuta puid. Shift valib ehitamise/hinna kuvamise režiimi +STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Istuta puid. Ctrl valib piirkonna diagonaalselt. Shift valib ehitamise/hinna kuvamise režiimi vahel STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Paigalda silt -STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Paigalda objekt. Shift valib ehitamise/hinna kuvamise režiimi +STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Paigalda objekt. Ctrl valib ala diagonaaliti. Shift valib ehitamise/hinna kuvamise režiimi vahel # Scenario editor file menu ###length 7 @@ -456,6 +467,8 @@ STR_SCENEDIT_FILE_MENU_QUIT :Välju ###length 15 STR_SETTINGS_MENU_GAME_OPTIONS :Mängu seadistus STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Seaded +STR_SETTINGS_MENU_AI_SETTINGS :TI seaded +STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :GameScript'i seaded STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF-i seadistus STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Läbipaistvuse seadistus STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Näidatavad asustuste nimed @@ -861,6 +874,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * S STR_STATUSBAR_AUTOSAVE :{RED}VÄLPSALVESTUS STR_STATUSBAR_SAVING_GAME :{RED}* * MÄNGU SALVESTAMINE * * +STR_STATUSBAR_SPECTATOR :{WHITE}(vaatleja) # News message history STR_MESSAGE_HISTORY :{WHITE}Sõnumite ajalugu @@ -964,7 +978,12 @@ STR_NEWS_STATION_NOW_ACCEPTS_CARGO_AND_CARGO :{WHITE}Jaam {ST STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}Toetuse pakkumine lõppes:{}{}{STRING.g} kohast {STRING} kohta {STRING} veoste eest ei maksta enam toetusi STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Toetuse maksmise aeg sai läbi:{}{}{STRING}kohast {STRING} kohta {STRING} eest ei maksta enam edaspidi toetust +STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIG_FONT}{BLACK}Veoteenusele pakutakse toetust:{}{}{STRING.g}veo eest asustusest {STRING} asustusse {STRING}. Esimesele teenusepakkujale makstakse {NUM} aasta{P "" "t" } toetusi! ###length 4 +STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}Teenusetoetust makstakse ettevõttele {STRING}!{}{}{STRING} kohast {STRING} kohta {STRING} teenuse eest makstakse järgmisel {NUM} aastal 50% rohkem! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLACK}Teenusetoetust makstakse ettevõttele {STRING}!{}{}{STRING} kohast {STRING} kohta {STRING} teenuse eest makstakse järgmisel {NUM} aastal kahekordselt! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}Teenusetoetust makstakse ettevõttele {STRING}!{}{}{STRING} kohast {STRING} kohta {STRING} teenuse eest makstakse järgmise {NUM} aasta jooksul kolmekordselt! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}Teenusetoetust makstakse ettevõttele {STRING}!{}{}{STRING} kohast {STRING} kohta {STRING} teenuse eest makstakse järgmise {NUM} aasta jooksul neljakordselt! STR_NEWS_ROAD_REBUILDING :{BIG_FONT}{BLACK}Liikluskaos asustuses {TOWN}!{}{}Ettevõtte {STRING} poolt rahastatud teede ümberehitus tekitab 6 kuu jooksul maanteedel liiklushäireid! STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Transpordimonopol! @@ -1056,9 +1075,20 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Seade om STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Märgi, et ekraani v-sync sisse lülitada. Seade kohaldub alles pärast mängu taaskäivitust. Töötab vaid, kui riistvarakiirendus on peal +STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Hetke draiver: {STRING} +STR_GAME_OPTIONS_GUI_SCALE_FRAME :{BLACK}Liidese suurus +STR_GAME_OPTIONS_GUI_SCALE_AUTO :{BLACK}Tuvasta automaatselt suurus +STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Märgi see kast, et tuvastada liidese suurus automaatselt +STR_GAME_OPTIONS_GUI_SCALE_BEVELS :{BLACK}Skaleeri kaldeid +STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :{BLACK}Skaleeri kaldeid liidese suuruse järgi +STR_GAME_OPTIONS_GUI_SCALE_1X :1x +STR_GAME_OPTIONS_GUI_SCALE_2X :2x +STR_GAME_OPTIONS_GUI_SCALE_3X :3x +STR_GAME_OPTIONS_GUI_SCALE_4X :4x +STR_GAME_OPTIONS_GUI_SCALE_5X :5x STR_GAME_OPTIONS_GRAPHICS :{BLACK}Graafika @@ -1175,9 +1205,10 @@ STR_TERRAIN_TYPE_CUSTOM :Määratud kõr STR_TERRAIN_TYPE_CUSTOM_VALUE :Määratud kõrgus ({NUM}) ###length 4 +STR_CITY_APPROVAL_LENIENT :Leebe STR_CITY_APPROVAL_TOLERANT :Salliv STR_CITY_APPROVAL_HOSTILE :Vaenulik -STR_CITY_APPROVAL_PERMISSIVE :Soodustav +STR_CITY_APPROVAL_PERMISSIVE :Lubav (ei oma mõju firma tegevustele) STR_WARNING_NO_SUITABLE_AI :{WHITE}Sobiv AI puudub...{}Mitmesuguseid AI-sid saab alla laadida 'aineste allalaadimise' kaudu @@ -1243,6 +1274,9 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Paremal STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Stardilaenu ülempiirang: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Suurim summa, mida ettevõte saab laenata (arvestamata inflatsiooni) +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_VALUE :{CURRENCY_LONG} +###setting-zero-is-special +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_DISABLED :Laenudeta {RED}GameScript peab andma esmase rahastuse STR_CONFIG_SETTING_INTEREST_RATE :Intressimäär: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Laenu intressimäär; ühtlasi juhib inflatsiooni, kui inflatsioon on aktiveeritud @@ -1259,8 +1293,12 @@ STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT :Muudab hooldama STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER :Toetuse kordaja: {STRING} STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT :Määra ära kui palju makstakse toetatud liinide eest +STR_CONFIG_SETTING_SUBSIDY_DURATION :Toetuse kestus: {STRING} +STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :Sea aastate arv, kui kaua toetust makstakse +STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{NUM} aasta{P "" d} ###setting-zero-is-special +STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :Toetusteta STR_CONFIG_SETTING_CONSTRUCTION_COSTS :Ehituse hinnad: {STRING} STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Määrab ehitus- ja ostukulude hinnataseme @@ -1274,8 +1312,8 @@ STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT :Kui on aktiveer STR_CONFIG_SETTING_DISASTERS :Katastroofid: {STRING} STR_CONFIG_SETTING_DISASTERS_HELPTEXT :Lülita sisse/välja katastroofid, mis aeg-ajalt hävitavad sõidukeid ja taristut -STR_CONFIG_SETTING_CITY_APPROVAL :Astuse omavalitsuse suhtumine pinnase restruktureerimisse: {STRING} -STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT :Vali kui suurt mõju tekitavad müra ning keskkonna muudatused ettevõtte mainele ja edasistele ehitustoimingutele antud piirkonnas +STR_CONFIG_SETTING_CITY_APPROVAL :Kohaliku omavalitsuse suhtumine: {STRING} +STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT :Vali kui suurt mõju tekitavad müra ning keskkonna muudatused ettevõtte mainele ja edasistele ehitustoimingutele asulas STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT :Kaardi kõrguspiir: {STRING} STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT_HELPTEXT :Määra ülempiir kaardil oleva maastiku kõrgusele. "(Auto)" leiab sobiva väärtuse pärast, kui maastik on tekitatud @@ -1345,7 +1383,7 @@ STR_CONFIG_SETTING_INDUSTRY_PLATFORM :Tasane ala ümb STR_CONFIG_SETTING_INDUSTRY_PLATFORM_HELPTEXT :Summa kui palju tasast maad on ümber tehase. See tagab et ruumi jääb saadavale ehitiste jaoks STR_CONFIG_SETTING_MULTIPINDTOWN :Mitu samalaadset tööstust ühe asula piires: {STRING} -STR_CONFIG_SETTING_MULTIPINDTOWN_HELPTEXT :Tavaliselt asula ei taha rohkem kui ühte tööstustharu igast liigist. Selle seadega lubatakse rohkem kui üks samalaadne tööstus ühe asula piires +STR_CONFIG_SETTING_MULTIPINDTOWN_HELPTEXT :Tavaliselt asula ei taha rohkem kui ühte tööstusharu igast liigist. Selle seadega lubatakse rohkem kui üks samalaadne tööstus ühe asula piires STR_CONFIG_SETTING_SIGNALSIDE :Signaale näidatakse: {STRING} STR_CONFIG_SETTING_SIGNALSIDE_HELPTEXT :Vali kummale poole rada signaalid paigutatakse @@ -1465,6 +1503,8 @@ STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Graafikutes kas STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :Näita sõidukiehitusaknas NewGRF-i nime: {STRING} STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Lisa sõidukiehitusaknasse uus rida, mis näitab millisest NewGRF-ist sõiduk on pärit. +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS :Näita kaupasid, mida sõidukid saavad vedada nimekirja aknas {STRING} +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS_HELPTEXT :Kui aktiveeritud, siis kuvatakse sõidukite nimekirjas sõiduki kohal selle veos STR_CONFIG_SETTING_LANDSCAPE :Maastik: {STRING} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Maastikud määravad põhilised mängustsenaariumid erinevate veoste ja nõuetega asulate kasvamiseks. NewGRF ja GameScript abil saab siiski täpsemalt kontrollida @@ -1549,7 +1589,13 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Roheline STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Tumeroheline STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Violetne +STR_CONFIG_SETTING_LINKGRAPH_COLOURS :Kaubavoo ülekatte värvid: {STRING} +STR_CONFIG_SETTING_LINKGRAPH_COLOURS_HELPTEXT :Vali värvilahendus, mida kasutatakse kaubavoo ülekattel ###length 4 +STR_CONFIG_SETTING_LINKGRAPH_COLOURS_GREEN_TO_RED :Rohelisest punaseni (esialgne) +STR_CONFIG_SETTING_LINKGRAPH_COLOURS_GREEN_TO_BLUE :Rohelisest siniseni +STR_CONFIG_SETTING_LINKGRAPH_COLOURS_GREY_TO_RED :Hallist punaseni +STR_CONFIG_SETTING_LINKGRAPH_COLOURS_GREYSCALE :Halltoonides STR_CONFIG_SETTING_SCROLLMODE :Vaate liigutamine: {STRING} STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Kaardil liikumise viis @@ -1593,7 +1639,12 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Topeltklõpsuga STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Ühe klõpsuga (kui on fookuses) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Ühe klõpsuga (koheselt) +STR_CONFIG_SETTING_USE_RELAY_SERVICE :Kasuta vahendajateenust : {STRING} +STR_CONFIG_SETTING_USE_RELAY_SERVICE_HELPTEXT :Kui serveriga ühenduse loomine ebaõnnestub, võib kasutada vahendajateenust ühenduse loomiseks. "Mitte kunagi" keelab selle, "küsi" küsib esmalt, "luba" lubab selle küsimata ###length 3 +STR_CONFIG_SETTING_USE_RELAY_SERVICE_NEVER :Mitte kunagi +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ASK :Küsi +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ALLOW :Luba STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Paremklõpsu matkimine: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Vali meetod mille järgi emuleeritakse hiite paremklõpse @@ -1690,8 +1741,8 @@ STR_CONFIG_SETTING_SOUND_AMBIENT_HELPTEXT :Maastikult, tö STR_CONFIG_SETTING_MAX_TRAINS :Ettevõtte rongide ülempiirang: {STRING} STR_CONFIG_SETTING_MAX_TRAINS_HELPTEXT :Ettevõttele kuuluvate rongide arvu ülempiirang -STR_CONFIG_SETTING_MAX_ROAD_VEHICLES :Ettevõtte mootorsõidukite ülempiirang: {STRING} -STR_CONFIG_SETTING_MAX_ROAD_VEHICLES_HELPTEXT :Ettevõttele kuuluvate mootorsõidukite arvu ülempiirang +STR_CONFIG_SETTING_MAX_ROAD_VEHICLES :Ettevõtte maanteesõidukite ülempiirang: {STRING} +STR_CONFIG_SETTING_MAX_ROAD_VEHICLES_HELPTEXT :Ettevõttele kuuluvate maanteesõidukite arvu ülempiirang STR_CONFIG_SETTING_MAX_AIRCRAFT :Ettevõtte õhusõidukite ülempiirang: {STRING} STR_CONFIG_SETTING_MAX_AIRCRAFT_HELPTEXT :Ettevõttele kuuluvate õhusõidukite arvu ülempiirang @@ -1760,6 +1811,8 @@ STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER_HELPTEXT :Kui vastasettev STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS :Õnnetused / katastroofid: {STRING} STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS_HELPTEXT :Õnnetusi või katastroofi esinemisel näidatakse seda ajalehes +STR_CONFIG_SETTING_NEWS_ACCIDENT_OTHER :Õnnetused konkurentide sõidukitega: {STRING} +STR_CONFIG_SETTING_NEWS_ACCIDENT_OTHER_HELPTEXT :Kuva ajalehe teated konkurentide sõidukitega juhtunud õnnetuste kohta STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION :Ettevõtte teave: {STRING} STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION_HELPTEXT :Kui uus ettevõte alustab, või ettevõte riskib pankrotiga, näidatakse seda ajalehes @@ -1837,12 +1890,16 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Semafore ehitat STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Määra aasta alates millest hakatakse kasutama elektriga foore. Ennem seda aastat kasutatakse semafoore (mis täidavad sama eesmärki, aga näevad teist moodi välja) STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Vaheta signaalide liike: {STRING} -STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Muuda saadaval signaaliliike, kui «Ctrl»+klõpsu abil muuta signaali liiki +STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Muuda valitavaid signaaliliike, kui «Ctrl»+klõpsu abil muudetakse ehitatud signaali liiki ###length 2 STR_CONFIG_SETTING_CYCLE_SIGNAL_PBS :Ainult täiustatud -STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :Kõik +STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :Kõik nähtavad +STR_CONFIG_SETTING_SIGNAL_GUI_MODE :Näita signaali tüüpe: {STRING} +STR_CONFIG_SETTING_SIGNAL_GUI_MODE_HELPTEXT :Vali milliseid signaale kuvatakse signaalide tööribal ###length 2 +STR_CONFIG_SETTING_SIGNAL_GUI_MODE_PATH :Rajasignaalid ainult +STR_CONFIG_SETTING_SIGNAL_GUI_MODE_ALL_CYCLE_PATH :Kõik signaalid STR_CONFIG_SETTING_TOWN_LAYOUT :Uute asulate teeplaneering: {STRING} STR_CONFIG_SETTING_TOWN_LAYOUT_HELPTEXT :Teedevõrgu paigutus asulates @@ -1939,13 +1996,13 @@ STR_CONFIG_SETTING_LINKGRAPH_TIME :Jaotusgraafikud STR_CONFIG_SETTING_LINKGRAPH_TIME_HELPTEXT :Aega ahelgraafiku osa koostamiseks. Koostamise algul käivitatakse protsess, mis võib töötada määratud arv päevi. Väiksema väärtusega on suurem võimalus, et protsess lõppe. Kui protsess ei ole lõppenud, siis mäng seisatakse protsessi lõppemiseni (tekib viivitusi). Suurema arvuga läheb kauem, kuni muudetud teel uuendatakse kaubajaotust. STR_CONFIG_SETTING_DISTRIBUTION_PAX :Reisijate jaotuse viis: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :Kui jaamast A läheb jaama B umbes sama hulk reisijaid, kui jaamast B jaama A, siis jaotus on «sümeetriline». Kui mõlemas suunas võib liikuda ükskõik, kui palju resijaid, siis jaotus on «asümeetriline». Kui reisijate liikumist ei jaotata, siis jaotus on «väljas». +STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :Kui jaamast A läheb jaama B umbes sama hulk reisijaid, kui jaamast B jaama A, siis jaotus on «Sümeetriline». Kui mõlemas suunas võib liikuda ükskõik, kui palju resijaid, siis jaotus on «Asümeetriline». Kui reisijate liikumist ei jaotata, siis jaotus on «Väljas». STR_CONFIG_SETTING_DISTRIBUTION_MAIL :Posti jaotuse viis: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :Kui jaamast A viiakse jaama B umbes sama hulk posti, kui jaamast B jaama A, siis jaotus on «sümeetriline». Kui mõlemas suunas viiakse ükskõik, kui palju posti, siis jaotus on «asümeetriline». Kui posti liikumist ei jaotata, siis jaotus on «väljas». +STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :Kui jaamast A viiakse jaama B umbes sama hulk posti, kui jaamast B jaama A, siis jaotus on «Sümeetriline». Kui mõlemas suunas viiakse ükskõik, kui palju posti, siis jaotus on «Asümeetriline». Kui posti liikumist ei jaotata, siis jaotus on «Väljas». STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED :SOOMUSTATUD veoseliigi jaotuse viis: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :Parasvöötmes on SOOMUSTATUD veoseliik väärisesemed, lähistroopikas teemandid, ning lähisartikas kuld. Neid saab lisada NewGRF-iga. Kui jaamast A viiakse jaama B umbes sama hulk kaupa, kui jaamast B jaama A, siis jaotus on «sümeetriline». Kui mõlemas suunas viiakse ükskõik, kui palju kaupa, siis jaotus on «asümeetriline». Kui posti liikumist ei jaotata, siis jaotus on «väljas». Lähisartikas valida asümeetriline või väljas, sest pankadest kulda tagasi ei tule. Parasvöötmes ja lähistroopikas on võimalik valida ka sümeetriline, sest pangad saadavad lähtepanka väärisesemed tagasi. +STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :Parasvöötmes on SOOMUSTATUD veoseliik väärisesemed, lähistroopikas teemandid, ning lähisartikas kuld. Neid saab lisada NewGRF-iga. Kui jaamast A viiakse jaama B umbes sama hulk kaupa, kui jaamast B jaama A, siis jaotus on «Sümeetriline». Kui mõlemas suunas viiakse ükskõik, kui palju kaupa, siis jaotus on «Asümeetriline». Kui posti liikumist ei jaotata, siis jaotus on «Väljas». Lähisartikas valida asümeetriline või väljas, sest pankadest kulda tagasi ei tule. Parasvöötmes ja lähistroopikas on võimalik valida ka sümeetriline, sest pangad saadavad lähtepanka väärisesemed tagasi. STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :Teiste veoseliikide jaotuse viis: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :Kui jaamast A viiakse jaama B umbes sama hulk kaupa, kui jaamast B jaama A, siis jaotus on «sümeetriline». Kui mõlemas suunas viiakse ükskõik, kui palju kaupa, siis jaotus on «asümeetriline». Kui posti liikumist ei jaotata, siis jaotus on «väljas». Tavaliselt on head valikud «asümeetriline» ja «väljas». +STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :Kui jaamast A viiakse jaama B umbes sama hulk kaupa, kui jaamast B jaama A, siis jaotus on «Sümeetriline». Kui mõlemas suunas viiakse ükskõik, kui palju kaupa, siis jaotus on «Asümeetriline». Kui posti liikumist ei jaotata, siis jaotus on «Väljas». Tavaliselt on head valikud «Asümeetriline» ja «Väljas». ###length 3 STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :väljas STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC :asümeetriline @@ -2028,6 +2085,7 @@ STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :{ORANGE}Tööst STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :{ORANGE}Kaubajaotus STR_CONFIG_SETTING_AI :{ORANGE}Konkurendid STR_CONFIG_SETTING_AI_NPC :{ORANGE}Arvuti +STR_CONFIG_SETTING_NETWORK :{ORANGE}Võrk STR_CONFIG_SETTING_PATHFINDER_FOR_TRAINS :Rongide marsruudileidja: {STRING} STR_CONFIG_SETTING_PATHFINDER_FOR_TRAINS_HELPTEXT :Marsruudileidja rongide jaoks @@ -2082,6 +2140,8 @@ STR_INTRO_HIGHSCORE :{BLACK}Edetabel STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Seaded STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF-i seadistus STR_INTRO_ONLINE_CONTENT :{BLACK}Aineste allalaadimine +STR_INTRO_AI_SETTINGS :{BLACK}TI Seaded +STR_INTRO_GAMESCRIPT_SETTINGS :{BLACK}GameScript'i seaded STR_INTRO_QUIT :{BLACK}Välju STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Alusta uut mängu. Ctrl+klõps jätab kaardi seadistamise vahele @@ -2101,6 +2161,8 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Ava edet STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Ava seaded STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Ava NewGRF-i seadistamine STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Otsi allalaadimiseks uusi ja uuendatud aineseid +STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Näita TI seadeid +STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Näita GameSript'i seadeid STR_INTRO_TOOLTIP_QUIT :{BLACK}Välju 'OpenTTD'st STR_INTRO_BASESET :{BLACK}Hetkel valitud lähtegraafikakogust puudub {NUM} sprite{P "" 'i}. Kontrolli, kas lähtekogule on uuendusi. @@ -2229,7 +2291,9 @@ STR_FACE_TIE_EARRING_TOOLTIP :{BLACK}Vaheta k # Matches ServerGameType ###length 3 +STR_NETWORK_SERVER_VISIBILITY_LOCAL :Kohalik STR_NETWORK_SERVER_VISIBILITY_PUBLIC :Avalik +STR_NETWORK_SERVER_VISIBILITY_INVITE_ONLY :Kutsega # Network server list STR_NETWORK_SERVER_LIST_CAPTION :{WHITE}Mitmikmäng @@ -2260,11 +2324,15 @@ STR_NETWORK_SERVER_LIST_LANDSCAPE :{SILVER}Maastik STR_NETWORK_SERVER_LIST_MAP_SIZE :{SILVER}Kaardi mõõtmed: {WHITE}{COMMA}x{COMMA} STR_NETWORK_SERVER_LIST_SERVER_VERSION :{SILVER}Serveri versioon: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}Serveri aadress: {WHITE}{STRING} +STR_NETWORK_SERVER_LIST_INVITE_CODE :{SILVER}Kutse kood: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}Aeg alguses: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}Aeg hetkel: {WHITE}{DATE_SHORT} +STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}GameScript: {WHITE}{STRING} (v{NUM}) STR_NETWORK_SERVER_LIST_PASSWORD :{SILVER}Kaitstud salasõnaga! STR_NETWORK_SERVER_LIST_SERVER_OFFLINE :{SILVER}SERVER ON MAAS STR_NETWORK_SERVER_LIST_SERVER_FULL :{SILVER}SERVER ON TÄIS +STR_NETWORK_SERVER_LIST_SERVER_BANNED :{SILVER}SERVER BÄNNIS SINU +STR_NETWORK_SERVER_LIST_SERVER_TOO_OLD :SILVER}SERVER ON LIIGA VANA STR_NETWORK_SERVER_LIST_VERSION_MISMATCH :{SILVER}ÜHILDUMATUD VERSIOONID STR_NETWORK_SERVER_LIST_GRF_MISMATCH :{SILVER}NEWGRF SOBIMATUS @@ -2277,7 +2345,7 @@ STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET_TOOLTIP :{BLACK}Internet STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN :{BLACK}Otsing LANis STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN_TOOLTIP :{BLACK}Kohtvõrgus serverite otsimine STR_NETWORK_SERVER_LIST_ADD_SERVER :{BLACK}Sisesta server -STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Sisesta loendisse uus server, milles toimuvaid mänge jälgida +STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Lisab loendisse uue serveri. See võib olla kas serveri aadress või kutse kood STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Tee server STR_NETWORK_SERVER_LIST_START_SERVER_TOOLTIP :{BLACK}Tee oma server @@ -2328,10 +2396,10 @@ STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION :{WHITE}Ettevõt # Network company list added strings STR_NETWORK_COMPANY_LIST_CLIENT_LIST :Ühendatud mängijad -STR_NETWORK_COMPANY_LIST_SPECTATE :Jälgi +STR_NETWORK_COMPANY_LIST_SPECTATE :Vaatle # Network client list -STR_NETWORK_CLIENT_LIST_CAPTION :{WHITE}Mitmikmäng +STR_NETWORK_CLIENT_LIST_CAPTION :{WHITE}Võrgumäng STR_NETWORK_CLIENT_LIST_SERVER :{BLACK}Server STR_NETWORK_CLIENT_LIST_SERVER_NAME :{BLACK}Nimi STR_NETWORK_CLIENT_LIST_SERVER_NAME_TOOLTIP :{BLACK}Serveri nimi, kus sa mängid @@ -2339,6 +2407,10 @@ STR_NETWORK_CLIENT_LIST_SERVER_NAME_EDIT_TOOLTIP :{BLACK}Muuda om STR_NETWORK_CLIENT_LIST_SERVER_NAME_QUERY_CAPTION :Serveri nimi STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY :{BLACK}Nähtavus STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY_TOOLTIP :{BLACK}Kas sinu server on kõikidele teistele avalikult nähtav +STR_NETWORK_CLIENT_LIST_SERVER_INVITE_CODE :{BLACK}Kutse kood +STR_NETWORK_CLIENT_LIST_SERVER_INVITE_CODE_TOOLTIP :{BLACK}Kutse kood, mille abil teised mängijad saavad serveriga liituda +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE :{BLACK}Ühenduse tüüp +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TOOLTIP :{BLACK}Kas ja kuidas saavad teised sinu serveriga ühendust STR_NETWORK_CLIENT_LIST_PLAYER :{BLACK}Mängija STR_NETWORK_CLIENT_LIST_PLAYER_NAME :{BLACK}Nimi STR_NETWORK_CLIENT_LIST_PLAYER_NAME_TOOLTIP :{BLACK}Sinu mängija nimi @@ -2355,9 +2427,15 @@ STR_NETWORK_CLIENT_LIST_NEW_COMPANY :(Uus ettevõte) STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP :{BLACK}Loo uus ettevõte ja liitu sellega STR_NETWORK_CLIENT_LIST_PLAYER_ICON_SELF_TOOLTIP :{BLACK}Tema oled sina STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP :{BLACK}Tema on mängu korraldaja +STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT :{BLACK}{NUM} klient{P "" i} / {NUM} ettevõt{P e teid} # Matches ConnectionType ###length 5 +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_UNKNOWN :{BLACK}Kohalik +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_ISOLATED :{RED}Välised mängijad ei saa ühenduda +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_DIRECT :{BLACK}Avalik +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_STUN :{BLACK}NAT'i taga +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TURN :{BLACK}Läbi vahendaja STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :Viska välja STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Keela @@ -2370,6 +2448,11 @@ STR_NETWORK_CLIENT_LIST_ASK_CLIENT_BAN :{YELLOW}Kas ole STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Kas oled kindel, et tahad kustutada ettevõtte '{COMPANY}'? STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Kas oled kindel, et soovid nullida ettevõtte '{COMPANY}' salasõna? +STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}Kasuta vahendajat? +STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}Ühenduse loomine sinu ja serveri '{STRING}' vahel ebaõnnestus .{}Kas sa soovid seda sesiooni vahendada läbi '{STRING}'? +STR_NETWORK_ASK_RELAY_NO :{BLACK}Ei +STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Jah, ainult seekord +STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}jah, ära küsi uuesti STR_NETWORK_SPECTATORS :Vaatlejad @@ -2398,11 +2481,12 @@ STR_NETWORK_CHAT_TO_COMPANY :[Team] kohta {S STR_NETWORK_CHAT_CLIENT :[Private] {STRING}: {WHITE}{STRING} STR_NETWORK_CHAT_TO_CLIENT :[Private] kohta {STRING}: {WHITE}{STRING} STR_NETWORK_CHAT_ALL :[All] {STRING}: {WHITE}{STRING} +STR_NETWORK_CHAT_EXTERNAL :[{3:STRING}] {0:STRING}: {WHITE}{1:STRING} STR_NETWORK_CHAT_OSKTITLE :{BLACK}Sisesta tekst võrgus suhtlemiseks # Network messages STR_NETWORK_ERROR_NOTAVAILABLE :{WHITE}Võrgukaarti ei leitud või kompileeritud ilma võtmeta ENABLE_NETWORK -STR_NETWORK_ERROR_NOCONNECTION :{WHITE}Server ei vastanud päringule +STR_NETWORK_ERROR_NOCONNECTION :{WHITE}Ühendus serveriga aegus või sellest keelduti STR_NETWORK_ERROR_NEWGRF_MISMATCH :{WHITE}Ühendus ebaõnnestus NewGRF-i sobimatuse tõttu STR_NETWORK_ERROR_DESYNC :{WHITE}Mitmikmängu sünkroonimine ebaõnnestus STR_NETWORK_ERROR_LOSTCONNECTION :{WHITE}Mitmikmängu ühendus katkes @@ -2410,6 +2494,7 @@ STR_NETWORK_ERROR_SAVEGAMEERROR :{WHITE}Salvesta STR_NETWORK_ERROR_SERVER_START :{WHITE}Ei saa uut serverit alustada STR_NETWORK_ERROR_SERVER_ERROR :{WHITE}Tekkis protokolliviga ja ühendus katkes STR_NETWORK_ERROR_BAD_PLAYER_NAME :{WHITE}Sinu mängijale ei ole nime määratud. Nime saab määrata mitmikmägu akna ülaosas +STR_NETWORK_ERROR_BAD_SERVER_NAME :{WHITE}Sinu serverile ei ole nime antud. Nime saab määrata mitmikmägu akna ülaosas STR_NETWORK_ERROR_WRONG_REVISION :{WHITE}Kliendi osa ei vasta serveri osaga STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}Vale salasõna STR_NETWORK_ERROR_SERVER_FULL :{WHITE}Server on täis @@ -2469,17 +2554,21 @@ STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :transpordisõlm STR_NETWORK_MESSAGE_CLIENT_LEAVING :lahkub STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} liitus mänguga -STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {STRING} liitus mänguga ({2:NUM}. klient) -STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} liitus {2:NUM}. ettevõttega +STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {0:STRING} liitus mänguga ({2:NUM}. klient) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {0:STRING} liitus {2:NUM}. ettevõttega STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} liitus vaatlejatega -STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} alustas uue ettevõtte (nr {2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} lahkus mängust ({2:STRING}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {0:STRING} alustas uue ettevõtte (nr {2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {0:STRING} lahkus mängust ({2:STRING}) STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} on muutnud oma nimeks {STRING} -STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} saatis {2:CURRENCY_LONG} ettevõttele {1:STRING} +STR_NETWORK_MESSAGE_GIVE_MONEY :*** {0:STRING} saatis {2:CURRENCY_LONG} ettevõttele {1:STRING} STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}Server sulges sessiooni STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Server restardib...{}Palun oota... STR_NETWORK_MESSAGE_KICKED :*** {STRING} visati välja. Põhjendus: ({STRING}) +STR_NETWORK_ERROR_COORDINATOR_REGISTRATION_FAILED :{WHITE}Serveri registreerimine ebaõnnestus +STR_NETWORK_ERROR_COORDINATOR_REUSE_OF_INVITE_CODE :{WHITE}Teine server registreeris end sama kutse koodiga. "Kohalikule" mängu tüübile lülitumine. +STR_NETWORK_ERROR_COORDINATOR_ISOLATED :{WHITE}Sinu server ei luba väliseid ühendusi +STR_NETWORK_ERROR_COORDINATOR_ISOLATED_DETAIL :{WHITE}Teised mängijad ei saa sinu serveriga ühenduda # Content downloading window STR_CONTENT_TITLE :{WHITE}Aineste allalaadimine @@ -2586,6 +2675,9 @@ STR_LINKGRAPH_LEGEND_SATURATED :{TINY_FONT}{BLA STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLACK}ülekoormatud # Linkgraph tooltip +STR_LINKGRAPH_STATS_TOOLTIP :{BLACK}{CARGO_LONG} transporditud kuus jaamast {STATION} jaama {STATION} ({COMMA}% kogumahust){STRING} +STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} mida transporditakse tagasi ({COMMA}% kogumahust) +STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}Keskmine sõidukestus: {NUM}{NBSP}päev{P "" a} # Base for station construction window(s) STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Mõjupiirkonna näitamine @@ -2595,6 +2687,7 @@ STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP :{BLACK}Lülita STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP :{BLACK}Lülita sisse jaama mõjupiirkonna näitamine STR_STATION_BUILD_ACCEPTS_CARGO :{BLACK}Võtab vastu: {GOLD}{CARGO_LIST} STR_STATION_BUILD_SUPPLIES_CARGO :{BLACK}Tarnib: {GOLD}{CARGO_LIST} +STR_STATION_BUILD_INFRASTRUCTURE_COST :{BLACK}Hoolduse maksumus: {GOLD}{CURRENCY_SHORT}/a # Join station window STR_JOIN_STATION_CAPTION :{WHITE}Liida jaamale @@ -2655,6 +2748,7 @@ STR_STATION_CLASS_WAYP :Meldepunktid # Signal window STR_BUILD_SIGNAL_CAPTION :{WHITE}Signaali valik +STR_BUILD_SIGNAL_TOGGLE_ADVANCED_SIGNAL_TOOLTIP :{BLACK}Lülita sisse keerukate signaalitüüpide näitamine STR_BUILD_SIGNAL_SEMAPHORE_NORM_TOOLTIP :{BLACK}Läbisõidusignaal (semafor){}Signaale läheb tarvis vältimaks kokkupõrkeid enam kui ühe rongiga rööbasteedel STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TOOLTIP :{BLACK}Sissesõidusignaal (semafor){}Roheline, kuni vähemalt üks väljasõidusignaal on roheline. Muudel juhtudel näitab punast STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP :{BLACK}Väljasõidusignaal (semafor){}Käitub samamoodi, nagu läbisõidusignaal, kuid läheb vaja et sissesõidu- ja mitmik-hoiatussignaalid näitaksid õiget värvi @@ -2676,6 +2770,10 @@ STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}Suurenda STR_SELECT_RAIL_BRIDGE_CAPTION :{WHITE}Vali raudteesild STR_SELECT_ROAD_BRIDGE_CAPTION :{WHITE}Vali sillatüüp STR_SELECT_BRIDGE_SELECTION_TOOLTIP :{BLACK}Silla valik - ehitamiseks klõpsi sobival sillal +STR_SELECT_BRIDGE_INFO_NAME :{GOLD}{STRING} +STR_SELECT_BRIDGE_INFO_NAME_MAX_SPEED :{GOLD}{STRING},{} {VELOCITY} +STR_SELECT_BRIDGE_INFO_NAME_COST :{GOLD}{0:STRING},{} {WHITE}{2:CURRENCY_LONG} +STR_SELECT_BRIDGE_INFO_NAME_MAX_SPEED_COST :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY_LONG} STR_BRIDGE_NAME_SUSPENSION_STEEL :Rippsild, terasest STR_BRIDGE_NAME_GIRDER_STEEL :Raamistikuga, terasest STR_BRIDGE_NAME_CANTILEVER_STEEL :Konsool, terasest @@ -2778,12 +2876,12 @@ STR_STATION_BUILD_NOISE :{BLACK}Tekitatu STR_LANDSCAPING_TOOLBAR :{WHITE}Maastik STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}Maapinna madaldamine. Hiirega lohistades langetatakse esimesena valitud punkt ja ülejäänud ala tasandatakse vastavalt selle kõrgusele. Ctrl valib ala diagonaalselt. Shift valib ehitamise/hinna kuvamise režiimi STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND :{BLACK}Maapinna kõrgendamine. Hiirega lohistades tõstetakse esimesena valitud punkti ja tasandatakse ülejäänud ala selle järgi. Ctrl valib ala diagonaalselt. Shift valib ehitamise/hinna kuvamise režiimi -STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Tasanda maapinda esimesena valitud punkti kõrgusel. Ctrl valib piirkonna diagonaalselt. Shift valib ehitamise/hinna kuvamise režiimi -STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Maa ostmine tulevaseks kasutamiseks. Shift valib ehitamise/eeldatava maksumuse kuvamise režiimi +STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Tasanda maapinda esimesena valitud punkti kõrgusel. Ctrl valib ala diagonaalselt. Shift valib ehitamise/hinna kuvamise režiimi +STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Maa ostmine tulevaseks kasutamiseks. Shift valib ehitamise/eeldatava maksumuse kuvamise režiimi vahel # Object construction window STR_OBJECT_BUILD_CAPTION :{WHITE}Objekti valik -STR_OBJECT_BUILD_TOOLTIP :{BLACK}Vali ehitatav objekt. Shift valib ehitamise/hinna kuvamise režiimi +STR_OBJECT_BUILD_TOOLTIP :{BLACK}Vali ehitatav objekt. Ctrl valib ala diagonaaliti. Shift valib ehitamise/hinna kuvamise režiimi vahel STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}Vali ehitatava objekti järk STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}Objekti eelvaade STR_OBJECT_BUILD_SIZE :{BLACK}Suurus: {GOLD}{NUM} x {NUM} ruutu @@ -2795,7 +2893,7 @@ STR_OBJECT_CLASS_TRNS :Saatejaamad 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_TREES_RANDOM_TYPE :{BLACK}Suvalised puutüübid -STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Istutab suvalisi puid. Shift valib ehitamise/hinna kuvamise režiimi +STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Istutab suvalisi puid. Ctrl valib ala diagonaaliti. Shift valib ehitamise/hinna kuvamise režiimi vahel STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Suvalised puud STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Istutab puid suvaliselt üle kogu maa-ala STR_TREES_MODE_NORMAL_BUTTON :{BLACK}Tavaline @@ -2827,6 +2925,8 @@ STR_FOUND_TOWN_RANDOM_TOWN_BUTTON :{BLACK}Suvaline STR_FOUND_TOWN_RANDOM_TOWN_TOOLTIP :{BLACK}Raja asula suvalisse kohta STR_FOUND_TOWN_MANY_RANDOM_TOWNS :{BLACK}Palju suvalisi asulaid STR_FOUND_TOWN_RANDOM_TOWNS_TOOLTIP :{BLACK}Kaardi katmine suvaliselt paigutatud asulatega +STR_FOUND_TOWN_EXPAND_ALL_TOWNS :{BLACK}Laienda kõiki asulaid +STR_FOUND_TOWN_EXPAND_ALL_TOWNS_TOOLTIP :{BLACK}Kõik asulad kasvavad vaikselt STR_FOUND_TOWN_NAME_TITLE :{YELLOW}Asula nimi: STR_FOUND_TOWN_NAME_EDITOR_TITLE :{BLACK}Sisesta asula nimi @@ -3129,6 +3229,12 @@ STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Jõgesid STR_MAPGEN_SMOOTHNESS :{BLACK}Laugus: STR_MAPGEN_VARIETY :{BLACK}Iseärasuste jaotus: STR_MAPGEN_GENERATE :{WHITE}Tekita +STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF-i seadistus +STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :Näita NewGRF-i seadeid +STR_MAPGEN_AI_SETTINGS :{BLACK}TI Seaded +STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Näita TI seadeid +STR_MAPGEN_GS_SETTINGS :{BLACK}GameScript'i Seaded +STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Näita GameSript'i seadeid ###length 21 STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Inglise (algne) @@ -3300,7 +3406,10 @@ STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Represen STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Liiguta spraiti, muutes X ja Y tasakaalu. Ctrl+klõps, et liigutada kaheksa ühiku võrra korraga ###length 2 +STR_SPRITE_ALIGNER_CENTRE_OFFSET :{BLACK}Kõrvalekalletega tsentreerimine +STR_SPRITE_ALIGNER_CENTRE_SPRITE :{BLACK}Sprite keskne +STR_SPRITE_ALIGNER_CROSSHAIR :{BLACK}Rist STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Lähtesta suhteline STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Lähtesta praegused suhtelised kõrvalekalded @@ -3316,18 +3425,18 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Hoiatus: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Viga: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Saatuslik viga: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Esines raske NewGRF-i tõrge:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}Esines viga NewGRF-iga:{}{STRING} +STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE} NewGRF "{STRING}" väljastas raske tõrke:{}{STRING} +STR_NEWGRF_ERROR_POPUP :{WHITE}NewGRF "{STRING}" on väljastanud tõrke:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :OpenTTD väitel {1:STRING} ei tööta selle TTDPatch versiooniga. -STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} on {STRING} TTD osa jaoks. -STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} on mõeldud kasutamiseks {STRING} -STR_NEWGRF_ERROR_INVALID_PARAMETER :kõlbmatu «{1:STRING}» parameeter: parameeter {STRING} ({NUM}) -STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} peab olema laetud enne {STRING} -STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} peab olema laetud pärast {STRING} -STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} nõuab OpenTTD versiooni {STRING} või uuemat +STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} on {2:STRING} TTD osa jaoks. +STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} on mõeldud kasutamiseks {2:STRING} +STR_NEWGRF_ERROR_INVALID_PARAMETER :kõlbmatu «{1:STRING}» parameeter: parameeter {2:STRING} ({3:NUM}) +STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} peab olema laetud enne {2:STRING} +STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} peab olema laetud pärast {2:STRING} +STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} nõuab OpenTTD versiooni {2:STRING} või uuemat STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :GRF fail, mis tehti tõlkimiseks, STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Liiga palju NewGRF-e on laaditud -STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Laadides {1:STRING} staatilise NewGRF-na koos {STRING} võib põhjustada sünkrooni katkemist. +STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Laadides {1:STRING} staatilise NewGRF-na koos {2:STRING} võib põhjustada sünkrooni katkemist. STR_NEWGRF_ERROR_UNEXPECTED_SPRITE :Ootamatu sprite (sprite {3:NUM}) STR_NEWGRF_ERROR_UNKNOWN_PROPERTY :Ootamatu tegevus 0 property {4:HEX} (sprite {3:NUM}) STR_NEWGRF_ERROR_INVALID_ID :Kasutati kõlbmatut ID-d («sprite» {3:NUM}) @@ -3459,14 +3568,14 @@ STR_LOCAL_AUTHORITY_ACTION_EXCLUSIVE_TRANSPORT :Osta monopoolse STR_LOCAL_AUTHORITY_ACTION_BRIBE :Paku kohalikule omavalitsusele altkäemaksu ###length 8 -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{YELLOW}Pisikese kohaliku reklaamikampaania korraldamine meelitab rohkem reisijaid ja kaupu sinu veoteenuseid kasutama.{}Tõstab asulakeskuse lähiümbruses ajutiselt jaamade tegevushinnanguid.{}Maksumus: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{YELLOW}Keskmise reklaamikampaania korraldamine, et meelitada rohkem reisijaid ja kaupu sinu teenuste juurede.{}Tõstab ajutiselt asulakeskuse ümbruses jaamade tegevushinnanguid.{}Maksumus: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{YELLOW}Suure reklaamikampaania korraldamine, et meelitada rohkem reisijaid ja kaupu sinu teenuste juurede.{}Tõstab asulakeskuse kaugümbruses ajutiselt jaamade tegevushinnanguid.{}Maksumus: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{YELLOW}Asula teedevõrgu ümberehituse rahastamine.{}Põhjustab liikluses tõsiseid häireid kuni 6 kuuks.{}Maksumus: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{YELLOW}Oma ettevõtte auks kuju ehitamine.{}Tõstab püsivalt jaamade tegevushinnanguid selles asulas.{}Maksumus: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{YELLOW}Uute hooneehituste rahastamine selles asulas.{}Tõstab ajutiselt asula kasvutempot selles asulas.{}Maksumus: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW}Üheks aastaks monopoolsete veoõiguste ostmine selles asulas.{}Asula omavalitsus lubab reisijate ja kauba veoks kasutada ainult sinu jaamasid.{}Maksumus: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Kohalikule omavalitusele ettevõtte hinnangu tõstmise eesmärgil altkäemaksu pakkumine. Vahele jäädes tuleb trahvi maksta.{}Maksumus: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{YELLOW}Pisikese kohaliku reklaamikampaania korraldamine meelitab rohkem reisijaid ja kaupu sinu veoteenuseid kasutama.{}Tõstab asulakeskuse lähiümbruses ajutiselt jaamade tegevushinnanguid.{}{POP_COLOUR}Maksumus: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :PUSH_COLOUR}{YELLOW}Keskmise reklaamikampaania korraldamine, et meelitada rohkem reisijaid ja kaupu sinu teenuste juurede.{}Tõstab ajutiselt asulakeskuse ümbruses jaamade tegevushinnanguid.{}{POP_COLOUR}Maksumus: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}Suure reklaamikampaania korraldamine, et meelitada rohkem reisijaid ja kaupu sinu teenuste juurede.{}Tõstab asulakeskuse kaugümbruses ajutiselt jaamade tegevushinnanguid.{}{POP_COLOUR}Maksumus: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{PUSH_COLOUR}{YELLOW}Asula teedevõrgu ümberehituse rahastamine.{}Põhjustab liikluses tõsiseid häireid kuni 6 kuuks.{}{POP_COLOUR}Maksumus: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Oma ettevõtte auks kuju ehitamine.{}Tõstab püsivalt jaamade tegevushinnanguid selles asulas.{}{POP_COLOUR}Maksumus: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Uute hooneehituste rahastamine selles asulas.{}Tõstab ajutiselt asula kasvutempot selles asulas.{}{POP_COLOUR}Maksumus: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}Üheks aastaks monopoolsete veoõiguste ostmine selles asulas.{}Asula omavalitsus lubab reisijate ja kauba veoks kasutada ainult sinu jaamasid.{}{POP_COLOUR}Maksumus: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Kohalikule omavalitusele ettevõtte hinnangu tõstmise eesmärgil altkäemaksu pakkumine. Vahele jäädes tuleb trahvi maksta.{}{POP_COLOUR}Maksumus: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}{COMPANY} eesmärgid @@ -3619,24 +3728,38 @@ STR_FINANCES_CAPTION :{WHITE}{COMPANY STR_FINANCES_YEAR :{WHITE}{NUM} ###length 3 +STR_FINANCES_REVENUE_TITLE :{WHITE}Tulu +STR_FINANCES_OPERATING_EXPENSES_TITLE :{WHITE}Opereerimiskulud +STR_FINANCES_CAPITAL_EXPENSES_TITLE :{WHITE}Kapitalikulud ###length 13 STR_FINANCES_SECTION_CONSTRUCTION :{GOLD}Ehituskulud STR_FINANCES_SECTION_NEW_VEHICLES :{GOLD}Uus veerem -STR_FINANCES_SECTION_TRAIN_RUNNING_COSTS :{GOLD}Rongide käituskulud -STR_FINANCES_SECTION_ROAD_VEHICLE_RUNNING_COSTS :{GOLD}Mootorsõidukite käituskulud -STR_FINANCES_SECTION_AIRCRAFT_RUNNING_COSTS :{GOLD}Õhusõidukite käituskulud -STR_FINANCES_SECTION_SHIP_RUNNING_COSTS :{GOLD}Laevade käituskulud +STR_FINANCES_SECTION_TRAIN_RUNNING_COSTS :{GOLD}Rongid +STR_FINANCES_SECTION_ROAD_VEHICLE_RUNNING_COSTS :{GOLD}Maanteesõidukite käituskulud +STR_FINANCES_SECTION_AIRCRAFT_RUNNING_COSTS :{GOLD}Õhusõidukid +STR_FINANCES_SECTION_SHIP_RUNNING_COSTS :{GOLD}Laevad +STR_FINANCES_SECTION_INFRASTRUCTURE :{GOLD}Taristu +STR_FINANCES_SECTION_TRAIN_REVENUE :{GOLD}Rongid +STR_FINANCES_SECTION_ROAD_VEHICLE_REVENUE :{GOLD}Maanteesõidukid +STR_FINANCES_SECTION_AIRCRAFT_REVENUE :{GOLD}Õhusõidukid +STR_FINANCES_SECTION_SHIP_REVENUE :{GOLD}Laevad STR_FINANCES_SECTION_LOAN_INTEREST :{GOLD}Laenuintressid STR_FINANCES_SECTION_OTHER :{GOLD}Muud -STR_FINANCES_NEGATIVE_INCOME :{BLACK}-{CURRENCY_LONG} -STR_FINANCES_POSITIVE_INCOME :{BLACK}+{CURRENCY_LONG} +STR_FINANCES_TOTAL_CAPTION :{WHITE}Kokku +STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} +STR_FINANCES_ZERO_INCOME :{CURRENCY_LONG} +STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} +STR_FINANCES_PROFIT :{WHITE}Tulu STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Kontojääk +STR_FINANCES_OWN_FUNDS_TITLE :{WHITE}Omavahendid STR_FINANCES_LOAN_TITLE :{WHITE}Laen +STR_FINANCES_INTEREST_RATE :{WHITE}Laenuintress: {BLACK}{NUM}% STR_FINANCES_MAX_LOAN :{WHITE}Laenulimiit: {BLACK}{CURRENCY_LONG} STR_FINANCES_TOTAL_CURRENCY :{BLACK}{CURRENCY_LONG} +STR_FINANCES_BANK_BALANCE :{WHITE}{CURRENCY_LONG} STR_FINANCES_BORROW_BUTTON :{BLACK}Laena {CURRENCY_LONG} STR_FINANCES_BORROW_TOOLTIP :{BLACK}Laena raha STR_FINANCES_REPAY_BUTTON :{BLACK}Tagasimakse {CURRENCY_LONG} @@ -3737,7 +3860,7 @@ STR_INDUSTRY_VIEW_PRODUCES_N_CARGO :{BLACK}Toodab: STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :, {STRING}{STRING} STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Nõuab: -STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{0:STRING}{BLACK}{3:STRING} STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} ootel{STRING} STR_CONFIG_GAME_PRODUCTION :{WHITE}Tootlikuse muutmine (kaheksaga jaguv, kuni 2040) @@ -3767,6 +3890,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Saada ju STR_VEHICLE_LIST_REPLACE_VEHICLES :Asenda veovahendeid STR_VEHICLE_LIST_SEND_FOR_SERVICING :Saada hooldusesse STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Selle aasta kasum: {CURRENCY_LONG} (eelneval: {CURRENCY_LONG}) +STR_VEHICLE_LIST_CARGO :{TINY_FONT}{BLACK}[{CARGO_LIST}] +STR_VEHICLE_LIST_NAME_AND_CARGO :{TINY_FONT}{BLACK}{STRING} {STRING} STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Saada depoose STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Saada depoose @@ -3799,7 +3924,7 @@ STR_GROUP_CREATE_TOOLTIP :{BLACK}Klõpsa STR_GROUP_DELETE_TOOLTIP :{BLACK}Eemalda valitud jagu STR_GROUP_RENAME_TOOLTIP :{BLACK}Ümbernimeta valitud jagu STR_GROUP_LIVERY_TOOLTIP :{BLACK}Muuda valitud jao värvistikku -STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Klõpsa, et kaitsta seda jagu globaalse automaatasenduse eest +STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Klõpsa, et kaitsta seda jagu globaalse automaatasenduse eest. Ctrl+klõps kaitsmaks ka alamkategooriaid. STR_QUERY_GROUP_DELETE_CAPTION :{WHITE}Kõrvalda jagu STR_GROUP_DELETE_QUERY_TEXT :{WHITE}Kas oled kindel, et tahad kustutada selle grupi ja kõik järglased? @@ -3821,7 +3946,7 @@ STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Uus elektriraud STR_BUY_VEHICLE_TRAIN_MONORAIL_CAPTION :Uus monorelsssõiduk STR_BUY_VEHICLE_TRAIN_MAGLEV_CAPTION :Uus magnethõljuksõiduk -STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :Uued mootorsõidukid +STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :Uued maanteesõidukid STR_BUY_VEHICLE_TRAM_VEHICLE_CAPTION :Uued trammid # Vehicle availability @@ -3860,6 +3985,9 @@ STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Tegevusr STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Õhusõiduki liik: {GOLD}{STRING} ###length 3 +STR_CARGO_TYPE_FILTER_ALL :Kõik veoseliigid +STR_CARGO_TYPE_FILTER_FREIGHT :Kaubad +STR_CARGO_TYPE_FILTER_NONE :Puudub ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Nimekiri raudteesõidukitest - andmete saamiseks klõpsa raudteesõidukile @@ -4029,7 +4157,7 @@ STR_ENGINE_PREVIEW_AIRCRAFT :õhusõiduki STR_ENGINE_PREVIEW_SHIP :laeva STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Hind: {CURRENCY_LONG} Tühimass: {WEIGHT_SHORT}{}Tippkiirus: {VELOCITY} Võimsus: {POWER}{}Käituskulud: {CURRENCY_LONG}/aastas{}Kandevõime: {CARGO_LONG} -STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Hind: {CURRENCY_LONG} Tühimass: {WEIGHT_SHORT}{}Kiirus: {VELOCITY} Võimsus: {POWER} Veojõud: {6:FORCE}{}Käituskulud: {4:CURRENCY_LONG}/aasta{}Mahutavus: {5:CARGO_LONG} +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Hind: {0:CURRENCY_LONG} Tühimass: {1:WEIGHT_SHORT}{}Kiirus: {2:VELOCITY} Võimsus: {3:POWER} Veojõud: {6:FORCE}{}Käituskulud: {4:CURRENCY_LONG}/aasta{}Mahutavus: {5:CARGO_LONG} STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Hind: {CURRENCY_LONG} Tippkiirus: {VELOCITY}{}Kandevõime: {CARGO_LONG}{}Käituskulud: {CURRENCY_LONG}/a STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Maksumus: {CURRENCY_LONG} Tippkiirus: {VELOCITY}{}Õhusõiduki liik: {STRING}{}Mahutavus: {CARGO_LONG}, {CARGO_LONG}{}Käituskulud: {CURRENCY_LONG}/aasta STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Hind: {CURRENCY_LONG} Tippkiirus: {VELOCITY}{}Õhusõiduki liik: {STRING}{}kandevõime: {CARGO_LONG}{}Käitluskulud: {CURRENCY_LONG}/a @@ -4083,7 +4211,9 @@ STR_REPLACE_MAGLEV_VEHICLES :Magnethõljukve STR_REPLACE_ROAD_VEHICLES :Maanteesõidukid STR_REPLACE_TRAM_VEHICLES :Trammid +STR_REPLACE_REMOVE_WAGON :{BLACK}Vagunite kõrvaldamine ({STRING}): {ORANGE}{STRING} STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Automaatne asendamine hoiab rongi pikkuse samana, vajadusel kõrvaldab vaguneid (alates esiotsast), kui muidu rongikoosseis suureneks +STR_REPLACE_REMOVE_WAGON_GROUP_HELP :{STRING}. Ctrl+klõps, et rakendada ka alamgruppidele # Vehicle view STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE} @@ -4152,6 +4282,10 @@ STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Suundub STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}Suundub {DEPOT}, {VELOCITY} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}Järelevaatus: {DEPOT}, {VELOCITY} +STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}Ei leita teed jaama {STATION}, {VELOCITY} +STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}Ei leita teed sihtkohta {WAYPOINT}, {VELOCITY} +STR_VEHICLE_STATUS_CANNOT_REACH_DEPOT_VEL :{ORANGE}Ei leita teed sihtkohta {DEPOT}, {VELOCITY} +STR_VEHICLE_STATUS_CANNOT_REACH_DEPOT_SERVICE_VEL :{LTBLUE}Ei leia teed sihtkohta {DEPOT}, {VELOCITY} # Vehicle stopped/started animations ###length 2 @@ -4182,12 +4316,13 @@ STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Tühimas STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Tühimass: {LTBLUE}{WEIGHT_SHORT} {BLACK}Võimsus: {LTBLUE}{POWER}{BLACK} Tippkiirus: {LTBLUE}{VELOCITY} {BLACK}Veojõud: {LTBLUE}{FORCE} STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Kasum sel aastal: {LTBLUE}{CURRENCY_LONG} (eelmisel: {CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Kasum sellel aastal: {LTBLUE}{CURRENCY_LONG} (eelmisel aastal: {CURRENCY_LONG}) {BLACK}Min. jõudlus: {LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Tehnoseisund: {LTBLUE}{COMMA}% {BLACK}Rikkeid eelmisest hooldusest: {LTBLUE}{COMMA} STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Valmistatud: {LTBLUE}{NUM}{BLACK} Väärtus: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_INFO_NO_CAPACITY :{BLACK}Mahutavus: {LTBLUE}Pole{STRING} -STR_VEHICLE_INFO_CAPACITY :{BLACK}Kandevõime: {LTBLUE}{CARGO_LONG}{3:STRING} -STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Kandevõime: {LTBLUE}{CARGO_LONG}{3:STRING} (x{4:NUM}) +STR_VEHICLE_INFO_CAPACITY :{BLACK}Kandevõime: {LTBLUE}{0:CARGO_LONG}{3:STRING} +STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Kandevõime: {LTBLUE}{0:CARGO_LONG}{3:STRING} (x{4:NUM}) STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Kandevõime: {LTBLUE}{CARGO_LONG}, {CARGO_LONG}{STRING} STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Ülekantud tulu: {LTBLUE}{CURRENCY_LONG} @@ -4213,8 +4348,8 @@ STR_VEHICLE_DETAILS_TRAIN_ENGINE_BUILT_AND_VALUE :{LTBLUE}{ENGINE STR_VEHICLE_DETAILS_TRAIN_WAGON_VALUE :{LTBLUE}{ENGINE}{BLACK} Väärtus: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY_TEXT :{BLACK}Selle rongi kandevõime: -STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY :{LTBLUE}- {CARGO_LONG} ({CARGO_SHORT}) -STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY_MULT :{LTBLUE}- {CARGO_LONG} ({CARGO_SHORT}) (x{NUM}) +STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY :{LTBLUE}{CARGO_LONG} ({CARGO_SHORT}) +STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY_MULT :{LTBLUE}{CARGO_LONG} ({CARGO_SHORT}) (x{NUM}) STR_VEHICLE_DETAILS_CARGO_EMPTY :{LTBLUE}Tühi STR_VEHICLE_DETAILS_CARGO_FROM :{LTBLUE}{CARGO_LONG} jaamast {STATION} @@ -4456,22 +4591,22 @@ STR_TIMETABLE_STARTING_DATE :{BLACK}Alguskuu STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Vali graafiku alguskuupäev. Ctrl-klõps määrab graafiku alguskuupäeva ja jaotab sõidukid ühtlaselt, kasutades järjestust, kui sihid on planeeritud STR_TIMETABLE_CHANGE_TIME :{BLACK}Muuda aega -STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Muuda märgitud korraldusele määratud aega +STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Muuda märgitud korraldusele määratud aega. Ctrl+klõps seab aja kõigile korraldustele STR_TIMETABLE_CLEAR_TIME :{BLACK}Tühista aeg -STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Tühista korralduse täitmiseks määratud aeg +STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Tühista korralduse täitmiseks määratud aeg. Ctrl+klõps tühistab kõik korraldustele määratud ajad STR_TIMETABLE_CHANGE_SPEED :{BLACK}Muuda kiiruspiirangut -STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Muuda märgitud korralduse kiiruspiirangut +STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Muuda märgitud korralduse kiiruspiirangut. Ctrl+klõps seab kiiruspiirangu kõigile korraldustele STR_TIMETABLE_CLEAR_SPEED :{BLACK}Kustuta kiiruspiirang -STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Eemalda märgitud korralduse kiiruspiirang +STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Eemalda märgitud korralduse kiiruspiirang. Ctrl+klõps tühistab kõik korraldustele määratud kiiruspiirangud STR_TIMETABLE_RESET_LATENESS :{BLACK}Nulli hilinemisarvesti STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Nulli hilinemisarvesti, nii et sõiduk oleks graafikus STR_TIMETABLE_AUTOFILL :{BLACK}Isetäituv -STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Kasuta liiniplaani täitmiseks järgmise sõidu andmeid (Ctrl+klõps säilitab ooteajad) +STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Kasuta liiniplaani täitmiseks järgmise sõidu andmeid. Ctrl+klõps proovib säilitab ooteajad STR_TIMETABLE_EXPECTED :{BLACK}Eeldatav STR_TIMETABLE_SCHEDULED :{BLACK}Plaanis @@ -4515,6 +4650,8 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Üks skr STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}AI/GameScripti debugimise akent saab kasutada ainult serveris # AI configuration window +STR_AI_CONFIG_CAPTION_AI :{WHITE}TI Konfiguratsioon +STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}GameScript'i Konfiguratsioon STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Järgmises mängus laaditav GameScript STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}AI-d järgmises mängus STR_AI_CONFIG_HUMAN_PLAYER :Inimene @@ -4528,10 +4665,11 @@ STR_AI_CONFIG_MOVE_DOWN :{BLACK}Langeta STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Langeta valitud AI loendis madalamale STR_AI_CONFIG_GAMESCRIPT :{SILVER}GameScript +STR_AI_CONFIG_GAMESCRIPT_PARAM :{SILVER}Parameetrid STR_AI_CONFIG_AI :{SILVER}AI-d -STR_AI_CONFIG_CHANGE_AI :AI -STR_AI_CONFIG_CHANGE_GAMESCRIPT :GameScript +STR_AI_CONFIG_CHANGE_AI :{BLACK} Vali TI +STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK} Vali GameScript STR_AI_CONFIG_CHANGE_GAMESCRIPT.g :GameScripti STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Lae teine skript STR_AI_CONFIG_CONFIGURE :{BLACK}Seadistamine @@ -4560,8 +4698,10 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Terve ka STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Kõrguskaardi ekraanipilt STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Pisikaardi ekraanipilt -# AI Parameters +# Script Parameters +STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameetrid STR_AI_SETTINGS_CAPTION_AI :AI +STR_AI_SETTINGS_CAPTION_GAMESCRIPT :GameScript STR_AI_SETTINGS_CLOSE :{BLACK}Sulge STR_AI_SETTINGS_RESET :{BLACK}Nulli STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4642,8 +4782,8 @@ STR_WARNING_HEIGHTMAP_SCALE_MESSAGE :{YELLOW}Kaardi STR_WARNING_FALLBACK_SOUNDSET :{WHITE}Mäng ei leidnud helisid. Helid saad paigaldada Internetisisu laadimise aknast # Screenshot related messages -STR_WARNING_SCREENSHOT_SIZE_CAPTION :{WHITE}Hiiglaslik kuvapaugutus -STR_WARNING_SCREENSHOT_SIZE_MESSAGE :{YELLOW}Kuvapaugutuse mõõtmed saavad olema {COMMA} x {COMMA} pikslit. Kuvapaugutuse tegemine võib võtta tükk aega. Kas sa oled kindel, et sa soovid jätkata? +STR_WARNING_SCREENSHOT_SIZE_CAPTION :{WHITE}Hiigelsuur ekraanipilt +STR_WARNING_SCREENSHOT_SIZE_MESSAGE :{YELLOW}Ekraanipildi mõõtmed saavad olema {COMMA} x {COMMA} pikslit. Ekraanipildi tegemine võib võtta tükk aega. Kas sa oled kindel, et sa soovid jätkata? STR_MESSAGE_HEIGHTMAP_SUCCESSFULLY :{WHITE}Kõrguskaart edukalt salvestatud, kui '{STRING}'. Kõrgpunkt on {NUM} STR_MESSAGE_SCREENSHOT_SUCCESSFULLY :{WHITE}Ekraanipilt on edukalt salvestatud nimega '{STRING}' @@ -4725,6 +4865,7 @@ STR_ERROR_TOO_MANY_INDUSTRIES :{WHITE}... liig STR_ERROR_CAN_T_GENERATE_INDUSTRIES :{WHITE}Tööstust ei saa tekitada... STR_ERROR_CAN_T_BUILD_HERE :{WHITE}{STRING} ei saa siia ehitada... STR_ERROR_CAN_T_CONSTRUCT_THIS_INDUSTRY :{WHITE}Seda tüüpi tööstust ei saa siia ehitada... +STR_ERROR_CAN_T_PROSPECT_INDUSTRY :{WHITE}Tööstust ei saa rahastada... STR_ERROR_INDUSTRY_TOO_CLOSE :{WHITE}... liiga lähedal mõnele teisele tööstusele STR_ERROR_MUST_FOUND_TOWN_FIRST :{WHITE}... enne pead asula rajama STR_ERROR_ONLY_ONE_ALLOWED_PER_TOWN :{WHITE}... iga asula kohta lubatud ainult üks @@ -4739,6 +4880,8 @@ STR_ERROR_FOREST_CAN_ONLY_BE_PLANTED :{WHITE}... mets STR_ERROR_CAN_ONLY_BE_BUILT_ABOVE_SNOW_LINE :{WHITE}... saab ehitada ainult ülespoole lumepiiri STR_ERROR_CAN_ONLY_BE_BUILT_BELOW_SNOW_LINE :{WHITE}... saab ehitada ainult allapoole lumepiiri +STR_ERROR_PROSPECTING_WAS_UNLUCKY :{WHITE}Halva õnne tõttu ei viinud rahastus tööstuse rajamiseni; proovi uuesti +STR_ERROR_NO_SUITABLE_PLACES_FOR_PROSPECTING :{WHITE}Antud tööstusele ei leitud perspektiivikat asukohta STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES :{WHITE} '{STRING}' tööstuste jaoks polnud sobivaid asukohti STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES_EXPLANATION :{WHITE}Muuda kaardigeneratsiooni parameetreid, et saada parem kaart @@ -4906,6 +5049,7 @@ STR_ERROR_OBJECT_IN_THE_WAY :{WHITE}Mingi ob STR_ERROR_COMPANY_HEADQUARTERS_IN :{WHITE}... ettevõtte peakorter on ees STR_ERROR_CAN_T_PURCHASE_THIS_LAND :{WHITE}Seda maad ei saa osta... STR_ERROR_YOU_ALREADY_OWN_IT :{WHITE}... see on juba sinu oma! +STR_ERROR_BUILD_OBJECT_LIMIT_REACHED :{WHITE}... objekti rajamise limiit täis # Group related errors STR_ERROR_GROUP_CAN_T_CREATE :{WHITE}Ei saa jagu luua... @@ -4978,6 +5122,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Hooldusv STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... sõiduk hävitatud +STR_ERROR_CAN_T_CLONE_VEHICLE_LIST :{WHITE}... kõik sõidukid ei ole identsed STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Ühtegi sõidukit ei ole saadaval STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Muuda NewGRF-i seadistust @@ -5005,6 +5150,8 @@ STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}Teisi ko STR_ERROR_CAN_T_COPY_SHARE_ORDER :{WHITE}sõiduk ei saa igasse jaama minna STR_ERROR_CAN_T_ADD_ORDER :{WHITE}sõiduk ei saa antud jaama minna STR_ERROR_CAN_T_ADD_ORDER_SHARED :{WHITE}... seda korraldust jagav sõiduk ei saa sinna jaama minna +STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST :{WHITE}... kõigil sõidukitel ei ole ühesugused korraldused +STR_ERROR_CAN_T_SHARE_ORDER_VEHICLE_LIST :{WHITE}... mitte kõik sõidukid ei jaga korraldusi STR_ERROR_CAN_T_SHARE_ORDER_LIST :{WHITE}Sihtpunktide nimekirja ei saa jagada... STR_ERROR_CAN_T_STOP_SHARING_ORDER_LIST :{WHITE}Korralduste jagamist ei saa peatada... diff --git a/src/lang/faroese.txt b/src/lang/faroese.txt index 4ddb4c4728..f3c80ec426 100644 --- a/src/lang/faroese.txt +++ b/src/lang/faroese.txt @@ -1098,6 +1098,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Høgra STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Hægst loyvda byrjunar lán: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Mest loyvda upphæddin ein fyritøka kann lána (uttan at taka virðisminkan til eftirtektar) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Rentu stigi: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Rentustigi á láni, stýrir eisini virðisminkan um hon er sligin til @@ -3702,7 +3703,7 @@ STR_AI_LIST_CANCEL :{BLACK}Angra STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Ikki broyta scripti -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :AI STR_AI_SETTINGS_CLOSE :{BLACK}Lat aftur STR_AI_SETTINGS_RESET :{BLACK}Endurstilla diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index 3de2b25599..d7a07a8ea4 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -1218,6 +1218,9 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :oikealla STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Suurin mahdollinen laina alussa: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Suurin mahdollinen yhtiön ottama laina (ottamatta huomioon inflaatiota) +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_VALUE :{CURRENCY_LONG} +###setting-zero-is-special +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_DISABLED :Ei lainaa {RED}Vaatii peliskriptin, joka tarjoaa alkupääoman STR_CONFIG_SETTING_INTEREST_RATE :Korko: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Lainan korko; ohjaa myös inflaatiota mikäli käytössä @@ -3365,8 +3368,8 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Varoitus: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Virhe: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Virhe: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Vakava NewGRF-virhe on tapahtunut:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}NewGRF-virhe on tapahtunut:{}{STRING} +STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}NewGRF ”{STRING}” on kohdannut vakavan virheen:{}{STRING} +STR_NEWGRF_ERROR_POPUP :{WHITE}NewGRF ”{STRING}” on kohdannut virheen:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} ei toimi OpenTTD:n ilmoittaman TTDPatch-version kanssa STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} on TTD:n {2:STRING}-versiota varten STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} on suunniteltu toimimaan lisäosan {2:STRING} kanssa @@ -4615,9 +4618,9 @@ STR_AI_CONFIG_CONFIGURE :{BLACK}Määrit STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Määritä skriptin parametrit # Available AIs window -STR_AI_LIST_CAPTION :{WHITE}Saatavilla {STRING} -STR_AI_LIST_CAPTION_AI :Tekoälyt -STR_AI_LIST_CAPTION_GAMESCRIPT :Peliskriptit +STR_AI_LIST_CAPTION :{WHITE}Saatavilla olevat {STRING} +STR_AI_LIST_CAPTION_AI :tekoälyt +STR_AI_LIST_CAPTION_GAMESCRIPT :peliskriptit STR_AI_LIST_TOOLTIP :{BLACK}Napsauta valitaksesi skriptin STR_AI_LIST_AUTHOR :{LTBLUE}Tekijä: {ORANGE}{STRING} @@ -4637,8 +4640,10 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Koko kar STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Korkeuskartan kuvakaappaus STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Pienoiskartan kuvakaappaus -# AI Parameters -STR_AI_SETTINGS_CAPTION_AI :{WHITE}Tekoälyn parametrit +# Script Parameters +STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametrit +STR_AI_SETTINGS_CAPTION_AI :Tekoäly +STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Peliskripti STR_AI_SETTINGS_CLOSE :{BLACK}Sulje STR_AI_SETTINGS_RESET :{BLACK}Palauta STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} diff --git a/src/lang/french.txt b/src/lang/french.txt index a59752d166..050dba7439 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -1219,6 +1219,9 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :À droite STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Emprunt initial maximum{NBSP}: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Montant maximum qu'une compagnie peut emprunter (sans tenir compte de l'inflation) +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_VALUE :{CURRENCY_LONG} +###setting-zero-is-special +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_DISABLED :Pas d'emprunt {RED}Nécessite un script de jeu qui fournit les fonds initiaux STR_CONFIG_SETTING_INTEREST_RATE :Taux d'intérêt{NBSP}: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Taux d’intérêt de l'emprunt{NBSP}; contrôle également l'inflation si activé @@ -2070,18 +2073,18 @@ STR_VIDEO_DRIVER_ERROR_NO_HARDWARE_ACCELERATION :{WHITE} ... auc # Intro window STR_INTRO_CAPTION :{WHITE}OpenTTD {REV} -STR_INTRO_NEW_GAME :{BLACK}Nouvelle partie +STR_INTRO_NEW_GAME :{BLACK}Jouer une nouvelle partie STR_INTRO_LOAD_GAME :{BLACK}Charger une partie STR_INTRO_PLAY_SCENARIO :{BLACK}Jouer un scénario STR_INTRO_PLAY_HEIGHTMAP :{BLACK}Jouer une carte d'altitude STR_INTRO_SCENARIO_EDITOR :{BLACK}Éditeur de scénario -STR_INTRO_MULTIPLAYER :{BLACK}Mode multijoueurs +STR_INTRO_MULTIPLAYER :{BLACK}Jouer en multijoueur -STR_INTRO_GAME_OPTIONS :{BLACK}Options +STR_INTRO_GAME_OPTIONS :{BLACK}Options globales STR_INTRO_HIGHSCORE :{BLACK}Meilleurs scores -STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Paramètres +STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Paramètres de jeu STR_INTRO_NEWGRF_SETTINGS :{BLACK}Paramètres NewGRF -STR_INTRO_ONLINE_CONTENT :{BLACK}Vérifier le contenu en ligne +STR_INTRO_ONLINE_CONTENT :{BLACK}Contenue additionnel en ligne STR_INTRO_AI_SETTINGS :{BLACK}Configuration des IAs STR_INTRO_GAMESCRIPT_SETTINGS :{BLACK}Configuration du script de jeu STR_INTRO_QUIT :{BLACK}Quitter @@ -2239,18 +2242,18 @@ STR_NETWORK_SERVER_VISIBILITY_INVITE_ONLY :Invitation uniq # Network server list STR_NETWORK_SERVER_LIST_CAPTION :{WHITE}Multijoueurs -STR_NETWORK_SERVER_LIST_PLAYER_NAME :{BLACK}Nom du joueur{NBSP}: +STR_NETWORK_SERVER_LIST_PLAYER_NAME :{BLACK}Votre nom de joueur : STR_NETWORK_SERVER_LIST_ENTER_NAME_TOOLTIP :{BLACK}Ceci est le nom sous lequel vous serez connu des autres joueurs -STR_NETWORK_SERVER_LIST_GAME_NAME :{BLACK}Nom +STR_NETWORK_SERVER_LIST_GAME_NAME :{BLACK}Nom de la partie STR_NETWORK_SERVER_LIST_GAME_NAME_TOOLTIP :{BLACK}Nom de la partie STR_NETWORK_SERVER_LIST_GENERAL_ONLINE :{BLACK}{COMMA}/{COMMA} - {COMMA}/{COMMA} -STR_NETWORK_SERVER_LIST_CLIENTS_CAPTION :{BLACK}Clients +STR_NETWORK_SERVER_LIST_CLIENTS_CAPTION :{BLACK}Clients - Compagnies STR_NETWORK_SERVER_LIST_CLIENTS_CAPTION_TOOLTIP :{BLACK}Clients en ligne / clients max.{}Compagnies en ligne / compagnies max. STR_NETWORK_SERVER_LIST_MAP_SIZE_SHORT :{BLACK}{COMMA}{NBSP}×{NBSP}{COMMA} STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION :{BLACK}Taille STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}Taille de la carte{}Cliquer pour trier par surface -STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}Date +STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}Année en jeu STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}Date courante STR_NETWORK_SERVER_LIST_YEARS_CAPTION :{BLACK}Années STR_NETWORK_SERVER_LIST_YEARS_CAPTION_TOOLTIP :{BLACK}Nombre d'années{}écoulées dans le jeu @@ -2284,11 +2287,11 @@ STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}Actualis 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 :{BLACK}Recherche sur le réseau local STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN_TOOLTIP :{BLACK}Rechercher des serveurs sur le réseau local STR_NETWORK_SERVER_LIST_ADD_SERVER :{BLACK}Ajouter un serveur STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Ajouter un serveur à la liste. Ce peut être soit une adresse de serveur, soit un code d'invitation -STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Héberger/créer un serveur de jeu +STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Créer un serveur de jeu STR_NETWORK_SERVER_LIST_START_SERVER_TOOLTIP :{BLACK}Démarrer son propre serveur, sur cet ordinateur-ci STR_NETWORK_SERVER_LIST_PLAYER_NAME_OSKTITLE :{BLACK}Entrer votre nom @@ -3368,8 +3371,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Attention{NBSP}: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Erreur{NBSP}: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Erreur fatale{NBSP}: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Une erreur NewGRF fatale est survenue{NBSP}:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}Une erreur NewGRF est survenue{NBSP}:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} ne fonctionnera pas avec la version de TTDPatch rapportée par OpenTTD STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} est conçu pour la version {2:STRING} de TTD STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} est conçu pour être utilisé avec {2:STRING} @@ -4640,8 +4641,10 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Capture STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Capture d'écran de la carte d'altitude STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Capture d'écran de la mini-carte -# AI Parameters -STR_AI_SETTINGS_CAPTION_AI :{WHITE}Paramètres de l'IA +# Script Parameters +STR_AI_SETTINGS_CAPTION :{WHITE}Paramètres {STRING} +STR_AI_SETTINGS_CAPTION_AI :de l'IA +STR_AI_SETTINGS_CAPTION_GAMESCRIPT :du script de jeu STR_AI_SETTINGS_CLOSE :{BLACK}Fermer STR_AI_SETTINGS_RESET :{BLACK}Réinitialiser STR_AI_SETTINGS_SETTING :{STRING}{NBSP}: {ORANGE}{STRING} diff --git a/src/lang/frisian.txt b/src/lang/frisian.txt index 7b8e8df215..8205ab0fb5 100644 --- a/src/lang/frisian.txt +++ b/src/lang/frisian.txt @@ -1156,6 +1156,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Rjochts STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maksimale startersliening: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maksimale bedrach hokker troch in bedriuw lient wurde kin (sûnder acht te slaan op de ynflaasje) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Rinte: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Rinte op liening; behearsket ek ynflaasje at dizze oan stiet @@ -2886,7 +2887,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Warskôging: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Flater: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Fatale flater: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Der hat in fatale NewGRF-flater plakfûn:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} sil net wurkje kinne mei de TTDPatch-ferzje dy't troch OpenTTD meldt wurdt STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} is makke foar de {STRING}-ferzje fan TTD STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} makke om te brûken tegeare my{STRING} @@ -3898,7 +3898,7 @@ STR_AI_LIST_CANCEL :{BLACK}Annulear STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Skript net feroare -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :AI STR_AI_SETTINGS_CLOSE :{BLACK}Slúte STR_AI_SETTINGS_RESET :{BLACK}Weromsette diff --git a/src/lang/gaelic.txt b/src/lang/gaelic.txt index 1e27a1aed3..715ed21fc4 100644 --- a/src/lang/gaelic.txt +++ b/src/lang/gaelic.txt @@ -1340,6 +1340,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Ris an taobh de STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Iasad tòiseachaidh as motha: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :An t-airgead as motha as urrainn dha chompanaidh fhaighinn mar iasad (a' fàgail an atmhorachd dhan darna taobh) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Luach-rèidh: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Luach-rèidh iasaid; stiùiridh seo an atmhorachd cuideachd ma tha e an comas @@ -3269,7 +3270,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Rabhadh: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Mearachd: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Marbhtach: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Thachair mearachd NewGRF marbhtach:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :Chan obraich {1:STRING} leis an tionndadh aig TTDPatch a chaidh aithris le OpenTTD STR_NEWGRF_ERROR_DOS_OR_WINDOWS :Tha {1:STRING} airson tionndadh {STRING} aig TTD STR_NEWGRF_ERROR_UNSET_SWITCH :Chaidh {1:STRING} a dhealbhachadh gus cleachdadh le {STRING} @@ -4445,7 +4445,7 @@ STR_AI_LIST_CANCEL :{BLACK}Sguir dh STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Na atharraich an sgriobt -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :IF STR_AI_SETTINGS_CLOSE :{BLACK}Dùin STR_AI_SETTINGS_RESET :{BLACK}Ath-shuidhich diff --git a/src/lang/galician.txt b/src/lang/galician.txt index 08a5244e63..b7c8da76f0 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -1218,6 +1218,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Dereita STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Crédito máximo inicial: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Cantidade máxima de cartos que unha compañía pode pedir (sen ter en conta a inflación) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Taxa de interés: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :A taxa de interés do préstamo; controla tamén a inflación, se está activada @@ -3361,8 +3362,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Coidado: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Erro: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Erro fatal: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Ocorreu un erro fatal de NewGRF:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}Ocurriu un erro cun NewGRF:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} non funcionará coa versión de TTDPatch reportada por OpenTTD. STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} é para a versión {2:STRING} de TTD. STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} está deseñado para ser usado con {2:STRING} @@ -4633,7 +4632,7 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Captura STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Captura de pantalla do mapa de alturas STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Captura de pantalla do minimapa -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :{WHITE}Parámetros da IA STR_AI_SETTINGS_CLOSE :{BLACK}Pechar STR_AI_SETTINGS_RESET :{BLACK}Restablecer diff --git a/src/lang/german.txt b/src/lang/german.txt index 635af73b7b..7a838e729a 100644 --- a/src/lang/german.txt +++ b/src/lang/german.txt @@ -1265,6 +1265,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Rechts STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Kreditlimit bei Spielbeginn: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maximaler Kredit für eine Firma (ohne Berücksichtigung der Inflation) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Zinssatz: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Zinssatz für Kredite; beeinflusst auch die Inflation, falls aktiv @@ -4313,8 +4314,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Warnung: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Fehler: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Schwerer Fehler: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Ein schwerer NewGRF-Fehler ist aufgetreten:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}Ein NewGRF-Fehler ist aufgetreten:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} funktioniert nicht im Zusammenhang mit der von OpenTTD ermittelten TTDPatch-Version STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} ist für die {2:STRING}-Version von TTD STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} ist für die Nutzung mit {2:STRING} vorgesehen @@ -5996,7 +5995,7 @@ STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Übersic STR_SCREENSHOT_TOPOGRAPHY_SCREENSHOT :{BLACK}Topographischer Screenshot STR_SCREENSHOT_INDUSTRY_SCREENSHOT :{BLACK}Industrie-Screenshot -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :{WHITE}KI-Parameter STR_AI_SETTINGS_CLOSE :{BLACK}Schließen STR_AI_SETTINGS_RESET :{BLACK}Zurücksetzen diff --git a/src/lang/greek.txt b/src/lang/greek.txt index b4eabcec1b..d409e0d18f 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -1323,6 +1323,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Δεξιά STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Μέγιστο αρχικό δάνειο: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Μέγιστο ποσό που μπορεί να δανειστεί μία εταιρία (χωρίς να λαμβάνεται υπόψη ο πληθωρισμός) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Επιτόκιο: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Επιτόκιο δανείων· επίσης ελέγχεται ο πληθωρισμός αν είναι ενεργοποιημένος @@ -3465,8 +3466,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Προειδοποίηση: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Λάθος: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Καταστροφικό: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Ένα καταστροφικό λάθος για τα NewGRF έχει συμβεί:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}Ένα NewGRF λάθος έχει συμβεί:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :Το {1:STRING} δεν θα δουλέψει με την έκδοση του TTDPatch όπως αναφέρεται από το OpenTTD STR_NEWGRF_ERROR_DOS_OR_WINDOWS :Το {1:STRING} είναι για την έκδοση {STRING} του TTD STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} είναι σχεδιασμένο να δουλέψει με το {STRING} @@ -4745,7 +4744,7 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Στιγ STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Στιγμιότυπο χάρτη υψομετρίας STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Στιγμιότυπο μίνι χάρτη -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :AI STR_AI_SETTINGS_CLOSE :{BLACK}Κλείσιμο STR_AI_SETTINGS_RESET :{BLACK}Επαναφορά diff --git a/src/lang/hebrew.txt b/src/lang/hebrew.txt index d196a8c149..49f564efd2 100644 --- a/src/lang/hebrew.txt +++ b/src/lang/hebrew.txt @@ -1169,6 +1169,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :ימין STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :סכום הלוואה ראשוני: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :סכום מירבי שחברה יכולה ללוות (מבלי לקחת בחשבון אינפלציה) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :ריבית: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :ריבית עבור הלוואות; שולטת גם באינפלציה אם זו מאופשרות @@ -3137,7 +3138,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}אזהרה: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{SILVER}{STRING}{RED}: שגיאה STR_NEWGRF_ERROR_MSG_FATAL :{SILVER}{STRING}{RED} :שגיאה חמורה -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}התרחשה שגיאה קריטית ב-NewGRF:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} לא יעבוד עם גרסת ה-TTDPatch שדווחה ע"י OpenTTD. STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} היא עבור גרסת {STRING} של TTD. STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} נועד להיות בשימוש יחד עם {STRING} @@ -3606,6 +3606,7 @@ STR_GROUPS_CLICK_ON_GROUP_FOR_TOOLTIP :{BLACK}קבוצ STR_GROUP_CREATE_TOOLTIP :{BLACK}לחץ ליצירת קבוצה חדשה STR_GROUP_DELETE_TOOLTIP :{BLACK}מחק את הקבוצה שנבחרה STR_GROUP_RENAME_TOOLTIP :{BLACK}שנה את שם הקבוצה +STR_GROUP_LIVERY_TOOLTIP :{BLACK}שינוי צבע הקבוצה שנבחרה STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}לחץ על מנת להגן על הכלים בקבוצה בפני החלפה אוטומטית STR_QUERY_GROUP_DELETE_CAPTION :{WHITE}מחק קבוצה @@ -3685,6 +3686,7 @@ STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}רכוש STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}רכוש את כלי הטייס שמודגש. Shift+לחיצה מציג הערכת עלות ללא רכישה ###length VEHICLE_TYPES +STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}לרכוש ולאבזר את הרכבת הנבחרת. לחיצה+מקש Shift תציג עלות משוערת מבלי לבצע רכישה בפועל ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_RENAME_BUTTON :{BLACK}שנה שם @@ -4304,6 +4306,7 @@ STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}חלו # AI configuration window STR_AI_CONFIG_CAPTION_AI :{WHITE} הגדרת בינה מלאכותית +STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}הגדרות סקריפטי משחק STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}סקריפט המשחק אשר יטען במשחק הבא STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}שחקני המחשב אשר יטענו במשחק הבא STR_AI_CONFIG_HUMAN_PLAYER :שחקן אנושי @@ -4345,7 +4348,7 @@ STR_SCREENSHOT_SCREENSHOT :תמונת מס STR_SCREENSHOT_DEFAULTZOOM_SCREENSHOT :{BLACK}זום ברירת מחדל לצילום מסך STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}צילום מסך של כל המפה -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :שחקן מחשב STR_AI_SETTINGS_CLOSE :{BLACK}סגור STR_AI_SETTINGS_RESET :{BLACK}אתחל diff --git a/src/lang/hindi.txt b/src/lang/hindi.txt index b2f124e3b2..e141ae8939 100644 --- a/src/lang/hindi.txt +++ b/src/lang/hindi.txt @@ -340,6 +340,7 @@ STR_CONFIG_SETTING_COMPANIES_OFF :बन्द ###length 3 +###setting-zero-is-special @@ -1258,7 +1259,7 @@ STR_AI_DEBUG_NAME_AND_VERSION :{BLACK}{STRING} -# AI Parameters +# Script Parameters # Textfile window diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index 04bd8964c6..e22fcf5c87 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -1282,6 +1282,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Jobbra STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maximális kezdeti hitelkeret: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maximálisan kölcsönözhető összeg (az inflációtól eltekintve) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Kamatláb: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Banki hitel kamat; inflációt is szabályozza, ha be van kapcsolva @@ -3427,8 +3428,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Figyelmeztetés: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Hiba: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Végzetes hiba: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Egy végzetes NewGRF hiba történt:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}NewGRF hiba történt:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} nem fog működni az OpenTTD által jelentett TTDPatch verzióval STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} a TTD {2:STRING} verziójához van STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} úgy lett tervezve, hogy együtt lesz használva ezzel: {2:STRING} @@ -4699,7 +4698,7 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Teljes t STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Magasságtérkép mentése STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Minitérkép mentése -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :{WHITE}MI paraméterei STR_AI_SETTINGS_CLOSE :{BLACK}Bezárás STR_AI_SETTINGS_RESET :{BLACK}Visszaállítás diff --git a/src/lang/icelandic.txt b/src/lang/icelandic.txt index cb4b4f21a9..af0c931059 100644 --- a/src/lang/icelandic.txt +++ b/src/lang/icelandic.txt @@ -1097,6 +1097,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Hægri STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Hámarkslán: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Hámarks upphæð sem fyrirtæki getur fengið lánað (ekki er gert ráð fyrir verðbólgu) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Vextir: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Vextir á lánum, stjórnar einnig verðbólgu, ef hún er virk @@ -2839,7 +2840,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Aðvörun: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Villa: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Banvænt: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Alvarleg NewGRF villa átti sér stað:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} Mun ekki virka með útgáfu TTDPatch sem OpenTTD gefur til kynna. STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} er fyrir {STRING} útgáfu af TTD. STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} er hannað til að notast með {STRING} @@ -3936,7 +3936,7 @@ STR_AI_LIST_CANCEL :{BLACK}Hætta v STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Hætta við breytingar forskriftar -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :Gervigreindar STR_AI_SETTINGS_CLOSE :{BLACK}Loka STR_AI_SETTINGS_RESET :{BLACK}Frumstilla diff --git a/src/lang/ido.txt b/src/lang/ido.txt index d70c008177..356b0632c9 100644 --- a/src/lang/ido.txt +++ b/src/lang/ido.txt @@ -563,6 +563,7 @@ STR_CONFIG_SETTING_NONE :Nulo ###length 3 +###setting-zero-is-special @@ -1463,7 +1464,7 @@ STR_AI_DEBUG_NAME_AND_VERSION :{BLACK}{STRING} -# AI Parameters +# Script Parameters STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} diff --git a/src/lang/indonesian.txt b/src/lang/indonesian.txt index 4549ed7127..2d1a8b54ba 100644 --- a/src/lang/indonesian.txt +++ b/src/lang/indonesian.txt @@ -1218,6 +1218,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Kanan STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maksimum pinjaman awal: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Jumlah maksimum yang dapat dipinjam (tanpa menghitung inflasi) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Bunga pinjaman: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Bunga pinjaman; juga mengendalikan inflasi jika dinyalakan @@ -3361,8 +3362,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Peringatan: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Kesalahan: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Fatal: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Kesalahan fatal NewGRF telah terjadi:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}Terjadi galat pada NewGRF:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} tidak akan bekerja dengan versi TTDPatch yang telah dilaporkan oleh OpenTTD STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} untuk TTD versi {2:STRING} STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} didesain untuk digunakan dengan {2:STRING} @@ -4633,7 +4632,7 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK} Tangkap STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Tangkapan layar Peta Ketinggian STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Tangkapan layar minimap -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :{WHITE}Parameter AI STR_AI_SETTINGS_CLOSE :{BLACK}Tutup STR_AI_SETTINGS_RESET :{BLACK}Reset diff --git a/src/lang/irish.txt b/src/lang/irish.txt index 31fee34439..4a7b08b0c1 100644 --- a/src/lang/irish.txt +++ b/src/lang/irish.txt @@ -1193,6 +1193,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Ar dheis STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Iasacht tosaigh uasta: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Uasmhéid is féidir le cuideachta a chur ar iasacht (gan boilsciú a chur san áireamh) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Ráta úis: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Ráta úis ar iasachtaí; rialaíonn sé seo boilsciú freisin, má tá sé cumasaithe @@ -3300,8 +3301,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Rabhadh: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Earráid: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Marfach: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Tharla earráid mharfach NewGRF:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}Tharla earráid NewGRF:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :Ní oibreoidh {1:STRING} leis an leagan de TTDPatch a thuairiscigh OpenTTD. STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING}: Is don leagan {STRING} de TTD é STR_NEWGRF_ERROR_UNSET_SWITCH :Tá {1:STRING} deartha le húsáid le {STRING} @@ -4548,7 +4547,7 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Seat sc STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Seat scáileáin den mhapa airde STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Seat scáileáin den mhion-léarscáil -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :AI STR_AI_SETTINGS_CLOSE :{BLACK}Dún STR_AI_SETTINGS_RESET :{BLACK}Athshocraigh diff --git a/src/lang/italian.txt b/src/lang/italian.txt index 9e7133393a..631fd30795 100644 --- a/src/lang/italian.txt +++ b/src/lang/italian.txt @@ -1253,6 +1253,9 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Destra STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Prestito massimo iniziale: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Ammontare massimo di denaro che una compagnia può chiedere in prestito (senza tenere conto dell'inflazione). +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_VALUE :{CURRENCY_LONG} +###setting-zero-is-special +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_DISABLED :Nessun prestito {RED}Richiede script di gioco per fornire i fondi iniziali STR_CONFIG_SETTING_INTEREST_RATE :Tasso d'interesse: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Tasso d'interesse sul prestito; controlla anche l'abilitazione dell'inflazione. @@ -2753,6 +2756,10 @@ STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}Aumenta STR_SELECT_RAIL_BRIDGE_CAPTION :{WHITE}Seleziona ponte ferroviario STR_SELECT_ROAD_BRIDGE_CAPTION :{WHITE}Seleziona ponte stradale STR_SELECT_BRIDGE_SELECTION_TOOLTIP :{BLACK}Selezione ponte - fare clic sul ponte desiderato per costruirlo +STR_SELECT_BRIDGE_INFO_NAME :{GOLD}{STRING} +STR_SELECT_BRIDGE_INFO_NAME_MAX_SPEED :{GOLD}{STRING},{} {VELOCITY} +STR_SELECT_BRIDGE_INFO_NAME_COST :{GOLD}{0:STRING},{} {WHITE}{2:CURRENCY_LONG} +STR_SELECT_BRIDGE_INFO_NAME_MAX_SPEED_COST :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY_LONG} STR_BRIDGE_NAME_SUSPENSION_STEEL :Sospeso, Acciaio STR_BRIDGE_NAME_GIRDER_STEEL :A travatura, Acciaio STR_BRIDGE_NAME_CANTILEVER_STEEL :A mensola, Acciaio @@ -3404,8 +3411,8 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Attenzione: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Errore: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Errore irreversibile: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Si è verificato un errore irreversibile nel NewGRF:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}Si è verificato un errore in un NewGRF:{}{STRING} +STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}La NewGRF "{STRING}" ha restituito un errore irreversibile:{}{STRING} +STR_NEWGRF_ERROR_POPUP :{WHITE}La NewGRF "{STRING}" ha restituito un errore:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} non funziona con la versione di TTDPatch riferita da OpenTTD STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} è per la versione {2:STRING} di TTD STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} è progettato per essere usato con {2:STRING} @@ -4675,8 +4682,10 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Screensh STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Screenshot della heightmap STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Screenshot della minimappa -# AI Parameters -STR_AI_SETTINGS_CAPTION_AI :{WHITE}Parametri IA +# Script Parameters +STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametri +STR_AI_SETTINGS_CAPTION_AI :IA +STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Script di gioco STR_AI_SETTINGS_CLOSE :{BLACK}Chiudi STR_AI_SETTINGS_RESET :{BLACK}Reimposta STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} diff --git a/src/lang/japanese.txt b/src/lang/japanese.txt index ed7bef89a4..382dad5445 100644 --- a/src/lang/japanese.txt +++ b/src/lang/japanese.txt @@ -1209,6 +1209,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :右 STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :初期の借入最大額: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :初期の借入限度額を設定します (インフレは考慮されません) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :金利: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :借入利率を設定します (インフレ設定を有効にしたときのインフレ率にも影響します) @@ -3344,8 +3345,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}警告: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}エラー: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}致命的エラー: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}NewGRFに致命的なエラーが発生しました:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}NewGRFにエラーが発生しました:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING}はOpenTTDのTTDPatchバージョンには対応していません STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING}はTTDのバージョン{STRING}にのみ対応しています STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING}を使用時には{STRING}を有効にしなければなりません @@ -4679,7 +4678,7 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}地図 STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}ハイトマップスクリーンショット STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}ミニマップのスクリーンショット -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :AI STR_AI_SETTINGS_CLOSE :{BLACK}閉じる STR_AI_SETTINGS_RESET :{BLACK}リセット diff --git a/src/lang/korean.txt b/src/lang/korean.txt index 84ab2e080d..c3b9bc549d 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -1267,6 +1267,9 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :오른쪽 STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :최대 초기 대출금: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :한 회사가 최대한 빌릴 수 있는 대출금의 양을 조절할 수 있습니다. (여기서 설정한 값은 인플레이션에 의한 효과를 적용하지 않은 값입니다.) +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_VALUE :{CURRENCY_LONG} +###setting-zero-is-special +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_DISABLED :대출 불가 {RED}초기 자금을 제공하려면 게임 스크립트가 필요합니다 STR_CONFIG_SETTING_INTEREST_RATE :대출 금리: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :대출 금리입니다. 인플레이션 설정이 켜져있는 경우 인플레이션의 영향을 받습니다. @@ -4362,8 +4365,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}경고: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}오류: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}치명적 오류: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}치명적인 NewGRF 오류가 발생했습니다:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}NewGRF 관련 오류가 발생했습니다:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING}{G 1 "은" "는"} OpenTTD에서 보고된 TTDPatch 버전에서 작동하지 않을 것입니다 STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING}{G 1 "은" "는"} {2:STRING} 버전의 TTD를 위한 것입니다 STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING}{G 1 "은" "는"} {2:STRING}{G 1 "와" "과"} 같이 사용해야 합니다 @@ -6077,7 +6078,7 @@ STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}미니 STR_SCREENSHOT_TOPOGRAPHY_SCREENSHOT :{BLACK}지형 스크린 샷 STR_SCREENSHOT_INDUSTRY_SCREENSHOT :{BLACK}산업시설 스크린 샷 -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :{WHITE}인공지능 매개 변수 STR_AI_SETTINGS_CLOSE :{BLACK}닫기 STR_AI_SETTINGS_RESET :{BLACK}초기화 diff --git a/src/lang/latin.txt b/src/lang/latin.txt index ce72da8210..70a1ac31a2 100644 --- a/src/lang/latin.txt +++ b/src/lang/latin.txt @@ -1332,6 +1332,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Dextro STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Creditum maximum in initio: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Copia crediti maxima (sine inflatione) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Proportio faenoris: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Proportio faenoris creditorum; etiam inflationem afficit, si inflatio adest @@ -3238,7 +3239,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Cautio: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Error: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Error Fatalis: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Error NewGRF fatalis:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} non operat apud editionem TTDPatch ab OpenTTD dicta STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} spectat ad editionem {STRING} TTD STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} spectat ad {STRING} @@ -4438,7 +4438,7 @@ STR_AI_LIST_CANCEL :{BLACK}Cancella STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Non scriptum mutare -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :IA STR_AI_SETTINGS_CLOSE :{BLACK}Claudere STR_AI_SETTINGS_RESET :{BLACK}Revertere diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt index defcc4655e..42a04ee839 100644 --- a/src/lang/latvian.txt +++ b/src/lang/latvian.txt @@ -1220,6 +1220,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :pa labi STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maksimālais sākotnējais aizdevums: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maksimālais aizdevuma daudzums, ko uzņēmums var izsniegt (neskaitot inflāciju) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Procentu likme: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Aizdevumu procentu likme; ja ieslēgts, ietekmē arī inflāciju @@ -3366,8 +3367,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Brīdinājums: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Kļūda: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Fatāls: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Notikusi fatāla NewGRF kļūda:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}Radusies NewGRF kļūda:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} nedarbosies kopā ar TTDPatch versiju (par ko ziņoja OpenTTD). STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} ir paredzēts TTD versijai {2:STRING} STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} ir paredzēts lietošanai ar {2:STRING} @@ -4644,7 +4643,7 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Visas ka STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Augstumkartes ekrānuzņēmums STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Minikartes ekrānuzņēmums -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :{WHITE}MI Parametri STR_AI_SETTINGS_CLOSE :{BLACK}Aizvērt STR_AI_SETTINGS_RESET :{BLACK}Atiestatīt diff --git a/src/lang/lithuanian.txt b/src/lang/lithuanian.txt index 46d7a08ad5..6d16c428b6 100644 --- a/src/lang/lithuanian.txt +++ b/src/lang/lithuanian.txt @@ -1411,6 +1411,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Dešinėje STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Didžiausia pradinė paskola: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Didžiausia paskola, kokią kompanija gali gauti iš banko (neatsižvelgiant į infliaciją) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Palūkanų norma: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Paskolos palūkanų norma. Taip pat įtakoja infliaciją (jei ji įgalinta) @@ -3530,7 +3531,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Įspėjimas: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Klaida: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Lemtingoji klaida: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Įvyko lemtingoji plėtinio klaida:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} neveiks su TTDPatch versija nurodyta pagal OpenTTD STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} skirtas {STRING} TTD versijai. STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} yra pritaikytas naudojimui su {STRING} @@ -4842,7 +4842,7 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Viso pas STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Teminio žemėlapio kopija STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Mini žemėlapio kopija -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :DI STR_AI_SETTINGS_CLOSE :{BLACK}Uždaryti STR_AI_SETTINGS_RESET :{BLACK}Atstatyti diff --git a/src/lang/luxembourgish.txt b/src/lang/luxembourgish.txt index 418ff2ff33..3a22c4e180 100644 --- a/src/lang/luxembourgish.txt +++ b/src/lang/luxembourgish.txt @@ -392,7 +392,7 @@ STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Stieders STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Industrieerstellung STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Stroossebau STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Tramkonstruktioun -STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Beem planzen. Shift wiesselt tëscht bauen/ongeféier Käschten uweisen +STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Beem planzen. Ctrl wielt d'Land diagonal. Shift wiesselt tëscht bauen/ongeféier Käschten uweisen STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Schëld opstellen STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Objet plazéiren. Ctrl wiel d'Areal diagonal aus. Shift wiesselt tëscht bauen/ongeféier Käschten uweisen @@ -1218,6 +1218,9 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Riets STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maximalen Ufanksloun: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maximalwäert den eng Firma kann léinen (ouni Inflatioun matzerechnen) +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_VALUE :{CURRENCY_LONG} +###setting-zero-is-special +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_DISABLED :Kee Kredit {RED}Spill-Script muss am Ufank e Geldbetrag zur Verfügung ginn STR_CONFIG_SETTING_INTEREST_RATE :Zënssaz: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Zënssaz; kontrolléiert och d'Inflatioun wann ugeschalt @@ -1931,31 +1934,31 @@ STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :Keng STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Ufangs-Gréisst vu Stied multiplizéiren mat: {STRING} STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Duerchschnëttsgréisst vu Stied an Proportioun zu normalen Dierfer um Spillstart -STR_CONFIG_SETTING_LINKGRAPH_INTERVAL :Aktualiséier d'Distributiounsgrafik all {STRING}{NBSP}D{P 0:2 ag eeg} -STR_CONFIG_SETTING_LINKGRAPH_INTERVAL_HELPTEXT :Zäit tëscht nofolgenden Neiberechnungen vun der Linkgrafik. All Neiberechnung rechent d'Pläng fir eng Komponent vun der Grafik. Dat heescht dass en Wert X fir dës Astellung net all X Deeg aktualiséiert gëtt. Nëmmen een Komponent gëtt aktualiséiert. Wat méi kuerz gesat, wat méi CPU Rechenzäit gebraucht gëtt. Wat se méi laang gesat gëtt, wat méi Zäit vergeet bis Wuerendistributioun op enger neier Route gestart gëtt. -STR_CONFIG_SETTING_LINKGRAPH_TIME :Benotz {STRING}{NBSP}D{P 0:2 ag eeg} fir d'Neiberechnung vum Distributiounsgraf -STR_CONFIG_SETTING_LINKGRAPH_TIME_HELPTEXT :Zäit déi gebraucht gëtt fir all Neiberechnung vun enger Linkgrafikkomponent. Wann eng Neiberechnung ufenkt, gëtt en Thread erstallt dee fir dës Unzuel un Deeg leeft. Wann de Wäert ze kleng ass, kann den Thread net an der gewënschter Zäit faerdeg ginn an et kënnt zu engem Lag. Wann de Wäert méi héich gesat gëtt, brauch d'Distributioun méi lang fir erneiert ze ginn wann eng Streck ännert +STR_CONFIG_SETTING_LINKGRAPH_INTERVAL :Aktualiséier d'Verdeelungsgrafik all {STRING}{NBSP}D{P 0:2 ag eeg} +STR_CONFIG_SETTING_LINKGRAPH_INTERVAL_HELPTEXT :Zäit tëscht nofolgenden Neiberechnungen vun der Linkgrafik. All Neiberechnung rechent d'Pläng fir eng Komponent vun der Grafik. Dat heescht, dass en Wert X fir dës Astellung net all X Deeg aktualiséiert gëtt. Nëmmen een Komponent gëtt aktualiséiert. Wat méi kuerz gesat, wat méi CPU Rechenzäit gebraucht gëtt. Wat se méi laang gesat gëtt, wat méi Zäit vergeet bis Wuereverdeelung op enger neier Route gestart gëtt. +STR_CONFIG_SETTING_LINKGRAPH_TIME :Benotz {STRING}{NBSP}D{P 0:2 ag eeg} fir d'Neiberechnung vum Verdeelungsgraf +STR_CONFIG_SETTING_LINKGRAPH_TIME_HELPTEXT :Zäit déi gebraucht gëtt fir all Neiberechnung vun enger Linkgrafikkomponent. Wann eng Neiberechnung ufenkt, gëtt en Thread erstallt dee fir dës Unzuel un Deeg leeft. Wann de Wäert ze kleng ass, kann den Thread net an der gewënschter Zäit faerdeg ginn an et kënnt zu engem Lag. Wann de Wäert méi héich gesat gëtt, brauch d'Verdeelung méi lang fir erneiert ze ginn wann eng Streck ännert -STR_CONFIG_SETTING_DISTRIBUTION_PAX :Distributiounsmodus fir Passagéier: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :"symmetresch" heescht, dass ongeféier d'selwecht vill Passagéier vun A op B wéi vu B op A geschéckt ginn. "asymmetresch" heescht, dass eng arbiträr Unzuel u Wueren an d'jeweileg Richtung geschéckt ginn. "manuell" heescht dass keng automatësch Distributioun stattfënnt fir Passagéier -STR_CONFIG_SETTING_DISTRIBUTION_MAIL :Distributiounsmodus fir Post: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :"symmetresch" heescht, dass ongeféier d'selwecht vill vun A op B wéi vu B op A geschéckt ginn. "asymmetresch" heescht, dass eng arbiträr Unzuel u Wueren an d'jeweileg Richtung geschéckt ginn. "manuell" heescht dass keng automatësch Distributioun stattfënnt fir Post -STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED :Distributiounsmodus fir d'GEPANZERT Wuereklass: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :D'GEPANZERT Wuereklass huet Wäertsaachen am geméissegte Klima, Diamanten am Sub-Tropenklima an Gold am sub-arktësche Klima. NewGRFen kënnen dat änneren. "Symmetrësch" heescht, dass ongeféier d'selwecht vill vun A op B wéi vu B op A geschéckt ginn. "asymmetrësch" heescht, dass eng arbiträr Unzuel u Wueren an d'jeweileg Richtung geschéckt ginn. "manuell" heescht dass keng automatësch Distributioun stattfënnt. Et gëtt emfuelen dëst op asymmetrësch oder manuell ze loossen wann ee sub-arktësch spillt, well Banken kee Gold zréck an d’Minen liwweren. Fir geméissegt Klima an sub-tropësch Klima kann eng Bank mat der anerer Wäertsachen zeréckschécken. -STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :Distributiounsmodus fir aner Wuerenklassen: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :"asymmetresch" heescht dass eng beléiweg Unzuel un Wueren an béid Richtungen verschéckt ginn. "manuell" heescht dass keng automatësch Distributioun stattfënnt. Meeschtens gëtt "asymmetresch" oder manuell gewielt. +STR_CONFIG_SETTING_DISTRIBUTION_PAX :Verdeelungsmodus fir Passagéier: {STRING} +STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :"Symmetresch" heescht, dass ongeféier d'selwecht vill Passagéier vun A op B wéi vu B op A geschéckt ginn. "Asymmetresch" heescht, dass eng arbiträr Unzuel u Wueren an d'jeweileg Richtung geschéckt ginn. "Manuell" heescht dass keng automatësch Verdeelung stattfënnt fir Passagéier +STR_CONFIG_SETTING_DISTRIBUTION_MAIL :Verdeelungsmodus fir Post: {STRING} +STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :"Symmetresch" heescht, dass ongeféier d'selwecht vill vun A op B wéi vu B op A geschéckt ginn. "Asymmetresch" heescht, dass eng arbiträr Unzuel u Wueren an d'jeweileg Richtung geschéckt ginn. "Manuell" heescht dass keng automatësch Verdeelung stattfënnt fir Post +STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED :Verdeelungsmodus fir d'GEPANZERT Wuereklass: {STRING} +STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :D'GEPANZERT Wuereklass huet Wäertsaachen am geméissegte Klima, Diamanten am Sub-Tropenklima an Gold am sub-arktësche Klima. NewGRFen kënnen dat änneren. "Symmetrësch" heescht, dass ongeféier d'selwecht vill vun A op B wéi vu B op A geschéckt ginn. "Asymmetrësch" heescht, dass eng arbiträr Unzuel u Wueren an d'jeweileg Richtung geschéckt ginn. "Manuell" heescht dass keng automatësch Verdeelung stattfënnt. Et gëtt emfuelen dëst op asymmetrësch oder manuell ze loossen wann ee sub-arktësch spillt, well Banken kee Gold zréck an d’Minen liwweren. Fir geméissegt Klima an sub-tropësch Klima kann eng Bank mat der anerer Wäertsachen zeréckschécken. +STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :Verdeelungsmodus fir aner Wuereklassen: {STRING} +STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :"Asymmetresch" heescht dass eng beléiweg Unzuel un Wueren an béid Richtungen verschéckt ginn. "Manuell" heescht dass keng automatësch Verdeelung stattfënnt. ###length 3 STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :manuell STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC :asymmetresch STR_CONFIG_SETTING_DISTRIBUTION_SYMMETRIC :symmetresch -STR_CONFIG_SETTING_LINKGRAPH_ACCURACY :Distributiounsgenauegkeet: {STRING} -STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :Wat de Wäert méi héich ass, wat méi CPU benotzt gëtt fir d'Linkgrafik ze zeechnen. Wann ze héich gesat, kann et zu Lags kommen. Ze niddreg gesat kann d'Distributioun ongenau ginn an d'Wueren net sou verdeelt ginn wéi geduet +STR_CONFIG_SETTING_LINKGRAPH_ACCURACY :Verdeelungsgenauegkeet: {STRING} +STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :Wat de Wäert méi héich ass, wat méi CPU benotzt gëtt fir d'Linkgrafik ze zeechnen. Wann ze héich gesat, kann et zu Lags kommen. Ze niddreg gesat kann d'Verdeelung ongenau ginn an d'Wueren net sou verdeelt ginn wéi geduet STR_CONFIG_SETTING_DEMAND_DISTANCE :Afloss vun der Distanz op d'Nofro: {STRING} STR_CONFIG_SETTING_DEMAND_DISTANCE_HELPTEXT :Wann's de en méi héije Wäert wéi 0 wiels, huet d'Differenz tëscht 2 Statiounen A an B en Afloss dorop wéivill Wueren geschéckt ginn. Wat B méi wäit ewech vun A ass, wat manner Wueren geschéckt ginn. Wat de Wäert méi héich gesat gëtt, wat manner Wueren op eng Statioun wait ewech an méi Wueren op eng Statioun méi no geschéckt ginn. STR_CONFIG_SETTING_DEMAND_SIZE :Unzuel vun zeréckgeschéckte Wueren fir de symmetreschen Modus: {STRING} -STR_CONFIG_SETTING_DEMAND_SIZE_HELPTEXT :Wann een dëst op manner wéi 100% setzt, gëtt déi symmetresch Distributioun méi wéi eng asymmetrësch behandelt. Manner Wueren ginn zeréckgeschéckt wann en bestëmmten Wäert op eng Statioun geschéckt gouf. Bei 0% verhält sech d'symmetresch Distributioun wéi eng asymmetresch +STR_CONFIG_SETTING_DEMAND_SIZE_HELPTEXT :Wann een dëst op manner wéi 100% setzt, gëtt déi symmetresch Verdeelung méi wéi eng asymmetrësch behandelt. Manner Wueren ginn zeréckgeschéckt wann en bestëmmten Wäert op eng Statioun geschéckt gouf. Bei 0% verhält sech d'symmetresch Verdeelung wéi eng asymmetresch STR_CONFIG_SETTING_SHORT_PATH_SATURATION :Sättegung vu kuerzen Weeër befier grouss Weeër benotzt ginn: {STRING} STR_CONFIG_SETTING_SHORT_PATH_SATURATION_HELPTEXT :Oft gëtt et e puer Weeër tëscht zwou Statiounen. Cargodist siedegt fir d'éischt de kierzten, dann den zweetkierzten a.s.w. Siedegung gëtt bestemmt durch Kapazitéit an geplangten Notzung. Wann all Wee gesiedegt ass, an nach emmer eng Nofro do ass, ginn all d'Weeër iwwersiedegt, mat Präferenz déi mat grousser Kapazitéit. Gréissten Deel vun der Zäit rechent den Algorithmus d'Kapazitéit allerdéngs net richteg. Des Astellung erlabt engem en Prozentsaz ze bestëmmen fir den éischten Wee befier en zweeten Wee benotzt gëtt. Setz en enner 100% fir iwwerfëllten Statiounen ze vermeide wann d'Kapazitéit iwwerschat gouf. @@ -2710,6 +2713,10 @@ STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}Setzt Si STR_SELECT_RAIL_BRIDGE_CAPTION :{WHITE}Zuchbréck auswielen STR_SELECT_ROAD_BRIDGE_CAPTION :{WHITE}Stroossebréck auswielen STR_SELECT_BRIDGE_SELECTION_TOOLTIP :{BLACK}Bréckenauswiel - Wiel deng Bréck aus +STR_SELECT_BRIDGE_INFO_NAME :{GOLD}{STRING} +STR_SELECT_BRIDGE_INFO_NAME_MAX_SPEED :{GOLD}{STRING},{} {VELOCITY} +STR_SELECT_BRIDGE_INFO_NAME_COST :{GOLD}{0:STRING},{} {WHITE}{2:CURRENCY_LONG} +STR_SELECT_BRIDGE_INFO_NAME_MAX_SPEED_COST :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY_LONG} STR_BRIDGE_NAME_SUSPENSION_STEEL :Stolen Hängebréck STR_BRIDGE_NAME_GIRDER_STEEL :Stoldréier Bréck STR_BRIDGE_NAME_CANTILEVER_STEEL :Fräidroend Stolbréck @@ -2829,7 +2836,7 @@ STR_OBJECT_CLASS_TRNS :Antennen 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_TREES_RANDOM_TYPE :{BLACK}Zoufälleg Beem -STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Zoufälleg Beem planzen. Shift wiesselt tëscht bauen an ongeféier Käschten uweisen +STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Zoufälleg Type vu Beem planzen. Ctrl wielt d'Land diagonal. Shift wiesselt tëscht bauen an ongeféier Käschten uweisen STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Zoufälleg Beem STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Beem zoufälleg iwwert d'Landschaft setzen STR_TREES_MODE_NORMAL_BUTTON :{BLACK}Normal @@ -3361,8 +3368,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Warnung: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Fehler: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Fatal: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}E fatalen NewGRF Fehler ass geschitt:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}En NewGRF Fehler ass geschitt:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} wärt net mat der TTDPatch Versioun déi vun OpenTTD erkannt gouf funktionéiren STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} ass fir {2:STRING} Versioun vun TTD STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} ass designed fir mat {2:STRING} benotzt ze ginn @@ -4633,8 +4638,10 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Screensh STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Héichtekaartscreenshot STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Minimap-Screenshot -# AI Parameters -STR_AI_SETTINGS_CAPTION_AI :{WHITE}KI Parameter +# Script Parameters +STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameter +STR_AI_SETTINGS_CAPTION_AI :KI +STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Spill-Script STR_AI_SETTINGS_CLOSE :{BLACK}Zoumaachen STR_AI_SETTINGS_RESET :{BLACK}Reset STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} diff --git a/src/lang/macedonian.txt b/src/lang/macedonian.txt index 2aac7c0716..12fad3ebc8 100644 --- a/src/lang/macedonian.txt +++ b/src/lang/macedonian.txt @@ -870,6 +870,7 @@ STR_CONFIG_SETTING_REALISTIC :Реален ###length 3 +###setting-zero-is-special @@ -1970,7 +1971,7 @@ STR_AI_LIST_CAPTION_GAMESCRIPT :GameScripts -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :АИ STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} STR_AI_SETTINGS_START_DELAY :Број на денови за да започнете оваа Пи по претходниот (се дава или зема): {ORANGE}{STRING} diff --git a/src/lang/malay.txt b/src/lang/malay.txt index e49bca5e15..0336d98f35 100644 --- a/src/lang/malay.txt +++ b/src/lang/malay.txt @@ -1099,6 +1099,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Kanan STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maksimum pinjaman permulaan: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Rantaian industri +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Kadar faedah: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Kadar faedah pinjaman; juga mengawal inflasi, jika dibolehkan @@ -2739,7 +2740,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Amaran: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Kesilapan: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Bahaya: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Kesilapan NewGRF yang bahaya telah berlaku:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} tidak akan berfungsi dengan versi TTDPatch seperti yang dilaporkan oleh OpenTTD. STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} adalah untuk TTD versi {STRING}. STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} direkabentuk untuk digunakan bersama {STRING} @@ -3846,7 +3846,7 @@ STR_AI_LIST_CANCEL :{BLACK}Batal STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Jangan ubah skrip -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :AI STR_AI_SETTINGS_CLOSE :{BLACK}Tutup STR_AI_SETTINGS_RESET :{BLACK}Semula diff --git a/src/lang/maltese.txt b/src/lang/maltese.txt index 64a3a7f826..e4f85432f2 100644 --- a/src/lang/maltese.txt +++ b/src/lang/maltese.txt @@ -471,6 +471,7 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :oħrajn ###length 3 +###setting-zero-is-special STR_CONFIG_SETTING_RUNNING_COSTS_HELPTEXT :Stabbilixxi l-kosti għal manutenzjoni u servizzi fuq vetturi u infrastruttura @@ -1327,7 +1328,7 @@ STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Исчи -# AI Parameters +# Script Parameters # Textfile window diff --git a/src/lang/marathi.txt b/src/lang/marathi.txt index e136c1e613..999ec5a7e1 100644 --- a/src/lang/marathi.txt +++ b/src/lang/marathi.txt @@ -801,6 +801,7 @@ STR_CONFIG_SETTING_REALISTIC :खरेखु ###length 3 +###setting-zero-is-special @@ -1755,7 +1756,7 @@ STR_TIMETABLE_CHANGE_TIME :{BLACK}वे -# AI Parameters +# Script Parameters STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index fc5876d0ef..9de91c7547 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -1200,6 +1200,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Høyre STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maksimalt innledende lån: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Det maksimale beløp et selskap kan låne (uten å ta inflasjon i betraktning) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Lånerente: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Lånerente; kontrollerer også inflasjonen, hvis aktivert @@ -3322,8 +3323,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Advarsel: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Feil: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Fatal: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}En fatal NewGRF-feil har oppstått:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}En NewGRF feil har oppstått:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} virker ikke med TTDPatch-versjonen som er rapportert av OpenTTD STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} er for versjon {STRING} av TTD STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} er laget for bruk med {STRING} @@ -4571,7 +4570,7 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Skjermbi STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Høydekart skjermbilde STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Oversiktskart skjermbilde -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :AI STR_AI_SETTINGS_CLOSE :{BLACK}Lukk STR_AI_SETTINGS_RESET :{BLACK}Tilbakestill diff --git a/src/lang/norwegian_nynorsk.txt b/src/lang/norwegian_nynorsk.txt index f5cbc9c52d..5607673fde 100644 --- a/src/lang/norwegian_nynorsk.txt +++ b/src/lang/norwegian_nynorsk.txt @@ -1137,6 +1137,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Høgre STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maksimalt startlån: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maksimalt lån eit firma kan ta opp (utan å reikne med inflasjon) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Rente: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Lånerente; kontrollerar óg mogleg inflasjon @@ -2914,7 +2915,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Åtvaring: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Feil: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Fatal: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Ein fatal NewGRF-feil har oppstått:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} vil ikkje verke med den TTDPatch versjonen som OpenTTD oppgjer STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} er for {STRING} utgåva av TTD. STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} er laga for å brukast saman med {STRING} @@ -4069,7 +4069,7 @@ STR_AI_LIST_CANCEL :{BLACK}Avbryt STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Ikkje endre AI -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :AI STR_AI_SETTINGS_CLOSE :{BLACK}Lukk STR_AI_SETTINGS_RESET :{BLACK}Tilbakestill diff --git a/src/lang/persian.txt b/src/lang/persian.txt index b2ec485306..633182068b 100644 --- a/src/lang/persian.txt +++ b/src/lang/persian.txt @@ -1116,6 +1116,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_CENTER :مرکز STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :راست STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :حداکثر اعتبار اولیه: {STRING} +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :نرخ سود: {STRING} @@ -2713,7 +2714,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}هشدار: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}خطا: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}خطای وخیم: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}یک خطای وخیم در NewGRF اتفاق افتاده:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} با TTDPatch که ویرایش آن توسط OpenTTD گزارش شده کار نمی کند STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} برای ویرایش {STRING}TTD می باشد STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} طراحی شده برای استفاده با {STRING} @@ -3493,7 +3493,7 @@ STR_AI_LIST_CANCEL :{BLACK}لغو STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}کد را تغییر نده -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :هوش مصنوعی(AI) STR_AI_SETTINGS_CLOSE :{BLACK}بستن STR_AI_SETTINGS_RESET :{BLACK}بازنشاندن diff --git a/src/lang/polish.txt b/src/lang/polish.txt index d6cc5537aa..0d1e792c59 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -1598,6 +1598,9 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :z prawej strony STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maksymalna wysokość początkowej pożyczki: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maksymalna wysokość pożyczki, jaką firma może zaciągnąć (bez uwzględnienia inflacji) +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_VALUE :{CURRENCY_LONG} +###setting-zero-is-special +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_DISABLED :Brak pożyczki {RED}Wymagany Game Script, aby zapewnić początkowe fundusze STR_CONFIG_SETTING_INTEREST_RATE :Oprocentowanie: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Oprocentowanie pożyczki; kontroluje też inflację, jeśli jest włączona @@ -3747,8 +3750,8 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Ostrzeżenie: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Błąd: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Błąd krytyczny: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Wystąpił błąd krytyczny NewGRF:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}Wystąpił błąd NewGRF:{}{STRING} +STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}NewGRF „{STRING}” zwrócił błąd krytyczny:{}{STRING} +STR_NEWGRF_ERROR_POPUP :{WHITE}NewGRF „{STRING}” zwrócił błąd:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} nie zadziała z wersją TTDPatcha zgłoszoną przez OpenTTD STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} jest przeznaczony dla TTD w wersji {2:STRING} STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} jest zaprojektowany do użycia z {2:STRING} @@ -5025,8 +5028,10 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Zrzut ek STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Zrzut ekranu mapy wysokościowej STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Zrzut ekranu minimapy -# AI Parameters +# Script Parameters +STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametry STR_AI_SETTINGS_CAPTION_AI :{WHITE}Parametry SI +STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Game Script STR_AI_SETTINGS_CLOSE :{BLACK}Zamknij STR_AI_SETTINGS_RESET :{BLACK}Resetuj STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 8ba424b493..84c5d8c1fb 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -1219,6 +1219,9 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Direita STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Valor máximo do empréstimo inicial: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Quantia máxima que uma companhia pode pedir (sem ter em conta a inflação) +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_VALUE :{CURRENCY_LONG} +###setting-zero-is-special +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_DISABLED :Sem empréstimo {RED}Requer Script de Jogo para fornecer fundos iniciais STR_CONFIG_SETTING_INTEREST_RATE :Taxa de juro: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Taxa de juro do empréstimo; também controla a inflação, se ativo @@ -3368,8 +3371,8 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Aviso: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Erro: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Fatal: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Ocorreu um erro fatal num NewGRF:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}Ocorreu um erro de NewGRF:{}{STRING} +STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}O NewGRF "{STRING}" retornou um erro fatal:{}{STRING} +STR_NEWGRF_ERROR_POPUP :{WHITE}O NewGRF "{STRING}" retornou um erro fatal:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} não funciona com a versão do TTDPatch reportada por OpenTTD. STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} é para a versão {2:STRING} do TTD STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} foi concebido para ser usado com {2:STRING} @@ -4640,8 +4643,10 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Mapa com STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Mapa de alturas STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Minimap screenshot -# AI Parameters -STR_AI_SETTINGS_CAPTION_AI :{WHITE}Parâmetros de IA +# Script Parameters +STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parâmetros +STR_AI_SETTINGS_CAPTION_AI :IA +STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Script de Jogo STR_AI_SETTINGS_CLOSE :{BLACK}Fechar STR_AI_SETTINGS_RESET :{BLACK}Repor STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} diff --git a/src/lang/romanian.txt b/src/lang/romanian.txt index eb9be58c33..f81ea5b4fa 100644 --- a/src/lang/romanian.txt +++ b/src/lang/romanian.txt @@ -1216,8 +1216,11 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_LEFT :stânga STR_CONFIG_SETTING_HORIZONTAL_POS_CENTER :centru STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :dreapta -STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Valoarea maximă a împrumutului initial: {STRING} +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Valoarea maximă a împrumutului inițial: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Valoarea maximă pe care o companie o poate împrumuta (fără a ține cont de inflație) +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_VALUE :{CURRENCY_LONG} +###setting-zero-is-special +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_DISABLED :Niciun împrumut {RED}Necesită un script de joc pentru oferirea fondurilor inițiale STR_CONFIG_SETTING_INTEREST_RATE :Rata dobânzii: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Rata dobânzii; de asemenea controlează inflația dacă este activată @@ -3365,8 +3368,8 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Atenţie: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Eroare: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Fatal: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}O eroare fatală NewGRF a avut loc:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}O eroare NewGRF a avut loc:{}{STRING} +STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}NewGRF-ul "{STRING}" a avut o eroare fatală:{}{STRING} +STR_NEWGRF_ERROR_POPUP :{WHITE}NewGRF-ul "{STRING}" a avut o eroare:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} nu va funcţiona cu versiunea TTDPatch raportată de OpenTTD STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} este pentru versiunea {2:STRING} a TTD STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} este conceput pentru a fi folosit cu {2:STRING} @@ -4566,7 +4569,7 @@ STR_DATE_YEAR_TOOLTIP :{BLACK}Alege an # AI debug window -STR_AI_DEBUG :{WHITE}Depanare IA / Script Joc +STR_AI_DEBUG :{WHITE}Depanare IA / Script de joc STR_AI_DEBUG_NAME_AND_VERSION :{BLACK}{STRING} (v{NUM}) STR_AI_DEBUG_NAME_TOOLTIP :{BLACK}Numele scriptului STR_AI_DEBUG_SETTINGS :{BLACK}Setări @@ -4592,7 +4595,7 @@ STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Fereast # AI configuration window STR_AI_CONFIG_CAPTION_AI :{WHITE}Configurație AI STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Configurarea scriptului de joc -STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Script Joc încărcat în jocul următor +STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Scriptul care va fi încărcat în jocul următor STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}Modulul de IA care va fi încărcat în jocul următor STR_AI_CONFIG_HUMAN_PLAYER :Jucator uman STR_AI_CONFIG_RANDOM_AI :IA aleator @@ -4604,12 +4607,12 @@ STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Mută IA STR_AI_CONFIG_MOVE_DOWN :{BLACK}În jos STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Mută IA selectată jos în listă -STR_AI_CONFIG_GAMESCRIPT :{SILVER}Script Joc +STR_AI_CONFIG_GAMESCRIPT :{SILVER}Script de joc STR_AI_CONFIG_GAMESCRIPT_PARAM :{SILVER}Parametri STR_AI_CONFIG_AI :{SILVER}IA STR_AI_CONFIG_CHANGE_AI :{BLACK}Selectați IA -STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}Selectați Scriptul jocului +STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}Selectați scriptul jocului STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Încarcă un alt script STR_AI_CONFIG_CONFIGURE :{BLACK}Configurază STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Configurează parametrii scriptului @@ -4637,8 +4640,10 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Captură STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Captură de hartă topografică STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Captură de hartă a lumii -# AI Parameters -STR_AI_SETTINGS_CAPTION_AI :{WHITE}Parametrii IA +# Script Parameters +STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametri +STR_AI_SETTINGS_CAPTION_AI :{WHITE}IA +STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Script de joc STR_AI_SETTINGS_CLOSE :{BLACK}Închide STR_AI_SETTINGS_RESET :{BLACK}Resetează STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} diff --git a/src/lang/russian.txt b/src/lang/russian.txt index 2bd4adb696..56e0f6b242 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -1370,6 +1370,9 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :справа STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Максимальная сумма кредита: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Максимальная сумма кредита для компании (без учета инфляции) +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_VALUE :{CURRENCY_LONG} +###setting-zero-is-special +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_DISABLED :нет {RED}(необходим игровой скрипт, предоставляющий начальные средства) STR_CONFIG_SETTING_INTEREST_RATE :Процентная ставка: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Процентная ставка по кредитам; также устанавливает уровень инфляции, если та включена. @@ -3549,8 +3552,8 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Внимание: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Ошибка: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Критическая ошибка: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Ошибка при работе с NewGRF:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}Ошибка, связанная с модулем NewGRF:{}{STRING} +STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}В модуле NewGRF «{STRING}» произошла критическая ошибка:{}{STRING} +STR_NEWGRF_ERROR_POPUP :{WHITE}В модуле NewGRF «{STRING}» произошла ошибка:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} не будет работать с версией TTDPatch, сообщенной OpenTTD. STR_NEWGRF_ERROR_DOS_OR_WINDOWS :Файл {1:STRING} требует TTD версии {2:STRING} STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} предполагается использовать совместно с {2:STRING} @@ -4846,8 +4849,10 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Сним STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Снимок карты высот STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Снимок миникарты -# AI Parameters -STR_AI_SETTINGS_CAPTION_AI :{WHITE}Параметры ИИ +# Script Parameters +STR_AI_SETTINGS_CAPTION :{WHITE}Параметры {STRING} +STR_AI_SETTINGS_CAPTION_AI :ИИ +STR_AI_SETTINGS_CAPTION_GAMESCRIPT :игровых скриптов STR_AI_SETTINGS_CLOSE :{BLACK}Закрыть STR_AI_SETTINGS_RESET :{BLACK}Сброс STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} diff --git a/src/lang/serbian.txt b/src/lang/serbian.txt index 78fee4f5a6..f5f265e3a4 100644 --- a/src/lang/serbian.txt +++ b/src/lang/serbian.txt @@ -1413,6 +1413,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Desno STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Najveći zajam na početku: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Najveći iznos koji preduzeće može da pozajmi (ne uzimajući u obzir inflaciju) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Kamatna stopa: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Kamatna stopa na zajam; ako je omogućena, kontroliše inflaciju @@ -3556,8 +3557,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Upozorenje: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Greška: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Kobno: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Došlo je do neotklonljive NewGRF greške:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}Dogodila se greška kod NewGRF-a:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} neće raditi sa TTDPatch verzijom prema prijavi OpenTTD-a STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} je za {2:STRING} verziju TTD-a STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} je napravljen za korišćenje sa {2:STRING} @@ -4844,7 +4843,7 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Slika ek STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Slika ekrana sa elevacionom kartom STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Slika umanjene mape -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :{WHITE}Parametri VI STR_AI_SETTINGS_CLOSE :{BLACK}Zatvori STR_AI_SETTINGS_RESET :{BLACK}Poništi diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index cb05170b2c..f5b104499b 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -1266,6 +1266,9 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :右侧 STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :最大初始贷款:{STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :公司最大贷款额(不考虑通货膨胀的影响) +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_VALUE :{CURRENCY_LONG} +###setting-zero-is-special +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_DISABLED :无贷款 {RED}需要有游戏脚本以提供初始资金 STR_CONFIG_SETTING_INTEREST_RATE :贷款利率:{STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :贷款利率;如果通货膨胀启用,将同时影响通货膨胀率。 @@ -4362,8 +4365,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}警告:{SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}错误:{SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}严重错误:{SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}发生了一个致命的NewGRF错误:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}发生了一个NewGRF错误:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} 不能与 OpenTTD 报告的 TTDPatch 版本兼容。 STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} 是为 {2:STRING} 版 TTD 开发的。 STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} 应当与 {2:STRING} 配合 @@ -6078,8 +6079,10 @@ STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}小地 STR_SCREENSHOT_TOPOGRAPHY_SCREENSHOT :{BLACK}地形截图 STR_SCREENSHOT_INDUSTRY_SCREENSHOT :{BLACK}工业截图 -# AI Parameters +# Script Parameters +STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} 参数 STR_AI_SETTINGS_CAPTION_AI :{WHITE}AI参数 +STR_AI_SETTINGS_CAPTION_GAMESCRIPT :游戏脚本 STR_AI_SETTINGS_CLOSE :{BLACK}关闭 STR_AI_SETTINGS_RESET :{BLACK}重设 STR_AI_SETTINGS_SETTING :{STRING}:{ORANGE}{STRING} diff --git a/src/lang/slovak.txt b/src/lang/slovak.txt index 072f7c1157..97aa751cc5 100644 --- a/src/lang/slovak.txt +++ b/src/lang/slovak.txt @@ -456,7 +456,7 @@ STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Generova STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Generovanie priemyslu STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Stavba cesty STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Výstavba električkovej trate -STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Sadiť stromy. Shift zobrazí odhadovanú cenu +STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Sadiť stromy. Ctrl označí oblasť diagonálne. Shift zobrazí odhadovanú cenu STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Umiestniť popis STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Umiestniť objekt. Ctrl označí oblasť diagonálne. Shift zobrazí odhadovanú cenu @@ -1286,6 +1286,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :vpravo STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maximálny počiatočný úver: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maximálna množstvo peňazí ktoré si môže spoločnosť požičať (bez inflácie) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Úroková sadzba: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Úroková sadzba úveru; kontroluje infláciu ak je povolená @@ -2005,13 +2006,13 @@ STR_CONFIG_SETTING_LINKGRAPH_TIME :Použiť {STRIN STR_CONFIG_SETTING_LINKGRAPH_TIME_HELPTEXT :Čas potrebný pre každé prepočítanie grafu spojov. Pri štarte prepočtu je vytvorené vlákno, ktoré môže bežať uvedený počet dní. Čím menej nastavíte, tým je pravdepodobnejšie, že vlákno nestihne skončiť, kým je to možné. Potom sa hra na nejaký čas zasekne. Čím viac nastavíte, tým dlhšie trvá aktualizácia rozdelenia po zmene trasy. STR_CONFIG_SETTING_DISTRIBUTION_PAX :Druh distribúcie pre cestujúcich: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :"symetricky" znamená, že približne rovnaké množstvo pasažierov bude cestovať zo stanice A do stanice B ako z B do A. "asymetricky"znamená, že v oboch smeroch môže cestovať ľubovoľné množstvo pasažierov. "manuálne" znamená, že sa pre pasažierov nevykoná automatická distribúcia. +STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :"Symetricky" znamená, že približne rovnaké množstvo pasažierov bude cestovať zo stanice A do stanice B ako z B do A. "Asymetricky" znamená, že v oboch smeroch môže cestovať ľubovoľné množstvo pasažierov. "Manuálne" znamená, že sa pre pasažierov nevykoná automatická distribúcia. STR_CONFIG_SETTING_DISTRIBUTION_MAIL :Druh distribúcie pre poštu: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :"symetricky" znamená, že približne rovnaké množstvo pošty bude odoslané zo stanice A do stanice B ako z B do A. "asymetricky"znamená, že v oboch smeroch môže byť odoslané ľubovoľné množstvo pošty. "manuálne" znamená, že sa pre poštu nevykoná automatická distribúcia. +STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :"Symetricky" znamená, že približne rovnaké množstvo pošty bude odoslané zo stanice A do stanice B ako z B do A. "Asymetricky" znamená, že v oboch smeroch môže byť odoslané ľubovoľné množstvo pošty. "Manuálne" znamená, že sa pre poštu nevykoná automatická distribúcia. STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED :Druh distribúcie pre náklad prevážaný obrnenými vozidlami: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :Náklad prevážaný obrnenými vozidlami sú cennosti v miernom, diamanty v subtropickom alebo zlato v subarktickom podnebí. NewGRF to môže zmeniť. "symetricky" znamená, že rovnaké množstvo nákladu bude odoslané zo stanice A do stanice B a naopak. "asymetricky" znamená, že v oboch smeroch môže byť odoslané ľubovoľné množstvo nákladu. "manuálne" znamená, že sa pre náklad nevykoná automatická distribúcia. Doporučuje sa nastaviť na "asymetricky" alebo "manuálne" pri hraní v subarktickom, pretože banky neodošlú žiadne zlato do zlatých baní. Pre mierne a subtropické si môžete vybrať aj "symetricky", pretože banky budú posielať cennosti späť do pôvodnej banky, ktorá ich odoslala. +STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :Náklad prevážaný obrnenými vozidlami sú cennosti v miernom, diamanty v subtropickom alebo zlato v subarktickom podnebí. NewGRF to môže zmeniť. "Symetricky" znamená, že rovnaké množstvo nákladu bude odoslané zo stanice A do stanice B a naopak. "Asymetricky" znamená, že v oboch smeroch môže byť odoslané ľubovoľné množstvo nákladu. "Manuálne" znamená, že sa pre náklad nevykoná automatická distribúcia. Doporučuje sa nastaviť na "asymetricky" alebo "manuálne" pri hraní v subarktickom alebo subtropickom, pretože banky prijímajú náklad iba v týchto podnebiach. Pre mierne podnebie si môžete vybrať aj "symetricky", pretože banky budú posielať cennosti späť do pôvodnej banky, ktorá ich odoslala. STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :Druh distribúcie pre ostatné druhy nákladu: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :"asymetricky"znamená, že v oboch smeroch môže byť odoslané ľubovoľné množstvo nákladu. "manuálne" znamená, že sa pre náklad nevykoná automatická distribúcia. +STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :"Asymetricky" znamená, že v oboch smeroch môže byť odoslané ľubovoľné množstvo nákladu. "Manuálne" znamená, že sa pre náklad nevykoná automatická distribúcia. ###length 3 STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :manuálne STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC :asymetricky @@ -2780,6 +2781,10 @@ STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}Zvýšit STR_SELECT_RAIL_BRIDGE_CAPTION :{WHITE}Vyber železničný most STR_SELECT_ROAD_BRIDGE_CAPTION :{WHITE}Vyber cestný most STR_SELECT_BRIDGE_SELECTION_TOOLTIP :{BLACK}Výber mostu - pre postavanie zvoľ typ mostu +STR_SELECT_BRIDGE_INFO_NAME :{GOLD}{STRING} +STR_SELECT_BRIDGE_INFO_NAME_MAX_SPEED :{GOLD}{STRING},{} {VELOCITY} +STR_SELECT_BRIDGE_INFO_NAME_COST :{GOLD}{0:STRING},{} {WHITE}{2:CURRENCY_LONG} +STR_SELECT_BRIDGE_INFO_NAME_MAX_SPEED_COST :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY_LONG} STR_BRIDGE_NAME_SUSPENSION_STEEL :Závesný oceľový STR_BRIDGE_NAME_GIRDER_STEEL :Pilierový oceľový STR_BRIDGE_NAME_CANTILEVER_STEEL :Visutý oceľový @@ -2899,7 +2904,7 @@ STR_OBJECT_CLASS_TRNS :Vysielače STR_PLANT_TREE_CAPTION :{WHITE}Stromy STR_PLANT_TREE_TOOLTIP :{BLACK}Vybrať druh stromu na sadenie. Ak sa už strom na políčku nachádza, pridá sa viac stromov zmiešaných druhov nezávisle od vybraného druhu STR_TREES_RANDOM_TYPE :{BLACK}Náhodný druh stromov -STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Umiestniť stromy náhodného druhu. Shift zobrazí odhadovanú cenu +STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Umiestniť stromy náhodného druhu. Ctrl označí oblasť diagonálne. Shift zobrazí odhadovanú cenu STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Náhodné stromy STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Zasadiť stromy náhodne po celej krajine STR_TREES_MODE_NORMAL_BUTTON :{BLACK}Normálne @@ -3431,8 +3436,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Upozornenie: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Chyba: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Kritická chyba: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Nastala závažná chyba NewGRF:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}Vyskytla sa chyba NewGRF:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} nebude fungovať s TTDPatch verziou nahlásenou OpenTTD. STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} je pre verziu {2:STRING} TTD STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} je navrhnutý pre použitie s {2:STRING} @@ -4703,7 +4706,7 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Snímka STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Snímka výškovej mapy STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Snímka minimapy -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :{WHITE}Parametre AI STR_AI_SETTINGS_CLOSE :{BLACK}Zavrieť STR_AI_SETTINGS_RESET :{BLACK}Resetovať diff --git a/src/lang/slovenian.txt b/src/lang/slovenian.txt index 722d6b7cd3..01bcb70586 100644 --- a/src/lang/slovenian.txt +++ b/src/lang/slovenian.txt @@ -1292,6 +1292,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Desno STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Najvišje začetno posojilo: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Najvišji znesek, ki si ga podjetje lahko izposodi (ni vključen izračun inflacije) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Obrestna mera: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Obrestna mera; kontrolira tudi inflacijo, če je omogočena. @@ -3164,7 +3165,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Pozor: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Napaka: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Usodno: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Zgodila se je usodna NewGRF napaka:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} ne deluje s TTDPatch različico prijavljeno v OpenTTD STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} je za {STRING} različico TTD-ja STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} je izdelano za uporabo v {STRING} kombinaciji @@ -4327,7 +4327,7 @@ STR_AI_LIST_CANCEL :{BLACK}Preklič STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Ne spremeni skripte -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :UI STR_AI_SETTINGS_CLOSE :{BLACK}Zapri STR_AI_SETTINGS_RESET :{BLACK}Resetiraj diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt index 2004d2761a..161415a68f 100644 --- a/src/lang/spanish.txt +++ b/src/lang/spanish.txt @@ -1219,6 +1219,9 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Derecha STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Préstamo máximo inicial: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Cantidad máxima que una empresa puede recibir como préstamo (sin tener en cuenta la inflación) +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_VALUE :{CURRENCY_LONG} +###setting-zero-is-special +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_DISABLED :Sin préstamo {RED} Se necesita un script de juego para proporcionar fondos iniciales STR_CONFIG_SETTING_INTEREST_RATE :Porcentaje de interés: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Porcentaje de interés de los préstamos; también controla la inflación, en caso de que esté activada @@ -3368,8 +3371,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Atención: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Error: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Error Fatal: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Ha ocurrido un error fatal de NewGRF:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}Ha ocurrido un error de NewGRF:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} no funcionará con la con la versión de TTDPatch informada por OpenTTD STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} es para la versión {2:STRING} of TTD STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} está diseñado para ser usado con {2:STRING} @@ -4640,7 +4641,7 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Mapa com STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Mapa de alturas STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Minimapa -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :{WHITE}Parámetros de IA STR_AI_SETTINGS_CLOSE :{BLACK}Cerrar STR_AI_SETTINGS_RESET :{BLACK}Reiniciar diff --git a/src/lang/spanish_MX.txt b/src/lang/spanish_MX.txt index fb6653253e..79c2e64dfa 100644 --- a/src/lang/spanish_MX.txt +++ b/src/lang/spanish_MX.txt @@ -393,7 +393,7 @@ STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Generaci STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Generación de industrias STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Construcción de carreteras STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Construcción de tranvía -STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Plantar árboles. Mayús muestra un costo estimado +STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Plantar árboles. Ctrl permite seleccionar un área diagonalmente. Mayús permite mostrar una estimación del precio STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Poner cartel STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Colocar objeto. Ctrl para seleccionar un área en diagonal. Mayús muestra un costo estimado @@ -1219,6 +1219,9 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Derecha STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Máximo préstamo inicial: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Máxima cantidad que una empresa puede pedir prestada (sin tener en cuenta la inflación) +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_VALUE :{CURRENCY_LONG} +###setting-zero-is-special +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_DISABLED :Sin préstamo {RED} Se necesita un script de juego para proporcionar fondos iniciales STR_CONFIG_SETTING_INTEREST_RATE :Porcentaje de interés: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Tasa de interés del préstamo; controla también la inflación, en caso de estar activada @@ -1938,13 +1941,13 @@ STR_CONFIG_SETTING_LINKGRAPH_TIME :Usar {STRING}{N STR_CONFIG_SETTING_LINKGRAPH_TIME_HELPTEXT :Tiempo requerido en el cálculo de cada uno de los componentes de la gráfica de distribución. Cuanto menor sea este valor, más probable es que el juego sea más lento. Cuanto mayor sea, más tiempo tardará la distribución en actualizarse cuando se produzcan cambios en las rutas STR_CONFIG_SETTING_DISTRIBUTION_PAX :Modo de distribución para pasajeros: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :En una distribución "Simétrica" se envía la misma cantidad de pasajeros entre dos estaciones. En una distribución "Asimétrica" se pueden enviar cantidades arbitrarias de pasajeros en ambas direcciones. "Manual" significa que no hay distribución automática para los pasajeros. +STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :En una distribución "Simétrica", se envía la misma cantidad de pasajeros de la estación A a la B que de la B a la A. En una distribución "Asimétrica" se pueden enviar cantidades arbitrarias de pasajeros en cualquier direccion. "Manual" significa que no se realiza una distribución automática para los pasajeros. STR_CONFIG_SETTING_DISTRIBUTION_MAIL :Modo de distribución para el correo: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :En una distribución "Simétrica" se envía la misma cantidad de correo entre dos estaciones. En una distribución "Asimétrica" se pueden enviar cantidades arbitrarias de correo en ambas direcciones. "Manual" significa que no hay distribución automática para el correo +STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :En una distribución "Simétrica", se envía la misma cantidad de carga de la estación A a la B que de la B a la A. En una distribución "Asimétrica" se pueden enviar cantidades arbitrarias de carga en ambas direcciones. "Manual" significa que no se realiza una distribución automática para el correo. STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED :Modo de distribución para cargamento de valores: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :El cargamento de valores contiene objetos de valor en el ambiente Templado, diamantes en el Subtropical y oro en el Subártico. Algún NewGRF puede modificar esto. En una distribución "Simétrica", se envía la misma cantidad de carga entre dos estaciones. En una distribución "Asimétrica", se envían cantidades arbitrarias de carga en ambas direcciones. "Manual" significa que no hay distribución automática para esta carga. Se recomienda la distribución "Asimétrica" o "Manual" al jugar en ambiente Subártico, ya que los bancos no regresan oro a las minas. En los ambiente Templado y Subtropical se puede escoger "Simétrica", ya que los bancos pueden regresar algunos objetos de valor a su banco de origen. +STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :La clase carga BLINDADA contiene objetos de valor en el clima templado, diamantes en el clima subtropical y oro en el clima subártico. Nuevos escenarios puedieran modificar esto. En una distribución "Simétrica", se envía la misma cantidad de carga de la estación A a la B que de la B a la A. En una distribución "Asimétrica" se pueden enviar cantidades arbitrarias de carga en ambas direcciones. "Manual" significa que no se realiza una distribución automática para esta carga. Se recomienda fijar esta distribución en "Asimétrica" o en "Manual" al jugar en los clima subártico y subtropical, ya que los bancos sólo reciben carga en esos climas. En el clima templado es factible escoger "Simétrica" ya que los bancos pueden enviar objetos de valor de vuelta al banco de origen. STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :Modo de distribución para otra carga: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :"Asimétrica" significa que se pueden enviar cantidades arbitrarias de carga en ambas direcciones. "Manual" significa que no habrá distribución automática para esta clase de carga. +STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :"Asimétrico" significa que cantidades arbitrarias de carga pueden ser enviadas en cualquier direccion. "Manual" significa que no ocurrira distribución automática para estas cargas. ###length 3 STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :Manual STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC :Asimétrica @@ -2713,6 +2716,10 @@ STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}Aumentar STR_SELECT_RAIL_BRIDGE_CAPTION :{WHITE}Selección de puente de ferrocarril STR_SELECT_ROAD_BRIDGE_CAPTION :{WHITE}Selección de puente de carretera STR_SELECT_BRIDGE_SELECTION_TOOLTIP :{BLACK}Selección de puente. Clic para construir +STR_SELECT_BRIDGE_INFO_NAME :{GOLD}{STRING} +STR_SELECT_BRIDGE_INFO_NAME_MAX_SPEED :{GOLD}{STRING},{} {VELOCITY} +STR_SELECT_BRIDGE_INFO_NAME_COST :{GOLD}{0:STRING},{} {WHITE}{2:CURRENCY_LONG} +STR_SELECT_BRIDGE_INFO_NAME_MAX_SPEED_COST :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY_LONG} STR_BRIDGE_NAME_SUSPENSION_STEEL :Colgante (acero) STR_BRIDGE_NAME_GIRDER_STEEL :Vigas (acero) STR_BRIDGE_NAME_CANTILEVER_STEEL :Voladizo (acero) @@ -2832,7 +2839,7 @@ STR_OBJECT_CLASS_TRNS :Torres de trans STR_PLANT_TREE_CAPTION :{WHITE}Árboles STR_PLANT_TREE_TOOLTIP :{BLACK}Elegir el tipo de árboles a plantar. Si la casilla ya tiene un árbol, se añadirán más árboles de distintos tipos sin importar el tipo elegido STR_TREES_RANDOM_TYPE :{BLACK}Tipo aleatorio -STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Colocar árboles de distinto tipo al azar. Mayús muestra un costo estimado +STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Coloca árboles de tipo aleatorio. Ctrl permite seleccionar un área diagonalmente. Mayús permite mostrar una estimación del precio STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Árboles al azar STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Planta árboles al azar sobre el terreno STR_TREES_MODE_NORMAL_BUTTON :{BLACK}Normal @@ -2865,6 +2872,7 @@ STR_FOUND_TOWN_RANDOM_TOWN_TOOLTIP :{BLACK}Fundar l STR_FOUND_TOWN_MANY_RANDOM_TOWNS :{BLACK}Muchas localidades aleatorias STR_FOUND_TOWN_RANDOM_TOWNS_TOOLTIP :{BLACK}Cubrir el mapa con localidades colocadas al azar STR_FOUND_TOWN_EXPAND_ALL_TOWNS :{BLACK}Expandir todas las localidades +STR_FOUND_TOWN_EXPAND_ALL_TOWNS_TOOLTIP :{BLACK}Hacer que todos los pueblos crezcan lentamente STR_FOUND_TOWN_NAME_TITLE :{YELLOW}Nombre de la localidad: STR_FOUND_TOWN_NAME_EDITOR_TITLE :{BLACK}Ingresar el nombre de la localidad @@ -3344,7 +3352,10 @@ STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Represen STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Mover el sprite cambiando los valores X y Y. Ctrl+Clic mueve el sprite ocho unidades de una sola vez ###length 2 +STR_SPRITE_ALIGNER_CENTRE_OFFSET :{BLACK}Desfasaje reiniciado al centro +STR_SPRITE_ALIGNER_CENTRE_SPRITE :{BLACK}Sprite centrado +STR_SPRITE_ALIGNER_CROSSHAIR :{BLACK}Punto de mira STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Restaurar coordenadas relativas STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Restaurar las coordenadas relativas @@ -3360,8 +3371,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Atención: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Error: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Error fatal: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Ocurrió un error fatal de NewGRF:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}Ocurrió un error de NewGRF:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} no funcionará con la con la versión de TTDPatch reportada por OpenTTD STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} es la para la versión {2:STRING} de TTD STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} está diseñado para usarse con {2:STRING} @@ -4526,22 +4535,22 @@ STR_TIMETABLE_STARTING_DATE :{BLACK}Fecha de STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Elegir una fecha de inicio del itinerario. Ctrl+Clic para distribuir uniformemente todos los demás vehículos que lo compartan, siempre y cuando esté programado completamente STR_TIMETABLE_CHANGE_TIME :{BLACK}Cambiar tiempo -STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Cambiar cuánto debe tardar el recorrido resaltado +STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Modifica la cantidad de tiempo que la orden seleccionada debe tomar. Ctrl+clic modifica la duración para todas las órdenes STR_TIMETABLE_CLEAR_TIME :{BLACK}Borrar tiempo -STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Anula el tiempo en el recorrido resaltado +STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Borra la cantidad de tiempo para la orden resaltada.Ctrl+clic elimina el tiempo para todas las órdenes STR_TIMETABLE_CHANGE_SPEED :{BLACK}Cambiar límite de velocidad -STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Cambiar el límite de velocidad en el recorrido resaltado +STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Cambia el límite máximo de velocidad de la orden resaltada. Ctrl+clic cambia el límite para todas las órdenes STR_TIMETABLE_CLEAR_SPEED :{BLACK}Borrar límite de velocidad -STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Anular el límite de velocidad en el recorrido resaltado +STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Borra el límite máximo de velocidad de la orden resaltada. Ctrl+clic elimina la velocidad para todas las órdenes STR_TIMETABLE_RESET_LATENESS :{BLACK}Reiniciar retrasos STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Reiniciar el contador del retraso para que el vehículo vaya a tiempo STR_TIMETABLE_AUTOFILL :{BLACK}Llenar automáticamente -STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Llenar la tabla de itinerarios automáticamente con los valores del siguiente recorrido (Ctrl+Clic para intentar mantener los tiempos de espera) +STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Rellena el horario automáticamente con los valores del siguiente recorrido. Ctrl+clic para intentar mantener los tiempos de espera en estación STR_TIMETABLE_EXPECTED :{BLACK}Esperado STR_TIMETABLE_SCHEDULED :{BLACK}Programado @@ -4632,7 +4641,7 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Mapa com STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Mapa de alturas STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Captura de minimapa -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :{WHITE}Parámetros de IA STR_AI_SETTINGS_CLOSE :{BLACK}Cerrar STR_AI_SETTINGS_RESET :{BLACK}Reiniciar @@ -4812,6 +4821,7 @@ STR_ERROR_FOREST_CAN_ONLY_BE_PLANTED :{WHITE}... los STR_ERROR_CAN_ONLY_BE_BUILT_ABOVE_SNOW_LINE :{WHITE}... solo se puede construir por encima del nivel de nieve STR_ERROR_CAN_ONLY_BE_BUILT_BELOW_SNOW_LINE :{WHITE}... solo se puede construir por debajo del nivel de nieve +STR_ERROR_PROSPECTING_WAS_UNLUCKY :{WHITE}Mala suerte, la financiación no fructificó; inténtentelo de nuevo STR_ERROR_NO_SUITABLE_PLACES_FOR_PROSPECTING :{WHITE}No se encontraron lugares aptos para hacer prospección de esta industria STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES :{WHITE}No hubo espacio para industrias de tipo "{STRING}" STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES_EXPLANATION :{WHITE}Cambia las opciones de generación para crear un mejor mapa diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index c41ca9e544..2679177c40 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -392,7 +392,7 @@ STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Generera STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Generera industrier STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Bygg vägar STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Spårvägskonstruktion -STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Plantera träd. Shift växlar mellan att bygga/visa beräknad kostnad +STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Plantera träd. Ctrl väljer ytan diagonalt. Shift växlar mellan att bygga/visa beräknad kostnad STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Placera skylt STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Placera objekt. Ctrl väljer ytan diagonalt. Shift växlar mellan att bygga/visa beräknad kostnad @@ -1218,6 +1218,9 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Höger STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maximalt startlån: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maximalt belopp ett företag kan låna (där inflationen inte tas med i beräkningen) +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_VALUE :{CURRENCY_LONG} +###setting-zero-is-special +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_DISABLED :Inget lån {RED}Kräver spelskript som sätter startkapital STR_CONFIG_SETTING_INTEREST_RATE :Räntenivå: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Räntenivå för lån; styr även inflationen om sådan är aktiverad @@ -1937,13 +1940,13 @@ STR_CONFIG_SETTING_LINKGRAPH_TIME :Avsätt {STRING STR_CONFIG_SETTING_LINKGRAPH_TIME_HELPTEXT :Den tid varje omberäkning av en länkgrafkomponent tillåts ta. När en omberäkning startas skapas en tråd som tillåts löpa detta antal dagar. Ju kortare du sätter denna, desto mer troligt är det att tråden inte är hinner bli färdig i tid. Då kommer spelet att stanna tills den är klar (vilket gör att det laggar). Ju längre du sätter denna, desto längre tid tar det för distributionen att uppdateras när rutter ändras. STR_CONFIG_SETTING_DISTRIBUTION_PAX :Distributionssätt för passagerare: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :"symmetriskt" innebär att ungefär samma antal passagerare färdas från station A till station B som från B till A. "asymmetriskt" innebär att en godtycklig mängd passagerare kan färdas i vardera riktningen. "manuellt" innebär att ingen automatisk distribution av passagerare sker. +STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :"Symmetriskt" innebär att ungefär samma antal passagerare färdas från station A till station B som från B till A. "Asymmetriskt" innebär att en godtycklig mängd passagerare kan färdas i vardera riktningen. "Manuellt" innebär att ingen automatisk distribution av passagerare sker. STR_CONFIG_SETTING_DISTRIBUTION_MAIL :Distributionssätt för post: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :"symmetriskt" innebär att ungefär samma mängd post skickas från station A till station B som från B till A. "asymmetriskt" innebär att en godtycklig mängd post kan skickas i vardera riktningen. "manuellt" innebär att ingen automatisk distribution av post sker. +STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :"Symmetriskt" innebär att ungefär samma mängd post skickas från station A till station B som från B till A. "Asymmetriskt" innebär att en godtycklig mängd post kan skickas i vardera riktningen. "Manuellt" innebär att ingen automatisk distribution av post sker. STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED :Distributionssätt för den BEPANSRADE godsklassen: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :Den BEPANSRADE godsklassen innehåller värdesaker i det tempererade, diamanter i det subtropiska eller guld i det subarktiska klimatet. NewGRFer kan ändra detta. "symmetriskt" innebär att ungefär samma mängd av detta gods skickas från station A till station B som från B till A. "asymmetriskt" innebär att en godtycklig mängd av detta gods kan skickas i vardera riktningen. "manuellt" innebär att ingen automatisk distribution av denna godstyp sker. Det är rekommenderat att välja "asymmetriskt" eller "manuellt" vid subarktiskt klimat, då banker inte skickar tillbaka guld till guldgruvor. Vid tempererat och subtropiskt klimat kan även "symmetriskt" väljas, då banker kan skicka tillbaka värdesaker till den bank en viss last av värdesaker kom ifrån. +STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :Den BEPANSRADE godsklassen innehåller värdesaker i det tempererade, diamanter i det subtropiska eller guld i det subarktiska klimatet. NewGRFer kan ändra detta. "Symmetriskt" innebär att ungefär samma mängd av detta gods skickas från station A till station B som från B till A. "Asymmetriskt" innebär att en godtycklig mängd av detta gods kan skickas i vardera riktningen. "Manuellt" innebär att ingen automatisk distribution av denna godstyp sker. Det är rekommenderat att välja "asymmetriskt" eller "manuellt" vid subarktiskt eller subtropiskt klimat, då banker endast tar emot gods i dessa klimat. Vid tempererat klimat kan även "symmetriskt" väljas, då banker kan skicka tillbaka värdesaker till den bank de kom ifrån. STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :Distributionssätt för övriga godsklasser: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :"asymmetriskt" innebär att en godtycklig mängd gods kan skickas i vardera riktningen. "manuellt" innebär att ingen automatisk distribution av dessa godstyper sker. +STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :"Asymmetriskt" innebär att en godtycklig mängd gods kan skickas i vardera riktningen. "Manuellt" innebär att ingen automatisk distribution av dessa godstyper sker. ###length 3 STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :manuellt STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC :asymmetriskt @@ -2710,6 +2713,10 @@ STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}Öka avs STR_SELECT_RAIL_BRIDGE_CAPTION :{WHITE}Välj järnvägsbro STR_SELECT_ROAD_BRIDGE_CAPTION :{WHITE}Välj vägbro STR_SELECT_BRIDGE_SELECTION_TOOLTIP :{BLACK}Välj bro - klicka på önskad bro för att bygga den +STR_SELECT_BRIDGE_INFO_NAME :{GOLD}{STRING} +STR_SELECT_BRIDGE_INFO_NAME_MAX_SPEED :{GOLD}{STRING},{} {VELOCITY} +STR_SELECT_BRIDGE_INFO_NAME_COST :{GOLD}{0:STRING},{} {WHITE}{2:CURRENCY_LONG} +STR_SELECT_BRIDGE_INFO_NAME_MAX_SPEED_COST :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY_LONG} STR_BRIDGE_NAME_SUSPENSION_STEEL :Hängbro, Stål STR_BRIDGE_NAME_GIRDER_STEEL :Balkbro, Stål STR_BRIDGE_NAME_CANTILEVER_STEEL :Konsolbro, Stål @@ -2829,7 +2836,7 @@ STR_OBJECT_CLASS_TRNS :Sändare STR_PLANT_TREE_CAPTION :{WHITE}Träd STR_PLANT_TREE_TOOLTIP :{BLACK}Välj trädtyp att plantera. Om rutan redan har ett träd, kommer ytterliggare träd att vara av slumpmässig typ oberoende av vilken trädtyp som valts STR_TREES_RANDOM_TYPE :{BLACK}Träd av slumpvald typ -STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Placera träd av slumpvald typ. Shift växlar mellan att placera träd/visa beräknad kostnad +STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Placera träd av slumpvald typ. Ctrl väljer ytan diagonalt. Shift växlar mellan att placera träd/visa beräknad kostnad STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Slumpmässigt träd STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Plantera träd slumpmässigt över landskapet STR_TREES_MODE_NORMAL_BUTTON :{BLACK}Normal @@ -3311,7 +3318,7 @@ STR_SAVE_PRESET_SAVE :{BLACK}Spara STR_SAVE_PRESET_SAVE_TOOLTIP :{BLACK}Spara den inställda till den nuvarande valda namnet # NewGRF parameters window -STR_NEWGRF_PARAMETERS_CAPTION :{WHITE}Ändra NewGRF parametrar +STR_NEWGRF_PARAMETERS_CAPTION :{WHITE}Ändra NewGRF-parametrar STR_NEWGRF_PARAMETERS_CLOSE :{BLACK}Stäng STR_NEWGRF_PARAMETERS_RESET :{BLACK}Återställ STR_NEWGRF_PARAMETERS_RESET_TOOLTIP :{BLACK}Återställ alla parametrar till deras standardvärden @@ -3361,8 +3368,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Varning: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Fel: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Fatalt: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Ett fatalt NewGRF-fel har uppstått:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}Ett NewGRF-fel har uppstått:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} kommer inte att fungera med den TTDPatchversion som rapporterades av OpenTTD STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} är för {2:STRING}-versionen av TTD STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} är designat för att användas med {2:STRING} @@ -4633,8 +4638,10 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Skärmdu STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Skärmdump av höjdkarta STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Skärmdump av miniatyrkartan -# AI Parameters -STR_AI_SETTINGS_CAPTION_AI :{WHITE}Datorspelarens parametrar +# Script Parameters +STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametrar +STR_AI_SETTINGS_CAPTION_AI :Datorspelare +STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Spelskript STR_AI_SETTINGS_CLOSE :{BLACK}Stäng STR_AI_SETTINGS_RESET :{BLACK}Återställ STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} diff --git a/src/lang/tamil.txt b/src/lang/tamil.txt index a622affe74..16475746ff 100644 --- a/src/lang/tamil.txt +++ b/src/lang/tamil.txt @@ -1152,6 +1152,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :வலது STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :அதிகபட்ச ஆரம்ப கடன்: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :ஒரு நிறுவனத்தால் பெறமுடியும் கடன் (பணவீக்கத்தினைக் கணக்கில் எடுத்துக் கொள்ளாமல்) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :வட்டி: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :கடன் வட்டி;செயற்படுத்தினால் பணவீக்கத்தினையும் கட்டுப்படுத்தும் @@ -2978,7 +2979,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}எச்சரிக்கை: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}பிழை: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}மரணம்: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}மரணமான NewGRF பிழை ஏற்பட்டுள்ளது:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :OpenTTDஆல் தெரிவித்த TTDPatch விருத்துடன் {1:STRING} செயல்படாது STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} ஆனது {STRING} TTD பதிப்பிற்காகவே STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} ஆனது {STRING} உடன் இணைந்து பயன்படுத்த வடிவமைக்கப்பட்டுள்ளது @@ -4139,7 +4139,7 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}மு STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}உயர்படத்தின் திரைப்பிடிப்பு STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}சிறிய வரைபட திரைபிடிப்பு -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :AI STR_AI_SETTINGS_CLOSE :{BLACK}மூடு STR_AI_SETTINGS_RESET :{BLACK}முன்னிருந்தமாதிரி மாற்று diff --git a/src/lang/thai.txt b/src/lang/thai.txt index 3bdaf3bfcc..1f97cefbca 100644 --- a/src/lang/thai.txt +++ b/src/lang/thai.txt @@ -1152,6 +1152,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :ขวา STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :เงินกู้เริ่มต้นสูงสุด: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :บริษัท สามารถกู้ยืมเงินจำนวนสูงสุด (โดยไม่คำนึงถึงอัตราเงินเฟ้อเข้าบัญชี) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :ดอกเบี้ย: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :อัตราดอกเบี้ยเงินกู้; มีผลกับอัตราเงินเฟ้อถ้าเปิดใช้งาน @@ -3097,8 +3098,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}อันตราย: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Error: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}ร้ายแรง: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}เกิดความผิดพลาดร้ายแรงเกี่ยวกับ NewGRF:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}มี NewGRF ที่เกิดข้อผิดพลาดขึ้น! :{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING}ไม่สามารถทำงานได้บน TTDPatchเวอร์ชั่นนี่ รายงานโดย OpenTTD STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} สำหรับ {STRING} version of TTD STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} ออกแบบมาสำหรับใช้งานกับ {STRING} @@ -4288,7 +4287,7 @@ STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}ไม STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}บันทึกหน้าจอของ Heightmap STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}จับภาพหน้าจอ มินิแมพ -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :AI STR_AI_SETTINGS_CLOSE :{BLACK}ปิด STR_AI_SETTINGS_RESET :{BLACK}เริ่มใหม่ diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index 98a65def00..fc51b629d8 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -262,7 +262,7 @@ STR_TOOLTIP_RESIZE :{BLACK}點選 STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW :{BLACK}切換大/小視窗 STR_TOOLTIP_VSCROLL_BAR_SCROLLS_LIST :{BLACK}捲軸 - 上下捲動清單 STR_TOOLTIP_HSCROLL_BAR_SCROLLS_LIST :{BLACK}捲軸 - 左右捲動清單 -STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}拆卸位於土地上的建築物等。按 Ctrl 以對角線選擇區域。Shift切換建築或顯示預估成本。 +STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}拆卸位於土地上的建築物等。按 Ctrl 以對角線選擇區域。按 Shift 可切換建築或顯示預估成本。 # Show engines button ###length VEHICLE_TYPES @@ -391,7 +391,7 @@ STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}產生 STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}產生工業 STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}建造道路 STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}鋪設電車軌 -STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}植樹。按 Shift 可切換種植/顯示預估的種植費用 +STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}植樹。按 Ctrl 以對角線選擇區域。按 Shift 可切換種植/顯示預估的種植費用 STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}放置標誌 STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}放置物件。按 Ctrl 以對角線選擇區域。按 Shift 可切換興建/顯示預估的興建費用。 @@ -1217,6 +1217,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :靠右 STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :最大貸款額:{STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :公司最多可借多少錢(此設定的值排除了通貨膨脹因素)。 +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :息率:{STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :設定貸款息率。如啟用了通貨膨脹的設定,則此設定同時決定通脹率。 @@ -1940,7 +1941,7 @@ STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :設使有交通 STR_CONFIG_SETTING_DISTRIBUTION_MAIL :郵件分配方式:{STRING} STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :設使有交通路線連接甲、乙兩站。「對稱」指甲站往乙站的郵件數量與乙站往甲站的郵件數量大致相同。「不對稱」指任何一站往另一站的郵件數量皆由系統隨意決定。「手動」指系統不會自動分配郵件的目的地。 STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED :裝甲貨物分配方式:{STRING} -STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :「裝甲貨物」包括溫帶場景的「貴重物品」、寒帶場景的「金塊」及亞熱帶場景的「鑽石」。使用 NewGRF 可能會改變以上設定。{} 設使有交通路線連接甲、乙兩站。「對稱」指甲站往乙站的郵件數量與乙站往甲站的裝甲貨物數量大致相同。「不對稱」指任何一站往另一站的裝甲貨物數量皆由系統隨意決定。「手動」指系統不會自動分配裝甲貨物的目的地。{} 建議在溫帶及亞熱帶場景應使用「對稱」,因為銀行會互相發送貴重物品或鑽石;而在寒帶場景應使用「不對稱」,因為銀行不會把金塊送回礦場。 +STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :「裝甲貨物」包括溫帶場景的「貴重物品」、寒帶場景的「金塊」及亞熱帶場景的「鑽石」。使用 NewGRF 可能會改變以上設定。設使有交通路線連接甲、乙兩站,則「對稱」指甲站往乙站的郵件數量與乙站往甲站的裝甲貨物數量大致相同;「不對稱」指任何一站往另一站的裝甲貨物數量皆由系統隨意決定;「手動」指系統不會自動分配裝甲貨物的目的地。建議在亞熱帶及寒帶場景中應使用「不對稱」或「手動」,因為銀行只會接收貨物。在溫帶場景中建議使用「對稱」,因為銀行之間會互相傳送貴重物品。 STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :其他貨物分配方式:{STRING} STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :如設定此值為「不對稱」,則任何一站往另一站的貨物數量皆由系統隨意決定。如設定此值為「手動」,則系統不會自動分配貨物的目的地。 ###length 3 @@ -2709,6 +2710,10 @@ STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}增加 ( STR_SELECT_RAIL_BRIDGE_CAPTION :{WHITE}選擇鐵路橋樑 STR_SELECT_ROAD_BRIDGE_CAPTION :{WHITE}選擇道路橋樑 STR_SELECT_BRIDGE_SELECTION_TOOLTIP :{BLACK}選擇橋樑 - 點選想建的橋樑即可建造 +STR_SELECT_BRIDGE_INFO_NAME :{GOLD}{STRING} +STR_SELECT_BRIDGE_INFO_NAME_MAX_SPEED :{GOLD}{STRING},{} {VELOCITY} +STR_SELECT_BRIDGE_INFO_NAME_COST :{GOLD}{0:STRING},{} {WHITE}{2:CURRENCY_LONG} +STR_SELECT_BRIDGE_INFO_NAME_MAX_SPEED_COST :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY_LONG} STR_BRIDGE_NAME_SUSPENSION_STEEL :吊橋,鋼製 STR_BRIDGE_NAME_GIRDER_STEEL :桁橋,鋼製 STR_BRIDGE_NAME_CANTILEVER_STEEL :懸臂橋,鋼製 @@ -2809,7 +2814,7 @@ STR_STATION_BUILD_NOISE :{BLACK}產生 # Landscaping toolbar STR_LANDSCAPING_TOOLBAR :{WHITE}地形 -STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}下降土地上的一角。以拖曳來下降第一個選定的角落並平面化選定的區域到新角落的高度。Ctrl 以對角線選定區域。Shift切換建造/顯示成本估算。 +STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}下降土地上的一角。以拖曳來下降第一個選定的角落並平面化選定的區域到新角落的高度。按 Ctrl 以對角線選定區域。按 Shift 可切換建造/顯示成本估算。 STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND :{BLACK}上昇土地上的一角。以拖曳來上昇第一個選定的角落並平面化選定的區域到新角落的高度。按 Ctrl 以對角線選定區域。按 Shift 以切換建造/顯示成本估算。 STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}將一片區域正平到首選高度。按 Ctrl 以對角線選擇區域。按 Shift 查看造價預算 STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}購買土地供將來使用。按 Ctrl 以對角線選擇區域。按 Shift 可切換購買/顯示預估的購買費用 @@ -2828,7 +2833,7 @@ STR_OBJECT_CLASS_TRNS :天線塔 STR_PLANT_TREE_CAPTION :{WHITE}樹木 STR_PLANT_TREE_TOOLTIP :{BLACK}選擇要種植的樹種。無論您選擇了甚麼樹種,如所點擊的方格本身已經有樹,遊戲會在該方格加上一棵隨機樹種的樹 STR_TREES_RANDOM_TYPE :{BLACK}隨機種類樹木 -STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}種植隨機種類樹木。按 Shift 可切換種植/顯示預估的種植費用 +STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}種植隨機種類樹木。按 Ctrl 以對角線選擇區域。按 Shift 可切換種植/顯示預估的種植費用。 STR_TREES_RANDOM_TREES_BUTTON :{BLACK}隨機樹種 STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}在場景中隨機植樹 STR_TREES_MODE_NORMAL_BUTTON :{BLACK}正常 @@ -3360,8 +3365,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}警告:{SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}錯誤:{SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}嚴重錯誤:{SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}發生嚴重 NewGRF 錯誤的處理方式:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}發生NewGRF錯誤:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} 跟由 OpenTTD 回報的 TTDPatch 版本不合 STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} 只適合用於 TTD 版本 {2:STRING}。 STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} 必須跟 {2:STRING} 一起使用 @@ -4632,7 +4635,7 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}截圖 STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}高度圖截圖 STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}小地圖截圖 -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :{WHITE}AI參數 STR_AI_SETTINGS_CLOSE :{BLACK}關閉 STR_AI_SETTINGS_RESET :{BLACK}重設 diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt index f2d7ee7c63..bfd5d0b812 100644 --- a/src/lang/turkish.txt +++ b/src/lang/turkish.txt @@ -1218,6 +1218,9 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Sağ STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :En yüsek açılış borcu: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Bir şirketin alabileceği en fazla borç (enflasyon hesaba katılmadan) +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_VALUE :{CURRENCY_LONG} +###setting-zero-is-special +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_DISABLED :Borç yok seçeneği, başlangıç fonunu sağlamak için oyun betiği {RED}gerektirir. STR_CONFIG_SETTING_INTEREST_RATE :Faiz oranı: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Borç faiz oranı; eğer aktifse aynı zamanda enflasyonu da belirler @@ -3367,8 +3370,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Uyarı: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Hata: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Ölümcül hata: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Ölümcül bir NewGRF hatası oluştu:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}NewGRF hatası oluştu:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} OpenTTD tarafından belirtilen TTDPatch sürümüyle çalışmayacaktır STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING}, TTD'nin {2:STRING} sürümü içindir STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING}, {2:STRING} ile kullanılmak için tasarlanmıştır @@ -4639,7 +4640,7 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Tüm har STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Yükseklik haritası ekran görüntüsü STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Küçük harita ekran görüntüsü -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :{WHITE}YZ Parametreleri STR_AI_SETTINGS_CLOSE :{BLACK}Kapat STR_AI_SETTINGS_RESET :{BLACK}Yeniden başlat diff --git a/src/lang/ukrainian.txt b/src/lang/ukrainian.txt index bc28dc908c..5be6f19f2a 100644 --- a/src/lang/ukrainian.txt +++ b/src/lang/ukrainian.txt @@ -1346,6 +1346,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :правору STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Максимальна сума позики: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Максимальна сума позики для компанії (без урахування інфляції) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Процентна ставка: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Процентна ставка за позиками; також контролює інфляцію, якщо вона увімкнена @@ -3492,8 +3493,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Попередження: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Помилка: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Збій: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Фатальна помилка NewGRF:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}Помилка NewGRF:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} не буде працювати з версією TTDPatch, вказаною OpenTTD STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} для {2:STRING}-версії TTD STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} розроблено для використання з {2:STRING} @@ -4764,8 +4763,10 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Знят STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Зняток мапи висот STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Зняток мінімапи -# AI Parameters +# Script Parameters +STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Налаштування STR_AI_SETTINGS_CAPTION_AI :{WHITE}Параметри ШІ +STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Ігровий Скрипт STR_AI_SETTINGS_CLOSE :{BLACK}Закрити STR_AI_SETTINGS_RESET :{BLACK}Скидання STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} diff --git a/src/lang/urdu.txt b/src/lang/urdu.txt index 0a73eff5d1..c45db564c5 100644 --- a/src/lang/urdu.txt +++ b/src/lang/urdu.txt @@ -1068,6 +1068,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_LEFT :بائیں STR_CONFIG_SETTING_HORIZONTAL_POS_CENTER :درمیان STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :دائیں +###setting-zero-is-special @@ -2740,7 +2741,7 @@ STR_AI_CONFIG_GAMESCRIPT :{SILVER}کھی -# AI Parameters +# Script Parameters # Textfile window diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index 65326fb3d8..6d7ff3edcc 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -1218,6 +1218,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Phải STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Khoảng vay khởi nghiệp tối đa: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Hạn mức tối đa một công ty có thể vay (không tính lạm phát) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Lãi suất vay: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Lãi xuất vay; ảnh hưởng tới cả lạm phát nếu bật tùy chọn đó @@ -3367,8 +3368,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Cảnh báo: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Lỗi: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Lỗi nghiêm trọng: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Xảy ra lỗi NewGRF nghiêm trọng:{}{STRING} -STR_NEWGRF_ERROR_POPUP :{WHITE}Có lỗi NewGRF xảy ra:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} sẽ không hoạt động với phiên bản TTDPatch version theo như báo cáo của OpenTTD. STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} để dành cho phiên bản {2:STRING} của TTD. STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} được thiết kế để dùng với {2:STRING} @@ -4639,8 +4638,9 @@ STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Chụp t STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Chụp bản đồ địa hình STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Chụp màn hình bản đồ nhỏ -# AI Parameters -STR_AI_SETTINGS_CAPTION_AI :{WHITE}Tham số AI +# Script Parameters +STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Tham số +STR_AI_SETTINGS_CAPTION_AI :AI STR_AI_SETTINGS_CLOSE :{BLACK}Đóng STR_AI_SETTINGS_RESET :{BLACK}Thiết Lập Lại STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} diff --git a/src/lang/welsh.txt b/src/lang/welsh.txt index ab4f71877b..19db6c55db 100644 --- a/src/lang/welsh.txt +++ b/src/lang/welsh.txt @@ -1139,6 +1139,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :De STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Benthyciad agoriadol uchafsymol: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Y swm uchaf y gall cwmni fenthyca (heb ustyried chwyddiant) +###setting-zero-is-special STR_CONFIG_SETTING_INTEREST_RATE :Cyfradd chwyddiant: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Cyfradd chwyddiant y benthyciad; hefyd chwyddiant yr economi os y galluogir @@ -3015,7 +3016,6 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING STR_NEWGRF_ERROR_MSG_WARNING :{RED}Rhybudd: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_ERROR :{RED}Gwall: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Angheuol: {SILVER}{STRING} -STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Mae gwall angheuol NewGRF wedi digwydd:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :Ni fydd {1:STRING} yn gweithio gyda'r fersiwn o TTDPatch yr adroddir gan OpenTTD STR_NEWGRF_ERROR_DOS_OR_WINDOWS :Mae {1:STRING} ar gyfer y fersiwn {STRING} o TTD STR_NEWGRF_ERROR_UNSET_SWITCH :Mae {1:STRING} wedi ei gynllunio i gael ei ddefnyddio gyda {STRING} @@ -4193,7 +4193,7 @@ STR_AI_LIST_CANCEL :{BLACK}Canslo STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Peidio newid y sgript -# AI Parameters +# Script Parameters STR_AI_SETTINGS_CAPTION_AI :AI STR_AI_SETTINGS_CLOSE :{BLACK}Cau STR_AI_SETTINGS_RESET :{BLACK}Ailosod diff --git a/src/misc.cpp b/src/misc.cpp index 76336f77b5..7d4adbcc57 100644 --- a/src/misc.cpp +++ b/src/misc.cpp @@ -11,7 +11,7 @@ #include "landscape.h" #include "news_func.h" #include "ai/ai.hpp" -#include "ai/ai_gui.hpp" +#include "script/script_gui.h" #include "newgrf.h" #include "newgrf_house.h" #include "economy_func.h" @@ -156,7 +156,7 @@ void InitializeGame(uint size_x, uint size_y, bool reset_date, bool reset_settin InitializeGraphGui(); InitializeObjectGui(); InitializeTownGui(); - InitializeAIGui(); + InitializeScriptGui(); InitializeTrees(); InitializeIndustries(); InitializeObjects(); diff --git a/src/network/core/tcp_content.cpp b/src/network/core/tcp_content.cpp index a0c10b93de..065e923548 100644 --- a/src/network/core/tcp_content.cpp +++ b/src/network/core/tcp_content.cpp @@ -85,7 +85,6 @@ const char *ContentInfo::GetTextfile(TextfileType type) const break; case CONTENT_TYPE_SCENARIO: case CONTENT_TYPE_HEIGHTMAP: - extern const char *FindScenario(const ContentInfo *ci, bool md5sum); tmp = FindScenario(this, true); break; } diff --git a/src/network/core/tcp_game.cpp b/src/network/core/tcp_game.cpp index 395c2ec455..ed5be318e7 100644 --- a/src/network/core/tcp_game.cpp +++ b/src/network/core/tcp_game.cpp @@ -109,7 +109,6 @@ NetworkRecvStatus NetworkGameSocketHandler::CloseConnection(bool error) /* Clients drop back to the main menu */ if (!_network_server && _networking) { - extern void ClientNetworkEmergencySave(); // from network_client.cpp ClientNetworkEmergencySave(); DeleteNetworkClientWindows(); _switch_mode = SM_MENU; diff --git a/src/network/network.cpp b/src/network/network.cpp index 5ea1c1338d..0518ba861e 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -100,9 +100,6 @@ static_assert((int)NETWORK_COMPANY_NAME_LENGTH == MAX_LENGTH_COMPANY_NAME_CHARS /** The amount of clients connected */ byte _network_clients_connected = 0; -/* Some externs / forwards */ -extern void StateGameLoop(); - /** * Return whether there is any client connected or trying to connect at all. * @return whether we have any client activity diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp index b58c461813..9f3612475d 100644 --- a/src/network/network_client.cpp +++ b/src/network/network_client.cpp @@ -258,7 +258,9 @@ void ClientNetworkGameSocketHandler::ClientError(NetworkRecvStatus res) } DeleteNetworkClientWindows(); - _switch_mode = SM_MENU; + DeleteWindowById(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN); + + if (_game_mode != GM_MENU) _switch_mode = SM_MENU; _networking = false; } @@ -299,7 +301,6 @@ void ClientNetworkGameSocketHandler::ClientError(NetworkRecvStatus res) NetworkExecuteLocalCommandQueue(); - extern void StateGameLoop(); StateGameLoop(); /* Check if we are in sync! */ @@ -679,7 +680,6 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FULL(Packet *p) { /* We try to join a server which is full */ ShowErrorMessage(STR_NETWORK_ERROR_SERVER_FULL, INVALID_STRING_ID, WL_CRITICAL); - DeleteWindowById(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN); return NETWORK_RECV_STATUS_SERVER_FULL; } @@ -688,7 +688,6 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_BANNED(Packet * { /* We try to join a server where we are banned */ ShowErrorMessage(STR_NETWORK_ERROR_SERVER_BANNED, INVALID_STRING_ID, WL_CRITICAL); - DeleteWindowById(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN); return NETWORK_RECV_STATUS_SERVER_BANNED; } @@ -795,8 +794,6 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR(Packet *p /* Perform an emergency save if we had already entered the game */ if (this->status == STATUS_ACTIVE) ClientNetworkEmergencySave(); - DeleteWindowById(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN); - return NETWORK_RECV_STATUS_SERVER_ERROR; } @@ -975,7 +972,6 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_DONE(Packet this->last_packet = std::chrono::steady_clock::now(); if (!load_success) { - DeleteWindowById(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN); StringID detail = INVALID_STRING_ID; if (!error_detail.empty()) { detail = STR_JUST_RAW_STRING; diff --git a/src/network/network_content_gui.cpp b/src/network/network_content_gui.cpp index 0f2fb42622..1359799086 100644 --- a/src/network/network_content_gui.cpp +++ b/src/network/network_content_gui.cpp @@ -21,6 +21,7 @@ #include "../querystring_gui.h" #include "../core/geometry_func.hpp" #include "../textfile_gui.h" +#include "../fios.h" #include "network_content_gui.h" @@ -263,7 +264,6 @@ public: case CONTENT_TYPE_SCENARIO: case CONTENT_TYPE_HEIGHTMAP: - extern void ScanScenarios(); ScanScenarios(); InvalidateWindowData(WC_SAVELOAD, 0, 0); break; @@ -342,8 +342,6 @@ class NetworkContentListWindow : public Window, ContentCallback { /** Search external websites for content */ void OpenExternalSearch() { - extern void OpenBrowser(const char *url); - char url[1024]; const char *last = lastof(url); @@ -852,7 +850,6 @@ public: case WID_NCL_OPEN_URL: if (this->selected != nullptr) { - extern void OpenBrowser(const char *url); OpenBrowser(this->selected->url.c_str()); } break; diff --git a/src/network/network_func.h b/src/network/network_func.h index 3096bbc1a9..3d7bcabe5c 100644 --- a/src/network/network_func.h +++ b/src/network/network_func.h @@ -91,6 +91,7 @@ uint NetworkServerKickOrBanIP(ClientID client_id, bool ban, const std::string &r uint NetworkServerKickOrBanIP(const std::string &ip, bool ban, const std::string &reason); void NetworkInitChatMessage(); +void NetworkReInitChatBoxSize(); void CDECL NetworkAddChatMessage(TextColour colour, uint duration, const std::string &message); void NetworkUndrawChatMessage(); void NetworkChatMessageLoop(); diff --git a/src/network/network_internal.h b/src/network/network_internal.h index 886d63094a..7335fccf3a 100644 --- a/src/network/network_internal.h +++ b/src/network/network_internal.h @@ -153,4 +153,6 @@ std::string_view ParseCompanyFromConnectionString(const std::string &connection_ NetworkAddress ParseConnectionString(const std::string &connection_string, uint16 default_port); std::string NormalizeConnectionString(const std::string &connection_string, uint16 default_port); +void ClientNetworkEmergencySave(); + #endif /* NETWORK_INTERNAL_H */ diff --git a/src/newgrf_airporttiles.cpp b/src/newgrf_airporttiles.cpp index 2f1eefb07e..b8949d45dd 100644 --- a/src/newgrf_airporttiles.cpp +++ b/src/newgrf_airporttiles.cpp @@ -23,6 +23,7 @@ #include "safeguards.h" +extern uint32 GetRelativePosition(TileIndex tile, TileIndex ind_tile); AirportTileSpec AirportTileSpec::tiles[NUM_AIRPORTTILES]; @@ -164,8 +165,6 @@ static uint32 GetAirportTileIDAtOffset(TileIndex tile, const Station *st, uint32 { assert(this->st != nullptr); - extern uint32 GetRelativePosition(TileIndex tile, TileIndex ind_tile); - switch (variable) { /* Terrain type */ case 0x41: return GetTerrainType(this->tile); diff --git a/src/newgrf_airporttiles.h b/src/newgrf_airporttiles.h index 9667fcf8b6..f95a88023b 100644 --- a/src/newgrf_airporttiles.h +++ b/src/newgrf_airporttiles.h @@ -82,7 +82,6 @@ private: friend void AirportTileOverrideManager::SetEntitySpec(const AirportTileSpec *airpts); }; -StationGfx GetTranslatedAirportTileID(StationGfx gfx); void AnimateAirportTile(TileIndex tile); void AirportTileAnimationTrigger(Station *st, TileIndex tile, AirpAnimationTrigger trigger, CargoID cargo_type = CT_INVALID); void AirportAnimationTrigger(Station *st, AirpAnimationTrigger trigger, CargoID cargo_type = CT_INVALID); diff --git a/src/newgrf_engine.h b/src/newgrf_engine.h index ff2a9b0e45..7364b58d58 100644 --- a/src/newgrf_engine.h +++ b/src/newgrf_engine.h @@ -121,4 +121,6 @@ void CommitVehicleListOrderChanges(); EngineID GetNewEngineID(const GRFFile *file, VehicleType type, uint16 internal_id); +void FillNewGRFVehicleCache(const Vehicle *v); + #endif /* NEWGRF_ENGINE_H */ diff --git a/src/newgrf_generic.h b/src/newgrf_generic.h index 0085cc47db..6b9444e291 100644 --- a/src/newgrf_generic.h +++ b/src/newgrf_generic.h @@ -48,6 +48,7 @@ void ResetGenericCallbacks(); void AddGenericCallback(GrfSpecFeature feature, const GRFFile *file, const SpriteGroup *group); uint16 GetAiPurchaseCallbackResult(GrfSpecFeature feature, CargoID cargo_type, uint8 default_selection, IndustryType src_industry, IndustryType dst_industry, uint8 distance, AIConstructionEvent event, uint8 count, uint8 station_size, const GRFFile **file); +void AmbientSoundEffectCallback(TileIndex tile); /** Play an ambient sound effect for an empty tile. */ static inline void AmbientSoundEffect(TileIndex tile) @@ -55,7 +56,6 @@ static inline void AmbientSoundEffect(TileIndex tile) /* Only run callback if enabled. */ if (!HasGrfMiscBit(GMB_AMBIENT_SOUND_CALLBACK)) return; - extern void AmbientSoundEffectCallback(TileIndex tile); AmbientSoundEffectCallback(tile); } diff --git a/src/newgrf_gui.cpp b/src/newgrf_gui.cpp index 1e1b066408..ebc3528637 100644 --- a/src/newgrf_gui.cpp +++ b/src/newgrf_gui.cpp @@ -50,12 +50,13 @@ void ShowNewGRFError() /* Only show Fatal and Error level messages */ if (c->error == nullptr || (c->error->severity != STR_NEWGRF_ERROR_MSG_FATAL && c->error->severity != STR_NEWGRF_ERROR_MSG_ERROR)) continue; - SetDParam (0, c->error->message != STR_NULL ? c->error->message : STR_JUST_RAW_STRING); - SetDParamStr(1, c->error->custom_message); - SetDParamStr(2, c->filename); - SetDParamStr(3, c->error->data); + SetDParamStr(0, c->GetName()); + SetDParam (1, c->error->message != STR_NULL ? c->error->message : STR_JUST_RAW_STRING); + SetDParamStr(2, c->error->custom_message); + SetDParamStr(3, c->filename); + SetDParamStr(4, c->error->data); for (uint i = 0; i < lengthof(c->error->param_value); i++) { - SetDParam(4 + i, c->error->param_value[i]); + SetDParam(5 + i, c->error->param_value[i]); } if (c->error->severity == STR_NEWGRF_ERROR_MSG_FATAL) { ShowErrorMessage(STR_NEWGRF_ERROR_FATAL_POPUP, INVALID_STRING_ID, WL_CRITICAL); @@ -947,7 +948,6 @@ struct NewGRFWindow : public Window, NewGRFScanCallback { case WID_NS_OPEN_URL: { const GRFConfig *c = (this->avail_sel == nullptr) ? this->active_sel : this->avail_sel; - extern void OpenBrowser(const char *url); OpenBrowser(c->GetURL()); break; } diff --git a/src/openttd.cpp b/src/openttd.cpp index f822147998..3d023565d7 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -113,6 +113,10 @@ void CallWindowGameTickEvent(); bool HandleBootstrap(); void OnTick_Companies(bool main_tick); +extern void AfterLoadCompanyStats(); +extern Company *DoStartupNewCompany(bool is_ai, CompanyID company = INVALID_COMPANY); +extern void OSOpenBrowser(const char *url); +extern void RebuildTownCaches(bool cargo_update_required, bool old_map_position); extern void ShowOSErrorBox(const char *buf, bool system); extern std::string _config_file; @@ -566,7 +570,6 @@ void OpenBrowser(const char *url) /* Make sure we only accept urls that are sure to open a browser. */ if (strstr(url, "http://") != url && strstr(url, "https://") != url) return; - extern void OSOpenBrowser(const char *url); OSOpenBrowser(url); } @@ -1504,7 +1507,6 @@ void CheckCaches(bool force_check, std::function log, CheckC old_industry_stations_nears.push_back(ind->stations_near); } - extern void RebuildTownCaches(bool cargo_update_required, bool old_map_position); RebuildTownCaches(false, false); RebuildSubsidisedSourceAndDestinationCache(); @@ -1575,7 +1577,6 @@ void CheckCaches(bool force_check, std::function log, CheckC std::vector old_infrastructure; for (const Company *c : Company::Iterate()) old_infrastructure.push_back(c->infrastructure); - extern void AfterLoadCompanyStats(); AfterLoadCompanyStats(); uint i = 0; diff --git a/src/openttd.h b/src/openttd.h index 703f79973a..3246a0b472 100644 --- a/src/openttd.h +++ b/src/openttd.h @@ -87,10 +87,13 @@ void AskExitGame(); void AskExitToGameMenu(); int openttd_main(int argc, char *argv[]); +void StateGameLoop(); void HandleExitGameRequest(); void SwitchToMode(SwitchMode new_mode); bool RequestNewGRFScan(struct NewGRFScanCallback *callback = nullptr); +void OpenBrowser(const char *url); + #endif /* OPENTTD_H */ diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp index 8347603f2e..514fc866f7 100644 --- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -3243,7 +3243,6 @@ bool UpdateOrderDest(Vehicle *v, const Order *order, int conditional_depth, bool Aircraft *a = Aircraft::From(v); if (a->state == FLYING && a->targetairport != closestDepot.destination) { /* The aircraft is now heading for a different hangar than the next in the orders */ - extern void AircraftNextAirportPos_and_Order(Aircraft *a); AircraftNextAirportPos_and_Order(a); } } @@ -3417,7 +3416,6 @@ bool ProcessOrders(Vehicle *v) if (order == nullptr || (v->type == VEH_AIRCRAFT && !CheckForValidOrders(v))) { if (v->type == VEH_AIRCRAFT) { /* Aircraft do something vastly different here, so handle separately */ - extern void HandleMissingAircraftOrders(Aircraft *v); HandleMissingAircraftOrders(Aircraft::From(v)); return false; } diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 83ffef376d..c0b08961b3 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -41,7 +41,7 @@ #include "../company_func.h" #include "../road_cmd.h" #include "../ai/ai.hpp" -#include "../ai/ai_gui.hpp" +#include "../script/script_gui.h" #include "../game/game.hpp" #include "../town.h" #include "../economy_base.h" @@ -80,6 +80,8 @@ #include "../safeguards.h" +extern bool IndividualRoadVehicleController(RoadVehicle *v, const RoadVehicle *prev); + /** * Makes a tile canal or water depending on the surroundings. * @@ -628,7 +630,7 @@ static void StartScripts() if (Company::IsValidAiID(c->index)) AI::StartNew(c->index, false); } - ShowAIDebugWindowIfAIError(); + ShowScriptDebugWindowIfScriptError(); } /** @@ -3402,7 +3404,6 @@ bool AfterLoadGame() RoadVehicle *u = v; RoadVehicle *prev = nullptr; for (uint sf : skip_frames) { - extern bool IndividualRoadVehicleController(RoadVehicle *v, const RoadVehicle *prev); if (sf >= cur_skip) IndividualRoadVehicleController(u, prev); prev = u; diff --git a/src/script/CMakeLists.txt b/src/script/CMakeLists.txt index f4b87dc3b8..7d1b694e7b 100644 --- a/src/script/CMakeLists.txt +++ b/src/script/CMakeLists.txt @@ -8,6 +8,8 @@ add_files( script_config.cpp script_config.hpp script_fatalerror.hpp + script_gui.h + script_gui.cpp script_info.cpp script_info.hpp script_info_dummy.cpp diff --git a/src/script/api/ai_changelog.hpp b/src/script/api/ai_changelog.hpp index e69408926f..27ad40e79f 100644 --- a/src/script/api/ai_changelog.hpp +++ b/src/script/api/ai_changelog.hpp @@ -17,6 +17,9 @@ * * This version is not yet released. The following changes are not set in stone yet. * + * API additions: + * \li AITown::ROAD_LAYOUT_RANDOM + * * \b 13.0 * * API additions: diff --git a/src/script/api/game_changelog.hpp b/src/script/api/game_changelog.hpp index 1512a6ea7c..46a8e4904f 100644 --- a/src/script/api/game_changelog.hpp +++ b/src/script/api/game_changelog.hpp @@ -17,6 +17,9 @@ * * This version is not yet released. The following changes are not set in stone yet. * + * API additions: + * \li GSTown::ROAD_LAYOUT_RANDOM + * * \b 13.0 * * API additions: diff --git a/src/script/api/script_airport.cpp b/src/script/api/script_airport.cpp index b9be2b48e6..9d897fb4e0 100644 --- a/src/script/api/script_airport.cpp +++ b/src/script/api/script_airport.cpp @@ -15,6 +15,9 @@ #include "../../safeguards.h" +extern Town *AirportGetNearestTown(const struct AirportSpec *as, const TileIterator &it, uint &mindist); +extern uint8 GetAirportNoiseLevelForDistance(const struct AirportSpec *as, uint distance); + /* static */ bool ScriptAirport::IsValidAirportType(AirportType type) { return IsAirportInformationAvailable(type) && ::AirportSpec::Get(type)->IsAvailable(); @@ -128,9 +131,6 @@ /* static */ int ScriptAirport::GetNoiseLevelIncrease(TileIndex tile, AirportType type) { - extern Town *AirportGetNearestTown(const AirportSpec *as, const TileIterator &it, uint &mindist); - extern uint8 GetAirportNoiseLevelForDistance(const AirportSpec *as, uint distance); - if (!::IsValidTile(tile)) return -1; if (!IsAirportInformationAvailable(type)) return -1; @@ -149,8 +149,6 @@ /* static */ TownID ScriptAirport::GetNearestTown(TileIndex tile, AirportType type) { - extern Town *AirportGetNearestTown(const AirportSpec *as, const TileIterator &it, uint &mindist); - if (!::IsValidTile(tile)) return INVALID_TOWN; if (!IsAirportInformationAvailable(type)) return INVALID_TOWN; diff --git a/src/script/api/script_base.cpp b/src/script/api/script_base.cpp index 52946520a2..ab5dd848bc 100644 --- a/src/script/api/script_base.cpp +++ b/src/script/api/script_base.cpp @@ -13,33 +13,36 @@ #include "../../safeguards.h" -/* static */ uint32 ScriptBase::Rand() +/* static */ SQInteger ScriptBase::Rand() { return ScriptObject::GetRandomizer().Next(); } -/* static */ uint32 ScriptBase::RandItem(int unused_param) +/* static */ SQInteger ScriptBase::RandItem(SQInteger unused_param) { return ScriptBase::Rand(); } -/* static */ uint ScriptBase::RandRange(uint max) +/* static */ SQInteger ScriptBase::RandRange(SQInteger max) { + max = Clamp(max, 0, UINT32_MAX); return ScriptObject::GetRandomizer().Next(max); } -/* static */ uint32 ScriptBase::RandRangeItem(int unused_param, uint max) +/* static */ SQInteger ScriptBase::RandRangeItem(SQInteger unused_param, SQInteger max) { return ScriptBase::RandRange(max); } -/* static */ bool ScriptBase::Chance(uint out, uint max) +/* static */ bool ScriptBase::Chance(SQInteger out, SQInteger max) { + out = Clamp(out, 0, UINT32_MAX); + max = Clamp(max, 0, UINT32_MAX); EnforcePrecondition(false, out <= max); return ScriptBase::RandRange(max) < out; } -/* static */ bool ScriptBase::ChanceItem(int unused_param, uint out, uint max) +/* static */ bool ScriptBase::ChanceItem(SQInteger unused_param, SQInteger out, SQInteger max) { return ScriptBase::Chance(out, max); } diff --git a/src/script/api/script_base.hpp b/src/script/api/script_base.hpp index 4184e79d69..3b0422a7e2 100644 --- a/src/script/api/script_base.hpp +++ b/src/script/api/script_base.hpp @@ -25,50 +25,56 @@ public: * Get a random value. * @return A random value between 0 and MAX(uint32). */ - static uint32 Rand(); + static SQInteger Rand(); /** * Get a random value. * @param unused_param This parameter is not used, but is needed to work with lists. * @return A random value between 0 and MAX(uint32). */ - static uint32 RandItem(int unused_param); + static SQInteger RandItem(SQInteger unused_param); /** * Get a random value in a range. * @param max The first number this function will never return (the maximum it returns is max - 1). + * The value will be clamped to 0 .. MAX(uint32). * @return A random value between 0 .. max - 1. */ - static uint RandRange(uint max); + static SQInteger RandRange(SQInteger max); /** * Get a random value in a range. * @param unused_param This parameter is not used, but is needed to work with lists. * @param max The first number this function will never return (the maximum it returns is max - 1). + * The value will be clamped to 0 .. MAX(uint32). * @return A random value between 0 .. max - 1. */ - static uint RandRangeItem(int unused_param, uint max); + static SQInteger RandRangeItem(SQInteger unused_param, SQInteger max); /** * Returns approximately 'out' times true when called 'max' times. * After all, it is a random function. * @param out How many times it should return true. + * The value will be clamped to 0 .. MAX(uint32). * @param max Out of this many times. + * The value will be clamped to 0 .. MAX(uint32). * @pre \a out is at most equal to \a max. * @return True if the chance worked out. */ - static bool Chance(uint out, uint max); + static bool Chance(SQInteger out, SQInteger max); /** * Returns approximately 'out' times true when called 'max' times. * After all, it is a random function. * @param unused_param This parameter is not used, but is needed to work with lists. * @param out How many times it should return true. + * The value will be clamped to 0 .. MAX(uint32). * @param max Out of this many times. + * The value will be clamped to 0 .. MAX(uint32). * @pre \a out is at most equal to \a max. * @return True if the chance worked out. */ - static bool ChanceItem(int unused_param, uint out, uint max); + static bool ChanceItem(SQInteger unused_param, SQInteger out, SQInteger max); }; #endif /* SCRIPT_BASE_HPP */ diff --git a/src/script/api/script_controller.cpp b/src/script/api/script_controller.cpp index a36e03c230..0b5b4ed8cd 100644 --- a/src/script/api/script_controller.cpp +++ b/src/script/api/script_controller.cpp @@ -18,7 +18,7 @@ #include "../script_info.hpp" #include "../script_instance.hpp" #include "script_log.hpp" -#include "../../ai/ai_gui.hpp" +#include "../script_gui.h" #include "../../settings_type.h" #include "../../network/network.h" @@ -56,7 +56,7 @@ /* Inform script developer that their script has been paused and * needs manual action to continue. */ - ShowAIDebugWindow(ScriptObject::GetRootCompany()); + ShowScriptDebugWindow(ScriptObject::GetRootCompany()); if ((_pause_mode & PM_PAUSED_NORMAL) == PM_UNPAUSED) { ScriptObject::DoCommand(0, PM_PAUSED_NORMAL, 1, CMD_PAUSE); diff --git a/src/script/api/script_event_types.hpp b/src/script/api/script_event_types.hpp index 5431fcf1ee..161ad4d8ae 100644 --- a/src/script/api/script_event_types.hpp +++ b/src/script/api/script_event_types.hpp @@ -381,7 +381,7 @@ public: * @param owner The company that can be bought. * @param value The value/costs of buying the company. */ - ScriptEventCompanyAskMerger(Owner owner, int32 value) : + ScriptEventCompanyAskMerger(Owner owner, Money value) : ScriptEvent(ET_COMPANY_ASK_MERGER), owner((ScriptCompany::CompanyID)owner), value(value) @@ -406,7 +406,7 @@ public: * Get the value of the new company. * @return The value of the new company. */ - int32 GetValue() { return this->value; } + Money GetValue() { return this->value; } /** * Take over the company for this merger. @@ -416,7 +416,7 @@ public: private: ScriptCompany::CompanyID owner; ///< The company that is in trouble. - int32 value; ///< The value of the company, i.e. the amount you would pay. + Money value; ///< The value of the company, i.e. the amount you would pay. }; /** diff --git a/src/script/api/script_goal.cpp b/src/script/api/script_goal.cpp index f1b75b032f..02765c10dd 100644 --- a/src/script/api/script_goal.cpp +++ b/src/script/api/script_goal.cpp @@ -120,7 +120,7 @@ EnforcePrecondition(false, buttons < (1 << ::GOAL_QUESTION_BUTTON_COUNT)); EnforcePrecondition(false, (int)type < ::GQT_END); - return ScriptObject::DoCommand(0, uniqueid | (target << 16), buttons | (type << 29) | (is_client ? (1 << 31) : 0), CMD_GOAL_QUESTION, text); + return ScriptObject::DoCommandEx(0, uniqueid, buttons | (type << 29) | (is_client ? (1 << 31) : 0), target, CMD_GOAL_QUESTION, text); } /* static */ bool ScriptGoal::Question(uint16 uniqueid, ScriptCompany::CompanyID company, Text *question, QuestionType type, int buttons) @@ -136,8 +136,6 @@ { EnforcePrecondition(false, ScriptGame::IsMultiplayer()); EnforcePrecondition(false, ScriptClient::ResolveClientID(client) != ScriptClient::CLIENT_INVALID); - /* Can only send 16 bits of client_id before proper fix is implemented */ - EnforcePrecondition(false, client < (1 << 16)); return DoQuestion(uniqueid, client, true, question, type, buttons); } diff --git a/src/script/api/script_goal.hpp b/src/script/api/script_goal.hpp index dda8498fe4..9367ab7753 100644 --- a/src/script/api/script_goal.hpp +++ b/src/script/api/script_goal.hpp @@ -28,9 +28,9 @@ public: /** * The goal IDs. */ - enum GoalID { + enum GoalID : uint16 { /* Note: these values represent part of the in-game GoalID enum */ - GOAL_INVALID = ::INVALID_GOALTYPE, ///< An invalid goal id. + GOAL_INVALID = ::INVALID_GOAL, ///< An invalid goal id. }; /** @@ -170,7 +170,7 @@ public: * @pre question != null && len(question) != 0. * @pre company == COMPANY_INVALID || ResolveCompanyID(company) != COMPANY_INVALID. * @pre CountBits(buttons) >= 1 && CountBits(buttons) <= 3. - * @note Replies to the question are given by you via the event ScriptEvent_GoalQuestionAnswer. + * @note Replies to the question are given by you via the event ScriptEventGoalQuestionAnswer. * @note There is no guarantee you ever get a reply on your question. */ static bool Question(uint16 uniqueid, ScriptCompany::CompanyID company, Text *question, QuestionType type, int buttons); @@ -188,7 +188,7 @@ public: * @pre question != null && len(question) != 0. * @pre ResolveClientID(client) != CLIENT_INVALID. * @pre CountBits(buttons) >= 1 && CountBits(buttons) <= 3. - * @note Replies to the question are given by you via the event ScriptEvent_GoalQuestionAnswer. + * @note Replies to the question are given by you via the event ScriptEventGoalQuestionAnswer. * @note There is no guarantee you ever get a reply on your question. */ static bool QuestionClient(uint16 uniqueid, ScriptClient::ClientID client, Text *question, QuestionType type, int buttons); diff --git a/src/script/api/script_log.cpp b/src/script/api/script_log.cpp index 38a9a87d94..eeee4e620f 100644 --- a/src/script/api/script_log.cpp +++ b/src/script/api/script_log.cpp @@ -75,7 +75,7 @@ /* Also still print to debug window */ DEBUG(script, level, "[%d] [%c] %s", (uint)ScriptObject::GetRootCompany(), logc, log->lines[log->pos]); - InvalidateWindowData(WC_AI_DEBUG, 0, ScriptObject::GetRootCompany()); + InvalidateWindowData(WC_SCRIPT_DEBUG, 0, ScriptObject::GetRootCompany()); } /* static */ void ScriptLog::FreeLogPointer() diff --git a/src/script/api/script_subsidy.cpp b/src/script/api/script_subsidy.cpp index c8ca6e3e35..f09d0d0c04 100644 --- a/src/script/api/script_subsidy.cpp +++ b/src/script/api/script_subsidy.cpp @@ -79,7 +79,7 @@ /* static */ int32 ScriptSubsidy::GetSourceIndex(SubsidyID subsidy_id) { - if (!IsValidSubsidy(subsidy_id)) return INVALID_STATION; + if (!IsValidSubsidy(subsidy_id)) return INVALID_SOURCE; return ::Subsidy::Get(subsidy_id)->src; } @@ -93,7 +93,7 @@ /* static */ int32 ScriptSubsidy::GetDestinationIndex(SubsidyID subsidy_id) { - if (!IsValidSubsidy(subsidy_id)) return INVALID_STATION; + if (!IsValidSubsidy(subsidy_id)) return INVALID_SOURCE; return ::Subsidy::Get(subsidy_id)->dst; } diff --git a/src/script/api/script_town.cpp b/src/script/api/script_town.cpp index 005b524568..06dff3499b 100644 --- a/src/script/api/script_town.cpp +++ b/src/script/api/script_town.cpp @@ -290,7 +290,7 @@ EnforcePrecondition(false, size == TOWN_SIZE_SMALL || size == TOWN_SIZE_MEDIUM || size == TOWN_SIZE_LARGE) EnforcePrecondition(false, size != TOWN_SIZE_LARGE || ScriptObject::GetCompany() == OWNER_DEITY); if (ScriptObject::GetCompany() == OWNER_DEITY || _settings_game.economy.found_town == TF_CUSTOM_LAYOUT) { - EnforcePrecondition(false, layout == ROAD_LAYOUT_ORIGINAL || layout == ROAD_LAYOUT_BETTER_ROADS || layout == ROAD_LAYOUT_2x2 || layout == ROAD_LAYOUT_3x3); + EnforcePrecondition(false, layout >= ROAD_LAYOUT_ORIGINAL && layout <= ROAD_LAYOUT_RANDOM); } else { /* The layout parameter is ignored for AIs when custom layouts is disabled. */ layout = (RoadLayout) (byte)_settings_game.economy.town_layout; @@ -361,10 +361,7 @@ int16 new_rating = Clamp(t->ratings[company] + delta, RATING_MINIMUM, RATING_MAXIMUM); if (new_rating == t->ratings[company]) return false; - uint16 p2 = 0; - memcpy(&p2, &new_rating, sizeof(p2)); - - return ScriptObject::DoCommand(0, town_id | (company_id << 16), p2, CMD_TOWN_RATING); + return ScriptObject::DoCommand(0, town_id | (company_id << 16), new_rating, CMD_TOWN_RATING); } /* static */ int ScriptTown::GetAllowedNoise(TownID town_id) diff --git a/src/script/api/script_town.hpp b/src/script/api/script_town.hpp index 6e7fc67781..d64d12ef6b 100644 --- a/src/script/api/script_town.hpp +++ b/src/script/api/script_town.hpp @@ -98,6 +98,7 @@ public: ROAD_LAYOUT_BETTER_ROADS = ::TL_BETTER_ROADS, ///< Extended original algorithm (min. 2 distance between roads). ROAD_LAYOUT_2x2 = ::TL_2X2_GRID, ///< Geometric 2x2 grid algorithm ROAD_LAYOUT_3x3 = ::TL_3X3_GRID, ///< Geometric 3x3 grid algorithm + ROAD_LAYOUT_RANDOM = ::TL_RANDOM, ///< Random road layout /* Custom added value, only valid for this API */ ROAD_LAYOUT_INVALID = -1, ///< The layout for invalid towns. diff --git a/src/script/script_gui.cpp b/src/script/script_gui.cpp new file mode 100644 index 0000000000..cfb2b6196e --- /dev/null +++ b/src/script/script_gui.cpp @@ -0,0 +1,1273 @@ +/* + * This file is part of OpenTTD. + * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. + * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . + */ + + /** @file script_gui.cpp %Window for configuring the Scripts */ + +#include "../stdafx.h" +#include "../table/sprites.h" +#include "../error.h" +#include "../settings_gui.h" +#include "../querystring_gui.h" +#include "../stringfilter_type.h" +#include "../company_base.h" +#include "../company_gui.h" +#include "../window_func.h" +#include "../network/network.h" +#include "../widgets/dropdown_func.h" +#include "../hotkeys.h" +#include "../string_func.h" +#include "../settings_type.h" +#include "../command_func.h" + +#include "script_gui.h" +#include "script_log.hpp" +#include "script_scanner.hpp" +#include "../ai/ai.hpp" +#include "../ai/ai_config.hpp" +#include "../ai/ai_info.hpp" +#include "../ai/ai_instance.hpp" +#include "../game/game.hpp" +#include "../game/game_config.hpp" +#include "../game/game_info.hpp" +#include "../game/game_instance.hpp" +#include "table/strings.h" + +#include "../safeguards.h" + + +extern bool UserIsAllowedToChangeGameScript(); + +static ScriptConfig *GetConfig(CompanyID slot) +{ + if (slot == OWNER_DEITY) return GameConfig::GetConfig(); + return AIConfig::GetConfig(slot); +} + +/** + * Window that let you choose an available Script. + */ +struct ScriptListWindow : public Window { + const ScriptInfoList *info_list; ///< The list of Scripts. + int selected; ///< The currently selected Script. + CompanyID slot; ///< The company we're selecting a new Script for. + int line_height; ///< Height of a row in the matrix widget. + Scrollbar *vscroll; ///< Cache of the vertical scrollbar. + + /** + * Constructor for the window. + * @param desc The description of the window. + * @param slot The company we're changing the Script for. + */ + ScriptListWindow(WindowDesc *desc, CompanyID slot) : Window(desc), + slot(slot) + { + if (slot == OWNER_DEITY) { + this->info_list = Game::GetUniqueInfoList(); + } else { + this->info_list = AI::GetUniqueInfoList(); + } + + this->CreateNestedTree(); + this->vscroll = this->GetScrollbar(WID_SCRL_SCROLLBAR); + this->FinishInitNested(); // Initializes 'this->line_height' as side effect. + + this->vscroll->SetCount((int)this->info_list->size() + 1); + + /* Try if we can find the currently selected AI */ + this->selected = -1; + if (GetConfig(slot)->HasScript()) { + ScriptInfo *info = GetConfig(slot)->GetInfo(); + int i = 0; + for (const auto &item : *this->info_list) { + if (item.second == info) { + this->selected = i; + break; + } + + i++; + } + } + } + + void SetStringParameters(int widget) const override + { + if (widget != WID_SCRL_CAPTION) return; + + SetDParam(0, (this->slot == OWNER_DEITY) ? STR_AI_LIST_CAPTION_GAMESCRIPT : STR_AI_LIST_CAPTION_AI); + } + + void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override + { + if (widget != WID_SCRL_LIST) return; + + this->line_height = FONT_HEIGHT_NORMAL + padding.height; + + resize->width = 1; + resize->height = this->line_height; + size->height = 5 * this->line_height; + } + + void DrawWidget(const Rect &r, int widget) const override + { + switch (widget) { + case WID_SCRL_LIST: { + /* Draw a list of all available Scripts. */ + Rect tr = r.Shrink(WidgetDimensions::scaled.matrix); + /* First AI in the list is hardcoded to random */ + if (this->vscroll->IsVisible(0)) { + DrawString(tr, this->slot == OWNER_DEITY ? STR_AI_CONFIG_NONE : STR_AI_CONFIG_RANDOM_AI, this->selected == -1 ? TC_WHITE : TC_ORANGE); + tr.top += this->line_height; + } + int i = 0; + for (const auto &item : *this->info_list) { + i++; + if (this->vscroll->IsVisible(i)) { + DrawString(tr, item.second->GetName(), (this->selected == i - 1) ? TC_WHITE : TC_ORANGE); + tr.top += this->line_height; + } + } + break; + } + case WID_SCRL_INFO_BG: { + ScriptInfo *selected_info = nullptr; + int i = 0; + for (const auto &item : *this->info_list) { + i++; + if (this->selected == i - 1) selected_info = static_cast(item.second); + } + /* Some info about the currently selected Script. */ + if (selected_info != nullptr) { + Rect tr = r.Shrink(WidgetDimensions::scaled.frametext, WidgetDimensions::scaled.framerect); + SetDParamStr(0, selected_info->GetAuthor()); + DrawString(tr, STR_AI_LIST_AUTHOR); + tr.top += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; + SetDParam(0, selected_info->GetVersion()); + DrawString(tr, STR_AI_LIST_VERSION); + tr.top += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; + if (selected_info->GetURL() != nullptr) { + SetDParamStr(0, selected_info->GetURL()); + DrawString(tr, STR_AI_LIST_URL); + tr.top += FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; + } + SetDParamStr(0, selected_info->GetDescription()); + DrawStringMultiLine(tr, STR_JUST_RAW_STRING, TC_WHITE); + } + break; + } + } + } + + /** + * Changes the Script of the current slot. + */ + void ChangeScript() + { + if (_game_mode == GM_NORMAL && slot == OWNER_DEITY) Game::Uninitialize(false); + if (this->selected == -1) { + GetConfig(slot)->Change(nullptr); + } else { + ScriptInfoList::const_iterator it = this->info_list->begin(); + for (int i = 0; i < this->selected; i++) it++; + GetConfig(slot)->Change((*it).second->GetName(), (*it).second->GetVersion()); + if (_game_mode == GM_NORMAL && slot == OWNER_DEITY) Game::StartNew(); + } + InvalidateWindowData(WC_GAME_OPTIONS, slot == OWNER_DEITY ? WN_GAME_OPTIONS_GS : WN_GAME_OPTIONS_AI); + InvalidateWindowClassesData(WC_SCRIPT_SETTINGS); + DeleteWindowByClass(WC_QUERY_STRING); + InvalidateWindowClassesData(WC_TEXTFILE); + if (_game_mode == GM_NORMAL && slot == OWNER_DEITY) { + InvalidateWindowData(WC_SCRIPT_DEBUG, 0, -1); + SetWindowClassesDirty(WC_SCRIPT_DEBUG); + } + } + + void OnClick(Point pt, int widget, int click_count) override + { + switch (widget) { + case WID_SCRL_LIST: { // Select one of the Scripts + int sel = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_SCRL_LIST) - 1; + if (sel < (int)this->info_list->size()) { + this->selected = sel; + this->SetDirty(); + if (click_count > 1) { + this->ChangeScript(); + delete this; + } + } + break; + } + + case WID_SCRL_ACCEPT: { + this->ChangeScript(); + delete this; + break; + } + + case WID_SCRL_CANCEL: + delete this; + break; + } + } + + void OnResize() override + { + this->vscroll->SetCapacityFromWidget(this, WID_SCRL_LIST); + } + + /** + * Some data on this window has become invalid. + * @param data Information about the changed data. + * @param gui_scope Whether the call is done from GUI scope. You may not do everything when not in GUI scope. See #InvalidateWindowData() for details. + */ + void OnInvalidateData(int data = 0, bool gui_scope = true) override + { + if (_game_mode == GM_NORMAL && Company::IsValidID(this->slot)) { + delete this; + return; + } + + if (!gui_scope) return; + + this->vscroll->SetCount((int)this->info_list->size() + 1); + + /* selected goes from -1 .. length of ai list - 1. */ + this->selected = std::min(this->selected, this->vscroll->GetCount() - 2); + } +}; + +/** Widgets for the AI list window. */ +static const NWidgetPart _nested_script_list_widgets[] = { + NWidget(NWID_HORIZONTAL), + NWidget(WWT_CLOSEBOX, COLOUR_MAUVE), + NWidget(WWT_CAPTION, COLOUR_MAUVE, WID_SCRL_CAPTION), SetDataTip(STR_AI_LIST_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), + NWidget(WWT_DEFSIZEBOX, COLOUR_MAUVE), + EndContainer(), + NWidget(NWID_HORIZONTAL), + NWidget(WWT_MATRIX, COLOUR_MAUVE, WID_SCRL_LIST), SetMinimalSize(188, 112), SetFill(1, 1), SetResize(1, 1), SetMatrixDataTip(1, 0, STR_AI_LIST_TOOLTIP), SetScrollbar(WID_SCRL_SCROLLBAR), + NWidget(NWID_VSCROLLBAR, COLOUR_MAUVE, WID_SCRL_SCROLLBAR), + EndContainer(), + NWidget(WWT_PANEL, COLOUR_MAUVE, WID_SCRL_INFO_BG), SetMinimalTextLines(8, WidgetDimensions::unscaled.framerect.Vertical() + WidgetDimensions::unscaled.vsep_normal * 3), SetResize(1, 0), + EndContainer(), + NWidget(NWID_HORIZONTAL), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), + NWidget(WWT_PUSHTXTBTN, COLOUR_MAUVE, WID_SCRL_ACCEPT), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_AI_LIST_ACCEPT, STR_AI_LIST_ACCEPT_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_MAUVE, WID_SCRL_CANCEL), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_AI_LIST_CANCEL, STR_AI_LIST_CANCEL_TOOLTIP), + EndContainer(), + NWidget(WWT_RESIZEBOX, COLOUR_MAUVE), + EndContainer(), +}; + +/** Window definition for the ai list window. */ +static WindowDesc _script_list_desc( + WDP_CENTER, "settings_script_list", 200, 234, + WC_SCRIPT_LIST, WC_NONE, + 0, + _nested_script_list_widgets, lengthof(_nested_script_list_widgets) +); + +/** + * Open the AI list window to chose an AI for the given company slot. + * @param slot The slot to change the AI of. + */ +void ShowScriptListWindow(CompanyID slot) +{ + DeleteWindowByClass(WC_SCRIPT_LIST); + new ScriptListWindow(&_script_list_desc, slot); +} + + +/** + * Window for settings the parameters of an AI. + */ +struct ScriptSettingsWindow : public Window { + CompanyID slot; ///< The currently show company's setting. + ScriptConfig *script_config; ///< The configuration we're modifying. + int clicked_button; ///< The button we clicked. + bool clicked_increase; ///< Whether we clicked the increase or decrease button. + bool clicked_dropdown; ///< Whether the dropdown is open. + bool closing_dropdown; ///< True, if the dropdown list is currently closing. + GUITimer timeout; ///< Timeout for unclicking the button. + int clicked_row; ///< The clicked row of settings. + int line_height; ///< Height of a row in the matrix widget. + Scrollbar *vscroll; ///< Cache of the vertical scrollbar. + typedef std::vector VisibleSettingsList; ///< typdef for a vector of script settings + VisibleSettingsList visible_settings; ///< List of visible AI settings + + /** + * Constructor for the window. + * @param desc The description of the window. + * @param slot The company we're changing the settings for. + */ + ScriptSettingsWindow(WindowDesc *desc, CompanyID slot) : Window(desc), + slot(slot), + clicked_button(-1), + clicked_dropdown(false), + closing_dropdown(false), + timeout(0) + { + this->script_config = GetConfig(slot); + + this->CreateNestedTree(); + this->vscroll = this->GetScrollbar(WID_SCRS_SCROLLBAR); + this->FinishInitNested(slot); // Initializes 'this->line_height' as side effect. + + this->RebuildVisibleSettings(); + } + + /** + * Rebuilds the list of visible settings. AI settings with the flag + * AICONFIG_AI_DEVELOPER set will only be visible if the game setting + * gui.ai_developer_tools is enabled. + */ + void RebuildVisibleSettings() + { + visible_settings.clear(); + + for (const auto &item : *this->script_config->GetConfigList()) { + bool no_hide = (item.flags & SCRIPTCONFIG_DEVELOPER) == 0; + if (no_hide || _settings_client.gui.ai_developer_tools) { + visible_settings.push_back(&item); + } + } + + this->vscroll->SetCount((int)this->visible_settings.size()); + } + + void SetStringParameters(int widget) const override + { + if (widget != WID_SCRS_CAPTION) return; + + SetDParam(0, (this->slot == OWNER_DEITY) ? STR_AI_SETTINGS_CAPTION_GAMESCRIPT : STR_AI_SETTINGS_CAPTION_AI); + } + + void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override + { + if (widget != WID_SCRS_BACKGROUND) return; + + this->line_height = std::max(SETTING_BUTTON_HEIGHT, FONT_HEIGHT_NORMAL) + padding.height; + + resize->width = 1; + resize->height = this->line_height; + size->height = 5 * this->line_height; + } + + void DrawWidget(const Rect &r, int widget) const override + { + if (widget != WID_SCRS_BACKGROUND) return; + + ScriptConfig *config = this->script_config; + VisibleSettingsList::const_iterator it = this->visible_settings.begin(); + int i = 0; + for (; !this->vscroll->IsVisible(i); i++) it++; + + Rect ir = r.Shrink(WidgetDimensions::scaled.framerect); + bool rtl = _current_text_dir == TD_RTL; + Rect br = ir.WithWidth(SETTING_BUTTON_WIDTH, rtl); + Rect tr = ir.Indent(SETTING_BUTTON_WIDTH + WidgetDimensions::scaled.hsep_wide, rtl); + + int y = r.top; + int button_y_offset = (this->line_height - SETTING_BUTTON_HEIGHT) / 2; + int text_y_offset = (this->line_height - FONT_HEIGHT_NORMAL) / 2; + for (; this->vscroll->IsVisible(i) && it != visible_settings.end(); i++, it++) { + const ScriptConfigItem &config_item = **it; + int current_value = config->GetSetting((config_item).name); + bool editable = this->IsEditableItem(config_item); + + StringID str; + TextColour colour; + uint idx = 0; + if (StrEmpty(config_item.description)) { + if (this->slot != OWNER_DEITY && !strcmp(config_item.name, "start_date")) { + /* Build-in translation */ + str = STR_AI_SETTINGS_START_DELAY; + colour = TC_LIGHT_BLUE; + } else { + str = STR_JUST_STRING; + colour = TC_ORANGE; + } + } else { + str = STR_AI_SETTINGS_SETTING; + colour = TC_LIGHT_BLUE; + SetDParamStr(idx++, config_item.description); + } + + if ((config_item.flags & SCRIPTCONFIG_BOOLEAN) != 0) { + DrawBoolButton(br.left, y + button_y_offset, current_value != 0, editable); + SetDParam(idx++, current_value == 0 ? STR_CONFIG_SETTING_OFF : STR_CONFIG_SETTING_ON); + } else { + if (config_item.complete_labels) { + DrawDropDownButton(br.left, y + button_y_offset, COLOUR_YELLOW, this->clicked_row == i && clicked_dropdown, editable); + } else { + DrawArrowButtons(br.left, y + button_y_offset, COLOUR_YELLOW, (this->clicked_button == i) ? 1 + (this->clicked_increase != rtl) : 0, editable && current_value > config_item.min_value, editable && current_value < config_item.max_value); + } + if (config_item.labels != nullptr && config_item.labels->Contains(current_value)) { + SetDParam(idx++, STR_JUST_RAW_STRING); + SetDParamStr(idx++, config_item.labels->Find(current_value)->second); + } else { + SetDParam(idx++, STR_JUST_INT); + SetDParam(idx++, current_value); + } + } + + DrawString(tr.left, tr.right, y + text_y_offset, str, colour); + y += this->line_height; + } + } + + void OnPaint() override + { + if (this->closing_dropdown) { + this->closing_dropdown = false; + this->clicked_dropdown = false; + } + this->DrawWidgets(); + } + + void OnClick(Point pt, int widget, int click_count) override + { + switch (widget) { + case WID_SCRS_BACKGROUND: { + Rect r = this->GetWidget(widget)->GetCurrentRect().Shrink(WidgetDimensions::scaled.matrix, RectPadding::zero); + int num = (pt.y - r.top) / this->line_height + this->vscroll->GetPosition(); + if (num >= (int)this->visible_settings.size()) break; + + VisibleSettingsList::const_iterator it = this->visible_settings.begin(); + for (int i = 0; i < num; i++) it++; + const ScriptConfigItem config_item = **it; + if (!this->IsEditableItem(config_item)) return; + + if (this->clicked_row != num) { + this->DeleteChildWindows(WC_QUERY_STRING); + HideDropDownMenu(this); + this->clicked_row = num; + this->clicked_dropdown = false; + } + + bool bool_item = (config_item.flags & SCRIPTCONFIG_BOOLEAN) != 0; + + int x = pt.x - r.left; + if (_current_text_dir == TD_RTL) x = r.Width() - 1 - x; + + /* One of the arrows is clicked (or green/red rect in case of bool value) */ + int old_val = this->script_config->GetSetting(config_item.name); + if (!bool_item && IsInsideMM(x, 0, SETTING_BUTTON_WIDTH) && config_item.complete_labels) { + if (this->clicked_dropdown) { + /* unclick the dropdown */ + HideDropDownMenu(this); + this->clicked_dropdown = false; + this->closing_dropdown = false; + } else { + int rel_y = (pt.y - r.top) % this->line_height; + + Rect wi_rect; + wi_rect.left = pt.x - (_current_text_dir == TD_RTL ? SETTING_BUTTON_WIDTH - 1 - x : x); + wi_rect.right = wi_rect.left + SETTING_BUTTON_WIDTH - 1; + wi_rect.top = pt.y - rel_y + (this->line_height - SETTING_BUTTON_HEIGHT) / 2; + wi_rect.bottom = wi_rect.top + SETTING_BUTTON_HEIGHT - 1; + + /* If the mouse is still held but dragged outside of the dropdown list, keep the dropdown open */ + if (pt.y >= wi_rect.top && pt.y <= wi_rect.bottom) { + this->clicked_dropdown = true; + this->closing_dropdown = false; + + DropDownList list; + for (int i = config_item.min_value; i <= config_item.max_value; i++) { + list.emplace_back(new DropDownListCharStringItem(config_item.labels->Find(i)->second, i, false)); + } + + ShowDropDownListAt(this, std::move(list), old_val, -1, wi_rect, COLOUR_ORANGE, true); + } + } + } else if (IsInsideMM(x, 0, SETTING_BUTTON_WIDTH)) { + int new_val = old_val; + if (bool_item) { + new_val = !new_val; + } else if (x >= SETTING_BUTTON_WIDTH / 2) { + /* Increase button clicked */ + new_val += config_item.step_size; + if (new_val > config_item.max_value) new_val = config_item.max_value; + this->clicked_increase = true; + } else { + /* Decrease button clicked */ + new_val -= config_item.step_size; + if (new_val < config_item.min_value) new_val = config_item.min_value; + this->clicked_increase = false; + } + + if (new_val != old_val) { + this->script_config->SetSetting(config_item.name, new_val); + this->clicked_button = num; + this->timeout.SetInterval(150); + } + } else if (!bool_item && !config_item.complete_labels) { + /* Display a query box so users can enter a custom value. */ + SetDParam(0, old_val); + ShowQueryString(STR_JUST_INT, STR_CONFIG_SETTING_QUERY_CAPTION, 10, this, CS_NUMERAL, QSF_NONE); + } + this->SetDirty(); + break; + } + + case WID_SCRS_ACCEPT: + delete this; + break; + + case WID_SCRS_RESET: + this->script_config->ResetEditableSettings(_game_mode == GM_MENU || ((this->slot != OWNER_DEITY) && !Company::IsValidID(this->slot))); + this->SetDirty(); + break; + } + } + + void OnQueryTextFinished(char *str) override + { + if (StrEmpty(str)) return; + int32 value = atoi(str); + + SetValue(value); + } + + void OnDropdownSelect(int widget, int index) override + { + assert(this->clicked_dropdown); + SetValue(index); + } + + void OnDropdownClose(Point pt, int widget, int index, bool instant_close) override + { + /* We cannot raise the dropdown button just yet. OnClick needs some hint, whether + * the same dropdown button was clicked again, and then not open the dropdown again. + * So, we only remember that it was closed, and process it on the next OnPaint, which is + * after OnClick. */ + assert(this->clicked_dropdown); + this->closing_dropdown = true; + this->SetDirty(); + } + + void OnResize() override + { + this->vscroll->SetCapacityFromWidget(this, WID_SCRS_BACKGROUND); + } + + void OnRealtimeTick(uint delta_ms) override + { + if (this->timeout.Elapsed(delta_ms)) { + this->clicked_button = -1; + this->SetDirty(); + } + } + + /** + * Some data on this window has become invalid. + * @param data Information about the changed data. + * @param gui_scope Whether the call is done from GUI scope. You may not do everything when not in GUI scope. See #InvalidateWindowData() for details. + */ + void OnInvalidateData(int data = 0, bool gui_scope = true) override + { + this->RebuildVisibleSettings(); + HideDropDownMenu(this); + this->DeleteChildWindows(WC_QUERY_STRING); + } + +private: + bool IsEditableItem(const ScriptConfigItem &config_item) const + { + return _game_mode == GM_MENU + || _game_mode == GM_EDITOR + || ((this->slot != OWNER_DEITY) && !Company::IsValidID(this->slot)) + || (config_item.flags & SCRIPTCONFIG_INGAME) != 0 + || _settings_client.gui.ai_developer_tools; + } + + void SetValue(int value) + { + VisibleSettingsList::const_iterator it = this->visible_settings.begin(); + for (int i = 0; i < this->clicked_row; i++) it++; + const ScriptConfigItem config_item = **it; + if (_game_mode == GM_NORMAL && ((this->slot == OWNER_DEITY) || Company::IsValidID(this->slot)) && (config_item.flags & SCRIPTCONFIG_INGAME) == 0) return; + this->script_config->SetSetting(config_item.name, value); + this->SetDirty(); + } +}; + +/** Widgets for the Script settings window. */ +static const NWidgetPart _nested_script_settings_widgets[] = { + NWidget(NWID_HORIZONTAL), + NWidget(WWT_CLOSEBOX, COLOUR_MAUVE), + NWidget(WWT_CAPTION, COLOUR_MAUVE, WID_SCRS_CAPTION), SetDataTip(STR_AI_SETTINGS_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), + NWidget(WWT_DEFSIZEBOX, COLOUR_MAUVE), + EndContainer(), + NWidget(NWID_HORIZONTAL), + NWidget(WWT_MATRIX, COLOUR_MAUVE, WID_SCRS_BACKGROUND), SetMinimalSize(188, 182), SetResize(1, 1), SetFill(1, 0), SetMatrixDataTip(1, 0, STR_NULL), SetScrollbar(WID_SCRS_SCROLLBAR), + NWidget(NWID_VSCROLLBAR, COLOUR_MAUVE, WID_SCRS_SCROLLBAR), + EndContainer(), + NWidget(NWID_HORIZONTAL), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), + NWidget(WWT_PUSHTXTBTN, COLOUR_MAUVE, WID_SCRS_ACCEPT), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_AI_SETTINGS_CLOSE, STR_NULL), + NWidget(WWT_PUSHTXTBTN, COLOUR_MAUVE, WID_SCRS_RESET), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_AI_SETTINGS_RESET, STR_NULL), + EndContainer(), + NWidget(WWT_RESIZEBOX, COLOUR_MAUVE), + EndContainer(), +}; + +/** Window definition for the Script settings window. */ +static WindowDesc _script_settings_desc( + WDP_CENTER, "settings_script", 500, 208, + WC_SCRIPT_SETTINGS, WC_NONE, + 0, + _nested_script_settings_widgets, lengthof(_nested_script_settings_widgets) +); + +/** + * Open the Script settings window to change the Script settings for a Script. + * @param slot The CompanyID of the Script to change the settings. + */ +void ShowScriptSettingsWindow(CompanyID slot) +{ + DeleteWindowByClass(WC_SCRIPT_LIST); + DeleteWindowByClass(WC_SCRIPT_SETTINGS); + new ScriptSettingsWindow(&_script_settings_desc, slot); +} + + +/** Window for displaying the textfile of a AI. */ +struct ScriptTextfileWindow : public TextfileWindow { + CompanyID slot; ///< View the textfile of this CompanyID slot. + + ScriptTextfileWindow(TextfileType file_type, CompanyID slot) : TextfileWindow(file_type), slot(slot) + { + this->OnInvalidateData(); + } + + void SetStringParameters(int widget) const override + { + if (widget == WID_TF_CAPTION) { + SetDParam(0, (slot == OWNER_DEITY) ? STR_CONTENT_TYPE_GAME_SCRIPT : STR_CONTENT_TYPE_AI); + SetDParamStr(1, GetConfig(slot)->GetInfo()->GetName()); + } + } + + void OnInvalidateData(int data = 0, bool gui_scope = true) override + { + const char *textfile = GetConfig(slot)->GetTextfile(file_type, slot); + if (textfile == nullptr) { + delete this; + } else { + this->LoadTextfile(textfile, (slot == OWNER_DEITY) ? GAME_DIR : AI_DIR); + } + } +}; + +/** + * Open the Script version of the textfile window. + * @param file_type The type of textfile to display. + * @param slot The slot the Script is using. + */ +void ShowScriptTextfileWindow(TextfileType file_type, CompanyID slot) +{ + DeleteWindowById(WC_TEXTFILE, file_type); + new ScriptTextfileWindow(file_type, slot); +} + + +/** + * Set the widget colour of a button based on the + * state of the script. (dead or alive) + * @param button the button to update. + * @param dead true if the script is dead, otherwise false. + * @param paused true if the script is paused, otherwise false. + * @return true if the colour was changed and the window need to be marked as dirty. + */ +static bool SetScriptButtonColour(NWidgetCore &button, bool dead, bool paused) +{ + /* Dead scripts are indicated with red background and + * paused scripts are indicated with yellow background. */ + Colours colour = dead ? COLOUR_RED : + (paused ? COLOUR_YELLOW : COLOUR_GREY); + if (button.colour != colour) { + button.colour = colour; + return true; + } + return false; +} + +/** + * Window with everything an AI prints via ScriptLog. + */ +struct ScriptDebugWindow : public Window { + static const uint MAX_BREAK_STR_STRING_LENGTH = 256; ///< Maximum length of the break string. + + static CompanyID script_debug_company; ///< The AI that is (was last) being debugged. + int redraw_timer; ///< Timer for redrawing the window, otherwise it'll happen every tick. + int last_vscroll_pos; ///< Last position of the scrolling. + bool autoscroll; ///< Whether automatically scrolling should be enabled or not. + bool show_break_box; ///< Whether the break/debug box is visible. + static bool break_check_enabled; ///< Stop an AI when it prints a matching string + static char break_string[MAX_BREAK_STR_STRING_LENGTH]; ///< The string to match to the AI output + QueryString break_editbox; ///< Break editbox + static StringFilter break_string_filter; ///< Log filter for break. + static bool case_sensitive_break_check; ///< Is the matching done case-sensitive + int highlight_row; ///< The output row that matches the given string, or -1 + Scrollbar *vscroll; ///< Cache of the vertical scrollbar. + + ScriptLog::LogData *GetLogPointer() const + { + if (script_debug_company == OWNER_DEITY) return (ScriptLog::LogData *)Game::GetInstance()->GetLogPointer(); + return (ScriptLog::LogData *)Company::Get(script_debug_company)->ai_instance->GetLogPointer(); + } + + /** + * Check whether the currently selected AI/GS is dead. + * @return true if dead. + */ + bool IsDead() const + { + if (script_debug_company == OWNER_DEITY) { + GameInstance *game = Game::GetInstance(); + return game == nullptr || game->IsDead(); + } + return !Company::IsValidAiID(script_debug_company) || Company::Get(script_debug_company)->ai_instance->IsDead(); + } + + /** + * Check whether a company is a valid AI company or GS. + * @param company Company to check for validity. + * @return true if company is valid for debugging. + */ + bool IsValidDebugCompany(CompanyID company) const + { + switch (company) { + case INVALID_COMPANY: return false; + case OWNER_DEITY: return Game::GetInstance() != nullptr; + default: return Company::IsValidAiID(company); + } + } + + /** + * Ensure that \c script_debug_company refers to a valid AI company or GS, or is set to #INVALID_COMPANY. + * If no valid company is selected, it selects the first valid AI or GS if any. + */ + void SelectValidDebugCompany() + { + /* Check if the currently selected company is still active. */ + if (this->IsValidDebugCompany(script_debug_company)) return; + + script_debug_company = INVALID_COMPANY; + + for (const Company *c : Company::Iterate()) { + if (c->is_ai) { + ChangeToScript(c->index); + return; + } + } + + /* If no AI is available, see if there is a game script. */ + if (Game::GetInstance() != nullptr) ChangeToScript(OWNER_DEITY); + } + + /** + * Constructor for the window. + * @param desc The description of the window. + * @param number The window number (actually unused). + */ + ScriptDebugWindow(WindowDesc *desc, WindowNumber number) : Window(desc), break_editbox(MAX_BREAK_STR_STRING_LENGTH) + { + this->CreateNestedTree(); + this->vscroll = this->GetScrollbar(WID_SCRD_SCROLLBAR); + this->show_break_box = _settings_client.gui.ai_developer_tools; + this->GetWidget(WID_SCRD_BREAK_STRING_WIDGETS)->SetDisplayedPlane(this->show_break_box ? 0 : SZSP_HORIZONTAL); + this->FinishInitNested(number); + + if (!this->show_break_box) break_check_enabled = false; + + this->last_vscroll_pos = 0; + this->autoscroll = true; + this->highlight_row = -1; + + this->querystrings[WID_SCRD_BREAK_STR_EDIT_BOX] = &this->break_editbox; + + SetWidgetsDisabledState(!this->show_break_box, WID_SCRD_BREAK_STR_ON_OFF_BTN, WID_SCRD_BREAK_STR_EDIT_BOX, WID_SCRD_MATCH_CASE_BTN, WIDGET_LIST_END); + + /* Restore the break string value from static variable */ + this->break_editbox.text.Assign(this->break_string); + + this->SelectValidDebugCompany(); + this->InvalidateData(-1); + } + + void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override + { + if (widget == WID_SCRD_LOG_PANEL) { + resize->height = FONT_HEIGHT_NORMAL + WidgetDimensions::scaled.vsep_normal; + size->height = 14 * resize->height + WidgetDimensions::scaled.framerect.Vertical(); + } + } + + void OnPaint() override + { + this->SelectValidDebugCompany(); + + /* Draw standard stuff */ + this->DrawWidgets(); + + if (this->IsShaded()) return; // Don't draw anything when the window is shaded. + + bool dirty = false; + + /* Paint the company icons */ + for (CompanyID i = COMPANY_FIRST; i < MAX_COMPANIES; i++) { + NWidgetCore *button = this->GetWidget(i + WID_SCRD_COMPANY_BUTTON_START); + + bool valid = Company::IsValidAiID(i); + + /* Check whether the validity of the company changed */ + dirty |= (button->IsDisabled() == valid); + + /* Mark dead/paused AIs by setting the background colour. */ + bool dead = valid && Company::Get(i)->ai_instance->IsDead(); + bool paused = valid && Company::Get(i)->ai_instance->IsPaused(); + /* Re-paint if the button was updated. + * (note that it is intentional that SetScriptButtonColour is always called) */ + dirty |= SetScriptButtonColour(*button, dead, paused); + + /* Draw company icon only for valid AI companies */ + if (!valid) continue; + + byte offset = (i == script_debug_company) ? 1 : 0; + DrawCompanyIcon(i, button->pos_x + button->current_x / 2 - 7 + offset, this->GetWidget(WID_SCRD_COMPANY_BUTTON_START + i)->pos_y + 2 + offset); + } + + /* Set button colour for Game Script. */ + GameInstance *game = Game::GetInstance(); + bool valid = game != nullptr; + bool dead = valid && game->IsDead(); + bool paused = valid && game->IsPaused(); + + NWidgetCore *button = this->GetWidget(WID_SCRD_SCRIPT_GAME); + dirty |= (button->IsDisabled() == valid) || SetScriptButtonColour(*button, dead, paused); + + if (dirty) this->InvalidateData(-1); + + /* If there are no active companies, don't display anything else. */ + if (script_debug_company == INVALID_COMPANY) return; + + ScriptLog::LogData *log = this->GetLogPointer(); + + int scroll_count = (log == nullptr) ? 0 : log->used; + if (this->vscroll->GetCount() != scroll_count) { + this->vscroll->SetCount(scroll_count); + + /* We need a repaint */ + this->SetWidgetDirty(WID_SCRD_SCROLLBAR); + } + + if (log == nullptr) return; + + /* Detect when the user scrolls the window. Enable autoscroll when the + * bottom-most line becomes visible. */ + if (this->last_vscroll_pos != this->vscroll->GetPosition()) { + this->autoscroll = this->vscroll->GetPosition() >= log->used - this->vscroll->GetCapacity(); + } + if (this->autoscroll) { + int scroll_pos = std::max(0, log->used - this->vscroll->GetCapacity()); + if (scroll_pos != this->vscroll->GetPosition()) { + this->vscroll->SetPosition(scroll_pos); + + /* We need a repaint */ + this->SetWidgetDirty(WID_SCRD_SCROLLBAR); + this->SetWidgetDirty(WID_SCRD_LOG_PANEL); + } + } + this->last_vscroll_pos = this->vscroll->GetPosition(); + } + + void SetStringParameters(int widget) const override + { + if (widget != WID_SCRD_NAME_TEXT) return; + + if (script_debug_company == OWNER_DEITY) { + const GameInfo *info = Game::GetInfo(); + assert(info != nullptr); + SetDParam(0, STR_AI_DEBUG_NAME_AND_VERSION); + SetDParamStr(1, info->GetName()); + SetDParam(2, info->GetVersion()); + } else if (script_debug_company == INVALID_COMPANY || !Company::IsValidAiID(script_debug_company)) { + SetDParam(0, STR_EMPTY); + } else { + const AIInfo *info = Company::Get(script_debug_company)->ai_info; + assert(info != nullptr); + SetDParam(0, STR_AI_DEBUG_NAME_AND_VERSION); + SetDParamStr(1, info->GetName()); + SetDParam(2, info->GetVersion()); + } + } + + void DrawWidget(const Rect &r, int widget) const override + { + if (script_debug_company == INVALID_COMPANY) return; + + if (widget != WID_SCRD_LOG_PANEL) return; + + ScriptLog::LogData *log = this->GetLogPointer(); + if (log == nullptr) return; + + Rect br = r.Shrink(WidgetDimensions::scaled.bevel); + Rect tr = r.Shrink(WidgetDimensions::scaled.framerect); + for (int i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < log->used; i++) { + int pos = (i + log->pos + 1 - log->used + log->count) % log->count; + if (log->lines[pos] == nullptr) break; + + TextColour colour; + switch (log->type[pos]) { + case ScriptLog::LOG_SQ_INFO: colour = TC_BLACK; break; + case ScriptLog::LOG_SQ_ERROR: colour = TC_WHITE; break; + case ScriptLog::LOG_INFO: colour = TC_BLACK; break; + case ScriptLog::LOG_WARNING: colour = TC_YELLOW; break; + case ScriptLog::LOG_ERROR: colour = TC_RED; break; + default: colour = TC_BLACK; break; + } + + /* Check if the current line should be highlighted */ + if (pos == this->highlight_row) { + GfxFillRect(br.left, tr.top, br.right, tr.top + this->resize.step_height - 1, PC_BLACK); + if (colour == TC_BLACK) colour = TC_WHITE; // Make black text readable by inverting it to white. + } + + DrawString(tr, log->lines[pos], colour, SA_LEFT | SA_FORCE); + tr.top += this->resize.step_height; + } + } + + /** + * Change all settings to select another Script. + * @param show_ai The new AI to show. + */ + void ChangeToScript(CompanyID show_script) + { + if (!this->IsValidDebugCompany(show_script)) return; + + script_debug_company = show_script; + + this->highlight_row = -1; // The highlight of one Script make little sense for another Script. + + /* Close AI settings window to prevent confusion */ + DeleteWindowByClass(WC_SCRIPT_SETTINGS); + + this->InvalidateData(-1); + + this->autoscroll = true; + this->last_vscroll_pos = this->vscroll->GetPosition(); + } + + void OnClick(Point pt, int widget, int click_count) override + { + /* Also called for hotkeys, so check for disabledness */ + if (this->IsWidgetDisabled(widget)) return; + + /* Check which button is clicked */ + if (IsInsideMM(widget, WID_SCRD_COMPANY_BUTTON_START, WID_SCRD_COMPANY_BUTTON_END + 1)) { + ChangeToScript((CompanyID)(widget - WID_SCRD_COMPANY_BUTTON_START)); + } + + switch (widget) { + case WID_SCRD_SCRIPT_GAME: + ChangeToScript(OWNER_DEITY); + break; + + case WID_SCRD_RELOAD_TOGGLE: + if (script_debug_company == OWNER_DEITY) { + if (UserIsAllowedToChangeGameScript()) { + Game::Uninitialize(true); + Game::StartNew(); + this->InvalidateData(-1); + } + break; + } + /* First kill the company of the AI, then start a new one. This should start the current AI again */ + DoCommandP(0, CCA_DELETE | script_debug_company << 16 | CRR_MANUAL << 24, 0, CMD_COMPANY_CTRL); + DoCommandP(0, CCA_NEW_AI | script_debug_company << 16, 0, CMD_COMPANY_CTRL); + break; + + case WID_SCRD_SETTINGS: + ShowScriptSettingsWindow(script_debug_company); + break; + + case WID_SCRD_BREAK_STR_ON_OFF_BTN: + this->break_check_enabled = !this->break_check_enabled; + this->InvalidateData(-1); + break; + + case WID_SCRD_MATCH_CASE_BTN: + this->case_sensitive_break_check = !this->case_sensitive_break_check; + this->InvalidateData(-1); + break; + + case WID_SCRD_CONTINUE_BTN: + /* Unpause current AI / game script and mark the corresponding script button dirty. */ + if (!this->IsDead()) { + if (script_debug_company == OWNER_DEITY) { + Game::Unpause(); + } else { + AI::Unpause(script_debug_company); + } + } + + /* If the last AI/Game Script is unpaused, unpause the game too. */ + if ((_pause_mode & PM_PAUSED_NORMAL) == PM_PAUSED_NORMAL) { + bool all_unpaused = !Game::IsPaused(); + if (all_unpaused) { + for (const Company *c : Company::Iterate()) { + if (c->is_ai && AI::IsPaused(c->index)) { + all_unpaused = false; + break; + } + } + if (all_unpaused) { + /* All scripts have been unpaused => unpause the game. */ + DoCommandP(0, PM_PAUSED_NORMAL, 0, CMD_PAUSE); + } + } + } + + this->highlight_row = -1; + this->InvalidateData(-1); + break; + } + } + + void OnEditboxChanged(int wid) override + { + if (wid != WID_SCRD_BREAK_STR_EDIT_BOX) return; + + /* Save the current string to static member so it can be restored next time the window is opened. */ + strecpy(this->break_string, this->break_editbox.text.buf, lastof(this->break_string)); + break_string_filter.SetFilterTerm(this->break_string); + } + + /** + * Some data on this window has become invalid. + * @param data Information about the changed data. + * This is the company ID of the AI/GS which wrote a new log message, or -1 in other cases. + * @param gui_scope Whether the call is done from GUI scope. You may not do everything when not in GUI scope. See #InvalidateWindowData() for details. + */ + void OnInvalidateData(int data = 0, bool gui_scope = true) override + { + /* If the log message is related to the active company tab, check the break string. + * This needs to be done in gameloop-scope, so the AI is suspended immediately. */ + if (!gui_scope && data == script_debug_company && this->IsValidDebugCompany(script_debug_company) && this->break_check_enabled && !this->break_string_filter.IsEmpty()) { + /* Get the log instance of the active company */ + ScriptLog::LogData *log = this->GetLogPointer(); + + if (log != nullptr) { + this->break_string_filter.ResetState(); + this->break_string_filter.AddLine(log->lines[log->pos]); + if (this->break_string_filter.GetState()) { + /* Pause execution of script. */ + if (!this->IsDead()) { + if (script_debug_company == OWNER_DEITY) { + Game::Pause(); + } else { + AI::Pause(script_debug_company); + } + } + + /* Pause the game. */ + if ((_pause_mode & PM_PAUSED_NORMAL) == PM_UNPAUSED) { + DoCommandP(0, PM_PAUSED_NORMAL, 1, CMD_PAUSE); + } + + /* Highlight row that matched */ + this->highlight_row = log->pos; + } + } + } + + if (!gui_scope) return; + + this->SelectValidDebugCompany(); + + ScriptLog::LogData *log = script_debug_company != INVALID_COMPANY ? this->GetLogPointer() : nullptr; + this->vscroll->SetCount((log == nullptr) ? 0 : log->used); + + /* Update company buttons */ + for (CompanyID i = COMPANY_FIRST; i < MAX_COMPANIES; i++) { + this->SetWidgetDisabledState(i + WID_SCRD_COMPANY_BUTTON_START, !Company::IsValidAiID(i)); + this->SetWidgetLoweredState(i + WID_SCRD_COMPANY_BUTTON_START, script_debug_company == i); + } + + this->SetWidgetDisabledState(WID_SCRD_SCRIPT_GAME, Game::GetGameInstance() == nullptr); + this->SetWidgetLoweredState(WID_SCRD_SCRIPT_GAME, script_debug_company == OWNER_DEITY); + + this->SetWidgetLoweredState(WID_SCRD_BREAK_STR_ON_OFF_BTN, this->break_check_enabled); + this->SetWidgetLoweredState(WID_SCRD_MATCH_CASE_BTN, this->case_sensitive_break_check); + + this->SetWidgetDisabledState(WID_SCRD_SETTINGS, script_debug_company == INVALID_COMPANY); + extern CompanyID _local_company; + this->SetWidgetDisabledState(WID_SCRD_RELOAD_TOGGLE, script_debug_company == INVALID_COMPANY || + script_debug_company == OWNER_DEITY || (script_debug_company == _local_company && !UserIsAllowedToChangeGameScript())); + this->SetWidgetDisabledState(WID_SCRD_CONTINUE_BTN, script_debug_company == INVALID_COMPANY || + (script_debug_company == OWNER_DEITY ? !Game::IsPaused() : !AI::IsPaused(script_debug_company))); + } + + void OnResize() override + { + this->vscroll->SetCapacityFromWidget(this, WID_SCRD_LOG_PANEL, WidgetDimensions::scaled.framerect.Vertical()); + } + + static HotkeyList hotkeys; +}; + +CompanyID ScriptDebugWindow::script_debug_company = INVALID_COMPANY; +char ScriptDebugWindow::break_string[MAX_BREAK_STR_STRING_LENGTH] = ""; +bool ScriptDebugWindow::break_check_enabled = true; +bool ScriptDebugWindow::case_sensitive_break_check = false; +StringFilter ScriptDebugWindow::break_string_filter(&ScriptDebugWindow::case_sensitive_break_check); + +/** Make a number of rows with buttons for each company for the Script debug window. */ +NWidgetBase *MakeCompanyButtonRowsScriptDebug(int *biggest_index) +{ + return MakeCompanyButtonRows(biggest_index, WID_SCRD_COMPANY_BUTTON_START, WID_SCRD_COMPANY_BUTTON_END, COLOUR_GREY, 8, STR_AI_DEBUG_SELECT_AI_TOOLTIP); +} + +/** + * Handler for global hotkeys of the ScriptDebugWindow. + * @param hotkey Hotkey + * @return ES_HANDLED if hotkey was accepted. + */ +static EventState ScriptDebugGlobalHotkeys(int hotkey) +{ + if (_game_mode != GM_NORMAL) return ES_NOT_HANDLED; + Window *w = ShowScriptDebugWindow(INVALID_COMPANY); + if (w == nullptr) return ES_NOT_HANDLED; + return w->OnHotkey(hotkey); +} + +static Hotkey scriptdebug_hotkeys[] = { + Hotkey('1', "company_1", WID_SCRD_COMPANY_BUTTON_START), + Hotkey('2', "company_2", WID_SCRD_COMPANY_BUTTON_START + 1), + Hotkey('3', "company_3", WID_SCRD_COMPANY_BUTTON_START + 2), + Hotkey('4', "company_4", WID_SCRD_COMPANY_BUTTON_START + 3), + Hotkey('5', "company_5", WID_SCRD_COMPANY_BUTTON_START + 4), + Hotkey('6', "company_6", WID_SCRD_COMPANY_BUTTON_START + 5), + Hotkey('7', "company_7", WID_SCRD_COMPANY_BUTTON_START + 6), + Hotkey('8', "company_8", WID_SCRD_COMPANY_BUTTON_START + 7), + Hotkey('9', "company_9", WID_SCRD_COMPANY_BUTTON_START + 8), + Hotkey((uint16)0, "company_10", WID_SCRD_COMPANY_BUTTON_START + 9), + Hotkey((uint16)0, "company_11", WID_SCRD_COMPANY_BUTTON_START + 10), + Hotkey((uint16)0, "company_12", WID_SCRD_COMPANY_BUTTON_START + 11), + Hotkey((uint16)0, "company_13", WID_SCRD_COMPANY_BUTTON_START + 12), + Hotkey((uint16)0, "company_14", WID_SCRD_COMPANY_BUTTON_START + 13), + Hotkey((uint16)0, "company_15", WID_SCRD_COMPANY_BUTTON_START + 14), + Hotkey('S', "settings", WID_SCRD_SETTINGS), + Hotkey('0', "game_script", WID_SCRD_SCRIPT_GAME), + Hotkey((uint16)0, "reload", WID_SCRD_RELOAD_TOGGLE), + Hotkey('B', "break_toggle", WID_SCRD_BREAK_STR_ON_OFF_BTN), + Hotkey('F', "break_string", WID_SCRD_BREAK_STR_EDIT_BOX), + Hotkey('C', "match_case", WID_SCRD_MATCH_CASE_BTN), + Hotkey(WKC_RETURN, "continue", WID_SCRD_CONTINUE_BTN), + HOTKEY_LIST_END +}; +HotkeyList ScriptDebugWindow::hotkeys("aidebug", scriptdebug_hotkeys, ScriptDebugGlobalHotkeys); + +/** Widgets for the Script debug window. */ +static const NWidgetPart _nested_script_debug_widgets[] = { + NWidget(NWID_HORIZONTAL), + NWidget(WWT_CLOSEBOX, COLOUR_GREY), + NWidget(WWT_CAPTION, COLOUR_GREY), SetDataTip(STR_AI_DEBUG, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), + NWidget(WWT_SHADEBOX, COLOUR_GREY), + NWidget(WWT_DEFSIZEBOX, COLOUR_GREY), + NWidget(WWT_STICKYBOX, COLOUR_GREY), + EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY, WID_SCRD_VIEW), + NWidgetFunction(MakeCompanyButtonRowsScriptDebug), SetPadding(0, 2, 1, 2), + EndContainer(), + NWidget(NWID_HORIZONTAL), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SCRD_SCRIPT_GAME), SetMinimalSize(100, 20), SetResize(1, 0), SetDataTip(STR_AI_GAME_SCRIPT, STR_AI_GAME_SCRIPT_TOOLTIP), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SCRD_NAME_TEXT), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_JUST_STRING, STR_AI_DEBUG_NAME_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SCRD_SETTINGS), SetMinimalSize(100, 20), SetDataTip(STR_AI_DEBUG_SETTINGS, STR_AI_DEBUG_SETTINGS_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SCRD_RELOAD_TOGGLE), SetMinimalSize(100, 20), SetDataTip(STR_AI_DEBUG_RELOAD, STR_AI_DEBUG_RELOAD_TOOLTIP), + EndContainer(), + NWidget(NWID_HORIZONTAL), + NWidget(NWID_VERTICAL), + /* Log panel */ + NWidget(WWT_PANEL, COLOUR_GREY, WID_SCRD_LOG_PANEL), SetMinimalSize(287, 180), SetResize(1, 1), SetScrollbar(WID_SCRD_SCROLLBAR), + EndContainer(), + /* Break string widgets */ + NWidget(NWID_SELECTION, INVALID_COLOUR, WID_SCRD_BREAK_STRING_WIDGETS), + NWidget(NWID_HORIZONTAL), + NWidget(WWT_IMGBTN_2, COLOUR_GREY, WID_SCRD_BREAK_STR_ON_OFF_BTN), SetFill(0, 1), SetDataTip(SPR_FLAG_VEH_STOPPED, STR_AI_DEBUG_BREAK_STR_ON_OFF_TOOLTIP), + NWidget(WWT_PANEL, COLOUR_GREY), + NWidget(NWID_HORIZONTAL), + NWidget(WWT_LABEL, COLOUR_GREY), SetPadding(2, 2, 2, 4), SetDataTip(STR_AI_DEBUG_BREAK_ON_LABEL, 0x0), + NWidget(WWT_EDITBOX, COLOUR_GREY, WID_SCRD_BREAK_STR_EDIT_BOX), SetFill(1, 1), SetResize(1, 0), SetPadding(2, 2, 2, 2), SetDataTip(STR_AI_DEBUG_BREAK_STR_OSKTITLE, STR_AI_DEBUG_BREAK_STR_TOOLTIP), + EndContainer(), + EndContainer(), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SCRD_MATCH_CASE_BTN), SetMinimalSize(100, 0), SetFill(0, 1), SetDataTip(STR_AI_DEBUG_MATCH_CASE, STR_AI_DEBUG_MATCH_CASE_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SCRD_CONTINUE_BTN), SetMinimalSize(100, 0), SetFill(0, 1), SetDataTip(STR_AI_DEBUG_CONTINUE, STR_AI_DEBUG_CONTINUE_TOOLTIP), + EndContainer(), + EndContainer(), + EndContainer(), + NWidget(NWID_VERTICAL), + NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_SCRD_SCROLLBAR), + NWidget(WWT_RESIZEBOX, COLOUR_GREY), + EndContainer(), +EndContainer(), +}; + +/** Window definition for the Script debug window. */ +static WindowDesc _script_debug_desc( + WDP_AUTO, "script_debug", 600, 450, + WC_SCRIPT_DEBUG, WC_NONE, + 0, + _nested_script_debug_widgets, lengthof(_nested_script_debug_widgets), + &ScriptDebugWindow::hotkeys +); + +/** + * Open the Script debug window and select the given company. + * @param show_company Display debug information about this AI company. + */ +Window *ShowScriptDebugWindow(CompanyID show_company) +{ + if (!_networking || _network_server) { + ScriptDebugWindow *w = (ScriptDebugWindow *)BringWindowToFrontById(WC_SCRIPT_DEBUG, 0); + if (w == nullptr) w = new ScriptDebugWindow(&_script_debug_desc, 0); + if (show_company != INVALID_COMPANY) w->ChangeToScript(show_company); + return w; + } else { + ShowErrorMessage(STR_ERROR_AI_DEBUG_SERVER_ONLY, INVALID_STRING_ID, WL_INFO); + } + + return nullptr; +} + +/** + * Reset the Script windows to their initial state. + */ +void InitializeScriptGui() +{ + ScriptDebugWindow::script_debug_company = INVALID_COMPANY; +} + +/** Open the AI debug window if one of the AI scripts has crashed. */ +void ShowScriptDebugWindowIfScriptError() +{ + /* Network clients can't debug AIs. */ + if (_networking && !_network_server) return; + + for (const Company *c : Company::Iterate()) { + if (c->is_ai && c->ai_instance->IsDead()) { + ShowScriptDebugWindow(c->index); + break; + } + } + + GameInstance *g = Game::GetGameInstance(); + if (g != nullptr && g->IsDead()) { + ShowScriptDebugWindow(OWNER_DEITY); + } +} diff --git a/src/script/script_gui.h b/src/script/script_gui.h new file mode 100644 index 0000000000..d892feef3a --- /dev/null +++ b/src/script/script_gui.h @@ -0,0 +1,23 @@ +/* + * This file is part of OpenTTD. + * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. + * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . + */ + + /** @file script_gui.hpp %Window for configuring the scripts */ + +#ifndef SCRIPT_GUI_HPP +#define SCRIPT_GUI_HPP + +#include "../company_type.h" +#include "../textfile_type.h" + +void ShowScriptListWindow(CompanyID slot); +Window *ShowScriptDebugWindow(CompanyID show_company = INVALID_COMPANY); +void ShowScriptSettingsWindow(CompanyID slot); +void ShowScriptTextfileWindow(TextfileType file_type, CompanyID slot); +void ShowScriptDebugWindowIfScriptError(); +void InitializeScriptGui(); + +#endif /* SCRIPT_GUI_HPP */ diff --git a/src/script/script_info.hpp b/src/script/script_info.hpp index 2d066a127d..d3e35c4245 100644 --- a/src/script/script_info.hpp +++ b/src/script/script_info.hpp @@ -164,4 +164,7 @@ private: class ScriptScanner *scanner; ///< ScriptScanner object that was used to scan this script info. }; +void Script_CreateDummyInfo(HSQUIRRELVM vm, const char *type, const char *dir); +void Script_CreateDummy(HSQUIRRELVM vm, StringID string, const char *type); + #endif /* SCRIPT_INFO_HPP */ diff --git a/src/script/script_instance.cpp b/src/script/script_instance.cpp index eccf557bd3..fd0b21862b 100644 --- a/src/script/script_instance.cpp +++ b/src/script/script_instance.cpp @@ -12,6 +12,7 @@ #include "../saveload/saveload.h" #include "../script/squirrel_class.hpp" +#include "../script/squirrel_std.hpp" #include "script_fatalerror.hpp" #include "script_storage.hpp" @@ -116,7 +117,6 @@ void ScriptInstance::Initialize(const char *main_script, const char *instance_na void ScriptInstance::RegisterAPI() { - extern void squirrel_register_std(Squirrel *engine); squirrel_register_std(this->engine); } diff --git a/src/settings.cpp b/src/settings.cpp index 02b21b4c7c..8a97fa7ecc 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -106,7 +106,6 @@ std::string _config_file_text; std::string _private_file; ///< Private configuration file of OpenTTD. std::string _secrets_file; ///< Secrets configuration file of OpenTTD. -typedef std::list ErrorList; static ErrorList _settings_error_list; ///< Errors while loading minimal settings. static bool _fallback_gui_zoom_max = false; @@ -2327,7 +2326,6 @@ void LoadFromConfig(bool startup) PostZoningModeChange(); /* Display scheduled errors */ - extern void ScheduleErrorMessage(ErrorList &datas); ScheduleErrorMessage(_settings_error_list); if (FindWindowById(WC_ERRMSG, 0) == nullptr) ShowFirstError(); } else { diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index bc7822d387..f5dc4919c2 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -3055,13 +3055,15 @@ CommandCost CmdBuildDock(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 if (flags & DC_EXEC) { st->ship_station.Add(tile); - st->ship_station.Add(tile + TileOffsByDiagDir(direction)); + st->ship_station.Add(flat_tile); st->AddFacility(FACIL_DOCK, tile); st->rect.BeforeAddRect(dock_area.tile, dock_area.w, dock_area.h, StationRect::ADD_TRY); /* If the water part of the dock is on a canal, update infrastructure counts. - * This is needed as we've cleared that tile before. */ + * This is needed as we've cleared that tile before. + * Clearing object tiles may result in water tiles which are already accounted for in the water infrastructure total. + * See: MakeWaterKeepingClass() */ if (wc == WATER_CLASS_CANAL && !(HasTileWaterClass(flat_tile) && GetWaterClass(flat_tile) == WATER_CLASS_CANAL && IsTileOwner(flat_tile, _current_company))) { Company::Get(st->owner)->infrastructure.water++; } diff --git a/src/station_map.h b/src/station_map.h index c887da6f47..54da2fe14e 100644 --- a/src/station_map.h +++ b/src/station_map.h @@ -344,6 +344,8 @@ static inline void ToggleRoadWaypointOnSnowOrDesert(TileIndex t) ToggleBit(_me[t].m8, 15); } +StationGfx GetTranslatedAirportTileID(StationGfx gfx); + /** * Get the station graphics of this airport tile * @param t the tile to query @@ -353,7 +355,6 @@ static inline void ToggleRoadWaypointOnSnowOrDesert(TileIndex t) static inline StationGfx GetAirportGfx(TileIndex t) { dbg_assert_tile(IsAirport(t), t); - extern StationGfx GetTranslatedAirportTileID(StationGfx gfx); return GetTranslatedAirportTileID(GetStationGfx(t)); } diff --git a/src/table/settings/company_settings.ini b/src/table/settings/company_settings.ini index 0b118b96d9..ed7aa64b70 100644 --- a/src/table/settings/company_settings.ini +++ b/src/table/settings/company_settings.ini @@ -97,7 +97,7 @@ max = 800 str = STR_CONFIG_SETTING_SERVINT_TRAINS strhelp = STR_CONFIG_SETTING_SERVINT_TRAINS_HELPTEXT strval = STR_CONFIG_SETTING_SERVINT_VALUE -pre_cb = [](auto new_value) { return CanUpdateServiceInterval(VEH_TRAIN, new_value); } +pre_cb = [](auto &new_value) { return CanUpdateServiceInterval(VEH_TRAIN, new_value); } post_cb = [](auto new_value) { UpdateServiceInterval(VEH_TRAIN, new_value); } [SDT_VAR] @@ -110,7 +110,7 @@ max = 800 str = STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES strhelp = STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES_HELPTEXT strval = STR_CONFIG_SETTING_SERVINT_VALUE -pre_cb = [](auto new_value) { return CanUpdateServiceInterval(VEH_ROAD, new_value); } +pre_cb = [](auto &new_value) { return CanUpdateServiceInterval(VEH_ROAD, new_value); } post_cb = [](auto new_value) { UpdateServiceInterval(VEH_ROAD, new_value); } [SDT_VAR] @@ -123,7 +123,7 @@ max = 800 str = STR_CONFIG_SETTING_SERVINT_SHIPS strhelp = STR_CONFIG_SETTING_SERVINT_SHIPS_HELPTEXT strval = STR_CONFIG_SETTING_SERVINT_VALUE -pre_cb = [](auto new_value) { return CanUpdateServiceInterval(VEH_SHIP, new_value); } +pre_cb = [](auto &new_value) { return CanUpdateServiceInterval(VEH_SHIP, new_value); } post_cb = [](auto new_value) { UpdateServiceInterval(VEH_SHIP, new_value); } [SDT_VAR] @@ -136,7 +136,7 @@ max = 800 str = STR_CONFIG_SETTING_SERVINT_AIRCRAFT strhelp = STR_CONFIG_SETTING_SERVINT_AIRCRAFT_HELPTEXT strval = STR_CONFIG_SETTING_SERVINT_VALUE -pre_cb = [](auto new_value) { return CanUpdateServiceInterval(VEH_AIRCRAFT, new_value); } +pre_cb = [](auto &new_value) { return CanUpdateServiceInterval(VEH_AIRCRAFT, new_value); } post_cb = [](auto new_value) { UpdateServiceInterval(VEH_AIRCRAFT, new_value); } [SDT_BOOL] diff --git a/src/table/settings/settings.ini b/src/table/settings/settings.ini index ae06f8375f..8c36e84559 100644 --- a/src/table/settings/settings.ini +++ b/src/table/settings/settings.ini @@ -279,14 +279,15 @@ cat = SC_BASIC var = difficulty.max_loan type = SLE_UINT32 from = SLV_97 -flags = SF_NEWGAME_ONLY | SF_SCENEDIT_TOO | SF_GUI_CURRENCY +flags = SF_NEWGAME_ONLY | SF_SCENEDIT_TOO | SF_GUI_CURRENCY | SF_GUI_0_IS_SPECIAL def = 300000 -min = 0 +min = LOAN_INTERVAL max = 2000000000 -interval = 50000 +pre_cb = [](auto &new_value) { new_value = (new_value + LOAN_INTERVAL / 2) / LOAN_INTERVAL * LOAN_INTERVAL; return true; } +interval = LOAN_INTERVAL str = STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN strhelp = STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT -strval = STR_JUST_CURRENCY_LONG +strval = STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_VALUE cat = SC_BASIC [SDT_VAR] @@ -5751,7 +5752,7 @@ cat = SC_EXPERT var = gui.ai_developer_tools flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = false -post_cb = [](auto) { InvalidateWindowClassesData(WC_AI_SETTINGS); } +post_cb = [](auto) { InvalidateWindowClassesData(WC_SCRIPT_SETTINGS); } cat = SC_EXPERT [SDTC_BOOL] diff --git a/src/timetable_cmd.cpp b/src/timetable_cmd.cpp index 29f0279bcc..d350f11a33 100644 --- a/src/timetable_cmd.cpp +++ b/src/timetable_cmd.cpp @@ -374,6 +374,7 @@ CommandCost CmdBulkChangeTimetable(TileIndex tile, DoCommandFlag flags, uint32 p * @param flags Operation to perform. * @param p1 Various bitstuffed elements * - p1 = (bit 0-19) - Vehicle with the orders to change. + * - p1 = (bit 20) - Apply to all vehicles in group. * @param p2 unused * @param text unused * @return the cost of this operation or an error @@ -381,6 +382,7 @@ CommandCost CmdBulkChangeTimetable(TileIndex tile, DoCommandFlag flags, uint32 p CommandCost CmdSetVehicleOnTime(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) { VehicleID veh = GB(p1, 0, 20); + bool apply_to_group = HasBit(p1, 20); Vehicle *v = Vehicle::GetIfValid(veh); if (v == nullptr || !v->IsPrimaryVehicle() || v->orders == nullptr) return CMD_ERROR; @@ -389,8 +391,23 @@ CommandCost CmdSetVehicleOnTime(TileIndex tile, DoCommandFlag flags, uint32 p1, if (ret.Failed()) return ret; if (flags & DC_EXEC) { - v->lateness_counter = 0; - SetWindowDirty(WC_VEHICLE_TIMETABLE, v->index); + if (apply_to_group) { + int32 most_late = 0; + for (Vehicle *u = v->FirstShared(); u != nullptr; u = u->NextShared()) { + if (u->lateness_counter > most_late) { + most_late = u->lateness_counter; + } + } + if (most_late > 0) { + for (Vehicle *u = v->FirstShared(); u != nullptr; u = u->NextShared()) { + u->lateness_counter -= most_late; + SetWindowDirty(WC_VEHICLE_TIMETABLE, u->index); + } + } + } else { + v->lateness_counter = 0; + SetWindowDirty(WC_VEHICLE_TIMETABLE, v->index); + } } return CommandCost(); diff --git a/src/timetable_gui.cpp b/src/timetable_gui.cpp index ae50fcfea2..ec246bb926 100644 --- a/src/timetable_gui.cpp +++ b/src/timetable_gui.cpp @@ -999,7 +999,7 @@ struct TimetableWindow : GeneralVehicleWindow { } case WID_VT_RESET_LATENESS: // Reset the vehicle's late counter. - DoCommandP(0, v->index, 0, CMD_SET_VEHICLE_ON_TIME | CMD_MSG(STR_ERROR_CAN_T_TIMETABLE_VEHICLE)); + DoCommandP(0, v->index | (_ctrl_pressed ? 1 << 20 : 0), 0, CMD_SET_VEHICLE_ON_TIME | CMD_MSG(STR_ERROR_CAN_T_TIMETABLE_VEHICLE)); break; case WID_VT_AUTOFILL: { // Autofill the timetable. diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index 0e10548c2e..d2b80ad5fd 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -34,6 +34,7 @@ #include "news_gui.h" #include "ai/ai_gui.hpp" #include "game/game_gui.hpp" +#include "script/script_gui.h" #include "tilehighlight_func.h" #include "smallmap_gui.h" #include "graph_gui.h" @@ -1185,7 +1186,7 @@ static CallBackFunction MenuClickHelp(int index) switch (index) { case 0: return PlaceLandBlockInfo(); case 2: IConsoleSwitch(); break; - case 3: ShowAIDebugWindow(); break; + case 3: ShowScriptDebugWindow(); break; case 4: ShowScreenshotWindow(); break; case 5: ShowFramerateWindow(); break; case 6: ShowModifierKeyToggleWindow(); break; @@ -2117,7 +2118,7 @@ struct MainToolbarWindow : Window { case MTHK_BUILD_AIRPORT: ShowBuildAirToolbar(); break; case MTHK_BUILD_TREES: ShowBuildTreesToolbar(); break; case MTHK_MUSIC: ShowMusicWindow(); break; - case MTHK_AI_DEBUG: ShowAIDebugWindow(); break; + case MTHK_SCRIPT_DEBUG: ShowScriptDebugWindow(); break; case MTHK_SMALL_SCREENSHOT: MakeScreenshotWithConfirm(SC_VIEWPORT); break; case MTHK_ZOOMEDIN_SCREENSHOT: MakeScreenshotWithConfirm(SC_ZOOMEDIN); break; case MTHK_DEFAULTZOOM_SCREENSHOT: MakeScreenshotWithConfirm(SC_DEFAULTZOOM); break; @@ -2239,7 +2240,7 @@ static Hotkey maintoolbar_hotkeys[] = { Hotkey(WKC_SHIFT | WKC_F10, "build_airport", MTHK_BUILD_AIRPORT), Hotkey(WKC_SHIFT | WKC_F11, "build_trees", MTHK_BUILD_TREES), Hotkey(WKC_SHIFT | WKC_F12, "music", MTHK_MUSIC), - Hotkey((uint16)0, "ai_debug", MTHK_AI_DEBUG), + Hotkey((uint16)0, "ai_debug", MTHK_SCRIPT_DEBUG), Hotkey(WKC_CTRL | 'S', "small_screenshot", MTHK_SMALL_SCREENSHOT), Hotkey(WKC_CTRL | 'P', "zoomedin_screenshot", MTHK_ZOOMEDIN_SCREENSHOT), Hotkey(WKC_CTRL | 'D', "defaultzoom_screenshot", MTHK_DEFAULTZOOM_SCREENSHOT), diff --git a/src/toolbar_gui.h b/src/toolbar_gui.h index bb5a5d5232..60d81a2a45 100644 --- a/src/toolbar_gui.h +++ b/src/toolbar_gui.h @@ -45,7 +45,7 @@ enum MainToolbarHotkeys { MTHK_BUILD_TREES, MTHK_MUSIC, MTHK_LANDINFO, - MTHK_AI_DEBUG, + MTHK_SCRIPT_DEBUG, MTHK_SMALL_SCREENSHOT, MTHK_ZOOMEDIN_SCREENSHOT, MTHK_DEFAULTZOOM_SCREENSHOT, diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 5843ecbb41..7ef8264928 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -1172,7 +1172,6 @@ void Vehicle::PreDestructor() DeleteVehicleOrders(this); DeleteDepotHighlightOfVehicle(this); - extern void StopGlobalFollowVehicle(const Vehicle *v); StopGlobalFollowVehicle(this); ReleaseDisastersTargetingVehicle(this->index); @@ -3765,7 +3764,6 @@ CommandCost Vehicle::SendToDepot(DoCommandFlag flags, DepotCommand command, Tile Aircraft *a = Aircraft::From(this); if (a->state == FLYING && a->targetairport != closestDepot.destination) { /* The aircraft is now heading for a different hangar than the next in the orders */ - extern void AircraftNextAirportPos_and_Order(Aircraft *a); AircraftNextAirportPos_and_Order(a); } } diff --git a/src/vehicle_gui.h b/src/vehicle_gui.h index 9c43884958..a0e1495a06 100644 --- a/src/vehicle_gui.h +++ b/src/vehicle_gui.h @@ -116,6 +116,7 @@ bool VehicleClicked(const GUIVehicleGroup &vehgroup); void StartStopVehicle(const Vehicle *v, bool texteffect); Vehicle *CheckClickOnVehicle(const struct Viewport *vp, int x, int y); +void StopGlobalFollowVehicle(const Vehicle *v); void DrawVehicleImage(const Vehicle *v, const Rect &r, VehicleID selection, EngineImageType image_type, int skip); void SetMouseCursorVehicle(const Vehicle *v, EngineImageType image_type); diff --git a/src/viewport_func.h b/src/viewport_func.h index 1c665c4fc5..ffcea1de46 100644 --- a/src/viewport_func.h +++ b/src/viewport_func.h @@ -50,6 +50,7 @@ void CheckMarkDirtyFocusedRoutePaths(); bool DoZoomInOutWindow(ZoomStateChange how, Window *w); void ZoomInOrOutToCursorWindow(bool in, Window * w); +void ConstrainAllViewportsZoom(); Point GetTileZoomCenterWindow(bool in, Window * w); void FixTitleGameZoom(int zoom_adjust = 0); void HandleZoomMessage(Window *w, const Viewport *vp, byte widget_zoom_in, byte widget_zoom_out); diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp index fc781306c4..e235e5395f 100644 --- a/src/water_cmd.cpp +++ b/src/water_cmd.cpp @@ -149,7 +149,9 @@ CommandCost CmdBuildShipDepot(TileIndex tile, DoCommandFlag flags, uint32 p1, ui depot->build_date = _date; uint new_water_infra = 2 * LOCK_DEPOT_TILE_FACTOR; - /* Update infrastructure counts after the tile clears earlier. */ + /* Update infrastructure counts after the tile clears earlier. + * Clearing object tiles may result in water tiles which are already accounted for in the water infrastructure total. + * See: MakeWaterKeepingClass() */ if (wc1 == WATER_CLASS_CANAL && !(HasTileWaterClass(tile) && GetWaterClass(tile) == WATER_CLASS_CANAL && IsTileOwner(tile, _current_company))) new_water_infra++; if (wc2 == WATER_CLASS_CANAL && !(HasTileWaterClass(tile2) && GetWaterClass(tile2) == WATER_CLASS_CANAL && IsTileOwner(tile2, _current_company))) new_water_infra++; diff --git a/src/widgets/CMakeLists.txt b/src/widgets/CMakeLists.txt index 41afbe8d9a..d2ecfccd93 100644 --- a/src/widgets/CMakeLists.txt +++ b/src/widgets/CMakeLists.txt @@ -46,6 +46,7 @@ add_files( rail_widget.h road_widget.h screenshot_widget.h + script_widget.h settings_widget.h sign_widget.h slider.cpp diff --git a/src/widgets/ai_widget.h b/src/widgets/ai_widget.h index f09ab21210..f50b6632c8 100644 --- a/src/widgets/ai_widget.h +++ b/src/widgets/ai_widget.h @@ -10,28 +10,8 @@ #ifndef WIDGETS_AI_WIDGET_H #define WIDGETS_AI_WIDGET_H -#include "../company_type.h" #include "../textfile_type.h" -/** Widgets of the #AIListWindow class. */ -enum AIListWidgets { - WID_AIL_CAPTION, ///< Caption of the window. - WID_AIL_LIST, ///< The matrix with all available AIs. - WID_AIL_SCROLLBAR, ///< Scrollbar next to the AI list. - WID_AIL_INFO_BG, ///< Panel to draw some AI information on. - WID_AIL_ACCEPT, ///< Accept button. - WID_AIL_CANCEL, ///< Cancel button. -}; - -/** Widgets of the #AISettingsWindow class. */ -enum AISettingsWidgets { - WID_AIS_CAPTION, ///< Caption of the window. - WID_AIS_BACKGROUND, ///< Panel to draw the settings on. - WID_AIS_SCROLLBAR, ///< Scrollbar to scroll through all settings. - WID_AIS_ACCEPT, ///< Accept button. - WID_AIS_RESET, ///< Reset button. -}; - /** Widgets of the #AIConfigWindow class. */ enum AIConfigWidgets { WID_AIC_BACKGROUND, ///< Window background. @@ -49,22 +29,4 @@ enum AIConfigWidgets { WID_AIC_CONTENT_DOWNLOAD = WID_AIC_TEXTFILE + TFT_END, ///< Download content button. }; -/** Widgets of the #AIDebugWindow class. */ -enum AIDebugWidgets { - WID_AID_VIEW, ///< The row of company buttons. - WID_AID_NAME_TEXT, ///< Name of the current selected. - WID_AID_SETTINGS, ///< Settings button. - WID_AID_SCRIPT_GAME, ///< Game Script button. - WID_AID_RELOAD_TOGGLE, ///< Reload button. - WID_AID_LOG_PANEL, ///< Panel where the log is in. - WID_AID_SCROLLBAR, ///< Scrollbar of the log panel. - WID_AID_COMPANY_BUTTON_START, ///< Buttons in the VIEW. - WID_AID_COMPANY_BUTTON_END = WID_AID_COMPANY_BUTTON_START + MAX_COMPANIES - 1, ///< Last possible button in the VIEW. - WID_AID_BREAK_STRING_WIDGETS, ///< The panel to handle the breaking on string. - WID_AID_BREAK_STR_ON_OFF_BTN, ///< Enable breaking on string. - WID_AID_BREAK_STR_EDIT_BOX, ///< Edit box for the string to break on. - WID_AID_MATCH_CASE_BTN, ///< Checkbox to use match caching or not. - WID_AID_CONTINUE_BTN, ///< Continue button. -}; - #endif /* WIDGETS_AI_WIDGET_H */ diff --git a/src/widgets/game_widget.h b/src/widgets/game_widget.h index 0d2d0950b3..f791a43749 100644 --- a/src/widgets/game_widget.h +++ b/src/widgets/game_widget.h @@ -5,7 +5,7 @@ * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . */ -/** @file ai_widget.h Types related to the ai widgets. */ +/** @file game_widget.h Types related to the GS widgets. */ #ifndef WIDGETS_GS_WIDGET_H #define WIDGETS_GS_WIDGET_H diff --git a/src/widgets/script_widget.h b/src/widgets/script_widget.h new file mode 100644 index 0000000000..9c757e12fa --- /dev/null +++ b/src/widgets/script_widget.h @@ -0,0 +1,52 @@ +/* + * This file is part of OpenTTD. + * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. + * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . + */ + +/** @file script_widget.h Types related to the script widgets. */ + +#ifndef WIDGETS_SCRIPT_WIDGET_H +#define WIDGETS_SCRIPT_WIDGET_H + +#include "../company_type.h" + +/** Widgets of the #ScriptListWindow class. */ +enum ScriptListWidgets { + WID_SCRL_CAPTION, ///< Caption of the window. + WID_SCRL_LIST, ///< The matrix with all available Scripts. + WID_SCRL_SCROLLBAR, ///< Scrollbar next to the Script list. + WID_SCRL_INFO_BG, ///< Panel to draw some Script information on. + WID_SCRL_ACCEPT, ///< Accept button. + WID_SCRL_CANCEL, ///< Cancel button. +}; + +/** Widgets of the #ScriptSettingsWindow class. */ +enum ScriptSettingsWidgets { + WID_SCRS_CAPTION, ///< Caption of the window. + WID_SCRS_BACKGROUND, ///< Panel to draw the settings on. + WID_SCRS_SCROLLBAR, ///< Scrollbar to scroll through all settings. + WID_SCRS_ACCEPT, ///< Accept button. + WID_SCRS_RESET, ///< Reset button. +}; + +/** Widgets of the #ScriptDebugWindow class. */ +enum ScriptDebugWidgets { + WID_SCRD_VIEW, ///< The row of company buttons. + WID_SCRD_NAME_TEXT, ///< Name of the current selected. + WID_SCRD_SETTINGS, ///< Settings button. + WID_SCRD_SCRIPT_GAME, ///< Game Script button. + WID_SCRD_RELOAD_TOGGLE, ///< Reload button. + WID_SCRD_LOG_PANEL, ///< Panel where the log is in. + WID_SCRD_SCROLLBAR, ///< Scrollbar of the log panel. + WID_SCRD_COMPANY_BUTTON_START, ///< Buttons in the VIEW. + WID_SCRD_COMPANY_BUTTON_END = WID_SCRD_COMPANY_BUTTON_START + MAX_COMPANIES - 1, ///< Last possible button in the VIEW. + WID_SCRD_BREAK_STRING_WIDGETS, ///< The panel to handle the breaking on string. + WID_SCRD_BREAK_STR_ON_OFF_BTN, ///< Enable breaking on string. + WID_SCRD_BREAK_STR_EDIT_BOX, ///< Edit box for the string to break on. + WID_SCRD_MATCH_CASE_BTN, ///< Checkbox to use match caching or not. + WID_SCRD_CONTINUE_BTN, ///< Continue button. +}; + +#endif /* WIDGETS_SCRIPT_WIDGET_H */ diff --git a/src/window.cpp b/src/window.cpp index bf3e426abe..128ad4cac8 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -18,6 +18,7 @@ #include "blitter/factory.hpp" #include "zoom_func.h" #include "vehicle_base.h" +#include "depot_func.h" #include "window_func.h" #include "tilehighlight_func.h" #include "network/network.h" @@ -1397,8 +1398,8 @@ static uint GetWindowZPriority(WindowClass wc) case WC_CUSTOM_CURRENCY: case WC_NETWORK_WINDOW: case WC_GRF_PARAMETERS: - case WC_AI_LIST: - case WC_AI_SETTINGS: + case WC_SCRIPT_LIST: + case WC_SCRIPT_SETTINGS: case WC_TEXTFILE: ++z_priority; FALLTHROUGH; @@ -3264,7 +3265,6 @@ void UpdateWindows() PerformanceMeasurer framerate(PFE_DRAWING); PerformanceAccumulator::Reset(PFE_DRAWWORLD); - extern void ProcessPendingPerformanceMeasurements(); ProcessPendingPerformanceMeasurements(); CallWindowRealtimeTickEvent(delta_ms); @@ -3578,7 +3578,6 @@ void ReInitAllWindows(bool zoom_changed) NWidgetLeaf::InvalidateDimensionCache(); // Reset cached sizes of several widgets. NWidgetScrollbar::InvalidateDimensionCache(); - extern void InitDepotWindowBlockSizes(); InitDepotWindowBlockSizes(); /* When _gui_zoom has changed, we need to resize toolbar and statusbar first, @@ -3590,7 +3589,6 @@ void ReInitAllWindows(bool zoom_changed) ReInitWindow(w, zoom_changed); } - void NetworkReInitChatBoxSize(); NetworkReInitChatBoxSize(); /* Make sure essential parts of all windows are visible */ diff --git a/src/window_type.h b/src/window_type.h index 30bd3827c9..78e4f4bc36 100644 --- a/src/window_type.h +++ b/src/window_type.h @@ -168,10 +168,10 @@ enum WindowClass { /** - * AI settings; %Window numbers: - * - 0 = #AISettingsWidgets + * Script settings; %Window numbers: + * - 0 = #ScriptSettingsWidgets */ - WC_AI_SETTINGS, + WC_SCRIPT_SETTINGS, /** * NewGRF parameters; %Window numbers: @@ -295,10 +295,10 @@ enum WindowClass { WC_SIGN_LIST, /** - * AI list; %Window numbers: - * - 0 = #AIListWidgets + * Scripts list; %Window numbers: + * - 0 = #ScriptListWidgets */ - WC_AI_LIST, + WC_SCRIPT_LIST, /** * Goals list; %Window numbers: @@ -686,10 +686,10 @@ enum WindowClass { /** - * AI debug window; %Window numbers: - * - 0 = #AIDebugWidgets + * Script debug window; %Window numbers: + * - 0 = #ScriptDebugWidgets */ - WC_AI_DEBUG, + WC_SCRIPT_DEBUG, /** * NewGRF inspect (debug); %Window numbers: