From 62e4d1e507e861e66a7cfbfa0804274df5d483c1 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Fri, 17 Nov 2023 16:41:30 +0000 Subject: [PATCH 001/105] Codechange: Dimension must have both width and height. Default parameters allowed Dimension to be constructed with only a width. Instead use separate empty and width/height constructors to ensure that either none or both are provided. --- src/core/geometry_type.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core/geometry_type.hpp b/src/core/geometry_type.hpp index 323cadc702..4f2d9d4fcf 100644 --- a/src/core/geometry_type.hpp +++ b/src/core/geometry_type.hpp @@ -28,7 +28,8 @@ struct Dimension { uint width; uint height; - Dimension(uint w = 0, uint h = 0) : width(w), height(h) {}; + constexpr Dimension() : width(0), height(0) {} + constexpr Dimension(uint w, uint h) : width(w), height(h) {} bool operator< (const Dimension &other) const { From 49532914dd44e4876a1185bf4a1fbd68f65b96d6 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 11 Nov 2023 15:17:12 +0000 Subject: [PATCH 002/105] Change: Use CRTP-mixins to compose dropdown list items. This allows list items to built from component parts as required, and additional functionality is added: * Icons and text can be positioned at the start or end of the space (templated.) * Font size of text can be changed (templated.) * Palette of sprites can be set (runtime.) --- src/company_gui.cpp | 39 ++----- src/genworld_gui.cpp | 2 +- src/settings_gui.cpp | 2 +- src/toolbar_gui.cpp | 113 +++----------------- src/widgets/dropdown.cpp | 87 +--------------- src/widgets/dropdown_type.h | 199 ++++++++++++++++++++++++++++++------ 6 files changed, 201 insertions(+), 241 deletions(-) diff --git a/src/company_gui.cpp b/src/company_gui.cpp index 6e7e41b871..439e2257dc 100644 --- a/src/company_gui.cpp +++ b/src/company_gui.cpp @@ -575,36 +575,15 @@ static const LiveryClass _livery_class[LS_END] = { LC_ROAD, LC_ROAD, }; -class DropDownListColourItem : public DropDownListStringItem { +/** + * Colour selection list item, with icon and string components. + * @tparam TSprite Recolourable sprite to draw as icon. + */ +template +class DropDownListColourItem : public DropDownIcon> { public: - DropDownListColourItem(int result, bool masked) : DropDownListStringItem(result >= COLOUR_END ? STR_COLOUR_DEFAULT : _colour_dropdown[result], result, masked) {} - - uint Width() const override + DropDownListColourItem(int colour, bool masked) : DropDownIcon>(TSprite, PALETTE_RECOLOUR_START + (colour % COLOUR_END), colour < COLOUR_END ? _colour_dropdown[colour] : STR_COLOUR_DEFAULT, colour, masked) { - return ScaleGUITrad(28) + WidgetDimensions::scaled.hsep_normal + GetStringBoundingBox(this->String()).width + WidgetDimensions::scaled.dropdowntext.Horizontal(); - } - - uint Height() const override - { - return std::max(GetCharacterHeight(FS_NORMAL), ScaleGUITrad(12) + WidgetDimensions::scaled.vsep_normal); - } - - bool Selectable() const override - { - return true; - } - - void Draw(const Rect &r, bool sel, Colours) const override - { - bool rtl = _current_text_dir == TD_RTL; - int icon_y = CenterBounds(r.top, r.bottom, 0); - int text_y = CenterBounds(r.top, r.bottom, GetCharacterHeight(FS_NORMAL)); - Rect tr = r.Shrink(WidgetDimensions::scaled.dropdowntext); - DrawSprite(SPR_VEH_BUS_SIDE_VIEW, PALETTE_RECOLOUR_START + (this->result % COLOUR_END), - rtl ? tr.right - ScaleGUITrad(14) : tr.left + ScaleGUITrad(14), - icon_y); - tr = tr.Indent(ScaleGUITrad(28) + WidgetDimensions::scaled.hsep_normal, rtl); - DrawString(tr.left, tr.right, text_y, this->String(), sel ? TC_WHITE : TC_BLACK); } }; @@ -662,10 +641,10 @@ private: if (default_livery != nullptr) { /* Add COLOUR_END to put the colour out of range, but also allow us to show what the default is */ default_col = (primary ? default_livery->colour1 : default_livery->colour2) + COLOUR_END; - list.push_back(std::make_unique(default_col, false)); + list.push_back(std::make_unique>(default_col, false)); } for (uint i = 0; i < lengthof(_colour_dropdown); i++) { - list.push_back(std::make_unique(i, HasBit(used_colours, i))); + list.push_back(std::make_unique>(i, HasBit(used_colours, i))); } byte sel = (default_livery == nullptr || HasBit(livery->in_use, primary ? 0 : 1)) ? (primary ? livery->colour1 : livery->colour2) : default_col; diff --git a/src/genworld_gui.cpp b/src/genworld_gui.cpp index f529e5d77c..5fa8a0a289 100644 --- a/src/genworld_gui.cpp +++ b/src/genworld_gui.cpp @@ -358,7 +358,7 @@ static DropDownList BuildTownNameDropDown() size_t newgrf_size = list.size(); /* Insert newgrf_names at the top of the list */ if (newgrf_size > 0) { - list.push_back(std::make_unique(-1, false)); // separator line + list.push_back(std::make_unique(-1, false)); // separator line newgrf_size++; } diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 97a3066dae..5484d15acd 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -224,7 +224,7 @@ struct GameOptionsWindow : Window { std::sort(list.begin(), list.end(), DropDownListStringItem::NatSortFunc); /* Append custom currency at the end */ - list.push_back(std::make_unique(-1, false)); // separator line + list.push_back(std::make_unique(-1, false)); // separator line list.push_back(std::make_unique(STR_GAME_OPTIONS_CURRENCY_CUSTOM, CURRENCY_CUSTOM, HasBit(disabled, CURRENCY_CUSTOM))); break; } diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index 74b623d862..70b2fb5ec8 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -89,97 +89,16 @@ enum CallBackFunction { static CallBackFunction _last_started_action = CBF_NONE; ///< Last started user action. - /** - * Drop down list entry for showing a checked/unchecked toggle item. + * Company name list item, with company-colour icon, name, and lock components. */ -class DropDownListCheckedItem : public DropDownListStringItem { - uint checkmark_width; +class DropDownListCompanyItem : public DropDownIcon, true>> { public: - bool checked; - - DropDownListCheckedItem(StringID string, int result, bool masked, bool checked) : DropDownListStringItem(string, result, masked), checked(checked) - { - this->checkmark_width = GetStringBoundingBox(STR_JUST_CHECKMARK).width + WidgetDimensions::scaled.hsep_wide; - } - - uint Width() const override - { - return DropDownListStringItem::Width() + this->checkmark_width; - } - - void Draw(const Rect &r, bool sel, Colours) const override - { - bool rtl = _current_text_dir == TD_RTL; - Rect tr = r.Shrink(WidgetDimensions::scaled.dropdowntext, RectPadding::zero); - if (this->checked) { - DrawString(tr, STR_JUST_CHECKMARK, sel ? TC_WHITE : TC_BLACK); - } - DrawString(tr.Indent(this->checkmark_width, rtl), this->String(), sel ? TC_WHITE : TC_BLACK); - } -}; - -/** - * Drop down list entry for showing a company entry, with companies 'blob'. - */ -class DropDownListCompanyItem : public DropDownListItem { - Dimension icon_size; - Dimension lock_size; -public: - bool greyed; - - DropDownListCompanyItem(int result, bool masked, bool greyed) : DropDownListItem(result, masked), greyed(greyed) - { - this->icon_size = GetSpriteSize(SPR_COMPANY_ICON); - this->lock_size = GetSpriteSize(SPR_LOCK); - } - - bool Selectable() const override + DropDownListCompanyItem(CompanyID company, bool shaded) : DropDownIcon, true>>(SPR_COMPANY_ICON, COMPANY_SPRITE_COLOUR(company), NetworkCompanyIsPassworded(company) ? SPR_LOCK : SPR_EMPTY, PAL_NONE, STR_NULL, company, false, shaded) { - return true; - } - - uint Width() const override - { - CompanyID company = (CompanyID)this->result; SetDParam(0, company); SetDParam(1, company); - return GetStringBoundingBox(STR_COMPANY_NAME_COMPANY_NUM).width + this->icon_size.width + this->lock_size.width + WidgetDimensions::scaled.dropdowntext.Horizontal() + WidgetDimensions::scaled.hsep_wide; - } - - uint Height() const override - { - return std::max(std::max(this->icon_size.height, this->lock_size.height) + WidgetDimensions::scaled.imgbtn.Vertical(), (uint)GetCharacterHeight(FS_NORMAL)); - } - - void Draw(const Rect &r, bool sel, Colours) const override - { - CompanyID company = (CompanyID)this->result; - bool rtl = _current_text_dir == TD_RTL; - - /* It's possible the company is deleted while the dropdown is open */ - if (!Company::IsValidID(company)) return; - - Rect tr = r.Shrink(WidgetDimensions::scaled.dropdowntext, RectPadding::zero); - int icon_y = CenterBounds(r.top, r.bottom, icon_size.height); - int text_y = CenterBounds(r.top, r.bottom, GetCharacterHeight(FS_NORMAL)); - int lock_y = CenterBounds(r.top, r.bottom, lock_size.height); - - DrawCompanyIcon(company, tr.WithWidth(this->icon_size.width, rtl).left, icon_y); - if (NetworkCompanyIsPassworded(company)) { - DrawSprite(SPR_LOCK, PAL_NONE, tr.WithWidth(this->lock_size.width, !rtl).left, lock_y); - } - - SetDParam(0, company); - SetDParam(1, company); - TextColour col; - if (this->greyed) { - col = (sel ? TC_SILVER : TC_GREY) | TC_NO_SHADE; - } else { - col = sel ? TC_WHITE : TC_BLACK; - } - tr = tr.Indent(this->icon_size.width + WidgetDimensions::scaled.hsep_normal, rtl).Indent(this->lock_size.width + WidgetDimensions::scaled.hsep_normal, !rtl); - DrawString(tr.left, tr.right, text_y, STR_COMPANY_NAME_COMPANY_NUM, col); + this->SetString(GetString(STR_COMPANY_NAME_COMPANY_NUM)); } }; @@ -208,7 +127,7 @@ static void PopupMainToolbarMenu(Window *w, int widget, const std::initializer_l int i = 0; for (StringID string : strings) { if (string == STR_NULL) { - list.push_back(std::make_unique(-1, false)); + list.push_back(std::make_unique(-1, false)); } else { list.push_back(std::make_unique(string, i, false)); i++; @@ -254,7 +173,7 @@ static void PopupMainCompanyToolbMenu(Window *w, int widget, int grey = 0) for (CompanyID c = COMPANY_FIRST; c < MAX_COMPANIES; c++) { if (!Company::IsValidID(c)) continue; - list.push_back(std::make_unique(c, false, HasBit(grey, c))); + list.push_back(std::make_unique(c, HasBit(grey, c))); } PopupMainToolbarMenu(w, widget, std::move(list), _local_company == COMPANY_SPECTATOR ? (widget == WID_TN_COMPANIES ? CTMN_CLIENT_LIST : CTMN_SPECTATOR) : (int)_local_company); @@ -341,16 +260,16 @@ static CallBackFunction ToolbarOptionsClick(Window *w) } list.push_back(std::make_unique(STR_SETTINGS_MENU_NEWGRF_SETTINGS, OME_NEWGRFSETTINGS, false)); list.push_back(std::make_unique(STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS, OME_TRANSPARENCIES, false)); - list.push_back(std::make_unique(-1, false)); - list.push_back(std::make_unique(STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED, OME_SHOW_TOWNNAMES, false, HasBit(_display_opt, DO_SHOW_TOWN_NAMES))); - list.push_back(std::make_unique(STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED, OME_SHOW_STATIONNAMES, false, HasBit(_display_opt, DO_SHOW_STATION_NAMES))); - list.push_back(std::make_unique(STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED, OME_SHOW_WAYPOINTNAMES, false, HasBit(_display_opt, DO_SHOW_WAYPOINT_NAMES))); - list.push_back(std::make_unique(STR_SETTINGS_MENU_SIGNS_DISPLAYED, OME_SHOW_SIGNS, false, HasBit(_display_opt, DO_SHOW_SIGNS))); - list.push_back(std::make_unique(STR_SETTINGS_MENU_SHOW_COMPETITOR_SIGNS, OME_SHOW_COMPETITOR_SIGNS, false, HasBit(_display_opt, DO_SHOW_COMPETITOR_SIGNS))); - list.push_back(std::make_unique(STR_SETTINGS_MENU_FULL_ANIMATION, OME_FULL_ANIMATION, false, HasBit(_display_opt, DO_FULL_ANIMATION))); - list.push_back(std::make_unique(STR_SETTINGS_MENU_FULL_DETAIL, OME_FULL_DETAILS, false, HasBit(_display_opt, DO_FULL_DETAIL))); - list.push_back(std::make_unique(STR_SETTINGS_MENU_TRANSPARENT_BUILDINGS, OME_TRANSPARENTBUILDINGS, false, IsTransparencySet(TO_HOUSES))); - list.push_back(std::make_unique(STR_SETTINGS_MENU_TRANSPARENT_SIGNS, OME_SHOW_STATIONSIGNS, false, IsTransparencySet(TO_SIGNS))); + list.push_back(std::make_unique(-1, false)); + list.push_back(std::make_unique(HasBit(_display_opt, DO_SHOW_TOWN_NAMES), STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED, OME_SHOW_TOWNNAMES, false)); + list.push_back(std::make_unique(HasBit(_display_opt, DO_SHOW_STATION_NAMES), STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED, OME_SHOW_STATIONNAMES, false)); + list.push_back(std::make_unique(HasBit(_display_opt, DO_SHOW_WAYPOINT_NAMES), STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED, OME_SHOW_WAYPOINTNAMES, false)); + list.push_back(std::make_unique(HasBit(_display_opt, DO_SHOW_SIGNS), STR_SETTINGS_MENU_SIGNS_DISPLAYED, OME_SHOW_SIGNS, false)); + list.push_back(std::make_unique(HasBit(_display_opt, DO_SHOW_COMPETITOR_SIGNS), STR_SETTINGS_MENU_SHOW_COMPETITOR_SIGNS, OME_SHOW_COMPETITOR_SIGNS, false)); + list.push_back(std::make_unique(HasBit(_display_opt, DO_FULL_ANIMATION), STR_SETTINGS_MENU_FULL_ANIMATION, OME_FULL_ANIMATION, false)); + list.push_back(std::make_unique(HasBit(_display_opt, DO_FULL_DETAIL), STR_SETTINGS_MENU_FULL_DETAIL, OME_FULL_DETAILS, false)); + list.push_back(std::make_unique(IsTransparencySet(TO_HOUSES), STR_SETTINGS_MENU_TRANSPARENT_BUILDINGS, OME_TRANSPARENTBUILDINGS, false)); + list.push_back(std::make_unique(IsTransparencySet(TO_SIGNS), STR_SETTINGS_MENU_TRANSPARENT_SIGNS, OME_SHOW_STATIONSIGNS, false)); ShowDropDownList(w, std::move(list), 0, WID_TN_SETTINGS, 140, true); if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP); diff --git a/src/widgets/dropdown.cpp b/src/widgets/dropdown.cpp index ebf40fe909..9ad87c0a84 100644 --- a/src/widgets/dropdown.cpp +++ b/src/widgets/dropdown.cpp @@ -22,82 +22,6 @@ #include "../safeguards.h" -void DropDownListItem::Draw(const Rect &r, bool, Colours bg_colour) const -{ - int c1 = _colour_gradient[bg_colour][3]; - int c2 = _colour_gradient[bg_colour][7]; - - int mid = CenterBounds(r.top, r.bottom, 0); - GfxFillRect(r.left, mid - WidgetDimensions::scaled.bevel.bottom, r.right, mid - 1, c1); - GfxFillRect(r.left, mid, r.right, mid + WidgetDimensions::scaled.bevel.top - 1, c2); -} - -DropDownListStringItem::DropDownListStringItem(StringID string, int result, bool masked) : DropDownListItem(result, masked), string(GetString(string)) -{ -} - -DropDownListStringItem::DropDownListStringItem(const std::string &string, int result, bool masked) : DropDownListItem(result, masked) -{ - /* A raw string may contain parsable tokens, so it needs to be passed through GetString. */ - SetDParamStr(0, string); - this->string = GetString(STR_JUST_RAW_STRING); -} - -uint DropDownListStringItem::Width() const -{ - return GetStringBoundingBox(this->String()).width + WidgetDimensions::scaled.dropdowntext.Horizontal(); -} - -void DropDownListStringItem::Draw(const Rect &r, bool sel, Colours) const -{ - Rect ir = r.Shrink(WidgetDimensions::scaled.dropdowntext); - DrawString(ir.left, ir.right, r.top, this->String(), sel ? TC_WHITE : TC_BLACK); -} - -/** - * Natural sorting comparator function for DropDownList::sort(). - * @param first Left side of comparison. - * @param second Right side of comparison. - * @return true if \a first precedes \a second. - * @warning All items in the list need to be derivates of DropDownListStringItem. - */ -/* static */ bool DropDownListStringItem::NatSortFunc(std::unique_ptr const &first, std::unique_ptr const &second) -{ - std::string str1 = static_cast(first.get())->String(); - std::string str2 = static_cast(second.get())->String(); - return StrNaturalCompare(str1, str2) < 0; -} - -DropDownListIconItem::DropDownListIconItem(SpriteID sprite, PaletteID pal, StringID string, int result, bool masked) : DropDownListStringItem(string, result, masked), sprite(sprite), pal(pal) -{ - this->dim = GetSpriteSize(sprite); - this->sprite_y = dim.height; -} - -uint DropDownListIconItem::Height() const -{ - return std::max(this->dim.height, (uint)GetCharacterHeight(FS_NORMAL)); -} - -uint DropDownListIconItem::Width() const -{ - return DropDownListStringItem::Width() + this->dim.width + WidgetDimensions::scaled.hsep_wide; -} - -void DropDownListIconItem::Draw(const Rect &r, bool sel, Colours) const -{ - bool rtl = _current_text_dir == TD_RTL; - Rect ir = r.Shrink(WidgetDimensions::scaled.dropdowntext); - Rect tr = ir.Indent(this->dim.width + WidgetDimensions::scaled.hsep_normal, rtl); - DrawSprite(this->sprite, this->pal, ir.WithWidth(this->dim.width, rtl).left, CenterBounds(r.top, r.bottom, this->sprite_y)); - DrawString(tr.left, tr.right, CenterBounds(r.top, r.bottom, GetCharacterHeight(FS_NORMAL)), this->String(), sel ? TC_WHITE : TC_BLACK); -} - -void DropDownListIconItem::SetDimension(Dimension d) -{ - this->dim = d; -} - static const NWidgetPart _nested_dropdown_menu_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_PANEL, COLOUR_END, WID_DM_ITEMS), SetMinimalSize(1, 1), SetScrollbar(WID_DM_SCROLL), EndContainer(), @@ -256,14 +180,12 @@ struct DropdownWindow : Window { if (--pos >= 0) continue; if (y + item_height - 1 <= ir.bottom) { - bool selected = (this->selected_index == item->result); - if (selected) GfxFillRect(ir.left, y, ir.right, y + item_height - 1, PC_BLACK); + Rect full{ir.left, y, ir.right, y + item_height - 1}; - item->Draw({ir.left, y, ir.right, y + item_height - 1}, selected, colour); + bool selected = (this->selected_index == item->result); + if (selected) GfxFillRect(full, PC_BLACK); - if (item->masked) { - GfxFillRect(ir.left, y, ir.right, y + item_height - 1, _colour_gradient[colour][5], FILLRECT_CHECKER); - } + item->Draw(full, full.Shrink(WidgetDimensions::scaled.dropdowntext, RectPadding::zero), selected, colour); } y += item_height; } @@ -343,6 +265,7 @@ Dimension GetDropDownListDimension(const DropDownList &list) dim.height += item->Height(); dim.width = std::max(dim.width, item->Width()); } + dim.width += WidgetDimensions::scaled.dropdowntext.Horizontal(); return dim; } diff --git a/src/widgets/dropdown_type.h b/src/widgets/dropdown_type.h index 62a6c30e2b..5f8de71ea0 100644 --- a/src/widgets/dropdown_type.h +++ b/src/widgets/dropdown_type.h @@ -12,61 +12,200 @@ #include "../window_type.h" #include "../gfx_func.h" -#include "table/strings.h" +#include "../gfx_type.h" +#include "../string_func.h" +#include "../strings_func.h" +#include "../table/strings.h" +#include "../window_gui.h" /** - * Base list item class from which others are derived. If placed in a list it - * will appear as a horizontal line in the menu. + * Base list item class from which others are derived. */ class DropDownListItem { public: - int result; ///< Result code to return to window on selection - bool masked; ///< Masked and unselectable item + int result; ///< Result value to return to window on selection. + bool masked; ///< Masked and unselectable item. + bool shaded; ///< Shaded item, affects text colour. - DropDownListItem(int result, bool masked) : result(result), masked(masked) {} + explicit DropDownListItem(int result, bool masked = false, bool shaded = false) : result(result), masked(masked), shaded(shaded) {} virtual ~DropDownListItem() = default; - virtual bool Selectable() const { return false; } - virtual uint Height() const { return GetCharacterHeight(FS_NORMAL); } + virtual bool Selectable() const { return true; } + virtual uint Height() const { return 0; } virtual uint Width() const { return 0; } - virtual void Draw(const Rect &r, bool sel, Colours bg_colour) const; + + virtual void Draw(const Rect &full, const Rect &, bool, Colours bg_colour) const + { + if (this->masked) GfxFillRect(full, _colour_gradient[bg_colour][5], FILLRECT_CHECKER); + } + + TextColour GetColour(bool sel) const + { + if (this->shaded) return (sel ? TC_SILVER : TC_GREY) | TC_NO_SHADE; + return sel ? TC_WHITE : TC_BLACK; + } }; /** - * Common string list item. + * Drop down divider component. + * @tparam TBase Base component. + * @tparam TFs Font size -- used to determine height. */ -class DropDownListStringItem : public DropDownListItem { +template +class DropDownDivider : public TBase { public: - std::string string; ///< String of item + template + explicit DropDownDivider(Args&&... args) : TBase(std::forward(args)...) {} + + bool Selectable() const override { return false; } + uint Height() const override { return std::max(GetCharacterHeight(TFs), this->TBase::Height()); } - DropDownListStringItem(StringID string, int result, bool masked); - DropDownListStringItem(const std::string &string, int result, bool masked); + void Draw(const Rect &full, const Rect &, bool, Colours bg_colour) const override + { + uint8_t c1 = _colour_gradient[bg_colour][3]; + uint8_t c2 = _colour_gradient[bg_colour][7]; - bool Selectable() const override { return true; } - uint Width() const override; - void Draw(const Rect &r, bool sel, Colours bg_colour) const override; - virtual const std::string &String() const { return this->string; } + int mid = CenterBounds(full.top, full.bottom, 0); + GfxFillRect(full.left, mid - WidgetDimensions::scaled.bevel.bottom, full.right, mid - 1, c1); + GfxFillRect(full.left, mid, full.right, mid + WidgetDimensions::scaled.bevel.top - 1, c2); + } +}; - static bool NatSortFunc(std::unique_ptr const &first, std::unique_ptr const &second); +/** + * Drop down string component. + * @tparam TBase Base component. + * @tparam TFs Font size. + * @tparam TEnd Position string at end if true, or start if false. + */ +template +class DropDownString : public TBase { + std::string string; ///< String to be drawn. + Dimension dim; ///< Dimensions of string. +public: + template + explicit DropDownString(StringID string, Args&&... args) : TBase(std::forward(args)...) + { + this->SetString(GetString(string)); + } + + template + explicit DropDownString(const std::string &string, Args&&... args) : TBase(std::forward(args)...) + { + SetDParamStr(0, string); + this->SetString(GetString(STR_JUST_RAW_STRING)); + } + + void SetString(std::string &&string) + { + this->string = std::move(string); + this->dim = GetStringBoundingBox(this->string, TFs); + } + + uint Height() const override + { + return std::max(this->dim.height, this->TBase::Height()); + } + + uint Width() const override { return this->dim.width + this->TBase::Width(); } + + void Draw(const Rect &full, const Rect &r, bool sel, Colours bg_colour) const override + { + bool rtl = TEnd ^ (_current_text_dir == TD_RTL); + DrawStringMultiLine(r.WithWidth(this->dim.width, rtl), this->string, this->GetColour(sel), SA_CENTER, false, TFs); + this->TBase::Draw(full, r.Indent(this->dim.width, rtl), sel, bg_colour); + } + + /** + * Natural sorting comparator function for DropDownList::sort(). + * @param first Left side of comparison. + * @param second Right side of comparison. + * @return true if \a first precedes \a second. + * @warning All items in the list need to be derivates of DropDownListStringItem. + */ + static bool NatSortFunc(std::unique_ptr const &first, std::unique_ptr const &second) + { + const std::string &str1 = static_cast(first.get())->string; + const std::string &str2 = static_cast(second.get())->string; + return StrNaturalCompare(str1, str2) < 0; + } }; /** - * List item with icon and string. + * Drop down icon component. + * @tparam TBase Base component. + * @tparam TEnd Position icon at end if true, or start if false. */ -class DropDownListIconItem : public DropDownListStringItem { - SpriteID sprite; - PaletteID pal; - Dimension dim; - uint sprite_y; +template +class DropDownIcon : public TBase { + SpriteID sprite; ///< Sprite ID to be drawn. + PaletteID palette; ///< Palette ID to use. + Dimension dsprite; ///< Bounding box dimensions of sprite. + Dimension dbounds; ///< Bounding box dimensions of bounds. public: - DropDownListIconItem(SpriteID sprite, PaletteID pal, StringID string, int result, bool masked); + template + explicit DropDownIcon(SpriteID sprite, PaletteID palette, Args&&... args) : TBase(std::forward(args)...), sprite(sprite), palette(palette) + { + this->dsprite = GetSpriteSize(this->sprite); + this->dbounds = this->dsprite; + } + + uint Height() const override { return std::max(this->dbounds.height, this->TBase::Height()); } + uint Width() const override { return this->dbounds.width + WidgetDimensions::scaled.hsep_normal + this->TBase::Width(); } + + void Draw(const Rect &full, const Rect &r, bool sel, Colours bg_colour) const override + { + bool rtl = TEnd ^ (_current_text_dir == TD_RTL); + Rect ir = r.WithWidth(this->dbounds.width, rtl); + DrawSprite(this->sprite, this->palette, CenterBounds(ir.left, ir.right, this->dsprite.width), CenterBounds(r.top, r.bottom, this->dsprite.height)); + this->TBase::Draw(full, r.Indent(this->dbounds.width + WidgetDimensions::scaled.hsep_normal, rtl), sel, bg_colour); + } + + /** + * Override bounding box dimensions of sprite, to allow multiple options to have consistent spacing. + * @param dim New bounding box to assign. + */ + void SetDimension(const Dimension &dim) + { + this->dbounds = dim; + } +}; - uint Height() const override; - uint Width() const override; - void Draw(const Rect &r, bool sel, Colours bg_colour) const override; - void SetDimension(Dimension d); +/** + * Drop down checkmark component. + * @tparam TBase Base component. + * @tparam TFs Font size. + * @tparam TEnd Position checkmark at end if true, or start if false. + */ +template +class DropDownCheck : public TBase { + bool checked; ///< Is item checked. + Dimension dim; ///< Dimension of checkmark. +public: + template + explicit DropDownCheck(bool checked, Args&&... args) : TBase(std::forward(args)...), checked(checked) + { + this->dim = GetStringBoundingBox(STR_JUST_CHECKMARK, TFs); + } + + uint Height() const override { return std::max(this->dim.height, this->TBase::Height()); } + uint Width() const override { return this->dim.width + WidgetDimensions::scaled.hsep_wide + this->TBase::Width(); } + + void Draw(const Rect &full, const Rect &r, bool sel, Colours bg_colour) const override + { + bool rtl = TEnd ^ (_current_text_dir == TD_RTL); + if (this->checked) { + DrawStringMultiLine(r.WithWidth(this->dim.width, rtl), STR_JUST_CHECKMARK, this->GetColour(sel), SA_CENTER, false, TFs); + } + this->TBase::Draw(full, r.Indent(this->dim.width + WidgetDimensions::scaled.hsep_wide, rtl), sel, bg_colour); + } }; +/* Commonly used drop down list items. */ +using DropDownListDividerItem = DropDownDivider; +using DropDownListStringItem = DropDownString; +using DropDownListIconItem = DropDownIcon>; +using DropDownListCheckedItem = DropDownCheck>; + /** * A drop down list is a collection of drop down list items. */ From 8db7c79e79bd6fa5d0720772d3e347019d119bb8 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 25 Nov 2023 19:41:21 +0000 Subject: [PATCH 003/105] Codechange: Add DropDownIcon constructor to override dimension. This avoids the need to construct a DropDownIcon and set the dimension after. --- src/rail_gui.cpp | 4 +--- src/road_gui.cpp | 8 ++------ src/widgets/dropdown_type.h | 15 ++++++--------- 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index 78251ecddd..8a1efbae41 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -2354,9 +2354,7 @@ DropDownList GetRailTypeDropDownList(bool for_replacement, bool all_option) list.push_back(std::make_unique(rti->strings.replace_text, rt, !HasBit(avail_railtypes, rt))); } else { StringID str = rti->max_speed > 0 ? STR_TOOLBAR_RAILTYPE_VELOCITY : STR_JUST_STRING; - auto iconitem = std::make_unique(rti->gui_sprites.build_x_rail, PAL_NONE, str, rt, !HasBit(avail_railtypes, rt)); - iconitem->SetDimension(d); - list.push_back(std::move(iconitem)); + list.push_back(std::make_unique(d, rti->gui_sprites.build_x_rail, PAL_NONE, str, rt, !HasBit(avail_railtypes, rt))); } } diff --git a/src/road_gui.cpp b/src/road_gui.cpp index 7e7bd81b91..0878c5135e 100644 --- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -1828,9 +1828,7 @@ DropDownList GetRoadTypeDropDownList(RoadTramTypes rtts, bool for_replacement, b list.push_back(std::make_unique(rti->strings.replace_text, rt, !HasBit(avail_roadtypes, rt))); } else { StringID str = rti->max_speed > 0 ? STR_TOOLBAR_RAILTYPE_VELOCITY : STR_JUST_STRING; - auto iconitem = std::make_unique(rti->gui_sprites.build_x_road, PAL_NONE, str, rt, !HasBit(avail_roadtypes, rt)); - iconitem->SetDimension(d); - list.push_back(std::move(iconitem)); + list.push_back(std::make_unique(d, rti->gui_sprites.build_x_road, PAL_NONE, str, rt, !HasBit(avail_roadtypes, rt))); } } @@ -1869,9 +1867,7 @@ DropDownList GetScenRoadTypeDropDownList(RoadTramTypes rtts) SetDParam(0, rti->strings.menu_text); SetDParam(1, rti->max_speed / 2); StringID str = rti->max_speed > 0 ? STR_TOOLBAR_RAILTYPE_VELOCITY : STR_JUST_STRING; - auto item = std::make_unique(rti->gui_sprites.build_x_road, PAL_NONE, str, rt, !HasBit(avail_roadtypes, rt)); - item->SetDimension(d); - list.push_back(std::move(item)); + list.push_back(std::make_unique(d, rti->gui_sprites.build_x_road, PAL_NONE, str, rt, !HasBit(avail_roadtypes, rt))); } if (list.empty()) { diff --git a/src/widgets/dropdown_type.h b/src/widgets/dropdown_type.h index 5f8de71ea0..6a60179aac 100644 --- a/src/widgets/dropdown_type.h +++ b/src/widgets/dropdown_type.h @@ -149,6 +149,12 @@ public: this->dbounds = this->dsprite; } + template + explicit DropDownIcon(const Dimension &dim, SpriteID sprite, PaletteID palette, Args&&... args) : TBase(std::forward(args)...), sprite(sprite), palette(palette), dbounds(dim) + { + this->dsprite = GetSpriteSize(this->sprite); + } + uint Height() const override { return std::max(this->dbounds.height, this->TBase::Height()); } uint Width() const override { return this->dbounds.width + WidgetDimensions::scaled.hsep_normal + this->TBase::Width(); } @@ -159,15 +165,6 @@ public: DrawSprite(this->sprite, this->palette, CenterBounds(ir.left, ir.right, this->dsprite.width), CenterBounds(r.top, r.bottom, this->dsprite.height)); this->TBase::Draw(full, r.Indent(this->dbounds.width + WidgetDimensions::scaled.hsep_normal, rtl), sel, bg_colour); } - - /** - * Override bounding box dimensions of sprite, to allow multiple options to have consistent spacing. - * @param dim New bounding box to assign. - */ - void SetDimension(const Dimension &dim) - { - this->dbounds = dim; - } }; /** From 76701c4622cc37b0a5b697ac97b9786986928068 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 25 Nov 2023 20:20:35 +0000 Subject: [PATCH 004/105] Add: Function to get largest cargo icon size. --- src/cargotype.cpp | 16 +++++++++++++++- src/cargotype.h | 1 + 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/cargotype.cpp b/src/cargotype.cpp index 3b72e49647..08c56bc535 100644 --- a/src/cargotype.cpp +++ b/src/cargotype.cpp @@ -9,6 +9,7 @@ #include "stdafx.h" #include "cargotype.h" +#include "core/geometry_func.hpp" #include "newgrf_cargo.h" #include "string_func.h" #include "strings_func.h" @@ -70,6 +71,19 @@ void SetupCargoForClimate(LandscapeID l) std::fill(insert, std::end(CargoSpec::array), CargoSpec{}); } +/** + * Get dimensions of largest cargo icon. + * @return Dimensions of largest cargo icon. + */ +Dimension GetLargestCargoIconSize() +{ + Dimension size = {0, 0}; + for (const CargoSpec *cs : _sorted_cargo_specs) { + size = maxdim(size, GetSpriteSize(cs->GetCargoIcon())); + } + return size; +} + /** * Get the cargo ID of a default cargo, if present. * @param l Landscape @@ -179,7 +193,7 @@ static bool CargoSpecClassSorter(const CargoSpec * const &a, const CargoSpec * c void InitializeSortedCargoSpecs() { _sorted_cargo_specs.clear(); - /* Add each cargo spec to the list. */ + /* Add each cargo spec to the list, and determine the largest cargo icon size. */ for (const CargoSpec *cargo : CargoSpec::Iterate()) { _sorted_cargo_specs.push_back(cargo); } diff --git a/src/cargotype.h b/src/cargotype.h index 7b3674675f..0e786011a2 100644 --- a/src/cargotype.h +++ b/src/cargotype.h @@ -185,6 +185,7 @@ void SetupCargoForClimate(LandscapeID l); CargoID GetCargoIDByLabel(CargoLabel cl); CargoID GetCargoIDByBitnum(uint8_t bitnum); CargoID GetDefaultCargoID(LandscapeID l, CargoType ct); +Dimension GetLargestCargoIconSize(); void InitializeSortedCargoSpecs(); extern std::array _sorted_cargo_types; From 1aedea8eda5b0b26b07f8b0a1b9df220a487282c Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 15 Nov 2023 01:33:50 +0000 Subject: [PATCH 005/105] Feature: Place cargo icon on cargo filter dropdowns. Reveal the pixel art. --- src/build_vehicle_gui.cpp | 3 ++- src/industry_gui.cpp | 6 ++++-- src/vehicle_gui.cpp | 3 ++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index 48fc622dc2..d26accbd6b 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -1579,8 +1579,9 @@ struct BuildVehicleWindow : Window { } /* Add cargos */ + Dimension d = GetLargestCargoIconSize(); for (const CargoSpec *cs : _sorted_standard_cargo_specs) { - list.push_back(std::make_unique(cs->name, cs->Index(), false)); + list.push_back(std::make_unique(d, cs->GetCargoIcon(), PAL_NONE, cs->name, cs->Index(), false)); } return list; diff --git a/src/industry_gui.cpp b/src/industry_gui.cpp index 328824f0df..530b1a37fb 100644 --- a/src/industry_gui.cpp +++ b/src/industry_gui.cpp @@ -1753,8 +1753,9 @@ public: list.push_back(std::make_unique(this->GetCargoFilterLabel(CF_NONE), CF_NONE, false)); /* Add cargos */ + Dimension d = GetLargestCargoIconSize(); for (const CargoSpec *cs : _sorted_standard_cargo_specs) { - list.push_back(std::make_unique(cs->name, cs->Index(), false)); + list.push_back(std::make_unique(d, cs->GetCargoIcon(), PAL_NONE, cs->name, cs->Index(), false)); } return list; @@ -3088,8 +3089,9 @@ struct IndustryCargoesWindow : public Window { case WID_IC_CARGO_DROPDOWN: { DropDownList lst; + Dimension d = GetLargestCargoIconSize(); for (const CargoSpec *cs : _sorted_standard_cargo_specs) { - lst.push_back(std::make_unique(cs->name, cs->Index(), false)); + lst.push_back(std::make_unique(d, cs->GetCargoIcon(), PAL_NONE, cs->name, cs->Index(), false)); } if (!lst.empty()) { int selected = (this->ind_cargo >= NUM_INDUSTRYTYPES) ? (int)(this->ind_cargo - NUM_INDUSTRYTYPES) : -1; diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index dff391c8a9..51c2c67462 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -383,8 +383,9 @@ DropDownList BaseVehicleListWindow::BuildCargoDropDownList() const list.push_back(std::make_unique(this->GetCargoFilterLabel(CF_NONE), CF_NONE, false)); /* Add cargos */ + Dimension d = GetLargestCargoIconSize(); for (const CargoSpec *cs : _sorted_cargo_specs) { - list.push_back(std::make_unique(cs->name, cs->Index(), false)); + list.push_back(std::make_unique(d, cs->GetCargoIcon(), PAL_NONE, cs->name, cs->Index(), false)); } return list; From a258833aeece66ad5904a110e49a5decebf34e66 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 2 Dec 2023 21:46:43 +0000 Subject: [PATCH 006/105] Fix 67d071d: WC_STATION_LIST should be invalidated by owner, not station index. (#11530) --- src/economy.cpp | 4 ++-- src/station_cmd.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/economy.cpp b/src/economy.cpp index 53bd70c6a8..d168381465 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -1933,8 +1933,8 @@ static void LoadUnloadVehicle(Vehicle *front) } if (dirty_station) { st->MarkTilesDirty(true); - SetWindowDirty(WC_STATION_VIEW, last_visited); - InvalidateWindowData(WC_STATION_LIST, last_visited); + SetWindowDirty(WC_STATION_VIEW, st->index); + InvalidateWindowData(WC_STATION_LIST, st->owner); } } diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 784b4bac37..0444a3feed 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -4055,7 +4055,7 @@ static uint UpdateStationWaiting(Station *st, CargoID type, uint amount, SourceT if (lg != nullptr) (*lg)[ge.node].UpdateSupply(amount); if (!ge.HasRating()) { - InvalidateWindowData(WC_STATION_LIST, st->index); + InvalidateWindowData(WC_STATION_LIST, st->owner); SetBit(ge.status, GoodsEntry::GES_RATING); } From b866e52b17270bdc197077418b432d65c625a013 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sat, 2 Dec 2023 23:12:50 +0100 Subject: [PATCH 007/105] Remove: officially mark Vista as no longer supported (#11531) It is very likely Vista hasn't been working for years, but the amount of users that use an OS that has been EoL for over 11 years is very small, so reports happen rarely. --- docs/directory_structure.md | 4 ++-- os/windows/openttd.manifest | 2 -- src/sound/win32_s.cpp | 2 +- src/video/win32_v.cpp | 2 +- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/docs/directory_structure.md b/docs/directory_structure.md index c8b5c6a9d4..72a62eee42 100644 --- a/docs/directory_structure.md +++ b/docs/directory_structure.md @@ -19,14 +19,14 @@ your operating system: - Windows: - `C:\My Documents\OpenTTD` (95, 98, ME) - `C:\Documents and Settings\\My Documents\OpenTTD` (2000, XP) - - `C:\Users\\Documents\OpenTTD` (Vista, 7, 8.1, 10, 11) + - `C:\Users\\Documents\OpenTTD` (7, 8.1, 10, 11) - macOS: `~/Documents/OpenTTD` - Linux: `$XDG_DATA_HOME/openttd` which is usually `~/.local/share/openttd` when built with XDG base directory support, otherwise `~/.openttd` 3. The shared directory - Windows: - `C:\Documents and Settings\All Users\Shared Documents\OpenTTD` (2000, XP) - - `C:\Users\Public\Documents\OpenTTD` (Vista, 7, 8.1, 10, 11) + - `C:\Users\Public\Documents\OpenTTD` (7, 8.1, 10, 11) - macOS: `/Library/Application Support/OpenTTD` - Linux: not available 4. The binary directory (where the OpenTTD executable is) diff --git a/os/windows/openttd.manifest b/os/windows/openttd.manifest index cb536a819d..21fee42174 100644 --- a/os/windows/openttd.manifest +++ b/os/windows/openttd.manifest @@ -15,8 +15,6 @@ - - diff --git a/src/sound/win32_s.cpp b/src/sound/win32_s.cpp index b7220b7786..f50346e88c 100644 --- a/src/sound/win32_s.cpp +++ b/src/sound/win32_s.cpp @@ -70,7 +70,7 @@ const char *SoundDriver_Win32::Start(const StringList &parm) wfex.nAvgBytesPerSec = wfex.nSamplesPerSec * wfex.nBlockAlign; /* Limit buffer size to prevent overflows. */ - _bufsize = GetDriverParamInt(parm, "bufsize", IsWindowsVistaOrGreater() ? 8192 : 4096); + _bufsize = GetDriverParamInt(parm, "bufsize", 8192); _bufsize = std::min(_bufsize, UINT16_MAX); try { diff --git a/src/video/win32_v.cpp b/src/video/win32_v.cpp index 0293cd9b64..cf7a909451 100644 --- a/src/video/win32_v.cpp +++ b/src/video/win32_v.cpp @@ -1258,7 +1258,7 @@ static const char *SelectPixelFormat(HDC dc) 0, 0, 0, 0 // Ignored/reserved. }; - if (IsWindowsVistaOrGreater()) pfd.dwFlags |= PFD_SUPPORT_COMPOSITION; // Make OpenTTD compatible with Aero. + pfd.dwFlags |= PFD_SUPPORT_COMPOSITION; // Make OpenTTD compatible with Aero. /* Choose a suitable pixel format. */ int format = ChoosePixelFormat(dc, &pfd); From 9a92e02fa725a029fd7970dceb25f6b4e915d0b4 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 3 Dec 2023 16:54:57 +0000 Subject: [PATCH 008/105] Change: Add tooltips for text file buttons, and shorten Website / Readme buttons. (#11534) --- src/ai/ai_gui.cpp | 6 +++--- src/game/game_gui.cpp | 6 +++--- src/lang/english.txt | 7 +++++-- src/network/network_content_gui.cpp | 6 +++--- src/newgrf_gui.cpp | 6 +++--- src/settings_gui.cpp | 18 +++++++++--------- 6 files changed, 26 insertions(+), 23 deletions(-) diff --git a/src/ai/ai_gui.cpp b/src/ai/ai_gui.cpp index c49e1e497b..d465fcda8e 100644 --- a/src/ai/ai_gui.cpp +++ b/src/ai/ai_gui.cpp @@ -64,12 +64,12 @@ static const NWidgetPart _nested_ai_config_widgets[] = { NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CHANGE), SetFill(1, 1), SetMinimalSize(93, 0), SetDataTip(STR_AI_CONFIG_CHANGE_AI, STR_AI_CONFIG_CHANGE_TOOLTIP), NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CONFIGURE), SetFill(1, 1), SetMinimalSize(93, 0), SetDataTip(STR_AI_CONFIG_CONFIGURE, STR_AI_CONFIG_CONFIGURE_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_README), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_NULL), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_README), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_TEXTFILE_VIEW_README_TOOLTIP), EndContainer(), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CLOSE), SetFill(1, 1), SetMinimalSize(93, 0), SetDataTip(STR_AI_SETTINGS_CLOSE, STR_NULL), - NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_CHANGELOG), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_NULL), - NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_LICENSE), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_NULL), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_CHANGELOG), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_LICENSE), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_TEXTFILE_VIEW_LICENCE_TOOLTIP), EndContainer(), NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CONTENT_DOWNLOAD), SetFill(1, 1), SetMinimalSize(279, 0), SetDataTip(STR_INTRO_ONLINE_CONTENT, STR_INTRO_TOOLTIP_ONLINE_CONTENT), EndContainer(), diff --git a/src/game/game_gui.cpp b/src/game/game_gui.cpp index 0994d7def5..3c1ac7d631 100644 --- a/src/game/game_gui.cpp +++ b/src/game/game_gui.cpp @@ -50,11 +50,11 @@ static const NWidgetPart _nested_gs_config_widgets[] = { NWidget(NWID_VERTICAL, NC_EQUALSIZE), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_CHANGE), SetFill(1, 1), SetResize(1, 0), SetMinimalSize(93, 0), SetDataTip(STR_AI_CONFIG_CHANGE_GAMESCRIPT, STR_AI_CONFIG_CHANGE_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_TEXTFILE + TFT_README), SetFill(1, 1), SetResize(1, 0), SetMinimalSize(93, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_NULL), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_TEXTFILE + TFT_README), SetFill(1, 1), SetResize(1, 0), SetMinimalSize(93, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_TEXTFILE_VIEW_README_TOOLTIP), EndContainer(), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), - NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_TEXTFILE + TFT_CHANGELOG), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_NULL), - NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_TEXTFILE + TFT_LICENSE), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_NULL), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_TEXTFILE + TFT_CHANGELOG), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_TEXTFILE + TFT_LICENSE), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_TEXTFILE_VIEW_LICENCE_TOOLTIP), EndContainer(), NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_CONTENT_DOWNLOAD), SetFill(1, 1), SetResize(1, 0), SetMinimalSize(279, 0), SetDataTip(STR_INTRO_ONLINE_CONTENT, STR_INTRO_TOOLTIP_ONLINE_CONTENT), EndContainer(), diff --git a/src/lang/english.txt b/src/lang/english.txt index 900aed9915..eb32935468 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -2581,7 +2581,7 @@ STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}Search c STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}You are leaving OpenTTD! STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}The terms and conditions for downloading content from external websites vary.{}You will have to refer to the external sites for instructions how to install the content into OpenTTD.{}Do you want to continue? STR_CONTENT_FILTER_TITLE :{BLACK}Tag/name filter: -STR_CONTENT_OPEN_URL :{BLACK}Visit website +STR_CONTENT_OPEN_URL :{BLACK}Website STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}Visit the website for this content STR_CONTENT_DOWNLOAD_CAPTION :{BLACK}Download STR_CONTENT_DOWNLOAD_CAPTION_TOOLTIP :{BLACK}Start downloading the selected content @@ -4707,9 +4707,12 @@ STR_TEXTFILE_NAVBACK_TOOLTIP :{BLACK}Go back STR_TEXTFILE_NAVFORWARD_TOOLTIP :{BLACK}Return forward in navigation history STR_TEXTFILE_WRAP_TEXT :{WHITE}Wrap text STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Wrap the text of the window so it all fits without having to scroll -STR_TEXTFILE_VIEW_README :{BLACK}View readme +STR_TEXTFILE_VIEW_README :{BLACK}Readme +STR_TEXTFILE_VIEW_README_TOOLTIP :View readme for this content STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Changelog +STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP :View changelog for this content STR_TEXTFILE_VIEW_LICENCE :{BLACK}Licence +STR_TEXTFILE_VIEW_LICENCE_TOOLTIP :View licence for this content ###length 5 STR_TEXTFILE_README_CAPTION :{WHITE}{STRING} readme of {RAW_STRING} STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING} changelog of {RAW_STRING} diff --git a/src/network/network_content_gui.cpp b/src/network/network_content_gui.cpp index 9eb5b212ed..5b18c88f0f 100644 --- a/src/network/network_content_gui.cpp +++ b/src/network/network_content_gui.cpp @@ -1079,12 +1079,12 @@ static const NWidgetPart _nested_network_content_list_widgets[] = { NWidget(WWT_PANEL, COLOUR_LIGHT_BLUE, WID_NCL_DETAILS), SetResize(1, 1), SetFill(1, 1), EndContainer(), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0), - NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCL_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_NULL), - NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCL_TEXTFILE + TFT_CHANGELOG), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_NULL), + NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCL_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_TEXTFILE_VIEW_README_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCL_TEXTFILE + TFT_CHANGELOG), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP), EndContainer(), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0), NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCL_OPEN_URL), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_CONTENT_OPEN_URL, STR_CONTENT_OPEN_URL_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCL_TEXTFILE + TFT_LICENSE), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_NULL), + NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCL_TEXTFILE + TFT_LICENSE), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_TEXTFILE_VIEW_LICENCE_TOOLTIP), EndContainer(), EndContainer(), EndContainer(), diff --git a/src/newgrf_gui.cpp b/src/newgrf_gui.cpp index 1a5b32c2dc..98af692f57 100644 --- a/src/newgrf_gui.cpp +++ b/src/newgrf_gui.cpp @@ -1907,12 +1907,12 @@ static const NWidgetPart _nested_newgrf_infopanel_widgets[] = { NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_NS_OPEN_URL), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_CONTENT_OPEN_URL, STR_CONTENT_OPEN_URL_TOOLTIP), NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_NS_NEWGRF_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), - SetDataTip(STR_TEXTFILE_VIEW_README, STR_NULL), + SetDataTip(STR_TEXTFILE_VIEW_README, STR_TEXTFILE_VIEW_README_TOOLTIP), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_NS_NEWGRF_TEXTFILE + TFT_CHANGELOG), SetFill(1, 0), SetResize(1, 0), - SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_NULL), + SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP), NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_NS_NEWGRF_TEXTFILE + TFT_LICENSE), SetFill(1, 0), SetResize(1, 0), - SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_NULL), + SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_TEXTFILE_VIEW_LICENCE_TOOLTIP), EndContainer(), EndContainer(), diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 5484d15acd..1f3ff097e5 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -823,9 +823,9 @@ static const NWidgetPart _nested_game_options_widgets[] = { EndContainer(), NWidget(WWT_TEXT, COLOUR_GREY, WID_GO_BASE_GRF_DESCRIPTION), SetMinimalSize(200, 0), SetDataTip(STR_EMPTY, STR_GAME_OPTIONS_BASE_GRF_DESCRIPTION_TOOLTIP), SetFill(1, 0), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_GRF_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_NULL), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_GRF_TEXTFILE + TFT_CHANGELOG), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_NULL), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_GRF_TEXTFILE + TFT_LICENSE), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_NULL), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_GRF_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_TEXTFILE_VIEW_README_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_GRF_TEXTFILE + TFT_CHANGELOG), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_GRF_TEXTFILE + TFT_LICENSE), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_TEXTFILE_VIEW_LICENCE_TOOLTIP), EndContainer(), EndContainer(), EndContainer(), @@ -847,9 +847,9 @@ static const NWidgetPart _nested_game_options_widgets[] = { NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GO_BASE_SFX_DROPDOWN), SetMinimalSize(100, 12), SetDataTip(STR_JUST_RAW_STRING, STR_GAME_OPTIONS_BASE_SFX_TOOLTIP), SetFill(1, 0), NWidget(WWT_EMPTY, INVALID_COLOUR, WID_GO_BASE_SFX_DESCRIPTION), SetMinimalSize(200, 0), SetMinimalTextLines(1, 0), SetDataTip(STR_NULL, STR_GAME_OPTIONS_BASE_SFX_DESCRIPTION_TOOLTIP), SetFill(1, 0), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_SFX_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_NULL), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_SFX_TEXTFILE + TFT_CHANGELOG), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_NULL), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_SFX_TEXTFILE + TFT_LICENSE), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_NULL), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_SFX_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_TEXTFILE_VIEW_README_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_SFX_TEXTFILE + TFT_CHANGELOG), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_SFX_TEXTFILE + TFT_LICENSE), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_TEXTFILE_VIEW_LICENCE_TOOLTIP), EndContainer(), EndContainer(), @@ -862,9 +862,9 @@ static const NWidgetPart _nested_game_options_widgets[] = { EndContainer(), EndContainer(), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_MUSIC_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_NULL), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_MUSIC_TEXTFILE + TFT_CHANGELOG), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_NULL), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_MUSIC_TEXTFILE + TFT_LICENSE), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_NULL), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_MUSIC_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_TEXTFILE_VIEW_README_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_MUSIC_TEXTFILE + TFT_CHANGELOG), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_MUSIC_TEXTFILE + TFT_LICENSE), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_TEXTFILE_VIEW_LICENCE_TOOLTIP), EndContainer(), EndContainer(), EndContainer(), From 7ba89b946e66ea8b2d7bc17c490c328d5be5f131 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 3 Dec 2023 18:11:08 +0000 Subject: [PATCH 009/105] Change: Hide unused cargos from vehicle cargo filter. (#11533) The list of used cargo types is updated when the list is invalidated. --- src/group_gui.cpp | 4 ++-- src/vehicle_gui.cpp | 22 ++++++++++++++++++---- src/vehicle_gui_base.h | 3 ++- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/group_gui.cpp b/src/group_gui.cpp index 929e01509b..7d89d6afd0 100644 --- a/src/group_gui.cpp +++ b/src/group_gui.cpp @@ -424,7 +424,7 @@ public: break; case WID_GL_FILTER_BY_CARGO: - size->width = std::max(size->width, GetDropDownListDimension(this->BuildCargoDropDownList()).width + padding.width); + size->width = std::max(size->width, GetDropDownListDimension(this->BuildCargoDropDownList(true)).width + padding.width); break; case WID_GL_MANAGE_VEHICLES_DROPDOWN: { @@ -665,7 +665,7 @@ public: return; case WID_GL_FILTER_BY_CARGO: // Select filtering criteria dropdown menu - ShowDropDownList(this, this->BuildCargoDropDownList(), this->cargo_filter_criteria, widget); + ShowDropDownList(this, this->BuildCargoDropDownList(false), this->cargo_filter_criteria, widget); break; case WID_GL_ALL_VEHICLES: // All vehicles button diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 51c2c67462..29fa4cd641 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -191,6 +191,14 @@ void BaseVehicleListWindow::BuildVehicleList() GenerateVehicleSortList(&this->vehicles, this->vli); + CargoTypes used = 0; + for (const Vehicle *v : this->vehicles) { + for (const Vehicle *u = v; u != nullptr; u = u->Next()) { + if (u->cargo_cap > 0) SetBit(used, u->cargo_type); + } + } + this->used_cargoes = used; + if (this->grouping == GB_NONE) { uint max_unitnumber = 0; for (auto it = this->vehicles.begin(); it != this->vehicles.end(); ++it) { @@ -371,7 +379,12 @@ StringID BaseVehicleListWindow::GetCargoFilterLabel(CargoID cid) const } } -DropDownList BaseVehicleListWindow::BuildCargoDropDownList() const +/** + * Build drop down list for cargo filter selection. + * @param full If true, build list with all cargo types, instead of only used cargo types. + * @return Drop down list for cargo filter. + */ +DropDownList BaseVehicleListWindow::BuildCargoDropDownList(bool full) const { DropDownList list; @@ -385,7 +398,8 @@ DropDownList BaseVehicleListWindow::BuildCargoDropDownList() const /* Add cargos */ Dimension d = GetLargestCargoIconSize(); for (const CargoSpec *cs : _sorted_cargo_specs) { - list.push_back(std::make_unique(d, cs->GetCargoIcon(), PAL_NONE, cs->name, cs->Index(), false)); + if (!full && !HasBit(this->used_cargoes, cs->Index())) continue; + list.push_back(std::make_unique(d, cs->GetCargoIcon(), PAL_NONE, cs->name, cs->Index(), false, !HasBit(this->used_cargoes, cs->Index()))); } return list; @@ -1877,7 +1891,7 @@ public: break; case WID_VL_FILTER_BY_CARGO: - size->width = std::max(size->width, GetDropDownListDimension(this->BuildCargoDropDownList()).width + padding.width); + size->width = std::max(size->width, GetDropDownListDimension(this->BuildCargoDropDownList(true)).width + padding.width); break; case WID_VL_MANAGE_VEHICLES_DROPDOWN: { @@ -2007,7 +2021,7 @@ public: return; case WID_VL_FILTER_BY_CARGO: // Cargo filter dropdown - ShowDropDownList(this, this->BuildCargoDropDownList(), this->cargo_filter_criteria, widget); + ShowDropDownList(this, this->BuildCargoDropDownList(false), this->cargo_filter_criteria, widget); break; case WID_VL_LIST: { // Matrix to show vehicles diff --git a/src/vehicle_gui_base.h b/src/vehicle_gui_base.h index 3a54805c2c..a20bbd802c 100644 --- a/src/vehicle_gui_base.h +++ b/src/vehicle_gui_base.h @@ -90,6 +90,7 @@ struct BaseVehicleListWindow : public Window { VehicleID vehicle_sel; ///< Selected vehicle CargoID cargo_filter_criteria; ///< Selected cargo filter index uint order_arrow_width; ///< Width of the arrow in the small order list. + CargoTypes used_cargoes; typedef GUIVehicleGroupList::SortFunction VehicleGroupSortFunction; typedef GUIVehicleList::SortFunction VehicleIndividualSortFunction; @@ -124,7 +125,7 @@ struct BaseVehicleListWindow : public Window { void SetCargoFilterArray(); void FilterVehicleList(); StringID GetCargoFilterLabel(CargoID cid) const; - DropDownList BuildCargoDropDownList() const; + DropDownList BuildCargoDropDownList(bool full) const; Dimension GetActionDropdownSize(bool show_autoreplace, bool show_group, bool show_create); DropDownList BuildActionDropdownList(bool show_autoreplace, bool show_group, bool show_create); From f60c14a682a7ac1f92166cc8e8dfe9ed630ad76f Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 28 Nov 2023 20:49:16 +0000 Subject: [PATCH 010/105] Add: Website button for AI settings window. --- src/ai/ai_gui.cpp | 44 +++++++++++++++++++++++++---------------- src/widgets/ai_widget.h | 2 +- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/ai/ai_gui.cpp b/src/ai/ai_gui.cpp index d465fcda8e..31dd2d1b4f 100644 --- a/src/ai/ai_gui.cpp +++ b/src/ai/ai_gui.cpp @@ -54,24 +54,28 @@ static const NWidgetPart _nested_ai_config_widgets[] = { NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_MOVE_DOWN), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_AI_CONFIG_MOVE_DOWN, STR_AI_CONFIG_MOVE_DOWN_TOOLTIP), EndContainer(), EndContainer(), - NWidget(WWT_FRAME, COLOUR_MAUVE), SetDataTip(STR_AI_CONFIG_AI, STR_NULL), + NWidget(WWT_FRAME, COLOUR_MAUVE), SetDataTip(STR_AI_CONFIG_AI, STR_NULL), SetPIP(0, WidgetDimensions::unscaled.vsep_sparse, 0), NWidget(NWID_HORIZONTAL), NWidget(WWT_MATRIX, COLOUR_MAUVE, WID_AIC_LIST), SetMinimalSize(288, 112), SetFill(1, 0), SetMatrixDataTip(1, 8, STR_AI_CONFIG_AILIST_TOOLTIP), SetScrollbar(WID_AIC_SCROLLBAR), NWidget(NWID_VSCROLLBAR, COLOUR_MAUVE, WID_AIC_SCROLLBAR), EndContainer(), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CONFIGURE), SetFill(1, 0), SetDataTip(STR_AI_CONFIG_CONFIGURE, STR_AI_CONFIG_CONFIGURE_TOOLTIP), EndContainer(), - NWidget(NWID_VERTICAL, NC_EQUALSIZE), - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), - NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CHANGE), SetFill(1, 1), SetMinimalSize(93, 0), SetDataTip(STR_AI_CONFIG_CHANGE_AI, STR_AI_CONFIG_CHANGE_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CONFIGURE), SetFill(1, 1), SetMinimalSize(93, 0), SetDataTip(STR_AI_CONFIG_CONFIGURE, STR_AI_CONFIG_CONFIGURE_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_README), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_TEXTFILE_VIEW_README_TOOLTIP), + NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0), + NWidget(NWID_VERTICAL, NC_EQUALSIZE), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CHANGE), SetFill(1, 1), SetDataTip(STR_AI_CONFIG_CHANGE_AI, STR_AI_CONFIG_CHANGE_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CONTENT_DOWNLOAD), SetFill(1, 1), SetDataTip(STR_INTRO_ONLINE_CONTENT, STR_INTRO_TOOLTIP_ONLINE_CONTENT), EndContainer(), - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), - NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CLOSE), SetFill(1, 1), SetMinimalSize(93, 0), SetDataTip(STR_AI_SETTINGS_CLOSE, STR_NULL), - NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_CHANGELOG), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_LICENSE), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_TEXTFILE_VIEW_LICENCE_TOOLTIP), + NWidget(NWID_VERTICAL, NC_EQUALSIZE), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_OPEN_URL), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_CONTENT_OPEN_URL, STR_CONTENT_OPEN_URL_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_README), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_TEXTFILE_VIEW_README_TOOLTIP), + EndContainer(), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_CHANGELOG), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_LICENSE), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_TEXTFILE_VIEW_LICENCE_TOOLTIP), + EndContainer(), EndContainer(), - NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CONTENT_DOWNLOAD), SetFill(1, 1), SetMinimalSize(279, 0), SetDataTip(STR_INTRO_ONLINE_CONTENT, STR_INTRO_TOOLTIP_ONLINE_CONTENT), EndContainer(), EndContainer(), EndContainer(), @@ -247,6 +251,13 @@ struct AIConfigWindow : public Window { } break; + case WID_AIC_OPEN_URL: { + const AIConfig *config = AIConfig::GetConfig(this->selected_slot); + if (this->selected_slot == INVALID_COMPANY || config == nullptr || config->GetInfo() == nullptr) return; + OpenBrowser(config->GetInfo()->GetURL()); + break; + } + case WID_AIC_CHANGE: // choose other AI ShowScriptListWindow((CompanyID)this->selected_slot, _ctrl_pressed); break; @@ -255,10 +266,6 @@ struct AIConfigWindow : public Window { ShowScriptSettingsWindow((CompanyID)this->selected_slot); break; - case WID_AIC_CLOSE: - this->Close(); - break; - case WID_AIC_CONTENT_DOWNLOAD: if (!_network_available) { ShowErrorMessage(STR_NETWORK_ERROR_NOTAVAILABLE, INVALID_STRING_ID, WL_ERROR); @@ -282,17 +289,20 @@ struct AIConfigWindow : public Window { if (!gui_scope) return; + AIConfig *config = AIConfig::GetConfig(this->selected_slot); + this->SetWidgetDisabledState(WID_AIC_DECREASE_NUMBER, GetGameSettings().difficulty.max_no_competitors == 0); this->SetWidgetDisabledState(WID_AIC_INCREASE_NUMBER, GetGameSettings().difficulty.max_no_competitors == MAX_COMPANIES - 1); this->SetWidgetDisabledState(WID_AIC_DECREASE_INTERVAL, GetGameSettings().difficulty.competitors_interval == MIN_COMPETITORS_INTERVAL); this->SetWidgetDisabledState(WID_AIC_INCREASE_INTERVAL, GetGameSettings().difficulty.competitors_interval == MAX_COMPETITORS_INTERVAL); this->SetWidgetDisabledState(WID_AIC_CHANGE, this->selected_slot == INVALID_COMPANY); - this->SetWidgetDisabledState(WID_AIC_CONFIGURE, this->selected_slot == INVALID_COMPANY || AIConfig::GetConfig(this->selected_slot)->GetConfigList()->empty()); + this->SetWidgetDisabledState(WID_AIC_CONFIGURE, this->selected_slot == INVALID_COMPANY || config->GetConfigList()->empty()); 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))); + this->SetWidgetDisabledState(WID_AIC_OPEN_URL, this->selected_slot == INVALID_COMPANY || config->GetInfo() == nullptr || config->GetInfo()->GetURL().empty()); for (TextfileType tft = TFT_CONTENT_BEGIN; tft < TFT_CONTENT_END; tft++) { - this->SetWidgetDisabledState(WID_AIC_TEXTFILE + tft, this->selected_slot == INVALID_COMPANY || !AIConfig::GetConfig(this->selected_slot)->GetTextfile(tft, this->selected_slot).has_value()); + this->SetWidgetDisabledState(WID_AIC_TEXTFILE + tft, this->selected_slot == INVALID_COMPANY || !config->GetTextfile(tft, this->selected_slot).has_value()); } } }; diff --git a/src/widgets/ai_widget.h b/src/widgets/ai_widget.h index 3753941609..964026ff79 100644 --- a/src/widgets/ai_widget.h +++ b/src/widgets/ai_widget.h @@ -27,7 +27,7 @@ enum AIConfigWidgets { WID_AIC_MOVE_DOWN, ///< Move down button. WID_AIC_CHANGE, ///< Select another AI button. WID_AIC_CONFIGURE, ///< Change AI settings button. - WID_AIC_CLOSE, ///< Close window button. + WID_AIC_OPEN_URL, ///< Open AI URL. WID_AIC_TEXTFILE, ///< Open AI readme, changelog (+1) or license (+2). WID_AIC_CONTENT_DOWNLOAD = WID_AIC_TEXTFILE + TFT_CONTENT_END, ///< Download content button. }; From 2272e8fe0e846d153d69e8f234abea7e792ecab4 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 28 Nov 2023 20:49:48 +0000 Subject: [PATCH 011/105] Add: Website button for Game Script settings window. --- src/game/game_gui.cpp | 46 +++++++++++++++++++++++---------------- src/widgets/game_widget.h | 2 +- 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/game/game_gui.cpp b/src/game/game_gui.cpp index 3c1ac7d631..037e6591e8 100644 --- a/src/game/game_gui.cpp +++ b/src/game/game_gui.cpp @@ -37,35 +37,38 @@ static const NWidgetPart _nested_gs_config_widgets[] = { NWidget(WWT_DEFSIZEBOX, COLOUR_MAUVE), EndContainer(), NWidget(WWT_PANEL, COLOUR_MAUVE, WID_GSC_BACKGROUND), - NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_wide, 0), SetPadding(WidgetDimensions::unscaled.sparse), + NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_wide, 0), SetPadding(WidgetDimensions::unscaled.sparse_resize), NWidget(WWT_FRAME, COLOUR_MAUVE), SetDataTip(STR_AI_CONFIG_GAMESCRIPT, STR_NULL), SetFill(1, 0), SetResize(1, 0), NWidget(WWT_MATRIX, COLOUR_MAUVE, WID_GSC_GSLIST), SetMinimalSize(288, 14), SetFill(1, 1), SetResize(1, 0), SetMatrixDataTip(1, 1, STR_AI_CONFIG_GAMELIST_TOOLTIP), EndContainer(), - NWidget(WWT_FRAME, COLOUR_MAUVE), SetDataTip(STR_AI_CONFIG_GAMESCRIPT_PARAM, STR_NULL), SetFill(1, 1), SetResize(1, 0), + NWidget(WWT_FRAME, COLOUR_MAUVE), SetDataTip(STR_AI_CONFIG_GAMESCRIPT_PARAM, STR_NULL), SetFill(1, 1), SetResize(1, 0), SetPIP(0, WidgetDimensions::unscaled.vsep_sparse, 0), NWidget(NWID_HORIZONTAL), NWidget(WWT_MATRIX, COLOUR_MAUVE, WID_GSC_SETTINGS), SetFill(1, 0), SetResize(1, 1), SetMinimalSize(188, 182), SetMatrixDataTip(1, 0, STR_NULL), SetScrollbar(WID_GSC_SCROLLBAR), NWidget(NWID_VSCROLLBAR, COLOUR_MAUVE, WID_GSC_SCROLLBAR), EndContainer(), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_RESET), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_AI_SETTINGS_RESET, STR_NULL), EndContainer(), - NWidget(NWID_VERTICAL, NC_EQUALSIZE), - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), - NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_CHANGE), SetFill(1, 1), SetResize(1, 0), SetMinimalSize(93, 0), SetDataTip(STR_AI_CONFIG_CHANGE_GAMESCRIPT, STR_AI_CONFIG_CHANGE_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_TEXTFILE + TFT_README), SetFill(1, 1), SetResize(1, 0), SetMinimalSize(93, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_TEXTFILE_VIEW_README_TOOLTIP), + NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0), + NWidget(NWID_VERTICAL, NC_EQUALSIZE), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_CHANGE), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_AI_CONFIG_CHANGE_GAMESCRIPT, STR_AI_CONFIG_CHANGE_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_CONTENT_DOWNLOAD), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_INTRO_ONLINE_CONTENT, STR_INTRO_TOOLTIP_ONLINE_CONTENT), EndContainer(), - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), - NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_TEXTFILE + TFT_CHANGELOG), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_TEXTFILE + TFT_LICENSE), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_TEXTFILE_VIEW_LICENCE_TOOLTIP), + NWidget(NWID_VERTICAL, NC_EQUALSIZE), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_OPEN_URL), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_CONTENT_OPEN_URL, STR_CONTENT_OPEN_URL_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_TEXTFILE + TFT_README), SetFill(1, 1), SetResize(1, 0), SetMinimalSize(93, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_TEXTFILE_VIEW_README_TOOLTIP), + EndContainer(), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_TEXTFILE + TFT_CHANGELOG), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_TEXTFILE + TFT_LICENSE), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_TEXTFILE_VIEW_LICENCE_TOOLTIP), + EndContainer(), EndContainer(), - NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_CONTENT_DOWNLOAD), SetFill(1, 1), SetResize(1, 0), SetMinimalSize(279, 0), SetDataTip(STR_INTRO_ONLINE_CONTENT, STR_INTRO_TOOLTIP_ONLINE_CONTENT), EndContainer(), EndContainer(), - EndContainer(), - NWidget(NWID_HORIZONTAL), - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), - NWidget(WWT_PUSHTXTBTN, COLOUR_MAUVE, WID_GSC_ACCEPT), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_AI_SETTINGS_CLOSE, STR_NULL), - NWidget(WWT_PUSHTXTBTN, COLOUR_MAUVE, WID_GSC_RESET), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_AI_SETTINGS_RESET, STR_NULL), + NWidget(NWID_HORIZONTAL), + NWidget(NWID_SPACER), SetFill(1, 0), SetResize(1, 0), + NWidget(WWT_RESIZEBOX, COLOUR_MAUVE), EndContainer(), - NWidget(WWT_RESIZEBOX, COLOUR_MAUVE), EndContainer(), }; @@ -349,9 +352,12 @@ struct GSConfigWindow : public Window { break; } - case WID_GSC_ACCEPT: - this->Close(); + case WID_GSC_OPEN_URL: { + const GameConfig *config = GameConfig::GetConfig(); + if (config == nullptr || config->GetInfo() == nullptr) return; + OpenBrowser(config->GetInfo()->GetURL()); break; + } case WID_GSC_RESET: this->gs_config->ResetEditableSettings(_game_mode == GM_MENU); @@ -408,8 +414,10 @@ struct GSConfigWindow : public Window { this->SetWidgetDisabledState(WID_GSC_CHANGE, (_game_mode == GM_NORMAL) || !IsEditable()); + const GameConfig *config = GameConfig::GetConfig(); + this->SetWidgetDisabledState(WID_GSC_OPEN_URL, config->GetInfo() == nullptr || config->GetInfo()->GetURL().empty()); for (TextfileType tft = TFT_CONTENT_BEGIN; tft < TFT_CONTENT_END; tft++) { - this->SetWidgetDisabledState(WID_GSC_TEXTFILE + tft, !GameConfig::GetConfig()->GetTextfile(tft, (CompanyID)OWNER_DEITY).has_value()); + this->SetWidgetDisabledState(WID_GSC_TEXTFILE + tft, !config->GetTextfile(tft, (CompanyID)OWNER_DEITY).has_value()); } this->RebuildVisibleSettings(); this->CloseChildWindows(WC_DROPDOWN_MENU); diff --git a/src/widgets/game_widget.h b/src/widgets/game_widget.h index 6ab78fa8e9..3a2d2d7082 100644 --- a/src/widgets/game_widget.h +++ b/src/widgets/game_widget.h @@ -19,9 +19,9 @@ enum GSConfigWidgets { WID_GSC_SETTINGS, ///< Panel to draw the Game Script settings on WID_GSC_SCROLLBAR, ///< Scrollbar to scroll through the selected AIs. WID_GSC_CHANGE, ///< Select another Game Script button. + WID_GSC_OPEN_URL, ///< Open GS URL. WID_GSC_TEXTFILE, ///< Open GS readme, changelog (+1) or license (+2). WID_GSC_CONTENT_DOWNLOAD = WID_GSC_TEXTFILE + TFT_CONTENT_END, ///< Download content button. - WID_GSC_ACCEPT, ///< Accept ("Close") button WID_GSC_RESET, ///< Reset button. WID_GSC_SETTING_DROPDOWN = -1, ///< Dynamically created dropdown for changing setting value. From cc528bd8fcd97b1c501e0b5b84008afd3988324f Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 28 Nov 2023 20:50:43 +0000 Subject: [PATCH 012/105] Change: Adjust layout of Content and NewGRF Website buttons for consistency. --- src/network/network_content_gui.cpp | 16 +++++++++------- src/newgrf_gui.cpp | 10 ++++++---- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/network/network_content_gui.cpp b/src/network/network_content_gui.cpp index 5b18c88f0f..2adaacaf88 100644 --- a/src/network/network_content_gui.cpp +++ b/src/network/network_content_gui.cpp @@ -1078,13 +1078,15 @@ static const NWidgetPart _nested_network_content_list_widgets[] = { NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_sparse, 0), NWidget(WWT_PANEL, COLOUR_LIGHT_BLUE, WID_NCL_DETAILS), SetResize(1, 1), SetFill(1, 1), EndContainer(), - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0), - NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCL_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_TEXTFILE_VIEW_README_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCL_TEXTFILE + TFT_CHANGELOG), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP), - EndContainer(), - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0), - NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCL_OPEN_URL), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_CONTENT_OPEN_URL, STR_CONTENT_OPEN_URL_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCL_TEXTFILE + TFT_LICENSE), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_TEXTFILE_VIEW_LICENCE_TOOLTIP), + NWidget(NWID_VERTICAL), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), + NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCL_OPEN_URL), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_CONTENT_OPEN_URL, STR_CONTENT_OPEN_URL_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCL_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_TEXTFILE_VIEW_README_TOOLTIP), + EndContainer(), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), + NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCL_TEXTFILE + TFT_CHANGELOG), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCL_TEXTFILE + TFT_LICENSE), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_TEXTFILE_VIEW_LICENCE_TOOLTIP), + EndContainer(), EndContainer(), EndContainer(), EndContainer(), diff --git a/src/newgrf_gui.cpp b/src/newgrf_gui.cpp index 98af692f57..c6d618e9a2 100644 --- a/src/newgrf_gui.cpp +++ b/src/newgrf_gui.cpp @@ -1904,10 +1904,12 @@ static const NWidgetPart _nested_newgrf_infopanel_widgets[] = { /* Right side, info buttons. */ NWidget(NWID_VERTICAL), - NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_NS_OPEN_URL), SetFill(1, 0), SetResize(1, 0), - SetDataTip(STR_CONTENT_OPEN_URL, STR_CONTENT_OPEN_URL_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_NS_NEWGRF_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), - SetDataTip(STR_TEXTFILE_VIEW_README, STR_TEXTFILE_VIEW_README_TOOLTIP), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_NS_OPEN_URL), SetFill(1, 0), SetResize(1, 0), + SetDataTip(STR_CONTENT_OPEN_URL, STR_CONTENT_OPEN_URL_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_NS_NEWGRF_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), + SetDataTip(STR_TEXTFILE_VIEW_README, STR_TEXTFILE_VIEW_README_TOOLTIP), + EndContainer(), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_NS_NEWGRF_TEXTFILE + TFT_CHANGELOG), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP), From 1084ab4b6694ec6ef2f3f4086a04b2beed91ce56 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 28 Nov 2023 21:07:30 +0000 Subject: [PATCH 013/105] Add: Website button to Game Options window for basesets. This links to the optional "url" item in the baseset's [metadata] section. --- src/base_media_base.h | 1 + src/base_media_func.h | 3 ++ src/settings_gui.cpp | 58 +++++++++++++++++++++++++++-------- src/widgets/settings_widget.h | 3 ++ 4 files changed, 53 insertions(+), 12 deletions(-) diff --git a/src/base_media_base.h b/src/base_media_base.h index f52abaefce..5d74cb1a0d 100644 --- a/src/base_media_base.h +++ b/src/base_media_base.h @@ -59,6 +59,7 @@ struct BaseSet { static const char * const *file_names; std::string name; ///< The name of the base set + std::string url; ///< URL for information about the base set TranslatedStrings description; ///< Description of the base set uint32_t shortname; ///< Four letter short variant of the name uint32_t version; ///< The version of this base set diff --git a/src/base_media_func.h b/src/base_media_func.h index 2d30528df5..d04485579c 100644 --- a/src/base_media_func.h +++ b/src/base_media_func.h @@ -55,6 +55,9 @@ bool BaseSet::FillSetDetails(const IniFile &ini, fetch_metadata("description"); this->description[std::string{}] = *item->value; + item = metadata->GetItem("url"); + if (item != nullptr) this->url = *item->value; + /* Add the translations of the descriptions too. */ for (const IniItem &titem : metadata->items) { if (titem.name.compare(0, 12, "description.") != 0) continue; diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 1f3ff097e5..91f4f089e4 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -601,6 +601,21 @@ struct GameOptionsWindow : Window { break; } + case WID_GO_BASE_GRF_OPEN_URL: + if (BaseGraphics::GetUsedSet() == nullptr || BaseGraphics::GetUsedSet()->url.empty()) return; + OpenBrowser(BaseGraphics::GetUsedSet()->url); + break; + + case WID_GO_BASE_SFX_OPEN_URL: + if (BaseSounds::GetUsedSet() == nullptr || BaseSounds::GetUsedSet()->url.empty()) return; + OpenBrowser(BaseSounds::GetUsedSet()->url); + break; + + case WID_GO_BASE_MUSIC_OPEN_URL: + if (BaseMusic::GetUsedSet() == nullptr || BaseMusic::GetUsedSet()->url.empty()) return; + OpenBrowser(BaseMusic::GetUsedSet()->url); + break; + default: { int selected; DropDownList list = this->BuildDropDownList(widget, &selected); @@ -720,6 +735,10 @@ struct GameOptionsWindow : Window { this->SetWidgetDisabledState(WID_GO_BASE_GRF_PARAMETERS, BaseGraphics::GetUsedSet() == nullptr || !BaseGraphics::GetUsedSet()->IsConfigurable()); + this->SetWidgetDisabledState(WID_GO_BASE_GRF_OPEN_URL, BaseGraphics::GetUsedSet() == nullptr || BaseGraphics::GetUsedSet()->url.empty()); + this->SetWidgetDisabledState(WID_GO_BASE_SFX_OPEN_URL, BaseSounds::GetUsedSet() == nullptr || BaseSounds::GetUsedSet()->url.empty()); + this->SetWidgetDisabledState(WID_GO_BASE_MUSIC_OPEN_URL, BaseMusic::GetUsedSet() == nullptr || BaseMusic::GetUsedSet()->url.empty()); + for (TextfileType tft = TFT_CONTENT_BEGIN; tft < TFT_CONTENT_END; tft++) { this->SetWidgetDisabledState(WID_GO_BASE_GRF_TEXTFILE + tft, BaseGraphics::GetUsedSet() == nullptr || !BaseGraphics::GetUsedSet()->GetTextfile(tft).has_value()); this->SetWidgetDisabledState(WID_GO_BASE_SFX_TEXTFILE + tft, BaseSounds::GetUsedSet() == nullptr || !BaseSounds::GetUsedSet()->GetTextfile(tft).has_value()); @@ -822,10 +841,15 @@ static const NWidgetPart _nested_game_options_widgets[] = { NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_GRF_PARAMETERS), SetDataTip(STR_NEWGRF_SETTINGS_SET_PARAMETERS, STR_NULL), EndContainer(), NWidget(WWT_TEXT, COLOUR_GREY, WID_GO_BASE_GRF_DESCRIPTION), SetMinimalSize(200, 0), SetDataTip(STR_EMPTY, STR_GAME_OPTIONS_BASE_GRF_DESCRIPTION_TOOLTIP), SetFill(1, 0), - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_GRF_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_TEXTFILE_VIEW_README_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_GRF_TEXTFILE + TFT_CHANGELOG), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_GRF_TEXTFILE + TFT_LICENSE), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_TEXTFILE_VIEW_LICENCE_TOOLTIP), + NWidget(NWID_VERTICAL), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_GRF_OPEN_URL), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_CONTENT_OPEN_URL, STR_CONTENT_OPEN_URL_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_GRF_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_TEXTFILE_VIEW_README_TOOLTIP), + EndContainer(), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_GRF_TEXTFILE + TFT_CHANGELOG), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_GRF_TEXTFILE + TFT_LICENSE), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_TEXTFILE_VIEW_LICENCE_TOOLTIP), + EndContainer(), EndContainer(), EndContainer(), EndContainer(), @@ -846,10 +870,15 @@ static const NWidgetPart _nested_game_options_widgets[] = { NWidget(WWT_FRAME, COLOUR_GREY), SetDataTip(STR_GAME_OPTIONS_BASE_SFX, STR_NULL), SetPIP(0, WidgetDimensions::unscaled.vsep_sparse, 0), NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GO_BASE_SFX_DROPDOWN), SetMinimalSize(100, 12), SetDataTip(STR_JUST_RAW_STRING, STR_GAME_OPTIONS_BASE_SFX_TOOLTIP), SetFill(1, 0), NWidget(WWT_EMPTY, INVALID_COLOUR, WID_GO_BASE_SFX_DESCRIPTION), SetMinimalSize(200, 0), SetMinimalTextLines(1, 0), SetDataTip(STR_NULL, STR_GAME_OPTIONS_BASE_SFX_DESCRIPTION_TOOLTIP), SetFill(1, 0), - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_SFX_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_TEXTFILE_VIEW_README_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_SFX_TEXTFILE + TFT_CHANGELOG), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_SFX_TEXTFILE + TFT_LICENSE), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_TEXTFILE_VIEW_LICENCE_TOOLTIP), + NWidget(NWID_VERTICAL), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_SFX_OPEN_URL), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_CONTENT_OPEN_URL, STR_CONTENT_OPEN_URL_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_SFX_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_TEXTFILE_VIEW_README_TOOLTIP), + EndContainer(), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_SFX_TEXTFILE + TFT_CHANGELOG), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_SFX_TEXTFILE + TFT_LICENSE), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_TEXTFILE_VIEW_LICENCE_TOOLTIP), + EndContainer(), EndContainer(), EndContainer(), @@ -861,10 +890,15 @@ static const NWidgetPart _nested_game_options_widgets[] = { NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_GO_BASE_MUSIC_JUKEBOX), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_MUSIC, STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW), EndContainer(), EndContainer(), - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_MUSIC_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_TEXTFILE_VIEW_README_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_MUSIC_TEXTFILE + TFT_CHANGELOG), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_MUSIC_TEXTFILE + TFT_LICENSE), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_TEXTFILE_VIEW_LICENCE_TOOLTIP), + NWidget(NWID_VERTICAL), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_MUSIC_OPEN_URL), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_CONTENT_OPEN_URL, STR_CONTENT_OPEN_URL_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_MUSIC_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_TEXTFILE_VIEW_README_TOOLTIP), + EndContainer(), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_MUSIC_TEXTFILE + TFT_CHANGELOG), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_MUSIC_TEXTFILE + TFT_LICENSE), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_TEXTFILE_VIEW_LICENCE_TOOLTIP), + EndContainer(), EndContainer(), EndContainer(), EndContainer(), diff --git a/src/widgets/settings_widget.h b/src/widgets/settings_widget.h index 816512105c..33b02f3d88 100644 --- a/src/widgets/settings_widget.h +++ b/src/widgets/settings_widget.h @@ -27,17 +27,20 @@ enum GameOptionsWidgets { WID_GO_GUI_SCALE_BEVEL_BUTTON, ///< Toggle for chunky bevels. WID_GO_BASE_GRF_DROPDOWN, ///< Use to select a base GRF. WID_GO_BASE_GRF_PARAMETERS, ///< Base GRF parameters. + WID_GO_BASE_GRF_OPEN_URL, ///< Open base GRF URL. WID_GO_BASE_GRF_TEXTFILE, ///< Open base GRF readme, changelog (+1) or license (+2). WID_GO_BASE_GRF_DESCRIPTION = WID_GO_BASE_GRF_TEXTFILE + TFT_CONTENT_END, ///< Description of selected base GRF. WID_GO_BASE_SFX_DROPDOWN, ///< Use to select a base SFX. WID_GO_TEXT_SFX_VOLUME, ///< Sound effects volume label. WID_GO_BASE_SFX_VOLUME, ///< Change sound effects volume. + WID_GO_BASE_SFX_OPEN_URL, ///< Open base SFX URL. WID_GO_BASE_SFX_TEXTFILE, ///< Open base SFX readme, changelog (+1) or license (+2). WID_GO_BASE_SFX_DESCRIPTION = WID_GO_BASE_SFX_TEXTFILE + TFT_CONTENT_END, ///< Description of selected base SFX. WID_GO_BASE_MUSIC_DROPDOWN, ///< Use to select a base music set. WID_GO_TEXT_MUSIC_VOLUME, ///< Music volume label. WID_GO_BASE_MUSIC_VOLUME, ///< Change music volume. WID_GO_BASE_MUSIC_JUKEBOX, ///< Open the jukebox. + WID_GO_BASE_MUSIC_OPEN_URL, ///< Open base music URL. WID_GO_BASE_MUSIC_TEXTFILE, ///< Open base music readme, changelog (+1) or license (+2). WID_GO_BASE_MUSIC_DESCRIPTION = WID_GO_BASE_MUSIC_TEXTFILE + TFT_CONTENT_END, ///< Description of selected base music set. WID_GO_VIDEO_ACCEL_BUTTON, ///< Toggle for video acceleration. From aae6e0481ecc6f4bc0e4f21914d69b135008a105 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 3 Dec 2023 18:53:31 +0000 Subject: [PATCH 014/105] Codechange: Rearrange AI/GS debug window following invalidate/set state/draw pattern. (#11483) The AI/GS window updated its state as it was drawn, and would redraw again if some state had changed. Instead, update state either during OnInvalidateData or before any drawing commences. --- src/script/script_gui.cpp | 183 ++++++++++++++++++++++---------------- 1 file changed, 106 insertions(+), 77 deletions(-) diff --git a/src/script/script_gui.cpp b/src/script/script_gui.cpp index ddad096fc3..89f6df19f4 100644 --- a/src/script/script_gui.cpp +++ b/src/script/script_gui.cpp @@ -801,76 +801,10 @@ struct ScriptDebugWindow : public Window { void OnPaint() override { this->SelectValidDebugCompany(); + this->UpdateLogScroll(); /* 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; - - ScriptLogTypes::LogData &log = this->GetLogData(); - - int scroll_count = (int)log.size(); - if (this->vscroll->GetCount() != scroll_count) { - this->vscroll->SetCount(scroll_count); - - /* We need a repaint */ - this->SetWidgetDirty(WID_SCRD_SCROLLBAR); - } - - if (log.empty()) 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() + this->vscroll->GetCapacity() >= (int)log.size(); - } - if (this->autoscroll) { - if (this->vscroll->SetPosition((int)log.size())) { - /* 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 @@ -896,9 +830,41 @@ struct ScriptDebugWindow : public Window { void DrawWidget(const Rect &r, int widget) const override { - if (script_debug_company == INVALID_COMPANY) return; + switch (widget) { + case WID_SCRD_LOG_PANEL: + this->DrawWidgetLog(r); + break; - if (widget != WID_SCRD_LOG_PANEL) return; + default: + if (IsInsideBS(widget, WID_SCRD_COMPANY_BUTTON_START, MAX_COMPANIES)) { + this->DrawWidgetCompanyButton(r, widget, WID_SCRD_COMPANY_BUTTON_START); + } + break; + } + } + + /** + * Draw a company button icon. + * @param r Rect area to draw within. + * @param widget Widget index to start. + * @param start Widget index of first company button. + */ + void DrawWidgetCompanyButton(const Rect &r, int widget, int start) const + { + if (this->IsWidgetDisabled(widget)) return; + CompanyID cid = (CompanyID)(widget - start); + int offset = (cid == script_debug_company) ? WidgetDimensions::scaled.pressed : 0; + Dimension sprite_size = GetSpriteSize(SPR_COMPANY_ICON); + DrawCompanyIcon(cid, CenterBounds(r.left, r.right, sprite_size.width) + offset, CenterBounds(r.top, r.bottom, sprite_size.height) + offset); + } + + /** + * Draw the AI/GS log. + * @param r Rect area to draw within. + */ + void DrawWidgetLog(const Rect &r) const + { + if (script_debug_company == INVALID_COMPANY) return; ScriptLogTypes::LogData &log = this->GetLogData(); if (log.empty()) return; @@ -929,6 +895,75 @@ struct ScriptDebugWindow : public Window { } } + /** + * Update the scrollbar and scroll position of the log panel. + */ + void UpdateLogScroll() + { + this->SetWidgetDisabledState(WID_SCRD_SCROLLBAR, script_debug_company == INVALID_COMPANY); + if (script_debug_company == INVALID_COMPANY) return; + + ScriptLogTypes::LogData &log = this->GetLogData(); + + int scroll_count = (int)log.size(); + if (this->vscroll->GetCount() != scroll_count) { + this->vscroll->SetCount(scroll_count); + + /* We need a repaint */ + this->SetWidgetDirty(WID_SCRD_SCROLLBAR); + } + + if (log.empty()) 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() + this->vscroll->GetCapacity() >= (int)log.size(); + } + + if (this->autoscroll && this->vscroll->SetPosition((int)log.size())) { + /* We need a repaint */ + this->SetWidgetDirty(WID_SCRD_SCROLLBAR); + this->SetWidgetDirty(WID_SCRD_LOG_PANEL); + } + + this->last_vscroll_pos = this->vscroll->GetPosition(); + } + + /** + * Update state of all Company (AI) buttons. + */ + void UpdateAIButtonsState() + { + /* Update company buttons */ + for (CompanyID i = COMPANY_FIRST; i < MAX_COMPANIES; i++) { + /* Mark dead/paused AIs by setting the background colour. */ + bool valid = Company::IsValidAiID(i); + bool dead = valid && Company::Get(i)->ai_instance->IsDead(); + bool paused = valid && Company::Get(i)->ai_instance->IsPaused(); + + NWidgetCore *button = this->GetWidget(i + WID_SCRD_COMPANY_BUTTON_START); + button->SetDisabled(!valid); + button->SetLowered(script_debug_company == i); + SetScriptButtonColour(*button, dead, paused); + } + } + + /** + * Update state of game script button. + */ + void UpdateGSButtonState() + { + 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); + button->SetDisabled(!valid); + button->SetLowered(script_debug_company == OWNER_DEITY); + SetScriptButtonColour(*button, dead, paused); + } + /** * Change all settings to select another Script. * @param show_ai The new AI to show. @@ -1072,14 +1107,8 @@ struct ScriptDebugWindow : public Window { this->vscroll->SetCount(script_debug_company != INVALID_COMPANY ? this->GetLogData().size() : 0); - /* 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->UpdateAIButtonsState(); + this->UpdateGSButtonState(); 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); From 17c3ce8632776b546d338e825c085487a6ad6f93 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 3 Dec 2023 22:23:54 +0000 Subject: [PATCH 015/105] Codechange: Use maxdim instead of setting width/height separately. (#11535) --- src/company_gui.cpp | 14 ++++---------- src/error_gui.cpp | 8 +++----- 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/src/company_gui.cpp b/src/company_gui.cpp index 439e2257dc..80d6147082 100644 --- a/src/company_gui.cpp +++ b/src/company_gui.cpp @@ -1466,12 +1466,9 @@ public: *size = maxdim(*size, GetStringBoundingBox(STR_FACE_MOUSTACHE)); break; - case WID_SCMF_FACE: { - Dimension face_size = GetScaledSpriteSize(SPR_GRADIENT); - size->width = std::max(size->width, face_size.width); - size->height = std::max(size->height, face_size.height); + case WID_SCMF_FACE: + *size = maxdim(*size, GetScaledSpriteSize(SPR_GRADIENT)); break; - } case WID_SCMF_HAS_MOUSTACHE_EARRING: case WID_SCMF_HAS_GLASSES: @@ -2323,12 +2320,9 @@ struct CompanyWindow : Window void UpdateWidgetSize(int widget, Dimension *size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension *fill, [[maybe_unused]] Dimension *resize) override { switch (widget) { - case WID_C_FACE: { - Dimension face_size = GetScaledSpriteSize(SPR_GRADIENT); - size->width = std::max(size->width, face_size.width); - size->height = std::max(size->height, face_size.height); + case WID_C_FACE: + *size = maxdim(*size, GetScaledSpriteSize(SPR_GRADIENT)); break; - } case WID_C_DESC_COLOUR_SCHEME_EXAMPLE: { Point offset; diff --git a/src/error_gui.cpp b/src/error_gui.cpp index 5e3a42a0d4..007094ca75 100644 --- a/src/error_gui.cpp +++ b/src/error_gui.cpp @@ -8,6 +8,7 @@ /** @file error_gui.cpp GUI related to errors. */ #include "stdafx.h" +#include "core/geometry_func.hpp" #include "core/mem_func.hpp" #include "landscape.h" #include "newgrf_text.h" @@ -208,12 +209,9 @@ public: size->height = std::max(size->height, panel_height); break; } - case WID_EM_FACE: { - Dimension face_size = GetScaledSpriteSize(SPR_GRADIENT); - size->width = std::max(size->width, face_size.width); - size->height = std::max(size->height, face_size.height); + case WID_EM_FACE: + *size = maxdim(*size, GetScaledSpriteSize(SPR_GRADIENT)); break; - } } } From 9122b4eb47bcafde3e2e992eacf03307f4bf2424 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 3 Dec 2023 22:42:50 +0000 Subject: [PATCH 016/105] Codechange: SetMinimalTextLines(1, 0) is implied for widgets with text. (#11536) --- src/network/network_gui.cpp | 20 ++++++++++---------- src/station_gui.cpp | 16 ++++++++-------- src/town_gui.cpp | 2 +- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index 449f09a326..3e084919bc 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -1250,36 +1250,36 @@ static const NWidgetPart _nested_client_list_widgets[] = { NWidget(WWT_PANEL, COLOUR_GREY), NWidget(WWT_FRAME, COLOUR_GREY), SetDataTip(STR_NETWORK_CLIENT_LIST_SERVER, STR_NULL), SetPadding(4, 4, 0, 4), SetPIP(0, 2, 0), NWidget(NWID_HORIZONTAL), SetPIP(0, 3, 0), - NWidget(WWT_TEXT, COLOUR_GREY), SetMinimalTextLines(1, 0), SetDataTip(STR_NETWORK_CLIENT_LIST_SERVER_NAME, STR_NULL), + NWidget(WWT_TEXT, COLOUR_GREY), SetDataTip(STR_NETWORK_CLIENT_LIST_SERVER_NAME, STR_NULL), NWidget(NWID_SPACER), SetMinimalSize(10, 0), - NWidget(WWT_TEXT, COLOUR_GREY, WID_CL_SERVER_NAME), SetFill(1, 0), SetMinimalTextLines(1, 0), SetResize(1, 0), SetDataTip(STR_JUST_RAW_STRING, STR_NETWORK_CLIENT_LIST_SERVER_NAME_TOOLTIP), SetAlignment(SA_VERT_CENTER | SA_RIGHT), + NWidget(WWT_TEXT, COLOUR_GREY, WID_CL_SERVER_NAME), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_JUST_RAW_STRING, STR_NETWORK_CLIENT_LIST_SERVER_NAME_TOOLTIP), SetAlignment(SA_VERT_CENTER | SA_RIGHT), NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_CL_SERVER_NAME_EDIT), SetMinimalSize(12, 14), SetDataTip(SPR_RENAME, STR_NETWORK_CLIENT_LIST_SERVER_NAME_EDIT_TOOLTIP), EndContainer(), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_CL_SERVER_SELECTOR), NWidget(NWID_VERTICAL), NWidget(NWID_HORIZONTAL), SetPIP(0, 3, 0), - NWidget(WWT_TEXT, COLOUR_GREY), SetMinimalTextLines(1, 0), SetDataTip(STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY, STR_NULL), + NWidget(WWT_TEXT, COLOUR_GREY), SetDataTip(STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY, STR_NULL), NWidget(NWID_SPACER), SetMinimalSize(10, 0), SetFill(1, 0), SetResize(1, 0), NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_CL_SERVER_VISIBILITY), SetDataTip(STR_JUST_STRING, STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY_TOOLTIP), EndContainer(), NWidget(NWID_HORIZONTAL), SetPIP(0, 3, 0), - NWidget(WWT_TEXT, COLOUR_GREY), SetMinimalTextLines(1, 0), SetDataTip(STR_NETWORK_CLIENT_LIST_SERVER_INVITE_CODE, STR_NULL), + NWidget(WWT_TEXT, COLOUR_GREY), SetDataTip(STR_NETWORK_CLIENT_LIST_SERVER_INVITE_CODE, STR_NULL), NWidget(NWID_SPACER), SetMinimalSize(10, 0), - NWidget(WWT_TEXT, COLOUR_GREY, WID_CL_SERVER_INVITE_CODE), SetFill(1, 0), SetMinimalTextLines(1, 0), SetResize(1, 0), SetDataTip(STR_JUST_RAW_STRING, STR_NETWORK_CLIENT_LIST_SERVER_INVITE_CODE_TOOLTIP), SetAlignment(SA_VERT_CENTER | SA_RIGHT), + NWidget(WWT_TEXT, COLOUR_GREY, WID_CL_SERVER_INVITE_CODE), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_JUST_RAW_STRING, STR_NETWORK_CLIENT_LIST_SERVER_INVITE_CODE_TOOLTIP), SetAlignment(SA_VERT_CENTER | SA_RIGHT), EndContainer(), NWidget(NWID_HORIZONTAL), SetPIP(0, 3, 0), - NWidget(WWT_TEXT, COLOUR_GREY), SetMinimalTextLines(1, 0), SetDataTip(STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE, STR_NULL), + NWidget(WWT_TEXT, COLOUR_GREY), SetDataTip(STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE, STR_NULL), NWidget(NWID_SPACER), SetMinimalSize(10, 0), - NWidget(WWT_TEXT, COLOUR_GREY, WID_CL_SERVER_CONNECTION_TYPE), SetFill(1, 0), SetMinimalTextLines(1, 0), SetResize(1, 0), SetDataTip(STR_JUST_STRING, STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TOOLTIP), SetAlignment(SA_VERT_CENTER | SA_RIGHT), + NWidget(WWT_TEXT, COLOUR_GREY, WID_CL_SERVER_CONNECTION_TYPE), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_JUST_STRING, STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TOOLTIP), SetAlignment(SA_VERT_CENTER | SA_RIGHT), EndContainer(), EndContainer(), EndContainer(), EndContainer(), NWidget(WWT_FRAME, COLOUR_GREY), SetDataTip(STR_NETWORK_CLIENT_LIST_PLAYER, STR_NULL), SetPadding(4, 4, 4, 4), SetPIP(0, 2, 0), NWidget(NWID_HORIZONTAL), SetPIP(0, 3, 0), - NWidget(WWT_TEXT, COLOUR_GREY), SetMinimalTextLines(1, 0), SetDataTip(STR_NETWORK_CLIENT_LIST_PLAYER_NAME, STR_NULL), + NWidget(WWT_TEXT, COLOUR_GREY), SetDataTip(STR_NETWORK_CLIENT_LIST_PLAYER_NAME, STR_NULL), NWidget(NWID_SPACER), SetMinimalSize(10, 0), - NWidget(WWT_TEXT, COLOUR_GREY, WID_CL_CLIENT_NAME), SetFill(1, 0), SetMinimalTextLines(1, 0), SetResize(1, 0), SetDataTip(STR_JUST_RAW_STRING, STR_NETWORK_CLIENT_LIST_PLAYER_NAME_TOOLTIP), SetAlignment(SA_VERT_CENTER | SA_RIGHT), + NWidget(WWT_TEXT, COLOUR_GREY, WID_CL_CLIENT_NAME), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_JUST_RAW_STRING, STR_NETWORK_CLIENT_LIST_PLAYER_NAME_TOOLTIP), SetAlignment(SA_VERT_CENTER | SA_RIGHT), NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_CL_CLIENT_NAME_EDIT), SetMinimalSize(12, 14), SetDataTip(SPR_RENAME, STR_NETWORK_CLIENT_LIST_PLAYER_NAME_EDIT_TOOLTIP), EndContainer(), EndContainer(), @@ -1288,7 +1288,7 @@ static const NWidgetPart _nested_client_list_widgets[] = { NWidget(NWID_VERTICAL), NWidget(WWT_MATRIX, COLOUR_GREY, WID_CL_MATRIX), SetMinimalSize(180, 0), SetResize(1, 1), SetFill(1, 1), SetMatrixDataTip(1, 0, STR_NULL), SetScrollbar(WID_CL_SCROLLBAR), NWidget(WWT_PANEL, COLOUR_GREY), - NWidget(WWT_TEXT, COLOUR_GREY, WID_CL_CLIENT_COMPANY_COUNT), SetFill(1, 0), SetMinimalTextLines(1, 0), SetResize(1, 0), SetPadding(2, 1, 2, 1), SetAlignment(SA_CENTER), SetDataTip(STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT, STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT_TOOLTIP), + NWidget(WWT_TEXT, COLOUR_GREY, WID_CL_CLIENT_COMPANY_COUNT), SetFill(1, 0), SetResize(1, 0), SetPadding(2, 1, 2, 1), SetAlignment(SA_CENTER), SetDataTip(STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT, STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT_TOOLTIP), EndContainer(), EndContainer(), NWidget(NWID_VERTICAL), diff --git a/src/station_gui.cpp b/src/station_gui.cpp index 88c05ffc01..7dcdab6e92 100644 --- a/src/station_gui.cpp +++ b/src/station_gui.cpp @@ -736,16 +736,16 @@ static const NWidgetPart _nested_company_stations_widgets[] = { NWidget(WWT_STICKYBOX, COLOUR_GREY), EndContainer(), NWidget(NWID_HORIZONTAL), - NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_STL_TRAIN), SetMinimalSize(14, 0), SetMinimalTextLines(1, 0), SetDataTip(STR_TRAIN, STR_STATION_LIST_USE_CTRL_TO_SELECT_MORE), SetFill(0, 1), - NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_STL_TRUCK), SetMinimalSize(14, 0), SetMinimalTextLines(1, 0), SetDataTip(STR_LORRY, STR_STATION_LIST_USE_CTRL_TO_SELECT_MORE), SetFill(0, 1), - NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_STL_BUS), SetMinimalSize(14, 0), SetMinimalTextLines(1, 0), SetDataTip(STR_BUS, STR_STATION_LIST_USE_CTRL_TO_SELECT_MORE), SetFill(0, 1), - NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_STL_SHIP), SetMinimalSize(14, 0), SetMinimalTextLines(1, 0), SetDataTip(STR_SHIP, STR_STATION_LIST_USE_CTRL_TO_SELECT_MORE), SetFill(0, 1), - NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_STL_AIRPLANE), SetMinimalSize(14, 0), SetMinimalTextLines(1, 0), SetDataTip(STR_PLANE, STR_STATION_LIST_USE_CTRL_TO_SELECT_MORE), SetFill(0, 1), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_STL_FACILALL), SetMinimalSize(14, 0), SetMinimalTextLines(1, 0), SetDataTip(STR_ABBREV_ALL, STR_STATION_LIST_SELECT_ALL_FACILITIES), SetTextStyle(TC_BLACK, FS_SMALL), SetFill(0, 1), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_STL_TRAIN), SetMinimalSize(14, 0), SetDataTip(STR_TRAIN, STR_STATION_LIST_USE_CTRL_TO_SELECT_MORE), SetFill(0, 1), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_STL_TRUCK), SetMinimalSize(14, 0), SetDataTip(STR_LORRY, STR_STATION_LIST_USE_CTRL_TO_SELECT_MORE), SetFill(0, 1), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_STL_BUS), SetMinimalSize(14, 0), SetDataTip(STR_BUS, STR_STATION_LIST_USE_CTRL_TO_SELECT_MORE), SetFill(0, 1), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_STL_SHIP), SetMinimalSize(14, 0), SetDataTip(STR_SHIP, STR_STATION_LIST_USE_CTRL_TO_SELECT_MORE), SetFill(0, 1), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_STL_AIRPLANE), SetMinimalSize(14, 0), SetDataTip(STR_PLANE, STR_STATION_LIST_USE_CTRL_TO_SELECT_MORE), SetFill(0, 1), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_STL_FACILALL), SetMinimalSize(14, 0), SetDataTip(STR_ABBREV_ALL, STR_STATION_LIST_SELECT_ALL_FACILITIES), SetTextStyle(TC_BLACK, FS_SMALL), SetFill(0, 1), NWidget(WWT_PANEL, COLOUR_GREY), SetMinimalSize(5, 0), SetFill(0, 1), EndContainer(), NWidgetFunction(CargoWidgets), - NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_STL_NOCARGOWAITING), SetMinimalSize(14, 0), SetMinimalTextLines(1, 0), SetDataTip(STR_ABBREV_NONE, STR_STATION_LIST_NO_WAITING_CARGO), SetTextStyle(TC_BLACK, FS_SMALL), SetFill(0, 1), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_STL_CARGOALL), SetMinimalSize(14, 0), SetMinimalTextLines(1, 0), SetDataTip(STR_ABBREV_ALL, STR_STATION_LIST_SELECT_ALL_TYPES), SetTextStyle(TC_BLACK, FS_SMALL), SetFill(0, 1), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_STL_NOCARGOWAITING), SetMinimalSize(14, 0), SetDataTip(STR_ABBREV_NONE, STR_STATION_LIST_NO_WAITING_CARGO), SetTextStyle(TC_BLACK, FS_SMALL), SetFill(0, 1), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_STL_CARGOALL), SetMinimalSize(14, 0), SetDataTip(STR_ABBREV_ALL, STR_STATION_LIST_SELECT_ALL_TYPES), SetTextStyle(TC_BLACK, FS_SMALL), SetFill(0, 1), NWidget(WWT_PANEL, COLOUR_GREY), SetResize(1, 0), SetFill(1, 1), EndContainer(), EndContainer(), NWidget(NWID_HORIZONTAL), diff --git a/src/town_gui.cpp b/src/town_gui.cpp index e91870af95..19c28fcb46 100644 --- a/src/town_gui.cpp +++ b/src/town_gui.cpp @@ -684,7 +684,7 @@ static const NWidgetPart _nested_town_directory_widgets[] = { NWidget(WWT_PANEL, COLOUR_BROWN, WID_TD_LIST), SetDataTip(0x0, STR_TOWN_DIRECTORY_LIST_TOOLTIP), SetFill(1, 0), SetResize(1, 1), SetScrollbar(WID_TD_SCROLLBAR), EndContainer(), NWidget(WWT_PANEL, COLOUR_BROWN), - NWidget(WWT_TEXT, COLOUR_BROWN, WID_TD_WORLD_POPULATION), SetPadding(2, 0, 2, 2), SetMinimalTextLines(1, 0), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TOWN_POPULATION, STR_NULL), + NWidget(WWT_TEXT, COLOUR_BROWN, WID_TD_WORLD_POPULATION), SetPadding(2, 0, 2, 2), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TOWN_POPULATION, STR_NULL), EndContainer(), EndContainer(), NWidget(NWID_VERTICAL), From 4e5700939d7bda26102aea0a1eefae1d2520b22e Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 25 Oct 2023 01:44:41 +0100 Subject: [PATCH 017/105] Change: Use sparse padding for sprite aligner. --- src/newgrf_debug_gui.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/newgrf_debug_gui.cpp b/src/newgrf_debug_gui.cpp index 11322c2019..7c6c942d8c 100644 --- a/src/newgrf_debug_gui.cpp +++ b/src/newgrf_debug_gui.cpp @@ -1072,19 +1072,19 @@ static const NWidgetPart _nested_sprite_aligner_widgets[] = { NWidget(WWT_STICKYBOX, COLOUR_GREY), EndContainer(), NWidget(WWT_PANEL, COLOUR_GREY), - NWidget(NWID_HORIZONTAL), SetPIP(0, 0, 10), - NWidget(NWID_VERTICAL), SetPIP(10, 5, 10), - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(10, 5, 10), + NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0), SetPadding(WidgetDimensions::unscaled.sparse), + NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_sparse, 0), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(0, WidgetDimensions::unscaled.hsep_normal, 0), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SA_PREVIOUS), SetDataTip(STR_SPRITE_ALIGNER_PREVIOUS_BUTTON, STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP), SetFill(1, 0), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SA_GOTO), SetDataTip(STR_SPRITE_ALIGNER_GOTO_BUTTON, STR_SPRITE_ALIGNER_GOTO_TOOLTIP), SetFill(1, 0), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SA_NEXT), SetDataTip(STR_SPRITE_ALIGNER_NEXT_BUTTON, STR_SPRITE_ALIGNER_NEXT_TOOLTIP), SetFill(1, 0), EndContainer(), - NWidget(NWID_HORIZONTAL), SetPIP(10, 5, 10), + NWidget(NWID_HORIZONTAL), NWidget(NWID_SPACER), SetFill(1, 1), NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_SA_UP), SetDataTip(SPR_ARROW_UP, STR_SPRITE_ALIGNER_MOVE_TOOLTIP), SetResize(0, 0), SetMinimalSize(11, 11), NWidget(NWID_SPACER), SetFill(1, 1), EndContainer(), - NWidget(NWID_HORIZONTAL_LTR), SetPIP(10, 5, 10), + NWidget(NWID_HORIZONTAL_LTR), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0), NWidget(NWID_VERTICAL), NWidget(NWID_SPACER), SetFill(1, 1), NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_SA_LEFT), SetDataTip(SPR_ARROW_LEFT, STR_SPRITE_ALIGNER_MOVE_TOOLTIP), SetResize(0, 0), SetMinimalSize(11, 11), @@ -1098,20 +1098,20 @@ static const NWidgetPart _nested_sprite_aligner_widgets[] = { NWidget(NWID_SPACER), SetFill(1, 1), EndContainer(), EndContainer(), - NWidget(NWID_HORIZONTAL), SetPIP(10, 5, 10), + NWidget(NWID_HORIZONTAL), NWidget(NWID_SPACER), SetFill(1, 1), NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_SA_DOWN), SetDataTip(SPR_ARROW_DOWN, STR_SPRITE_ALIGNER_MOVE_TOOLTIP), SetResize(0, 0), SetMinimalSize(11, 11), NWidget(NWID_SPACER), SetFill(1, 1), EndContainer(), - NWidget(WWT_LABEL, COLOUR_GREY, WID_SA_OFFSETS_ABS), SetDataTip(STR_SPRITE_ALIGNER_OFFSETS_ABS, STR_NULL), SetFill(1, 0), SetPadding(0, 10, 0, 10), - NWidget(WWT_LABEL, COLOUR_GREY, WID_SA_OFFSETS_REL), SetDataTip(STR_SPRITE_ALIGNER_OFFSETS_REL, STR_NULL), SetFill(1, 0), SetPadding(0, 10, 0, 10), - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(10, 5, 10), + NWidget(WWT_LABEL, COLOUR_GREY, WID_SA_OFFSETS_ABS), SetDataTip(STR_SPRITE_ALIGNER_OFFSETS_ABS, STR_NULL), SetFill(1, 0), + NWidget(WWT_LABEL, COLOUR_GREY, WID_SA_OFFSETS_REL), SetDataTip(STR_SPRITE_ALIGNER_OFFSETS_REL, STR_NULL), SetFill(1, 0), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(0, WidgetDimensions::unscaled.hsep_normal, 0), NWidget(WWT_TEXTBTN_2, COLOUR_GREY, WID_SA_CENTRE), SetDataTip(STR_SPRITE_ALIGNER_CENTRE_OFFSET, STR_NULL), SetFill(1, 0), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SA_RESET_REL), SetDataTip(STR_SPRITE_ALIGNER_RESET_BUTTON, STR_SPRITE_ALIGNER_RESET_TOOLTIP), SetFill(1, 0), NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SA_CROSSHAIR), SetDataTip(STR_SPRITE_ALIGNER_CROSSHAIR, STR_NULL), SetFill(1, 0), EndContainer(), EndContainer(), - NWidget(NWID_VERTICAL), SetPIP(10, 5, 10), + NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_sparse, 0), NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SA_PICKER), SetDataTip(STR_SPRITE_ALIGNER_PICKER_BUTTON, STR_SPRITE_ALIGNER_PICKER_TOOLTIP), SetFill(1, 0), NWidget(NWID_HORIZONTAL), NWidget(WWT_MATRIX, COLOUR_GREY, WID_SA_LIST), SetResize(1, 1), SetMatrixDataTip(1, 0, STR_NULL), SetFill(1, 1), SetScrollbar(WID_SA_SCROLLBAR), From 0434c1b474a45b56b9933778634b8bd64b2bf90f Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 29 Nov 2023 17:43:04 +0000 Subject: [PATCH 018/105] Feature: (-tte) Add zoom level buttons to sprite aligner. This allows for offsets to be adjusted a different zoom level than currently in use, and offset adjustment and display is also more convenient. --- src/newgrf_debug_gui.cpp | 52 +++++++++++++++++++++++-------- src/widgets/newgrf_debug_widget.h | 2 ++ 2 files changed, 41 insertions(+), 13 deletions(-) diff --git a/src/newgrf_debug_gui.cpp b/src/newgrf_debug_gui.cpp index 7c6c942d8c..a42bf2ca56 100644 --- a/src/newgrf_debug_gui.cpp +++ b/src/newgrf_debug_gui.cpp @@ -819,11 +819,15 @@ struct SpriteAlignerWindow : Window { Scrollbar *vscroll; std::map offs_start_map; ///< Mapping of starting offsets for the sprites which have been aligned in the sprite aligner window. + static inline ZoomLevel zoom = ZOOM_LVL_END; static bool centre; static bool crosshair; SpriteAlignerWindow(WindowDesc *desc, WindowNumber wno) : Window(desc) { + /* On first opening, set initial zoom to current zoom level. */ + if (SpriteAlignerWindow::zoom == ZOOM_LVL_END) SpriteAlignerWindow::zoom = _gui_zoom; + this->CreateNestedTree(); this->vscroll = this->GetScrollbar(WID_SA_SCROLLBAR); this->vscroll->SetCount(_newgrf_debug_sprite_picker.sprites.size()); @@ -834,6 +838,8 @@ struct SpriteAlignerWindow : Window { /* Oh yes, we assume there is at least one normal sprite! */ while (GetSpriteType(this->current_sprite) != SpriteType::Normal) this->current_sprite++; + + this->InvalidateData(0, true); } void SetStringParameters(int widget) const override @@ -846,8 +852,8 @@ struct SpriteAlignerWindow : Window { break; case WID_SA_OFFSETS_ABS: - SetDParam(0, spr->x_offs); - SetDParam(1, spr->y_offs); + SetDParam(0, UnScaleByZoom(spr->x_offs, SpriteAlignerWindow::zoom)); + SetDParam(1, UnScaleByZoom(spr->y_offs, SpriteAlignerWindow::zoom)); break; case WID_SA_OFFSETS_REL: { @@ -856,8 +862,8 @@ struct SpriteAlignerWindow : Window { */ const auto key_offs_pair = this->offs_start_map.find(this->current_sprite); if (key_offs_pair != this->offs_start_map.end()) { - SetDParam(0, spr->x_offs - key_offs_pair->second.first); - SetDParam(1, spr->y_offs - key_offs_pair->second.second); + SetDParam(0, UnScaleByZoom(spr->x_offs - key_offs_pair->second.first, SpriteAlignerWindow::zoom)); + SetDParam(1, UnScaleByZoom(spr->y_offs - key_offs_pair->second.second, SpriteAlignerWindow::zoom)); } else { SetDParam(0, 0); SetDParam(1, 0); @@ -898,8 +904,8 @@ struct SpriteAlignerWindow : Window { int x; int y; if (SpriteAlignerWindow::centre) { - x = -UnScaleGUI(spr->x_offs) + (ir.Width() - UnScaleGUI(spr->width)) / 2; - y = -UnScaleGUI(spr->y_offs) + (ir.Height() - UnScaleGUI(spr->height)) / 2; + x = -UnScaleByZoom(spr->x_offs, SpriteAlignerWindow::zoom) + (ir.Width() - UnScaleByZoom(spr->width, SpriteAlignerWindow::zoom)) / 2; + y = -UnScaleByZoom(spr->y_offs, SpriteAlignerWindow::zoom) + (ir.Height() - UnScaleByZoom(spr->height, SpriteAlignerWindow::zoom)) / 2; } else { x = ir.Width() / 2; y = ir.Height() / 2; @@ -909,8 +915,8 @@ struct SpriteAlignerWindow : Window { if (!FillDrawPixelInfo(&new_dpi, ir.left, ir.top, ir.Width(), ir.Height())) break; AutoRestoreBackup dpi_backup(_cur_dpi, &new_dpi); - DrawSprite(this->current_sprite, PAL_NONE, x, y, nullptr, ZOOM_LVL_GUI); - if (this->crosshair) { + DrawSprite(this->current_sprite, PAL_NONE, x, y, nullptr, SpriteAlignerWindow::zoom); + if (SpriteAlignerWindow::crosshair) { GfxDrawLine(x, 0, x, ir.Height() - 1, PC_WHITE, 1, 1); GfxDrawLine(0, y, ir.Width() - 1, y, PC_WHITE, 1, 1); } @@ -927,7 +933,7 @@ struct SpriteAlignerWindow : Window { Rect ir = r.Shrink(WidgetDimensions::scaled.matrix); for (int i = this->vscroll->GetPosition(); i < max; i++) { SetDParam(0, list[i]); - DrawString(ir, STR_JUST_COMMA, TC_BLACK, SA_RIGHT | SA_FORCE); + DrawString(ir, STR_JUST_COMMA, list[i] == this->current_sprite ? TC_WHITE : TC_BLACK, SA_RIGHT | SA_FORCE); ir.top += step_size; } break; @@ -995,12 +1001,13 @@ struct SpriteAlignerWindow : Window { if (this->offs_start_map.count(this->current_sprite) == 0) { this->offs_start_map[this->current_sprite] = XyOffs(spr->x_offs, spr->y_offs); } + int amt = ScaleByZoom(_ctrl_pressed ? 8 : 1, SpriteAlignerWindow::zoom); switch (widget) { /* Move eight units at a time if ctrl is pressed. */ - case WID_SA_UP: spr->y_offs -= _ctrl_pressed ? 8 : 1; break; - case WID_SA_DOWN: spr->y_offs += _ctrl_pressed ? 8 : 1; break; - case WID_SA_LEFT: spr->x_offs -= _ctrl_pressed ? 8 : 1; break; - case WID_SA_RIGHT: spr->x_offs += _ctrl_pressed ? 8 : 1; break; + case WID_SA_UP: spr->y_offs -= amt; break; + case WID_SA_DOWN: spr->y_offs += amt; break; + case WID_SA_LEFT: spr->x_offs -= amt; break; + case WID_SA_RIGHT: spr->x_offs += amt; break; } /* Of course, we need to redraw the sprite, but where is it used? * Everywhere is a safe bet. */ @@ -1025,6 +1032,13 @@ struct SpriteAlignerWindow : Window { this->SetWidgetLoweredState(widget, SpriteAlignerWindow::crosshair); this->SetDirty(); break; + + default: + if (IsInsideBS(widget, WID_SA_ZOOM, ZOOM_LVL_END)) { + SpriteAlignerWindow::zoom = ZoomLevel(widget - WID_SA_ZOOM); + this->InvalidateData(0, true); + } + break; } } @@ -1053,6 +1067,10 @@ struct SpriteAlignerWindow : Window { this->RaiseWidget(WID_SA_PICKER); this->vscroll->SetCount(_newgrf_debug_sprite_picker.sprites.size()); } + + for (ZoomLevel z = ZOOM_LVL_NORMAL; z < ZOOM_LVL_END; z++) { + this->SetWidgetsLoweredState(SpriteAlignerWindow::zoom == z, WID_SA_ZOOM + z); + } } void OnResize() override @@ -1117,6 +1135,14 @@ static const NWidgetPart _nested_sprite_aligner_widgets[] = { NWidget(WWT_MATRIX, COLOUR_GREY, WID_SA_LIST), SetResize(1, 1), SetMatrixDataTip(1, 0, STR_NULL), SetFill(1, 1), SetScrollbar(WID_SA_SCROLLBAR), NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_SA_SCROLLBAR), EndContainer(), + NWidget(NWID_VERTICAL), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SA_ZOOM + ZOOM_LVL_NORMAL), SetDataTip(STR_CONFIG_SETTING_ZOOM_LVL_MIN, STR_NULL), SetFill(1, 0), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SA_ZOOM + ZOOM_LVL_OUT_2X), SetDataTip(STR_CONFIG_SETTING_ZOOM_LVL_IN_2X, STR_NULL), SetFill(1, 0), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SA_ZOOM + ZOOM_LVL_OUT_4X), SetDataTip(STR_CONFIG_SETTING_ZOOM_LVL_NORMAL, STR_NULL), SetFill(1, 0), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SA_ZOOM + ZOOM_LVL_OUT_8X), SetDataTip(STR_CONFIG_SETTING_ZOOM_LVL_OUT_2X, STR_NULL), SetFill(1, 0), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SA_ZOOM + ZOOM_LVL_OUT_16X), SetDataTip(STR_CONFIG_SETTING_ZOOM_LVL_OUT_4X, STR_NULL), SetFill(1, 0), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SA_ZOOM + ZOOM_LVL_OUT_32X), SetDataTip(STR_CONFIG_SETTING_ZOOM_LVL_OUT_8X, STR_NULL), SetFill(1, 0), + EndContainer(), EndContainer(), EndContainer(), EndContainer(), diff --git a/src/widgets/newgrf_debug_widget.h b/src/widgets/newgrf_debug_widget.h index bed87dc2c1..910d212199 100644 --- a/src/widgets/newgrf_debug_widget.h +++ b/src/widgets/newgrf_debug_widget.h @@ -37,6 +37,8 @@ enum SpriteAlignerWidgets { WID_SA_PICKER, ///< Sprite picker. WID_SA_LIST, ///< Queried sprite list. WID_SA_SCROLLBAR, ///< Scrollbar for sprite list. + WID_SA_ZOOM, ///< Zoom level buttons (from ZOOM_LVL_BEGIN to ZOOM_LVL_END). + WID_SA_ZOOM_LAST = WID_SA_ZOOM + ZOOM_LVL_END - 1, ///< Marker for last zoom level button. WID_SA_RESET_REL, ///< Reset relative sprite offset WID_SA_CENTRE, ///< Toggle centre sprite. WID_SA_CROSSHAIR, ///< Toggle crosshair. From f7380a4d2d8af586ae987dc66737e07235d11488 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 29 Nov 2023 18:02:30 +0000 Subject: [PATCH 019/105] Change: Make NewGRF Sprite Aligner window resizeable. --- src/newgrf_debug_gui.cpp | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/src/newgrf_debug_gui.cpp b/src/newgrf_debug_gui.cpp index a42bf2ca56..e616ede1a9 100644 --- a/src/newgrf_debug_gui.cpp +++ b/src/newgrf_debug_gui.cpp @@ -1090,43 +1090,43 @@ static const NWidgetPart _nested_sprite_aligner_widgets[] = { NWidget(WWT_STICKYBOX, COLOUR_GREY), EndContainer(), NWidget(WWT_PANEL, COLOUR_GREY), - NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0), SetPadding(WidgetDimensions::unscaled.sparse), + NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0), SetPadding(WidgetDimensions::unscaled.sparse_resize), NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_sparse, 0), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(0, WidgetDimensions::unscaled.hsep_normal, 0), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SA_PREVIOUS), SetDataTip(STR_SPRITE_ALIGNER_PREVIOUS_BUTTON, STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP), SetFill(1, 0), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SA_GOTO), SetDataTip(STR_SPRITE_ALIGNER_GOTO_BUTTON, STR_SPRITE_ALIGNER_GOTO_TOOLTIP), SetFill(1, 0), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SA_NEXT), SetDataTip(STR_SPRITE_ALIGNER_NEXT_BUTTON, STR_SPRITE_ALIGNER_NEXT_TOOLTIP), SetFill(1, 0), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SA_PREVIOUS), SetDataTip(STR_SPRITE_ALIGNER_PREVIOUS_BUTTON, STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP), SetFill(1, 0), SetResize(1, 0), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SA_GOTO), SetDataTip(STR_SPRITE_ALIGNER_GOTO_BUTTON, STR_SPRITE_ALIGNER_GOTO_TOOLTIP), SetFill(1, 0), SetResize(1, 0), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SA_NEXT), SetDataTip(STR_SPRITE_ALIGNER_NEXT_BUTTON, STR_SPRITE_ALIGNER_NEXT_TOOLTIP), SetFill(1, 0), SetResize(1, 0), EndContainer(), NWidget(NWID_HORIZONTAL), - NWidget(NWID_SPACER), SetFill(1, 1), + NWidget(NWID_SPACER), SetFill(1, 1), SetResize(1, 0), NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_SA_UP), SetDataTip(SPR_ARROW_UP, STR_SPRITE_ALIGNER_MOVE_TOOLTIP), SetResize(0, 0), SetMinimalSize(11, 11), - NWidget(NWID_SPACER), SetFill(1, 1), + NWidget(NWID_SPACER), SetFill(1, 1), SetResize(1, 0), EndContainer(), NWidget(NWID_HORIZONTAL_LTR), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0), NWidget(NWID_VERTICAL), - NWidget(NWID_SPACER), SetFill(1, 1), + NWidget(NWID_SPACER), SetFill(1, 1), SetResize(0, 1), NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_SA_LEFT), SetDataTip(SPR_ARROW_LEFT, STR_SPRITE_ALIGNER_MOVE_TOOLTIP), SetResize(0, 0), SetMinimalSize(11, 11), - NWidget(NWID_SPACER), SetFill(1, 1), + NWidget(NWID_SPACER), SetFill(1, 1), SetResize(0, 1), EndContainer(), - NWidget(WWT_PANEL, COLOUR_DARK_BLUE, WID_SA_SPRITE), SetDataTip(STR_NULL, STR_SPRITE_ALIGNER_SPRITE_TOOLTIP), + NWidget(WWT_PANEL, COLOUR_DARK_BLUE, WID_SA_SPRITE), SetDataTip(STR_NULL, STR_SPRITE_ALIGNER_SPRITE_TOOLTIP), SetResize(1, 1), SetFill(1, 1), EndContainer(), NWidget(NWID_VERTICAL), - NWidget(NWID_SPACER), SetFill(1, 1), + NWidget(NWID_SPACER), SetFill(1, 1), SetResize(0, 1), NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_SA_RIGHT), SetDataTip(SPR_ARROW_RIGHT, STR_SPRITE_ALIGNER_MOVE_TOOLTIP), SetResize(0, 0), SetMinimalSize(11, 11), - NWidget(NWID_SPACER), SetFill(1, 1), + NWidget(NWID_SPACER), SetFill(1, 1), SetResize(0, 1), EndContainer(), EndContainer(), NWidget(NWID_HORIZONTAL), - NWidget(NWID_SPACER), SetFill(1, 1), + NWidget(NWID_SPACER), SetFill(1, 1), SetResize(1, 0), NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_SA_DOWN), SetDataTip(SPR_ARROW_DOWN, STR_SPRITE_ALIGNER_MOVE_TOOLTIP), SetResize(0, 0), SetMinimalSize(11, 11), - NWidget(NWID_SPACER), SetFill(1, 1), + NWidget(NWID_SPACER), SetFill(1, 1), SetResize(1, 0), EndContainer(), - NWidget(WWT_LABEL, COLOUR_GREY, WID_SA_OFFSETS_ABS), SetDataTip(STR_SPRITE_ALIGNER_OFFSETS_ABS, STR_NULL), SetFill(1, 0), - NWidget(WWT_LABEL, COLOUR_GREY, WID_SA_OFFSETS_REL), SetDataTip(STR_SPRITE_ALIGNER_OFFSETS_REL, STR_NULL), SetFill(1, 0), + NWidget(WWT_LABEL, COLOUR_GREY, WID_SA_OFFSETS_ABS), SetDataTip(STR_SPRITE_ALIGNER_OFFSETS_ABS, STR_NULL), SetFill(1, 0), SetResize(1, 0), + NWidget(WWT_LABEL, COLOUR_GREY, WID_SA_OFFSETS_REL), SetDataTip(STR_SPRITE_ALIGNER_OFFSETS_REL, STR_NULL), SetFill(1, 0), SetResize(1, 0), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(0, WidgetDimensions::unscaled.hsep_normal, 0), - NWidget(WWT_TEXTBTN_2, COLOUR_GREY, WID_SA_CENTRE), SetDataTip(STR_SPRITE_ALIGNER_CENTRE_OFFSET, STR_NULL), SetFill(1, 0), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SA_RESET_REL), SetDataTip(STR_SPRITE_ALIGNER_RESET_BUTTON, STR_SPRITE_ALIGNER_RESET_TOOLTIP), SetFill(1, 0), - NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SA_CROSSHAIR), SetDataTip(STR_SPRITE_ALIGNER_CROSSHAIR, STR_NULL), SetFill(1, 0), + NWidget(WWT_TEXTBTN_2, COLOUR_GREY, WID_SA_CENTRE), SetDataTip(STR_SPRITE_ALIGNER_CENTRE_OFFSET, STR_NULL), SetFill(1, 0), SetResize(1, 0), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SA_RESET_REL), SetDataTip(STR_SPRITE_ALIGNER_RESET_BUTTON, STR_SPRITE_ALIGNER_RESET_TOOLTIP), SetFill(1, 0), SetResize(1, 0), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SA_CROSSHAIR), SetDataTip(STR_SPRITE_ALIGNER_CROSSHAIR, STR_NULL), SetFill(1, 0), SetResize(1, 0), EndContainer(), EndContainer(), NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_sparse, 0), @@ -1145,6 +1145,10 @@ static const NWidgetPart _nested_sprite_aligner_widgets[] = { EndContainer(), EndContainer(), EndContainer(), + NWidget(NWID_HORIZONTAL), + NWidget(NWID_SPACER), SetFill(1, 0), SetResize(1, 0), + NWidget(WWT_RESIZEBOX, COLOUR_GREY), + EndContainer(), EndContainer(), }; From 4d9f335f36071fb5be9116d4ba0f3a160be46a4c Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 30 Nov 2023 17:36:37 +0000 Subject: [PATCH 020/105] Change: Add outline of sprite to sprite aligner. --- src/newgrf_debug_gui.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/newgrf_debug_gui.cpp b/src/newgrf_debug_gui.cpp index e616ede1a9..8b8a1f5431 100644 --- a/src/newgrf_debug_gui.cpp +++ b/src/newgrf_debug_gui.cpp @@ -916,6 +916,11 @@ struct SpriteAlignerWindow : Window { AutoRestoreBackup dpi_backup(_cur_dpi, &new_dpi); DrawSprite(this->current_sprite, PAL_NONE, x, y, nullptr, SpriteAlignerWindow::zoom); + + Rect outline = {0, 0, UnScaleByZoom(spr->width, SpriteAlignerWindow::zoom) - 1, UnScaleByZoom(spr->height, SpriteAlignerWindow::zoom) - 1}; + outline = outline.Translate(x + UnScaleByZoom(spr->x_offs, SpriteAlignerWindow::zoom),y + UnScaleByZoom(spr->y_offs, SpriteAlignerWindow::zoom)); + DrawRectOutline(outline.Expand(1), PC_LIGHT_BLUE, 1, 1); + if (SpriteAlignerWindow::crosshair) { GfxDrawLine(x, 0, x, ir.Height() - 1, PC_WHITE, 1, 1); GfxDrawLine(0, y, ir.Width() - 1, y, PC_WHITE, 1, 1); From dcf730f1f63e5baad9b3fe08779da4ae099a87c1 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 2 Dec 2023 23:28:01 +0000 Subject: [PATCH 021/105] Codechange: Optionally allow passing state to GUIList sorter function. GUIList sorter functions can currently only use global state, which makes per-window-instance sorting difficult. --- src/engine_gui.h | 2 +- src/industry_gui.cpp | 21 +++++++++--------- src/network/network_content_gui.cpp | 2 +- src/network/network_gui.cpp | 2 +- src/newgrf_gui.cpp | 2 +- src/object_gui.cpp | 2 +- src/rail_gui.cpp | 2 +- src/road_gui.cpp | 2 +- src/signs_gui.cpp | 2 +- src/sortlist_type.h | 33 +++++++++++++++++++++++++---- src/station_gui.cpp | 16 +++++++------- src/town_gui.cpp | 20 ++++++++--------- src/vehicle_gui_base.h | 4 ++-- 13 files changed, 67 insertions(+), 43 deletions(-) diff --git a/src/engine_gui.h b/src/engine_gui.h index 56a2409035..21e09b0f9d 100644 --- a/src/engine_gui.h +++ b/src/engine_gui.h @@ -28,7 +28,7 @@ struct GUIEngineListItem { bool operator == (const EngineID &other) const { return this->engine_id == other; } }; -typedef GUIList GUIEngineList; +typedef GUIList GUIEngineList; typedef bool EngList_SortTypeFunction(const GUIEngineListItem&, const GUIEngineListItem&); ///< argument type for #EngList_Sort. void EngList_Sort(GUIEngineList &el, EngList_SortTypeFunction compare); diff --git a/src/industry_gui.cpp b/src/industry_gui.cpp index 530b1a37fb..828ceebcd1 100644 --- a/src/industry_gui.cpp +++ b/src/industry_gui.cpp @@ -1245,7 +1245,7 @@ static const NWidgetPart _nested_industry_directory_widgets[] = { EndContainer(), }; -typedef GUIList &> GUIIndustryList; +typedef GUIList &> GUIIndustryList; /** Special cargo filter criteria */ enum CargoFilterSpecialType { @@ -1315,7 +1315,7 @@ protected: static const StringID sorter_names[]; static GUIIndustryList::SortFunction * const sorter_funcs[]; - GUIIndustryList industries; + GUIIndustryList industries{IndustryDirectoryWindow::produced_cargo_filter}; Scrollbar *vscroll; Scrollbar *hscroll; @@ -1484,7 +1484,7 @@ protected: } /** Sort industries by name */ - static bool IndustryNameSorter(const Industry * const &a, const Industry * const &b) + static bool IndustryNameSorter(const Industry * const &a, const Industry * const &b, const CargoID &) { int r = StrNaturalCompare(a->GetCachedName(), b->GetCachedName()); // Sort by name (natural sorting). if (r == 0) return a->index < b->index; @@ -1492,21 +1492,20 @@ protected: } /** Sort industries by type and name */ - static bool IndustryTypeSorter(const Industry * const &a, const Industry * const &b) + static bool IndustryTypeSorter(const Industry * const &a, const Industry * const &b, const CargoID &filter) { int it_a = 0; while (it_a != NUM_INDUSTRYTYPES && a->type != _sorted_industry_types[it_a]) it_a++; int it_b = 0; while (it_b != NUM_INDUSTRYTYPES && b->type != _sorted_industry_types[it_b]) it_b++; int r = it_a - it_b; - return (r == 0) ? IndustryNameSorter(a, b) : r < 0; + return (r == 0) ? IndustryNameSorter(a, b, filter) : r < 0; } /** Sort industries by production and name */ - static bool IndustryProductionSorter(const Industry * const &a, const Industry * const &b) + static bool IndustryProductionSorter(const Industry * const &a, const Industry * const &b, const CargoID &filter) { - CargoID filter = IndustryDirectoryWindow::produced_cargo_filter; - if (filter == CF_NONE) return IndustryTypeSorter(a, b); + if (filter == CF_NONE) return IndustryTypeSorter(a, b, filter); uint prod_a = 0, prod_b = 0; if (filter == CF_ANY) { @@ -1522,14 +1521,14 @@ protected: } int r = prod_a - prod_b; - return (r == 0) ? IndustryTypeSorter(a, b) : r < 0; + return (r == 0) ? IndustryTypeSorter(a, b, filter) : r < 0; } /** Sort industries by transported cargo and name */ - static bool IndustryTransportedCargoSorter(const Industry * const &a, const Industry * const &b) + static bool IndustryTransportedCargoSorter(const Industry * const &a, const Industry * const &b, const CargoID &filter) { int r = GetCargoTransportedSortValue(a) - GetCargoTransportedSortValue(b); - return (r == 0) ? IndustryNameSorter(a, b) : r < 0; + return (r == 0) ? IndustryNameSorter(a, b, filter) : r < 0; } /** diff --git a/src/network/network_content_gui.cpp b/src/network/network_content_gui.cpp index 2adaacaf88..d201e87338 100644 --- a/src/network/network_content_gui.cpp +++ b/src/network/network_content_gui.cpp @@ -326,7 +326,7 @@ enum ContentListFilterCriteria { /** Window that lists the content that's at the content server */ class NetworkContentListWindow : public Window, ContentCallback { /** List with content infos. */ - typedef GUIList GUIContentList; + typedef GUIList GUIContentList; static const uint EDITBOX_MAX_SIZE = 50; ///< Maximum size of the editbox in characters. diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index 3e084919bc..0955b335f7 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -79,7 +79,7 @@ static DropDownList BuildVisibilityDropDownList() return list; } -typedef GUIList GUIGameServerList; +typedef GUIList GUIGameServerList; typedef int ServerListPosition; static const ServerListPosition SLP_INVALID = -1; diff --git a/src/newgrf_gui.cpp b/src/newgrf_gui.cpp index c6d618e9a2..048ec5222e 100644 --- a/src/newgrf_gui.cpp +++ b/src/newgrf_gui.cpp @@ -602,7 +602,7 @@ static void ShowSavePresetWindow(const char *initial_text); * Window for showing NewGRF files */ struct NewGRFWindow : public Window, NewGRFScanCallback { - typedef GUIList GUIGRFConfigList; + typedef GUIList GUIGRFConfigList; static const uint EDITBOX_MAX_SIZE = 50; diff --git a/src/object_gui.cpp b/src/object_gui.cpp index 8144a810ec..8740a4f25c 100644 --- a/src/object_gui.cpp +++ b/src/object_gui.cpp @@ -45,7 +45,7 @@ enum BuildObjectHotkeys { /** The window used for building objects. */ class BuildObjectWindow : public Window { - typedef GUIList GUIObjectClassList; ///< Type definition for the list to hold available object classes. + typedef GUIList GUIObjectClassList; ///< Type definition for the list to hold available object classes. static const uint EDITBOX_MAX_SIZE = 16; ///< The maximum number of characters for the filter edit box. diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index 8a1efbae41..224eb51643 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -903,7 +903,7 @@ private: Scrollbar *vscroll; ///< Vertical scrollbar of the new station list. Scrollbar *vscroll2; ///< Vertical scrollbar of the matrix with new stations. - typedef GUIList GUIStationClassList; ///< Type definition for the list to hold available station classes. + typedef GUIList GUIStationClassList; ///< Type definition for the list to hold available station classes. static const uint EDITBOX_MAX_SIZE = 16; ///< The maximum number of characters for the filter edit box. diff --git a/src/road_gui.cpp b/src/road_gui.cpp index 0878c5135e..d289753022 100644 --- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -1101,7 +1101,7 @@ private: Scrollbar *vscrollList; ///< Vertical scrollbar of the new station list. Scrollbar *vscrollMatrix; ///< Vertical scrollbar of the station picker matrix. - typedef GUIList GUIRoadStopClassList; ///< Type definition for the list to hold available road stop classes. + typedef GUIList GUIRoadStopClassList; ///< Type definition for the list to hold available road stop classes. static const uint EDITBOX_MAX_SIZE = 16; ///< The maximum number of characters for the filter edit box. diff --git a/src/signs_gui.cpp b/src/signs_gui.cpp index b52b1c3a92..f5ebdb9e8f 100644 --- a/src/signs_gui.cpp +++ b/src/signs_gui.cpp @@ -41,7 +41,7 @@ struct SignList { /** * A GUIList contains signs and uses a StringFilter for filtering. */ - typedef GUIList GUISignList; + typedef GUIList GUISignList; GUISignList signs; diff --git a/src/sortlist_type.h b/src/sortlist_type.h index feb02dce53..d9fc170581 100644 --- a/src/sortlist_type.h +++ b/src/sortlist_type.h @@ -40,12 +40,13 @@ struct Filtering { /** * List template of 'things' \p T to sort in a GUI. * @tparam T Type of data stored in the list to represent each item. + * @tparam P Tyoe of data passed as additional parameter to the sort function. * @tparam F Type of data fed as additional value to the filter function. @see FilterFunction */ -template +template class GUIList : public std::vector { public: - typedef bool SortFunction(const T&, const T&); ///< Signature of sort function. + using SortFunction = std::conditional_t, bool (const T&, const T&), bool (const T&, const T&, const P)>; ///< Signature of sort function. typedef bool CDECL FilterFunction(const T*, F); ///< Signature of filter function. protected: @@ -56,6 +57,11 @@ protected: uint8_t filter_type; ///< what criteria to filter on uint16_t resort_timer; ///< resort list after a given amount of ticks if set + /* If sort parameters are used then params must be a reference, however if not then params cannot be a reference as + * it will not be able to reference anything. */ + using SortParameterReference = std::conditional_t, P, P&>; + const SortParameterReference params; + /** * Check if the list is sortable * @@ -76,13 +82,28 @@ protected: } public: + /* If sort parameters are not used then we don't require a reference to the params. */ + template >* = nullptr> GUIList() : sort_func_list(nullptr), filter_func_list(nullptr), flags(VL_NONE), sort_type(0), filter_type(0), - resort_timer(1) + resort_timer(1), + params(nullptr) + {}; + + /* If sort parameters are used then we require a reference to the params. */ + template >* = nullptr> + GUIList(const P& params) : + sort_func_list(nullptr), + filter_func_list(nullptr), + flags(VL_NONE), + sort_type(0), + filter_type(0), + resort_timer(1), + params(params) {}; /** @@ -258,7 +279,11 @@ public: const bool desc = (this->flags & VL_DESC) != 0; - std::sort(std::vector::begin(), std::vector::end(), [&](const T &a, const T &b) { return desc ? compare(b, a) : compare(a, b); }); + if constexpr (std::is_same_v) { + std::sort(std::vector::begin(), std::vector::end(), [&](const T &a, const T &b) { return desc ? compare(b, a) : compare(a, b); }); + } else { + std::sort(std::vector::begin(), std::vector::end(), [&](const T &a, const T &b) { return desc ? compare(b, a, params) : compare(a, b, params); }); + } return true; } diff --git a/src/station_gui.cpp b/src/station_gui.cpp index 7dcdab6e92..2899829fc4 100644 --- a/src/station_gui.cpp +++ b/src/station_gui.cpp @@ -209,7 +209,7 @@ static void StationsWndShowStationRating(int left, int right, int y, CargoID typ if (w != 0) GfxFillRect(left + padding, y, left + w - 1, y + padding - 1, PC_GREEN); } -typedef GUIList GUIStationList; +typedef GUIList GUIStationList; /** * The list of stations per company. @@ -228,7 +228,7 @@ protected: static const StringID sorter_names[]; static GUIStationList::SortFunction * const sorter_funcs[]; - GUIStationList stations; + GUIStationList stations{cargo_filter}; Scrollbar *vscroll; uint rating_width; @@ -273,7 +273,7 @@ protected: } /** Sort stations by their name */ - static bool StationNameSorter(const Station * const &a, const Station * const &b) + static bool StationNameSorter(const Station * const &a, const Station * const &b, const CargoTypes &) { int r = StrNaturalCompare(a->GetCachedName(), b->GetCachedName()); // Sort by name (natural sorting). if (r == 0) return a->index < b->index; @@ -281,13 +281,13 @@ protected: } /** Sort stations by their type */ - static bool StationTypeSorter(const Station * const &a, const Station * const &b) + static bool StationTypeSorter(const Station * const &a, const Station * const &b, const CargoTypes &) { return a->facilities < b->facilities; } /** Sort stations by their waiting cargo */ - static bool StationWaitingTotalSorter(const Station * const &a, const Station * const &b) + static bool StationWaitingTotalSorter(const Station * const &a, const Station * const &b, const CargoTypes &cargo_filter) { int diff = 0; @@ -299,7 +299,7 @@ protected: } /** Sort stations by their available waiting cargo */ - static bool StationWaitingAvailableSorter(const Station * const &a, const Station * const &b) + static bool StationWaitingAvailableSorter(const Station * const &a, const Station * const &b, const CargoTypes &cargo_filter) { int diff = 0; @@ -311,7 +311,7 @@ protected: } /** Sort stations by their rating */ - static bool StationRatingMaxSorter(const Station * const &a, const Station * const &b) + static bool StationRatingMaxSorter(const Station * const &a, const Station * const &b, const CargoTypes &cargo_filter) { byte maxr1 = 0; byte maxr2 = 0; @@ -325,7 +325,7 @@ protected: } /** Sort stations by their rating */ - static bool StationRatingMinSorter(const Station * const &a, const Station * const &b) + static bool StationRatingMinSorter(const Station * const &a, const Station * const &b, const CargoTypes &cargo_filter) { byte minr1 = 255; byte minr2 = 255; diff --git a/src/town_gui.cpp b/src/town_gui.cpp index 19c28fcb46..c7c33cddb3 100644 --- a/src/town_gui.cpp +++ b/src/town_gui.cpp @@ -47,7 +47,7 @@ TownKdtree _town_local_authority_kdtree(&Kdtree_TownXYFunc); -typedef GUIList GUITownList; +typedef GUIList GUITownList; static const NWidgetPart _nested_town_authority_widgets[] = { NWidget(NWID_HORIZONTAL), @@ -707,7 +707,7 @@ private: StringFilter string_filter; ///< Filter for towns QueryString townname_editbox; ///< Filter editbox - GUITownList towns; + GUITownList towns{TownDirectoryWindow::last_sorting.order}; Scrollbar *vscroll; @@ -736,31 +736,31 @@ private: } /** Sort by town name */ - static bool TownNameSorter(const Town * const &a, const Town * const &b) + static bool TownNameSorter(const Town * const &a, const Town * const &b, const bool &) { return StrNaturalCompare(a->GetCachedName(), b->GetCachedName()) < 0; // Sort by name (natural sorting). } /** Sort by population (default descending, as big towns are of the most interest). */ - static bool TownPopulationSorter(const Town * const &a, const Town * const &b) + static bool TownPopulationSorter(const Town * const &a, const Town * const &b, const bool &order) { uint32_t a_population = a->cache.population; uint32_t b_population = b->cache.population; - if (a_population == b_population) return TownDirectoryWindow::TownNameSorter(a, b); + if (a_population == b_population) return TownDirectoryWindow::TownNameSorter(a, b, order); return a_population < b_population; } /** Sort by town rating */ - static bool TownRatingSorter(const Town * const &a, const Town * const &b) + static bool TownRatingSorter(const Town * const &a, const Town * const &b, const bool &order) { - bool before = !TownDirectoryWindow::last_sorting.order; // Value to get 'a' before 'b'. + bool before = !order; // Value to get 'a' before 'b'. /* Towns without rating are always after towns with rating. */ if (HasBit(a->have_ratings, _local_company)) { if (HasBit(b->have_ratings, _local_company)) { int16_t a_rating = a->ratings[_local_company]; int16_t b_rating = b->ratings[_local_company]; - if (a_rating == b_rating) return TownDirectoryWindow::TownNameSorter(a, b); + if (a_rating == b_rating) return TownDirectoryWindow::TownNameSorter(a, b, order); return a_rating < b_rating; } return before; @@ -768,8 +768,8 @@ private: if (HasBit(b->have_ratings, _local_company)) return !before; /* Sort unrated towns always on ascending town name. */ - if (before) return TownDirectoryWindow::TownNameSorter(a, b); - return TownDirectoryWindow::TownNameSorter(b, a); + if (before) return TownDirectoryWindow::TownNameSorter(a, b, order); + return TownDirectoryWindow::TownNameSorter(b, a, order); } public: diff --git a/src/vehicle_gui_base.h b/src/vehicle_gui_base.h index a20bbd802c..734053949c 100644 --- a/src/vehicle_gui_base.h +++ b/src/vehicle_gui_base.h @@ -19,7 +19,7 @@ #include "window_gui.h" #include "widgets/dropdown_type.h" -typedef GUIList GUIVehicleList; +typedef GUIList GUIVehicleList; struct GUIVehicleGroup { VehicleList::const_iterator vehicles_begin; ///< Pointer to beginning element of this vehicle group. @@ -62,7 +62,7 @@ struct GUIVehicleGroup { } }; -typedef GUIList GUIVehicleGroupList; +typedef GUIList GUIVehicleGroupList; struct BaseVehicleListWindow : public Window { From 07a8bd21e4c652619836e8be92f269a031dc0fd9 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 3 Dec 2023 08:36:15 +0000 Subject: [PATCH 022/105] Fix: Make station list filters use per-window state instead of global state. Changing filters with multiple windows open would have unexpected effects leading to inconsistent state. Now state is loaded and saved when the window is opened and closed, so state is still persistent. --- src/station_gui.cpp | 87 +++++++++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 39 deletions(-) diff --git a/src/station_gui.cpp b/src/station_gui.cpp index 2899829fc4..164c8fcfd5 100644 --- a/src/station_gui.cpp +++ b/src/station_gui.cpp @@ -218,17 +218,26 @@ class CompanyStationsWindow : public Window { protected: /* Runtime saved values */ - static Listing last_sorting; - static byte facilities; // types of stations of interest - static bool include_empty; // whether we should include stations without waiting cargo - static const CargoTypes cargo_filter_max; - static CargoTypes cargo_filter; // bitmap of cargo types to include + struct FilterState { + Listing last_sorting; + byte facilities; ///< types of stations of interest + bool include_empty; ///< whether we should include stations without waiting cargo + CargoTypes cargoes; ///< bitmap of cargo types to include + }; + + static inline FilterState initial_state = { + {false, 0}, + FACIL_TRAIN | FACIL_TRUCK_STOP | FACIL_BUS_STOP | FACIL_AIRPORT | FACIL_DOCK, + true, + ALL_CARGOTYPES, + }; /* Constants for sorting stations */ static const StringID sorter_names[]; static GUIStationList::SortFunction * const sorter_funcs[]; - GUIStationList stations{cargo_filter}; + FilterState filter; + GUIStationList stations{filter.cargoes}; Scrollbar *vscroll; uint rating_width; @@ -247,19 +256,19 @@ protected: for (const Station *st : Station::Iterate()) { if (st->owner == owner || (st->owner == OWNER_NONE && HasStationInUse(st->index, true, owner))) { - if (this->facilities & st->facilities) { // only stations with selected facilities + if (this->filter.facilities & st->facilities) { // only stations with selected facilities int num_waiting_cargo = 0; for (CargoID j = 0; j < NUM_CARGO; j++) { if (st->goods[j].HasRating()) { num_waiting_cargo++; // count number of waiting cargo - if (HasBit(this->cargo_filter, j)) { + if (HasBit(this->filter.cargoes, j)) { this->stations.push_back(st); break; } } } /* stations without waiting cargo */ - if (num_waiting_cargo == 0 && this->include_empty) { + if (num_waiting_cargo == 0 && this->filter.include_empty) { this->stations.push_back(st); } } @@ -350,8 +359,12 @@ protected: public: CompanyStationsWindow(WindowDesc *desc, WindowNumber window_number) : Window(desc) { - this->stations.SetListing(this->last_sorting); - this->stations.SetSortFuncs(this->sorter_funcs); + /* Load initial filter state. */ + this->filter = CompanyStationsWindow::initial_state; + if (this->filter.cargoes == ALL_CARGOTYPES) this->filter.cargoes = _cargo_mask; + + this->stations.SetListing(this->filter.last_sorting); + this->stations.SetSortFuncs(CompanyStationsWindow::sorter_funcs); this->stations.ForceRebuild(); this->stations.NeedResort(); this->SortStationsList(); @@ -363,25 +376,27 @@ public: uint8_t index = 0; for (const CargoSpec *cs : _sorted_standard_cargo_specs) { - if (HasBit(this->cargo_filter, cs->Index())) { + if (HasBit(this->filter.cargoes, cs->Index())) { this->LowerWidget(WID_STL_CARGOSTART + index); } index++; } - if (this->cargo_filter == this->cargo_filter_max) this->cargo_filter = _cargo_mask; + if (this->filter.cargoes == ALL_CARGOTYPES) this->filter.cargoes = _cargo_mask; for (uint i = 0; i < 5; i++) { - if (HasBit(this->facilities, i)) this->LowerWidget(i + WID_STL_TRAIN); + if (HasBit(this->filter.facilities, i)) this->LowerWidget(i + WID_STL_TRAIN); } - this->SetWidgetLoweredState(WID_STL_NOCARGOWAITING, this->include_empty); + this->SetWidgetLoweredState(WID_STL_NOCARGOWAITING, this->filter.include_empty); this->GetWidget(WID_STL_SORTDROPBTN)->widget_data = this->sorter_names[this->stations.SortType()]; } ~CompanyStationsWindow() { - this->last_sorting = this->stations.GetListing(); + /* Save filter state. */ + this->filter.last_sorting = this->stations.GetListing(); + CompanyStationsWindow::initial_state = this->filter; } void UpdateWidgetSize(int widget, Dimension *size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension *fill, [[maybe_unused]] Dimension *resize) override @@ -397,8 +412,8 @@ public: case WID_STL_SORTDROPBTN: { Dimension d = {0, 0}; - for (int i = 0; this->sorter_names[i] != INVALID_STRING_ID; i++) { - d = maxdim(d, GetStringBoundingBox(this->sorter_names[i])); + for (int i = 0; CompanyStationsWindow::sorter_names[i] != INVALID_STRING_ID; i++) { + d = maxdim(d, GetStringBoundingBox(CompanyStationsWindow::sorter_names[i])); } d.width += padding.width; d.height += padding.height; @@ -502,7 +517,7 @@ public: if (widget >= WID_STL_CARGOSTART) { Rect br = r.Shrink(WidgetDimensions::scaled.bevel); const CargoSpec *cs = _sorted_cargo_specs[widget - WID_STL_CARGOSTART]; - int cg_ofst = HasBit(this->cargo_filter, cs->Index()) ? WidgetDimensions::scaled.pressed : 0; + int cg_ofst = HasBit(this->filter.cargoes, cs->Index()) ? WidgetDimensions::scaled.pressed : 0; br = br.Translate(cg_ofst, cg_ofst); GfxFillRect(br, cs->rating_colour); TextColour tc = GetContrastColour(cs->rating_colour); @@ -545,13 +560,13 @@ public: case WID_STL_AIRPLANE: case WID_STL_SHIP: if (_ctrl_pressed) { - ToggleBit(this->facilities, widget - WID_STL_TRAIN); + ToggleBit(this->filter.facilities, widget - WID_STL_TRAIN); this->ToggleWidgetLoweredState(widget); } else { - for (uint i : SetBitIterator(this->facilities)) { + for (uint i : SetBitIterator(this->filter.facilities)) { this->RaiseWidget(i + WID_STL_TRAIN); } - this->facilities = 1 << (widget - WID_STL_TRAIN); + this->filter.facilities = 1 << (widget - WID_STL_TRAIN); this->LowerWidget(widget); } this->stations.ForceRebuild(); @@ -563,7 +578,7 @@ public: this->LowerWidget(i); } - this->facilities = FACIL_TRAIN | FACIL_TRUCK_STOP | FACIL_BUS_STOP | FACIL_AIRPORT | FACIL_DOCK; + this->filter.facilities = FACIL_TRAIN | FACIL_TRUCK_STOP | FACIL_BUS_STOP | FACIL_AIRPORT | FACIL_DOCK; this->stations.ForceRebuild(); this->SetDirty(); break; @@ -574,8 +589,8 @@ public: } this->LowerWidget(WID_STL_NOCARGOWAITING); - this->cargo_filter = _cargo_mask; - this->include_empty = true; + this->filter.cargoes = _cargo_mask; + this->filter.include_empty = true; this->stations.ForceRebuild(); this->SetDirty(); break; @@ -592,15 +607,15 @@ public: case WID_STL_NOCARGOWAITING: if (_ctrl_pressed) { - this->include_empty = !this->include_empty; + this->filter.include_empty = !this->filter.include_empty; this->ToggleWidgetLoweredState(WID_STL_NOCARGOWAITING); } else { for (uint i = 0; i < _sorted_standard_cargo_specs.size(); i++) { this->RaiseWidget(WID_STL_CARGOSTART + i); } - this->cargo_filter = 0; - this->include_empty = true; + this->filter.cargoes = 0; + this->filter.include_empty = true; this->LowerWidget(WID_STL_NOCARGOWAITING); } @@ -614,7 +629,7 @@ public: const CargoSpec *cs = _sorted_cargo_specs[widget - WID_STL_CARGOSTART]; if (_ctrl_pressed) { - ToggleBit(this->cargo_filter, cs->Index()); + ToggleBit(this->filter.cargoes, cs->Index()); this->ToggleWidgetLoweredState(widget); } else { for (uint i = 0; i < _sorted_standard_cargo_specs.size(); i++) { @@ -622,10 +637,10 @@ public: } this->RaiseWidget(WID_STL_NOCARGOWAITING); - this->cargo_filter = 0; - this->include_empty = false; + this->filter.cargoes = 0; + this->filter.include_empty = false; - SetBit(this->cargo_filter, cs->Index()); + SetBit(this->filter.cargoes, cs->Index()); this->LowerWidget(widget); } this->stations.ForceRebuild(); @@ -642,7 +657,7 @@ public: this->stations.SetSortType(index); /* Display the current sort variant */ - this->GetWidget(WID_STL_SORTDROPBTN)->widget_data = this->sorter_names[this->stations.SortType()]; + this->GetWidget(WID_STL_SORTDROPBTN)->widget_data = CompanyStationsWindow::sorter_names[this->stations.SortType()]; this->SetDirty(); } @@ -678,12 +693,6 @@ public: } }; -Listing CompanyStationsWindow::last_sorting = {false, 0}; -byte CompanyStationsWindow::facilities = FACIL_TRAIN | FACIL_TRUCK_STOP | FACIL_BUS_STOP | FACIL_AIRPORT | FACIL_DOCK; -bool CompanyStationsWindow::include_empty = true; -const CargoTypes CompanyStationsWindow::cargo_filter_max = ALL_CARGOTYPES; -CargoTypes CompanyStationsWindow::cargo_filter = ALL_CARGOTYPES; - /* Available station sorting functions */ GUIStationList::SortFunction * const CompanyStationsWindow::sorter_funcs[] = { &StationNameSorter, From 06b1bd3da493b023e8282b8a0a597a37d6d3a788 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Guilloux?= Date: Mon, 4 Dec 2023 13:55:52 +0100 Subject: [PATCH 023/105] Fix: [CI] Don't let SDL2 dependencies install too much stuff (#11537) --- .github/workflows/release-linux.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/release-linux.yml b/.github/workflows/release-linux.yml index 0044ea14ad..e267a4afa6 100644 --- a/.github/workflows/release-linux.yml +++ b/.github/workflows/release-linux.yml @@ -117,6 +117,12 @@ jobs: /vcpkg/vcpkg install python3 ln -sf /vcpkg/installed/x64-linux/tools/python3/python3.[0-9][0-9] /usr/bin/python3 + # SDL2 needs dbus, but dbus default install comes with libsystemd + # and some of libsystemd deps fail to build on our quite old linux. + # So just install basic dbus without any extra deps. + /vcpkg/vcpkg install dbus[core] + + # Now we can install OpenTTD dependencies /vcpkg/vcpkg install \ breakpad \ curl[http2] \ From db65d763f7ff9eb812ce9104b8ba69103d29b801 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Guilloux?= Date: Mon, 4 Dec 2023 17:41:02 +0100 Subject: [PATCH 024/105] Change: [CMake] Use explicit list for grf source files (#11539) --- cmake/CreateGrfCommand.cmake | 7 ++-- media/baseset/openttd/CMakeLists.txt | 44 ++++++++++++++++++++++++- media/baseset/orig_extra/CMakeLists.txt | 31 ++++++++++++++--- 3 files changed, 72 insertions(+), 10 deletions(-) diff --git a/cmake/CreateGrfCommand.cmake b/cmake/CreateGrfCommand.cmake index 642fffb27f..02a7e8cd61 100644 --- a/cmake/CreateGrfCommand.cmake +++ b/cmake/CreateGrfCommand.cmake @@ -1,16 +1,13 @@ # Macro which contains all bits and pieces to create a single grf file based # on NFO and PNG files. # -# create_grf_command() +# create_grf_command(NFO_SOURCE_FILES nfo_file1 ... PNG_SOURCE_FILES png_file1 ...) # function(create_grf_command) - set(EXTRA_PNG_SOURCE_FILES ${ARGV}) + cmake_parse_arguments(GRF "" "" "NFO_SOURCE_FILES;PNG_SOURCE_FILES" ${ARGN}) get_filename_component(GRF_SOURCE_FOLDER_NAME "${CMAKE_CURRENT_SOURCE_DIR}" NAME) get_filename_component(GRF_BINARY_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../${GRF_SOURCE_FOLDER_NAME}.grf ABSOLUTE) - file(GLOB_RECURSE GRF_PNG_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.png) - file(GLOB_RECURSE GRF_NFO_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.nfo) - set(GRF_PNG_SOURCE_FILES ${GRF_PNG_SOURCE_FILES} ${EXTRA_PNG_SOURCE_FILES}) # Copy over all the PNG files to the correct folder foreach(GRF_PNG_SOURCE_FILE IN LISTS GRF_PNG_SOURCE_FILES) diff --git a/media/baseset/openttd/CMakeLists.txt b/media/baseset/openttd/CMakeLists.txt index 5a98b73f5c..30844b8804 100644 --- a/media/baseset/openttd/CMakeLists.txt +++ b/media/baseset/openttd/CMakeLists.txt @@ -5,5 +5,47 @@ # working on it / have the tools installed. if(GRFCODEC_FOUND) include(CreateGrfCommand) - create_grf_command() + create_grf_command( + NFO_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/airports.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/airport_preview.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/aqueduct.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/autorail.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/canals.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/chars.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/elrails.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/foundations.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/mono.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/oneway.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/openttd.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/openttdgui.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/palette.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/roadstops.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/signals.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/sloped_tracks.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/tramtracks.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/tunnel_portals.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/2ccmap.nfo + PNG_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/airports.png + ${CMAKE_CURRENT_SOURCE_DIR}/airport_preview.png + ${CMAKE_CURRENT_SOURCE_DIR}/aqueduct.png + ${CMAKE_CURRENT_SOURCE_DIR}/autorail.png + ${CMAKE_CURRENT_SOURCE_DIR}/canals.png + ${CMAKE_CURRENT_SOURCE_DIR}/canal_locks.png + ${CMAKE_CURRENT_SOURCE_DIR}/chars.png + ${CMAKE_CURRENT_SOURCE_DIR}/elrails.png + ${CMAKE_CURRENT_SOURCE_DIR}/foundations.png + ${CMAKE_CURRENT_SOURCE_DIR}/mono.png + ${CMAKE_CURRENT_SOURCE_DIR}/oneway.png + ${CMAKE_CURRENT_SOURCE_DIR}/openttdgui.png + ${CMAKE_CURRENT_SOURCE_DIR}/openttdgui_build_tram.png + ${CMAKE_CURRENT_SOURCE_DIR}/openttdgui_convert_road.png + ${CMAKE_CURRENT_SOURCE_DIR}/openttdgui_convert_tram.png + ${CMAKE_CURRENT_SOURCE_DIR}/openttdgui_group_livery.png + ${CMAKE_CURRENT_SOURCE_DIR}/roadstops.png + ${CMAKE_CURRENT_SOURCE_DIR}/signals.png + ${CMAKE_CURRENT_SOURCE_DIR}/sloped_tracks.png + ${CMAKE_CURRENT_SOURCE_DIR}/tramtracks.png + ${CMAKE_CURRENT_SOURCE_DIR}/tramtracks_bare_depot.png + ${CMAKE_CURRENT_SOURCE_DIR}/tunnel_portals.png + ) endif() diff --git a/media/baseset/orig_extra/CMakeLists.txt b/media/baseset/orig_extra/CMakeLists.txt index f71d8d4b49..ceae83ca70 100644 --- a/media/baseset/orig_extra/CMakeLists.txt +++ b/media/baseset/orig_extra/CMakeLists.txt @@ -6,9 +6,32 @@ if(GRFCODEC_FOUND) include(CreateGrfCommand) create_grf_command( - # We share some files with 'openttd' grf - ${CMAKE_CURRENT_SOURCE_DIR}/../openttd/airports.png - ${CMAKE_CURRENT_SOURCE_DIR}/../openttd/canals.png - ${CMAKE_CURRENT_SOURCE_DIR}/../openttd/chars.png + NFO_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/rivers/arctic.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/rivers/rapids.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/rivers/temperate.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/rivers/toyland.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/rivers/tropic.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/airports_orig_extra.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/canals_extra.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/chars_orig_extra.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/fix_graphics.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/fix_gui_icons.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/orig_extra.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/shore.nfo + PNG_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/rivers/arctic_brown.png + ${CMAKE_CURRENT_SOURCE_DIR}/rivers/arctic_snowy.png + ${CMAKE_CURRENT_SOURCE_DIR}/rivers/rapids.png + ${CMAKE_CURRENT_SOURCE_DIR}/rivers/rapids_shading.png + ${CMAKE_CURRENT_SOURCE_DIR}/rivers/temperate.png + ${CMAKE_CURRENT_SOURCE_DIR}/rivers/toyland.png + ${CMAKE_CURRENT_SOURCE_DIR}/rivers/tropic_desert.png + ${CMAKE_CURRENT_SOURCE_DIR}/rivers/tropic_forest.png + ${CMAKE_CURRENT_SOURCE_DIR}/fix_graphics.png + ${CMAKE_CURRENT_SOURCE_DIR}/fix_gui_icons.png + ${CMAKE_CURRENT_SOURCE_DIR}/shore.png + # We share some files with 'openttd' grf + ${CMAKE_CURRENT_SOURCE_DIR}/../openttd/airports.png + ${CMAKE_CURRENT_SOURCE_DIR}/../openttd/canals.png + ${CMAKE_CURRENT_SOURCE_DIR}/../openttd/chars.png ) endif() From e749bbefe5951c727325e1c57b5d1b637d6fe04a Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 4 Dec 2023 18:16:09 +0000 Subject: [PATCH 025/105] Change: Show rating in station list even with no cargo waiting. (#11540) e745bd9 (r21144) changed the filter from cargo waiting to rating, which makes the station list display appear inconsistent with the cargo filter selection. --- src/station_gui.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/station_gui.cpp b/src/station_gui.cpp index 164c8fcfd5..cdf0588fcc 100644 --- a/src/station_gui.cpp +++ b/src/station_gui.cpp @@ -487,7 +487,7 @@ public: /* show cargo waiting and station ratings */ for (const CargoSpec *cs : _sorted_standard_cargo_specs) { CargoID cid = cs->Index(); - if (st->goods[cid].cargo.TotalCount() > 0) { + if (st->goods[cid].HasRating()) { /* For RTL we work in exactly the opposite direction. So * decrement the space needed first, then draw to the left * instead of drawing to the left and then incrementing From 7d0ce826db1309e42d4ae4d118cd94b3ad1e2db4 Mon Sep 17 00:00:00 2001 From: translators Date: Mon, 4 Dec 2023 18:38:44 +0000 Subject: [PATCH 026/105] Update: Translations from eints english (au): 5 changes by krysclarke english (us): 5 changes by 2TallTyler korean: 5 changes by telk5093 russian: 5 changes by Ln-Wolf catalan: 5 changes by J0anJosep french: 5 changes by glx22 --- src/lang/catalan.txt | 7 +++++-- src/lang/english_AU.txt | 7 +++++-- src/lang/english_US.txt | 7 +++++-- src/lang/french.txt | 7 +++++-- src/lang/korean.txt | 7 +++++-- src/lang/russian.txt | 7 +++++-- 6 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index b0818882d1..959bfa89af 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -2582,7 +2582,7 @@ STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}Cerca co STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}Esteu sortint de l'OpenTTD. STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}Els termes i condicions per descarregar contingut des de webs externes varia.{}Haureu d'adreçar-vos a les webs externes per trobar instruccions sobre com instal·lar contingut a l'OpenTTD.{}Voleu continuar? STR_CONTENT_FILTER_TITLE :{BLACK}Marca/anomena filtre: -STR_CONTENT_OPEN_URL :{BLACK}Visita la web +STR_CONTENT_OPEN_URL :{BLACK}Lloc web STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}Visita la web per accedir a aquest contingut STR_CONTENT_DOWNLOAD_CAPTION :{BLACK}Descarrega STR_CONTENT_DOWNLOAD_CAPTION_TOOLTIP :{BLACK}Comença a descarregar el contingut seleccionat @@ -4708,9 +4708,12 @@ STR_TEXTFILE_NAVBACK_TOOLTIP :{BLACK}Torneu e STR_TEXTFILE_NAVFORWARD_TOOLTIP :{BLACK}Aneu avant segons l'historial de navegació. STR_TEXTFILE_WRAP_TEXT :{WHITE}Ajusta text STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Ajusta el text afegint-hi canvis de línia, de manera que sigui més fàcil desplaçar-se pel text -STR_TEXTFILE_VIEW_README :{BLACK}Veure llegeix-me +STR_TEXTFILE_VIEW_README :{BLACK}Llegeix-me +STR_TEXTFILE_VIEW_README_TOOLTIP :Mostra el fitxer d'informació d'aquest contingut STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Registre de canvis +STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP :Mostra el registre de canvis d'aquest contingut STR_TEXTFILE_VIEW_LICENCE :{BLACK}Llicència +STR_TEXTFILE_VIEW_LICENCE_TOOLTIP :Mostra la llicència d'aquest contingut ###length 5 STR_TEXTFILE_README_CAPTION :{WHITE}Llegeix-me del {STRING} de {STRING} STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}Registre de canvis del {STRING} de {STRING} diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index a00ba4f135..926e760f72 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -2581,7 +2581,7 @@ STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}Search c STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}You are leaving OpenTTD! STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}The terms and conditions for downloading content from external websites vary.{}You will have to refer to the external sites for instructions how to install the content into OpenTTD.{}Do you want to continue? STR_CONTENT_FILTER_TITLE :{BLACK}Tag/name filter: -STR_CONTENT_OPEN_URL :{BLACK}Visit website +STR_CONTENT_OPEN_URL :{BLACK}Website STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}Visit the website for this content STR_CONTENT_DOWNLOAD_CAPTION :{BLACK}Download STR_CONTENT_DOWNLOAD_CAPTION_TOOLTIP :{BLACK}Start downloading the selected content @@ -4707,9 +4707,12 @@ STR_TEXTFILE_NAVBACK_TOOLTIP :{BLACK}Go back STR_TEXTFILE_NAVFORWARD_TOOLTIP :{BLACK}Return forward in navigation history STR_TEXTFILE_WRAP_TEXT :{WHITE}Wrap text STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Wrap the text of the window so it all fits without having to scroll -STR_TEXTFILE_VIEW_README :{BLACK}View readme +STR_TEXTFILE_VIEW_README :{BLACK}Readme +STR_TEXTFILE_VIEW_README_TOOLTIP :View readme for this content STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Changelog +STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP :View changelog for this content STR_TEXTFILE_VIEW_LICENCE :{BLACK}License +STR_TEXTFILE_VIEW_LICENCE_TOOLTIP :View licence for this content ###length 5 STR_TEXTFILE_README_CAPTION :{WHITE}{STRING} readme of {STRING} STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING} changelog of {STRING} diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index 315e851f3b..54ba1e140a 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -2581,7 +2581,7 @@ STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}Search c STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}You are leaving OpenTTD! STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}The terms and conditions for downloading content from external websites vary.{}You will have to refer to the external sites for instructions how to install the content into OpenTTD.{}Do you want to continue? STR_CONTENT_FILTER_TITLE :{BLACK}Tag/name filter: -STR_CONTENT_OPEN_URL :{BLACK}Visit website +STR_CONTENT_OPEN_URL :{BLACK}Website STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}Visit the website for this content STR_CONTENT_DOWNLOAD_CAPTION :{BLACK}Download STR_CONTENT_DOWNLOAD_CAPTION_TOOLTIP :{BLACK}Start downloading the selected content @@ -4707,9 +4707,12 @@ STR_TEXTFILE_NAVBACK_TOOLTIP :{BLACK}Go back STR_TEXTFILE_NAVFORWARD_TOOLTIP :{BLACK}Return forward in navigation history STR_TEXTFILE_WRAP_TEXT :{WHITE}Wrap text STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Wrap the text of the window so it all fits without having to scroll -STR_TEXTFILE_VIEW_README :{BLACK}View readme +STR_TEXTFILE_VIEW_README :{BLACK}Readme +STR_TEXTFILE_VIEW_README_TOOLTIP :View readme for this content STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Changelog +STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP :View changelog for this content STR_TEXTFILE_VIEW_LICENCE :{BLACK}License +STR_TEXTFILE_VIEW_LICENCE_TOOLTIP :View license for this content ###length 5 STR_TEXTFILE_README_CAPTION :{WHITE}{STRING} readme of {STRING} STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING} changelog of {STRING} diff --git a/src/lang/french.txt b/src/lang/french.txt index 4bb33af182..a088fd449c 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -2582,7 +2582,7 @@ STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}Chercher STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}Vous quittez OpenTTD{NBSP}! STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}Les termes et conditions du téléchargement de contenu depuis des sites externes varient.{}Vous devrez vous référer aux sites externes pour les instructions d'installation du contenu dans OpenTTD.{}Voulez-vous continuer{NBSP}? STR_CONTENT_FILTER_TITLE :{BLACK}Filtre sur les étiquettes/le nom{NBSP}: -STR_CONTENT_OPEN_URL :{BLACK}Visiter le site web +STR_CONTENT_OPEN_URL :{BLACK}Site web STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}Visiter le site web pour ce module STR_CONTENT_DOWNLOAD_CAPTION :{BLACK}Télécharger STR_CONTENT_DOWNLOAD_CAPTION_TOOLTIP :{BLACK}Démarrer le téléchargement des modules sélectionnés @@ -4708,9 +4708,12 @@ STR_TEXTFILE_NAVBACK_TOOLTIP :{BLACK}Reculer STR_TEXTFILE_NAVFORWARD_TOOLTIP :{BLACK}Avancer dans l'historique de navigation STR_TEXTFILE_WRAP_TEXT :{WHITE}Retour à la ligne automatique STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Insérer des retours à la ligne dans le texte de la fenêtre afin qu'il s'affiche entièrement sans faire défiler -STR_TEXTFILE_VIEW_README :{BLACK}Voir le Lisez-moi +STR_TEXTFILE_VIEW_README :{BLACK}Lisez-moi +STR_TEXTFILE_VIEW_README_TOOLTIP :Afficher le lisez-moi pour ce contenu STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Journal des modifications +STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP :Afficher le journal des modifications pour ce contenu STR_TEXTFILE_VIEW_LICENCE :{BLACK}Licence +STR_TEXTFILE_VIEW_LICENCE_TOOLTIP :Afficher la licence pour ce contenu ###length 5 STR_TEXTFILE_README_CAPTION :{WHITE}Lisez-moi du module {STRING} {STRING} STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}Journal des modifications pour le module {STRING} {STRING} diff --git a/src/lang/korean.txt b/src/lang/korean.txt index a255ccdadf..fdb3f55a10 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -2582,7 +2582,7 @@ STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}OpenTTD STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}OpenTTD를 종료하는 중입니다! STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}외부 웹사이트에서 콘텐츠를 다운로드할 때에는 그에 대한 약관과 조건이 다양합니다.{}이 콘텐츠를 OpenTTD에 설치하는 방법은 외부 사이트에서 찾아보아야 합니다.{}계속하시겠습니까? STR_CONTENT_FILTER_TITLE :{BLACK}태그/이름 검색: -STR_CONTENT_OPEN_URL :{BLACK}웹 사이트 방문 +STR_CONTENT_OPEN_URL :{BLACK}웹 사이트 STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}이 컨텐츠의 웹 사이트를 방문합니다 STR_CONTENT_DOWNLOAD_CAPTION :{BLACK}다운로드 STR_CONTENT_DOWNLOAD_CAPTION_TOOLTIP :{BLACK}선택한 콘텐츠의 다운로드를 시작합니다 @@ -4708,9 +4708,12 @@ STR_TEXTFILE_NAVBACK_TOOLTIP :{BLACK}탐색 STR_TEXTFILE_NAVFORWARD_TOOLTIP :{BLACK}탐색 기록 앞으로 가기 STR_TEXTFILE_WRAP_TEXT :{WHITE}자동 줄 바꿈 STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}본문 내용에 자동 줄 바꿈을 설정하여 스크롤하지 않고도 본문의 모든 내용을 볼 수 있게 합니다. -STR_TEXTFILE_VIEW_README :{BLACK}Readme 보기 +STR_TEXTFILE_VIEW_README :{BLACK}Readme +STR_TEXTFILE_VIEW_README_TOOLTIP :이 콘텐츠의 Readme를 봅니다 STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}변경기록 +STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP :이 콘텐츠의 변경 기록을 봅니다 STR_TEXTFILE_VIEW_LICENCE :{BLACK}저작권 +STR_TEXTFILE_VIEW_LICENCE_TOOLTIP :이 콘텐츠의 라이선스를 봅니다 ###length 5 STR_TEXTFILE_README_CAPTION :{WHITE}{STRING} {STRING}의 Readme STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING} {STRING}의 변경기록 diff --git a/src/lang/russian.txt b/src/lang/russian.txt index 1eb347f757..44f56ae725 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -2732,7 +2732,7 @@ STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}Резу STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}Вы покидаете OpenTTD! STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}Условия загрузки содержимого со сторонних сайтов могут различаться.{}За инструкциями по установке компонентов OpenTTD вам следует обратиться на соответствующие сайты.{}Вы желаете продолжить? STR_CONTENT_FILTER_TITLE :{BLACK}Фильтр: -STR_CONTENT_OPEN_URL :{BLACK}Посетить сайт +STR_CONTENT_OPEN_URL :{BLACK}Веб-сайт STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}Посетить веб-сайт с информацией об этом модуле STR_CONTENT_DOWNLOAD_CAPTION :{BLACK}Скачать STR_CONTENT_DOWNLOAD_CAPTION_TOOLTIP :{BLACK}Начать загрузку выбранного контента @@ -4894,9 +4894,12 @@ STR_TEXTFILE_NAVBACK_TOOLTIP :{BLACK}Наза STR_TEXTFILE_NAVFORWARD_TOOLTIP :{BLACK}Вперёд STR_TEXTFILE_WRAP_TEXT :{WHITE}Переносить текст STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Переносить текст так, чтобы он помещался в окне без необходимости прокрутки -STR_TEXTFILE_VIEW_README :{BLACK}Посмотреть инструкцию +STR_TEXTFILE_VIEW_README :{BLACK}Инструкция +STR_TEXTFILE_VIEW_README_TOOLTIP :Просмотр инструкции STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Список изменений +STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP :Просмотр списка изменений STR_TEXTFILE_VIEW_LICENCE :{BLACK}Лицензия +STR_TEXTFILE_VIEW_LICENCE_TOOLTIP :Просмотр лицензии ###length 5 STR_TEXTFILE_README_CAPTION :{WHITE}Инструкция к {STRING} {STRING} STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}Список изменений к {STRING} {STRING} From e86eb25447a00a098b5de26c13e386e9e95c9f9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Guilloux?= Date: Tue, 5 Dec 2023 15:37:53 +0100 Subject: [PATCH 027/105] Change: [CMake] Use explicit list for regression (#11541) --- CMakeLists.txt | 5 +- cmake/CreateRegression.cmake | 84 +++++++++------------------ regression/CMakeLists.txt | 24 ++++++++ regression/regression/CMakeLists.txt | 8 +++ regression/stationlist/CMakeLists.txt | 7 +++ 5 files changed, 70 insertions(+), 58 deletions(-) create mode 100644 regression/CMakeLists.txt create mode 100644 regression/regression/CMakeLists.txt create mode 100644 regression/stationlist/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 366fe4a136..59ae78d043 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -454,8 +454,9 @@ if(CMAKE_SIZEOF_VOID_P EQUAL 8) add_definitions(-DPOINTER_IS_64BIT) endif() -include(CreateRegression) -create_regression() +enable_testing() + +add_subdirectory(regression) if(APPLE OR WIN32) find_package(Pandoc) diff --git a/cmake/CreateRegression.cmake b/cmake/CreateRegression.cmake index 8e3865bc55..355ced1916 100644 --- a/cmake/CreateRegression.cmake +++ b/cmake/CreateRegression.cmake @@ -3,20 +3,15 @@ # 'ctest'. The first is prefered, as it is more verbose, and takes care of # dependencies correctly. # -# create_regression() +# create_regression(file1 ...) # macro(create_regression) - # Find all the files in the regression folder; they need to be copied to the - # build folder before we can run the regression - file(GLOB_RECURSE REGRESSION_SOURCE_FILES ${CMAKE_SOURCE_DIR}/regression/*) + set(REGRESSION_SOURCE_FILES ${ARGN}) + foreach(REGRESSION_SOURCE_FILE IN LISTS REGRESSION_SOURCE_FILES) string(REPLACE "${CMAKE_SOURCE_DIR}/regression/" "" REGRESSION_SOURCE_FILE_NAME "${REGRESSION_SOURCE_FILE}") string(CONCAT REGRESSION_BINARY_FILE "${CMAKE_BINARY_DIR}/ai/" "${REGRESSION_SOURCE_FILE_NAME}") - if("${REGRESSION_SOURCE_FILE_NAME}" STREQUAL "regression.cfg") - continue() - endif() - add_custom_command(OUTPUT ${REGRESSION_BINARY_FILE} COMMAND ${CMAKE_COMMAND} -E copy ${REGRESSION_SOURCE_FILE} @@ -28,59 +23,36 @@ macro(create_regression) list(APPEND REGRESSION_BINARY_FILES ${REGRESSION_BINARY_FILE}) endforeach() - # Copy the regression configuration in a special folder, so all autogenerated - # folders end up in the same place after running regression. - add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/regression/regression.cfg - COMMAND ${CMAKE_COMMAND} -E copy - ${CMAKE_SOURCE_DIR}/regression/regression.cfg - ${CMAKE_BINARY_DIR}/regression/regression.cfg - MAIN_DEPENDENCY ${CMAKE_SOURCE_DIR}/regression/regression.cfg - COMMENT "Copying ${REGRESSION_SOURCE_FILE_NAME} regression file" - ) - list(APPEND REGRESSION_BINARY_FILES ${CMAKE_BINARY_DIR}/regression/regression.cfg) + get_filename_component(REGRESSION_TEST_NAME "${CMAKE_CURRENT_SOURCE_DIR}" NAME) - # Create a new target which copies all regression files - add_custom_target(regression_files - ALL # this is needed because 'make test' doesn't resolve dependencies, and otherwise this is never executed + # Create a new target which copies regression files + add_custom_target(regression_${REGRESSION_TEST_NAME}_files DEPENDS ${REGRESSION_BINARY_FILES} ) - enable_testing() - - # Find all the tests we have, and create a target for them - file(GLOB REGRESSION_TESTS ${CMAKE_SOURCE_DIR}/regression/*) - foreach(REGRESSION_TEST IN LISTS REGRESSION_TESTS) - get_filename_component(REGRESSION_TEST_NAME "${REGRESSION_TEST}" NAME) - - if("${REGRESSION_TEST_NAME}" STREQUAL "regression.cfg") - continue() - endif() - - add_custom_target(regression_${REGRESSION_TEST_NAME} - COMMAND ${CMAKE_COMMAND} - -DOPENTTD_EXECUTABLE=$ - -DEDITBIN_EXECUTABLE=${EDITBIN_EXECUTABLE} - -DREGRESSION_TEST=${REGRESSION_TEST_NAME} - -P "${CMAKE_SOURCE_DIR}/cmake/scripts/Regression.cmake" - DEPENDS openttd regression_files - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - COMMENT "Running regression test ${REGRESSION_TEST_NAME}" - ) - - # Also make sure that 'make test' runs the regression - add_test(NAME regression_${REGRESSION_TEST_NAME} - COMMAND ${CMAKE_COMMAND} - -DOPENTTD_EXECUTABLE=$ - -DEDITBIN_EXECUTABLE=${EDITBIN_EXECUTABLE} - -DREGRESSION_TEST=${REGRESSION_TEST_NAME} - -P "${CMAKE_SOURCE_DIR}/cmake/scripts/Regression.cmake" - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) + add_dependencies(regression_files regression_${REGRESSION_TEST_NAME}_files) + + add_custom_target(regression_${REGRESSION_TEST_NAME} + COMMAND ${CMAKE_COMMAND} + -DOPENTTD_EXECUTABLE=$ + -DEDITBIN_EXECUTABLE=${EDITBIN_EXECUTABLE} + -DREGRESSION_TEST=${REGRESSION_TEST_NAME} + -P "${CMAKE_SOURCE_DIR}/cmake/scripts/Regression.cmake" + DEPENDS openttd regression_${REGRESSION_TEST_NAME}_files + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + COMMENT "Running regression test ${REGRESSION_TEST_NAME}" + ) - list(APPEND REGRESSION_TARGETS regression_${REGRESSION_TEST_NAME}) - endforeach() + # Also make sure that 'make test' runs the regression + add_test(NAME regression_${REGRESSION_TEST_NAME} + COMMAND ${CMAKE_COMMAND} + -DOPENTTD_EXECUTABLE=$ + -DEDITBIN_EXECUTABLE=${EDITBIN_EXECUTABLE} + -DREGRESSION_TEST=${REGRESSION_TEST_NAME} + -P "${CMAKE_SOURCE_DIR}/cmake/scripts/Regression.cmake" + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + ) - # Create a new target which runs the regression - add_custom_target(regression - DEPENDS ${REGRESSION_TARGETS}) + add_dependencies(regression regression_${REGRESSION_TEST_NAME}) endmacro() diff --git a/regression/CMakeLists.txt b/regression/CMakeLists.txt new file mode 100644 index 0000000000..340e29c2d9 --- /dev/null +++ b/regression/CMakeLists.txt @@ -0,0 +1,24 @@ + # Copy the regression configuration in a special folder, so all autogenerated + # folders end up in the same place after running regression. + add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/regression.cfg + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_CURRENT_SOURCE_DIR}/regression.cfg + ${CMAKE_CURRENT_BINARY_DIR}/regression.cfg + MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/regression.cfg + COMMENT "Copying regression.cfg regression file" + ) + + # Create a new target which copies all regression files + # Subdirectory targets will add themselves as dependencies + add_custom_target(regression_files + ALL # this is needed because 'make test' doesn't resolve dependencies, and otherwise this is never executed + DEPENDS + ${CMAKE_BINARY_DIR}/regression/regression.cfg + ) + + # Create a new target which runs the regression + # Subdirectory targets will add themselves as dependencies + add_custom_target(regression) + + add_subdirectory(regression) + add_subdirectory(stationlist) diff --git a/regression/regression/CMakeLists.txt b/regression/regression/CMakeLists.txt new file mode 100644 index 0000000000..9aab44efe4 --- /dev/null +++ b/regression/regression/CMakeLists.txt @@ -0,0 +1,8 @@ +include(CreateRegression) +create_regression( + ${CMAKE_CURRENT_SOURCE_DIR}/info.nut + ${CMAKE_CURRENT_SOURCE_DIR}/main.nut + ${CMAKE_CURRENT_SOURCE_DIR}/require.nut + ${CMAKE_CURRENT_SOURCE_DIR}/result.txt + ${CMAKE_CURRENT_SOURCE_DIR}/test.sav +) diff --git a/regression/stationlist/CMakeLists.txt b/regression/stationlist/CMakeLists.txt new file mode 100644 index 0000000000..cfbc2cde56 --- /dev/null +++ b/regression/stationlist/CMakeLists.txt @@ -0,0 +1,7 @@ +include(CreateRegression) +create_regression( + ${CMAKE_CURRENT_SOURCE_DIR}/info.nut + ${CMAKE_CURRENT_SOURCE_DIR}/main.nut + ${CMAKE_CURRENT_SOURCE_DIR}/result.txt + ${CMAKE_CURRENT_SOURCE_DIR}/test.sav +) From a92d0da8b4e669c69e33953b8bc545bae92e8243 Mon Sep 17 00:00:00 2001 From: translators Date: Tue, 5 Dec 2023 18:38:33 +0000 Subject: [PATCH 028/105] Update: Translations from eints finnish: 5 changes by hpiirai polish: 5 changes by pAter-exe --- src/lang/finnish.txt | 7 +++++-- src/lang/polish.txt | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index 0b13d27a4c..9b260bc95e 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -2581,7 +2581,7 @@ STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}Etsi Ope STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}Olet poistumassa OpenTTD:stä! STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}Ulkopuolisilta verkkosivuilta ladattaessa käyttöehdot voivat vaihdella.{}Sinun on noudatettava ulkopuolisen sivuston ohjeita sisällön asentamiseksi OpenTTD:hen.{}Haluatko jatkaa? STR_CONTENT_FILTER_TITLE :{BLACK}Suodata avainsanalla tai nimellä: -STR_CONTENT_OPEN_URL :{BLACK}Vieraile verkkosivulla +STR_CONTENT_OPEN_URL :{BLACK}Verkkosivu STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}Vieraile sisällön verkkosivulla STR_CONTENT_DOWNLOAD_CAPTION :{BLACK}Lataa STR_CONTENT_DOWNLOAD_CAPTION_TOOLTIP :{BLACK}Aloita valitun sisällön lataaminen @@ -4707,9 +4707,12 @@ STR_TEXTFILE_NAVBACK_TOOLTIP :{BLACK}Siirry t STR_TEXTFILE_NAVFORWARD_TOOLTIP :{BLACK}Siirry eteenpäin selaushistoriassa STR_TEXTFILE_WRAP_TEXT :{WHITE}Tekstin rivitys STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Rivitä teksti ikkunaan niin, että se näkyy kokonaan rullaamatta -STR_TEXTFILE_VIEW_README :{BLACK}Näytä readme-tiedosto +STR_TEXTFILE_VIEW_README :{BLACK}Readme-tiedosto +STR_TEXTFILE_VIEW_README_TOOLTIP :Katso tämän sisällön readme-tiedosto STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Muutosloki +STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP :Katso tämän sisällön muutosloki STR_TEXTFILE_VIEW_LICENCE :{BLACK}Lisenssi +STR_TEXTFILE_VIEW_LICENCE_TOOLTIP :Katso tämän sisällön lisenssi ###length 5 STR_TEXTFILE_README_CAPTION :{WHITE}{STRING}:n {STRING} readme-tiedosto STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING}:n {STRING} muutosloki diff --git a/src/lang/polish.txt b/src/lang/polish.txt index 53b10fb415..a7b7cfdf1e 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -2961,7 +2961,7 @@ STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}Przeszuk STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}Opuszczasz OpenTTD! STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}Warunki pobierania dodatków z zewnętrznych stron internetowych są inne.{}Będziesz musiał(a) odnieść się do zewnętrznych stron w celu uzyskania wskazówek dotyczących instalacji dodatku w OpenTTD.{}Czy chcesz kontynuować? STR_CONTENT_FILTER_TITLE :{BLACK}Filtr etykiety/nazwy: -STR_CONTENT_OPEN_URL :{BLACK}Wejdź na stronę +STR_CONTENT_OPEN_URL :{BLACK}Strona internetowa STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}Wejdź na stronę, by pobrać tę zawartość STR_CONTENT_DOWNLOAD_CAPTION :{BLACK}Pobierz STR_CONTENT_DOWNLOAD_CAPTION_TOOLTIP :{BLACK}Rozpocznij pobieranie zaznaczonych danych @@ -5093,9 +5093,12 @@ STR_TEXTFILE_NAVBACK_TOOLTIP :{BLACK}Cofnij s STR_TEXTFILE_NAVFORWARD_TOOLTIP :{BLACK}Powrót do przodu w historii nawigacji STR_TEXTFILE_WRAP_TEXT :{WHITE}Zawijaj tekst STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Zawiń tekst w oknie, aby zmieścił się bez konieczności przewijania -STR_TEXTFILE_VIEW_README :{BLACK}Odczytaj plik „readme” +STR_TEXTFILE_VIEW_README :{BLACK}Plik „readme” +STR_TEXTFILE_VIEW_README_TOOLTIP :Wyświetl plik „readme” dla tej zawartości STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Lista zmian +STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP :Wyświetl listę zmian dla tej zawartości STR_TEXTFILE_VIEW_LICENCE :{BLACK}Licencja +STR_TEXTFILE_VIEW_LICENCE_TOOLTIP :Wyświetl licencję dla tej zawartości ###length 5 STR_TEXTFILE_README_CAPTION :{WHITE}{STRING} {STRING} - plik „readme” STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING} {STRING} - lista zmian From 884b9e6690a2b8f9ff02384a4a158bad37353072 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 4 Dec 2023 18:19:54 +0000 Subject: [PATCH 029/105] Change: Revert pressed-button content shifting introduced in r2161. This restores original behaviour, and prevents all image buttons being slightly too large. --- src/widget.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/widget.cpp b/src/widget.cpp index 20d010d787..3256d3f4ba 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -29,9 +29,9 @@ enum WidgetDrawDistances { /* WWT_IMGBTN(_2) */ WD_IMGBTN_LEFT = 1, ///< Left offset of the image in the button. - WD_IMGBTN_RIGHT = 2, ///< Right offset of the image in the button. + WD_IMGBTN_RIGHT = 1, ///< Right offset of the image in the button. WD_IMGBTN_TOP = 1, ///< Top offset of image in the button. - WD_IMGBTN_BOTTOM = 2, ///< Bottom offset of image in the button. + WD_IMGBTN_BOTTOM = 1, ///< Bottom offset of image in the button. /* WWT_INSET */ WD_INSET_LEFT = 2, ///< Left offset of string. @@ -154,7 +154,7 @@ const WidgetDimensions WidgetDimensions::unscaled = { {3, 3, 3, 3}, ///< picker {10, 8, 10, 8}, ///< sparse window padding {10, 8, 10, 1}, ///< resizable sparse window padding - 1, ///< pressed + 0, ///< pressed 1, ///< vsep_picker WD_PAR_VSEP_NORMAL, ///< vsep_normal 4, ///< vsep_sparse From 58c252b81ab5184e013d326ba810bb498f567eb4 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 4 Dec 2023 18:19:55 +0000 Subject: [PATCH 030/105] Cleanup: Remove unnecessary pressed button offset code. --- src/bridge_gui.cpp | 2 +- src/build_vehicle_gui.cpp | 2 +- src/depot_gui.cpp | 2 +- src/gfx_func.h | 2 +- src/graph_gui.cpp | 5 ++--- src/linkgraph/linkgraph_gui.cpp | 1 - src/misc_gui.cpp | 2 +- src/script/script_gui.cpp | 3 +-- src/settings_gui.cpp | 6 +++--- src/station_gui.cpp | 2 -- src/vehicle_gui.cpp | 5 ++--- src/widget.cpp | 30 ++++++++++++------------------ src/window_gui.h | 1 - 13 files changed, 25 insertions(+), 38 deletions(-) diff --git a/src/bridge_gui.cpp b/src/bridge_gui.cpp index bf3c5c7cef..ded870fa12 100644 --- a/src/bridge_gui.cpp +++ b/src/bridge_gui.cpp @@ -234,7 +234,7 @@ public: for (int i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < (int)this->bridges.size(); i++) { const BuildBridgeData &bridge_data = this->bridges.at(i); const BridgeSpec *b = bridge_data.spec; - DrawSpriteIgnorePadding(b->sprite, b->pal, tr.WithWidth(this->icon_width, rtl), false, SA_HOR_CENTER | SA_BOTTOM); + DrawSpriteIgnorePadding(b->sprite, b->pal, tr.WithWidth(this->icon_width, rtl), SA_HOR_CENTER | SA_BOTTOM); DrawStringMultiLine(tr.Indent(this->icon_width + WidgetDimensions::scaled.hsep_normal, rtl), GetBridgeSelectString(bridge_data)); tr = tr.Translate(0, this->resize.step_height); } diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index d26accbd6b..52ccb4a14e 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -1080,7 +1080,7 @@ void DrawEngineList(VehicleType type, const Rect &r, const GUIEngineList &eng_li } if (has_variants) { Rect fr = ir.Indent(indent, rtl).WithWidth(circle_width, rtl); - DrawSpriteIgnorePadding(is_folded ? SPR_CIRCLE_FOLDED : SPR_CIRCLE_UNFOLDED, PAL_NONE, {fr.left, y, fr.right, y + ir.Height() - 1}, false, SA_CENTER); + DrawSpriteIgnorePadding(is_folded ? SPR_CIRCLE_FOLDED : SPR_CIRCLE_UNFOLDED, PAL_NONE, {fr.left, y, fr.right, y + ir.Height() - 1}, SA_CENTER); } if (indent > 0) { /* Draw tree lines */ diff --git a/src/depot_gui.cpp b/src/depot_gui.cpp index 9eeb51011c..43bd17f4a3 100644 --- a/src/depot_gui.cpp +++ b/src/depot_gui.cpp @@ -356,7 +356,7 @@ struct DepotWindow : Window { DrawString(text, STR_DEPOT_NO_ENGINE); } else { Rect flag = r.WithWidth(this->flag_size.width, rtl).WithHeight(this->flag_size.height).Translate(0, diff_y); - DrawSpriteIgnorePadding((v->vehstatus & VS_STOPPED) ? SPR_FLAG_VEH_STOPPED : SPR_FLAG_VEH_RUNNING, PAL_NONE, flag, false, SA_CENTER); + DrawSpriteIgnorePadding((v->vehstatus & VS_STOPPED) ? SPR_FLAG_VEH_STOPPED : SPR_FLAG_VEH_RUNNING, PAL_NONE, flag, SA_CENTER); SetDParam(0, v->unitnumber); DrawString(text, STR_JUST_COMMA, (v->max_age - CalendarTime::DAYS_IN_LEAP_YEAR) >= v->age ? TC_BLACK : TC_RED); diff --git a/src/gfx_func.h b/src/gfx_func.h index 2e747d3170..e889109674 100644 --- a/src/gfx_func.h +++ b/src/gfx_func.h @@ -89,7 +89,7 @@ Dimension GetSpriteSize(SpriteID sprid, Point *offset = nullptr, ZoomLevel zoom Dimension GetScaledSpriteSize(SpriteID sprid); /* widget.cpp */ void DrawSpriteViewport(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub = nullptr); void DrawSprite(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub = nullptr, ZoomLevel zoom = ZOOM_LVL_GUI); -void DrawSpriteIgnorePadding(SpriteID img, PaletteID pal, const Rect &r, bool clicked, StringAlignment align); /* widget.cpp */ +void DrawSpriteIgnorePadding(SpriteID img, PaletteID pal, const Rect &r, StringAlignment align); /* widget.cpp */ std::unique_ptr DrawSpriteToRgbaBuffer(SpriteID spriteId, ZoomLevel zoom = ZOOM_LVL_GUI); int DrawString(int left, int right, int top, std::string_view str, TextColour colour = TC_FROMSTRING, StringAlignment align = SA_LEFT, bool underline = false, FontSize fontsize = FS_NORMAL); diff --git a/src/graph_gui.cpp b/src/graph_gui.cpp index c40dce640c..b7d2a4e32d 100644 --- a/src/graph_gui.cpp +++ b/src/graph_gui.cpp @@ -961,7 +961,7 @@ struct PaymentRatesGraphWindow : BaseGraphWindow { /* Redraw frame if lowered */ if (lowered) DrawFrameRect(line, COLOUR_BROWN, FR_LOWERED); - const Rect text = line.Shrink(WidgetDimensions::scaled.framerect).Translate(lowered ? WidgetDimensions::scaled.pressed : 0, lowered ? WidgetDimensions::scaled.pressed : 0); + const Rect text = line.Shrink(WidgetDimensions::scaled.framerect); /* Cargo-colour box with outline */ const Rect cargo = text.WithWidth(this->legend_width, rtl); @@ -1209,9 +1209,8 @@ struct PerformanceRatingDetailWindow : Window { if (IsInsideMM(widget, WID_PRD_COMPANY_FIRST, WID_PRD_COMPANY_LAST + 1)) { if (this->IsWidgetDisabled(widget)) return; CompanyID cid = (CompanyID)(widget - WID_PRD_COMPANY_FIRST); - int offset = (cid == this->company) ? WidgetDimensions::scaled.pressed : 0; Dimension sprite_size = GetSpriteSize(SPR_COMPANY_ICON); - DrawCompanyIcon(cid, CenterBounds(r.left, r.right, sprite_size.width) + offset, CenterBounds(r.top, r.bottom, sprite_size.height) + offset); + DrawCompanyIcon(cid, CenterBounds(r.left, r.right, sprite_size.width), CenterBounds(r.top, r.bottom, sprite_size.height)); return; } diff --git a/src/linkgraph/linkgraph_gui.cpp b/src/linkgraph/linkgraph_gui.cpp index 07393d69cc..deaba0d844 100644 --- a/src/linkgraph/linkgraph_gui.cpp +++ b/src/linkgraph/linkgraph_gui.cpp @@ -614,7 +614,6 @@ void LinkGraphLegendWindow::UpdateWidgetSize(int widget, Dimension *size, [[mayb void LinkGraphLegendWindow::DrawWidget(const Rect &r, int widget) const { Rect br = r.Shrink(WidgetDimensions::scaled.bevel); - if (this->IsWidgetLowered(widget)) br = br.Translate(WidgetDimensions::scaled.pressed, WidgetDimensions::scaled.pressed); if (IsInsideMM(widget, WID_LGL_COMPANY_FIRST, WID_LGL_COMPANY_LAST + 1)) { if (this->IsWidgetDisabled(widget)) return; CompanyID cid = (CompanyID)(widget - WID_LGL_COMPANY_FIRST); diff --git a/src/misc_gui.cpp b/src/misc_gui.cpp index 96617d8cf0..f5dbba0505 100644 --- a/src/misc_gui.cpp +++ b/src/misc_gui.cpp @@ -790,7 +790,7 @@ void QueryString::DrawEditBox(const Window *w, int wid) const Rect fr = r.Indent(clearbtn_width, !rtl); DrawFrameRect(cr, wi->colour, wi->IsLowered() ? FR_LOWERED : FR_NONE); - DrawSpriteIgnorePadding(rtl ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT, PAL_NONE, cr, wi->IsLowered(), SA_CENTER); + DrawSpriteIgnorePadding(rtl ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT, PAL_NONE, cr, SA_CENTER); if (this->text.bytes == 1) GfxFillRect(cr.Shrink(WidgetDimensions::scaled.bevel), _colour_gradient[wi->colour & 0xF][2], FILLRECT_CHECKER); DrawFrameRect(fr, wi->colour, FR_LOWERED | FR_DARKENED); diff --git a/src/script/script_gui.cpp b/src/script/script_gui.cpp index 89f6df19f4..0c492f3b6f 100644 --- a/src/script/script_gui.cpp +++ b/src/script/script_gui.cpp @@ -853,9 +853,8 @@ struct ScriptDebugWindow : public Window { { if (this->IsWidgetDisabled(widget)) return; CompanyID cid = (CompanyID)(widget - start); - int offset = (cid == script_debug_company) ? WidgetDimensions::scaled.pressed : 0; Dimension sprite_size = GetSpriteSize(SPR_COMPANY_ICON); - DrawCompanyIcon(cid, CenterBounds(r.left, r.right, sprite_size.width) + offset, CenterBounds(r.top, r.bottom, sprite_size.height) + offset); + DrawCompanyIcon(cid, CenterBounds(r.left, r.right, sprite_size.width), CenterBounds(r.top, r.bottom, sprite_size.height)); } /** diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 91f4f089e4..4ac75e72d4 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -2667,8 +2667,8 @@ void DrawArrowButtons(int x, int y, Colours button_colour, byte state, bool clic DrawFrameRect(lr, button_colour, (state == 1) ? FR_LOWERED : FR_NONE); DrawFrameRect(rr, button_colour, (state == 2) ? FR_LOWERED : FR_NONE); - DrawSpriteIgnorePadding(SPR_ARROW_LEFT, PAL_NONE, lr, (state == 1), SA_CENTER); - DrawSpriteIgnorePadding(SPR_ARROW_RIGHT, PAL_NONE, rr, (state == 2), SA_CENTER); + DrawSpriteIgnorePadding(SPR_ARROW_LEFT, PAL_NONE, lr, SA_CENTER); + DrawSpriteIgnorePadding(SPR_ARROW_RIGHT, PAL_NONE, rr, SA_CENTER); /* Grey out the buttons that aren't clickable */ bool rtl = _current_text_dir == TD_RTL; @@ -2695,7 +2695,7 @@ void DrawDropDownButton(int x, int y, Colours button_colour, bool state, bool cl Rect r = {x, y, x + SETTING_BUTTON_WIDTH - 1, y + SETTING_BUTTON_HEIGHT - 1}; DrawFrameRect(r, button_colour, state ? FR_LOWERED : FR_NONE); - DrawSpriteIgnorePadding(SPR_ARROW_DOWN, PAL_NONE, r, state, SA_CENTER); + DrawSpriteIgnorePadding(SPR_ARROW_DOWN, PAL_NONE, r, SA_CENTER); if (!clickable) { GfxFillRect(r.Shrink(WidgetDimensions::scaled.bevel), colour, FILLRECT_CHECKER); diff --git a/src/station_gui.cpp b/src/station_gui.cpp index cdf0588fcc..51f3cc1fdf 100644 --- a/src/station_gui.cpp +++ b/src/station_gui.cpp @@ -517,8 +517,6 @@ public: if (widget >= WID_STL_CARGOSTART) { Rect br = r.Shrink(WidgetDimensions::scaled.bevel); const CargoSpec *cs = _sorted_cargo_specs[widget - WID_STL_CARGOSTART]; - int cg_ofst = HasBit(this->filter.cargoes, cs->Index()) ? WidgetDimensions::scaled.pressed : 0; - br = br.Translate(cg_ofst, cg_ofst); GfxFillRect(br, cs->rating_colour); TextColour tc = GetContrastColour(cs->rating_colour); DrawString(br.left, br.right, CenterBounds(br.top, br.bottom, GetCharacterHeight(FS_SMALL)), cs->abbrev, tc, SA_HOR_CENTER, false, FS_SMALL); diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 29fa4cd641..fa130bb58e 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -3080,10 +3080,9 @@ public: /* Draw the flag plus orders. */ bool rtl = (_current_text_dir == TD_RTL); uint icon_width = std::max({GetScaledSpriteSize(SPR_WARNING_SIGN).width, GetScaledSpriteSize(SPR_FLAG_VEH_STOPPED).width, GetScaledSpriteSize(SPR_FLAG_VEH_RUNNING).width}); - int lowered = this->IsWidgetLowered(widget) ? WidgetDimensions::scaled.pressed : 0; - Rect tr = r.Shrink(WidgetDimensions::scaled.framerect).Translate(lowered, lowered); + Rect tr = r.Shrink(WidgetDimensions::scaled.framerect); SpriteID image = ((v->vehstatus & VS_STOPPED) != 0) ? SPR_FLAG_VEH_STOPPED : (HasBit(v->vehicle_flags, VF_PATHFINDER_LOST)) ? SPR_WARNING_SIGN : SPR_FLAG_VEH_RUNNING; - DrawSpriteIgnorePadding(image, PAL_NONE, tr.WithWidth(icon_width, rtl), false, SA_CENTER); + DrawSpriteIgnorePadding(image, PAL_NONE, tr.WithWidth(icon_width, rtl), SA_CENTER); tr = tr.Indent(icon_width + WidgetDimensions::scaled.imgbtn.Horizontal(), rtl); DrawString(tr.left, tr.right, CenterBounds(tr.top, tr.bottom, GetCharacterHeight(FS_NORMAL)), str, text_colour, SA_HOR_CENTER); } diff --git a/src/widget.cpp b/src/widget.cpp index 3256d3f4ba..22089495cd 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -154,7 +154,6 @@ const WidgetDimensions WidgetDimensions::unscaled = { {3, 3, 3, 3}, ///< picker {10, 8, 10, 8}, ///< sparse window padding {10, 8, 10, 1}, ///< resizable sparse window padding - 0, ///< pressed 1, ///< vsep_picker WD_PAR_VSEP_NORMAL, ///< vsep_normal 4, ///< vsep_sparse @@ -227,7 +226,6 @@ void SetupWidgetDimensions() WidgetDimensions::scaled.dropdowntext = ScaleGUITrad(WidgetDimensions::unscaled.dropdowntext); WidgetDimensions::scaled.modalpopup = ScaleGUITrad(WidgetDimensions::unscaled.modalpopup); - WidgetDimensions::scaled.pressed = ScaleGUITrad(WidgetDimensions::unscaled.pressed); WidgetDimensions::scaled.vsep_normal = ScaleGUITrad(WidgetDimensions::unscaled.vsep_normal); WidgetDimensions::scaled.vsep_wide = ScaleGUITrad(WidgetDimensions::unscaled.vsep_wide); WidgetDimensions::scaled.hsep_normal = ScaleGUITrad(WidgetDimensions::unscaled.hsep_normal); @@ -453,7 +451,7 @@ void DrawFrameRect(int left, int top, int right, int bottom, Colours colour, Fra } } -void DrawSpriteIgnorePadding(SpriteID img, PaletteID pal, const Rect &r, bool clicked, StringAlignment align) +void DrawSpriteIgnorePadding(SpriteID img, PaletteID pal, const Rect &r, StringAlignment align) { Point offset; Dimension d = GetSpriteSize(img, &offset); @@ -461,8 +459,7 @@ void DrawSpriteIgnorePadding(SpriteID img, PaletteID pal, const Rect &r, bool cl d.height -= offset.y; Point p = GetAlignedPosition(r, d, align); - int o = clicked ? WidgetDimensions::scaled.pressed : 0; - DrawSprite(img, pal, p.x + o - offset.x, p.y + o - offset.y); + DrawSprite(img, pal, p.x - offset.x, p.y - offset.y); } /** @@ -470,7 +467,7 @@ void DrawSpriteIgnorePadding(SpriteID img, PaletteID pal, const Rect &r, bool cl * @param r Rectangle of the button. * @param type Widget type (#WWT_IMGBTN or #WWT_IMGBTN_2). * @param colour Colour of the button. - * @param clicked Button is lowered. + * @param clicked Button is clicked. * @param img Sprite to draw. * @param align Alignment of the sprite. */ @@ -480,14 +477,14 @@ static inline void DrawImageButtons(const Rect &r, WidgetType type, Colours colo DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, (clicked) ? FR_LOWERED : FR_NONE); if ((type & WWT_MASK) == WWT_IMGBTN_2 && clicked) img++; // Show different image when clicked for #WWT_IMGBTN_2. - DrawSpriteIgnorePadding(img, PAL_NONE, r, clicked, align); + DrawSpriteIgnorePadding(img, PAL_NONE, r, align); } /** * Draw the label-part of a widget. * @param r Rectangle of the label background. * @param type Widget type (#WWT_TEXTBTN, #WWT_TEXTBTN_2, or #WWT_LABEL). - * @param clicked Label is rendered lowered. + * @param clicked Label is clicked. * @param colour Colour of the text. * @param str Text to draw. * @param align Alignment of the text. @@ -499,8 +496,7 @@ static inline void DrawLabel(const Rect &r, WidgetType type, bool clicked, TextC if ((type & WWT_MASK) == WWT_TEXTBTN_2 && clicked) str++; Dimension d = GetStringBoundingBox(str, fs); Point p = GetAlignedPosition(r, d, align); - int o = clicked ? WidgetDimensions::scaled.pressed : 0; - DrawString(r.left + o, r.right + o, p.y + o, str, colour, align, false, fs); + DrawString(r.left, r.right, p.y, str, colour, align, false, fs); } /** @@ -783,7 +779,7 @@ static inline void DrawDebugBox(const Rect &r, Colours colour, bool clicked) static inline void DrawResizeBox(const Rect &r, Colours colour, bool at_left, bool clicked) { DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, (clicked) ? FR_LOWERED : FR_NONE); - DrawSpriteIgnorePadding(at_left ? SPR_WINDOW_RESIZE_LEFT : SPR_WINDOW_RESIZE_RIGHT, PAL_NONE, r.Shrink(ScaleGUITrad(2)), clicked, at_left ? (SA_LEFT | SA_BOTTOM | SA_FORCE) : (SA_RIGHT | SA_BOTTOM | SA_FORCE)); + DrawSpriteIgnorePadding(at_left ? SPR_WINDOW_RESIZE_LEFT : SPR_WINDOW_RESIZE_RIGHT, PAL_NONE, r.Shrink(ScaleGUITrad(2)), at_left ? (SA_LEFT | SA_BOTTOM | SA_FORCE) : (SA_RIGHT | SA_BOTTOM | SA_FORCE)); } /** @@ -835,8 +831,8 @@ void DrawCaption(const Rect &r, Colours colour, Owner owner, TextColour text_col * Draw a button with a dropdown (#WWT_DROPDOWN and #NWID_BUTTON_DROPDOWN). * @param r Rectangle containing the widget. * @param colour Background colour of the widget. - * @param clicked_button The button-part is lowered. - * @param clicked_dropdown The drop-down part is lowered. + * @param clicked_button The button-part is clicked. + * @param clicked_dropdown The drop-down part is clicked. * @param str Text of the button. * @param align Alignment of the text within the dropdown. * @@ -850,15 +846,13 @@ static inline void DrawButtonDropdown(const Rect &r, Colours colour, bool clicke DrawFrameRect(r.left, r.top, r.right - dd_width, r.bottom, colour, clicked_button ? FR_LOWERED : FR_NONE); DrawImageButtons(r.WithWidth(dd_width, true), WWT_DROPDOWN, colour, clicked_dropdown, SPR_ARROW_DOWN, SA_CENTER); if (str != STR_NULL) { - int o = clicked_button ? WidgetDimensions::scaled.pressed : 0; - DrawString(r.left + WidgetDimensions::scaled.dropdowntext.left + o, r.right - dd_width - WidgetDimensions::scaled.dropdowntext.right + o, CenterBounds(r.top, r.bottom, GetCharacterHeight(FS_NORMAL)) + o, str, TC_BLACK, align); + DrawString(r.left + WidgetDimensions::scaled.dropdowntext.left, r.right - dd_width - WidgetDimensions::scaled.dropdowntext.right, CenterBounds(r.top, r.bottom, GetCharacterHeight(FS_NORMAL)), str, TC_BLACK, align); } } else { DrawFrameRect(r.left + dd_width, r.top, r.right, r.bottom, colour, clicked_button ? FR_LOWERED : FR_NONE); DrawImageButtons(r.WithWidth(dd_width, false), WWT_DROPDOWN, colour, clicked_dropdown, SPR_ARROW_DOWN, SA_CENTER); if (str != STR_NULL) { - int o = clicked_button ? WidgetDimensions::scaled.pressed : 0; - DrawString(r.left + dd_width + WidgetDimensions::scaled.dropdowntext.left + o, r.right - WidgetDimensions::scaled.dropdowntext.right + o, CenterBounds(r.top, r.bottom, GetCharacterHeight(FS_NORMAL)) + o, str, TC_BLACK, align); + DrawString(r.left + dd_width + WidgetDimensions::scaled.dropdowntext.left, r.right - WidgetDimensions::scaled.dropdowntext.right, CenterBounds(r.top, r.bottom, GetCharacterHeight(FS_NORMAL)), str, TC_BLACK, align); } } } @@ -908,7 +902,7 @@ void Window::DrawSortButtonState(int widget, SortButtonState state) const /* Sort button uses the same sprites as vertical scrollbar */ Dimension dim = NWidgetScrollbar::GetVerticalDimension(); - DrawSpriteIgnorePadding(state == SBS_DOWN ? SPR_ARROW_DOWN : SPR_ARROW_UP, PAL_NONE, r.WithWidth(dim.width, _current_text_dir == TD_LTR), this->IsWidgetLowered(widget), SA_CENTER); + DrawSpriteIgnorePadding(state == SBS_DOWN ? SPR_ARROW_DOWN : SPR_ARROW_UP, PAL_NONE, r.WithWidth(dim.width, _current_text_dir == TD_LTR), SA_CENTER); } /** diff --git a/src/window_gui.h b/src/window_gui.h index 400e2ed180..0ef439dbfb 100644 --- a/src/window_gui.h +++ b/src/window_gui.h @@ -54,7 +54,6 @@ struct WidgetDimensions { RectPadding sparse; ///< Padding used for 'sparse' widget window, usually containing multiple frames. RectPadding sparse_resize; ///< Padding used for a resizeable 'sparse' widget window, usually containing multiple frames. - int pressed; ///< Offset for contents of depressed widget. int vsep_picker; ///< Vertical spacing of picker-window widgets. int vsep_normal; ///< Normal vertical spacing. int vsep_sparse; ///< Normal vertical spacing for 'sparse' widget window. From e901ce582d65045a2b86ed14909f8e2247cdcc5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Guilloux?= Date: Wed, 6 Dec 2023 13:30:47 +0100 Subject: [PATCH 031/105] Add: [CI] Test grf generation (#11543) --- .github/workflows/ci-build.yml | 4 ++++ cmake/scripts/CreateGRF.cmake | 3 +++ 2 files changed, 7 insertions(+) diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index dfdfbf0371..2da7d1870d 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -93,6 +93,7 @@ jobs: - name: GCC - Dedicated compiler: gcc cxxcompiler: g++ + libraries: grfcodec extra-cmake-parameters: -DOPTION_DEDICATED=ON -DCMAKE_CXX_FLAGS_INIT="-DRANDOM_DEBUG" -DCMAKE_DISABLE_PRECOMPILE_HEADERS=ON # Compile without SDL / SDL2, as that should compile fine too. @@ -170,6 +171,9 @@ jobs: cd build ctest -j $(nproc) --timeout 120 + # Check no tracked files have been modified + git diff --exit-code + macos: strategy: fail-fast: false diff --git a/cmake/scripts/CreateGRF.cmake b/cmake/scripts/CreateGRF.cmake index 55e136ef4e..eff9a7b959 100644 --- a/cmake/scripts/CreateGRF.cmake +++ b/cmake/scripts/CreateGRF.cmake @@ -21,6 +21,9 @@ if(NOT GRF_BINARY_FILE) message(FATAL_ERROR "Script needs GRF_BINARY_FILE defined") endif() +# Remove the existing output so failures never go unnoticed +file(REMOVE ${GRF_BINARY_FILE} ${GRF_BINARY_FILE}.hash) + get_filename_component(GRF_SOURCE_FOLDER_NAME "${GRF_SOURCE_FOLDER}" NAME) file(WRITE sprites/${GRF_SOURCE_FOLDER_NAME}.nfo "") From 2a22063d77054eaed4ae7ee675a74551e2a3b911 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Guilloux?= Date: Wed, 6 Dec 2023 15:44:38 +0100 Subject: [PATCH 032/105] Change: Remember the active game option window tab (#11547) --- src/settings_gui.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 4ac75e72d4..4587b1c2e1 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -170,6 +170,7 @@ struct GameOptionsWindow : Window { GameSettings *opt; bool reload; int gui_scale; + static inline int active_tab = WID_GO_TAB_GENERAL; GameOptionsWindow(WindowDesc *desc) : Window(desc) { @@ -182,7 +183,7 @@ struct GameOptionsWindow : Window { this->InitNested(WN_GAME_OPTIONS_GAME_OPTIONS); this->OnInvalidateData(0); - this->SetTab(WID_GO_TAB_GENERAL); + this->SetTab(GameOptionsWindow::active_tab); if constexpr (!NetworkSurveyHandler::IsSurveyPossible()) this->GetWidget(WID_GO_SURVEY_SEL)->SetDisplayedPlane(SZSP_NONE); } @@ -387,6 +388,7 @@ struct GameOptionsWindow : Window { { this->SetWidgetsLoweredState(false, WID_GO_TAB_GENERAL, WID_GO_TAB_GRAPHICS, WID_GO_TAB_SOUND); this->LowerWidget(widget); + GameOptionsWindow::active_tab = widget; int pane = 0; if (widget == WID_GO_TAB_GRAPHICS) pane = 1; From d8f989a1f5187e3ce716e4958c7a80ded96dcd91 Mon Sep 17 00:00:00 2001 From: translators Date: Wed, 6 Dec 2023 18:39:07 +0000 Subject: [PATCH 033/105] Update: Translations from eints danish: 3 changes by bscargo portuguese (brazilian): 5 changes by pasantoro --- src/lang/brazilian_portuguese.txt | 7 +++++-- src/lang/danish.txt | 3 +++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index a6f8caa1d1..f915230a2c 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -2582,7 +2582,7 @@ STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}Conteúd STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}Você está saindo do OpenTTD! STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}Os termos e condições ao baixar conteúdo de fontes externas pode varias.{}Você deverá consultar as fontes para obter instruções de como instalar o conteúdo no OpenTTD.{} Deseja continuar? STR_CONTENT_FILTER_TITLE :{BLACK}Tag/nome do filtro: -STR_CONTENT_OPEN_URL :{BLACK}Visitar website +STR_CONTENT_OPEN_URL :{BLACK}Visitar a página web STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}Visitar o site desse conteúdo STR_CONTENT_DOWNLOAD_CAPTION :{BLACK}Baixar STR_CONTENT_DOWNLOAD_CAPTION_TOOLTIP :{BLACK}Baixa o conteúdo selecionado @@ -4708,9 +4708,12 @@ STR_TEXTFILE_NAVBACK_TOOLTIP :{BLACK}Retornar STR_TEXTFILE_NAVFORWARD_TOOLTIP :{BLACK}Retornar adiante no histórico de navegação STR_TEXTFILE_WRAP_TEXT :{WHITE}Quebra de linha STR_TEXTFILE_WRAP_TEXT_TOOLTIP :[BLACK}Quebra linhas automaticamente para que o texto caiba na janela -STR_TEXTFILE_VIEW_README :{BLACK}Ver o leia-me +STR_TEXTFILE_VIEW_README :{BLACK}Ver o arquivo Leia-me +STR_TEXTFILE_VIEW_README_TOOLTIP :Ver o arquivo Leia-me para este conteúdo STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Log de mudanças +STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP :Ver o registro de modificações para este conteúdo STR_TEXTFILE_VIEW_LICENCE :{BLACK}Licença +STR_TEXTFILE_VIEW_LICENCE_TOOLTIP :Ver a licença para este conteúdo ###length 5 STR_TEXTFILE_README_CAPTION :{WHITE}{STRING} Leia-me de {STRING} STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING} log de mudanças de {STRING} diff --git a/src/lang/danish.txt b/src/lang/danish.txt index f7d676bbd2..0803a47bd0 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -4708,8 +4708,11 @@ STR_TEXTFILE_NAVFORWARD_TOOLTIP :{BLACK}Vend til STR_TEXTFILE_WRAP_TEXT :{WHITE}Ombryd tekst STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Ombryd teksten i vinduet, så det hele passer uden at skulle rulle STR_TEXTFILE_VIEW_README :{BLACK}Se readme +STR_TEXTFILE_VIEW_README_TOOLTIP :Se readme for dette indhold STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Ændringslog +STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP :Se ændringslog for dette indhold STR_TEXTFILE_VIEW_LICENCE :{BLACK}Licens +STR_TEXTFILE_VIEW_LICENCE_TOOLTIP :Se licens til dette indhold ###length 5 STR_TEXTFILE_README_CAPTION :{WHITE}{STRING} readme for {STRING} STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING} ændringslog for {STRING} From bdef9b451c06bd02c027e871dc527eeef79d8a3e Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 6 Dec 2023 21:14:09 +0000 Subject: [PATCH 034/105] Codechange: Remove unnecessary SetMinimalTextLines for text buttons alongside captions. (#11549) --- src/goal_gui.cpp | 4 ++-- src/graph_gui.cpp | 12 ++++++------ src/town_gui.cpp | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/goal_gui.cpp b/src/goal_gui.cpp index 774230c0f6..487ba146e9 100644 --- a/src/goal_gui.cpp +++ b/src/goal_gui.cpp @@ -285,8 +285,8 @@ static const NWidgetPart _nested_goals_list_widgets[] = { NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN, WID_GOAL_CAPTION), SetDataTip(STR_JUST_STRING1, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_GOAL_SELECT_BUTTONS), - NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_GOAL_GLOBAL_BUTTON), SetMinimalSize(50, 0), SetMinimalTextLines(1, WidgetDimensions::unscaled.captiontext.Vertical()), SetDataTip(STR_GOALS_GLOBAL_BUTTON, STR_GOALS_GLOBAL_BUTTON_HELPTEXT), - NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_GOAL_COMPANY_BUTTON), SetMinimalSize(50, 0), SetMinimalTextLines(1, WidgetDimensions::unscaled.captiontext.Vertical()), SetDataTip(STR_GOALS_COMPANY_BUTTON, STR_GOALS_COMPANY_BUTTON_HELPTEXT), + NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_GOAL_GLOBAL_BUTTON), SetMinimalSize(50, 0), SetDataTip(STR_GOALS_GLOBAL_BUTTON, STR_GOALS_GLOBAL_BUTTON_HELPTEXT), + NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_GOAL_COMPANY_BUTTON), SetMinimalSize(50, 0), SetDataTip(STR_GOALS_COMPANY_BUTTON, STR_GOALS_COMPANY_BUTTON_HELPTEXT), EndContainer(), NWidget(WWT_SHADEBOX, COLOUR_BROWN), NWidget(WWT_DEFSIZEBOX, COLOUR_BROWN), diff --git a/src/graph_gui.cpp b/src/graph_gui.cpp index b7d2a4e32d..bf56415ac4 100644 --- a/src/graph_gui.cpp +++ b/src/graph_gui.cpp @@ -637,7 +637,7 @@ static const NWidgetPart _nested_operating_profit_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN), SetDataTip(STR_GRAPH_OPERATING_PROFIT_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), - NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_CV_KEY_BUTTON), SetMinimalSize(50, 0), SetMinimalTextLines(1, WidgetDimensions::unscaled.framerect.Vertical() + 2), SetDataTip(STR_GRAPH_KEY_BUTTON, STR_GRAPH_KEY_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_CV_KEY_BUTTON), SetMinimalSize(50, 0), SetDataTip(STR_GRAPH_KEY_BUTTON, STR_GRAPH_KEY_TOOLTIP), NWidget(WWT_SHADEBOX, COLOUR_BROWN), NWidget(WWT_DEFSIZEBOX, COLOUR_BROWN), NWidget(WWT_STICKYBOX, COLOUR_BROWN), @@ -688,7 +688,7 @@ static const NWidgetPart _nested_income_graph_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN), SetDataTip(STR_GRAPH_INCOME_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), - NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_CV_KEY_BUTTON), SetMinimalSize(50, 0), SetMinimalTextLines(1, WidgetDimensions::unscaled.framerect.Vertical() + 2), SetDataTip(STR_GRAPH_KEY_BUTTON, STR_GRAPH_KEY_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_CV_KEY_BUTTON), SetMinimalSize(50, 0), SetDataTip(STR_GRAPH_KEY_BUTTON, STR_GRAPH_KEY_TOOLTIP), NWidget(WWT_SHADEBOX, COLOUR_BROWN), NWidget(WWT_DEFSIZEBOX, COLOUR_BROWN), NWidget(WWT_STICKYBOX, COLOUR_BROWN), @@ -737,7 +737,7 @@ static const NWidgetPart _nested_delivered_cargo_graph_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN), SetDataTip(STR_GRAPH_CARGO_DELIVERED_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), - NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_CV_KEY_BUTTON), SetMinimalSize(50, 0), SetMinimalTextLines(1, WidgetDimensions::unscaled.framerect.Vertical() + 2), SetDataTip(STR_GRAPH_KEY_BUTTON, STR_GRAPH_KEY_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_CV_KEY_BUTTON), SetMinimalSize(50, 0), SetDataTip(STR_GRAPH_KEY_BUTTON, STR_GRAPH_KEY_TOOLTIP), NWidget(WWT_SHADEBOX, COLOUR_BROWN), NWidget(WWT_DEFSIZEBOX, COLOUR_BROWN), NWidget(WWT_STICKYBOX, COLOUR_BROWN), @@ -792,8 +792,8 @@ static const NWidgetPart _nested_performance_history_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN), SetDataTip(STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), - NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_PHG_DETAILED_PERFORMANCE), SetMinimalSize(50, 0), SetMinimalTextLines(1, WidgetDimensions::unscaled.framerect.Vertical() + 2), SetDataTip(STR_PERFORMANCE_DETAIL_KEY, STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_PHG_KEY), SetMinimalSize(50, 0), SetMinimalTextLines(1, WidgetDimensions::unscaled.framerect.Vertical() + 2), SetDataTip(STR_GRAPH_KEY_BUTTON, STR_GRAPH_KEY_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_PHG_DETAILED_PERFORMANCE), SetMinimalSize(50, 0), SetDataTip(STR_PERFORMANCE_DETAIL_KEY, STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_PHG_KEY), SetMinimalSize(50, 0), SetDataTip(STR_GRAPH_KEY_BUTTON, STR_GRAPH_KEY_TOOLTIP), NWidget(WWT_SHADEBOX, COLOUR_BROWN), NWidget(WWT_DEFSIZEBOX, COLOUR_BROWN), NWidget(WWT_STICKYBOX, COLOUR_BROWN), @@ -842,7 +842,7 @@ static const NWidgetPart _nested_company_value_graph_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN), SetDataTip(STR_GRAPH_COMPANY_VALUES_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), - NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_CV_KEY_BUTTON), SetMinimalSize(50, 0), SetMinimalTextLines(1, WidgetDimensions::unscaled.framerect.Vertical() + 2), SetDataTip(STR_GRAPH_KEY_BUTTON, STR_GRAPH_KEY_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_CV_KEY_BUTTON), SetMinimalSize(50, 0), SetDataTip(STR_GRAPH_KEY_BUTTON, STR_GRAPH_KEY_TOOLTIP), NWidget(WWT_SHADEBOX, COLOUR_BROWN), NWidget(WWT_DEFSIZEBOX, COLOUR_BROWN), NWidget(WWT_STICKYBOX, COLOUR_BROWN), diff --git a/src/town_gui.cpp b/src/town_gui.cpp index c7c33cddb3..81a561676b 100644 --- a/src/town_gui.cpp +++ b/src/town_gui.cpp @@ -53,7 +53,7 @@ static const NWidgetPart _nested_town_authority_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN, WID_TA_CAPTION), SetDataTip(STR_LOCAL_AUTHORITY_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), - NWidget(WWT_TEXTBTN, COLOUR_BROWN, WID_TA_ZONE_BUTTON), SetMinimalSize(50, 0), SetMinimalTextLines(1, WidgetDimensions::unscaled.framerect.Vertical() + 2), SetDataTip(STR_LOCAL_AUTHORITY_ZONE, STR_LOCAL_AUTHORITY_ZONE_TOOLTIP), + NWidget(WWT_TEXTBTN, COLOUR_BROWN, WID_TA_ZONE_BUTTON), SetMinimalSize(50, 0), SetDataTip(STR_LOCAL_AUTHORITY_ZONE, STR_LOCAL_AUTHORITY_ZONE_TOOLTIP), NWidget(WWT_SHADEBOX, COLOUR_BROWN), NWidget(WWT_DEFSIZEBOX, COLOUR_BROWN), NWidget(WWT_STICKYBOX, COLOUR_BROWN), From 90e386acaadfba30d214d84209d9ff8532078203 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 6 Dec 2023 21:36:51 +0000 Subject: [PATCH 035/105] Codechange: Vertical spacing for caption is captiontext, not framerect. (#11550) This does not really matter as the caption height is sized correctly later anyway, so this just avoids confusion. --- src/widget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widget.cpp b/src/widget.cpp index 22089495cd..ba7bca4e62 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -2738,7 +2738,7 @@ NWidgetLeaf::NWidgetLeaf(WidgetType tp, Colours colour, int index, uint32_t data this->SetFill(1, 0); this->SetResize(1, 0); this->SetMinimalSize(0, WD_CAPTION_HEIGHT); - this->SetMinimalTextLines(1, WidgetDimensions::unscaled.framerect.Vertical(), FS_NORMAL); + this->SetMinimalTextLines(1, WidgetDimensions::unscaled.captiontext.Vertical(), FS_NORMAL); this->SetDataTip(data, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS); break; From 89461b5561a2df2ac0d561c545df8bdee7a55053 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 7 Dec 2023 16:09:45 +0000 Subject: [PATCH 036/105] Codechange: Don't highlight unselectable dropdown item. (#11553) --- src/widgets/dropdown.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widgets/dropdown.cpp b/src/widgets/dropdown.cpp index 9ad87c0a84..ba898ff715 100644 --- a/src/widgets/dropdown.cpp +++ b/src/widgets/dropdown.cpp @@ -182,7 +182,7 @@ struct DropdownWindow : Window { if (y + item_height - 1 <= ir.bottom) { Rect full{ir.left, y, ir.right, y + item_height - 1}; - bool selected = (this->selected_index == item->result); + bool selected = (this->selected_index == item->result) && item->Selectable(); if (selected) GfxFillRect(full, PC_BLACK); item->Draw(full, full.Shrink(WidgetDimensions::scaled.dropdowntext, RectPadding::zero), selected, colour); From 60565da8f975e344d398f4caf116534b01e389b8 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 7 Dec 2023 16:10:09 +0000 Subject: [PATCH 037/105] Codechange: Add specific WidgetDimension for dropdown list window. (#11554) This avoids contorting fullbevel dimensions. --- src/widget.cpp | 2 ++ src/widgets/dropdown.cpp | 16 ++++++++-------- src/window_gui.h | 1 + 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/widget.cpp b/src/widget.cpp index ba7bca4e62..5c5f3929db 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -150,6 +150,7 @@ const WidgetDimensions WidgetDimensions::unscaled = { {WD_CLOSEBOX_LEFT, WD_CLOSEBOX_TOP, WD_CLOSEBOX_RIGHT, WD_CLOSEBOX_BOTTOM}, ///< closebox {WD_CAPTIONTEXT_LEFT, WD_CAPTIONTEXT_TOP, WD_CAPTIONTEXT_RIGHT, WD_CAPTIONTEXT_BOTTOM}, ///< captiontext {WD_DROPDOWNTEXT_LEFT, WD_DROPDOWNTEXT_TOP, WD_DROPDOWNTEXT_RIGHT, WD_DROPDOWNTEXT_BOTTOM}, ///< dropdowntext + {WD_BEVEL_LEFT, WD_BEVEL_TOP * 2, WD_BEVEL_RIGHT, WD_BEVEL_BOTTOM * 2}, ///< dropdownmenu {20, 10, 20, 10}, ///< modalpopup {3, 3, 3, 3}, ///< picker {10, 8, 10, 8}, ///< sparse window padding @@ -224,6 +225,7 @@ void SetupWidgetDimensions() WidgetDimensions::scaled.closebox = ScaleGUITrad(WidgetDimensions::unscaled.closebox); WidgetDimensions::scaled.captiontext = ScaleGUITrad(WidgetDimensions::unscaled.captiontext); WidgetDimensions::scaled.dropdowntext = ScaleGUITrad(WidgetDimensions::unscaled.dropdowntext); + WidgetDimensions::scaled.dropdownlist = ScaleGUITrad(WidgetDimensions::unscaled.dropdownlist); WidgetDimensions::scaled.modalpopup = ScaleGUITrad(WidgetDimensions::unscaled.modalpopup); WidgetDimensions::scaled.vsep_normal = ScaleGUITrad(WidgetDimensions::unscaled.vsep_normal); diff --git a/src/widgets/dropdown.cpp b/src/widgets/dropdown.cpp index ba898ff715..784e75f0da 100644 --- a/src/widgets/dropdown.cpp +++ b/src/widgets/dropdown.cpp @@ -75,7 +75,7 @@ struct DropdownWindow : Window { uint items_width = size.width - (scroll ? NWidgetScrollbar::GetVerticalDimension().width : 0); NWidgetCore *nwi = this->GetWidget(WID_DM_ITEMS); - nwi->SetMinimalSizeAbsolute(items_width, size.height + WidgetDimensions::scaled.fullbevel.Vertical() * 2); + nwi->SetMinimalSizeAbsolute(items_width, size.height + WidgetDimensions::scaled.dropdownlist.Vertical()); nwi->colour = wi_colour; nwi = this->GetWidget(WID_DM_SCROLL); @@ -142,8 +142,8 @@ struct DropdownWindow : Window { { if (GetWidgetFromPos(this, _cursor.pos.x - this->left, _cursor.pos.y - this->top) < 0) return false; - const Rect &r = this->GetWidget(WID_DM_ITEMS)->GetCurrentRect().Shrink(WidgetDimensions::scaled.fullbevel); - int y = _cursor.pos.y - this->top - r.top - WidgetDimensions::scaled.fullbevel.top; + const Rect &r = this->GetWidget(WID_DM_ITEMS)->GetCurrentRect().Shrink(WidgetDimensions::scaled.dropdownlist); + int y = _cursor.pos.y - this->top - r.top; int pos = this->vscroll->GetPosition(); for (const auto &item : this->list) { @@ -170,7 +170,7 @@ struct DropdownWindow : Window { Colours colour = this->GetWidget(widget)->colour; - Rect ir = r.Shrink(WidgetDimensions::scaled.fullbevel).Shrink(RectPadding::zero, WidgetDimensions::scaled.fullbevel); + Rect ir = r.Shrink(WidgetDimensions::scaled.dropdownlist); int y = ir.top; int pos = this->vscroll->GetPosition(); for (const auto &item : this->list) { @@ -292,7 +292,7 @@ void ShowDropDownListAt(Window *w, DropDownList &&list, int selected, int button /* Get the height and width required for the list. */ Dimension dim = GetDropDownListDimension(list); - dim.width += WidgetDimensions::scaled.fullbevel.Horizontal(); + dim.width += WidgetDimensions::scaled.dropdownlist.Horizontal(); /* Scrollbar needed? */ bool scroll = false; @@ -301,12 +301,12 @@ void ShowDropDownListAt(Window *w, DropDownList &&list, int selected, int button bool above = false; /* Available height below (or above, if the dropdown is placed above the widget). */ - uint available_height = std::max(GetMainViewBottom() - top - (int)WidgetDimensions::scaled.fullbevel.Vertical() * 2, 0); + uint available_height = std::max(GetMainViewBottom() - top - (int)WidgetDimensions::scaled.dropdownlist.Vertical(), 0); /* If the dropdown doesn't fully fit below the widget... */ if (dim.height > available_height) { - uint available_height_above = std::max(w->top + wi_rect.top - GetMainViewTop() - (int)WidgetDimensions::scaled.fullbevel.Vertical() * 2, 0); + uint available_height_above = std::max(w->top + wi_rect.top - GetMainViewTop() - (int)WidgetDimensions::scaled.dropdownlist.Vertical(), 0); /* Put the dropdown above if there is more available space. */ if (available_height_above > available_height) { @@ -329,7 +329,7 @@ void ShowDropDownListAt(Window *w, DropDownList &&list, int selected, int button /* Set the top position if needed. */ if (above) { - top = w->top + wi_rect.top - dim.height - WidgetDimensions::scaled.fullbevel.Vertical() * 2; + top = w->top + wi_rect.top - dim.height - WidgetDimensions::scaled.dropdownlist.Vertical(); } } diff --git a/src/window_gui.h b/src/window_gui.h index 0ef439dbfb..16d5a4e1eb 100644 --- a/src/window_gui.h +++ b/src/window_gui.h @@ -49,6 +49,7 @@ struct WidgetDimensions { RectPadding closebox; RectPadding captiontext; ///< Offsets of text within a caption. RectPadding dropdowntext; ///< Offsets of text within a dropdown widget. + RectPadding dropdownlist; ///< Offsets used by a dropdown list itself. RectPadding modalpopup; ///< Padding for a modal popup. RectPadding picker; ///< Padding for a picker (dock, station, etc) window. RectPadding sparse; ///< Padding used for 'sparse' widget window, usually containing multiple frames. From 2cbe91c3126a839e63948c81e4e01dde80a8cddc Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Thu, 7 Dec 2023 18:38:43 +0000 Subject: [PATCH 038/105] Fix #11551, aab580e0a: Link graph job results were incorrectly applied (#11558) Edge flows were incorrectly restricted because the restricted instead of unrestricted last update date was checked See also: #10314 --- src/linkgraph/linkgraphjob.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/linkgraph/linkgraphjob.cpp b/src/linkgraph/linkgraphjob.cpp index 26fafbe613..a4ca8ae2f2 100644 --- a/src/linkgraph/linkgraphjob.cpp +++ b/src/linkgraph/linkgraphjob.cpp @@ -138,7 +138,7 @@ LinkGraphJob::~LinkGraphJob() * from the new flows. This avoids flow cycles between old and * new flows. */ while (!erased.IsEmpty()) ge.flows.erase(erased.Pop()); - } else if ((*lg)[node_id][dest_id].last_restricted_update == CalendarTime::INVALID_DATE) { + } else if ((*lg)[node_id][dest_id].last_unrestricted_update == CalendarTime::INVALID_DATE) { /* Edge is fully restricted. */ flows.RestrictFlows(to); } From 54ba75791069594c56dec3c3eb0c84be4aa7a906 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 7 Dec 2023 19:31:30 +0000 Subject: [PATCH 039/105] Fix #11556: Missing saveload change for OrderBackup. (#11557) Apply the saveload change from #11468 to OrderBackup and bump again. --- src/saveload/order_sl.cpp | 3 ++- src/saveload/saveload.h | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/saveload/order_sl.cpp b/src/saveload/order_sl.cpp index 57f0136e26..cf6849b20d 100644 --- a/src/saveload/order_sl.cpp +++ b/src/saveload/order_sl.cpp @@ -257,7 +257,8 @@ SaveLoadTable GetOrderBackupDescription() SLE_CONDVAR(OrderBackup, cur_implicit_order_index, SLE_UINT8, SLV_176, SL_MAX_VERSION), SLE_CONDVAR(OrderBackup, current_order_time, SLE_UINT32, SLV_176, SL_MAX_VERSION), SLE_CONDVAR(OrderBackup, lateness_counter, SLE_INT32, SLV_176, SL_MAX_VERSION), - SLE_CONDVAR(OrderBackup, timetable_start, SLE_INT32, SLV_176, SL_MAX_VERSION), + SLE_CONDVAR(OrderBackup, timetable_start, SLE_FILE_I32 | SLE_VAR_U64, SLV_176, SLV_TIMETABLE_START_TICKS_FIX), + SLE_CONDVAR(OrderBackup, timetable_start, SLE_UINT64, SLV_TIMETABLE_START_TICKS_FIX, SL_MAX_VERSION), SLE_CONDVAR(OrderBackup, vehicle_flags, SLE_FILE_U8 | SLE_VAR_U16, SLV_176, SLV_180), SLE_CONDVAR(OrderBackup, vehicle_flags, SLE_UINT16, SLV_180, SL_MAX_VERSION), SLE_REF(OrderBackup, orders, REF_ORDER), diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index 5d993b928d..980d017973 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -364,6 +364,7 @@ enum SaveLoadVersion : uint16_t { SLV_STATION_RATING_CHEAT, ///< 320 PR#11346 Add cheat to fix station ratings at 100%. SLV_TIMETABLE_START_TICKS, ///< 321 PR#11468 Convert timetable start from a date to ticks. + SLV_TIMETABLE_START_TICKS_FIX, ///< 322 PR#11557 Fix for missing convert timetable start from a date to ticks. SL_MAX_VERSION, ///< Highest possible saveload version }; From e2425b72c1cd413a0b91e9d0254cc8beb3b76cd0 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 29 Nov 2023 12:35:00 +0000 Subject: [PATCH 040/105] Fix: Don't implicitly ReInit all windows after updating the character width cache. This caused duplicate ReInit when changing interface scale. --- src/gfx.cpp | 2 -- src/settings_table.cpp | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/gfx.cpp b/src/gfx.cpp index aed5aa3d3e..56a669dce9 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -1406,8 +1406,6 @@ void LoadStringWidthTable(bool monospace) _stringwidth_table[fs][i] = GetGlyphWidth(fs, i + 32); } } - - ReInitAllWindows(false); } /** diff --git a/src/settings_table.cpp b/src/settings_table.cpp index e0aed793b2..2f3c3d8cd2 100644 --- a/src/settings_table.cpp +++ b/src/settings_table.cpp @@ -270,6 +270,7 @@ static void ZoomMinMaxChanged(int32_t) _gui_zoom = _settings_client.gui.zoom_min; UpdateCursorSize(); LoadStringWidthTable(); + ReInitAllWindows(true); } } From 3317e29847624b6f377fc4405161aed04e419f9e Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 29 Nov 2023 12:35:02 +0000 Subject: [PATCH 041/105] Fix #11516: Adjust window size by interface scale during ReInit. To simplify this and ensure that scaling only occurs once, regardless of resize nesting, each window now remembers interface scale. --- src/window.cpp | 7 ++++--- src/window_gui.h | 2 ++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/window.cpp b/src/window.cpp index 409aa602bb..db284ffadf 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -958,8 +958,9 @@ void Window::ReInit(int rx, int ry, bool reposition) this->SetDirty(); // Mark whole current window as dirty. /* Save current size. */ - int window_width = this->width; - int window_height = this->height; + int window_width = this->width * _gui_scale / this->scale; + int window_height = this->height * _gui_scale / this->scale; + this->scale = _gui_scale; this->OnInit(); /* Re-initialize the window from the ground up. No need to change the nested_array, as all widgets stay where they are. */ @@ -1770,7 +1771,7 @@ void Window::InitNested(WindowNumber window_number) * Empty constructor, initialization has been moved to #InitNested() called from the constructor of the derived class. * @param desc The description of the window. */ -Window::Window(WindowDesc *desc) : window_desc(desc), mouse_capture_widget(-1) +Window::Window(WindowDesc *desc) : window_desc(desc), scale(_gui_scale), mouse_capture_widget(-1) { this->z_position = _z_windows.insert(_z_windows.end(), this); } diff --git a/src/window_gui.h b/src/window_gui.h index 16d5a4e1eb..5b9a3e3433 100644 --- a/src/window_gui.h +++ b/src/window_gui.h @@ -242,6 +242,8 @@ public: WindowClass window_class; ///< Window class WindowNumber window_number; ///< Window number within the window class + int scale; ///< Scale of this window -- used to determine how to resize. + uint8_t timeout_timer; ///< Timer value of the WF_TIMEOUT for flags. uint8_t white_border_timer; ///< Timer value of the WF_WHITE_BORDER for flags. From 2dcb00a79ac91520c734f4e24421566b0e1a14c1 Mon Sep 17 00:00:00 2001 From: translators Date: Fri, 8 Dec 2023 18:38:34 +0000 Subject: [PATCH 042/105] Update: Translations from eints galician: 88 changes by pvillaverde chinese (simplified): 4 changes by WenSimEHRP italian: 6 changes by Rivarossi turkish: 2 changes by densxd dutch: 5 changes by Afoklala --- src/lang/dutch.txt | 7 +- src/lang/galician.txt | 109 ++++++++++++++++++++++++++------ src/lang/italian.txt | 9 ++- src/lang/simplified_chinese.txt | 5 +- src/lang/turkish.txt | 3 +- 5 files changed, 105 insertions(+), 28 deletions(-) diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index 34644eac9f..03e69eff00 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -2581,7 +2581,7 @@ STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}Zoek inh STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}Je verlaat OpenTTD! STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}De voorwaarden voor het downloaden van inhoud van externe websites variëren.{}Ga naar de externe website voor instructies over het installeren van de inhoud in OpenTTD.{}Wil je doorgaan? STR_CONTENT_FILTER_TITLE :{BLACK}Tag-/naamfilter: -STR_CONTENT_OPEN_URL :{BLACK}Website bezoeken +STR_CONTENT_OPEN_URL :{BLACK}Website STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}Bezoek de website voor deze inhoud STR_CONTENT_DOWNLOAD_CAPTION :{BLACK}Download STR_CONTENT_DOWNLOAD_CAPTION_TOOLTIP :{BLACK}Start met het downloaden van de geselecteerde inhoud @@ -4707,9 +4707,12 @@ STR_TEXTFILE_NAVBACK_TOOLTIP :{BLACK}Terug in STR_TEXTFILE_NAVFORWARD_TOOLTIP :{BLACK}Vooruit in de bladergeschiedenis STR_TEXTFILE_WRAP_TEXT :{WHITE}Tekst afbreken STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Tekst aanpassen aan venster zodat je niet hoeft te bladeren -STR_TEXTFILE_VIEW_README :{BLACK}Leesmij-bestand bekijken +STR_TEXTFILE_VIEW_README :{BLACK}Leesmij-bestand +STR_TEXTFILE_VIEW_README_TOOLTIP :Leesmij-bestand bekijken STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Wijzigingen +STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP :Overzicht van wijzigingen bekijken STR_TEXTFILE_VIEW_LICENCE :{BLACK}Licentie +STR_TEXTFILE_VIEW_LICENCE_TOOLTIP :Licentie bekijken ###length 5 STR_TEXTFILE_README_CAPTION :{WHITE}{STRING} leesmij van {STRING} STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING} wijzigingen van {STRING} diff --git a/src/lang/galician.txt b/src/lang/galician.txt index b9ba1b95f9..d084e0f561 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -192,6 +192,23 @@ STR_COLOUR_WHITE :Branco STR_COLOUR_RANDOM :Ao chou ###length 17 +STR_COLOUR_SECONDARY_DARK_BLUE :Azul escuro +STR_COLOUR_SECONDARY_PALE_GREEN :Verde pálido +STR_COLOUR_SECONDARY_SECONDARY_PINK :Rosa +STR_COLOUR_SECONDARY_YELLOW :Amarelo +STR_COLOUR_SECONDARY_RED :Vermello +STR_COLOUR_SECONDARY_LIGHT_BLUE :Azul claro +STR_COLOUR_SECONDARY_GREEN :Verde +STR_COLOUR_SECONDARY_DARK_GREEN :Verde escuro +STR_COLOUR_SECONDARY_BLUE :Azul +STR_COLOUR_SECONDARY_CREAM :Crema +STR_COLOUR_SECONDARY_MAUVE :Malva +STR_COLOUR_SECONDARY_PURPLE :Morado +STR_COLOUR_SECONDARY_ORANGE :Laranxa +STR_COLOUR_SECONDARY_BROWN :Marrón +STR_COLOUR_SECONDARY_GREY :Gris +STR_COLOUR_SECONDARY_WHITE :Branco +STR_COLOUR_SECONDARY_SAME_AS_PRIMARY :Igual que o primario # Units used in OpenTTD @@ -432,7 +449,7 @@ STR_FILE_MENU_EXIT :Saír # Map menu STR_MAP_MENU_MAP_OF_WORLD :Mapa do mundo STR_MAP_MENU_EXTRA_VIEWPORT :Xanela extra -STR_MAP_MENU_LINGRAPH_LEGEND :Lenda de tomar carga +STR_MAP_MENU_LINGRAPH_LEGEND :Lenda do fluxo de carga STR_MAP_MENU_SIGN_LIST :Lista de rótulos # Town menu @@ -491,6 +508,7 @@ STR_NEWS_MENU_DELETE_ALL_MESSAGES :Borrar tódalas # About menu STR_ABOUT_MENU_LAND_BLOCK_INFO :Información de área de terreo +STR_ABOUT_MENU_HELP :Axuda e manuais STR_ABOUT_MENU_TOGGLE_CONSOLE :(Des)Activar consola STR_ABOUT_MENU_AI_DEBUG :Depuración IA/script do xogo STR_ABOUT_MENU_SCREENSHOT :Captura de pantalla @@ -499,6 +517,7 @@ STR_ABOUT_MENU_ABOUT_OPENTTD :Sobre 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Aliñador de sprites STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Activa/desactiva caixas delimitadoras STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Activa/desactiva a coloración de bloques modificados +STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES :Alternar a contorna dos Widgets # Place in highscore window ###length 15 @@ -591,7 +610,7 @@ STR_GRAPH_OPERATING_PROFIT_CAPTION :{WHITE}Gráfica STR_GRAPH_INCOME_CAPTION :{WHITE}Gráfico de ingresos STR_GRAPH_CARGO_DELIVERED_CAPTION :{WHITE}Unidades de carga entregadas STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION :{WHITE}Puntuación de rendemento da compañía (máximo=1000) -STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Valor da compañía +STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Gráfico do valor da compañía STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Taxas de pago por carga STR_GRAPH_CARGO_PAYMENT_RATES_X_LABEL :{TINY_FONT}{BLACK}Días en tránsito @@ -833,7 +852,7 @@ STR_NEWS_COMPANY_BANKRUPT_TITLE :{BIG_FONT}{BLAC STR_NEWS_COMPANY_BANKRUPT_DESCRIPTION :{BIG_FONT}{BLACK}{STRING} foi pechada polos acreedores e vendéronse tódalas posesións! STR_NEWS_COMPANY_LAUNCH_TITLE :{BIG_FONT}{BLACK}Lanzada unha nova compañía de transportes! STR_NEWS_COMPANY_LAUNCH_DESCRIPTION :{BIG_FONT}{BLACK}{STRING} comeza a construción preto de {TOWN}! -STR_NEWS_MERGER_TAKEOVER_TITLE :{BIG_FONT}{BLACK}{STRING} comprada por {STRING}! +STR_NEWS_MERGER_TAKEOVER_TITLE :{BIG_FONT}{BLACK}{STRING} foi comprada por {STRING} por unha cantidade non revelada! STR_PRESIDENT_NAME_MANAGER :{BLACK}{PRESIDENT_NAME}{}(Presidente) STR_NEWS_NEW_TOWN :{BLACK}{BIG_FONT}{STRING} promoveu a construción dunha nova cidade: {TOWN}! @@ -890,6 +909,8 @@ STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE :{BLACK}Nova {ST STR_NEWS_SHOW_VEHICLE_GROUP_TOOLTIP :{BLACK}Abre a fiestra de grupo enfocada no grupo do vehículo. +STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO_LIST :{WHITE}{STATION} xa non acepta: {CARGO_LIST} +STR_NEWS_STATION_NOW_ACCEPTS_CARGO_LIST :{WHITE}{STATION} agora acepta: {CARGO_LIST} STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}Oferta de subvención expirada:{}{}{STRING} dende {STRING} ata {STRING} non será subvencionada. STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Subvención reitrada:{}{}O servizo de transporte de {STRING} dende {STRING} ata {STRING} xa non ten subvención. @@ -934,6 +955,7 @@ STR_GAME_OPTIONS_VOLUME_100 :100% STR_GAME_OPTIONS_CURRENCY_UNITS_FRAME :{BLACK}Unidades monetarias STR_GAME_OPTIONS_CURRENCY_UNITS_DROPDOWN_TOOLTIP :{BLACK}Selección de unidades monetarias +STR_GAME_OPTIONS_CURRENCY_CODE :{STRING} ({STRING}) ###length 42 STR_GAME_OPTIONS_CURRENCY_GBP :Libra esterlina @@ -1041,17 +1063,18 @@ STR_GAME_OPTIONS_REFRESH_RATE_ITEM :{NUM}Hz STR_GAME_OPTIONS_REFRESH_RATE_WARNING :{WHITE}As tasas de refresco superiores a 60Hz poden afectar o rendemento. STR_GAME_OPTIONS_BASE_GRF :{BLACK}Conxunto básico de gráficos -STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Selecciona o conxunto de gráficos básico a empregar +STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Selecciona o conxunto de gráficos básico a empregar (non se pode cambiar na partida, só dende o menú principal) STR_GAME_OPTIONS_BASE_GRF_DESCRIPTION_TOOLTIP :{BLACK}Información adicional sobre o conxunto de gráficos básico STR_GAME_OPTIONS_BASE_SFX :{BLACK}Conxunto de sons base -STR_GAME_OPTIONS_BASE_SFX_TOOLTIP :{BLACK}Selecciona o conxunto de sons base a empregar +STR_GAME_OPTIONS_BASE_SFX_TOOLTIP :{BLACK}Selecciona o conxunto de sons base a empregar (non se pode cambiar na partida, só dende o menú principal) STR_GAME_OPTIONS_BASE_SFX_DESCRIPTION_TOOLTIP :{BLACK}Información adicional sobre o conxunto de sons base STR_GAME_OPTIONS_BASE_MUSIC :{BLACK}Conxunto de música base STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :{BLACK}Selecciona o conxunto de música base a empregar STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}Información adicional sobre o conxunto de música base +STR_BASESET_STATUS :{STRING} {RED}({NUM} ficheiro{P "" s} perdido{P "" s} ou corrupto{P "" s}) STR_ERROR_RESOLUTION_LIST_FAILED :{WHITE}Erro ao obter a lista de resolucións soportadas STR_ERROR_FULLSCREEN_FAILED :{WHITE}O modo de pantalla completa fallou @@ -1215,6 +1238,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_LEFT :Esquerda STR_CONFIG_SETTING_HORIZONTAL_POS_CENTER :Centro STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Dereita +STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}segundo{P 0 "" s} 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) @@ -1343,7 +1367,7 @@ STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :As novas ordes STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Normalmente, un vehículo parará en cada estación pola que pase, Activando esta opción, pasará por cada estación no camiño ata o seu destino final sen paradas. Ten en conta que esta opción só define un valor por defecto para as novas ordes. Pódense fixar ordes individuáis explícitamente para cada comportamento en calquera caso STR_CONFIG_SETTING_STOP_LOCATION :Os trens paran por defecto no {STRING} do andén -STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Lugar onde un tren parará por defecto no andén. 'Extremo cercano' significa preto do punto de entrada, 'medio' significa no medio do andén e 'extremo lonxano' significa alonxado do punto de entrada. Ten en conta que esta configuración só define un valor por defecto para as novas ordes. Pódense dar ordes individuáis explícitas para cada comportamento en calquera caso. +STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Lugar onde un tren parará por defecto no andén. 'Extremo cercano' significa preto do punto de entrada, 'medio' significa no medio do andén e 'extremo lonxano' significa alonxado do punto de entrada. Ten en conta que esta configuración só define un valor por defecto para as novas ordes. Pódense dar ordes individuáis explícitas facendo clic no texto da orde. ###length 3 STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :extremo cercano STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :medio @@ -1386,6 +1410,8 @@ STR_CONFIG_SETTING_PLANE_CRASHES_NONE :Ningún* STR_CONFIG_SETTING_PLANE_CRASHES_REDUCED :Reducido STR_CONFIG_SETTING_PLANE_CRASHES_NORMAL :Normal +STR_CONFIG_SETTING_CROSSING_WITH_COMPETITOR :Permitir pasos a nivel con estradas e ferrocarrís de outras compañías: {STRING} +STR_CONFIG_SETTING_CROSSING_WITH_COMPETITOR_HELPTEXT :Permitir a construción de pasos a nivel en estradas e ferrocarrís propiedade doutras compañías. STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Permiti-la construción de estacións pasantes nas rúas de titularidade municipal: {STRING} STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Permite a construcción de estacións pasantes sobre as rúas propiedade da cidade @@ -1399,6 +1425,8 @@ STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :Cando se activa STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR :Cor inicial da compañía: {STRING} STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_HELPTEXT :Escolle a cor inicial da túa compañía +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY :Cor secundaria inicial da compañía: {STRING} +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY_HELPTEXT :Escoller a cor secundaria de inicio da compañía, se utilizas un NewGRF que o permita. STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :Os aeroportos nunca caducan: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :Activar esta opción fai que cada tipo de aeroporto siga estando dispoñíbel para sempre dende a súa aparición @@ -1543,7 +1571,7 @@ STR_CONFIG_SETTING_LINKGRAPH_COLOURS_GREY_TO_RED :Gris a vermello STR_CONFIG_SETTING_LINKGRAPH_COLOURS_GREYSCALE :Escala de grises STR_CONFIG_SETTING_SCROLLMODE :Comportamento do desprazamento das xanelas: {STRING} -STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Comportamento cando te desplazas polo mapa +STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Comportamento cando te desplazas polo mapa. As opcións "bloqueo da posición do rato" non funcionan en todos os sistemas, como as de web, pantallas táctis, Linux con Wayland e outras. ###length 4 STR_CONFIG_SETTING_SCROLLMODE_DEFAULT :Mover xanela co botón dereito do rato, posición do cursor bloqueada STR_CONFIG_SETTING_SCROLLMODE_RMB_LOCKED :Mover mapa co botón dereito do rato, posición do cursor bloqueada @@ -1601,6 +1629,9 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Apagado STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Pechar a fiestra con click dereito: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Pecha a fiestra facendo botón dereito dentro de ela. Deshabilita a axuda contextual facendo click-dereito! ###length 3 +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_NO :Non +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES :Si +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES_EXCEPT_STICKY :Si, salvo que este fixada STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Empregar o formato de data {STRING} para os nomes das partidas gravadas STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Formato da data nos nomes das partidas gravadas @@ -1852,8 +1883,8 @@ STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Permitir ás po STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :As cidades poden construir pasos a nivel: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Activando esta opción, as cidades poden construir pasos a nivel -STR_CONFIG_SETTING_NOISE_LEVEL :Permitir á cidade controla-lo nivel de ruído dos aeroportos: {STRING} -STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Cando esta opción estea desactivada, pode haber dous aeroportos por cidade. Coa opción activada, o número de aeroportos por cidade está limitada polo nivel de aceptación de ruido da cidade, o cal depende da población da cidade, do tamaño do aeroporto e da distancia +STR_CONFIG_SETTING_NOISE_LEVEL :Limitar a colocación dos aeroportos en función do nivel de ruido: {STRING} +STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Permite que as vilas bloqueen a construción dos aeroportos en función do nivel tolerábel de ruído, o que se basea na poboación da vila, o tamaño do aeroporto e a distancia. Cando esta opción está desactivada, as vilas permitirán só dous aeroportos a non ser que a actitude da autoridade local sexa "Permisiva". STR_CONFIG_SETTING_TOWN_FOUNDING :Fundar cidades: {STRING} STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Activando esta opción, os distintos xogadores poden fundar novas cidades @@ -1927,9 +1958,9 @@ STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :Ningunha STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Multiplicador inicial do tamaño da cidade: {STRING} STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Relación entre o tamaño medio das cidades e o dos pobos ao inicio da partida -STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL :Actualizar o grafo de distribución cada {STRING}{NBSP}segundo{P 0:2 "" s}. +STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL :Actualizar o grafo de distribución cada {STRING} STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL_HELPTEXT :Tempo entre recálculos sucesivos do grafo de ligazóns. Cada recálculo calcula os plans para un compoñente do grafo. Iso significa que un valor X para esta configuración non significa que o grafo completo sexa actualizado cada X segundos. Só algúns compoñentes o serán. Canto máis curto sexa o tempo establecido, máis tempo de CPU será necesario para calculalo. Canto máis longo sexa o tempo establecido, máis tempo levará ata que a distribución de carga comece a percorrer novas rutas. -STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME :Toma {STRING}{NBSP}segundo{P 0:2 "" s} para o recálculo do grafo de distribución. +STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME :Toma {STRING} para o recálculo do gráfico de distribución. STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME_HELPTEXT :Tempo necesario para cada recalculación dun compoñente do grafo de ligazóns. Cando se inicia unha recalculación, abrese un fío que se pode executar durante este número de segundos. Canto máis curto o establezas, máis probable é que o fío non remate cando se supón que debe facelo. Entón, o xogo detense ata que o fío remata («lag»). Canto máis longo o estabelezas, máis tempo levará actualizar a distribución cando cambien as rutas. STR_CONFIG_SETTING_DISTRIBUTION_PAX :Modo de distribución para pasaxeiros: {STRING} @@ -2062,7 +2093,8 @@ STR_CONFIG_ERROR_SPRITECACHE_TOO_BIG :{WHITE} Fallo a # Video initalization errors STR_VIDEO_DRIVER_ERROR :{WHITE}Error na configuración de vídeo... -STR_VIDEO_DRIVER_ERROR_NO_HARDWARE_ACCELERATION :{WHITE}... non se atopu unha GPU compatible. Deshabilitarase a aceleración por hardware. +STR_VIDEO_DRIVER_ERROR_NO_HARDWARE_ACCELERATION :{WHITE}... non se atopou unha GPU compatible. Deshabilitada a aceleración por hardware. +STR_VIDEO_DRIVER_ERROR_HARDWARE_ACCELERATION_CRASH :{WHITE}... Os drivers da GPU provocaron un fallo no xogo. Deshabilitada aceleración por hardware. # Intro window STR_INTRO_CAPTION :{WHITE}OpenTTD {REV} @@ -2076,6 +2108,7 @@ STR_INTRO_MULTIPLAYER :{BLACK}Multixog STR_INTRO_GAME_OPTIONS :{BLACK}Opcións da partida STR_INTRO_HIGHSCORE :{BLACK}Táboa das máximas puntuacións +STR_INTRO_HELP :{BLACK}Axuda e manuais STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Opcións STR_INTRO_NEWGRF_SETTINGS :{BLACK}Configuración NewGRF STR_INTRO_ONLINE_CONTENT :{BLACK}Comprobar contido online @@ -2097,6 +2130,7 @@ STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Seleccio STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Mostra-las opcións da partida STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Mostrar táboa das máximas puntuacións +STR_INTRO_TOOLTIP_HELP :{BLACK}Obten acceso a documentación e recursos en liña STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Opcións de visualización STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Mostra-la configuración de NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Buscar contidos novos e actualizados para descargar @@ -2119,6 +2153,17 @@ STR_ABANDON_GAME_QUERY :{YELLOW}Estás STR_ABANDON_SCENARIO_QUERY :{YELLOW}Estás seguro de que queres saír deste escenario? # Help window +STR_HELP_WINDOW_CAPTION :{WHITE}Axuda e manuais +STR_HELP_WINDOW_WEBSITES :{BLACK}Sitios web +STR_HELP_WINDOW_DOCUMENTS :{BLACK}Documentos +STR_HELP_WINDOW_README :{BLACK}Léame +STR_HELP_WINDOW_CHANGELOG :{BLACK}Rexistro de cambios +STR_HELP_WINDOW_KNOWN_BUGS :{BLACK}Erros coñecidos +STR_HELP_WINDOW_LICENSE :{BLACK}Licenza +STR_HELP_WINDOW_MAIN_WEBSITE :{BLACK}OpenTTD +STR_HELP_WINDOW_MANUAL_WIKI :{BLACK}Manual / Wiki +STR_HELP_WINDOW_BUGTRACKER :{BLACK}Reportar un erro +STR_HELP_WINDOW_COMMUNITY :{BLACK}Comunidade # Cheat window STR_CHEATS :{WHITE}Trampulladas @@ -2134,6 +2179,7 @@ STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT :{WHITE}Trocar a STR_CHEAT_CHANGE_DATE :{LTBLUE}Cambiar data: {ORANGE}{DATE_SHORT} STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Cambiar o ano actual STR_CHEAT_SETUP_PROD :{LTBLUE}Permitir a modificación dos valores de producción: {ORANGE}{STRING} +STR_CHEAT_STATION_RATING :{LTBLUE}Manter a puntuacuón das estacións ao 100%: {ORANGE}{STRING} # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Novo esquema de cor @@ -2536,7 +2582,7 @@ STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}Procurar STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}Estás a saír de OpenTTD! STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}Os termos e condicións cambian para descargar contidos de páxinas web externas.{}Terás que dirixirte aos sitios web externos para ter instruccións acerca de cómo instalar os contidos en OpenTTD.{}Queres continuar? STR_CONTENT_FILTER_TITLE :{BLACK}Filtro etiqueta/nome: -STR_CONTENT_OPEN_URL :{BLACK}Visita a páxina web +STR_CONTENT_OPEN_URL :{BLACK}Páxina web STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}Visita a páxina web para este contido STR_CONTENT_DOWNLOAD_CAPTION :{BLACK}Descargar STR_CONTENT_DOWNLOAD_CAPTION_TOOLTIP :{BLACK}Comezar a descarga-lo contido seleccionado @@ -2607,6 +2653,7 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Habilita STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Habilitar transparencia para as pontes. CTRL+Click para bloquear STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Habilitar transparencia para estruturas coma faros e antenas. CTRL+Click para bloquear STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Activar a transparencia para a catenaria. CTRL+Click para bloquear +STR_TRANSPARENT_TEXT_TOOLTIP :{BLACK}Alternar transparencia para a carga e os textos de costes/ingresos. Ctrl+Clic para bloquear STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Facer os obxectos invisibles en lugar de transparentes # Linkgraph legend window @@ -2902,7 +2949,7 @@ STR_FOUND_TOWN_SELECT_LAYOUT_3X3_GRID :{BLACK}Grella 3 STR_FOUND_TOWN_SELECT_LAYOUT_RANDOM :{BLACK}Aleatoria # Fund new industry window -STR_FUND_INDUSTRY_CAPTION :{WHITE}Financiar unha nova industria +STR_FUND_INDUSTRY_CAPTION :{WHITE}Financiamento de industrias STR_FUND_INDUSTRY_SELECTION_TOOLTIP :{BLACK}Elixe a industria apropiada desta lista STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES :{BLACK}Moitas industrias aleatorias STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_TOOLTIP :{BLACK}Cubri-lo mapa con industrias colocadas aleatoriamente @@ -2918,14 +2965,14 @@ STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_CAPTION :{WHITE}Eliminar STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_QUERY :{YELLOW}Estás seguro de querer quitar todas as industrias? # Industry cargoes window -STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Cadea de industrias para a industria {STRING} -STR_INDUSTRY_CARGOES_CARGO_CAPTION :{WHITE}Cadea de industrias para a carga {STRING} +STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Cadea industrial - {STRING} +STR_INDUSTRY_CARGOES_CARGO_CAPTION :{WHITE}Cadea da carga - {STRING} STR_INDUSTRY_CARGOES_PRODUCERS :{WHITE}Industrias provedoras STR_INDUSTRY_CARGOES_CUSTOMERS :{WHITE}Industrias clientes STR_INDUSTRY_CARGOES_HOUSES :{WHITE}Casas STR_INDUSTRY_CARGOES_INDUSTRY_TOOLTIP :{BLACK}Pincha na industria para ver os seus provedores e clientes STR_INDUSTRY_CARGOES_CARGO_TOOLTIP :{BLACK}{STRING}{}Pincha na carga para ver os seus provedores e clientes -STR_INDUSTRY_DISPLAY_CHAIN :{BLACK}Mostrar cadea +STR_INDUSTRY_DISPLAY_CHAIN :{BLACK}Cadea industrial STR_INDUSTRY_DISPLAY_CHAIN_TOOLTIP :{BLACK}Mostra-las industrias provedoras e clientes da carga STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP :{BLACK}Ligar ao mapa STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP_TOOLTIP :{BLACK}Selecciona as industrias que tamén se amosan no mapa @@ -3321,6 +3368,7 @@ STR_SAVE_PRESET_SAVE :{BLACK}Gravar STR_SAVE_PRESET_SAVE_TOOLTIP :{BLACK}Gravar o establecido ao nome seleccionado actualmente # NewGRF parameters window +STR_BASEGRF_PARAMETERS_CAPTION :{WHITE}Cambiar os parámetros dos gráficos base STR_NEWGRF_PARAMETERS_CAPTION :{WHITE}Cambiar os parámetros de NewGRF STR_NEWGRF_PARAMETERS_CLOSE :{BLACK}Pechar STR_NEWGRF_PARAMETERS_RESET :{BLACK}Reiniciar @@ -3337,6 +3385,7 @@ STR_NEWGRF_INSPECT_PARENT_TOOLTIP :{BLACK}Inspecci STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT :{STRING} en {HEX} STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_OBJECT :Obxecto STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_RAIL_TYPE :Tipo de carril +STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_ROAD_TYPE :Tipo de estrada STR_NEWGRF_INSPECT_QUERY_CAPTION :{WHITE}Parámetro de variable NewGRF 60+x (hexadecimal) @@ -3520,8 +3569,8 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{Y STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{PUSH_COLOUR}{YELLOW}Financiar a reconstrución das rúas da localidade.{}Provoca unhas considerables interrupcións no tráfico durante seis meses.{}{POP_COLOUR}Custo: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Construír unha estatua en honor a túa compañía.{}Condede un aumento permanente da puntuación das túas estacións nesta localide.{}{POP_COLOUR}Custo: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW} Financiar a construción de novos edificios comerciais na cidade.{}Concede un aumento temporal do crecemento desta localide.{}{POP_COLOUR}Custo: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}Comprar os dereitos exclusivos de transporte na cidade durante 1 ano.{}A autoridade só permitirá que os pasaxeiros e as mercadorías usen as estacións da túa compañía.{}{POP_COLOUR}Custo: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Suborna-la autoridade local para mellora-la túa puntuación, co risco dunha gran penalización se o descobren.{}{POP_COLOUR}Custo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}Comprar os dereitos exclusivos de transporte na cidade durante 1 ano.{}A autoridade só permitirá que os pasaxeiros e as mercadorías usen as estacións da túa compañía. Un soborno exitoso doutro competidor cancelará este contrato.{}{POP_COLOUR}Custo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Suborna-la autoridade local para mellorar a túa puntuación e abotar os dereitos de transporte exclusivos doutro competidor, co risco dunha gran penalización se o descobren.{}{POP_COLOUR}Custo: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}{COMPANY} Obxectivos @@ -3743,6 +3792,8 @@ STR_COMPANY_VIEW_INFRASTRUCTURE_BUTTON :{BLACK}Detalles STR_COMPANY_VIEW_INFRASTRUCTURE_TOOLTIP :{BLACK}Ver contas detalladas de infraestrutura STR_COMPANY_VIEW_GIVE_MONEY_BUTTON :{BLACK}Dar cartos STR_COMPANY_VIEW_GIVE_MONEY_TOOLTIP :{BLACK}Dar cartos a esta compañía +STR_COMPANY_VIEW_HOSTILE_TAKEOVER_BUTTON :{BLACK}OPA Hostil +STR_COMPANY_VIEW_HOSTILE_TAKEOVER_TOOLTIP :{BLACK}Facer unha OPA Hostil desta compañía STR_COMPANY_VIEW_NEW_FACE_BUTTON :{BLACK}Nova cara STR_COMPANY_VIEW_NEW_FACE_TOOLTIP :{BLACK}Selecciona-la nova cara do presidente @@ -3758,6 +3809,7 @@ STR_COMPANY_VIEW_PRESIDENT_S_NAME_QUERY_CAPTION :Nome do preside STR_COMPANY_VIEW_GIVE_MONEY_QUERY_CAPTION :Introduce a cantidade de cartos que queres dar STR_BUY_COMPANY_MESSAGE :{WHITE}Buscamos unha compañía de transportes para adquiri-la nosa compañía{}{}Queres mercar{COMPANY} por {CURRENCY_LONG}? +STR_BUY_COMPANY_HOSTILE_TAKEOVER :{WHITE}Nunha OPA Hostil de {COMPANY}, comprarás todos os activos, liquidarás todos os préstamos e pagarás a suma dos beneficios de dous anos.{}{}O total estímase en {CURRENCY_LONG}.{}{}Queres continuar con esta OPA Hostil? # Company infrastructure window STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infraestrutura de {COMPANY} @@ -3829,6 +3881,7 @@ STR_VEHICLE_LIST_MANAGE_LIST :{BLACK}Xestiona STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Envia-las instruccións a tódolos vehículos desta lista STR_VEHICLE_LIST_REPLACE_VEHICLES :Reemprazar vehículos STR_VEHICLE_LIST_SEND_FOR_SERVICING :Enviar para servizo +STR_VEHICLE_LIST_CREATE_GROUP :Crear grupo STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Beneficio este ano: {CURRENCY_LONG} (ano pasado: {CURRENCY_LONG}) STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}] STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRING} @@ -4551,6 +4604,8 @@ STR_TIMETABLE_EXPECTED :{BLACK}Esperado STR_TIMETABLE_SCHEDULED :{BLACK}Programado STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Alternar entre o esperado e o programado +STR_TIMETABLE_ARRIVAL :A: {COLOUR}{DATE_TINY} +STR_TIMETABLE_DEPARTURE :D: {COLOUR}{DATE_TINY} # Date window (for timetable) @@ -4646,16 +4701,25 @@ STR_AI_SETTINGS_SETTING :{STRING}: {ORAN # Textfile window +STR_TEXTFILE_JUMPLIST :{WHITE}Táboa de contidos +STR_TEXTFILE_JUMPLIST_TOOLTIP :{BLACK}Saltar rápido a sección no ficheiro amosado nesta lista +STR_TEXTFILE_JUMPLIST_ITEM :{WHITE}{STRING} +STR_TEXTFILE_NAVBACK_TOOLTIP :{BLACK}Retroceder no historial de navegación +STR_TEXTFILE_NAVFORWARD_TOOLTIP :{BLACK}Avanzar no historial de navegación STR_TEXTFILE_WRAP_TEXT :{WHITE}Axustar texto STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Axusta o texto á fiestra de xeito que encaixa sen ter que facer scroll -STR_TEXTFILE_VIEW_README :{BLACK}Ver "readme" +STR_TEXTFILE_VIEW_README :{BLACK}Léame +STR_TEXTFILE_VIEW_README_TOOLTIP :Ver o "léame" deste contido STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Rexistro de cambios +STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP :Ver a listaxe de cambios deste contido STR_TEXTFILE_VIEW_LICENCE :{BLACK}Licenza +STR_TEXTFILE_VIEW_LICENCE_TOOLTIP :Ver a licenza deste contido ###length 5 STR_TEXTFILE_README_CAPTION :{WHITE} "readme" de {STRING} {STRING} STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}Rexistro de cambios de {STRING} {STRING} STR_TEXTFILE_LICENCE_CAPTION :{WHITE} licenza de {STRING}{STRING} STR_TEXTFILE_SURVEY_RESULT_CAPTION :{WHITE}Previsualizar resultado da enquisa +STR_TEXTFILE_GAME_MANUAL_CAPTION :{WHITE}OpenTTD, documento '{STRING}' # Vehicle loading indicators @@ -4837,7 +4901,7 @@ STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Demasiad STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Demasiado preto doutro peirao STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Demasiado preto doutro aeroporto STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Non se pode renomear a estación... -STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... esta rúa pertenece á cidade +STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... esta rúa é municipal STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... a estrada vai na dirección incorrecta STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... as paradas pasantes non poden ter esquinas STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... as paradas pasantes non poder ter interseccións @@ -5112,6 +5176,7 @@ STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Non se p STR_ERROR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}Os vehículos só poden parar nas estacións STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}Este vehículo non para nesta estación STR_ERROR_TIMETABLE_INCOMPLETE :{WHITE}... horario incompleto +STR_ERROR_TIMETABLE_NOT_STARTED :{WHITE}... o horario aínda non comezou # Sign related errors STR_ERROR_TOO_MANY_SIGNS :{WHITE}... demasiados sinais @@ -5604,6 +5669,8 @@ STR_JUST_DATE_SHORT :{DATE_SHORT} STR_JUST_DATE_LONG :{DATE_LONG} STR_JUST_DATE_ISO :{DATE_ISO} STR_JUST_STRING :{STRING} +STR_JUST_STRING1 :{STRING} +STR_JUST_STRING2 :{STRING} STR_JUST_STRING_STRING :{STRING}{STRING} STR_JUST_RAW_STRING :{STRING} STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRING} diff --git a/src/lang/italian.txt b/src/lang/italian.txt index 88b6fd5a7b..6ce8ee18e8 100644 --- a/src/lang/italian.txt +++ b/src/lang/italian.txt @@ -1994,7 +1994,7 @@ STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Dimensione medi STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL :Aggiornare il grafico di distribuzione ogni {STRING} STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL_HELPTEXT :Tempo tra i successivi ricalcoli del grafico dei collegamenti. Ogni ricalcolo calcola i piani per un componente del grafico. Ciò significa che un valore X per questa impostazione non significa che l'intero grafico verrà aggiornato ogni X secondi. Solo alcuni componenti lo saranno. Quanto più breve è l'impostazione, tanto più tempo di CPU sarà necessario per il calcolo. Più lungo è il valore impostato, più tempo ci vorrà prima che la distribuzione del carico inizi su nuove rotte. -STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME :Prendere {STRING} per il ricalcolo del grafico di distribuzione +STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME :Impiegare {STRING} per il ricalcolo del grafico di distribuzione STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME_HELPTEXT :Tempo necessario per ogni ricalcolo di un componente del grafo dei collegamenti. Quando viene avviato un ricalcolo, viene generato un thread che può essere eseguito per questo numero di secondi. Quanto più breve è il tempo impostato, tanto più è probabile che il thread non finisca quando dovrebbe. In questo caso il gioco si ferma finché non viene terminato ("lag"). Più lungo è il valore impostato, più tempo ci vuole per aggiornare la distribuzione quando i percorsi cambiano. STR_CONFIG_SETTING_DISTRIBUTION_PAX :Modalità di distribuzione dei passeggeri: {STRING} @@ -2616,7 +2616,7 @@ STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}Cerca co STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}Si sta lasciando OpenTTD STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}I termini e le condizioni per lo scaricamento di contenuti da siti web esterni possono variare.{}Fare riferimento ai siti esterni per istruzioni su come installare il contenuto in OpenTTD.{}Si desidera proseguire? STR_CONTENT_FILTER_TITLE :{BLACK}Filtra per nome/tag: -STR_CONTENT_OPEN_URL :{BLACK}Visita sito web +STR_CONTENT_OPEN_URL :{BLACK}Sito web STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}Visita il sito web di questo contenuto STR_CONTENT_DOWNLOAD_CAPTION :{BLACK}Scarica STR_CONTENT_DOWNLOAD_CAPTION_TOOLTIP :{BLACK}Avvia il download dei contenuti selezionati @@ -4748,9 +4748,12 @@ STR_TEXTFILE_NAVBACK_TOOLTIP :{BLACK}Torna in STR_TEXTFILE_NAVFORWARD_TOOLTIP :{BLACK}Vai avanti nella cronologia di navigazione STR_TEXTFILE_WRAP_TEXT :{WHITE}A capo automatico STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Manda automaticamente a capo il testo della finestra in modo che sia visibile senza doverlo scorrere -STR_TEXTFILE_VIEW_README :{BLACK}Visualizza file leggimi +STR_TEXTFILE_VIEW_README :{BLACK}Leggimi +STR_TEXTFILE_VIEW_README_TOOLTIP :Visualizza il file Readme di questo contenuto STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Changelog +STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP :Visualizza il changelog di questo contenuto STR_TEXTFILE_VIEW_LICENCE :{BLACK}Licenza +STR_TEXTFILE_VIEW_LICENCE_TOOLTIP :Visualizza la licenza per questo contenuto ###length 5 STR_TEXTFILE_README_CAPTION :{WHITE}File leggimi del {STRING} {STRING} STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}Changelog del {STRING} {STRING} diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index 7cf9b1410a..fa50a9e4d0 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -2580,7 +2580,7 @@ STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}在与Op STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}正在离开游戏! STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}在外部网站下载內容的规则及条款可能跟OpenTTD引用的规则及条款不同。{}您需要参照有关网站以取得在OpenTTD安装有关內容的资讯。{}您要継续吗? STR_CONTENT_FILTER_TITLE :{BLACK}标签/名称过滤器 -STR_CONTENT_OPEN_URL :{BLACK}查看主页 +STR_CONTENT_OPEN_URL :{BLACK}主页 STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}打开该扩展包主页 STR_CONTENT_DOWNLOAD_CAPTION :{BLACK}下载 STR_CONTENT_DOWNLOAD_CAPTION_TOOLTIP :{BLACK}下载选定的内容 @@ -4707,8 +4707,11 @@ STR_TEXTFILE_NAVFORWARD_TOOLTIP :{BLACK}取消 STR_TEXTFILE_WRAP_TEXT :{WHITE}強迫文字换行 STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}強迫宽于窗格的內文自动换行 STR_TEXTFILE_VIEW_README :{BLACK}查看说明 +STR_TEXTFILE_VIEW_README_TOOLTIP :查看此项目的说明文件 STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}更新日志 +STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP :查看此项目的许可证 STR_TEXTFILE_VIEW_LICENCE :{BLACK}版权信息 +STR_TEXTFILE_VIEW_LICENCE_TOOLTIP :查看此项目的许可证 ###length 5 STR_TEXTFILE_README_CAPTION :{WHITE}{STRING} {STRING} 的说明 STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING} {STRING} 的更新日志 diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt index a176d5e3ed..188977a911 100644 --- a/src/lang/turkish.txt +++ b/src/lang/turkish.txt @@ -2580,7 +2580,7 @@ STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}OpenTTD' STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}OpenTTD'den çıkıyorsunuz! STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}Harici sitelerden içerik indirmenin şart ve koşulları değişiklik gösterir.{}İndirdiğiniz içeriği OpenTTD'ye nasıl kuracağınıza dair talimatlar için harici sitelere bakmalısınız.{}Devam etmek istiyor musunuz? STR_CONTENT_FILTER_TITLE :{BLACK}Etiket/isim süzgeci: -STR_CONTENT_OPEN_URL :{BLACK}İnternet sitesine git +STR_CONTENT_OPEN_URL :{BLACK}Website STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}Bu içeriğin internet sitesi STR_CONTENT_DOWNLOAD_CAPTION :{BLACK}İndir STR_CONTENT_DOWNLOAD_CAPTION_TOOLTIP :{BLACK}Seçili içeriği indirmeye başla @@ -4708,6 +4708,7 @@ STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Metni, o STR_TEXTFILE_VIEW_README :{BLACK}Benioku dosyasını göster STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Değişiklik kayıtları STR_TEXTFILE_VIEW_LICENCE :{BLACK}Lisans +STR_TEXTFILE_VIEW_LICENCE_TOOLTIP :Bu içeriğin lisansını incele ###length 5 STR_TEXTFILE_README_CAPTION :{WHITE}{STRING} adlı {STRING}'nin benioku dosyası STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING} adlı {STRING}'nin değişiklik kaydı From 52b121942bb001483825d16e194265304b708691 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 7 Dec 2023 16:20:40 +0000 Subject: [PATCH 043/105] Codechange: DropdownWindow's selected_index is not actually an index. --- src/widgets/dropdown.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/widgets/dropdown.cpp b/src/widgets/dropdown.cpp index 784e75f0da..b25eeb7c07 100644 --- a/src/widgets/dropdown.cpp +++ b/src/widgets/dropdown.cpp @@ -42,7 +42,7 @@ static WindowDesc _dropdown_desc(__FILE__, __LINE__, struct DropdownWindow : Window { int parent_button; ///< Parent widget number where the window is dropped from. const DropDownList list; ///< List with dropdown menu items. - int selected_index; ///< Index of the selected item in the list. + int selected_result; ///< Result value of the selected item in the list. byte click_delay; ///< Timer to delay selection. bool drag_mode; bool instant_close; ///< Close the window when the mouse button is raised. @@ -54,7 +54,7 @@ struct DropdownWindow : Window { * Create a dropdown menu. * @param parent Parent window. * @param list Dropdown item list. - * @param selected Index of the selected item in the list. + * @param selected Initial selected result of the list. * @param button Widget of the parent window doing the dropdown. * @param instant_close Close the window when the mouse button is raised. * @param position Topleft position of the dropdown menu window. @@ -98,7 +98,7 @@ struct DropdownWindow : Window { this->parent = parent; this->parent_button = button; - this->selected_index = selected; + this->selected_result = selected; this->click_delay = 0; this->drag_mode = true; this->instant_close = instant_close; @@ -113,7 +113,7 @@ struct DropdownWindow : Window { Point pt = _cursor.pos; pt.x -= this->parent->left; pt.y -= this->parent->top; - this->parent->OnDropdownClose(pt, this->parent_button, this->selected_index, this->instant_close); + this->parent->OnDropdownClose(pt, this->parent_button, this->selected_result, this->instant_close); /* Set flag on parent widget to indicate that we have just closed. */ NWidgetCore *nwc = this->parent->GetWidget(this->parent_button); @@ -182,7 +182,7 @@ struct DropdownWindow : Window { if (y + item_height - 1 <= ir.bottom) { Rect full{ir.left, y, ir.right, y + item_height - 1}; - bool selected = (this->selected_index == item->result) && item->Selectable(); + bool selected = (this->selected_result == item->result) && item->Selectable(); if (selected) GfxFillRect(full, PC_BLACK); item->Draw(full, full.Shrink(WidgetDimensions::scaled.dropdowntext, RectPadding::zero), selected, colour); @@ -197,7 +197,7 @@ struct DropdownWindow : Window { int item; if (this->GetDropDownItem(item)) { this->click_delay = 4; - this->selected_index = item; + this->selected_result = item; this->SetDirty(); } } @@ -217,7 +217,7 @@ struct DropdownWindow : Window { /* Close the dropdown, so it doesn't affect new window placement. * Also mark it dirty in case the callback deals with the screen. (e.g. screenshots). */ this->Close(); - this->parent->OnDropdownSelect(this->parent_button, this->selected_index); + this->parent->OnDropdownSelect(this->parent_button, this->selected_result); return; } @@ -245,8 +245,8 @@ struct DropdownWindow : Window { if (!this->GetDropDownItem(item)) return; } - if (this->selected_index != item) { - this->selected_index = item; + if (this->selected_result != item) { + this->selected_result = item; this->SetDirty(); } } From f1cceb43a159b46c8de9f028e7b3024ce2e14307 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 7 Dec 2023 10:23:04 +0000 Subject: [PATCH 044/105] Codechange: Move initialization of DropdownWindow members. --- src/widgets/dropdown.cpp | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/widgets/dropdown.cpp b/src/widgets/dropdown.cpp index b25eeb7c07..c5b16df347 100644 --- a/src/widgets/dropdown.cpp +++ b/src/widgets/dropdown.cpp @@ -43,10 +43,10 @@ struct DropdownWindow : Window { int parent_button; ///< Parent widget number where the window is dropped from. const DropDownList list; ///< List with dropdown menu items. int selected_result; ///< Result value of the selected item in the list. - byte click_delay; ///< Timer to delay selection. - bool drag_mode; + byte click_delay = 0; ///< Timer to delay selection. + bool drag_mode = true; bool instant_close; ///< Close the window when the mouse button is raised. - int scrolling; ///< If non-zero, auto-scroll the item list (one time). + int scrolling = 0; ///< If non-zero, auto-scroll the item list (one time). Point position; ///< Position of the topleft corner of the window. Scrollbar *vscroll; @@ -63,11 +63,16 @@ struct DropdownWindow : Window { * @param scroll Dropdown menu has a scrollbar. */ DropdownWindow(Window *parent, DropDownList &&list, int selected, int button, bool instant_close, const Point &position, const Dimension &size, Colours wi_colour, bool scroll) - : Window(&_dropdown_desc), list(std::move(list)) + : Window(&_dropdown_desc) + , parent_button(button) + , list(std::move(list)) + , selected_result(selected) + , instant_close(instant_close) + , position(position) { assert(!this->list.empty()); - this->position = position; + this->parent = parent; this->CreateNestedTree(); @@ -95,13 +100,6 @@ struct DropdownWindow : Window { /* Capacity is the average number of items visible */ this->vscroll->SetCapacity(size.height * this->list.size() / list_height); this->vscroll->SetCount(this->list.size()); - - this->parent = parent; - this->parent_button = button; - this->selected_result = selected; - this->click_delay = 0; - this->drag_mode = true; - this->instant_close = instant_close; } void Close([[maybe_unused]] int data = 0) override From a29766d6cc70f47247e4b8fc24d6bdc4921148b9 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 7 Dec 2023 12:44:25 +0000 Subject: [PATCH 045/105] Codechange: Move dropdown list size and position calculation to window. This simplifies initialization of DropdownWindow, as instead of both the caller code and the class needing to know about list sizes and available space, only the DropdownWindow needs to know. --- src/widgets/dropdown.cpp | 163 +++++++++++++++++++-------------------- 1 file changed, 78 insertions(+), 85 deletions(-) diff --git a/src/widgets/dropdown.cpp b/src/widgets/dropdown.cpp index c5b16df347..b60117fa7d 100644 --- a/src/widgets/dropdown.cpp +++ b/src/widgets/dropdown.cpp @@ -24,7 +24,7 @@ static const NWidgetPart _nested_dropdown_menu_widgets[] = { NWidget(NWID_HORIZONTAL), - NWidget(WWT_PANEL, COLOUR_END, WID_DM_ITEMS), SetMinimalSize(1, 1), SetScrollbar(WID_DM_SCROLL), EndContainer(), + NWidget(WWT_PANEL, COLOUR_END, WID_DM_ITEMS), SetScrollbar(WID_DM_SCROLL), EndContainer(), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_DM_SHOW_SCROLL), NWidget(NWID_VSCROLLBAR, COLOUR_END, WID_DM_SCROLL), EndContainer(), @@ -41,6 +41,7 @@ static WindowDesc _dropdown_desc(__FILE__, __LINE__, /** Drop-down menu window */ struct DropdownWindow : Window { int parent_button; ///< Parent widget number where the window is dropped from. + Rect wi_rect; ///< Rect of the button that opened the dropdown. const DropDownList list; ///< List with dropdown menu items. int selected_result; ///< Result value of the selected item in the list. byte click_delay = 0; ///< Timer to delay selection. @@ -50,25 +51,25 @@ struct DropdownWindow : Window { Point position; ///< Position of the topleft corner of the window. Scrollbar *vscroll; + Dimension items_dim; ///< Calculated cropped and padded dimension for the items widget. + /** * Create a dropdown menu. * @param parent Parent window. * @param list Dropdown item list. * @param selected Initial selected result of the list. * @param button Widget of the parent window doing the dropdown. + * @param wi_rect Rect of the button that opened the dropdown. * @param instant_close Close the window when the mouse button is raised. - * @param position Topleft position of the dropdown menu window. - * @param size Size of the dropdown menu window. * @param wi_colour Colour of the parent widget. - * @param scroll Dropdown menu has a scrollbar. */ - DropdownWindow(Window *parent, DropDownList &&list, int selected, int button, bool instant_close, const Point &position, const Dimension &size, Colours wi_colour, bool scroll) + DropdownWindow(Window *parent, DropDownList &&list, int selected, int button, const Rect wi_rect, bool instant_close, Colours wi_colour) : Window(&_dropdown_desc) , parent_button(button) + , wi_rect(wi_rect) , list(std::move(list)) , selected_result(selected) , instant_close(instant_close) - , position(position) { assert(!this->list.empty()); @@ -76,30 +77,13 @@ struct DropdownWindow : Window { this->CreateNestedTree(); + this->GetWidget(WID_DM_ITEMS)->colour = wi_colour; + this->GetWidget(WID_DM_SCROLL)->colour = wi_colour; this->vscroll = this->GetScrollbar(WID_DM_SCROLL); - - uint items_width = size.width - (scroll ? NWidgetScrollbar::GetVerticalDimension().width : 0); - NWidgetCore *nwi = this->GetWidget(WID_DM_ITEMS); - nwi->SetMinimalSizeAbsolute(items_width, size.height + WidgetDimensions::scaled.dropdownlist.Vertical()); - nwi->colour = wi_colour; - - nwi = this->GetWidget(WID_DM_SCROLL); - nwi->colour = wi_colour; - - this->GetWidget(WID_DM_SHOW_SCROLL)->SetDisplayedPlane(scroll ? 0 : SZSP_NONE); + this->UpdateSizeAndPosition(); this->FinishInitNested(0); CLRBITS(this->flags, WF_WHITE_BORDER); - - /* Total length of list */ - int list_height = 0; - for (const auto &item : this->list) { - list_height += item->Height(); - } - - /* Capacity is the average number of items visible */ - this->vscroll->SetCapacity(size.height * this->list.size() / list_height); - this->vscroll->SetCount(this->list.size()); } void Close([[maybe_unused]] int data = 0) override @@ -126,6 +110,73 @@ struct DropdownWindow : Window { } } + /** + * Fit dropdown list into available height, rounding to average item size. Width is adjusted if scrollbar is present. + * @param[in,out] desired Desired dimensions of dropdown list. + * @param list Dimensions of the list itself, without padding or cropping. + * @param available_height Available height to fit list within. + */ + void FitAvailableHeight(Dimension &desired, const Dimension &list, uint available_height) + { + if (desired.height < available_height) return; + + /* If the dropdown doesn't fully fit, we a need a dropdown. */ + uint avg_height = list.height / (uint)this->list.size(); + uint rows = std::max((available_height - WidgetDimensions::scaled.dropdownlist.Vertical()) / avg_height, 1U); + + desired.width = std::max(list.width, desired.width - NWidgetScrollbar::GetVerticalDimension().width); + desired.height = rows * avg_height + WidgetDimensions::scaled.dropdownlist.Vertical(); + } + + /** + * Update size and position of window to fit dropdown list into available space. + */ + void UpdateSizeAndPosition() + { + Rect button_rect = this->wi_rect.Translate(this->parent->left, this->parent->top); + + /* Get the dimensions required for the list. */ + Dimension list_dim = GetDropDownListDimension(this->list); + + /* Set up dimensions for the items widget. */ + Dimension widget_dim = list_dim; + widget_dim.width += WidgetDimensions::scaled.dropdownlist.Horizontal(); + widget_dim.height += WidgetDimensions::scaled.dropdownlist.Vertical(); + + /* Width should match at least the width of the parent widget. */ + widget_dim.width = std::max(widget_dim.width, button_rect.Width()); + + /* Available height below (or above, if the dropdown is placed above the widget). */ + uint available_height_below = std::max(GetMainViewBottom() - button_rect.bottom - 1, 0); + uint available_height_above = std::max(button_rect.top - 1 - GetMainViewTop(), 0); + + /* Is it better to place the dropdown above the widget? */ + if (widget_dim.height > available_height_below && available_height_above > available_height_below) { + FitAvailableHeight(widget_dim, list_dim, available_height_above); + this->position.y = button_rect.top - widget_dim.height; + } else { + FitAvailableHeight(widget_dim, list_dim, available_height_below); + this->position.y = button_rect.bottom + 1; + } + + this->position.x = (_current_text_dir == TD_RTL) ? button_rect.right + 1 - (int)widget_dim.width : button_rect.left; + + this->items_dim = widget_dim; + this->GetWidget(WID_DM_SHOW_SCROLL)->SetDisplayedPlane(list_dim.height > widget_dim.height ? 0 : SZSP_NONE); + + /* Capacity is the average number of items visible */ + this->vscroll->SetCapacity((widget_dim.height - WidgetDimensions::scaled.dropdownlist.Vertical()) * this->list.size() / list_dim.height); + this->vscroll->SetCount(this->list.size()); + + /* If the dropdown is positioned above the parent widget, start selection at the bottom. */ + if (this->position.y < button_rect.top && list_dim.height > widget_dim.height) this->vscroll->UpdatePosition(INT_MAX); + } + + void UpdateWidgetSize(int widget, Dimension *size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension *fill, [[maybe_unused]] Dimension *resize) override + { + if (widget == WID_DM_ITEMS) *size = this->items_dim; + } + Point OnInitialPosition([[maybe_unused]] int16_t sm_width, [[maybe_unused]] int16_t sm_height, [[maybe_unused]] int window_number) override { return this->position; @@ -281,65 +332,7 @@ Dimension GetDropDownListDimension(const DropDownList &list) void ShowDropDownListAt(Window *w, DropDownList &&list, int selected, int button, Rect wi_rect, Colours wi_colour, bool instant_close) { CloseWindowByClass(WC_DROPDOWN_MENU); - - /* The preferred position is just below the dropdown calling widget */ - int top = w->top + wi_rect.bottom + 1; - - /* The preferred width equals the calling widget */ - uint width = wi_rect.Width(); - - /* Get the height and width required for the list. */ - Dimension dim = GetDropDownListDimension(list); - dim.width += WidgetDimensions::scaled.dropdownlist.Horizontal(); - - /* Scrollbar needed? */ - bool scroll = false; - - /* Is it better to place the dropdown above the widget? */ - bool above = false; - - /* Available height below (or above, if the dropdown is placed above the widget). */ - uint available_height = std::max(GetMainViewBottom() - top - (int)WidgetDimensions::scaled.dropdownlist.Vertical(), 0); - - /* If the dropdown doesn't fully fit below the widget... */ - if (dim.height > available_height) { - - uint available_height_above = std::max(w->top + wi_rect.top - GetMainViewTop() - (int)WidgetDimensions::scaled.dropdownlist.Vertical(), 0); - - /* Put the dropdown above if there is more available space. */ - if (available_height_above > available_height) { - above = true; - available_height = available_height_above; - } - - /* If the dropdown doesn't fully fit, we need a dropdown. */ - if (dim.height > available_height) { - scroll = true; - uint avg_height = dim.height / (uint)list.size(); - - /* Fit the list; create at least one row, even if there is no height available. */ - uint rows = std::max(available_height / avg_height, 1); - dim.height = rows * avg_height; - - /* Add space for the scrollbar. */ - dim.width += NWidgetScrollbar::GetVerticalDimension().width; - } - - /* Set the top position if needed. */ - if (above) { - top = w->top + wi_rect.top - dim.height - WidgetDimensions::scaled.dropdownlist.Vertical(); - } - } - - dim.width = std::max(width, dim.width); - - Point dw_pos = { w->left + (_current_text_dir == TD_RTL ? wi_rect.right + 1 - (int)width : wi_rect.left), top}; - DropdownWindow *dropdown = new DropdownWindow(w, std::move(list), selected, button, instant_close, dw_pos, dim, wi_colour, scroll); - - /* The dropdown starts scrolling downwards when opening it towards - * the top and holding down the mouse button. It can be fooled by - * opening the dropdown scrolled to the very bottom. */ - if (above && scroll) dropdown->vscroll->UpdatePosition(INT_MAX); + new DropdownWindow(w, std::move(list), selected, button, wi_rect, instant_close, wi_colour); } /** From 54d45a60475e3dd0935ab634432c9869b4ea8fef Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 7 Dec 2023 19:27:00 +0000 Subject: [PATCH 046/105] Codechange: Don't keep autosave_interval in std::chrono::minutes. This variable is saved as a setting which requires the variable type to be known, but std::chrono::minutes may vary depending on system type. Instead, keep as uint32_t and convert to std::chrono::minutes only when setting the timer. --- src/openttd.cpp | 2 +- src/settings.cpp | 10 +++++----- src/settings_gui.cpp | 12 ++++++------ src/settings_type.h | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/openttd.cpp b/src/openttd.cpp index 96f7dc7d98..c507abae78 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -1475,7 +1475,7 @@ static IntervalTimer _autosave_interval({std::chrono::millise */ void ChangeAutosaveFrequency(bool reset) { - _autosave_interval.SetInterval({_settings_client.gui.autosave_interval, TimerGameRealtime::AUTOSAVE}, reset); + _autosave_interval.SetInterval({std::chrono::minutes(_settings_client.gui.autosave_interval), TimerGameRealtime::AUTOSAVE}, reset); } /** diff --git a/src/settings.cpp b/src/settings.cpp index 5e8c0b266f..01ad5bdbf6 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -1397,11 +1397,11 @@ void LoadFromConfig(bool startup) auto old_value = OneOfManySettingDesc::ParseSingleValue(old_item->value->c_str(), old_item->value->size(), _old_autosave_interval); switch (old_value) { - case 0: _settings_client.gui.autosave_interval = std::chrono::minutes::zero(); break; - case 1: _settings_client.gui.autosave_interval = std::chrono::minutes(10); break; - case 2: _settings_client.gui.autosave_interval = std::chrono::minutes(30); break; - case 3: _settings_client.gui.autosave_interval = std::chrono::minutes(60); break; - case 4: _settings_client.gui.autosave_interval = std::chrono::minutes(120); break; + case 0: _settings_client.gui.autosave_interval = 0; break; + case 1: _settings_client.gui.autosave_interval = 10; break; + case 2: _settings_client.gui.autosave_interval = 30; break; + case 3: _settings_client.gui.autosave_interval = 60; break; + case 4: _settings_client.gui.autosave_interval = 120; break; default: break; } } diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 4587b1c2e1..c80bcc2766 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -60,12 +60,12 @@ static const StringID _autosave_dropdown[] = { }; /** Available settings for autosave intervals. */ -static const std::chrono::minutes _autosave_dropdown_to_minutes[] = { - std::chrono::minutes::zero(), ///< never - std::chrono::minutes(10), - std::chrono::minutes(30), - std::chrono::minutes(60), - std::chrono::minutes(120), +static const uint32_t _autosave_dropdown_to_minutes[] = { + 0, ///< never + 10, + 30, + 60, + 120, }; static Dimension _circle_size; ///< Dimension of the circle +/- icon. This is here as not all users are within the class of the settings window. diff --git a/src/settings_type.h b/src/settings_type.h index 0c8b963f07..571a09f26e 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -149,7 +149,7 @@ struct GUISettings { ZoomLevel zoom_min; ///< minimum zoom out level ZoomLevel zoom_max; ///< maximum zoom out level ZoomLevel sprite_zoom_min; ///< maximum zoom level at which higher-resolution alternative sprites will be used (if available) instead of scaling a lower resolution sprite - std::chrono::minutes autosave_interval; ///< how often should we do autosaves? + uint32_t autosave_interval; ///< how often should we do autosaves? bool threaded_saves; ///< should we do threaded saves? bool keep_all_autosave; ///< name the autosave in a different way bool autosave_on_exit; ///< save an autosave when you quit the game, but do not ask "Do you really want to quit?" From a05d6ee404b597cbae303f81dcc234ab06340274 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 7 Dec 2023 18:30:09 +0000 Subject: [PATCH 047/105] Fix: Ensure saveload type match variable type. This either changes the saveload definition or changes the variable depending on which makes more sense. --- src/settings_type.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/settings_type.h b/src/settings_type.h index 571a09f26e..c70f5f98ae 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -64,14 +64,14 @@ enum IndustryDensity { }; /** Possible values for "use_relay_service" setting. */ -enum UseRelayService { +enum UseRelayService : uint8_t { URS_NEVER = 0, URS_ASK, URS_ALLOW, }; /** Possible values for "participate_survey" setting. */ -enum ParticipateSurvey { +enum ParticipateSurvey : uint8_t { PS_ASK = 0, PS_NO, PS_YES, From cb53fed229b3cbf404028316dfada54360c6071e Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 7 Dec 2023 19:16:14 +0000 Subject: [PATCH 048/105] Codechange: Move VarType helpers to allow earlier use. --- src/saveload/saveload.h | 64 ++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index 980d017973..6f49cda7ed 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -709,6 +709,38 @@ struct SaveLoadCompat { SaveLoadVersion version_to; ///< Save/load the variable before this savegame version. }; +/** + * Get the NumberType of a setting. This describes the integer type + * as it is represented in memory + * @param type VarType holding information about the variable-type + * @return the SLE_VAR_* part of a variable-type description + */ +static inline constexpr VarType GetVarMemType(VarType type) +{ + return GB(type, 4, 4) << 4; +} + +/** + * Get the FileType of a setting. This describes the integer type + * as it is represented in a savegame/file + * @param type VarType holding information about the file-type + * @return the SLE_FILE_* part of a variable-type description + */ +static inline constexpr VarType GetVarFileType(VarType type) +{ + return GB(type, 0, 4); +} + +/** + * Check if the given saveload type is a numeric type. + * @param conv the type to check + * @return True if it's a numeric type. + */ +static inline constexpr bool IsNumericType(VarType conv) +{ + return GetVarMemType(conv) <= SLE_VAR_U64; +} + /** * Storage of simple variables, references (pointers), and arrays. * @param cmd Load/save type. @see SaveLoadType @@ -1133,38 +1165,6 @@ static inline bool SlIsObjectCurrentlyValid(SaveLoadVersion version_from, SaveLo return version_from <= SAVEGAME_VERSION && SAVEGAME_VERSION < version_to; } -/** - * Get the NumberType of a setting. This describes the integer type - * as it is represented in memory - * @param type VarType holding information about the variable-type - * @return the SLE_VAR_* part of a variable-type description - */ -static inline VarType GetVarMemType(VarType type) -{ - return GB(type, 4, 4) << 4; -} - -/** - * Get the FileType of a setting. This describes the integer type - * as it is represented in a savegame/file - * @param type VarType holding information about the file-type - * @return the SLE_FILE_* part of a variable-type description - */ -static inline VarType GetVarFileType(VarType type) -{ - return GB(type, 0, 4); -} - -/** - * Check if the given saveload type is a numeric type. - * @param conv the type to check - * @return True if it's a numeric type. - */ -static inline bool IsNumericType(VarType conv) -{ - return GetVarMemType(conv) <= SLE_VAR_U64; -} - /** * Get the address of the variable. Null-variables don't have an address, * everything else has a callback function that returns the address based From 9f853c10b03cb93aa498dd6f15ee84f61c82d779 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 7 Dec 2023 18:39:54 +0000 Subject: [PATCH 049/105] Codechange: Add compile-time check that variable size matches saveload entry. --- src/saveload/saveload.h | 62 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index 6f49cda7ed..6ac242cb70 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -741,6 +741,54 @@ static inline constexpr bool IsNumericType(VarType conv) return GetVarMemType(conv) <= SLE_VAR_U64; } +/** + * Return expect size in bytes of a VarType + * @param type VarType to get size of. + * @return size of type in bytes. + */ +static inline constexpr size_t SlVarSize(VarType type) +{ + switch (GetVarMemType(type)) { + case SLE_VAR_BL: return sizeof(bool); + case SLE_VAR_I8: return sizeof(int8_t); + case SLE_VAR_U8: return sizeof(uint8_t); + case SLE_VAR_I16: return sizeof(int16_t); + case SLE_VAR_U16: return sizeof(uint16_t); + case SLE_VAR_I32: return sizeof(int32_t); + case SLE_VAR_U32: return sizeof(uint32_t); + case SLE_VAR_I64: return sizeof(int64_t); + case SLE_VAR_U64: return sizeof(uint64_t); + case SLE_VAR_NULL: return sizeof(void *); + case SLE_VAR_STR: return sizeof(std::string); + case SLE_VAR_STRQ: return sizeof(std::string); + case SLE_VAR_NAME: return sizeof(std::string); + default: NOT_REACHED(); + } +} + +/** + * Check if a saveload cmd/type/length entry matches the size of the variable. + * @param cmd SaveLoadType of entry. + * @param type VarType of entry. + * @param length Array length of entry. + * @param size Actual size of variable. + * @return true iff the sizes match. + */ +static inline constexpr bool SlCheckVarSize(SaveLoadType cmd, VarType type, size_t length, size_t size) +{ + switch (cmd) { + case SL_VAR: return SlVarSize(type) == size; + case SL_REF: return sizeof(void *) == size; + case SL_STDSTR: return SlVarSize(type) == size; + case SL_ARR: return SlVarSize(type) * length <= size; // Partial load of array is permitted. + case SL_DEQUE: return sizeof(std::deque) == size; + case SL_VECTOR: return sizeof(std::vector) == size; + case SL_REFLIST: return sizeof(std::list) == size; + case SL_SAVEBYTE: return true; + default: NOT_REACHED(); + } +} + /** * Storage of simple variables, references (pointers), and arrays. * @param cmd Load/save type. @see SaveLoadType @@ -748,12 +796,18 @@ static inline constexpr bool IsNumericType(VarType conv) * @param base Name of the class or struct containing the variable. * @param variable Name of the variable in the class or struct referenced by \a base. * @param type Storage of the data in memory and in the savegame. + * @param length Number of elements in the array. * @param from First savegame version that has the field. * @param to Last savegame version that has the field. * @param extra Extra data to pass to the address callback function. * @note In general, it is better to use one of the SLE_* macros below. */ -#define SLE_GENERAL_NAME(cmd, name, base, variable, type, length, from, to, extra) SaveLoad {name, cmd, type, length, from, to, cpp_sizeof(base, variable), [] (void *b, size_t) -> void * { assert(b != nullptr); return const_cast(static_cast(std::addressof(static_cast(b)->variable))); }, extra, nullptr} +#define SLE_GENERAL_NAME(cmd, name, base, variable, type, length, from, to, extra) \ + SaveLoad {name, cmd, type, length, from, to, cpp_sizeof(base, variable), [] (void *b, size_t) -> void * { \ + static_assert(SlCheckVarSize(cmd, type, length, sizeof(static_cast(b)->variable))); \ + assert(b != nullptr); \ + return const_cast(static_cast(std::addressof(static_cast(b)->variable))); \ + }, extra, nullptr} /** * Storage of simple variables, references (pointers), and arrays with a custom name. @@ -761,6 +815,7 @@ static inline constexpr bool IsNumericType(VarType conv) * @param base Name of the class or struct containing the variable. * @param variable Name of the variable in the class or struct referenced by \a base. * @param type Storage of the data in memory and in the savegame. + * @param length Number of elements in the array. * @param from First savegame version that has the field. * @param to Last savegame version that has the field. * @param extra Extra data to pass to the address callback function. @@ -966,7 +1021,10 @@ static inline constexpr bool IsNumericType(VarType conv) * @param extra Extra data to pass to the address callback function. * @note In general, it is better to use one of the SLEG_* macros below. */ -#define SLEG_GENERAL(name, cmd, variable, type, length, from, to, extra) SaveLoad {name, cmd, type, length, from, to, sizeof(variable), [] (void *, size_t) -> void * { return static_cast(std::addressof(variable)); }, extra, nullptr} +#define SLEG_GENERAL(name, cmd, variable, type, length, from, to, extra) \ + SaveLoad {name, cmd, type, length, from, to, sizeof(variable), [] (void *, size_t) -> void * { \ + static_assert(SlCheckVarSize(cmd, type, length, sizeof(variable))); \ + return static_cast(std::addressof(variable)); }, extra, nullptr} /** * Storage of a global variable in some savegame versions. From 10f94fb0dd10796d29fa3d86c0dfd8cc546b7450 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 7 Dec 2023 19:16:33 +0000 Subject: [PATCH 050/105] Codechange: Remove runtime variable size assertion. --- src/saveload/saveload.cpp | 46 --------------------------------------- 1 file changed, 46 deletions(-) diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index 2e1131a778..bcc0dbd1ae 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -1513,54 +1513,8 @@ size_t SlCalcObjMemberLength(const void *object, const SaveLoad &sld) return 0; } -/** - * Check whether the variable size of the variable in the saveload configuration - * matches with the actual variable size. - * @param sld The saveload configuration to test. - */ -[[maybe_unused]] static bool IsVariableSizeRight(const SaveLoad &sld) -{ - if (GetVarMemType(sld.conv) == SLE_VAR_NULL) return true; - - switch (sld.cmd) { - case SL_VAR: - switch (GetVarMemType(sld.conv)) { - case SLE_VAR_BL: - return sld.size == sizeof(bool); - case SLE_VAR_I8: - case SLE_VAR_U8: - return sld.size == sizeof(int8_t); - case SLE_VAR_I16: - case SLE_VAR_U16: - return sld.size == sizeof(int16_t); - case SLE_VAR_I32: - case SLE_VAR_U32: - return sld.size == sizeof(int32_t); - case SLE_VAR_I64: - case SLE_VAR_U64: - return sld.size == sizeof(int64_t); - case SLE_VAR_NAME: - return sld.size == sizeof(std::string); - default: - return sld.size == sizeof(void *); - } - case SL_REF: - /* These should all be pointer sized. */ - return sld.size == sizeof(void *); - - case SL_STDSTR: - /* These should be all pointers to std::string. */ - return sld.size == sizeof(std::string); - - default: - return true; - } -} - static bool SlObjectMember(void *object, const SaveLoad &sld) { - assert(IsVariableSizeRight(sld)); - if (!SlIsObjectValidInSavegame(sld)) return false; VarType conv = GB(sld.conv, 0, 8); From c0ea0589b44d0134077d6d568e0f6fc284a1e624 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 9 Dec 2023 09:47:41 +0000 Subject: [PATCH 051/105] Fix: AirportGetNearestTown incorrectly assumed first TileIterator result was origin. (#11565) Not all TileIterators are equal, and some do not start at the top-corner, so the perimeter check was wrong. As the caller already has thie origin tile, use that instead. --- src/script/api/script_airport.cpp | 4 ++-- src/station_cmd.cpp | 15 +++++++++------ src/station_cmd.h | 2 +- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/script/api/script_airport.cpp b/src/script/api/script_airport.cpp index b1edbec48d..c0b28408c7 100644 --- a/src/script/api/script_airport.cpp +++ b/src/script/api/script_airport.cpp @@ -139,7 +139,7 @@ if (_settings_game.economy.station_noise_level) { AirportTileTableIterator it(as->table[0], tile); uint dist; - AirportGetNearestTown(as, it, dist); + AirportGetNearestTown(as, tile, it, dist); return GetAirportNoiseLevelForDistance(as, dist); } @@ -155,7 +155,7 @@ if (!as->IsWithinMapBounds(0, tile)) return INVALID_TOWN; uint dist; - return AirportGetNearestTown(as, AirportTileTableIterator(as->table[0], tile), dist)->index; + return AirportGetNearestTown(as, tile, AirportTileTableIterator(as->table[0], tile), dist)->index; } /* static */ SQInteger ScriptAirport::GetMaintenanceCostFactor(AirportType type) diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 0444a3feed..619bf02aea 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -2303,18 +2303,19 @@ uint8_t GetAirportNoiseLevelForDistance(const AirportSpec *as, uint distance) * Finds the town nearest to given airport. Based on minimal manhattan distance to any airport's tile. * If two towns have the same distance, town with lower index is returned. * @param as airport's description + * @param tile origin tile (top corner of the airport) * @param it An iterator over all airport tiles * @param[out] mindist Minimum distance to town * @return nearest town to airport */ -Town *AirportGetNearestTown(const AirportSpec *as, const TileIterator &it, uint &mindist) +Town *AirportGetNearestTown(const AirportSpec *as, TileIndex tile, const TileIterator &it, uint &mindist) { assert(Town::GetNumItems() > 0); Town *nearest = nullptr; - uint perimeter_min_x = TileX(it); - uint perimeter_min_y = TileY(it); + uint perimeter_min_x = TileX(tile); + uint perimeter_min_y = TileY(tile); uint perimeter_max_x = perimeter_min_x + as->size_x - 1; uint perimeter_max_y = perimeter_min_y + as->size_y - 1; @@ -2322,6 +2323,8 @@ Town *AirportGetNearestTown(const AirportSpec *as, const TileIterator &it, uint std::unique_ptr copy(it.Clone()); for (TileIndex cur_tile = *copy; cur_tile != INVALID_TILE; cur_tile = ++*copy) { + assert(IsInsideBS(TileX(cur_tile), perimeter_min_x, as->size_x)); + assert(IsInsideBS(TileY(cur_tile), perimeter_min_y, as->size_y)); if (TileX(cur_tile) == perimeter_min_x || TileX(cur_tile) == perimeter_max_x || TileY(cur_tile) == perimeter_min_y || TileY(cur_tile) == perimeter_max_y) { Town *t = CalcClosestTownFromTile(cur_tile, mindist + 1); if (t == nullptr) continue; @@ -2349,7 +2352,7 @@ void UpdateAirportsNoise() const AirportSpec *as = st->airport.GetSpec(); AirportTileIterator it(st); uint dist; - Town *nearest = AirportGetNearestTown(as, it, dist); + Town *nearest = AirportGetNearestTown(as, st->airport.tile, it, dist); nearest->noise_reached += GetAirportNoiseLevelForDistance(as, dist); } } @@ -2399,7 +2402,7 @@ CommandCost CmdBuildAirport(DoCommandFlag flags, TileIndex tile, byte airport_ty /* The noise level is the noise from the airport and reduce it to account for the distance to the town center. */ uint dist; - Town *nearest = AirportGetNearestTown(as, tile_iter, dist); + Town *nearest = AirportGetNearestTown(as, tile, tile_iter, dist); uint newnoise_level = GetAirportNoiseLevelForDistance(as, dist); /* Check if local auth would allow a new airport */ @@ -2527,7 +2530,7 @@ static CommandCost RemoveAirport(TileIndex tile, DoCommandFlag flags) * need of recalculation */ AirportTileIterator it(st); uint dist; - Town *nearest = AirportGetNearestTown(as, it, dist); + Town *nearest = AirportGetNearestTown(as, st->airport.tile, it, dist); nearest->noise_reached -= GetAirportNoiseLevelForDistance(as, dist); if (_settings_game.economy.station_noise_level) { diff --git a/src/station_cmd.h b/src/station_cmd.h index 9359daf453..38f393fd00 100644 --- a/src/station_cmd.h +++ b/src/station_cmd.h @@ -16,7 +16,7 @@ enum StationClassID : byte; enum RoadStopClassID : byte; -extern Town *AirportGetNearestTown(const struct AirportSpec *as, const TileIterator &it, uint &mindist); +extern Town *AirportGetNearestTown(const struct AirportSpec *as, TileIndex tile, const TileIterator &it, uint &mindist); extern uint8_t GetAirportNoiseLevelForDistance(const struct AirportSpec *as, uint distance); CommandCost CmdBuildAirport(DoCommandFlag flags, TileIndex tile, byte airport_type, byte layout, StationID station_to_join, bool allow_adjacent); From a759d35f260b3fafa93cb08761c6f94d045e7e27 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 9 Dec 2023 20:43:36 +0000 Subject: [PATCH 052/105] Fix #11352: Draw all network server info as multiline strings. (#11567) This also allows the 'header' (which is not actually a widget) to grow as necessary to fit the server name. --- src/network/network_gui.cpp | 80 +++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 43 deletions(-) diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index 0955b335f7..bc139aa644 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -581,74 +581,68 @@ public: this->DrawWidgets(); } + StringID GetHeaderString() const + { + if (this->server == nullptr) return STR_NETWORK_SERVER_LIST_GAME_INFO; + switch (this->server->status) { + case NGLS_OFFLINE: return STR_NETWORK_SERVER_LIST_SERVER_OFFLINE; + case NGLS_ONLINE: return STR_NETWORK_SERVER_LIST_GAME_INFO; + case NGLS_FULL: return STR_NETWORK_SERVER_LIST_SERVER_FULL; + case NGLS_BANNED: return STR_NETWORK_SERVER_LIST_SERVER_BANNED; + case NGLS_TOO_OLD: return STR_NETWORK_SERVER_LIST_SERVER_TOO_OLD; + default: NOT_REACHED(); + } + } + void DrawDetails(const Rect &r) const { NetworkGameList *sel = this->server; - /* Height for the title banner */ - int HEADER_HEIGHT = 3 * GetCharacterHeight(FS_NORMAL) + WidgetDimensions::scaled.frametext.Vertical(); - - Rect hr = r.WithHeight(HEADER_HEIGHT).Shrink(WidgetDimensions::scaled.frametext); Rect tr = r.Shrink(WidgetDimensions::scaled.frametext); - tr.top += HEADER_HEIGHT; + StringID header_msg = this->GetHeaderString(); + int header_height = GetStringHeight(header_msg, tr.Width()) + + (sel == nullptr ? 0 : GetStringHeight(sel->info.server_name, tr.Width())) + + WidgetDimensions::scaled.frametext.Vertical(); + + /* Height for the title banner */ + Rect hr = r.WithHeight(header_height).Shrink(WidgetDimensions::scaled.frametext); + tr.top += header_height; /* Draw the right menu */ /* Create the nice grayish rectangle at the details top */ - GfxFillRect(r.WithHeight(HEADER_HEIGHT).Shrink(WidgetDimensions::scaled.bevel.left, WidgetDimensions::scaled.bevel.top, WidgetDimensions::scaled.bevel.right, 0), PC_DARK_BLUE); - if (sel == nullptr) { - DrawString(hr.left, hr.right, hr.top, STR_NETWORK_SERVER_LIST_GAME_INFO, TC_FROMSTRING, SA_HOR_CENTER); - } else if (sel->status != NGLS_ONLINE) { - StringID message = INVALID_STRING_ID; - switch (sel->status) { - case NGLS_OFFLINE: message = STR_NETWORK_SERVER_LIST_SERVER_OFFLINE; break; - case NGLS_FULL: message = STR_NETWORK_SERVER_LIST_SERVER_FULL; break; - case NGLS_BANNED: message = STR_NETWORK_SERVER_LIST_SERVER_BANNED; break; - case NGLS_TOO_OLD: message = STR_NETWORK_SERVER_LIST_SERVER_TOO_OLD; break; - - /* Handled by the if-case above. */ - case NGLS_ONLINE: NOT_REACHED(); - } + GfxFillRect(r.WithHeight(header_height).Shrink(WidgetDimensions::scaled.bevel), PC_DARK_BLUE); + hr.top = DrawStringMultiLine(hr, header_msg, TC_FROMSTRING, SA_HOR_CENTER); + if (sel == nullptr) return; - DrawString(hr.left, hr.right, hr.top, message, TC_FROMSTRING, SA_HOR_CENTER); // server offline - DrawStringMultiLine(hr.left, hr.right, hr.top + GetCharacterHeight(FS_NORMAL), hr.bottom, sel->info.server_name, TC_ORANGE, SA_HOR_CENTER); // game name - DrawString(tr.left, tr.right, tr.top, message, TC_FROMSTRING, SA_HOR_CENTER); // server offline + hr.top = DrawStringMultiLine(hr, sel->info.server_name, TC_ORANGE, SA_HOR_CENTER); // game name + if (sel->status != NGLS_ONLINE) { + tr.top = DrawStringMultiLine(tr, header_msg, TC_FROMSTRING, SA_HOR_CENTER); } else { // show game info - - DrawString(hr.left, hr.right, hr.top, STR_NETWORK_SERVER_LIST_GAME_INFO, TC_FROMSTRING, SA_HOR_CENTER); - DrawStringMultiLine(hr.left, hr.right, hr.top + GetCharacterHeight(FS_NORMAL), hr.bottom, sel->info.server_name, TC_ORANGE, SA_HOR_CENTER); // game name - SetDParam(0, sel->info.clients_on); SetDParam(1, sel->info.clients_max); SetDParam(2, sel->info.companies_on); SetDParam(3, sel->info.companies_max); - DrawString(tr, STR_NETWORK_SERVER_LIST_CLIENTS); - tr.top += GetCharacterHeight(FS_NORMAL); + tr.top = DrawStringMultiLine(tr, STR_NETWORK_SERVER_LIST_CLIENTS); SetDParam(0, STR_CLIMATE_TEMPERATE_LANDSCAPE + sel->info.landscape); - DrawString(tr, STR_NETWORK_SERVER_LIST_LANDSCAPE); // landscape - tr.top += GetCharacterHeight(FS_NORMAL); + tr.top = DrawStringMultiLine(tr, STR_NETWORK_SERVER_LIST_LANDSCAPE); // landscape SetDParam(0, sel->info.map_width); SetDParam(1, sel->info.map_height); - DrawString(tr, STR_NETWORK_SERVER_LIST_MAP_SIZE); // map size - tr.top += GetCharacterHeight(FS_NORMAL); + tr.top = DrawStringMultiLine(tr, STR_NETWORK_SERVER_LIST_MAP_SIZE); // map size SetDParamStr(0, sel->info.server_revision); - DrawString(tr, STR_NETWORK_SERVER_LIST_SERVER_VERSION); // server version - tr.top += GetCharacterHeight(FS_NORMAL); + tr.top = DrawStringMultiLine(tr, STR_NETWORK_SERVER_LIST_SERVER_VERSION); // server version SetDParamStr(0, sel->connection_string); StringID invite_or_address = StrStartsWith(sel->connection_string, "+") ? STR_NETWORK_SERVER_LIST_INVITE_CODE : STR_NETWORK_SERVER_LIST_SERVER_ADDRESS; - DrawString(tr, invite_or_address); // server address / invite code - tr.top += GetCharacterHeight(FS_NORMAL); + tr.top = DrawStringMultiLine(tr, invite_or_address); // server address / invite code SetDParam(0, sel->info.start_date); - DrawString(tr, STR_NETWORK_SERVER_LIST_START_DATE); // start date - tr.top += GetCharacterHeight(FS_NORMAL); + tr.top = DrawStringMultiLine(tr, STR_NETWORK_SERVER_LIST_START_DATE); // start date SetDParam(0, sel->info.game_date); - DrawString(tr, STR_NETWORK_SERVER_LIST_CURRENT_DATE); // current date - tr.top += GetCharacterHeight(FS_NORMAL); + tr.top = DrawStringMultiLine(tr, STR_NETWORK_SERVER_LIST_CURRENT_DATE); // current date if (sel->info.gamescript_version != -1) { SetDParamStr(0, sel->info.gamescript_name); @@ -659,12 +653,12 @@ public: tr.top += WidgetDimensions::scaled.vsep_wide; if (!sel->info.compatible) { - DrawString(tr, sel->info.version_compatible ? STR_NETWORK_SERVER_LIST_GRF_MISMATCH : STR_NETWORK_SERVER_LIST_VERSION_MISMATCH, TC_FROMSTRING, SA_HOR_CENTER); // server mismatch + DrawStringMultiLine(tr, sel->info.version_compatible ? STR_NETWORK_SERVER_LIST_GRF_MISMATCH : STR_NETWORK_SERVER_LIST_VERSION_MISMATCH, TC_FROMSTRING, SA_HOR_CENTER); // server mismatch } else if (sel->info.clients_on == sel->info.clients_max) { /* Show: server full, when clients_on == max_clients */ - DrawString(tr, STR_NETWORK_SERVER_LIST_SERVER_FULL, TC_FROMSTRING, SA_HOR_CENTER); // server full + DrawStringMultiLine(tr, STR_NETWORK_SERVER_LIST_SERVER_FULL, TC_FROMSTRING, SA_HOR_CENTER); // server full } else if (sel->info.use_password) { - DrawString(tr, STR_NETWORK_SERVER_LIST_PASSWORD, TC_FROMSTRING, SA_HOR_CENTER); // password warning + DrawStringMultiLine(tr, STR_NETWORK_SERVER_LIST_PASSWORD, TC_FROMSTRING, SA_HOR_CENTER); // password warning } } } From d6060a4d479f600ebafd33e6ca3ccc28638199ee Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 9 Dec 2023 23:35:46 +0000 Subject: [PATCH 053/105] Change: Use sparse padding for start network server window. (#11569) --- src/lang/english.txt | 2 +- src/network/network_gui.cpp | 78 ++++++++++++++++++------------------- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/src/lang/english.txt b/src/lang/english.txt index eb32935468..5d9b8688ea 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -2346,7 +2346,7 @@ STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}The game STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Set password STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Protect your game with a password if you don't want it to be publicly accessible -STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Visibility +STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Visibility: STR_NETWORK_START_SERVER_VISIBILITY_TOOLTIP :{BLACK}Whether other people can see your server in the public listing STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} client{P "" s} STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Maximum number of clients: diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index bc139aa644..0456c65a8f 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -1152,62 +1152,62 @@ static const NWidgetPart _nested_network_start_server_window_widgets[] = { NWidget(WWT_CAPTION, COLOUR_LIGHT_BLUE), SetDataTip(STR_NETWORK_START_SERVER_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), EndContainer(), NWidget(WWT_PANEL, COLOUR_LIGHT_BLUE, WID_NSS_BACKGROUND), - NWidget(NWID_VERTICAL), SetPIP(10, 6, 10), - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(10, 6, 10), - NWidget(NWID_VERTICAL), SetPIP(0, 1, 0), + NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_wide, 0), SetPadding(WidgetDimensions::unscaled.sparse), + NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_sparse, 0), + NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_normal, 0), /* Game name widgets */ NWidget(WWT_TEXT, COLOUR_LIGHT_BLUE, WID_NSS_GAMENAME_LABEL), SetFill(1, 0), SetDataTip(STR_NETWORK_START_SERVER_NEW_GAME_NAME, STR_NULL), NWidget(WWT_EDITBOX, COLOUR_LIGHT_BLUE, WID_NSS_GAMENAME), SetMinimalSize(10, 12), SetFill(1, 0), SetDataTip(STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE, STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP), EndContainer(), - EndContainer(), - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(10, 6, 10), - NWidget(NWID_VERTICAL), SetPIP(0, 1, 0), - NWidget(WWT_TEXT, COLOUR_LIGHT_BLUE, WID_NSS_CONNTYPE_LABEL), SetFill(1, 0), SetDataTip(STR_NETWORK_START_SERVER_VISIBILITY_LABEL, STR_NULL), - NWidget(WWT_DROPDOWN, COLOUR_LIGHT_BLUE, WID_NSS_CONNTYPE_BTN), SetFill(1, 0), SetDataTip(STR_JUST_STRING, STR_NETWORK_START_SERVER_VISIBILITY_TOOLTIP), - EndContainer(), - NWidget(NWID_VERTICAL), SetPIP(0, 1, 0), - NWidget(NWID_SPACER), SetFill(1, 1), - NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NSS_SETPWD), SetFill(1, 0), SetDataTip(STR_NETWORK_START_SERVER_SET_PASSWORD, STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0), + NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_normal, 0), + NWidget(WWT_TEXT, COLOUR_LIGHT_BLUE, WID_NSS_CONNTYPE_LABEL), SetFill(1, 0), SetDataTip(STR_NETWORK_START_SERVER_VISIBILITY_LABEL, STR_NULL), + NWidget(WWT_DROPDOWN, COLOUR_LIGHT_BLUE, WID_NSS_CONNTYPE_BTN), SetFill(1, 0), SetDataTip(STR_JUST_STRING, STR_NETWORK_START_SERVER_VISIBILITY_TOOLTIP), + EndContainer(), + NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_normal, 0), + NWidget(NWID_SPACER), SetFill(1, 1), + NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NSS_SETPWD), SetFill(1, 0), SetDataTip(STR_NETWORK_START_SERVER_SET_PASSWORD, STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP), + EndContainer(), EndContainer(), - EndContainer(), - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(10, 6, 10), - NWidget(NWID_VERTICAL), SetPIP(0, 1, 0), - NWidget(WWT_TEXT, COLOUR_LIGHT_BLUE, WID_NSS_CLIENTS_LABEL), SetFill(1, 0), SetDataTip(STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS, STR_NULL), - NWidget(NWID_HORIZONTAL), - NWidget(WWT_IMGBTN, COLOUR_LIGHT_BLUE, WID_NSS_CLIENTS_BTND), SetMinimalSize(12, 12), SetFill(0, 1), SetDataTip(SPR_ARROW_DOWN, STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_LIGHT_BLUE, WID_NSS_CLIENTS_TXT), SetFill(1, 0), SetDataTip(STR_NETWORK_START_SERVER_CLIENTS_SELECT, STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP), - NWidget(WWT_IMGBTN, COLOUR_LIGHT_BLUE, WID_NSS_CLIENTS_BTNU), SetMinimalSize(12, 12), SetFill(0, 1), SetDataTip(SPR_ARROW_UP, STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0), + NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_normal, 0), + NWidget(WWT_TEXT, COLOUR_LIGHT_BLUE, WID_NSS_CLIENTS_LABEL), SetFill(1, 0), SetDataTip(STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS, STR_NULL), + NWidget(NWID_HORIZONTAL), + NWidget(WWT_IMGBTN, COLOUR_LIGHT_BLUE, WID_NSS_CLIENTS_BTND), SetMinimalSize(12, 12), SetFill(0, 1), SetDataTip(SPR_ARROW_DOWN, STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_LIGHT_BLUE, WID_NSS_CLIENTS_TXT), SetFill(1, 0), SetDataTip(STR_NETWORK_START_SERVER_CLIENTS_SELECT, STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP), + NWidget(WWT_IMGBTN, COLOUR_LIGHT_BLUE, WID_NSS_CLIENTS_BTNU), SetMinimalSize(12, 12), SetFill(0, 1), SetDataTip(SPR_ARROW_UP, STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP), + EndContainer(), EndContainer(), - EndContainer(), - NWidget(NWID_VERTICAL), SetPIP(0, 1, 0), - NWidget(WWT_TEXT, COLOUR_LIGHT_BLUE, WID_NSS_COMPANIES_LABEL), SetFill(1, 0), SetDataTip(STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES, STR_NULL), - NWidget(NWID_HORIZONTAL), - NWidget(WWT_IMGBTN, COLOUR_LIGHT_BLUE, WID_NSS_COMPANIES_BTND), SetMinimalSize(12, 12), SetFill(0, 1), SetDataTip(SPR_ARROW_DOWN, STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_LIGHT_BLUE, WID_NSS_COMPANIES_TXT), SetFill(1, 0), SetDataTip(STR_NETWORK_START_SERVER_COMPANIES_SELECT, STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP), - NWidget(WWT_IMGBTN, COLOUR_LIGHT_BLUE, WID_NSS_COMPANIES_BTNU), SetMinimalSize(12, 12), SetFill(0, 1), SetDataTip(SPR_ARROW_UP, STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP), + NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_normal, 0), + NWidget(WWT_TEXT, COLOUR_LIGHT_BLUE, WID_NSS_COMPANIES_LABEL), SetFill(1, 0), SetDataTip(STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES, STR_NULL), + NWidget(NWID_HORIZONTAL), + NWidget(WWT_IMGBTN, COLOUR_LIGHT_BLUE, WID_NSS_COMPANIES_BTND), SetMinimalSize(12, 12), SetFill(0, 1), SetDataTip(SPR_ARROW_DOWN, STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_LIGHT_BLUE, WID_NSS_COMPANIES_TXT), SetFill(1, 0), SetDataTip(STR_NETWORK_START_SERVER_COMPANIES_SELECT, STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP), + NWidget(WWT_IMGBTN, COLOUR_LIGHT_BLUE, WID_NSS_COMPANIES_BTNU), SetMinimalSize(12, 12), SetFill(0, 1), SetDataTip(SPR_ARROW_UP, STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP), + EndContainer(), EndContainer(), EndContainer(), EndContainer(), - /* 'generate game' and 'load game' buttons */ - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(10, 6, 10), - NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NSS_GENERATE_GAME), SetDataTip(STR_INTRO_NEW_GAME, STR_INTRO_TOOLTIP_NEW_GAME), SetFill(1, 0), - NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NSS_LOAD_GAME), SetDataTip(STR_INTRO_LOAD_GAME, STR_INTRO_TOOLTIP_LOAD_GAME), SetFill(1, 0), - EndContainer(), + NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_sparse, 0), + /* 'generate game' and 'load game' buttons */ + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0), + NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NSS_GENERATE_GAME), SetDataTip(STR_INTRO_NEW_GAME, STR_INTRO_TOOLTIP_NEW_GAME), SetFill(1, 0), + NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NSS_LOAD_GAME), SetDataTip(STR_INTRO_LOAD_GAME, STR_INTRO_TOOLTIP_LOAD_GAME), SetFill(1, 0), + EndContainer(), - /* 'play scenario' and 'play heightmap' buttons */ - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(10, 6, 10), - NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NSS_PLAY_SCENARIO), SetDataTip(STR_INTRO_PLAY_SCENARIO, STR_INTRO_TOOLTIP_PLAY_SCENARIO), SetFill(1, 0), - NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NSS_PLAY_HEIGHTMAP), SetDataTip(STR_INTRO_PLAY_HEIGHTMAP, STR_INTRO_TOOLTIP_PLAY_HEIGHTMAP), SetFill(1, 0), + /* 'play scenario' and 'play heightmap' buttons */ + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0), + NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NSS_PLAY_SCENARIO), SetDataTip(STR_INTRO_PLAY_SCENARIO, STR_INTRO_TOOLTIP_PLAY_SCENARIO), SetFill(1, 0), + NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NSS_PLAY_HEIGHTMAP), SetDataTip(STR_INTRO_PLAY_HEIGHTMAP, STR_INTRO_TOOLTIP_PLAY_HEIGHTMAP), SetFill(1, 0), + EndContainer(), EndContainer(), - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(10, 0, 10), - NWidget(NWID_SPACER), SetFill(1, 0), + NWidget(NWID_HORIZONTAL), SetPIPRatio(1, 0, 1), NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NSS_CANCEL), SetDataTip(STR_BUTTON_CANCEL, STR_NULL), SetMinimalSize(128, 12), - NWidget(NWID_SPACER), SetFill(1, 0), EndContainer(), EndContainer(), EndContainer(), From ebf299e1b4efe256d0ca833b213e2268bdf8b01f Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 9 Dec 2023 19:11:14 +0000 Subject: [PATCH 054/105] Codechange: Make SetDisplayedPlane return whether the plane changed or not. --- src/widget.cpp | 5 ++++- src/widget_type.h | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/widget.cpp b/src/widget.cpp index 5c5f3929db..148bd8ddec 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -1492,10 +1492,13 @@ NWidgetCore *NWidgetStacked::GetWidgetFromPos(int x, int y) /** * Select which plane to show (for #NWID_SELECTION only). * @param plane Plane number to display. + * @return true iff the shown plane changed. */ -void NWidgetStacked::SetDisplayedPlane(int plane) +bool NWidgetStacked::SetDisplayedPlane(int plane) { + if (this->shown_plane == plane) return false; this->shown_plane = plane; + return true; } NWidgetPIPContainer::NWidgetPIPContainer(WidgetType tp, NWidContainerFlags flags) : NWidgetContainer(tp) diff --git a/src/widget_type.h b/src/widget_type.h index b1f8cde029..8ec91855c6 100644 --- a/src/widget_type.h +++ b/src/widget_type.h @@ -461,7 +461,7 @@ public: void Draw(const Window *w) override; NWidgetCore *GetWidgetFromPos(int x, int y) override; - void SetDisplayedPlane(int plane); + bool SetDisplayedPlane(int plane); int shown_plane; ///< Plane being displayed (for #NWID_SELECTION only). int index; ///< If non-negative, index in the #Window::nested_array. From 66b064cbad3c6d06c7711a57e039a6f79d76eb12 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 9 Dec 2023 20:55:10 +0000 Subject: [PATCH 055/105] Codechange: Use return value of SetDisplayedPlane to simplify CompanyWindow. --- src/company_gui.cpp | 46 ++++++++------------------------------------- 1 file changed, 8 insertions(+), 38 deletions(-) diff --git a/src/company_gui.cpp b/src/company_gui.cpp index 80d6147082..24c4552a43 100644 --- a/src/company_gui.cpp +++ b/src/company_gui.cpp @@ -2259,54 +2259,24 @@ struct CompanyWindow : Window bool reinit = false; /* Button bar selection. */ - int plane = local ? 0 : SZSP_NONE; - NWidgetStacked *wi = this->GetWidget(WID_C_SELECT_BUTTONS); - if (plane != wi->shown_plane) { - wi->SetDisplayedPlane(plane); - this->InvalidateData(); - reinit = true; - } + reinit |= this->GetWidget(WID_C_SELECT_BUTTONS)->SetDisplayedPlane(local ? 0 : SZSP_NONE); /* Build HQ button handling. */ - plane = (local && c->location_of_HQ == INVALID_TILE) ? CWP_VB_BUILD : CWP_VB_VIEW; - wi = this->GetWidget(WID_C_SELECT_VIEW_BUILD_HQ); - if (plane != wi->shown_plane) { - wi->SetDisplayedPlane(plane); - reinit = true; - } + reinit |= this->GetWidget(WID_C_SELECT_VIEW_BUILD_HQ)->SetDisplayedPlane((local && c->location_of_HQ == INVALID_TILE) ? CWP_VB_BUILD : CWP_VB_VIEW); this->SetWidgetDisabledState(WID_C_VIEW_HQ, c->location_of_HQ == INVALID_TILE); /* Enable/disable 'Relocate HQ' button. */ - plane = (!local || c->location_of_HQ == INVALID_TILE) ? CWP_RELOCATE_HIDE : CWP_RELOCATE_SHOW; - wi = this->GetWidget(WID_C_SELECT_RELOCATE); - if (plane != wi->shown_plane) { - wi->SetDisplayedPlane(plane); - reinit = true; - } + reinit |= this->GetWidget(WID_C_SELECT_RELOCATE)->SetDisplayedPlane((!local || c->location_of_HQ == INVALID_TILE) ? CWP_RELOCATE_HIDE : CWP_RELOCATE_SHOW); /* Enable/disable 'Give money' button. */ - plane = ((local || _local_company == COMPANY_SPECTATOR || !_settings_game.economy.give_money) ? SZSP_NONE : 0); - wi = this->GetWidget(WID_C_SELECT_GIVE_MONEY); - if (plane != wi->shown_plane) { - wi->SetDisplayedPlane(plane); - reinit = true; - } + reinit |= this->GetWidget(WID_C_SELECT_GIVE_MONEY)->SetDisplayedPlane((local || _local_company == COMPANY_SPECTATOR || !_settings_game.economy.give_money) ? SZSP_NONE : 0); /* Enable/disable 'Hostile Takeover' button. */ - plane = ((local || _local_company == COMPANY_SPECTATOR || !c->is_ai || _networking) ? SZSP_NONE : 0); - wi = this->GetWidget(WID_C_SELECT_HOSTILE_TAKEOVER); - if (plane != wi->shown_plane) { - wi->SetDisplayedPlane(plane); - reinit = true; - } + reinit |= this->GetWidget(WID_C_SELECT_HOSTILE_TAKEOVER)->SetDisplayedPlane((local || _local_company == COMPANY_SPECTATOR || !c->is_ai || _networking) ? SZSP_NONE : 0); /* Multiplayer buttons. */ - plane = ((!_networking) ? (int)SZSP_NONE : (int)(local ? CWP_MP_C_PWD : CWP_MP_C_JOIN)); - wi = this->GetWidget(WID_C_SELECT_MULTIPLAYER); - if (plane != wi->shown_plane) { - wi->SetDisplayedPlane(plane); - reinit = true; - } - this->SetWidgetDisabledState(WID_C_COMPANY_JOIN, c->is_ai); + reinit |= this->GetWidget(WID_C_SELECT_MULTIPLAYER)->SetDisplayedPlane((!_networking) ? (int)SZSP_NONE : (int)(local ? CWP_MP_C_PWD : CWP_MP_C_JOIN)); + + this->SetWidgetDisabledState(WID_C_COMPANY_JOIN, c->is_ai); if (reinit) { this->ReInit(); From fb60f8f2f54525d8f17b5125253fc4aa5547fe38 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 9 Dec 2023 20:57:26 +0000 Subject: [PATCH 056/105] Codechange: Simplify BuildRailStationWindow initialization. --- src/rail_gui.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index 224eb51643..13620db689 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -974,14 +974,10 @@ public: _railstation.newstations = newstation; this->CreateNestedTree(); - NWidgetStacked *newst_additions = this->GetWidget(WID_BRAS_SHOW_NEWST_ADDITIONS); - newst_additions->SetDisplayedPlane(newstation ? 0 : SZSP_NONE); - newst_additions = this->GetWidget(WID_BRAS_SHOW_NEWST_MATRIX); - newst_additions->SetDisplayedPlane(newstation ? 0 : SZSP_NONE); - newst_additions = this->GetWidget(WID_BRAS_SHOW_NEWST_DEFSIZE); - newst_additions->SetDisplayedPlane(newstation ? 0 : SZSP_NONE); - newst_additions = this->GetWidget(WID_BRAS_SHOW_NEWST_RESIZE); - newst_additions->SetDisplayedPlane(newstation ? 0 : SZSP_NONE); + this->GetWidget(WID_BRAS_SHOW_NEWST_ADDITIONS)->SetDisplayedPlane(newstation ? 0 : SZSP_NONE); + this->GetWidget(WID_BRAS_SHOW_NEWST_MATRIX)->SetDisplayedPlane(newstation ? 0 : SZSP_NONE); + this->GetWidget(WID_BRAS_SHOW_NEWST_DEFSIZE)->SetDisplayedPlane(newstation ? 0 : SZSP_NONE); + this->GetWidget(WID_BRAS_SHOW_NEWST_RESIZE)->SetDisplayedPlane(newstation ? 0 : SZSP_NONE); /* Hide the station class filter if no stations other than the default one are available. */ this->GetWidget(WID_BRAS_FILTER_CONTAINER)->SetDisplayedPlane(newstation ? 0 : SZSP_NONE); if (newstation) { From 8186182e4cc168c7770551399a300b57fe7a2731 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 9 Dec 2023 21:01:46 +0000 Subject: [PATCH 057/105] Codechange: Set displayed plane earlier to avoid ReInit. --- src/industry_gui.cpp | 11 ++++------- src/tree_gui.cpp | 8 +++----- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/industry_gui.cpp b/src/industry_gui.cpp index 828ceebcd1..fa85ba502d 100644 --- a/src/industry_gui.cpp +++ b/src/industry_gui.cpp @@ -403,16 +403,13 @@ public: this->CreateNestedTree(); this->vscroll = this->GetScrollbar(WID_DPI_SCROLLBAR); - this->FinishInitNested(0); - - this->SetButtons(); - /* Show scenario editor tools in editor. */ if (_game_mode != GM_EDITOR) { - auto *se_tools = this->GetWidget(WID_DPI_SCENARIO_EDITOR_PANE); - se_tools->SetDisplayedPlane(SZSP_HORIZONTAL); - this->ReInit(); + this->GetWidget(WID_DPI_SCENARIO_EDITOR_PANE)->SetDisplayedPlane(SZSP_HORIZONTAL); } + this->FinishInitNested(0); + + this->SetButtons(); } void OnInit() override diff --git a/src/tree_gui.cpp b/src/tree_gui.cpp index 44192b2227..9f8e045945 100644 --- a/src/tree_gui.cpp +++ b/src/tree_gui.cpp @@ -141,17 +141,15 @@ class BuildTreesWindow : public Window public: BuildTreesWindow(WindowDesc *desc, WindowNumber window_number) : Window(desc), tree_to_plant(-1), mode(PM_NORMAL) { - this->InitNested(window_number); + this->CreateNestedTree(); ResetObjectToPlace(); this->LowerWidget(WID_BT_MODE_NORMAL); - /* Show scenario editor tools in editor */ - auto *se_tools = this->GetWidget(WID_BT_SE_PANE); if (_game_mode != GM_EDITOR) { - se_tools->SetDisplayedPlane(SZSP_HORIZONTAL); - this->ReInit(); + this->GetWidget(WID_BT_SE_PANE)->SetDisplayedPlane(SZSP_HORIZONTAL); } + this->FinishInitNested(window_number); } void UpdateWidgetSize(int widget, Dimension *size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension *fill, [[maybe_unused]] Dimension *resize) override From 102fc6a9d1b7c13505285fbe2277d8d523376fa2 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 10 Dec 2023 12:05:28 +0000 Subject: [PATCH 058/105] Cleanup: iif should be iff (if-and-only-if) (#11570) --- src/core/geometry_type.hpp | 2 +- src/newgrf_object.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/geometry_type.hpp b/src/core/geometry_type.hpp index 4f2d9d4fcf..2c1f91abe4 100644 --- a/src/core/geometry_type.hpp +++ b/src/core/geometry_type.hpp @@ -215,7 +215,7 @@ struct Rect { /** * Test if a point falls inside this Rect. * @param pt the point to test. - * @return true iif the point falls inside the Rect. + * @return true iff the point falls inside the Rect. */ inline bool Contains(const Point &pt) const { diff --git a/src/newgrf_object.h b/src/newgrf_object.h index 644463674f..14200091bf 100644 --- a/src/newgrf_object.h +++ b/src/newgrf_object.h @@ -78,7 +78,7 @@ struct ObjectSpec { /** * Test if this object is enabled. - * @return True iif this object is enabled. + * @return True iff this object is enabled. */ bool IsEnabled() const { return this->views > 0; } From 09251d993c0fcc4928cd0bd39ea5613e7c43a593 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 10 Dec 2023 14:48:58 +0000 Subject: [PATCH 059/105] Change: Use sparse padding for network server list. (#11571) --- src/network/network_gui.cpp | 71 +++++++++++++++++------------------- src/widgets/network_widget.h | 1 - 2 files changed, 33 insertions(+), 39 deletions(-) diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index 0456c65a8f..da70a3cee6 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -568,8 +568,13 @@ public: this->SetWidgetLoweredState(WID_NG_REFRESH, sel != nullptr && sel->refreshing); /* 'NewGRF Settings' button invisible if no NewGRF is used */ - this->GetWidget(WID_NG_NEWGRF_SEL)->SetDisplayedPlane(sel == nullptr || sel->status != NGLS_ONLINE || sel->info.grfconfig == nullptr); - this->GetWidget(WID_NG_NEWGRF_MISSING_SEL)->SetDisplayedPlane(sel == nullptr || sel->status != NGLS_ONLINE || sel->info.grfconfig == nullptr || !sel->info.version_compatible || sel->info.compatible); + bool changed = false; + changed |= this->GetWidget(WID_NG_NEWGRF_SEL)->SetDisplayedPlane(sel == nullptr || sel->status != NGLS_ONLINE || sel->info.grfconfig == nullptr ? SZSP_NONE : 0); + changed |= this->GetWidget(WID_NG_NEWGRF_MISSING_SEL)->SetDisplayedPlane(sel == nullptr || sel->status != NGLS_ONLINE || sel->info.grfconfig == nullptr || !sel->info.version_compatible || sel->info.compatible ? SZSP_NONE : 0); + if (changed) { + this->ReInit(); + return; + } #ifdef __EMSCRIPTEN__ this->SetWidgetDisabledState(WID_NG_SEARCH_INTERNET, true); @@ -866,11 +871,11 @@ static const NWidgetPart _nested_network_game_widgets[] = { NWidget(WWT_DEFSIZEBOX, COLOUR_LIGHT_BLUE), EndContainer(), NWidget(WWT_PANEL, COLOUR_LIGHT_BLUE, WID_NG_MAIN), - NWidget(NWID_VERTICAL), SetPIP(10, 7, 0), - NWidget(NWID_HORIZONTAL), SetPIP(10, 7, 10), + NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_wide, 0), SetPadding(WidgetDimensions::unscaled.sparse_resize), + NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0), /* LEFT SIDE */ - NWidget(NWID_VERTICAL), SetPIP(0, 7, 0), - NWidget(NWID_HORIZONTAL), SetPIP(0, 7, 0), + NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_wide, 0), + NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_normal, 0), NWidget(WWT_TEXT, COLOUR_LIGHT_BLUE, WID_NG_FILTER_LABEL), SetDataTip(STR_LIST_FILTER_TITLE, STR_NULL), NWidget(WWT_EDITBOX, COLOUR_LIGHT_BLUE, WID_NG_FILTER), SetMinimalSize(251, 12), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_LIST_FILTER_OSKTITLE, STR_LIST_FILTER_TOOLTIP), @@ -895,29 +900,23 @@ static const NWidgetPart _nested_network_game_widgets[] = { EndContainer(), EndContainer(), /* RIGHT SIDE */ - NWidget(NWID_VERTICAL), SetPIP(0, 7, 0), - NWidget(NWID_HORIZONTAL), SetPIP(0, 7, 0), + NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_wide, 0), + NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_normal, 0), NWidget(WWT_TEXT, COLOUR_LIGHT_BLUE, WID_NG_CLIENT_LABEL), SetDataTip(STR_NETWORK_SERVER_LIST_PLAYER_NAME, STR_NULL), NWidget(WWT_EDITBOX, COLOUR_LIGHT_BLUE, WID_NG_CLIENT), SetMinimalSize(151, 12), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_NETWORK_SERVER_LIST_PLAYER_NAME_OSKTITLE, STR_NETWORK_SERVER_LIST_ENTER_NAME_TOOLTIP), EndContainer(), - NWidget(WWT_PANEL, COLOUR_LIGHT_BLUE, WID_NG_DETAILS), - NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(5, 5, 5), - NWidget(WWT_EMPTY, INVALID_COLOUR, WID_NG_DETAILS_SPACER), SetMinimalSize(140, 0), SetMinimalTextLines(15, 24 + WidgetDimensions::unscaled.vsep_normal), SetResize(0, 1), SetFill(1, 1), // Make sure it's at least this wide - NWidget(NWID_HORIZONTAL, NC_NONE), SetPIP(5, 5, 5), - NWidget(NWID_SELECTION, INVALID_COLOUR, WID_NG_NEWGRF_MISSING_SEL), - NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NG_NEWGRF_MISSING), SetFill(1, 0), SetDataTip(STR_NEWGRF_SETTINGS_FIND_MISSING_CONTENT_BUTTON, STR_NEWGRF_SETTINGS_FIND_MISSING_CONTENT_TOOLTIP), - NWidget(NWID_SPACER), SetFill(1, 0), - EndContainer(), + NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, WidgetDimensions::unscaled.vsep_sparse, 0), + NWidget(WWT_PANEL, COLOUR_LIGHT_BLUE, WID_NG_DETAILS), SetMinimalSize(140, 0), SetMinimalTextLines(15, 0), SetResize(0, 1), + EndContainer(), + NWidget(NWID_VERTICAL, NC_EQUALSIZE), + NWidget(NWID_SELECTION, INVALID_COLOUR, WID_NG_NEWGRF_MISSING_SEL), + NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NG_NEWGRF_MISSING), SetFill(1, 0), SetDataTip(STR_NEWGRF_SETTINGS_FIND_MISSING_CONTENT_BUTTON, STR_NEWGRF_SETTINGS_FIND_MISSING_CONTENT_TOOLTIP), EndContainer(), - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(5, 5, 5), - NWidget(NWID_SPACER), SetFill(1, 0), - NWidget(NWID_SELECTION, INVALID_COLOUR, WID_NG_NEWGRF_SEL), - NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NG_NEWGRF), SetFill(1, 0), SetDataTip(STR_INTRO_NEWGRF_SETTINGS, STR_NULL), - NWidget(NWID_SPACER), SetFill(1, 0), - EndContainer(), + NWidget(NWID_SELECTION, INVALID_COLOUR, WID_NG_NEWGRF_SEL), + NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NG_NEWGRF), SetFill(1, 0), SetDataTip(STR_INTRO_NEWGRF_SETTINGS, STR_NULL), EndContainer(), - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(5, 5, 5), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NG_JOIN), SetFill(1, 0), SetDataTip(STR_NETWORK_SERVER_LIST_JOIN_GAME, STR_NULL), NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NG_REFRESH), SetFill(1, 0), SetDataTip(STR_NETWORK_SERVER_LIST_REFRESH, STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP), EndContainer(), @@ -926,23 +925,19 @@ static const NWidgetPart _nested_network_game_widgets[] = { EndContainer(), EndContainer(), /* BOTTOM */ - NWidget(NWID_HORIZONTAL), - NWidget(NWID_VERTICAL), - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(10, 7, 4), - NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NG_SEARCH_INTERNET), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET, STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NG_SEARCH_LAN), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN, STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NG_ADD), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_NETWORK_SERVER_LIST_ADD_SERVER, STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NG_START), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_NETWORK_SERVER_LIST_START_SERVER, STR_NETWORK_SERVER_LIST_START_SERVER_TOOLTIP), - NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NG_CANCEL), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_BUTTON_CANCEL, STR_NULL), - EndContainer(), - NWidget(NWID_SPACER), SetMinimalSize(0, 6), SetResize(1, 0), SetFill(1, 0), - EndContainer(), - NWidget(NWID_VERTICAL), - NWidget(NWID_SPACER), SetFill(0, 1), - NWidget(WWT_RESIZEBOX, COLOUR_LIGHT_BLUE), - EndContainer(), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0), + NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NG_SEARCH_INTERNET), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET, STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NG_SEARCH_LAN), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN, STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NG_ADD), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_NETWORK_SERVER_LIST_ADD_SERVER, STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NG_START), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_NETWORK_SERVER_LIST_START_SERVER, STR_NETWORK_SERVER_LIST_START_SERVER_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NG_CANCEL), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_BUTTON_CANCEL, STR_NULL), EndContainer(), EndContainer(), + /* Resize button. */ + NWidget(NWID_HORIZONTAL), + NWidget(NWID_SPACER), SetFill(1, 0), SetResize(1, 0), + NWidget(WWT_RESIZEBOX, COLOUR_LIGHT_BLUE), + EndContainer(), EndContainer(), }; diff --git a/src/widgets/network_widget.h b/src/widgets/network_widget.h index 766d72e473..087436a516 100644 --- a/src/widgets/network_widget.h +++ b/src/widgets/network_widget.h @@ -34,7 +34,6 @@ enum NetworkGameWidgets { WID_NG_LASTJOINED_SPACER, ///< Spacer after last joined server panel. WID_NG_DETAILS, ///< Panel with game details. - WID_NG_DETAILS_SPACER, ///< Spacer for game actual details. WID_NG_JOIN, ///< 'Join game' button. WID_NG_REFRESH, ///< 'Refresh server' button. WID_NG_NEWGRF, ///< 'NewGRF Settings' button. From a3d56e2c6e80d51761ccb79affbfcf9177e34dce Mon Sep 17 00:00:00 2001 From: SamuXarick <43006711+SamuXarick@users.noreply.github.com> Date: Sun, 10 Dec 2023 15:42:55 +0000 Subject: [PATCH 060/105] Fix: Prevent overflow when calculating max town noise (#11564) Max town noise could overflow if the population was high enough. The value is now clamped. --- src/town.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/town.h b/src/town.h index dd88d03323..459d843313 100644 --- a/src/town.h +++ b/src/town.h @@ -119,7 +119,7 @@ struct Town : TownPool::PoolItem<&_town_pool> { if (this->cache.population == 0) return 0; // no population? no noise /* 3 is added (the noise of the lowest airport), so the user can at least build a small airfield. */ - return (this->cache.population / _settings_game.economy.town_noise_population[_settings_game.difficulty.town_council_tolerance]) + 3; + return ClampTo((this->cache.population / _settings_game.economy.town_noise_population[_settings_game.difficulty.town_council_tolerance]) + 3); } void UpdateVirtCoord(); From 6e8c27b8e5ad7db8961f1ebcd2b2592e02c05c36 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 10 Dec 2023 17:25:36 +0000 Subject: [PATCH 061/105] Change: Hide bevel for resizeable sparse layout windows. (#11572) When clicked, the button is still highlighted to show that it is active. The bevel is controlled with widget_data by RWV_SHOW_BEVEL or RWV_HIDE_BEVEL values. --- src/game/game_gui.cpp | 2 +- src/graph_gui.cpp | 12 ++++++------ src/network/network_content_gui.cpp | 2 +- src/network/network_gui.cpp | 2 +- src/newgrf_debug_gui.cpp | 2 +- src/newgrf_gui.cpp | 2 +- src/widget.cpp | 16 ++++++++++------ src/widget_type.h | 6 ++++++ 8 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/game/game_gui.cpp b/src/game/game_gui.cpp index 037e6591e8..8dfd319407 100644 --- a/src/game/game_gui.cpp +++ b/src/game/game_gui.cpp @@ -67,7 +67,7 @@ static const NWidgetPart _nested_gs_config_widgets[] = { EndContainer(), NWidget(NWID_HORIZONTAL), NWidget(NWID_SPACER), SetFill(1, 0), SetResize(1, 0), - NWidget(WWT_RESIZEBOX, COLOUR_MAUVE), + NWidget(WWT_RESIZEBOX, COLOUR_MAUVE), SetDataTip(RWV_HIDE_BEVEL, STR_TOOLTIP_RESIZE), EndContainer(), EndContainer(), }; diff --git a/src/graph_gui.cpp b/src/graph_gui.cpp index bf56415ac4..25eee1d791 100644 --- a/src/graph_gui.cpp +++ b/src/graph_gui.cpp @@ -647,7 +647,7 @@ static const NWidgetPart _nested_operating_profit_widgets[] = { NWidget(WWT_EMPTY, COLOUR_BROWN, WID_CV_GRAPH), SetMinimalSize(576, 160), SetFill(1, 1), SetResize(1, 1), NWidget(NWID_VERTICAL), NWidget(NWID_SPACER), SetFill(0, 1), SetResize(0, 1), - NWidget(WWT_RESIZEBOX, COLOUR_BROWN, WID_CV_RESIZE), + NWidget(WWT_RESIZEBOX, COLOUR_BROWN, WID_CV_RESIZE), SetDataTip(RWV_HIDE_BEVEL, STR_TOOLTIP_RESIZE), EndContainer(), EndContainer(), EndContainer(), @@ -698,7 +698,7 @@ static const NWidgetPart _nested_income_graph_widgets[] = { NWidget(WWT_EMPTY, COLOUR_BROWN, WID_CV_GRAPH), SetMinimalSize(576, 128), SetFill(1, 1), SetResize(1, 1), NWidget(NWID_VERTICAL), NWidget(NWID_SPACER), SetFill(0, 1), SetResize(0, 1), - NWidget(WWT_RESIZEBOX, COLOUR_BROWN, WID_CV_RESIZE), + NWidget(WWT_RESIZEBOX, COLOUR_BROWN, WID_CV_RESIZE), SetDataTip(RWV_HIDE_BEVEL, STR_TOOLTIP_RESIZE), EndContainer(), EndContainer(), EndContainer(), @@ -747,7 +747,7 @@ static const NWidgetPart _nested_delivered_cargo_graph_widgets[] = { NWidget(WWT_EMPTY, COLOUR_BROWN, WID_CV_GRAPH), SetMinimalSize(576, 128), SetFill(1, 1), SetResize(1, 1), NWidget(NWID_VERTICAL), NWidget(NWID_SPACER), SetFill(0, 1), SetResize(0, 1), - NWidget(WWT_RESIZEBOX, COLOUR_BROWN, WID_CV_RESIZE), + NWidget(WWT_RESIZEBOX, COLOUR_BROWN, WID_CV_RESIZE), SetDataTip(RWV_HIDE_BEVEL, STR_TOOLTIP_RESIZE), EndContainer(), EndContainer(), EndContainer(), @@ -803,7 +803,7 @@ static const NWidgetPart _nested_performance_history_widgets[] = { NWidget(WWT_EMPTY, COLOUR_BROWN, WID_PHG_GRAPH), SetMinimalSize(576, 224), SetFill(1, 1), SetResize(1, 1), NWidget(NWID_VERTICAL), NWidget(NWID_SPACER), SetFill(0, 1), SetResize(0, 1), - NWidget(WWT_RESIZEBOX, COLOUR_BROWN, WID_PHG_RESIZE), + NWidget(WWT_RESIZEBOX, COLOUR_BROWN, WID_PHG_RESIZE), SetDataTip(RWV_HIDE_BEVEL, STR_TOOLTIP_RESIZE), EndContainer(), EndContainer(), EndContainer(), @@ -852,7 +852,7 @@ static const NWidgetPart _nested_company_value_graph_widgets[] = { NWidget(WWT_EMPTY, COLOUR_BROWN, WID_CV_GRAPH), SetMinimalSize(576, 224), SetFill(1, 1), SetResize(1, 1), NWidget(NWID_VERTICAL), NWidget(NWID_SPACER), SetFill(0, 1), SetResize(0, 1), - NWidget(WWT_RESIZEBOX, COLOUR_BROWN, WID_CV_RESIZE), + NWidget(WWT_RESIZEBOX, COLOUR_BROWN, WID_CV_RESIZE), SetDataTip(RWV_HIDE_BEVEL, STR_TOOLTIP_RESIZE), EndContainer(), EndContainer(), EndContainer(), @@ -1089,7 +1089,7 @@ static const NWidgetPart _nested_cargo_payment_rates_widgets[] = { NWidget(NWID_SPACER), SetMinimalSize(12, 0), SetFill(1, 0), SetResize(1, 0), NWidget(WWT_TEXT, COLOUR_BROWN, WID_CPR_FOOTER), SetMinimalSize(0, 6), SetPadding(2, 0, 2, 0), SetDataTip(STR_GRAPH_CARGO_PAYMENT_RATES_X_LABEL, STR_NULL), NWidget(NWID_SPACER), SetFill(1, 0), SetResize(1, 0), - NWidget(WWT_RESIZEBOX, COLOUR_BROWN, WID_CPR_RESIZE), + NWidget(WWT_RESIZEBOX, COLOUR_BROWN, WID_CPR_RESIZE), SetDataTip(RWV_HIDE_BEVEL, STR_TOOLTIP_RESIZE), EndContainer(), EndContainer(), }; diff --git a/src/network/network_content_gui.cpp b/src/network/network_content_gui.cpp index d201e87338..cfbd160222 100644 --- a/src/network/network_content_gui.cpp +++ b/src/network/network_content_gui.cpp @@ -1105,7 +1105,7 @@ static const NWidgetPart _nested_network_content_list_widgets[] = { /* Resize button. */ NWidget(NWID_HORIZONTAL), NWidget(NWID_SPACER), SetFill(1, 0), SetResize(1, 0), - NWidget(WWT_RESIZEBOX, COLOUR_LIGHT_BLUE), + NWidget(WWT_RESIZEBOX, COLOUR_LIGHT_BLUE), SetDataTip(RWV_HIDE_BEVEL, STR_TOOLTIP_RESIZE), EndContainer(), EndContainer(), }; diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index da70a3cee6..ddd6f62985 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -936,7 +936,7 @@ static const NWidgetPart _nested_network_game_widgets[] = { /* Resize button. */ NWidget(NWID_HORIZONTAL), NWidget(NWID_SPACER), SetFill(1, 0), SetResize(1, 0), - NWidget(WWT_RESIZEBOX, COLOUR_LIGHT_BLUE), + NWidget(WWT_RESIZEBOX, COLOUR_LIGHT_BLUE), SetDataTip(RWV_HIDE_BEVEL, STR_TOOLTIP_RESIZE), EndContainer(), EndContainer(), }; diff --git a/src/newgrf_debug_gui.cpp b/src/newgrf_debug_gui.cpp index 8b8a1f5431..732c9d2aef 100644 --- a/src/newgrf_debug_gui.cpp +++ b/src/newgrf_debug_gui.cpp @@ -1152,7 +1152,7 @@ static const NWidgetPart _nested_sprite_aligner_widgets[] = { EndContainer(), NWidget(NWID_HORIZONTAL), NWidget(NWID_SPACER), SetFill(1, 0), SetResize(1, 0), - NWidget(WWT_RESIZEBOX, COLOUR_GREY), + NWidget(WWT_RESIZEBOX, COLOUR_GREY), SetDataTip(RWV_HIDE_BEVEL, STR_TOOLTIP_RESIZE), EndContainer(), EndContainer(), }; diff --git a/src/newgrf_gui.cpp b/src/newgrf_gui.cpp index 048ec5222e..f3f72fa80c 100644 --- a/src/newgrf_gui.cpp +++ b/src/newgrf_gui.cpp @@ -1963,7 +1963,7 @@ static const NWidgetPart _nested_newgrf_widgets[] = { /* Resize button. */ NWidget(NWID_HORIZONTAL), NWidget(NWID_SPACER), SetFill(1, 0), SetResize(1, 0), - NWidget(WWT_RESIZEBOX, COLOUR_MAUVE), + NWidget(WWT_RESIZEBOX, COLOUR_MAUVE), SetDataTip(RWV_HIDE_BEVEL, STR_TOOLTIP_RESIZE), EndContainer(), EndContainer(), }; diff --git a/src/widget.cpp b/src/widget.cpp index 148bd8ddec..84176fa837 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -154,7 +154,7 @@ const WidgetDimensions WidgetDimensions::unscaled = { {20, 10, 20, 10}, ///< modalpopup {3, 3, 3, 3}, ///< picker {10, 8, 10, 8}, ///< sparse window padding - {10, 8, 10, 1}, ///< resizable sparse window padding + {10, 8, 10, 0}, ///< resizable sparse window padding 1, ///< vsep_picker WD_PAR_VSEP_NORMAL, ///< vsep_normal 4, ///< vsep_sparse @@ -777,10 +777,15 @@ static inline void DrawDebugBox(const Rect &r, Colours colour, bool clicked) * @param colour Colour of the resize box. * @param at_left Resize box is at left-side of the window, * @param clicked Box is lowered. + * @param bevel Draw bevel iff set. */ -static inline void DrawResizeBox(const Rect &r, Colours colour, bool at_left, bool clicked) +static inline void DrawResizeBox(const Rect &r, Colours colour, bool at_left, bool clicked, bool bevel) { - DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, (clicked) ? FR_LOWERED : FR_NONE); + if (bevel) { + DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, (clicked) ? FR_LOWERED : FR_NONE); + } else if (clicked) { + GfxFillRect(r.Shrink(WidgetDimensions::scaled.bevel), _colour_gradient[colour][6]); + } DrawSpriteIgnorePadding(at_left ? SPR_WINDOW_RESIZE_LEFT : SPR_WINDOW_RESIZE_RIGHT, PAL_NONE, r.Shrink(ScaleGUITrad(2)), at_left ? (SA_LEFT | SA_BOTTOM | SA_FORCE) : (SA_RIGHT | SA_BOTTOM | SA_FORCE)); } @@ -2774,7 +2779,7 @@ NWidgetLeaf::NWidgetLeaf(WidgetType tp, Colours colour, int index, uint32_t data case WWT_RESIZEBOX: this->SetFill(0, 0); this->SetMinimalSize(WD_RESIZEBOX_WIDTH, 12); - this->SetDataTip(STR_NULL, STR_TOOLTIP_RESIZE); + this->SetDataTip(RWV_SHOW_BEVEL, STR_TOOLTIP_RESIZE); break; case WWT_CLOSEBOX: @@ -3072,8 +3077,7 @@ void NWidgetLeaf::Draw(const Window *w) break; case WWT_RESIZEBOX: - assert(this->widget_data == 0); - DrawResizeBox(r, this->colour, this->pos_x < (w->width / 2), !!(w->flags & WF_SIZING)); + DrawResizeBox(r, this->colour, this->pos_x < (w->width / 2), !!(w->flags & WF_SIZING), this->widget_data == 0); break; case WWT_CLOSEBOX: diff --git a/src/widget_type.h b/src/widget_type.h index 8ec91855c6..2280b09cbc 100644 --- a/src/widget_type.h +++ b/src/widget_type.h @@ -36,6 +36,12 @@ enum ArrowWidgetValues { AWV_RIGHT, ///< Force the arrow to the right }; +/** WidgetData values for a resize box widget. */ +enum ResizeWidgetValues { + RWV_SHOW_BEVEL, ///< Bevel of resize box is shown. + RWV_HIDE_BEVEL, ///< Bevel of resize box is hidden. +}; + /** * Window widget types, nested widget types, and nested widget part types. */ From 051abb2fad6f83137b8272a3bb614559248123c7 Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Sun, 10 Dec 2023 18:05:51 -0500 Subject: [PATCH 062/105] Change: Don't show scoring year in high score table (#11546) --- src/highscore_gui.cpp | 4 ++-- src/lang/english.txt | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/highscore_gui.cpp b/src/highscore_gui.cpp index a6c9529af4..3fedda84ca 100644 --- a/src/highscore_gui.cpp +++ b/src/highscore_gui.cpp @@ -189,8 +189,8 @@ struct HighScoreWindow : EndGameHighScoreBaseWindow { this->SetupHighScoreEndWindow(); Point pt = this->GetTopLeft(ScaleSpriteTrad(640), ScaleSpriteTrad(480)); - SetDParam(0, _settings_game.game_creation.ending_year); - DrawStringMultiLine(pt.x + ScaleSpriteTrad(70), pt.x + ScaleSpriteTrad(570), pt.y, pt.y + ScaleSpriteTrad(140), !_networking ? STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED : STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME, TC_FROMSTRING, SA_CENTER); + /* Draw the title. */ + DrawStringMultiLine(pt.x + ScaleSpriteTrad(70), pt.x + ScaleSpriteTrad(570), pt.y, pt.y + ScaleSpriteTrad(140), STR_HIGHSCORE_TOP_COMPANIES, TC_FROMSTRING, SA_CENTER); /* Draw Highscore peepz */ for (uint8_t i = 0; i < ClampTo(hs.size()); i++) { diff --git a/src/lang/english.txt b/src/lang/english.txt index 5d9b8688ea..d82f9702ce 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -718,8 +718,7 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Click on STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Click on music track to remove it from current programme (Custom1 or Custom2 only) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Top companies who reached {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Company League Table in {NUM} +STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}Top companies STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Businessperson STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Entrepreneur From 2a62caa30baf3521fe006a2a8bddeb9d20f84794 Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Sun, 26 Nov 2023 11:12:02 -0500 Subject: [PATCH 063/105] Codechange: Use Ticks for BaseConsist timetable fields --- src/base_consist.h | 4 ++-- src/economy.cpp | 2 +- src/linkgraph/refresh.cpp | 3 +-- src/saveload/saveload.h | 1 + src/saveload/vehicle_sl.cpp | 3 ++- src/timetable_cmd.cpp | 10 +++++----- src/vehicle.cpp | 2 +- 7 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/base_consist.h b/src/base_consist.h index b89cddab55..6189604537 100644 --- a/src/base_consist.h +++ b/src/base_consist.h @@ -18,8 +18,8 @@ struct BaseConsist { std::string name; ///< Name of vehicle /* Used for timetabling. */ - uint32_t current_order_time; ///< How many ticks have passed since this order started. - int32_t lateness_counter; ///< How many ticks late (or early if negative) this vehicle is. + TimerGameTick::Ticks current_order_time; ///< How many ticks have passed since this order started. + TimerGameTick::Ticks lateness_counter; ///< How many ticks late (or early if negative) this vehicle is. TimerGameTick::TickCounter timetable_start; ///< At what tick of TimerGameTick::counter the vehicle should start its timetable. uint16_t service_interval; ///< The interval for (automatic) servicing; either in days or %. diff --git a/src/economy.cpp b/src/economy.cpp index d168381465..ddd2cf9e4c 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -1872,7 +1872,7 @@ static void LoadUnloadVehicle(Vehicle *front) /* We loaded less cargo than possible for all cargo types and it's not full * load and we're not supposed to wait any longer: stop loading. */ if (!anything_unloaded && full_load_amount == 0 && reservation_left == 0 && !(front->current_order.GetLoadType() & OLFB_FULL_LOAD) && - front->current_order_time >= (uint)std::max(front->current_order.GetTimetabledWait() - front->lateness_counter, 0)) { + front->current_order_time >= std::max(front->current_order.GetTimetabledWait() - front->lateness_counter, 0)) { SetBit(front->vehicle_flags, VF_STOP_LOADING); } diff --git a/src/linkgraph/refresh.cpp b/src/linkgraph/refresh.cpp index 26f9ee8339..98fdaeba46 100644 --- a/src/linkgraph/refresh.cpp +++ b/src/linkgraph/refresh.cpp @@ -233,8 +233,7 @@ void LinkRefresher::RefreshStats(const Order *cur, const Order *next) * probably far off and we'd greatly overestimate the capacity by increasing.*/ if (this->is_full_loading && this->vehicle->orders != nullptr && st->index == vehicle->last_station_visited && - this->vehicle->orders->GetTotalDuration() > - (TimerGameTick::Ticks)this->vehicle->current_order_time) { + this->vehicle->orders->GetTotalDuration() > this->vehicle->current_order_time) { uint effective_capacity = cargo_quantity * this->vehicle->load_unload_ticks; if (effective_capacity > (uint)this->vehicle->orders->GetTotalDuration()) { IncreaseStats(st, c, next_station, effective_capacity / diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index 6ac242cb70..23531fa7ae 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -365,6 +365,7 @@ enum SaveLoadVersion : uint16_t { SLV_STATION_RATING_CHEAT, ///< 320 PR#11346 Add cheat to fix station ratings at 100%. SLV_TIMETABLE_START_TICKS, ///< 321 PR#11468 Convert timetable start from a date to ticks. SLV_TIMETABLE_START_TICKS_FIX, ///< 322 PR#11557 Fix for missing convert timetable start from a date to ticks. + SLV_TIMETABLE_TICKS_TYPE, ///< 323 PR#11435 Convert timetable current order time to ticks. SL_MAX_VERSION, ///< Highest possible saveload version }; diff --git a/src/saveload/vehicle_sl.cpp b/src/saveload/vehicle_sl.cpp index e0b7073ce6..8d482a1b89 100644 --- a/src/saveload/vehicle_sl.cpp +++ b/src/saveload/vehicle_sl.cpp @@ -720,7 +720,8 @@ public: SLE_CONDREF(Vehicle, next_shared, REF_VEHICLE, SLV_2, SL_MAX_VERSION), SLE_CONDVAR(Vehicle, group_id, SLE_UINT16, SLV_60, SL_MAX_VERSION), - SLE_CONDVAR(Vehicle, current_order_time, SLE_UINT32, SLV_67, SL_MAX_VERSION), + SLE_CONDVAR(Vehicle, current_order_time, SLE_FILE_U32 | SLE_VAR_I32, SLV_67, SLV_TIMETABLE_TICKS_TYPE), + SLE_CONDVAR(Vehicle, current_order_time, SLE_INT32, SLV_TIMETABLE_TICKS_TYPE, SL_MAX_VERSION), SLE_CONDVAR(Vehicle, last_loading_tick, SLE_UINT64, SLV_LAST_LOADING_TICK, SL_MAX_VERSION), SLE_CONDVAR(Vehicle, lateness_counter, SLE_INT32, SLV_67, SL_MAX_VERSION), }; diff --git a/src/timetable_cmd.cpp b/src/timetable_cmd.cpp index e36ea4a144..0d7cd58a5f 100644 --- a/src/timetable_cmd.cpp +++ b/src/timetable_cmd.cpp @@ -264,7 +264,7 @@ CommandCost CmdSetVehicleOnTime(DoCommandFlag flags, VehicleID veh, bool apply_t if (flags & DC_EXEC) { if (apply_to_group) { - int32_t most_late = 0; + TimerGameTick::Ticks most_late = 0; for (Vehicle *u = v->FirstShared(); u != nullptr; u = u->NextShared()) { /* A vehicle can't be late if its timetable hasn't started. */ if (!HasBit(v->vehicle_flags, VF_TIMETABLE_STARTED)) continue; @@ -454,7 +454,7 @@ CommandCost CmdAutofillTimetable(DoCommandFlag flags, VehicleID veh, bool autofi */ void UpdateVehicleTimetable(Vehicle *v, bool travelling) { - uint time_taken = v->current_order_time; + TimerGameTick::Ticks time_taken = v->current_order_time; v->current_order_time = 0; @@ -514,7 +514,7 @@ void UpdateVehicleTimetable(Vehicle *v, bool travelling) * the timetable entry like is done for road vehicles/ships. * Thus always make sure at least one tick is used between the * processing of different orders when filling the timetable. */ - uint time_to_set = CeilDiv(std::max(time_taken, 1U), Ticks::DAY_TICKS) * Ticks::DAY_TICKS; + uint time_to_set = CeilDiv(std::max(time_taken, 1), Ticks::DAY_TICKS) * Ticks::DAY_TICKS; if (travelling && (autofilling || !real_current_order->IsTravelTimetabled())) { ChangeTimetable(v, v->cur_real_order_index, time_to_set, MTF_TRAVEL_TIME, autofilling); @@ -533,7 +533,7 @@ void UpdateVehicleTimetable(Vehicle *v, bool travelling) if (autofilling) return; - uint timetabled = travelling ? real_current_order->GetTimetabledTravel() : + TimerGameTick::Ticks timetabled = travelling ? real_current_order->GetTimetabledTravel() : real_current_order->GetTimetabledWait(); /* Vehicles will wait at stations if they arrive early even if they are not @@ -548,7 +548,7 @@ void UpdateVehicleTimetable(Vehicle *v, bool travelling) * shorter than the amount of ticks we are late we reduce the lateness by the * length of a full cycle till lateness is less than the length of a timetable * cycle. When the timetable isn't fully filled the cycle will be Ticks::INVALID_TICKS. */ - if (v->lateness_counter > (int)timetabled) { + if (v->lateness_counter > timetabled) { TimerGameTick::Ticks cycle = v->orders->GetTimetableTotalDuration(); if (cycle != Ticks::INVALID_TICKS && v->lateness_counter > cycle) { v->lateness_counter %= cycle; diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 7e9d9a0a13..386b956b4f 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -2333,7 +2333,7 @@ void Vehicle::HandleLoading(bool mode) { switch (this->current_order.GetType()) { case OT_LOADING: { - uint wait_time = std::max(this->current_order.GetTimetabledWait() - this->lateness_counter, 0); + TimerGameTick::Ticks wait_time = std::max(this->current_order.GetTimetabledWait() - this->lateness_counter, 0); /* Not the first call for this tick, or still loading */ if (mode || !HasBit(this->vehicle_flags, VF_LOADING_FINISHED) || this->current_order_time < wait_time) return; From 2bada59193ad54ca5b563b32ffccc7ffeb7f201d Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Sun, 24 Sep 2023 19:43:10 -0400 Subject: [PATCH 064/105] Feature: Mode to display timetable in seconds --- src/lang/english.txt | 29 ++++-- src/settings_gui.cpp | 2 +- src/settings_type.h | 3 +- src/table/settings/gui_settings.ini | 18 ++-- src/timetable.h | 6 ++ src/timetable_cmd.cpp | 7 +- src/timetable_gui.cpp | 151 +++++++++++++++++++++++----- 7 files changed, 170 insertions(+), 46 deletions(-) diff --git a/src/lang/english.txt b/src/lang/english.txt index d82f9702ce..ec6f3ec932 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -255,6 +255,10 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m +STR_UNITS_DAYS :{COMMA}{NBSP}day{P "" s} +STR_UNITS_SECONDS :{COMMA}{NBSP}second{P "" s} +STR_UNITS_TICKS :{COMMA}{NBSP}tick{P "" s} + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filter: STR_LIST_FILTER_OSKTITLE :{BLACK}Enter one or more keywords to filter the list for @@ -1655,8 +1659,12 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Enable usage of STR_CONFIG_SETTING_LOADING_INDICATORS :Use loading indicators: {STRING2} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Select whether loading indicators are displayed above loading or unloading vehicles -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Show timetable in ticks rather than days: {STRING2} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Show travel times in time tables in game ticks instead of days +STR_CONFIG_SETTING_TIMETABLE_MODE :Time units for timetables: {STRING2} +STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Select the time units used for vehicle timetables +###length 3 +STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS :Days +STR_CONFIG_SETTING_TIMETABLE_MODE_SECONDS :Seconds +STR_CONFIG_SETTING_TIMETABLE_MODE_TICKS :Ticks STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Show arrival and departure in timetables: {STRING2} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Display anticipated arrival and departure times in timetables @@ -4565,8 +4573,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(stay for {STRI STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(travel for {STRING1}, not timetabled) STR_TIMETABLE_STAY_FOR :and stay for {STRING1} STR_TIMETABLE_AND_TRAVEL_FOR :and travel for {STRING1} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}day{P "" s} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}tick{P "" s} STR_TIMETABLE_TOTAL_TIME :{BLACK}This timetable will take {STRING1} to complete STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}This timetable will take at least {STRING1} to complete (not all timetabled) @@ -4575,10 +4581,13 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}This veh STR_TIMETABLE_STATUS_LATE :{BLACK}This vehicle is currently running {STRING1} late STR_TIMETABLE_STATUS_EARLY :{BLACK}This vehicle is currently running {STRING1} early STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}This timetable has not yet started -STR_TIMETABLE_STATUS_START_AT :{BLACK}This timetable will start at {STRING1} +STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}This timetable will start at {STRING1} +STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}This timetable will start in {COMMA} seconds + +STR_TIMETABLE_START :{BLACK}Start Timetable +STR_TIMETABLE_START_TOOLTIP :{BLACK}Select when this timetable starts. Ctrl+Click evenly distributes the start of all vehicles sharing this order based on their relative order, if the order is completely timetabled -STR_TIMETABLE_STARTING_DATE :{BLACK}Start date -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Select a date as starting point of this timetable. Ctrl+Click distributes all vehicles sharing this order evenly from the given date based on their relative order, if the order is completely timetabled +STR_TIMETABLE_START_SECONDS_QUERY :Seconds until timetable starts STR_TIMETABLE_CHANGE_TIME :{BLACK}Change Time STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Change the amount of time that the highlighted order should take. Ctrl+Click sets the time for all orders @@ -4602,8 +4611,10 @@ STR_TIMETABLE_EXPECTED :{BLACK}Expected STR_TIMETABLE_SCHEDULED :{BLACK}Scheduled STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Switch between expected and scheduled -STR_TIMETABLE_ARRIVAL :A: {COLOUR}{DATE_TINY} -STR_TIMETABLE_DEPARTURE :D: {COLOUR}{DATE_TINY} +STR_TIMETABLE_ARRIVAL_DATE :A: {COLOUR}{DATE_TINY} +STR_TIMETABLE_DEPARTURE_DATE :D: {COLOUR}{DATE_TINY} +STR_TIMETABLE_ARRIVAL_SECONDS_IN_FUTURE :A: {COLOUR}{COMMA} sec +STR_TIMETABLE_DEPARTURE_SECONDS_IN_FUTURE :D: {COLOUR}{COMMA} sec # Date window (for timetable) diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index c80bcc2766..b6d9a9118d 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -1803,7 +1803,7 @@ static SettingsContainer &GetSettingsTree() interface->Add(new SettingEntry("gui.statusbar_pos")); interface->Add(new SettingEntry("gui.prefer_teamchat")); interface->Add(new SettingEntry("gui.advanced_vehicle_list")); - interface->Add(new SettingEntry("gui.timetable_in_ticks")); + interface->Add(new SettingEntry("gui.timetable_mode")); interface->Add(new SettingEntry("gui.timetable_arrival_departure")); interface->Add(new SettingEntry("gui.show_newgrf_name")); interface->Add(new SettingEntry("gui.show_cargo_in_vehicle_lists")); diff --git a/src/settings_type.h b/src/settings_type.h index c70f5f98ae..8ac229ed72 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -22,6 +22,7 @@ #include "openttd.h" #include "rail_gui.h" #include "signal_type.h" +#include "timetable.h" /* Used to validate sizes of "max" value in settings. */ const size_t MAX_SLE_UINT8 = UINT8_MAX; @@ -167,7 +168,7 @@ struct GUISettings { SignalCycleSettings cycle_signal_types; ///< Which signal types to cycle with the build signal tool. SignalType default_signal_type; ///< The default signal type, which is set automatically by the last signal used. Not available in Settings. TimerGameCalendar::Year coloured_news_year; ///< when does newspaper become coloured? - bool timetable_in_ticks; ///< whether to show the timetable in ticks rather than days + TimetableMode timetable_mode; ///< Time units for timetables: days, seconds, or ticks bool quick_goto; ///< Allow quick access to 'goto button' in vehicle orders window bool auto_euro; ///< automatically switch to euro in 2002 byte drag_signals_density; ///< many signals density diff --git a/src/table/settings/gui_settings.ini b/src/table/settings/gui_settings.ini index ab6fdc4bb2..2986b25ebe 100644 --- a/src/table/settings/gui_settings.ini +++ b/src/table/settings/gui_settings.ini @@ -420,14 +420,18 @@ str = STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS strhelp = STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT strval = STR_CONFIG_SETTING_COMPANIES_OFF -[SDTC_BOOL] -var = gui.timetable_in_ticks -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC -def = false -str = STR_CONFIG_SETTING_TIMETABLE_IN_TICKS -strhelp = STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT +[SDTC_VAR] +var = gui.timetable_mode +type = SLE_UINT8 +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN +def = 0 +min = 0 +max = 2 +str = STR_CONFIG_SETTING_TIMETABLE_MODE +strhelp = STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT +strval = STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS post_cb = [](auto) { InvalidateWindowClassesData(WC_VEHICLE_TIMETABLE, VIWD_MODIFY_ORDERS); } -cat = SC_EXPERT +cat = SC_ADVANCED [SDTC_BOOL] var = gui.timetable_arrival_departure diff --git a/src/timetable.h b/src/timetable.h index 8aacf98483..5f8bb2d6ec 100644 --- a/src/timetable.h +++ b/src/timetable.h @@ -16,6 +16,12 @@ static const TimerGameCalendar::Year MAX_TIMETABLE_START_YEARS = 15; ///< The maximum start date offset, in years. +enum class TimetableMode : uint8_t { + Days, + Seconds, + Ticks, +}; + TimerGameTick::TickCounter GetStartTickFromDate(TimerGameCalendar::Date start_date); TimerGameCalendar::Date GetDateFromStartTick(TimerGameTick::TickCounter start_tick); diff --git a/src/timetable_cmd.cpp b/src/timetable_cmd.cpp index 0d7cd58a5f..9c923bdeff 100644 --- a/src/timetable_cmd.cpp +++ b/src/timetable_cmd.cpp @@ -505,16 +505,15 @@ void UpdateVehicleTimetable(Vehicle *v, bool travelling) /* Before modifying waiting times, check whether we want to preserve bigger ones. */ if (!real_current_order->IsType(OT_CONDITIONAL) && (travelling || time_taken > real_current_order->GetWaitTime() || remeasure_wait_time)) { - /* Round the time taken up to the nearest day, as this will avoid - * confusion for people who are timetabling in days, and can be - * adjusted later by people who aren't. + /* Round up to the smallest unit of time commonly shown in the GUI (seconds) to avoid confusion. + * Players timetabling in Ticks can adjust later. * For trains/aircraft multiple movement cycles are done in one * tick. This makes it possible to leave the station and process * e.g. a depot order in the same tick, causing it to not fill * the timetable entry like is done for road vehicles/ships. * Thus always make sure at least one tick is used between the * processing of different orders when filling the timetable. */ - uint time_to_set = CeilDiv(std::max(time_taken, 1), Ticks::DAY_TICKS) * Ticks::DAY_TICKS; + uint time_to_set = CeilDiv(std::max(time_taken, 1), Ticks::TICKS_PER_SECOND) * Ticks::TICKS_PER_SECOND; if (travelling && (autofilling || !real_current_order->IsTravelTimetabled())) { ChangeTimetable(v, v->cur_real_order_index, time_to_set, MTF_TRAVEL_TIME, autofilling); diff --git a/src/timetable_gui.cpp b/src/timetable_gui.cpp index c2ac3ca415..be8941187e 100644 --- a/src/timetable_gui.cpp +++ b/src/timetable_gui.cpp @@ -18,8 +18,10 @@ #include "string_func.h" #include "gfx_func.h" #include "company_func.h" +#include "timer/timer.h" #include "timer/timer_game_tick.h" #include "timer/timer_game_calendar.h" +#include "timer/timer_window.h" #include "date_gui.h" #include "vehicle_gui.h" #include "settings_type.h" @@ -47,12 +49,59 @@ struct TimetableArrivalDeparture { */ void SetTimetableParams(int param1, int param2, TimerGameTick::Ticks ticks) { - if (_settings_client.gui.timetable_in_ticks) { - SetDParam(param1, STR_TIMETABLE_TICKS); - SetDParam(param2, ticks); - } else { - SetDParam(param1, STR_TIMETABLE_DAYS); - SetDParam(param2, ticks / Ticks::DAY_TICKS); + switch (_settings_client.gui.timetable_mode) { + case TimetableMode::Days: + SetDParam(param1, STR_UNITS_DAYS); + SetDParam(param2, ticks / Ticks::DAY_TICKS); + break; + case TimetableMode::Seconds: + SetDParam(param1, STR_UNITS_SECONDS); + SetDParam(param2, ticks / Ticks::TICKS_PER_SECOND); + break; + case TimetableMode::Ticks: + SetDParam(param1, STR_UNITS_TICKS); + SetDParam(param2, ticks); + break; + default: + NOT_REACHED(); + } +} + +/** + * Get the number of ticks in the current timetable display unit. + * @return The number of ticks per day, second, or tick, to match the timetable display. + */ +static inline TimerGameTick::Ticks TicksPerTimetableUnit() +{ + switch (_settings_client.gui.timetable_mode) { + case TimetableMode::Days: + return Ticks::DAY_TICKS; + case TimetableMode::Seconds: + return Ticks::TICKS_PER_SECOND; + case TimetableMode::Ticks: + return 1; + default: + NOT_REACHED(); + } +} + +/** + * Determine if a vehicle should be shown as late, depending on the timetable display setting. + * @param v The vehicle in question. + * @param round_to_day When using ticks, if we should round up to the nearest day. + * @return True if the vehicle is later than the threshold. + */ +bool VehicleIsAboveLatenessThreshold(const Vehicle *v, bool round_to_day) +{ + switch (_settings_client.gui.timetable_mode) { + case TimetableMode::Days: + return v->lateness_counter > Ticks::DAY_TICKS; + case TimetableMode::Seconds: + return v->lateness_counter > Ticks::TICKS_PER_SECOND; + case TimetableMode::Ticks: + return v->lateness_counter > (round_to_day ? Ticks::DAY_TICKS : 0); + default: + NOT_REACHED(); } } @@ -183,7 +232,10 @@ struct TimetableWindow : Window { assert(HasBit(v->vehicle_flags, VF_TIMETABLE_STARTED)); bool travelling = (!v->current_order.IsType(OT_LOADING) || v->current_order.GetNonStopType() == ONSF_STOP_EVERYWHERE); - TimerGameTick::Ticks start_time = TimerGameCalendar::date_fract - v->current_order_time; + TimerGameTick::Ticks start_time = -v->current_order_time; + + /* If arrival and departure times are in days, compensate for the current date_fract. */ + if (_settings_client.gui.timetable_mode != TimetableMode::Seconds) start_time += TimerGameCalendar::date_fract; FillTimetableArrivalDepartureTable(v, v->cur_real_order_index % v->GetNumOrders(), travelling, table, start_time); @@ -194,8 +246,15 @@ struct TimetableWindow : Window { { switch (widget) { case WID_VT_ARRIVAL_DEPARTURE_PANEL: - SetDParamMaxValue(1, TimerGameCalendar::DateAtStartOfYear(CalendarTime::MAX_YEAR), 0, FS_SMALL); - size->width = std::max(GetStringBoundingBox(STR_TIMETABLE_ARRIVAL).width, GetStringBoundingBox(STR_TIMETABLE_DEPARTURE).width) + WidgetDimensions::scaled.hsep_wide + padding.width; + /* We handle this differently depending on the timetable mode. */ + if (_settings_client.gui.timetable_mode == TimetableMode::Seconds) { + /* A five-digit number would fit a timetable lasting 2.7 real-world hours, which should be plenty. */ + SetDParamMaxDigits(1, 4, FS_SMALL); + size->width = std::max(GetStringBoundingBox(STR_TIMETABLE_ARRIVAL_SECONDS_IN_FUTURE).width, GetStringBoundingBox(STR_TIMETABLE_DEPARTURE_SECONDS_IN_FUTURE).width) + WidgetDimensions::scaled.hsep_wide + padding.width; + } else { + SetDParamMaxValue(1, TimerGameCalendar::DateAtStartOfYear(CalendarTime::MAX_YEAR), 0, FS_SMALL); + size->width = std::max(GetStringBoundingBox(STR_TIMETABLE_ARRIVAL_DATE).width, GetStringBoundingBox(STR_TIMETABLE_DEPARTURE_DATE).width) + WidgetDimensions::scaled.hsep_wide + padding.width; + } FALLTHROUGH; case WID_VT_ARRIVAL_DEPARTURE_SELECTION: @@ -436,7 +495,7 @@ struct TimetableWindow : Window { int selected = this->sel_index; Rect tr = r.Shrink(WidgetDimensions::scaled.framerect); - bool show_late = this->show_expected && v->lateness_counter > Ticks::DAY_TICKS; + bool show_late = this->show_expected && VehicleIsAboveLatenessThreshold(v, true); TimerGameTick::Ticks offset = show_late ? 0 : -v->lateness_counter; for (int i = this->vscroll->GetPosition(); i / 2 < v->GetNumOrders(); ++i) { // note: i is also incremented in the loop @@ -460,14 +519,28 @@ struct TimetableWindow : Window { } /* Now actually draw the arrival time. */ - SetDParam(1, TimerGameCalendar::date + (arr_dep[i / 2].arrival + this_offset) / Ticks::DAY_TICKS); - DrawString(tr.left, tr.right, tr.top, STR_TIMETABLE_ARRIVAL, i == selected ? TC_WHITE : TC_BLACK); + if (_settings_client.gui.timetable_mode == TimetableMode::Seconds) { + /* Display seconds from now. */ + SetDParam(1, ((arr_dep[i / 2].arrival + offset) / Ticks::TICKS_PER_SECOND)); + DrawString(tr.left, tr.right, tr.top, STR_TIMETABLE_ARRIVAL_SECONDS_IN_FUTURE, i == selected ? TC_WHITE : TC_BLACK); + } else { + /* Show a date. */ + SetDParam(1, TimerGameCalendar::date + (arr_dep[i / 2].arrival + this_offset) / Ticks::DAY_TICKS); + DrawString(tr.left, tr.right, tr.top, STR_TIMETABLE_ARRIVAL_DATE, i == selected ? TC_WHITE : TC_BLACK); + } } } else { /* Draw a departure time. */ if (arr_dep[i / 2].departure != Ticks::INVALID_TICKS) { - SetDParam(1, TimerGameCalendar::date + (arr_dep[i / 2].departure + offset) / Ticks::DAY_TICKS); - DrawString(tr.left, tr.right, tr.top, STR_TIMETABLE_DEPARTURE, i == selected ? TC_WHITE : TC_BLACK); + if (_settings_client.gui.timetable_mode == TimetableMode::Seconds) { + /* Display seconds from now. */ + SetDParam(1, ((arr_dep[i / 2].departure + offset) / Ticks::TICKS_PER_SECOND)); + DrawString(tr.left, tr.right, tr.top, STR_TIMETABLE_DEPARTURE_SECONDS_IN_FUTURE, i == selected ? TC_WHITE : TC_BLACK); + } else { + /* Show a date. */ + SetDParam(1, TimerGameCalendar::date + (arr_dep[i / 2].departure + offset) / Ticks::DAY_TICKS); + DrawString(tr.left, tr.right, tr.top, STR_TIMETABLE_DEPARTURE_DATE, i == selected ? TC_WHITE : TC_BLACK); + } } } tr.top += GetCharacterHeight(FS_NORMAL); @@ -490,19 +563,28 @@ struct TimetableWindow : Window { } tr.top += GetCharacterHeight(FS_NORMAL); + /* Draw the lateness display, or indicate that the timetable has not started yet. */ if (v->timetable_start != 0) { /* We are running towards the first station so we can start the * timetable at the given time. */ - SetDParam(0, STR_JUST_DATE_TINY); - SetDParam(1, GetDateFromStartTick(v->timetable_start)); - DrawString(tr, STR_TIMETABLE_STATUS_START_AT); + if (_settings_client.gui.timetable_mode == TimetableMode::Seconds) { + /* Real time units use seconds relative to now. */ + SetDParam(0, (static_cast(v->timetable_start - TimerGameTick::counter) / Ticks::TICKS_PER_SECOND)); + DrawString(tr, STR_TIMETABLE_STATUS_START_IN_SECONDS); + } else { + /* Calendar units use dates. */ + SetDParam(0, STR_JUST_DATE_TINY); + SetDParam(1, GetDateFromStartTick(v->timetable_start)); + DrawString(tr, STR_TIMETABLE_STATUS_START_AT_DATE); + } } else if (!HasBit(v->vehicle_flags, VF_TIMETABLE_STARTED)) { - /* We aren't running on a timetable yet, so how can we be "on time" - * when we aren't even "on service"/"on duty"? */ + /* We aren't running on a timetable yet. */ DrawString(tr, STR_TIMETABLE_STATUS_NOT_STARTED); - } else if (v->lateness_counter == 0 || (!_settings_client.gui.timetable_in_ticks && v->lateness_counter / Ticks::DAY_TICKS == 0)) { + } else if (!VehicleIsAboveLatenessThreshold(v, false)) { + /* We are on time. */ DrawString(tr, STR_TIMETABLE_STATUS_ON_TIME); } else { + /* We are late. */ SetTimetableParams(0, 1, abs(v->lateness_counter)); DrawString(tr, v->lateness_counter < 0 ? STR_TIMETABLE_STATUS_EARLY : STR_TIMETABLE_STATUS_LATE); } @@ -556,7 +638,13 @@ struct TimetableWindow : Window { } case WID_VT_START_DATE: // Change the date that the timetable starts. - ShowSetDateWindow(this, v->index, TimerGameCalendar::date, TimerGameCalendar::year, TimerGameCalendar::year + MAX_TIMETABLE_START_YEARS, ChangeTimetableStartCallback, reinterpret_cast(static_cast(_ctrl_pressed))); + if (_settings_client.gui.timetable_mode == TimetableMode::Seconds) { + this->query_widget = WID_VT_START_DATE; + this->change_timetable_all = _ctrl_pressed; + ShowQueryString(STR_EMPTY, STR_TIMETABLE_START_SECONDS_QUERY, 6, this, CS_NUMERAL, QSF_ACCEPT_UNCHANGED); + } else { + ShowSetDateWindow(this, v->index, TimerGameCalendar::date, TimerGameCalendar::year, TimerGameCalendar::year + MAX_TIMETABLE_START_YEARS, ChangeTimetableStartCallback, reinterpret_cast(static_cast(_ctrl_pressed))); + } break; case WID_VT_CHANGE_TIME: { // "Wait For" button. @@ -571,7 +659,7 @@ struct TimetableWindow : Window { if (order != nullptr) { uint time = (selected % 2 != 0) ? order->GetTravelTime() : order->GetWaitTime(); - if (!_settings_client.gui.timetable_in_ticks) time /= Ticks::DAY_TICKS; + time /= TicksPerTimetableUnit(); if (time != 0) { SetDParam(0, time); @@ -667,7 +755,7 @@ struct TimetableWindow : Window { } case WID_VT_CHANGE_TIME: - if (!_settings_client.gui.timetable_in_ticks) val *= Ticks::DAY_TICKS; + val *= TicksPerTimetableUnit(); if (this->change_timetable_all) { Command::Post(STR_ERROR_CAN_T_TIMETABLE_VEHICLE, v->index, mtf, ClampTo(val)); @@ -676,6 +764,12 @@ struct TimetableWindow : Window { } break; + case WID_VT_START_DATE: { + TimerGameTick::TickCounter start_tick = TimerGameTick::counter + (val * Ticks::TICKS_PER_SECOND); + Command::Post(STR_ERROR_CAN_T_TIMETABLE_VEHICLE, v->index, this->change_timetable_all, start_tick); + break; + } + default: NOT_REACHED(); } @@ -695,6 +789,15 @@ struct TimetableWindow : Window { this->GetWidget(WID_VT_ARRIVAL_DEPARTURE_SELECTION)->SetDisplayedPlane(_settings_client.gui.timetable_arrival_departure ? 0 : SZSP_NONE); this->GetWidget(WID_VT_EXPECTED_SELECTION)->SetDisplayedPlane(_settings_client.gui.timetable_arrival_departure ? 0 : 1); } + + /** + * In real-time mode, the timetable GUI shows relative times and needs to be redrawn every second. + */ + IntervalTimer redraw_interval = {Ticks::TICKS_PER_SECOND, [this](auto) { + if (_settings_client.gui.timetable_mode == TimetableMode::Seconds) { + this->SetDirty(); + } + }}; }; static const NWidgetPart _nested_timetable_widgets[] = { @@ -725,7 +828,7 @@ static const NWidgetPart _nested_timetable_widgets[] = { NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_VT_CLEAR_SPEED), SetResize(1, 0), SetFill(1, 1), SetDataTip(STR_TIMETABLE_CLEAR_SPEED, STR_TIMETABLE_CLEAR_SPEED_TOOLTIP), EndContainer(), NWidget(NWID_VERTICAL, NC_EQUALSIZE), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_VT_START_DATE), SetResize(1, 0), SetFill(1, 1), SetDataTip(STR_TIMETABLE_STARTING_DATE, STR_TIMETABLE_STARTING_DATE_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_VT_START_DATE), SetResize(1, 0), SetFill(1, 1), SetDataTip(STR_TIMETABLE_START, STR_TIMETABLE_START_TOOLTIP), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_VT_RESET_LATENESS), SetResize(1, 0), SetFill(1, 1), SetDataTip(STR_TIMETABLE_RESET_LATENESS, STR_TIMETABLE_RESET_LATENESS_TOOLTIP), EndContainer(), NWidget(NWID_VERTICAL, NC_EQUALSIZE), From 162ffc288dcce57fa45b3d3e03c86777cec25070 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 11 Dec 2023 12:26:22 +0000 Subject: [PATCH 065/105] Fix e2425b7: WidgetDimensions and depot sizes not set up if blitter forced. Set up WidgetDimensions and depot sizes during InitWindowSystem(). --- src/window.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/window.cpp b/src/window.cpp index db284ffadf..31e9f7fccf 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -1807,9 +1807,12 @@ void InitWindowSystem() _scrolling_viewport = false; _mouse_hovering = false; + SetupWidgetDimensions(); NWidgetLeaf::InvalidateDimensionCache(); // Reset cached sizes of several widgets. NWidgetScrollbar::InvalidateDimensionCache(); + InitDepotWindowBlockSizes(); + ShowFirstError(); } From dc27f1649acf6e9a30144f70d17971779211032e Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 11 Dec 2023 12:30:20 +0000 Subject: [PATCH 066/105] Fix e2425b7: Sprites no longer refreshed if max zoom level changed. Handle this via AdjustGUIZoom() instead. --- src/gfx.cpp | 2 +- src/settings_table.cpp | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/gfx.cpp b/src/gfx.cpp index 56a669dce9..9275a44137 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -1980,7 +1980,7 @@ bool AdjustGUIZoom(bool automatic) ZoomLevel old_font_zoom = _font_zoom; int old_scale = _gui_scale; UpdateGUIZoom(); - if (old_scale == _gui_scale) return false; + if (old_scale == _gui_scale && old_gui_zoom == _gui_zoom) return false; /* Reload sprites if sprite zoom level has changed. */ if (old_gui_zoom != _gui_zoom) { diff --git a/src/settings_table.cpp b/src/settings_table.cpp index 2f3c3d8cd2..e6b95f6890 100644 --- a/src/settings_table.cpp +++ b/src/settings_table.cpp @@ -265,11 +265,7 @@ static void ZoomMinMaxChanged(int32_t) { ConstrainAllViewportsZoom(); GfxClearSpriteCache(); - if (_settings_client.gui.zoom_min > _gui_zoom) { - /* Restrict GUI zoom if it is no longer available. */ - _gui_zoom = _settings_client.gui.zoom_min; - UpdateCursorSize(); - LoadStringWidthTable(); + if (AdjustGUIZoom(false)) { ReInitAllWindows(true); } } From b62fafc5d4f36d68733603ef2c9ec5f965202ce1 Mon Sep 17 00:00:00 2001 From: translators Date: Mon, 11 Dec 2023 18:39:36 +0000 Subject: [PATCH 067/105] Update: Translations from eints english (au): 1 change by krysclarke italian: 1 change by Rivarossi german: 7 changes by SecretIdetity russian: 1 change by Ln-Wolf danish: 1 change by bscargo french: 1 change by glx22 --- src/lang/afrikaans.txt | 12 +++--------- src/lang/arabic_egypt.txt | 11 +++-------- src/lang/basque.txt | 11 +++-------- src/lang/belarusian.txt | 12 +++--------- src/lang/brazilian_portuguese.txt | 14 +++----------- src/lang/bulgarian.txt | 12 +++--------- src/lang/catalan.txt | 14 +++----------- src/lang/chuvash.txt | 3 +++ src/lang/croatian.txt | 12 +++--------- src/lang/czech.txt | 13 +++---------- src/lang/danish.txt | 16 ++++------------ src/lang/dutch.txt | 14 +++----------- src/lang/english_AU.txt | 16 ++++------------ src/lang/english_US.txt | 14 +++----------- src/lang/esperanto.txt | 13 +++---------- src/lang/estonian.txt | 12 +++--------- src/lang/faroese.txt | 8 +++----- src/lang/finnish.txt | 14 +++----------- src/lang/french.txt | 16 ++++------------ src/lang/frisian.txt | 10 +++------- src/lang/gaelic.txt | 12 +++--------- src/lang/galician.txt | 14 +++----------- src/lang/german.txt | 24 ++++++++++-------------- src/lang/greek.txt | 12 +++--------- src/lang/hebrew.txt | 12 +++--------- src/lang/hindi.txt | 4 +++- src/lang/hungarian.txt | 14 +++----------- src/lang/icelandic.txt | 11 +++-------- src/lang/ido.txt | 3 +++ src/lang/indonesian.txt | 14 +++----------- src/lang/irish.txt | 12 +++--------- src/lang/italian.txt | 16 ++++------------ src/lang/japanese.txt | 12 +++--------- src/lang/korean.txt | 14 +++----------- src/lang/latin.txt | 14 +++----------- src/lang/latvian.txt | 12 +++--------- src/lang/lithuanian.txt | 18 +++--------------- src/lang/luxembourgish.txt | 12 +++--------- src/lang/macedonian.txt | 5 +++-- src/lang/malay.txt | 10 +++------- src/lang/maltese.txt | 3 +++ src/lang/marathi.txt | 4 +++- src/lang/norwegian_bokmal.txt | 12 +++--------- src/lang/norwegian_nynorsk.txt | 11 +++-------- src/lang/persian.txt | 6 +++--- src/lang/polish.txt | 14 +++----------- src/lang/portuguese.txt | 14 +++----------- src/lang/romanian.txt | 14 +++----------- src/lang/russian.txt | 16 ++++------------ src/lang/serbian.txt | 12 +++--------- src/lang/simplified_chinese.txt | 14 +++----------- src/lang/slovak.txt | 14 +++----------- src/lang/slovenian.txt | 12 +++--------- src/lang/spanish.txt | 12 +++--------- src/lang/spanish_MX.txt | 12 +++--------- src/lang/swedish.txt | 14 +++----------- src/lang/tamil.txt | 11 +++-------- src/lang/thai.txt | 12 +++--------- src/lang/traditional_chinese.txt | 14 +++----------- src/lang/turkish.txt | 14 +++----------- src/lang/ukrainian.txt | 12 +++--------- src/lang/urdu.txt | 6 +++--- src/lang/vietnamese.txt | 14 +++----------- src/lang/welsh.txt | 12 +++--------- 64 files changed, 204 insertions(+), 567 deletions(-) diff --git a/src/lang/afrikaans.txt b/src/lang/afrikaans.txt index cce78a8e5d..e73af9446d 100644 --- a/src/lang/afrikaans.txt +++ b/src/lang/afrikaans.txt @@ -228,6 +228,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filter string: STR_LIST_FILTER_OSKTITLE :{BLACK}Sleutel filter string in @@ -678,8 +679,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Klik op STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Klik op musiek lied om te verwyder van huidige program (Slegs Gewoonte1 of Gewoonte2) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Top maatskappye wat {NUM} bereik het -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Maatskappy Liga Tafel in {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Sakeman STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Entrepreneur @@ -1502,8 +1501,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Aktiveer die ge STR_CONFIG_SETTING_LOADING_INDICATORS :Gebruik laai aanwysers: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Kies of die ladingswaardes vertoon word wanneer voertuie vrag op- en aflaai -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Vertoon rooster in "ticks" liewer as dae: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Wys die rystye in tydroosters in speletjie "ticks" inplaas van dae +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Toon aankoms en vertrek in tydroosters: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Vertoon verwagte aankoms en vertrek tye in tydroosters @@ -4135,8 +4133,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(wag vir {STRIN STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(reis vir {STRING}, nie volgens tydrooster nie) STR_TIMETABLE_STAY_FOR :en bly vir {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :en reis vir {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}da{P g e} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}tik{P "" ke} STR_TIMETABLE_TOTAL_TIME :{BLACK}Die rooster sal {STRING} neem om te voltooi STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Die rooster sal te minste {STRING} vat om te voltooi (nie alles gerooster nie) @@ -4145,10 +4141,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Die voer STR_TIMETABLE_STATUS_LATE :{BLACK}Die voertuig loop tans {STRING} laat STR_TIMETABLE_STATUS_EARLY :{BLACK}Die voertuig loop tans {STRING} vroeg STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Hierdie rooster het nog nie begin nie -STR_TIMETABLE_STATUS_START_AT :{BLACK}Hierdie tydrooster sal begin by {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Begin datum -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Kies 'n datum as 'n beginpunt vir hierdie rooster. Ctrl+klik stel die begindatum van hierdie rooster en versprei al die voertuie wat hierdie rooster deel eweredig vir 'n volledige rooster. + STR_TIMETABLE_CHANGE_TIME :{BLACK}Verander Tyd STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Verander die bedrag van tyd die verlig opdrag moes vat diff --git a/src/lang/arabic_egypt.txt b/src/lang/arabic_egypt.txt index f3ba25e5a2..c6bb6d2ffa 100644 --- a/src/lang/arabic_egypt.txt +++ b/src/lang/arabic_egypt.txt @@ -228,6 +228,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}م STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP} متر + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}تصفية القائمة: STR_LIST_FILTER_OSKTITLE :{BLACK} ادخل فلتر @@ -674,8 +675,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}اضغط STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}اضغط على المسار لازالته من القائمة # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}الشركات الكبرى التي وصلت لـ {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}ترتيب الشركات {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :رجل اعمال STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :مغامر @@ -1407,7 +1406,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS :استخدام STR_CONFIG_SETTING_LOADING_INDICATORS :تفعيل مؤشر التحميل: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :حدد ما إذا كانت مؤشرات التحميل معروضة فوق تحميل المركبات أو تفريغها -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :عرض جدولة الأعمال بالمهام بدلا من الأيام: {STRING} +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :عرض الوصول و المغادرة في جدولة الاعمال: {STRING} @@ -3864,8 +3863,6 @@ STR_TIMETABLE_TRAVEL_FOR_SPEED_ESTIMATED :سافر (إل STR_TIMETABLE_STAY_FOR_ESTIMATED :(البقاء ل{STRING}، ليس مجدول) STR_TIMETABLE_STAY_FOR :ويبقى لـ {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :ويسافر لـ {STRING} -STR_TIMETABLE_DAYS :{COMMA}يوم -STR_TIMETABLE_TICKS :{COMMA} علامة STR_TIMETABLE_TOTAL_TIME :{BLACK}جدولة الاوامر هذه ستأخذ {STRING} لنهاية STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}جدولة الاوامر هذه ستأخذ على الاقل {STRING} لتكتمل (لايشمل كل الجدولة) @@ -3874,10 +3871,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}هذه STR_TIMETABLE_STATUS_LATE :{BLACK}هذه العربه {STRING} مُتاخِرة حاليا عن الجدوله STR_TIMETABLE_STATUS_EARLY :{BLACK}هذه العربه {STRING} مُتَقَدِمه عن الجدوله STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}جدولة الاعمال لم تبدأ بعد -STR_TIMETABLE_STATUS_START_AT :{BLACK}جدولة الاعمال ستبدأ فى {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}تاريخ البدأ -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}حدد تاريخًا كنقطة بداية لهذا الجدول الزمني. Ctrl + Click يوزع جميع المركبات التي تشارك هذا الطلب بالتساوي من التاريخ المحدد بناءً على ترتيبها النسبي ، إذا كان الطلب محددًا بجدول زمني كامل + STR_TIMETABLE_CHANGE_TIME :{BLACK}غير الوقت STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}غير مقدار الزمن الذي يستغرقه هذا الامر diff --git a/src/lang/basque.txt b/src/lang/basque.txt index 998d533fe3..8b22e53b74 100644 --- a/src/lang/basque.txt +++ b/src/lang/basque.txt @@ -226,6 +226,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Lokarri iragazkia: STR_LIST_FILTER_OSKTITLE :{BLACK}Sartu lokarri iragazkia @@ -660,8 +661,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Musika k STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Musika kantan clik egin uneko programatik ezabatzeko (Perstonala1 edo Pertsonala2 bakarrik) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Top companiak {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Konpainien Ligaren Tabla {NUM}-tan STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Negozio gizona STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Empresaria @@ -1445,8 +1444,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Gaitu ibilgailu STR_CONFIG_SETTING_LOADING_INDICATORS :Zama adierazleak erabili: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Aukeratu ibilgailuen zama lanen adierazlea ikusgai dagoen ibilgailuen gainean -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Ordutegiak tick-etan erakutsi egunetan erakutsi ordez: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Erakutsi denbora tauletako denbora jokoaren uniteetan egunak erabili ordez +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Iritsierak eta irteerak ordutegietan erakutsi: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Erakutsi aurreikusitako iritsiera eta irteera denborak denbora tauletan @@ -3894,8 +3892,6 @@ STR_TIMETABLE_TRAVEL_FOR :{STRING} bidaia STR_TIMETABLE_TRAVEL_FOR_SPEED :{STRING}-ra bidaiatu gehienez {VELOCITY}ra STR_TIMETABLE_STAY_FOR :{STRING} gelditu STR_TIMETABLE_AND_TRAVEL_FOR :{STRING} bidaiatu -STR_TIMETABLE_DAYS :{COMMA}{NBSP}egun{P "" ak} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}tick{P "" ak} STR_TIMETABLE_TOTAL_TIME :{BLACK}Ordutegi honek {STRING} beharko du betetzeko STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Ordutegi honek gutxienez {STRING} beharko du (ez ordutegi guztiak) @@ -3904,9 +3900,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Ibilgail STR_TIMETABLE_STATUS_LATE :{BLACK}Ibilgailu hau {STRING} berandu dabil STR_TIMETABLE_STATUS_EARLY :{BLACK}Ibilgailu hau {STRING} aurreratua dabil STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Ordutegia ez da hasi -STR_TIMETABLE_STATUS_START_AT :{BLACK} {STRING} hasiko da ordutegia -STR_TIMETABLE_STARTING_DATE :{BLACK}Hasiera data + STR_TIMETABLE_CHANGE_TIME :{BLACK}Denbora aldatu STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Piztutako agindua betzeko denbora aldatu diff --git a/src/lang/belarusian.txt b/src/lang/belarusian.txt index 2b9c774d93..740fedb542 100644 --- a/src/lang/belarusian.txt +++ b/src/lang/belarusian.txt @@ -539,6 +539,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}м STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}м + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Фільтар: STR_LIST_FILTER_OSKTITLE :{BLACK}Увядзіце радок фільтра @@ -987,8 +988,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Клік STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Клікніце па назьве трэка, каб выдаліць яго з уласнай праґрамы # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Найбуйнейшыя кампаніі, якія дасягнулі {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Табліца кампаніяў у {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Бізнэсоўца STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Прадпрымальнік @@ -1821,8 +1820,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Дазволі STR_CONFIG_SETTING_LOADING_INDICATORS :Паказваць індыкатар загрузкі: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Выбраць, ці будуць паказвацца індыкатары загрузкі над транспартам, які грузіцца ці разгружаецца. -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Паказваць расклад ў «ціках» замест дзён: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Паказваць у раскладзе час падарожжа ў гульнёвых "ціках" замест дзён. +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Паказваць у раскладах час прыбыцьця й адпраўленьня: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Паказваць верагодны час прыбыцьця й адпраўленьня ў раскладах. @@ -4497,8 +4495,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(чакаць { STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(у дарозе {STRING}, графік не складзены) STR_TIMETABLE_STAY_FOR :і чакаць {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :і рухацца да {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}д{P зень нi зён} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}цiк{P "" i аў} STR_TIMETABLE_TOTAL_TIME :{BLACK}Увесь маршрут зойме {STRING} STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Рух па маршруце зойме {STRING} (ня ўсё ўлічана) @@ -4507,10 +4503,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Гэты STR_TIMETABLE_STATUS_LATE :{BLACK}Гэты транспарт спазьняецца на {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}Гэты транспарт апярэджвае ґрафік на {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Ґрафік руху яшчэ не ўсталяваны -STR_TIMETABLE_STATUS_START_AT :{BLACK}Адлік часу пачнецца з {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Пачатковая дата -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Выберыце пачатковую дату для гэтага ґрафіка. Ctrl+пстрычка ўсталюе пачатковую дату і раўнамерна разьмяркуе ўсе транспартныя сродкі, якія рухаюцца па гэтым маршруце, калі час руху па ім цалкам разьлічаны. + STR_TIMETABLE_CHANGE_TIME :{BLACK}Зьмяніць час STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Зьмяніць час для вылучанага заданьня diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index f915230a2c..0bbd6e809d 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -256,6 +256,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtro: STR_LIST_FILTER_OSKTITLE :{BLACK}Insira uma ou mais palavras-chave para filtrar a lista @@ -719,8 +720,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Clique n STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Clique na faixa de música para remover do programa atual (apenas Personalizado 1 ou Personalizado 2) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}As maiores empresas que alcançaram{NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Tabela da Liga das Empresas em {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Empresário STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Empreendedor @@ -1657,8 +1656,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Ativa o uso da STR_CONFIG_SETTING_LOADING_INDICATORS :Usar indicadores de carga: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Seleciona se os indicadores de carga são exibidos sobre os veículos (des)carregando -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Exibir plano de horário em tiques ao invés de dias: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Mostra tempos de viagem, nos planos de horário, em tiques, ao invés de dias. Um tique equivale a 1/74 dia, ou 1/30 segundo. +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Mostrar chegada e saída nos planos de horário: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Exibe tempos de chegada e partida anticipados nos planos de horário @@ -4567,8 +4565,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(aguardar por { STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(viajar para {STRING}, sem horário marcado) STR_TIMETABLE_STAY_FOR :e ficar durante {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :e viajar por {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}dia{P "" s} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}tique{P "" s} STR_TIMETABLE_TOTAL_TIME :{BLACK}Este horário levará {STRING} para completar STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Este horário levará no mínimo {STRING} para completar (nem todos com horário marcado) @@ -4577,10 +4573,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Este ve STR_TIMETABLE_STATUS_LATE :{BLACK}Este veículo está atualmente circulando {STRING} atrasado STR_TIMETABLE_STATUS_EARLY :{BLACK}Este veículo está atualmente circulando {STRING} adiantado STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Este horário ainda não começou -STR_TIMETABLE_STATUS_START_AT :{BLACK}Este horário começará em{STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Data de início -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Seleciona uma data como ponto de partida para esse horário. Ctrl+Clique define o ponto de partida desse horário e distribui todos os veículos que compartilham essa ordem igualmente, baseados na sua ordem relativa, mesmo que a ordem esteja totalmente tabelada + STR_TIMETABLE_CHANGE_TIME :{BLACK}Mudar horário STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Mudar a duração do tempo que a ordem em destaque deve durar. Ctrl+Clique define o tempo para todas as ordens @@ -4604,8 +4598,6 @@ STR_TIMETABLE_EXPECTED :{BLACK}Esperado STR_TIMETABLE_SCHEDULED :{BLACK}Agendado STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Trocar entre esperado e agendado -STR_TIMETABLE_ARRIVAL :C: {COLOUR}{DATE_TINY} -STR_TIMETABLE_DEPARTURE :P: {COLOUR}{DATE_TINY} # Date window (for timetable) diff --git a/src/lang/bulgarian.txt b/src/lang/bulgarian.txt index bbd2c1ba98..d92af42511 100644 --- a/src/lang/bulgarian.txt +++ b/src/lang/bulgarian.txt @@ -228,6 +228,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}м STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}м + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Филтриращ низ: STR_LIST_FILTER_OSKTITLE :{BLACK}Въведете филтър @@ -666,8 +667,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Нати STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Натиснете върху парче за да го премахнете от програмата (Custom1 и Custom2 само) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Първите компании достигнали {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Таблица Лига на компании в {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Бизнесмен STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Предприемач @@ -1468,8 +1467,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Разреша STR_CONFIG_SETTING_LOADING_INDICATORS :Товарни индикатори: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Изберете дали индикаторът за зареждане се показва над превозните средства, които товарят и разтоварват -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Разписанието в цикли вместо дни: {STRING.n} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Показва времената за придвижване в таблиците в игрови единици, вместо в дни +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Покажи пристигането и заминаването в расписанията: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Показвай очакваните времена за пристигане и заминаване в таблиците @@ -3971,8 +3969,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(престой STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(Пътувай към {STRING}, без разписание) STR_TIMETABLE_STAY_FOR :и остани за {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :и отпътувай към {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}ден{P "" а} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}щракане{P "" та} STR_TIMETABLE_TOTAL_TIME :{BLACK}Ще трябва {STRING} за това разписание да бъде приключено STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Това разписание ще вземе най-малко {STRING} за да приклучи (не всичко е планирано) @@ -3981,10 +3977,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Това STR_TIMETABLE_STATUS_LATE :{BLACK}Това превозно средство е в момента с {STRING} закъснение STR_TIMETABLE_STATUS_EARLY :{BLACK}Това превозно средство е в момента с {STRING} по-рано STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Това разписание още не е започнало -STR_TIMETABLE_STATUS_START_AT :{BLACK}Това разписание ще започне на {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Дата на започване -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK} Изберете начална дата на това разписание. Ctrl + Click задава началната дата и равномерно разпределя всички превозни средства, които споделят тази поръчка, на базата на тяхната относителна поръчка, ако поръчката е изцяло по разписание + STR_TIMETABLE_CHANGE_TIME :{BLACK}Промени времето STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Промени времетраенето на маркираната заповед diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index 959bfa89af..545bff89ab 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -256,6 +256,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{G=Masculin}{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtre: STR_LIST_FILTER_OSKTITLE :{BLACK}Introduïu una o més paraules per a filtrar la llista de @@ -719,8 +720,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Clica la STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Clica la pista de música per treure-la de la llista actual (només en llistes personalitzables) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Principals companyies que han arribat al {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Taula de la lliga de companyies a {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Empresari STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Emprenedor @@ -1657,8 +1656,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Activa la utili STR_CONFIG_SETTING_LOADING_INDICATORS :Utilitza indicadors de càrrega: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Selecciona si els indicadors de càrrega seran mostrats sobre els vehicles en càrrega o descàrrega -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Mostra horaris amb marques en lloc de dies: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Mostra els temps de viatge als horaris en marques en lloc de dies +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Mostra l'arribada i la sortida als horaris: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Mostra als horaris l'arribada anticipadament i les hores de sortida @@ -4567,8 +4565,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(quedar-s'hi du STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(viatja durant {STRING}, sense horari) STR_TIMETABLE_STAY_FOR :i estigues {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :i viatge per {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}di{P a es} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}mar{P ca ques} STR_TIMETABLE_TOTAL_TIME :{BLACK}L'horari tardarà {STRING} a complir-se STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}L'horari tardarà almenys {STRING} a complir-se (no tot està planificat) @@ -4577,10 +4573,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Actualme STR_TIMETABLE_STATUS_LATE :{BLACK}Actualment aquest vehicle va {STRING} tard STR_TIMETABLE_STATUS_EARLY :{BLACK}Actualment aquest vehicle va {STRING} d'hora STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Aquest horari encara no ha començat -STR_TIMETABLE_STATUS_START_AT :{BLACK}Aquest horari començarpa a {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Data de partida -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Seleccioneu una data com a punt de partida d'aquest horari. Amb Ctrl+Clic, distribueix els vehicles que comparteixen aquesta ruta a partir de la data establerta i la seva ordre relativa, sempre que la ruta tingui l'horari complet. + STR_TIMETABLE_CHANGE_TIME :{BLACK}Canvia Temps STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Canvia el emps que l'ordre marcada hauria de prendre. Amb Ctrl+clic estableix el temps per a totes les ordres. @@ -4604,8 +4598,6 @@ STR_TIMETABLE_EXPECTED :{BLACK}Esperat STR_TIMETABLE_SCHEDULED :{BLACK}Planificat STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Canvia entre esperat i planificat -STR_TIMETABLE_ARRIVAL :A: {COLOUR}{DATE_TINY} -STR_TIMETABLE_DEPARTURE :S: {COLOUR}{DATE_TINY} # Date window (for timetable) diff --git a/src/lang/chuvash.txt b/src/lang/chuvash.txt index 3d107a16da..6447e31e9f 100644 --- a/src/lang/chuvash.txt +++ b/src/lang/chuvash.txt @@ -167,6 +167,7 @@ STR_UNITS_POWER_SI :{DECIMAL}кВт + # Common window strings @@ -715,6 +716,7 @@ STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_ISO :ISO (2008-12-31 +###length 3 @@ -1571,6 +1573,7 @@ STR_ORDER_GO_TO_STATION :{STRING} {STATI + # Date window (for timetable) diff --git a/src/lang/croatian.txt b/src/lang/croatian.txt index 4db0d4b144..e21092b4aa 100644 --- a/src/lang/croatian.txt +++ b/src/lang/croatian.txt @@ -323,6 +323,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtriraj niz: STR_LIST_FILTER_OSKTITLE :{BLACK}Unesi znak za filter @@ -776,8 +777,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Klikni n STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Klikni na glazbenu traku kako bi ju uklonio iz trenutnog programa (samo Proizvoljno 1 ili Proizvoljno 2) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Najbolje tvrtke do {NUM}. godine -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Tablica tvrtki u {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Privrednik STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Poduzetnik @@ -1613,8 +1612,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Uključi koriš STR_CONFIG_SETTING_LOADING_INDICATORS :Koristi pokazatelje ukrcaja: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Odaberi hoće li oznake za ukrcaj biti prikazane iznad vozila koja se ukrcavaju ili iskrcavaju -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Pokaži vozni red u otkucajima rađe nego u danima: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Prikaži trajanje putovanja u voznim redovima u otkucajima igre umjesto u danima +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Pokaži dolaske i odlaske u voznim redovima: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Prikaži predviđena vremena dolaska i odlaska u voznim redovima @@ -4321,8 +4319,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(stajanje za {S STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(putovanje za {STRING}, nije mjereno) STR_TIMETABLE_STAY_FOR :i boravak za {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :i putovanje za {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}dan{P "" a a} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}otkucaj{P "" a a} STR_TIMETABLE_TOTAL_TIME :{BLACK}Ovaj vozni red trebat će {STRING} za završetak STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Ovaj vozni red trebat će najmanje {STRING} za završetak (nije sve raspoređeno) @@ -4331,10 +4327,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Ovo vozi STR_TIMETABLE_STATUS_LATE :{BLACK}Ovo vozilo trenutno {STRING} kasni STR_TIMETABLE_STATUS_EARLY :{BLACK}Ovo vozilo trenutno stiže {STRING} ranije STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Ovaj vozni red još nije započeo -STR_TIMETABLE_STATUS_START_AT :{BLACK}Ovaj će vozni red početi u {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Početni datum -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Odaberi datum za početak ovog voznog reda. Ctrl+Klik odabire početnu točku ovog voznog reda i ravnomjerno raspodjeljuje sva vozila koja dijele ovu naredbu prema njihovoj relativnoj naredbi, ako je raspored naredbe potpuno određen + STR_TIMETABLE_CHANGE_TIME :{BLACK}Promijeni vrijeme STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Promijeni količinu vremena koju bi označena naredba trebala uzeti diff --git a/src/lang/czech.txt b/src/lang/czech.txt index 3d757a6f5a..24dd12f1fd 100644 --- a/src/lang/czech.txt +++ b/src/lang/czech.txt @@ -316,6 +316,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtrovat řetězec: STR_LIST_FILTER_OSKTITLE :{BLACK}Vložte jedno nebo více klíčových slov pro filtr seznamu @@ -789,8 +790,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Skladba STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Hudební stopu odstraníš ze současného programu (pouze u vlastního) kliknutím na ni # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Nejlepší společnosti, které dosáhly {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Tabulka společností v roce {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Obchodník STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Manažer @@ -1705,8 +1704,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Umožňuje pou STR_CONFIG_SETTING_LOADING_INDICATORS :Používat ukazatele naložení: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Vyber jestli budou zobrazovány ukazatele naložení nad nakládajícími a vykládajícími vozidly. -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Zobrazit jízdní řády v cyklech místo ve dnech: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Ukazuje cestovní časy v jízdních řádech +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Ukazovat v jízdním řádu příjezdy a odjezdy: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Zobrazit předpokládané časy příjezdu a odjezdu v jízdních řádech. @@ -4597,8 +4595,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(zůstaň {STRI STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(jet {STRING}, mimo jízdní řád) STR_TIMETABLE_STAY_FOR :a zůstat {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :a jet {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}d{P en ny ní} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}cykl{P us y ů} STR_TIMETABLE_TOTAL_TIME :{BLACK}Tento jízdní řád bude trvat {STRING} STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Tento jízdní řád bude trvat nejméně {STRING} (vozidla mimo jízdní řád) @@ -4607,10 +4603,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Vozidlo STR_TIMETABLE_STATUS_LATE :{BLACK}Vozidlo má {STRING} zpoždění STR_TIMETABLE_STATUS_EARLY :{BLACK}Vozidlo jede {STRING} napřed STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Tento jízdní řád ještě nezačal -STR_TIMETABLE_STATUS_START_AT :{BLACK}Tento jízdní řád začne v {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Datum začátku -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Vyber počáteční datum tohoto jízdního řádu. Ctrl+Klik rovnoměrně rozloží odjezdy jednotlivých vozidel sdílejích příkazy s ohledem na současný jízdní řád. + STR_TIMETABLE_CHANGE_TIME :{BLACK}Změnit čas STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Změnit čas pro splnění jízdního příkazu. Ctrl+klik změní čas pro všechny příkazy. @@ -4634,7 +4628,6 @@ STR_TIMETABLE_EXPECTED :{BLACK}Očekáv STR_TIMETABLE_SCHEDULED :{BLACK}Plánovaný STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Přepnout mezi očekávaným a plánovaným -STR_TIMETABLE_ARRIVAL :P: {COLOUR}{DATE_TINY} # Date window (for timetable) diff --git a/src/lang/danish.txt b/src/lang/danish.txt index 0803a47bd0..4aae73298c 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -255,6 +255,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL} fod STR_UNITS_HEIGHT_METRIC :{DECIMAL} m STR_UNITS_HEIGHT_SI :{DECIMAL} m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtrer udtryk: STR_LIST_FILTER_OSKTITLE :{BLACK}Indtast filterstreng @@ -718,8 +719,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Klik på STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Klik på et musiknummer for at fjerne det fra programlisten (kun for Custom1/Custom2) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Bedste virksomheder, som har nået {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Selskabsoversigt i {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Forretningsmand STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Entreprenør @@ -1656,8 +1655,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Aktiver brug af STR_CONFIG_SETTING_LOADING_INDICATORS :Benyt laste-indikatorer: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Vælg om lastnings-indikatorer vises ved pålæsning og aflæsning af køretøjer -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Vis køreplan i tik i stedet for dage: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Vis rejsetider i køreplaner i spil ticks i stedet for dage +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Vis ankomst og afgang i tidsplaner: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Vis forventede ankomst-og afgangstider i tidsplaner @@ -2346,7 +2344,7 @@ STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}Navnet v STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Sæt kodeord STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Beskyt dit spil med et kodeord hvis du ikke vil have fremmede med -STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Synlighed +STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Synlighed: STR_NETWORK_START_SERVER_VISIBILITY_TOOLTIP :{BLACK}Hvorvidt andre kan se din server i den offentlige liste STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} klient{P "" er} STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Maksimalt antal tilladte klienter: @@ -4566,8 +4564,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(ophold for {ST STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(rejse for {STRING}, ikke skemalagt) STR_TIMETABLE_STAY_FOR :og vent i {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :og rejs i {STRING} -STR_TIMETABLE_DAYS :{COMMA} dag{P "" e} -STR_TIMETABLE_TICKS :{COMMA} tik STR_TIMETABLE_TOTAL_TIME :{BLACK}Denne køreplan vil tage {STRING} at fuldføre STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Denne køreplan vil tage mindst {STRING} at fuldføre (ikke alt indført i køreplan) @@ -4576,10 +4572,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Dette tr STR_TIMETABLE_STATUS_LATE :{BLACK}Dette transportmiddel er nu {STRING} forsinket STR_TIMETABLE_STATUS_EARLY :{BLACK}Dette transportmiddel er nu {STRING} foran køreplanen STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Denne tidsplan er endnu ikke begyndt. -STR_TIMETABLE_STATUS_START_AT :{BLACK}Denne tidsplan vil starte på {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Startdato -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Vælg en dato som starttidspunkt for denne køreplan. Ctrl+Klik sætter starttidspunkt for denne køreplan, og distribuerer alle køretøjer der deler denne ordre ligeligt baseret på deres relative rækkefølge, hvis ordren er fuldstændigt tidsplanlagt + STR_TIMETABLE_CHANGE_TIME :{BLACK}Ændre tid STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Ændre den tid, som den fremhævede rækkefølge skal tage. Ctrl+Click angiver tidspunktet for alle ordrer @@ -4603,8 +4597,6 @@ STR_TIMETABLE_EXPECTED :{BLACK}Forvente STR_TIMETABLE_SCHEDULED :{BLACK}Planlagt STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Skift mellem forventet og tidslagt -STR_TIMETABLE_ARRIVAL :A: {COLOUR}{DATE_TINY} -STR_TIMETABLE_DEPARTURE :D: {COLOUR}{DATE_TINY} # Date window (for timetable) diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index 03e69eff00..7ad0f7e9ed 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -255,6 +255,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filter: STR_LIST_FILTER_OSKTITLE :{BLACK}Voer een of meer woorden in waarop de lijst wordt gefilterd @@ -718,8 +719,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Klik op STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Klik op een nummer om dit uit het programma te verwijderen (alleen Aangepast1 en Aangepast2) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Best presterende bedrijven die {NUM} bereikt hebben -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Bedrijfsscoretabel in {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :ZZP'er STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Ondernemer @@ -1656,8 +1655,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Schakelt het ge STR_CONFIG_SETTING_LOADING_INDICATORS :Laadpercentages gebruiken: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Geef aan of laadindicatoren worden weergegeven boven ladende of lossende voertuigen -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Dienstregeling in tikken weergeven i.p.v. in dagen: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Reistijden in tijdtabellen in speltikken weergeven in plaats van dagen +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Aankomst- en vertrektijden in dienstregeling weergeven: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Geef de verwachte aankomst-en vertrektijden in de dienstregeling weer @@ -4566,8 +4564,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(wacht gedurend STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(reis gedurende {STRING}, geen dienstregeling) STR_TIMETABLE_STAY_FOR :en blijf gedurende {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :en rijd {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}dag{P "" en} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}tik{P "" ken} STR_TIMETABLE_TOTAL_TIME :{BLACK}Deze dienstregeling duurt {STRING} STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Deze dienstregeling duurt minstens {STRING} (niet alles ingeroosterd) @@ -4576,10 +4572,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Dit voer STR_TIMETABLE_STATUS_LATE :{BLACK}Dit voertuig heeft {STRING} vertraging STR_TIMETABLE_STATUS_EARLY :{BLACK}Dit voertuig is {STRING} te vroeg STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Deze dienstregeling is nog niet gestart -STR_TIMETABLE_STATUS_START_AT :{BLACK}Deze dienstregeling begint op {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Startdatum -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Selecteer een datum als startpunt voor deze dienstregeling. Ctrl+klik verdeelt alle voertuigen die deze orders delen gelijkmatig vanaf deze datum op basis van hun relatieve volgorde, als de order volledig is ingeroosterd + STR_TIMETABLE_CHANGE_TIME :{BLACK}Tijd wijzigen STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Verander de tijdsduur die de geselecteerde order mag duren. Met Ctrl+klik stel je de tijd voor alle orders in @@ -4603,8 +4597,6 @@ STR_TIMETABLE_EXPECTED :{BLACK}Verwacht STR_TIMETABLE_SCHEDULED :{BLACK}Volgens dienstregeling STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Wissel tussen verwacht en volgens dienstregeling -STR_TIMETABLE_ARRIVAL :A: {COLOUR}{DATE_TINY} -STR_TIMETABLE_DEPARTURE :D: {COLOUR}{DATE_TINY} # Date window (for timetable) diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index 926e760f72..871ce18296 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -255,6 +255,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filter: STR_LIST_FILTER_OSKTITLE :{BLACK}Enter one or more keywords to filter the list for @@ -718,8 +719,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Click on STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Click on music track to remove it from current programme (Custom1 or Custom2 only) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Top companies who reached {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Company League Table in {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Businessperson STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Entrepreneur @@ -1656,8 +1655,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Enable usage of STR_CONFIG_SETTING_LOADING_INDICATORS :Use loading indicators: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Select whether loading indicators are displayed above loading or unloading vehicles -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Show timetable in ticks rather than days: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Show travel times in time tables in game ticks instead of days +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Show arrival and departure in timetables: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Display anticipated arrival and departure times in timetables @@ -2346,7 +2344,7 @@ STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}The game STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Set password STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Protect your game with a password if you don't want it to be publicly accessible -STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Visibility +STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Visibility: STR_NETWORK_START_SERVER_VISIBILITY_TOOLTIP :{BLACK}Whether other people can see your server in the public listing STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} client{P "" s} STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Maximum number of clients: @@ -4566,8 +4564,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(stay for {STRI STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(travel for {STRING}, not timetabled) STR_TIMETABLE_STAY_FOR :and stay for {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :and travel for {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}day{P "" s} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}tick{P "" s} STR_TIMETABLE_TOTAL_TIME :{BLACK}This timetable will take {STRING} to complete STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}This timetable will take at least {STRING} to complete (not all timetabled) @@ -4576,10 +4572,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}This veh STR_TIMETABLE_STATUS_LATE :{BLACK}This vehicle is currently running {STRING} late STR_TIMETABLE_STATUS_EARLY :{BLACK}This vehicle is currently running {STRING} early STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}This timetable has not yet started -STR_TIMETABLE_STATUS_START_AT :{BLACK}This timetable will start at {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Start date -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Select a date as starting point of this timetable. Ctrl+Click distributes all vehicles sharing this order evenly from the given date based on their relative order, if the order is completely timetabled + STR_TIMETABLE_CHANGE_TIME :{BLACK}Change Time STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Change the amount of time that the highlighted order should take. Ctrl+Click sets the time for all orders @@ -4603,8 +4597,6 @@ STR_TIMETABLE_EXPECTED :{BLACK}Expected STR_TIMETABLE_SCHEDULED :{BLACK}Scheduled STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Switch between expected and scheduled -STR_TIMETABLE_ARRIVAL :A: {COLOUR}{DATE_TINY} -STR_TIMETABLE_DEPARTURE :D: {COLOUR}{DATE_TINY} # Date window (for timetable) diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index 54ba1e140a..cda40540a7 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -255,6 +255,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filter: STR_LIST_FILTER_OSKTITLE :{BLACK}Enter one or more keywords to filter the list for @@ -718,8 +719,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Click on STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Click on music track to remove it from current program (Custom1 or Custom2 only) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Top companies who reached {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Company League Table in {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Businessperson STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Entrepreneur @@ -1656,8 +1655,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Enable usage of STR_CONFIG_SETTING_LOADING_INDICATORS :Use loading indicators: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Select whether loading indicators are displayed above loading or unloading vehicles -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Show timetable in ticks rather than days: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Show travel times in time tables in game ticks instead of days +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Show arrival and departure in timetables: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Display anticipated arrival and departure times in timetables @@ -4566,8 +4564,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(stay for {STRI STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(travel for {STRING}, not timetabled) STR_TIMETABLE_STAY_FOR :and stay for {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :and travel for {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}day{P "" s} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}tick{P "" s} STR_TIMETABLE_TOTAL_TIME :{BLACK}This timetable will take {STRING} to complete STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}This timetable will take at least {STRING} to complete (not all timetabled) @@ -4576,10 +4572,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}This veh STR_TIMETABLE_STATUS_LATE :{BLACK}This vehicle is currently running {STRING} late STR_TIMETABLE_STATUS_EARLY :{BLACK}This vehicle is currently running {STRING} early STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}This timetable has not yet started -STR_TIMETABLE_STATUS_START_AT :{BLACK}This timetable will start at {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Start Date -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Select a date as starting point of this timetable. Ctrl+Click distributes all vehicles sharing this order evenly from the given date based on their relative order, if the order is completely timetabled + STR_TIMETABLE_CHANGE_TIME :{BLACK}Change Time STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Change the amount of time that the highlighted order should take. Ctrl+Click sets the time for all orders @@ -4603,8 +4597,6 @@ STR_TIMETABLE_EXPECTED :{BLACK}Expected STR_TIMETABLE_SCHEDULED :{BLACK}Scheduled STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Switch between expected and scheduled -STR_TIMETABLE_ARRIVAL :A: {COLOUR}{DATE_TINY} -STR_TIMETABLE_DEPARTURE :D: {COLOUR}{DATE_TINY} # Date window (for timetable) diff --git a/src/lang/esperanto.txt b/src/lang/esperanto.txt index 44e658c324..8ecbd2b36f 100644 --- a/src/lang/esperanto.txt +++ b/src/lang/esperanto.txt @@ -321,6 +321,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtroteksto: STR_LIST_FILTER_OSKTITLE :{BLACK}Entajpu filtrotekston. @@ -778,8 +779,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Alklaku STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Alklaku muzikeron por viŝi el la nuna programo (nur propra) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Superkompanioj kiuj atingis {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Kompania tabelo en {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Komercisto STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Entreprenisto @@ -1677,7 +1676,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Ebligu uzadon d STR_CONFIG_SETTING_LOADING_INDICATORS :Uzu ŝarg-indikilojn: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Elektu ĉu ŝarĝ-indikiloj estas montrataj sub ŝarĝataj aŭ malŝarĝataj veturiloj -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Montru horaron laŭ tikoj anstataŭ laŭ tagoj: {STRING} +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Montru alvenojn kaj forirojn sur horaroj: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Montru antaŭvidatajn alven- kaj forir-tempojn en horaroj @@ -4471,9 +4470,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(haltu dum {STR STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(veturos dum {STRING}, sen horaro) STR_TIMETABLE_STAY_FOR :kaj restu dum {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :kaj veturu dum {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}tago{P "" j} -STR_TIMETABLE_DAYS.n :{COMMA}{NBSP}tago{P "" j}n -STR_TIMETABLE_TICKS :{COMMA}{NBSP}tiko{P "" j} STR_TIMETABLE_TOTAL_TIME :{BLACK}Plenumi ĉi tiun horaron postulos {STRING.n} STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Ĉi tio horaro postulos alemnaŭ {STRING} plenigi (ne ĉiu horarita) @@ -4482,9 +4478,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Ĉi tiu STR_TIMETABLE_STATUS_LATE :{BLACK}Ĉi tiu veturilo nun malfruas je {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}Ĉi tiu veturilo nun fruas je {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Ĉi tiu horaro ankoraŭ ne komenciĝas. -STR_TIMETABLE_STATUS_START_AT :{BLACK}Ĉi tiu horaro komenciĝos je {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Komencodato + STR_TIMETABLE_CHANGE_TIME :{BLACK}Ŝanĝu tempon STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Ŝanĝu kiom da tempo devus postuli la markita ordono. Stir+Klak ŝanĝas la tempon por ĉiuj ordonoj @@ -4508,8 +4503,6 @@ STR_TIMETABLE_EXPECTED :{BLACK}Atendite STR_TIMETABLE_SCHEDULED :{BLACK}Planite STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Ŝalti inter atendite kaj planite -STR_TIMETABLE_ARRIVAL :A: {COLOUR}{DATE_TINY} -STR_TIMETABLE_DEPARTURE :E: {COLOUR}{DATE_TINY} # Date window (for timetable) diff --git a/src/lang/estonian.txt b/src/lang/estonian.txt index e68b1144b4..ebc583b3ea 100644 --- a/src/lang/estonian.txt +++ b/src/lang/estonian.txt @@ -294,6 +294,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL} meete STR_UNITS_HEIGHT_METRIC :{DECIMAL} m STR_UNITS_HEIGHT_SI :{DECIMAL} m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Märksõna: STR_LIST_FILTER_OSKTITLE :{BLACK}Sisesta üks või enam märksõna mille järgi nimekirja filtreerida @@ -755,8 +756,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Vajuta l STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Vajuta laulule, et see eemaldada praegusest progammist (Custom1 või Custom2 ainult) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Parimad ettevõtted aastal {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Ettevõtete edetabelis {NUM} kohal STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Äriinimene STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Ettevõtja @@ -1654,8 +1653,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Laseb kasutada STR_CONFIG_SETTING_LOADING_INDICATORS :Kasuta laadimisnäidikuid: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Vali, kas koorma laadimisel ja tühjendamisel näidatakse laadimisnäidikuid -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Graafik on sammudes, mitte päevades: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Graafikus on ajad märgitud mitte päevades, vaid sammudes +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Graafikus on saabumis- ja väljumisajad: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Sõiduki graafikus esitatakse eeldatavaid saabumis- ja väljumisaegu @@ -4524,8 +4522,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(Oode {STRING}, STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :({STRING} sõidukestus, ajastamata) STR_TIMETABLE_STAY_FOR :ja oota {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :ja sõida {STRING} jaoks -STR_TIMETABLE_DAYS :{COMMA} päev{P "" a} -STR_TIMETABLE_TICKS :{COMMA} samm{P "" u} STR_TIMETABLE_TOTAL_TIME :{BLACK}Selle graafiku läbimine võtab {STRING} STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Selle graafiku läbimine võtab vähemalt {STRING} (kõik ei ole planeeritud) @@ -4534,10 +4530,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Sõiduk STR_TIMETABLE_STATUS_LATE :{BLACK}See sõiduk on {STRING} hiljaks jäämas STR_TIMETABLE_STATUS_EARLY :{BLACK}See sõiduk on {STRING} varajane STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Graafikuga pole veel alustatud -STR_TIMETABLE_STATUS_START_AT :{BLACK}Graafikuga alustatakse {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Alguskuupäev -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. Ctrl+klõps seab aja kõigile korraldustele diff --git a/src/lang/faroese.txt b/src/lang/faroese.txt index 19271e3574..160492fa9d 100644 --- a/src/lang/faroese.txt +++ b/src/lang/faroese.txt @@ -219,6 +219,7 @@ STR_UNITS_FORCE_SI :{DECIMAL} kN STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL} ft STR_UNITS_HEIGHT_SI :{DECIMAL} m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtur strong: STR_LIST_FILTER_OSKTITLE :{BLACK}Skriva inn filtur strong @@ -643,8 +644,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Trýst STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Trýst á tónleika spor fyri at strika frá núverðani skrá (Sjálvgjørdur1 ella Sjálvgjørdur2 einans) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Fremstu fyritøkunar ið rukku {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Yvirlit fyri Fyritøku Deildina í {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Vinnumaður STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Íverksetari @@ -1417,8 +1416,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Gilda nýtsluna STR_CONFIG_SETTING_LOADING_INDICATORS :Nýt lessingar vísarar: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Vel um lessi vísarar verða vístir omanfyri lessandi og avlessandi flutningstól ella ikki -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Vís tíðarætlan í klikkum heldur enn døgum: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Vís koyri tíðir í tíðarætlanum við 'spæli klikkum' í staðin fyri við døgum +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Vís komir og fráferðir í tíðarætlanum: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Vís væntaðu komu og fráferðs tíðir í tíðarætlanum @@ -3575,7 +3573,7 @@ STR_TIMETABLE_ORDER_VIEW_TOOLTIP :{BLACK}Skift ti STR_TIMETABLE_NO_TRAVEL :Ferðast ikki -STR_TIMETABLE_DAYS :{COMMA} dag{P "" ar} + diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index 9b260bc95e..066c967b3a 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -255,6 +255,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Suodatin: STR_LIST_FILTER_OSKTITLE :{BLACK}Syötä yksi tai useampi avainsana listan suodattamiseksi @@ -718,8 +719,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Valitse STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Poista musiikkiraita nykyiseltä soittolistalta napsauttamalla (vain oma{NBSP}1 tai oma{NBSP}2) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Parhaat yhtiöt, jotka saavuttivat vuoden {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Yhtiökilpailutaulukko vuonna {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Kaupantekijä STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Yrittäjä @@ -1656,8 +1655,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Salli kehittyne STR_CONFIG_SETTING_LOADING_INDICATORS :Lastausilmaisimet: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Määritä näytetäänkö lastausilmaisimet kulkuneuvojen yläpuolella lastatessa ja purettaessa rahtia -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Näytä aikataulu askelina päivien sijaan: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Näytä aikataulun ajat päivien sijasta askelina +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Näytä saapuminen ja lähtö aikatauluissa: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Näytä odotetut saapumis- ja lähtemisajat aikatauluissa @@ -4566,8 +4564,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(pysy {STRING}, STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(matkusta {STRING}, ei aikataulua) STR_TIMETABLE_STAY_FOR :ja odota {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :ja kulje {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}päivä{P "" ä} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}askel{P "" ta} STR_TIMETABLE_TOTAL_TIME :{BLACK}Aikataulun kesto on {STRING} STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Aikataulun kesto on vähintään {STRING} @@ -4576,10 +4572,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Kulkuneu STR_TIMETABLE_STATUS_LATE :{BLACK}Kulkuneuvo on {STRING} myöhässä STR_TIMETABLE_STATUS_EARLY :{BLACK}Kulkuneuvo on {STRING} etuajassa STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Tämä aikataulu ei ole vielä alkanut -STR_TIMETABLE_STATUS_START_AT :{BLACK}Tämä aikataulu alkaa {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Aloituspäivä -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Valitse päivämäärä aikataulun aloitusajankohdaksi. Ctrl+napsautus levittää kaikki tämän käskyjoukon jakavat kulkuneuvot tasaisesti niiden keskinäisen järjestyksen mukaan, mikäli käskyjoukko on kokonaan aikataulutettu + STR_TIMETABLE_CHANGE_TIME :{BLACK}Muuta aikaa STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Muuta aikaa, jonka valitun käskyn tulisi kestää. Ctrl+napsautus asettaa keston kaikille käskyille @@ -4603,8 +4597,6 @@ STR_TIMETABLE_EXPECTED :{BLACK}Odotettu STR_TIMETABLE_SCHEDULED :{BLACK}Aikataulu STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Vaihda odotetun ja aikataulun välillä -STR_TIMETABLE_ARRIVAL :T: {COLOUR}{DATE_TINY} -STR_TIMETABLE_DEPARTURE :L: {COLOUR}{DATE_TINY} # Date window (for timetable) diff --git a/src/lang/french.txt b/src/lang/french.txt index a088fd449c..5aff8966ca 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -256,6 +256,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtre{NBSP}: STR_LIST_FILTER_OSKTITLE :{BLACK}Entrer un ou plusieurs mot-clés pour filtrer la liste @@ -719,8 +720,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Cliquer STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Cliquer sur une piste pour la retirer du programme courant (Personnalisé 1 ou Personnalisé 2 seulement) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Meilleures compagnies qui ont atteint {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Tableau du Championnat des compagnies en {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Personne d'affaires STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Entrepreneur @@ -1657,8 +1656,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Active l'utilis STR_CONFIG_SETTING_LOADING_INDICATORS :Utiliser les indicateurs de chargement{NBSP}: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Choisir si les indicateurs de chargement doivent être affichés au dessus des véhicules qui chargent ou déchargent -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Afficher l'horaire en ticks plutôt qu'en jours{NBSP}: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Affiche les temps de trajets dans les horaires en ticks plutôt qu'en jours +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Afficher l'arrivée et le départ dans les horaires{NBSP}: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Afficher les temps d'arrivée et de départ prévues dans les horaires @@ -2347,7 +2345,7 @@ STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}Les autr STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Choisir le mot de passe STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Protégez votre partie avec un mot de passe si vous ne souhaitez pas que d'autres l'utilisent -STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Visibilité +STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Visibilité{NBSP}: STR_NETWORK_START_SERVER_VISIBILITY_TOOLTIP :{BLACK}Possibilité pour les autres personnes de vous voir dans la liste publique STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} client{P "" s} STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Nombre de clients maximum{NBSP}: @@ -4567,8 +4565,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(rester pendant STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(voyager pendant {STRING}, non planifié) STR_TIMETABLE_STAY_FOR :et rester pendant {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :et voyager pendant {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}jour{P "" s} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}tick{P "" s} STR_TIMETABLE_TOTAL_TIME :{BLACK}Cet horaire prendra {STRING} pour s'achever STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Cet horaire prendra au moins {STRING} pour s'achever (horaire incomplet) @@ -4577,10 +4573,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Ce véhi STR_TIMETABLE_STATUS_LATE :{BLACK}Ce véhicule est en retard de {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}Ce véhicule est en avance de {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Cet horaire n'a pas encore démarré -STR_TIMETABLE_STATUS_START_AT :{BLACK}Cet horaire démarrera à {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Date de départ -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Choisir une date comme point de départ de cet horaire. Ctrl-clic pour répartir tous les véhicules partageant cet ordre uniformément à partir de la date donnée selon leur ordre relatif, si l'ordre est complètement planifié + STR_TIMETABLE_CHANGE_TIME :{BLACK}Modifier la durée STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Modifier la durée de l'ordre sélectionné. Ctrl-clic pour définir la durée pour tous les ordres @@ -4604,8 +4598,6 @@ STR_TIMETABLE_EXPECTED :{BLACK}Attendu STR_TIMETABLE_SCHEDULED :{BLACK}Planifié STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Alterner entre attendu et planifié -STR_TIMETABLE_ARRIVAL :A: {COLOUR}{DATE_TINY} -STR_TIMETABLE_DEPARTURE :D: {COLOUR}{DATE_TINY} # Date window (for timetable) diff --git a/src/lang/frisian.txt b/src/lang/frisian.txt index 6bc3958d5c..65dff9170c 100644 --- a/src/lang/frisian.txt +++ b/src/lang/frisian.txt @@ -225,6 +225,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filter: STR_LIST_FILTER_OSKTITLE :{BLACK}Foer filter namme yn @@ -666,8 +667,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Klik op STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Klik op musyknûmmer om't út it aktive program it heljen (allinnich Oanpast1 of Oanpast2) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Topbedriuwen dy't niveau {NUM} helle hawwe -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Bedriuwskompetysjetabel yn {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Sakeman STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Undernimmer @@ -1492,8 +1491,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Skeakelje de av STR_CONFIG_SETTING_LOADING_INDICATORS :Brûk laadyndikators: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :By ynskeakeljen sille ydikators sjen litten wurde boppe fiertugen dy't oan it yn- as útladen binne -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Toan tsjinstregeling yn tikken yn stee fan yn dagen: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Lit reistiden sjen in tikken yn stee fan yn dagen op tsjinstregelings +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Toan oankomst- en ofreistiid yn de tsjinstregeling: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Lit oankomst- en ôfriidtiden sjen yn tsjinstregelings @@ -3766,14 +3764,12 @@ STR_TIMETABLE_TRAVEL_FOR_SPEED_ESTIMATED :Reizgje (foar { STR_TIMETABLE_STAY_FOR_ESTIMATED :(bliuw foar {STRING}, sûnder tjinstregeling) STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(reizgje foar {STRING}, sûnder tjinstregeling) STR_TIMETABLE_STAY_FOR :en bliuw foar{STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}{P dei dagen} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}tik{P "" ken} STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Dit fiertûch is op tiid STR_TIMETABLE_STATUS_EARLY :{BLACK}Dit fiertûch is {STRING} te betiid -STR_TIMETABLE_STARTING_DATE :{BLACK}Begjin datum + STR_TIMETABLE_CHANGE_TIME :{BLACK}Tiid Feroarje diff --git a/src/lang/gaelic.txt b/src/lang/gaelic.txt index c3e772aac9..ae306ddbb6 100644 --- a/src/lang/gaelic.txt +++ b/src/lang/gaelic.txt @@ -413,6 +413,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Sreang criathraige: STR_LIST_FILTER_OSKTITLE :{BLACK}Cuir a-steach sreang criathraige @@ -866,8 +867,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Dèan br STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Dèan briogadh air traca ciùil gus a thoirt air falbh bhon phrògram làithreach (Gnàthaichte1 no Gnàthaichte2 a-mhàin) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Na companaidhean as fhearr a ràinig {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Clàr co-bhonn nan companaidh ann an {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Neach-gnothaich STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Neach-tionnsgainn @@ -1683,8 +1682,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Cuir liostaiche STR_CONFIG_SETTING_LOADING_INDICATORS :Seall taisbeanairean luchdaidh: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Tagh an tèid taisbeanairean luchdaidh a shealltainn os cionn charbadan a bhios a' luchdadh no dì-luchdadh -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Seall an clàr-ama ann an diogan seach làithean: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Seall na h-ùinean siubhail ann an clàran-ama le diogan geama seach làithean +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Seall àm ruigsinn is falbh air clàran-ama: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Seall na h-amannan ruigsinn is falbh air a bheilear an dùil air clàran-ama @@ -4285,8 +4283,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(fuirich fad {S STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(siubhail fad {STRING} gun chlàr-ama) STR_TIMETABLE_STAY_FOR :is fuirich fad {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :is siubhail fad {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}{P latha latha làithean latha} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}{P diog dhiog diogan diog} STR_TIMETABLE_TOTAL_TIME :{BLACK}Bheir an clàr-ama seo {STRING} airson coileanadh STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Bheir an clàr-ama seo {STRING} air a char as lugha airson coileanadh (cuid dheth gun chlàr-ama) @@ -4295,10 +4291,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Tha an c STR_TIMETABLE_STATUS_LATE :{BLACK}Tha an carbad seo {STRING} air deireadh an-dràsta STR_TIMETABLE_STATUS_EARLY :{BLACK}Tha an carbad seo {STRING} ro àm an-dràsta STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Cha do thòisich an clàr-ama seo fhathast -STR_TIMETABLE_STATUS_START_AT :{BLACK}Tòisich an clàr-ama seo {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Ceann-latha tòiseachaidh -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Tagh ceann-latha tòiseachaidh airson a' chlàir-ama seo. Suidhichidh Ctrl+Briogadh ceann-latha tòiseachaidh a' chlàir-ama seo is ma tha clàr-ama slàn aig an òrdugh seo, sgaoilidh seo a h-uile carbad a cho-roinneas an t-òrdugh seo gu cunbhalach, stèidhichte air an òrdugh eatorra + STR_TIMETABLE_CHANGE_TIME :{BLACK}Uair eile STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Atharraich an ùine a bheireadh an t-òrdugh a thagh thu diff --git a/src/lang/galician.txt b/src/lang/galician.txt index d084e0f561..57b61945f1 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -256,6 +256,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL} pés STR_UNITS_HEIGHT_METRIC :{DECIMAL} m STR_UNITS_HEIGHT_SI :{DECIMAL} m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtrar: STR_LIST_FILTER_OSKTITLE :{BLACK}Introducir unha ou máis palabras clave pola que filtrar a lista @@ -719,8 +720,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Pincha n STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Pincha nunha pista de música para borrala do programa actual (só Persoal1 ou Persoal2) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Mellores compañías que chegaron a {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Cadro da liga de compañías en {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Persoa de negocios STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Emprendedor @@ -1657,8 +1656,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Habilita-lo uso STR_CONFIG_SETTING_LOADING_INDICATORS :Usar indicadores de carga: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Escolle se os indicadores de carga se amosan sobre os vehículos en carga/descarga -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Mostra-lo horario en ticks en lugar de en días: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Mostra-los tempos de viaxe nos horarios en ticks en vez de en días +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Mostrar chegada e saída nos horarios: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Amosar chegadas e saídas anticipadas nos horarios @@ -4567,8 +4565,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(permanece por STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(viaxe para {STRING}, sen calendarizar) STR_TIMETABLE_STAY_FOR :e parar durante {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :e viaxar durante {STRING} -STR_TIMETABLE_DAYS :{COMMA} día{P "" s} -STR_TIMETABLE_TICKS :{COMMA} tick{P "" s} STR_TIMETABLE_TOTAL_TIME :{BLACK}Levará {STRING} completar este horario STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Este horario levará {STRING} completalo (non está completo) @@ -4577,10 +4573,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Este veh STR_TIMETABLE_STATUS_LATE :{BLACK}Este vehículo está retrasado {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}Este vehículo vai adiantado {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Este horario aínda non comezóu -STR_TIMETABLE_STATUS_START_AT :{BLACK}Este horario comezará o {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Data comezo -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Selecciona unha data coma punto de inicio para este horario. Ctrl + click distribúe uniformemente tódolos vehículos que compartan esta orde baséandose na súa orde relativa. se a orde está completamente tabulada nos horarios + STR_TIMETABLE_CHANGE_TIME :{BLACK}Cambiar Tempo STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Cambiar o tempo que debería levar a orde seleccionada. Ctrl+Click cambia o tempo para todas as ordes @@ -4604,8 +4598,6 @@ STR_TIMETABLE_EXPECTED :{BLACK}Esperado STR_TIMETABLE_SCHEDULED :{BLACK}Programado STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Alternar entre o esperado e o programado -STR_TIMETABLE_ARRIVAL :A: {COLOUR}{DATE_TINY} -STR_TIMETABLE_DEPARTURE :D: {COLOUR}{DATE_TINY} # Date window (for timetable) diff --git a/src/lang/german.txt b/src/lang/german.txt index 3684132d09..2bab17f3fd 100644 --- a/src/lang/german.txt +++ b/src/lang/german.txt @@ -256,6 +256,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filter: STR_LIST_FILTER_OSKTITLE :{BLACK}Einen oder mehrere Schlüsselwörter für den Listenfilter eingeben @@ -719,8 +720,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Klicken STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Klicken Sie auf einen Musiktitel, um ihn aus der aktuellen Liste zu entfernen (nur für Benutzerdefiniert 1 und 2) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Beste Firmen, die {NUM} erreichten -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Firmentabelle in {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Geschäftsperson STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Unternehmer @@ -1074,6 +1073,7 @@ STR_GAME_OPTIONS_BASE_MUSIC :{BLACK}Basismus STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :{BLACK}Ein Basismusikset auswählen STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}Zusätzliche Informationen über das Basismusikset +STR_BASESET_STATUS :{STRING} {RED}({NUM} fehlende/beschädigte Datei{P "" en}) STR_ERROR_RESOLUTION_LIST_FAILED :{WHITE}Eine Liste unterstützter Auflösungen konnte nicht ermittelt werden STR_ERROR_FULLSCREEN_FAILED :{WHITE}Vollbildmodus nicht möglich @@ -1656,8 +1656,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Nutze erweitert STR_CONFIG_SETTING_LOADING_INDICATORS :Ladestandanzeiger verwenden: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Auswählen, ob beim Be- oder Entladen der Ladestand in Prozent über dem Fahrzeug angezeigt werden soll -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Fahrpläne in Ticks anstatt in Tagen anzeigen: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Zeige Fahrtzeiten in Fahrplänen in Ticks statt Tagen +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Zeige Ankunft und Abfahrt im Fahrplan: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Zeige geschätzte Ankunfts- und Abfahrtzeiten in Fahrplänen @@ -2346,7 +2345,7 @@ STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}Der Name STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Passwort setzen STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Ein Passwort verhindert, dass unbefugte Leute beitreten -STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Sichtbarkeit +STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Sichtbarkeit: STR_NETWORK_START_SERVER_VISIBILITY_TOOLTIP :{BLACK}Ob andere Personen Ihren Server in der öffentlichen Liste sehen können STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} Teilnehmer STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Maximale Teilnehmeranzahl: @@ -2581,7 +2580,7 @@ STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}Inhalte, STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}OpenTTD wird hiermit verlassen! STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}Die Bedingungen für den Download von Erweiterungen von fremden Webseiten variieren.{}Bei Problemen mit der Installation der Erweiterung in OpenTTD bitte auf der externen Webseite nach Anleitungen suchen.{}Fortfahren? STR_CONTENT_FILTER_TITLE :{BLACK}Filter für Stichworte oder Namen: -STR_CONTENT_OPEN_URL :{BLACK}Webseite anzeigen +STR_CONTENT_OPEN_URL :{BLACK}Webseite STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}Webseite für diesen Eintrag anzeigen STR_CONTENT_DOWNLOAD_CAPTION :{BLACK}Herunterladen STR_CONTENT_DOWNLOAD_CAPTION_TOOLTIP :{BLACK}Beginne die ausgewählten Erweiterung(en) herunterzuladen @@ -4566,8 +4565,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(warte {STRING} STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(fahre {STRING}, ohne Fahrplan) STR_TIMETABLE_STAY_FOR :und {STRING} lang bleiben STR_TIMETABLE_AND_TRAVEL_FOR :und {STRING} lang unterwegs -STR_TIMETABLE_DAYS :{COMMA}{NBSP}Tag{P "" e} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}Tick{P "" s} STR_TIMETABLE_TOTAL_TIME :{BLACK}Dieser Fahrplan benötigt {STRING} STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Dieser Fahrplan benötigt mindestens {STRING} (nicht alle geplant) @@ -4576,10 +4573,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Das Fahr STR_TIMETABLE_STATUS_LATE :{BLACK}Dieses Fahrzeug hat {STRING} Verspätung STR_TIMETABLE_STATUS_EARLY :{BLACK}Dieses Fahrzeug ist {STRING} zu früh STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Dieser Fahrplan ist noch nicht gültig -STR_TIMETABLE_STATUS_START_AT :{BLACK}Dieser Fahrplan wird ab {STRING} in Kraft sein -STR_TIMETABLE_STARTING_DATE :{BLACK}Anfangsdatum -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Wähle ein Anfangsdatum für diesen Fahrplan aus. Mit Strg+Klick wird bei allen Fahrzeugen, die nach demselben Fahrplan unterwegs sind, ein zeitlich versetztes Anfangsdatum gesetzt, so dass die Abstände zwischen den einzelnen Fahrzeugen immer gleich sind. Dazu muss der Fahrplan erst komplett erfasst worden sein. + STR_TIMETABLE_CHANGE_TIME :{BLACK}Zeit ändern STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Zeitrahmen für den markierten Auftrag ändern. Strg+Klick legt die Zeit für alle Aufträge fest @@ -4603,8 +4598,6 @@ STR_TIMETABLE_EXPECTED :{BLACK}Voraussi STR_TIMETABLE_SCHEDULED :{BLACK}Fahrplanmäßig STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Umschalten zwischen Anzeige der erwarteten Ankunftszeit und des Fahrplans -STR_TIMETABLE_ARRIVAL :An: {COLOUR}{DATE_TINY} -STR_TIMETABLE_DEPARTURE :Ab: {COLOUR}{DATE_TINY} # Date window (for timetable) @@ -4707,9 +4700,12 @@ STR_TEXTFILE_NAVBACK_TOOLTIP :{BLACK}Zurück STR_TEXTFILE_NAVFORWARD_TOOLTIP :{BLACK}Wieder vorwärts in Navigationshistorie gehen STR_TEXTFILE_WRAP_TEXT :{WHITE}Text umbrechen STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Text des Fensters so umbrechen, dass es ohne Scrollen hineinpasst -STR_TEXTFILE_VIEW_README :{BLACK}Liesmich anzeigen +STR_TEXTFILE_VIEW_README :{BLACK}Liesmich +STR_TEXTFILE_VIEW_README_TOOLTIP :Liesmich für diesen Inhalt anzeigen STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Änderungen +STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP :Änderungen für diesen Inhalt anzeigen STR_TEXTFILE_VIEW_LICENCE :{BLACK}Lizenz +STR_TEXTFILE_VIEW_LICENCE_TOOLTIP :Lizenz für diesen Inhalt anzeigen ###length 5 STR_TEXTFILE_README_CAPTION :{WHITE}{STRING}-Liesmich von {STRING} STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING}-Änderungen von {STRING} diff --git a/src/lang/greek.txt b/src/lang/greek.txt index 5a13ce0e9a..95c0e1b74b 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -297,6 +297,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}μ STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Φιλτράρισμα λίστας: STR_LIST_FILTER_OSKTITLE :{BLACK}Εισαγώγη κειμένου για φιλτράρισμα @@ -804,8 +805,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Πατή STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Πατήστε στο τραγούδι για να το αφαιρέσετε από το πρόγραμμα (Προσαρμοσμένο 1 ή 2 μόνο) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Οι καλύτερες εταιρίες που έφτασαν το {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Πίνακας Πρωταθλήματος Εταιριών σε {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}, STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Επαγγελματίας STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Πρωτοπόρος @@ -1702,8 +1701,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Ενεργοπ STR_CONFIG_SETTING_LOADING_INDICATORS :Χρήση δεικτών φόρτωσης: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Επιλέξτε εάν οι δείκτες φόρτωσης εμφανίζονται πάνω από τα οχήματα που φορτώνουν ή ξεφορτώνουν -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Εμφάνιση δρομολογίων σε στιγμές αντί για ημέρες: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Εμφάνιση χρόνων ταξιδιού στα χρονοδιαγράμματα σε στιγμές αντί σε ημέρες +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Εμφάνιση αφίξεων και αναχωρήσεων στα δρομολόγια: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Εμφάνιση αναμενόμενης ώρας άφιξης και αναχώρησης στα χρονοδιαγράμματα @@ -4572,8 +4570,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(αναμονή STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(ταξίδι για {STRING}, μη δρομολογημένο) STR_TIMETABLE_STAY_FOR :και μείνε για {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :και ταξίδεψε για {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}μέρ{P α ες} -STR_TIMETABLE_TICKS :{COMMA} στιγμ{P ή ές} STR_TIMETABLE_TOTAL_TIME :{BLACK}Το δρομολόγιο αυτό θα χρειαστεί τουλάχιστον {STRING} για να ολοκληρωθεί STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Το δρομολόγιο αυτό θα χρειαστεί τουλάχιστον {STRING} για να ολοκληρωθεί (δεν είναι όλα τα χρονοδιαγράμματα) @@ -4582,10 +4578,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Αυτό STR_TIMETABLE_STATUS_LATE :{BLACK}Αυτό το όχημα έχει καθυστερήσει κατά {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}Το όχημα εκτελεί το δρομολόγιο του κατά {STRING} νωρίτερα STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Αυτό το δρομολόγιο ακόμα δεν έχει ξεκινήσει -STR_TIMETABLE_STATUS_START_AT :{BLACK}Αυτό το δρομολόγιο θα ξεκινήσει στις {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Εναρκτήρια ημερομηνία -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Διαλέξτε μια ημερομηνία ως αρχικό σημείο του πίνακα δρομολογίων. Το Ctrl+κλικ θέτει το αρχικό σημείο του πίνακα δρομολογίων και διανέμει τα οχήματα που μοιράζονται τις διαταγές ίσα με βάση τη σχετική τους σειρά αν η διαταγή είναι εξολοκλήρου δρομολογημένη + STR_TIMETABLE_CHANGE_TIME :{BLACK}Αλλαγή Χρόνων STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Αλλάζει ο χρόνος που παίρνει η επιλεγμένη επιλογή για να εκτελεστεί diff --git a/src/lang/hebrew.txt b/src/lang/hebrew.txt index 57ff59d2e6..2c55687f70 100644 --- a/src/lang/hebrew.txt +++ b/src/lang/hebrew.txt @@ -240,6 +240,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL} רג STR_UNITS_HEIGHT_METRIC :{DECIMAL} מ' STR_UNITS_HEIGHT_SI :{DECIMAL} מ' + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}מחרוזת סינון: STR_LIST_FILTER_OSKTITLE :{BLACK}הכנס מחרוזת סינון @@ -685,8 +686,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}(לחץ STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}(לחץ על רצועה כדי להסיר אותה מהתוכנית הנוחכית(מותאם אישית 1 או מותאם אישית 2 בלבד # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}חמש החברות שהגיעו לשנת {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}טבלת ליגה של חברות ב {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}.{COMMA} STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :איש עסקים STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :יזם @@ -1521,8 +1520,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :אפשר שימ STR_CONFIG_SETTING_LOADING_INDICATORS :{STRING} :הצג מצביעי הטענה STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :בחר האם מדדי טעינה יוצגו מעל רכבים בעת טעינתם או פריקתם -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :{STRING} :הצג לוח זמנים בפעימות במקום בימים -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :הצג זמני נסיעה בלוחות זמנים בפעימות משחק במקום בימים +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :הצג לוחות זמנים של הגעות ועזיבות: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :הצג זמני הגעה ויציאה צפויים בלוחות זמנים @@ -4181,8 +4179,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(נשאר ל-{S STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(מסע עבור {STRING} ללא טבלת זמנים) STR_TIMETABLE_STAY_FOR :{STRING} והמתן למשך STR_TIMETABLE_AND_TRAVEL_FOR :{STRING} וערוך מסע ל -STR_TIMETABLE_DAYS :{P 0 "יום " ""}{COMMA}{P "" " ימים"} -STR_TIMETABLE_TICKS :{P 0 "פעימה " ""}{COMMA}{P "" " פעימות"} STR_TIMETABLE_TOTAL_TIME :{BLACK}{STRING} להשלמת לוח זמנים זה נדרשים STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}.(לא כל היעדים תוזמנו) {STRING} להשלמת לוח זמנים זה ידרשו לפחות @@ -4191,10 +4187,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}כלי STR_TIMETABLE_STATUS_LATE :{BLACK}{STRING} רכב זה מאחר ב STR_TIMETABLE_STATUS_EARLY :{BLACK}{STRING} רכב זה מקדים ב STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}לוח זמנים זה עדיין לא התחיל -STR_TIMETABLE_STATUS_START_AT :{BLACK}לוח זמנים זה יתחיל ב-{STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}תאריך התחלה -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}בחר תאריך כנקודת ההתחלה ללוח הזמנים. Ctrl+לחיצה קובע את נקודת ההתחלה של לוח זמנים זה ומפזר בצורה אחידה בין כל כלי התחבורה המשותפים בלוח זמנים זה לפי סדרם, במידה וכל ההוראות כפופות ללוח הזמנים. + STR_TIMETABLE_CHANGE_TIME :{BLACK}שנה זמן STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}שנה את פרק הזמן לשהייה ביעד שנבחר diff --git a/src/lang/hindi.txt b/src/lang/hindi.txt index 25765efc16..6e926b758f 100644 --- a/src/lang/hindi.txt +++ b/src/lang/hindi.txt @@ -80,6 +80,7 @@ STR_UNITS_POWER_METRIC :{DECIMAL}{NBSP} + # Common window strings STR_TOOLTIP_SORT_ORDER :{BLACK}क्रमबद्धता क्रम चुनें (अवरोही/आरोही) @@ -505,6 +506,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DISABLED :अक्षम +###length 3 @@ -1312,7 +1314,7 @@ STR_TIMETABLE_ORDER_VIEW :{BLACK}आद -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}इस समयसारिणी के लिये एक आरंभिक दिनांक चुनें। Ctrl+क्लिक इस समयसारिणी की प्रारंभिक तिथि निर्धारित करता है और यदि निर्देश पूर्णतः समयसारिणी-बद्ध है तो इस निर्देश को साझा करने वाले सभी वाहनों को उनके परस्पर निर्देशों के आधार पर समानता से वितरित करता है। + diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index 38b585d9dd..79bf30e8ee 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -318,6 +318,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Szűrő kifejezés: STR_LIST_FILTER_OSKTITLE :{BLACK}Egy vagy több kulcsszó megadása a szűréshez @@ -781,8 +782,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Kattints STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Kattints a zeneszámra annak az aktuális zenei műsorból való eltávolításához (csak Saját 1 és Saját 2 esetén) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}A legjobb vállalatok, melyek elérték {NUM}-t -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Vállalatok helyezései {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Üzletember STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Vállalkozó @@ -1719,8 +1718,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Továbbfejleszt STR_CONFIG_SETTING_LOADING_INDICATORS :Rakodásjelző használata: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :A rakodásjelző megjelenítésének kiválasztása a be- és kirakodó járművek felett -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Menetrendi idő-alapegység tick a nap helyett: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Az utazási idők megjelenítése napok helyett tickekben +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Indulás és érkezés megjelenítése a menetrendekben: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Várható érkezés és indulás megjelenítése a menetrendekben @@ -4629,8 +4627,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(ottmarad {STRI STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :({STRING} utazás, időzítetlen) STR_TIMETABLE_STAY_FOR :állomásra és maradj ott {STRING}ig STR_TIMETABLE_AND_TRAVEL_FOR :és a menetidő: {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}nap -STR_TIMETABLE_TICKS :{COMMA}{NBSP}tick STR_TIMETABLE_TOTAL_TIME :{BLACK}A menetrend teljesítési ideje: {STRING} STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}A menetrend teljesítési ideje legalább: {STRING} (nincs minden időzítve) @@ -4639,10 +4635,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Ez a já STR_TIMETABLE_STATUS_LATE :{BLACK}Ez a jármű jelenleg {STRING} eltéréssel, késéssel közlekedik STR_TIMETABLE_STATUS_EARLY :{BLACK}Ez a jármű jelenleg {STRING} eltéréssel, korábban közlekedik STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}A menetrend még nincs megkezdve -STR_TIMETABLE_STATUS_START_AT :{BLACK}A menetrend megkezdésének dátuma {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Indulás dátuma -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Menetrend kezdeti dátumának kiválasztása. A ctrl+kattintás egyenletesen elosztja az ezen a menetrenden osztozó járműveket a kezdeti dátumtól fogva a jelenlegi utasításuk alapján, amennyiben a menetrend teljesen időzítve van. + STR_TIMETABLE_CHANGE_TIME :{BLACK}Idő megváltoztatása STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}A kijelölt utasítás végrehajtási idejét változtatja meg. Ctrl+kattintással beállítod az időt az összes utasításhoz. @@ -4666,8 +4660,6 @@ STR_TIMETABLE_EXPECTED :{BLACK}Várhat STR_TIMETABLE_SCHEDULED :{BLACK}Tervezett STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Váltás a várható és a tervezett időpontok között -STR_TIMETABLE_ARRIVAL :Érk: {COLOUR}{DATE_TINY} -STR_TIMETABLE_DEPARTURE :Ind: {COLOUR}{DATE_TINY} # Date window (for timetable) diff --git a/src/lang/icelandic.txt b/src/lang/icelandic.txt index cf406dc2c1..e29370908b 100644 --- a/src/lang/icelandic.txt +++ b/src/lang/icelandic.txt @@ -219,6 +219,7 @@ STR_UNITS_FORCE_SI :{DECIMAL} kN STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL} ft STR_UNITS_HEIGHT_SI :{DECIMAL} m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Sía: STR_LIST_FILTER_OSKTITLE :{BLACK}Sláðu inn leitarstreng @@ -642,8 +643,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Veldu la STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Smelltu á lag til að fjarlægja það úr listanum (á aðeins við um Sérvalið1 og Sérvalið2) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Efstu fyrirtæki sem náðu {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Sambandstafla fyrirtækis í {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Viðskiptamaður STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Athafnamaður @@ -1416,8 +1415,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Virkja mögulei STR_CONFIG_SETTING_LOADING_INDICATORS :Sýna stöðu lestunar: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Sýna fyrir ofan farartækin stöðu lestunar þegar þau eru að ferma eða afferma -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Birta áætlanir í slögum frekar en dögum: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Sýna ferðatíma í áætlun í slögum frekar en dögum +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Sýna komu- og brottfaratíma í áætlunum: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Sýna áætlaðan komu- og brottfarar tíma í áætlun @@ -3783,8 +3781,6 @@ STR_TIMETABLE_TRAVEL_FOR :Ferðast í {ST STR_TIMETABLE_TRAVEL_FOR_SPEED :Ferðast í {STRING} með hámarkshraða {VELOCITY} STR_TIMETABLE_STAY_FOR :og bíða í {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :og ferðast í {STRING} -STR_TIMETABLE_DAYS :{COMMA} dag{P "" a} -STR_TIMETABLE_TICKS :{COMMA} sl{P ag ög} STR_TIMETABLE_TOTAL_TIME :{BLACK}Það mun taka {STRING} að ljúka við þessa áætlun STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Það mun að minnsta kosti taka {STRING} að ljúka við þessa áætlun (ekki allar skipanir á áætlun) @@ -3793,9 +3789,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Þetta f STR_TIMETABLE_STATUS_LATE :{BLACK}Þetta farartæki er {STRING} of seint STR_TIMETABLE_STATUS_EARLY :{BLACK}Þetta farartæki er {STRING} of fljótt STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Þessi tímaáætlun er ekki hafin -STR_TIMETABLE_STATUS_START_AT :{BLACK}Tímaáætlunin byrjar {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Byrjunardagsetning + STR_TIMETABLE_CHANGE_TIME :{BLACK}Breyta tíma STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Breyta tímanum sem valin skipun ætti að taka diff --git a/src/lang/ido.txt b/src/lang/ido.txt index e208ff94d6..b69b47d0e6 100644 --- a/src/lang/ido.txt +++ b/src/lang/ido.txt @@ -217,6 +217,7 @@ STR_UNITS_FORCE_SI :{DECIMAL} kN STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL} pd STR_UNITS_HEIGHT_SI :{DECIMAL} m + # Common window strings STR_BUTTON_SORT_BY :{BLACK}Ordinas per @@ -681,6 +682,7 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Violkolora +###length 3 @@ -1433,6 +1435,7 @@ STR_ORDER_GO_TO_STATION :{STRING} {STATI + # Date window (for timetable) diff --git a/src/lang/indonesian.txt b/src/lang/indonesian.txt index 17167745ad..6498f2bfe7 100644 --- a/src/lang/indonesian.txt +++ b/src/lang/indonesian.txt @@ -255,6 +255,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Saring: STR_LIST_FILTER_OSKTITLE :{BLACK}Masukkan satu atau lebih kata kunci untuk penyaringan pada list @@ -718,8 +719,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Klik pad STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Klik pada track musik untuk menghapusnya dari program saat ini. (Bebas 1 atau Bebas 2 saja) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Perusahaan tertinggi yang mencapai tahun {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Tabel Liga Perusahaan {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Pebisnis STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Pengusaha @@ -1656,8 +1655,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Mengaktifkan pe STR_CONFIG_SETTING_LOADING_INDICATORS :Tampilkan indikator pengangkutan: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Pilih apakah petunjuk beban ditayangkan di atas kendaran yang sedang mengisi atau menurunkan beban -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Penjadwalan menggunakan satuan titik , bukan satuan hari: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Menunjukan waktu perjalanan dalam titik permainan daripada dalam hari +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Tampilkan keberangkatan dan kedatangan pada jadwal: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Tampilkan waktu diantisipasi kedatangan dan keberangkatan di jadwal @@ -4566,8 +4564,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(menetap untuk STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(perjalan untuk {STRING}, tidak berjadwal) STR_TIMETABLE_STAY_FOR :dan tinggal selama {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :dan berjalan selama {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}hari -STR_TIMETABLE_TICKS :{COMMA}{NBSP}titik STR_TIMETABLE_TOTAL_TIME :{BLACK}Total durasi seluruh perjalanan akan memakan waktu {STRING} STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Total durasi seluruh perjalanan akan memakan waktu kurang lebih {STRING} untuk terpenuhi (blm semuanya terjadwal) @@ -4576,10 +4572,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Kendaraa STR_TIMETABLE_STATUS_LATE :{BLACK}Kendaraaan ini berjalan terlambat {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}Kendaraaan ini berjalan lebih awal {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Jadwal masih belum dimulai -STR_TIMETABLE_STATUS_START_AT :{BLACK}Jadwal ini akan dimulai pada {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Tanggal mulai -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Pilih tanggal titik mula timetable. Ctrl+Click untuk mendistribusikan semua kendaraan dengan instruksi sama secara merata dari tanggal yang telah dipilih berdasarkan instruksi relatif tiap kendaraan, hanya jika intruksi tersebut sepenuhnya terjadwal. + STR_TIMETABLE_CHANGE_TIME :{BLACK}Ubah Durasi STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Ubah jumlah waktu yang seharusnya dibutuhkan, pada tujuan yang terpilih. Ctrl+Click untuk mengubah keseluruhan tujuan @@ -4603,8 +4597,6 @@ STR_TIMETABLE_EXPECTED :{BLACK}Harapan STR_TIMETABLE_SCHEDULED :{BLACK}Dijadwalkan STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Ubah antara perkiraan dan jadwal -STR_TIMETABLE_ARRIVAL :T: {COLOUR}{DATE_TINY} -STR_TIMETABLE_DEPARTURE :B: {COLOUR}{DATE_TINY} # Date window (for timetable) diff --git a/src/lang/irish.txt b/src/lang/irish.txt index a446fc7715..7dbd840afa 100644 --- a/src/lang/irish.txt +++ b/src/lang/irish.txt @@ -228,6 +228,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Teaghrán scagtha: STR_LIST_FILTER_OSKTITLE :{BLACK}Iontráil teaghráin scagaire @@ -687,8 +688,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Cliceái STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Cliceáil ar rian ceoil chun é a bhaint ón gclár reatha (Saincheaptha1 nó Sainche # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Cuideachtaí is fearr a bhain amach {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Tábla Sraithe na gCuideachtaí in {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Fear gnó STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Fiontraí @@ -1562,8 +1561,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Cumasaigh úsá STR_CONFIG_SETTING_LOADING_INDICATORS :Úsáid táscairí lódála: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Roghnaigh cibé acu an dtaispeánfar táscairí lódála os cionn feithiclí atá ag lódáil nó ag dílódáil nó nach dtaispeánfar -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Taispeáin an t-amchlár i dticeanna seachas i laethanta: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Taispeáin amanna taistil i dtáblaí ama i dticeanna cluiche seachas laethanta +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Taispeáin am teacht isteach agus fágála in amchláir: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Taispeáin na hamanna teacht isteach agus imeachta a bhfuiltear ag súil leo sna hamchláir @@ -4380,8 +4378,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(fan ar feadh { STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(taisteal ar feadh {STRING}, gan amchlár) STR_TIMETABLE_STAY_FOR :agus fan ar feadh {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :agus taisteal ar feadh {STRING} -STR_TIMETABLE_DAYS :{COMMA} lá{P "" "" "" "" ""} -STR_TIMETABLE_TICKS :{COMMA} {P th th th dt t}ic STR_TIMETABLE_TOTAL_TIME :{BLACK}Tógfaidh sé {STRING} an t-amchlár seo a chur i gcrích STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Glacfaidh sé ar a laghad {STRING} chun an t-amhchlár seo a chur i gcrích (níl gach rud ar an amchlár) @@ -4390,10 +4386,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Tá an f STR_TIMETABLE_STATUS_LATE :{BLACK}Tá an fheithicil seo ag rith {STRING} mall faoi láthair STR_TIMETABLE_STATUS_EARLY :{BLACK}Tá an fheithicil seo ag rith {STRING} luath faoi láthair STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Níor thosaigh an t-amchlár seo fós -STR_TIMETABLE_STATUS_START_AT :{BLACK}Tosóidh an t-amchlár seo ag {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Dáta tosaigh -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Roghnaigh dáta mar phointe tosaigh don amchlár seo. Ctrl+Cliceáil chun pointe tosaigh an amchlár a shocrú agus gach feithicil a chomhroinneann an t-ordú seo a dháileadh go cothrom bunaithe ar a hordú coibhneasta, fiú má tá amchlár iomlán ann don ordú sin + STR_TIMETABLE_CHANGE_TIME :{BLACK}Athraigh Am STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Athraigh an méid ama ar chóir don ordú aibhsithe a thógáil diff --git a/src/lang/italian.txt b/src/lang/italian.txt index 6ce8ee18e8..6720e1b090 100644 --- a/src/lang/italian.txt +++ b/src/lang/italian.txt @@ -257,6 +257,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtro: STR_LIST_FILTER_OSKTITLE :{BLACK}Immettere una o più parole chiave per filtrare dall'elenco @@ -720,8 +721,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Fare cli STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Fare clic su un brano per rimuoverlo dal programma corrente (solo Personale1 o Personale2) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Le migliori compagnie che hanno raggiunto il {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Classifica compagnie nel {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Commerciante STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Imprenditore @@ -1691,8 +1690,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Abilita l'utili STR_CONFIG_SETTING_LOADING_INDICATORS :Utilizza gli indicatori di caricamento: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Determina se gli indicatori di caricamento sono mostrati sopra i veicoli in caricamento o scaricamento -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Mostra le tabelle orarie in tick piuttosto che in giorni: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Mostra il tempo di viaggio in tick del simulatore invece che in giorni +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Mostra gli arrivi e le partenze nelle tabelle orarie: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Mostra gli orari di arrivo e partenza previsti nelle tabelle orarie @@ -2381,7 +2379,7 @@ STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}Il nome STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Imposta password STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Protegge la partita con una password in modo che non sia accessibile pubblicamente -STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Visibilità +STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Visibilità: STR_NETWORK_START_SERVER_VISIBILITY_TOOLTIP :{BLACK}Se altre persone possono vedere il tuo server nell'elenco pubblico STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} client STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Limite client: @@ -4607,8 +4605,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(ferma per {STR STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(viaggia per {STRING}, senza orario) STR_TIMETABLE_STAY_FOR :e sosta per {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :e viaggia per {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}giorn{P o i} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}tick STR_TIMETABLE_TOTAL_TIME :{BLACK}Gli ordini richiedono complessivamente {STRING} STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Gli ordini richiedono almeno {STRING} (non tutti i tempi specificati) @@ -4617,10 +4613,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Il veico STR_TIMETABLE_STATUS_LATE :{BLACK}Il veicolo viaggia con un ritardo di {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}Il veicolo viaggia con un anticipo di {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Il viaggio non è ancora iniziato -STR_TIMETABLE_STATUS_START_AT :{BLACK}Il viaggio inizierà in data {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Data iniziale -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Seleziona una data come punto di partenza della tabella oraria. Ctrl+click distribuisce tutti i veicoli che condividono questo ordine in modo uniforme dalla data indicata in base al loro ordine relativo, se l'ordine è completamente programmato. + STR_TIMETABLE_CHANGE_TIME :{BLACK}Cambia tempo STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Cambia la quantità di tempo che dovrebbe essere impiegata per l'ordine selezionato. CTRL+clic imposta il tempo di tutti gli ordini @@ -4644,8 +4638,6 @@ STR_TIMETABLE_EXPECTED :{BLACK}Orari at STR_TIMETABLE_SCHEDULED :{BLACK}Orari programmati STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Alterna fra la visualizzazione degli orari attesi e degli orari programmati -STR_TIMETABLE_ARRIVAL :A: {COLOUR}{DATE_TINY} -STR_TIMETABLE_DEPARTURE :D: {COLOUR}{DATE_TINY} # Date window (for timetable) diff --git a/src/lang/japanese.txt b/src/lang/japanese.txt index baae5c689c..6cd76eec69 100644 --- a/src/lang/japanese.txt +++ b/src/lang/japanese.txt @@ -238,6 +238,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}フィ STR_UNITS_HEIGHT_METRIC :{DECIMAL}m STR_UNITS_HEIGHT_SI :{DECIMAL}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}フィルター: STR_LIST_FILTER_OSKTITLE :{BLACK}フィルタリングするキーワードを入力 @@ -699,8 +700,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}クリ STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}クリックすると、その曲を選択したプレイリストから削除します。(カスタム1/2 のみ) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}{NUM}年まで勤続経営した首位企業 -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}{NUM}の格付順位 STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :実務家 STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :起業家 @@ -1617,8 +1616,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :有効にする STR_CONFIG_SETTING_LOADING_INDICATORS :積み降ろし進行度を表示: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :積み降ろしを行っている輸送機関の上に、その進行度合いを示すインジケーターを表示するかどうかを設定します -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :ダイヤの時間単位にゲーム時を使用: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :ダイヤで行程時間を定めるために使われる時間単位を「日」ではなく「ゲーム時」にします。1日は約74ゲーム時に相当します +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :ダイヤに発着情報を表示: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :時刻表に出発・到着の予定時刻を表示します @@ -4494,8 +4492,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :({STRING}停車 STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :({STRING}で運行・ダイヤ設定無) STR_TIMETABLE_STAY_FOR :して{STRING}停車 STR_TIMETABLE_AND_TRAVEL_FOR :して{STRING}運行 -STR_TIMETABLE_DAYS :{COMMA}日 -STR_TIMETABLE_TICKS :{COMMA}ゲーム時 STR_TIMETABLE_TOTAL_TIME :{BLACK}このダイヤを実行するには{STRING}必要です STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}このダイヤを実行するには少なくとも{STRING}必要です(ダイヤが組まれていない区間があります) @@ -4504,10 +4500,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}この STR_TIMETABLE_STATUS_LATE :{BLACK}この輸送機器は現在{STRING}遅延しています STR_TIMETABLE_STATUS_EARLY :{BLACK}この輸送機器は現在{STRING}早着しています STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}このダイヤはまだ始まってません -STR_TIMETABLE_STATUS_START_AT :{BLACK}このダイヤの開始日時は{STRING}です -STR_TIMETABLE_STARTING_DATE :{BLACK}始発日 -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}始発日時を設定します。Ctrl+クリックでは、指令を共有する輸送機器があり、ダイヤが完全に組まれている場合に限り、その総所要時間に基づき、各輸送機器に指定時刻から均等に始発日時を割り付けます + STR_TIMETABLE_CHANGE_TIME :{BLACK}時間を変更 STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}選択した指令の行程時間を変更します。Ctrl+クリックで全指令に適用します diff --git a/src/lang/korean.txt b/src/lang/korean.txt index fdb3f55a10..8475d13259 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -256,6 +256,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}피트 STR_UNITS_HEIGHT_METRIC :{DECIMAL}m STR_UNITS_HEIGHT_SI :{DECIMAL}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}검색: STR_LIST_FILTER_OSKTITLE :{BLACK}검색할 단어를 하나 이상 입력하세요 @@ -719,8 +720,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}배경 STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}배경 음악 목록에서 음악을 제거하려면 클릭하세요. (사용자1, 사용자2에서만 사용 가능) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}{NUM}년까지 존재한 최고의 회사 목록 -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}{NUM}의 회사 성취도 목록 STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :{G=f}초보자 STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :{G=f}사업가 @@ -1657,8 +1656,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :고급 차량 STR_CONFIG_SETTING_LOADING_INDICATORS :적재율 표시: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :적재나 하차하는 차량 위에 적재/하차율을 표시할지 말지를 선택합니다. -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :열차 시간표의 1일을 74틱으로 바꿔 표시: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :열차 시간표에서 열차의 운행 시간을 '일'보다 자세한 '틱'으로 표시합니다. 1일은 74틱과 같습니다. +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :시간표에서 출발일과 도착일 표시: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :열차 시간표에서 예상 출발 & 도착 시간을 표시합니다. @@ -4567,8 +4565,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :({STRING} 동 STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :({STRING} 동안 운행, 시간표 작성 안 됨) STR_TIMETABLE_STAY_FOR :& {STRING} 동안 정차 STR_TIMETABLE_AND_TRAVEL_FOR :& 다음 목적지({STRING})로 이동 -STR_TIMETABLE_DAYS :{COMMA}일 -STR_TIMETABLE_TICKS :{COMMA}틱 STR_TIMETABLE_TOTAL_TIME :{BLACK}이 시간표는 완주하는데 {STRING}이 걸릴 것입니다. STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}이 시간표를 완주하는데 최소 {STRING}이 필요합니다 (시간표가 일부만 지정됨) @@ -4577,10 +4573,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}이 차 STR_TIMETABLE_STATUS_LATE :{BLACK}이 차량은 현재 {STRING} 늦게 운행하고 있습니다 STR_TIMETABLE_STATUS_EARLY :{BLACK}이 차량은 현재 {STRING} 빨리 운행하고 있습니다 STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}이 시간표는 아직 시작되지 않았습니다 -STR_TIMETABLE_STATUS_START_AT :{BLACK}이 시간표는 {STRING}에 시작될 것입니다 -STR_TIMETABLE_STARTING_DATE :{BLACK}시작 날짜 -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}이 시간표의 시작 날짜를 선택하세요. CTRL+클릭하면, 시간표가 모두 작성되어 있다는 가정 하에, 주어진 경로를 기반으로 설정한 날짜부터 이 경로를 공유하는 모든 차량을 균등하게 출발시킵니다 + STR_TIMETABLE_CHANGE_TIME :{BLACK}시간값 변경 STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}선택한 경로에서 소요되는 시간 값을 변경합니다. CTRL+클릭하면 모든 경로에 그 시간 값을 설정합니다 @@ -4604,8 +4598,6 @@ STR_TIMETABLE_EXPECTED :{BLACK}예정 STR_TIMETABLE_SCHEDULED :{BLACK}예정 소요시간 기준 STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}시간표 검사 기준을 도착 예정일과 도착 예정 시간 기준 중에서 선택합니다 -STR_TIMETABLE_ARRIVAL :도착: {COLOUR}{DATE_TINY} -STR_TIMETABLE_DEPARTURE :착: {COLOUR}{DATE_TINY} # Date window (for timetable) diff --git a/src/lang/latin.txt b/src/lang/latin.txt index 6538c6b495..5ded827f24 100644 --- a/src/lang/latin.txt +++ b/src/lang/latin.txt @@ -415,6 +415,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Series colans: STR_LIST_FILTER_OSKTITLE :{BLACK}Inscribe seriem colantem @@ -859,8 +860,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Preme in STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Preme in carmen ut ex compositione removeatur (modo Propria I aut Propria II) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Societates supremae quae attigerunt {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Album Foederis Societatum in {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Laborator STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Venditor @@ -1681,8 +1680,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Annuere indices STR_CONFIG_SETTING_LOADING_INDICATORS :Signa onerandi adhibenda: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Annuere signa onerandi monstrari super vehicula onerantia/exonerantia -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Monstrare horarium cum punctis et non cum diebus: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Monstrare tempora navigandi in horariis punctis ludi et non diebus +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Monstrare adventum atque exitum in horariis: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Monstrare in horariis adventum atque exitum aestimatum @@ -4276,10 +4274,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(mora {STRING}, STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(iter {STRING}, sine horario) STR_TIMETABLE_STAY_FOR :cum mora {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :cum itinere {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}die{P i rum} -STR_TIMETABLE_DAYS.acc :{COMMA}{NBSP}die{P m s} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}punct{P i orum} -STR_TIMETABLE_TICKS.acc :{COMMA}{NBSP}punct{P um a} STR_TIMETABLE_TOTAL_TIME :{BLACK}Hic horarius peragitur {STRING.acc} STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Hic horarius peragitur saltem {STRING.acc} (omnia non in horario) @@ -4288,10 +4282,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Hoc vehi STR_TIMETABLE_STATUS_LATE :{BLACK}Hoc vehiculum est {STRING.acc} tardum STR_TIMETABLE_STATUS_EARLY :{BLACK}Hoc vehiculum est {STRING.acc} citum STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Hic horarius adhuc non incipitur -STR_TIMETABLE_STATUS_START_AT :{BLACK}Hic horarius incipietur {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Dies Initii -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Elige diem ad initium huius horarii. Ctrl+Preme ut dies initialis huius horarii eligatur ac aequaliter partiuntur omnia vehicula quae hoc iussum communicant secundum ordinem eorum, si iussa tota in horariis sunt + STR_TIMETABLE_CHANGE_TIME :{BLACK}Mutare Tempus STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Mutare durationem iussi electi diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt index 91ce8250e1..e616355e56 100644 --- a/src/lang/latvian.txt +++ b/src/lang/latvian.txt @@ -239,6 +239,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filters: STR_LIST_FILTER_OSKTITLE :{BLACK}Ievadiet vienu vai vairākus atslēgvārdus, lai filtrētu sarakstu @@ -700,8 +701,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Klikšķ STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Klikšķināt uz mūzikas celiņa, lai to izdzēstu no pašreizējās programmas (tikai Pielāgotā1 un Pielāgotā2) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Labākie uzņēmumi, kuri sasnieguši {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Uzņēmumu rangu sarakstā {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Darījumu cilvēks STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Uzņēmējs @@ -1600,8 +1599,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Ieslēgt papild STR_CONFIG_SETTING_LOADING_INDICATORS :Lietot piekraušanas rādītājus: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Izvēlēties piekraušanas rādītāju attēlošanu virs iekraujamiem un izkraujamiem transportlīdzekļiem -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Kustības sarakstu rādīt mirkļos nevis dienās: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Kustības sarakstos laikus rādīt spēles mirkļos, nevis dienās +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Kustības sarakstos rādīt pienākšanu un atiešanu: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Kustības sarakstos rādīt paredzamos pienākšanas un atiešanas laikus @@ -4475,8 +4473,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(stāvēt {STRI STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(ceļot uz {STRING}, nav sarakstā) STR_TIMETABLE_STAY_FOR :un palikt līdz {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :un braukt līdz {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}dien{P a as u} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}tik{P s i u} STR_TIMETABLE_TOTAL_TIME :{BLACK}Šis saraksts aizņems {STRING}, lai pabeigtu STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Šis saraksts aizņems vismaz {STRING} lai pabeigtu (nav viss pēc saraksta) @@ -4485,10 +4481,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Šis tra STR_TIMETABLE_STATUS_LATE :{BLACK}Šis transportlīdzeklis pašlaik {STRING} kavē STR_TIMETABLE_STATUS_EARLY :{BLACK}Šis transportlīdzeklis pašlaik {STRING} par agru STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Šis saraksts vēl nav sācies -STR_TIMETABLE_STATUS_START_AT :{BLACK}Šis saraksts sāksies {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Sākuma datums -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Izvēlieties datumu kā šī kustību saraksta sākuma punktu. Ctrl+Click vienmērīgi sadala visus transportlīdzekļus, kas koplieto šo pasūtījumu no norādītā datuma, pamatojoties uz to plānoto pasūtījumu, ja pasūtījums pilnībā izmanto kustību sarakstu + STR_TIMETABLE_CHANGE_TIME :{BLACK}Mainīt laiku STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Mainiet laiku, kas nepieciešams iezīmētajam pasūtījumam. Ctrl+Click iestata laiku visiem pasūtījumiem diff --git a/src/lang/lithuanian.txt b/src/lang/lithuanian.txt index 39e8ed7a56..0a0f383213 100644 --- a/src/lang/lithuanian.txt +++ b/src/lang/lithuanian.txt @@ -429,6 +429,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Raktažodis: STR_LIST_FILTER_OSKTITLE :{BLACK}Įveskite filtro raktažodį @@ -889,8 +890,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Paspausk STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Spragtelėjus takelį, jis pašalinamas iš dabartinės programos (tik „Speciali 1“ ir „Speciali 2“) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Geriausios kompanijos, kurios pasiekė {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Kompaniju Lygos lentele {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Komersantas STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Verslininkas @@ -1785,8 +1784,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Išplėstinio ( STR_CONFIG_SETTING_LOADING_INDICATORS :Rodyti krovos indikatorius: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Krovos indikatoriai rodomi virš pakraunamų bei iškraunamų tansporto priemonių -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Tvarkaraščio trukmes matuoti vidiniais impulsais, o ne dienomis: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Vieną dieną sudaro keliasdešimt vidinių impulsų +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Rodyti arvykimą ir išvykimą tvarkaraščiuose: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Tvarkaraščiuose rodyti numatomas atvykimo ir išvykimo datas @@ -4667,14 +4665,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(stovėti {STRI STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(vykti {STRING.ka}, neįtraukiant į tvarkaraštį) STR_TIMETABLE_STAY_FOR :ir pasilikti {STRING.ka} STR_TIMETABLE_AND_TRAVEL_FOR :ir keliauti {STRING.ka} -STR_TIMETABLE_DAYS :{G=mot}{COMMA}{NBSP}dien{P a os ų} -STR_TIMETABLE_DAYS.kas :{COMMA} dien{P a os ų} -STR_TIMETABLE_DAYS.ko :{COMMA} dien{P os as ų} -STR_TIMETABLE_DAYS.kam :{COMMA} dien{P ai oms ų} -STR_TIMETABLE_DAYS.ka :{COMMA} dien{P ą as ų} -STR_TIMETABLE_DAYS.kuo :{COMMA} dien{P a omis ų} -STR_TIMETABLE_DAYS.kur :{COMMA} dien{P oje ose ų} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}impuls{P as ai ų} STR_TIMETABLE_TOTAL_TIME :{BLACK}Maršruto trukmė yra {STRING} STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Maršruto trukmė yra mažiausiai {STRING}, nes nustatytos ne visų užduočių trukmės @@ -4683,10 +4673,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Transpor STR_TIMETABLE_STATUS_LATE :{BLACK}Transporto priemonė vėluoja {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}Transporto priemonė skuba {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Tvarkaraštis dar nėra aktyvintas -STR_TIMETABLE_STATUS_START_AT :{BLACK}Tvarkaraštis bus aktyvintas {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Aktyvinimo data -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Tvarkaraštyje pasirinkite pradžios datą. Ctrl+pelės paspaudimas pažymės datą kaip pradžios tašką ir paskirstys visas transporto priemones su tokiais pačiais maršrutais tolygiai pagal jų santykinę poziciją maršrute (jei kryptys maršrute visiškai apibūdintos) + STR_TIMETABLE_CHANGE_TIME :{BLACK}Keisti trukmę STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Keisti pažymėtos užduoties trukmę diff --git a/src/lang/luxembourgish.txt b/src/lang/luxembourgish.txt index e348c1b941..75bd422bab 100644 --- a/src/lang/luxembourgish.txt +++ b/src/lang/luxembourgish.txt @@ -237,6 +237,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filter: STR_LIST_FILTER_OSKTITLE :{BLACK}Gëff een oder méi Wieder an fir d'Lëscht ze filteren @@ -698,8 +699,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Klick op STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Klick op d'Lidd fir et vum aktuellen Programm ze läschen (Benotzerdefinéiert 1 an 2 nëmmen) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Top Firmen déi {NUM} erreecht hunn -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Firmeligatabell {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Businesspersoun STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Entrepreneur @@ -1598,8 +1597,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Schalt d'erweid STR_CONFIG_SETTING_LOADING_INDICATORS :Weist de Luedstatus un: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Wielt aus, ob Luedindikatoren iwwert engem Gefier ugewise ginn oder net, wann et beluede gëtt -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Weis den Zäitplang an Ticken amplaz vun Deeg: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Weist d'Transportdauer an der Zäittafel als Gameticks un, amplaz an Deeg +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Weis Arrivée an Départ am Zäitplang un: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Weis d'geplangten Departen an Arrivéeën an der Zäittafel un @@ -4467,8 +4465,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(bleif während STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(fuer während {STRING}, ouni Zäitplang) STR_TIMETABLE_STAY_FOR :an bleif fir {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :an ënnerwee während {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}D{P ag eeg} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}Tick{P "" er} STR_TIMETABLE_TOTAL_TIME :{BLACK}Dësen Zäitplang brauch {STRING} fir faërdeg ze ginn STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Dësen Zäitplang brauch op manst {STRING} (net all geplangt) @@ -4477,10 +4473,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}D'Gefier STR_TIMETABLE_STATUS_LATE :{BLACK}D'Gefier ass grad {STRING} ze spéit STR_TIMETABLE_STATUS_EARLY :{BLACK}D'Gefier ass grad {STRING} ze fréi STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Dësen Zäitplang gouf nach net gestart -STR_TIMETABLE_STATUS_START_AT :{BLACK}Dësen Zäitplang start um {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Start Datum -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Wiel en Datum als Startpunkt fir dësen Zäitplang. Ctrl+Klick verdeelt all Gefierer mat dësem Optrag gläichméisseg vum Startpunkt op hierem relativen Optrag aus, wann den Optrag komplett mat engem Zäitplang versinn ass + STR_TIMETABLE_CHANGE_TIME :{BLACK}Zäit wiesselen STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Änner Zäit déi den ugewielten Optrag brauche soll. Ctrl+Klick ännert d'Zäit fir all Opträg diff --git a/src/lang/macedonian.txt b/src/lang/macedonian.txt index 1ac4e9b624..0fb16f81bf 100644 --- a/src/lang/macedonian.txt +++ b/src/lang/macedonian.txt @@ -218,6 +218,7 @@ STR_UNITS_FORCE_SI :{DECIMAL} kN STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL} ft STR_UNITS_HEIGHT_SI :{DECIMAL} m + # Common window strings STR_LIST_FILTER_OSKTITLE :{BLACK}Внесете филтер низа STR_LIST_FILTER_TOOLTIP :{BLACK}Внесете клучни зборови за филтрирање на списокот за @@ -637,8 +638,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Клик STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Кликнете на песна за да го отстраните од тековната програма (Прилагодено 1 или 2 Прилагодено само) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Топ компании што постигнаа {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Компанијата табелата во {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Бизнисмен STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Претпријатие @@ -984,6 +983,7 @@ STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Дебелин +###length 3 @@ -1927,6 +1927,7 @@ STR_ORDER_OUT_OF_RANGE :{RED} (След + # Date window (for timetable) diff --git a/src/lang/malay.txt b/src/lang/malay.txt index e26f26da16..fd0ce2af4b 100644 --- a/src/lang/malay.txt +++ b/src/lang/malay.txt @@ -220,6 +220,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL} ka STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL} m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Tapis barisan: STR_LIST_FILTER_OSKTITLE :{BLACK}Masukkan penapis rangkaian @@ -646,8 +647,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Klik pad STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Klik pada lagu untuk mengeluarkan daripada rancangan semasa (Pilihan Diri 1 atau Pilihan Diri 2 sahaja) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Syarikat-syarikat utama yang mencapai {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Jadual Liga Syarikat dalam {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Ahli perniagaan STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Usahawan @@ -1383,7 +1382,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS :Gunakan senarai STR_CONFIG_SETTING_LOADING_INDICATORS :Gunakan penunjuk muatan: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Tunjukkan jadual menggunakan tanda rait dan bukan hari: {STRING} +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Tunjukkan ketibaan dan pelepasan dalam jadual: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Tunjukkan jangkaan waktu ketibaan dan pelepasan dalam jadual @@ -3693,8 +3692,6 @@ STR_TIMETABLE_TRAVEL_NOT_TIMETABLED :Kembara (tanpa STR_TIMETABLE_TRAVEL_FOR :Kembara ke {STRING} STR_TIMETABLE_STAY_FOR :dan tinggal untuk {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :dan kembara untuk {STRING} -STR_TIMETABLE_DAYS :{COMMA} hari -STR_TIMETABLE_TICKS :{COMMA} detik STR_TIMETABLE_TOTAL_TIME :{BLACK}Jadual waktu ini akan mengambil {STRING} untuk menghabis STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Jadual waktu ini akan mengambil sekurangnya {STRING} untuk dilengkapi (bukan semua dijadualkan) @@ -3703,9 +3700,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Kenderaa STR_TIMETABLE_STATUS_LATE :{BLACK}Kenderaan ini sedang bergerak {STRING} lewat STR_TIMETABLE_STATUS_EARLY :{BLACK}Kenderaan ini sedang bergerak {STRING} awal STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Jadual waktu ini belum bermula -STR_TIMETABLE_STATUS_START_AT :{BLACK}Jadual waktu ini akan bermula pada {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Tarikh mula + STR_TIMETABLE_CHANGE_TIME :{BLACK}Tukar Masa STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Tukar tempoh masa bagi jadual waktu yang terpilih diff --git a/src/lang/maltese.txt b/src/lang/maltese.txt index 8ead54ff11..7ffdb59539 100644 --- a/src/lang/maltese.txt +++ b/src/lang/maltese.txt @@ -171,6 +171,7 @@ STR_UNITS_FORCE_SI :{DECIMAL} kN STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL} ft STR_UNITS_HEIGHT_SI :{DECIMAL} m + # Common window strings STR_LIST_FILTER_OSKTITLE :{BLACK}Daħħal sentenza għall-iffiltrar STR_LIST_FILTER_TOOLTIP :{BLACK}Daħħal kelma biex tiffiltra din il-lista għall- @@ -612,6 +613,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS :Uza l-lista avv STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Ippermetti l-uzu tal-listi avvanzati tal-vetturi biex tghaqqad il-vetturi fi gruppi +###length 3 @@ -1293,6 +1295,7 @@ STR_TIMETABLE_TOTAL_TIME :{BLACK}Din l-is + STR_TIMETABLE_CHANGE_SPEED :{BLACK}Промена на брзина STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Промена на Максимална брзина од означената цел diff --git a/src/lang/marathi.txt b/src/lang/marathi.txt index 941d8dbd2c..b48c25162e 100644 --- a/src/lang/marathi.txt +++ b/src/lang/marathi.txt @@ -216,6 +216,7 @@ STR_UNITS_VOLUME_LONG_SI :{DECIMAL} m³ + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}शब्द गाळा: STR_LIST_FILTER_OSKTITLE :{BLACK}गाळेला शब्द प्रविष्ट करा @@ -620,7 +621,6 @@ STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLA STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}स्पष्ट # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}{NUM} स्थान अव्वल कंपन्या STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_NAME :{PRESIDENT_NAME}, {COMPANY} STR_HIGHSCORE_STATS :{BIG_FONT}'{STRING}' ({COMMA}) @@ -919,6 +919,7 @@ STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_ACTIONS :सर्व +###length 3 @@ -1717,6 +1718,7 @@ STR_ORDER_IMPLICIT :(आपोआ + STR_TIMETABLE_CHANGE_TIME :{BLACK}वेळ बदला diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index fb2c08cb1e..faddec4575 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -231,6 +231,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filterstreng: STR_LIST_FILTER_OSKTITLE :{BLACK}Skriv inn søkefilter @@ -691,8 +692,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Klikk p STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Klikk på et musikkspor for å fjerne det fra nåværende program (Gjelder bare egendefinert 1 og 2) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Beste firmaer som nådde {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Firmarangering i {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Forretningsmann STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Entreprenør @@ -1571,8 +1570,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Aktiver bruk av STR_CONFIG_SETTING_LOADING_INDICATORS :Bruk lastingsindikatorer: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Velg hvorvidt lasteindikatorer vises over kjøretøy som lastes eller losses -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Vis rutetabell i antall tikk i stedet for antall dager: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Vis reisetider i tidstabeller i spillets 'tidsenheter' fremfor dager +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Vis ankomst og avgang i rutetabeller: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Vise forventede ankomst- og avgangstider i rutetabeller @@ -4402,8 +4400,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(opphold i {STR STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(reise for {STRING}, ikke oppsatt med rutetabell) STR_TIMETABLE_STAY_FOR :og bli værende i {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :og reis i {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}dag{P "" er} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}tikk STR_TIMETABLE_TOTAL_TIME :{BLACK}Det vil ta {STRING} å fullføre rutetabellen STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Det vil ta minst {STRING} å fullføre denne rutetabellen (rutetabell ikke fullstendig) @@ -4412,10 +4408,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Dette kj STR_TIMETABLE_STATUS_LATE :{BLACK}Dette kjøretøyet er {STRING} for sent ute STR_TIMETABLE_STATUS_EARLY :{BLACK}Dette kjøretøyet er {STRING} for tidlig ute STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Denne rutetabellen har ikke blitt startet ennå -STR_TIMETABLE_STATUS_START_AT :{BLACK}Denne rutetabellen vil bli startet {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Startdato -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Velg startdato for denne rutetabellen. Ctrl + Klikk setter utgangspunktet for denne rutetabellen og distribuerer alle kjøretøy som deler denne ordren jevnt basert på deres relative rekkefølge, hvis ordren har en fullstendig rutetabell. + STR_TIMETABLE_CHANGE_TIME :{BLACK}Endre tid STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Endre varigheten for den merkede ordren diff --git a/src/lang/norwegian_nynorsk.txt b/src/lang/norwegian_nynorsk.txt index 7605587d49..46353cb279 100644 --- a/src/lang/norwegian_nynorsk.txt +++ b/src/lang/norwegian_nynorsk.txt @@ -227,6 +227,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL} fot STR_UNITS_HEIGHT_METRIC :{DECIMAL} m STR_UNITS_HEIGHT_SI :{DECIMAL} m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Søkefilter: STR_LIST_FILTER_OSKTITLE :{BLACK}Skriv inn søkefilter @@ -666,8 +667,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Klikk p STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Klikk på eit musikkspor for å fjerne det frå gjeldande program (Gjeld berre eigendefinert 1 og 2) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Beste firma som nådde {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Firmarangering i {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Forretningsmann STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Entreprenør @@ -1439,7 +1438,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS :Bruk avansert k STR_CONFIG_SETTING_LOADING_INDICATORS :Bruk lasteindikatorar: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Syne rutetabell i tikk i staden for dagar: {STRING} +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Syne ankomst og avferd i rutetabellane: {STRING} @@ -3914,8 +3913,6 @@ STR_TIMETABLE_TRAVEL_FOR_SPEED :Reis i {STRING} STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(reis {STRING}, ikkje på rutetabell) STR_TIMETABLE_STAY_FOR :og bli værande i {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :og reis i {STRING} -STR_TIMETABLE_DAYS :{COMMA} dag{P "" ar} -STR_TIMETABLE_TICKS :{COMMA} tikk STR_TIMETABLE_TOTAL_TIME :{BLACK}Det vil ta {STRING} å gjere ferdig denne rutetabellen STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Det vil ta minst {STRING} å gjere ferdig denne rutetabellen ( ikkje alle på rutetabellen @@ -3924,10 +3921,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Dette k STR_TIMETABLE_STATUS_LATE :{BLACK}Dette køyretøyet er {STRING} for seint STR_TIMETABLE_STATUS_EARLY :{BLACK}Dette køyretøyet er {STRING} for tidleg STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Denne rutetabellen har ikkje starta enda -STR_TIMETABLE_STATUS_START_AT :{BLACK}Startdato for denne rutetabellen er {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Startdato -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Vel startdato for timeplanen. Ctrl+klikk set starttidspunkt for tabellen og spreier køyretøya jamt utover + STR_TIMETABLE_CHANGE_TIME :{BLACK}Byt Tid STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Byt tida den merka ordra skal bruke diff --git a/src/lang/persian.txt b/src/lang/persian.txt index 9a651fcdd1..674f798758 100644 --- a/src/lang/persian.txt +++ b/src/lang/persian.txt @@ -218,6 +218,7 @@ STR_UNITS_FORCE_SI :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP}پا STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}متر + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}متن فیلتر: STR_LIST_FILTER_OSKTITLE :{BLACK}وارد کردن رشته پایش @@ -656,8 +657,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}روی STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}روی آهنگ کلیک کنید تا از برنامه فعلی پاک شوند (فقط لیست سفارشی 1 و سفارشی 2) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}بالانرین شرکت هایی که به مرحله {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}جدول اتحادیه شرکت ها در {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :تاجر STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :موسس شرکت @@ -1357,7 +1356,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS :اسنفاده STR_CONFIG_SETTING_LOADING_INDICATORS :استفاده از نشانه‌های بارگیری/بارگذاری: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :استفاده از تیک(هزارم ثانیه) به جای روز در برنامه ساعتی: {STRING} +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :نشان دادن ورود و خروج در جدول زمانی: {STRING} @@ -3390,6 +3389,7 @@ STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(دستور ک + STR_TIMETABLE_CLEAR_TIME :{BLACK}پاک کردن زمان diff --git a/src/lang/polish.txt b/src/lang/polish.txt index a7b7cfdf1e..ef73759621 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -634,6 +634,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtr: STR_LIST_FILTER_OSKTITLE :{BLACK}Wpisz jedno lub więcej słów kluczowych, aby przefiltrować listę @@ -1097,8 +1098,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Kliknij STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Kliknij na ścieżce muzycznej aby usunąć ją z wybranego programu (Wlasny1 lub Wlasny2) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Ranking firm, które osiągnęły rok {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Ranking Firm w {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Biznesmen STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Przedsiębiorca @@ -2036,8 +2035,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Wlącz obsług STR_CONFIG_SETTING_LOADING_INDICATORS :Pokazuj wskaźniki załadunku: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Wybierz, czy wskaźnik załadunku pokazuje się nad ładowanym/rozładowywanym pojazdem -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Pokazuj rozkłady jazdy w tickach, a nie w dniach: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :W rozkładach jazdy, czas podróży pokaż w tickach gry zamiast w dniach +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Pokazuj przyjazdy i odjazdy w rozkładach: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Wyświetlanie przewidywanego przyjazdu i odjazdu w rozkładach @@ -4952,8 +4950,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(postój w {STR STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(przejazd przez {STRING} poza rozkładem) STR_TIMETABLE_STAY_FOR :i zostań tam przez {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :i podróżuje przez{STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}d{P zień ni ni} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}tick{P "" i ów} STR_TIMETABLE_TOTAL_TIME :{BLACK}Ten rozkład jazdy zajmie {STRING} STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Ten rozkład jazdy zajmie przynajmniej {STRING} (nie wszystkie stacje są na rozkładzie) @@ -4962,10 +4958,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Ten poja STR_TIMETABLE_STATUS_LATE :{BLACK}Ten pojazd jest teraz spóźniony o {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}Ten pojazd spieszy się teraz o {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Ten rozkład jazdy jeszcze się nie rozpoczął -STR_TIMETABLE_STATUS_START_AT :{BLACK}Ten rozkład jazdy rozpocznie się {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Data początkowa -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Wybierz początkową datę rozkładu jazdy. Ctrl+klik rozłoży równomierne wszystkie pojazdy współdzielące ten rozkład, począwszy od podanej daty, zgodnie z ich kolejnością, o ile rozkład ten jest kompletny + STR_TIMETABLE_CHANGE_TIME :{BLACK}Zmień czas STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Zmień ilość czasu, jaką powinno zająć zaznaczone polecenie. Ctrl+klik ustala czas dla wszystkich poleceń @@ -4989,8 +4983,6 @@ STR_TIMETABLE_EXPECTED :{BLACK}Wymagany STR_TIMETABLE_SCHEDULED :{BLACK}Zaplanowany STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Przełącz między spodziewanymi i zaplanowanymi -STR_TIMETABLE_ARRIVAL :P: {COLOUR}{DATE_TINY} -STR_TIMETABLE_DEPARTURE :O: {COLOUR}{DATE_TINY} # Date window (for timetable) diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 9adc82c7dc..f48132918e 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -256,6 +256,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL} pé(s STR_UNITS_HEIGHT_METRIC :{DECIMAL} m STR_UNITS_HEIGHT_SI :{DECIMAL} m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtro: STR_LIST_FILTER_OSKTITLE :{BLACK}Insira uma ou mais palavras-chave para filtrar a lista @@ -719,8 +720,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Clique n STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Faça clique numa faixa para a remover da lista (Personaliz. 1 ou Personaliz. 2 apenas) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Top de empresas que chegaram a {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Tabela de Liga de Empresas em {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Negociante STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Empresário @@ -1657,8 +1656,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Ativar a utiliz STR_CONFIG_SETTING_LOADING_INDICATORS :Usar indicadores de carga: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Seleccionar se os indicadores de carga são mostrados acima de veículos em carga ou descarga -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Mostrar horário em tics em vez de dias: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Mostrar tempos de viagem nos horários em ticks de jogo em vez de dias +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Mostrar chegada e partida nos horários: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Mostrar horários previstos de chegada e partida nas tabelas de horários @@ -4567,8 +4565,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(permanecer dur STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(viajar durante {STRING}, sem programação) STR_TIMETABLE_STAY_FOR :e ficar durante {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :e viaja para {STRING} -STR_TIMETABLE_DAYS :{COMMA} dia{P "" s} -STR_TIMETABLE_TICKS :{COMMA} tic{P "" s} STR_TIMETABLE_TOTAL_TIME :{BLACK}Este horário vai levar {STRING} a completar STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Este horário vai levar pelo menos {STRING} a completar (nem tudo está programado) @@ -4577,10 +4573,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Este ve STR_TIMETABLE_STATUS_LATE :{BLACK}Este veículo está presentemente atrasado {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}Este veículo está presentemente adiantado {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Este horário ainda não começou -STR_TIMETABLE_STATUS_START_AT :{BLACK}Este horário começa a {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Data de início -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Selecione uma data como ponto de partida deste horário. Ctrl+Clique distribui uniformemente todos os veiculos partilhando esta ordem pela sua ordem relativa, se a ordem for completamente calendarizada + STR_TIMETABLE_CHANGE_TIME :{BLACK}Mudar Tempo STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Mudar a duração do tempo que a ordem selecionada deve durar. Ctrl+Clique define o tempo para todas as ordens @@ -4604,8 +4598,6 @@ STR_TIMETABLE_EXPECTED :{BLACK}Esperado STR_TIMETABLE_SCHEDULED :{BLACK}Marcado STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Alternar entre tempo esperado e marcado -STR_TIMETABLE_ARRIVAL :C: {COLOUR}{DATE_TINY} -STR_TIMETABLE_DEPARTURE :P: {COLOUR}{DATE_TINY} # Date window (for timetable) diff --git a/src/lang/romanian.txt b/src/lang/romanian.txt index dcca6dc1f5..c3cd99252c 100644 --- a/src/lang/romanian.txt +++ b/src/lang/romanian.txt @@ -255,6 +255,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL} ft STR_UNITS_HEIGHT_METRIC :{DECIMAL} m STR_UNITS_HEIGHT_SI :{DECIMAL} m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtru: STR_LIST_FILTER_OSKTITLE :{BLACK}Introduceți unul sau mai multe cuvinte cheie pentru a filtra lista @@ -718,8 +719,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Click pe STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Apasă pe melodie pentru a o elimina din programul actual (doar Custom1 sau Custom2) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Primele companii care au atins {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Clasamentul companiilor în {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Om de afaceri STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Întreprinzător @@ -1654,8 +1653,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Activează folo STR_CONFIG_SETTING_LOADING_INDICATORS :Foloseşte indicatorii de încărcare: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Alege dacă indicatori de încărcare sunt afișați deasupra unor vehicule care sunt în proces de încărcare sau descărcare -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Arată orarul pe programări în unități de timp interne în loc de zile: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Arată timpii de călătorie în tabela cu timpi a jocului folosind unități de timp interne în loc de zile +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Afișează plecările și sosirile din orare: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Arată timpii estimați de plecare și sosire din orar @@ -4564,8 +4562,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(staționare pe STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(călătorie pentru {STRING}, neprogramată) STR_TIMETABLE_STAY_FOR :și staționare pentru {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :și călătorește timp de {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}{P zi zile "de zile"} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}{P unitate unități "de unități"} de timp intern{P ă e e} STR_TIMETABLE_TOTAL_TIME :{BLACK}Acest orar va lua {STRING} pentru finalizare STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Acest orar va lua cel puțin {STRING} pentru finalizare (nu în întregime programat) @@ -4574,10 +4570,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Acest ve STR_TIMETABLE_STATUS_LATE :{BLACK}Vehiculul are întârziere de {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}Momentan, acest vehicul și-a devansat programul {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Acest orar nu a început încă -STR_TIMETABLE_STATUS_START_AT :{BLACK}Acest orar va începe la {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Dată pornire -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Alege o dată ca punct de pornire pentru acest orar. Ctrl+clic distribuie toate vehiculele uniform de la data setată bazată pe comenzile relative, dacă comenzile au un orar complet + STR_TIMETABLE_CHANGE_TIME :{BLACK}Modifică timpul STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Modificați timpul pe care ar trebui să o dureze comanda evidențiată. Ctrl+Click setează ora pentru toate comenzile @@ -4601,8 +4595,6 @@ STR_TIMETABLE_EXPECTED :{BLACK}Estimat STR_TIMETABLE_SCHEDULED :{BLACK}Planificat STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Comută între estimare şi orar -STR_TIMETABLE_ARRIVAL :S: {COLOUR}{DATE_TINY} -STR_TIMETABLE_DEPARTURE :P: {COLOUR}{DATE_TINY} # Date window (for timetable) diff --git a/src/lang/russian.txt b/src/lang/russian.txt index 44f56ae725..3d73c6f08e 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -381,6 +381,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}м STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}м + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Фильтр: STR_LIST_FILTER_OSKTITLE :{BLACK}Введите ключевые слова для фильтрации списка @@ -856,8 +857,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Щёлк STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Выберите трек для удаления из пользовательского списка # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Крупнейшие компании, достигшие {NUM} года -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Порядковая таблица компаний в {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Бизнесмен STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN.abl :бизнесменом @@ -1807,8 +1806,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Включит STR_CONFIG_SETTING_LOADING_INDICATORS :Показывать индикатор загрузки: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Отображение индикаторов загрузки над загружающимся и разгружающимся транспортом -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Графики движения в «тиках», а не днях: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Измерять время в графиках движения игровыми «тиками», а не днями. 1 день равен 74 «тикам». +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Показывать время прибытия и отправления в графиках: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Показывать ожидаемое время прибытия и отправления в графиках движения @@ -2497,7 +2495,7 @@ STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}Назв STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Установить пароль STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Защитите вашу игру паролем, если не хотите, чтобы к ней могли подключиться посторонние. -STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Видимость +STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Видимость: STR_NETWORK_START_SERVER_VISIBILITY_TOOLTIP :{BLACK}Видимость вашего сервера в публичном списке STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} клиент{P "" а ов} STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Макс. количество клиентов: @@ -4753,8 +4751,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(ждать {ST STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(в пути {STRING}, график не составлен) STR_TIMETABLE_STAY_FOR :и ждать {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :и идти в {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}д{P ень ня ней} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}тик{P "" а ов} STR_TIMETABLE_TOTAL_TIME :{BLACK}Весь маршрут займёт {STRING} STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Движение по маршруту займёт {STRING} (не всё учтено) @@ -4763,10 +4759,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Этот STR_TIMETABLE_STATUS_LATE :{BLACK}Этот транспорт опаздывает на {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}Этот транспорт опережает график на {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}График движения ещё не установлен -STR_TIMETABLE_STATUS_START_AT :{BLACK}Отсчёт времени начнётся с {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Начальная дата -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Выберите начальную дату для этого графика. Ctrl+щелчок равномерно распределит все транспортные средства, следующие по этому маршруту, если время движения по нему полностью рассчитано. + STR_TIMETABLE_CHANGE_TIME :{BLACK}Изменить время STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Изменить время исполнения выделенного задания. Ctrl+щелчок устанавливает время для всех заданий. @@ -4790,8 +4784,6 @@ STR_TIMETABLE_EXPECTED :{BLACK}Ожид STR_TIMETABLE_SCHEDULED :{BLACK}График STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Переключение между графиком движения и ожидаемым временем прибытия/отправления -STR_TIMETABLE_ARRIVAL :Приб: {COLOUR}{DATE_TINY} -STR_TIMETABLE_DEPARTURE :Отпр: {COLOUR}{DATE_TINY} # Date window (for timetable) diff --git a/src/lang/serbian.txt b/src/lang/serbian.txt index d318688421..b92d562f13 100644 --- a/src/lang/serbian.txt +++ b/src/lang/serbian.txt @@ -425,6 +425,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL} ft STR_UNITS_HEIGHT_METRIC :{DECIMAL} m STR_UNITS_HEIGHT_SI :{DECIMAL} m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Pretraga: STR_LIST_FILTER_OSKTITLE :{BLACK}Unesi jednu ili više ključnih reči za pretragu liste @@ -886,8 +887,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Klik na STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Klik na muzičku numeru radi uklanjanja sa trenutnog rasporeda (samo za Custom1 ili Custom2) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Najbolja preduzeća koja su dostigla {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}{NUM} u Tabeli Lige Preduzeća STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Poslovna osoba STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN.gen :poslovne osobe @@ -1791,8 +1790,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Omogući upotre STR_CONFIG_SETTING_LOADING_INDICATORS :Koristiti pokazatelj utovarivanja: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Odaberi da li će se prikazati indikatori utovara i istovara iznad vozila -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Prikazati red vožnje u diskretnim otkucajima: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Prikaži vreme putovanja u redu vožnje u diskretnim otkucajima umesto u danima +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Prikazivanje polaska i dolaska u rasporedima: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Prikazivanje očekivanog vremena dolaska i odlaska u rasporedima @@ -4670,8 +4668,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(stajanje za {S STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(putovanje za {STRING}, bez rasporeda) STR_TIMETABLE_STAY_FOR :i ostani {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :i putuj {STRING} -STR_TIMETABLE_DAYS :{COMMA} dan{P "" a a} -STR_TIMETABLE_TICKS :{COMMA} utkucaj{P "" a a} STR_TIMETABLE_TOTAL_TIME :{BLACK}Za završetak rasporeda trebaće {STRING} STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Za završetak rasporeda trebaće barem {STRING} (merenja nisu završena) @@ -4680,10 +4676,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Vozilo t STR_TIMETABLE_STATUS_LATE :{BLACK}Vozilo trenutno kasni za {STRING} od rasporeda STR_TIMETABLE_STATUS_EARLY :{BLACK}Vozilo trenutno žuri za {STRING} od rasporeda STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Ovaj raspored još nije počeo -STR_TIMETABLE_STATUS_START_AT :{BLACK}Ovaj raspored počinje {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Datum početka -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Izaberi datum kao početak ovog rasporeda. Ctrl+klik jednako raspoređuje sva vozila koja dele ovu naredbu od datog datuma prema njihovom rasporedu, ukoliko je naredba u potpunosti unesena u vozni red + STR_TIMETABLE_CHANGE_TIME :{BLACK}Promena vremena STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Promena količine vremena za koje će obeležena naredba trajati. Ctrl+klik podešava vreme za sve naredbe diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index fa50a9e4d0..6ab2b8c4c6 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -255,6 +255,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}米 STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}米 + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}关键字词: STR_LIST_FILTER_OSKTITLE :{BLACK}输入关键字筛选 @@ -718,8 +719,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}点击 STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}点击音乐曲目以从当前播放列表中删除{}(仅限自定义1或自定义2) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}达到 {NUM} 的顶级公司! -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}在{NUM}年,公司表现值排名 STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :运输个体户 STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :运输代理商 @@ -1655,8 +1654,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :允许使用高 STR_CONFIG_SETTING_LOADING_INDICATORS :使用装货进度指示: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :选择是否在车辆上方显示装卸货物进度 -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :使用时间标记而不是天为单位: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :时间表以ticks而不是天显示。 +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :在时刻表中显示到达时间和出发时间: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :在时刻表中显示预期的到达和出发时间 @@ -4565,8 +4563,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(停靠 {STRING STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(驶往 {STRING}, 无时间表) STR_TIMETABLE_STAY_FOR :并且停留 {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :并行驶{STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}天 -STR_TIMETABLE_TICKS :{COMMA}{NBSP}个时间标记 STR_TIMETABLE_TOTAL_TIME :{BLACK}该时间表需要 {STRING} 完成 STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}该时间表至少需要 {STRING} 完成(并非全部计划的时间) @@ -4575,10 +4571,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}该车 STR_TIMETABLE_STATUS_LATE :{BLACK}该车辆目前晚点 {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}该车辆目前提前 {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}此时刻表尚未开始 -STR_TIMETABLE_STATUS_START_AT :{BLACK}此时刻表将于 {STRING} 开始 -STR_TIMETABLE_STARTING_DATE :{BLACK}起始日期 -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}选择一个时间作为此时间表的起始日期。按住Ctrl键单击将会给所有共享此时刻表的车辆指定一个时间,以使所有共享车辆保持运行间隔,但前提是时间表已为所有命令设定计划执行时间。 + STR_TIMETABLE_CHANGE_TIME :{BLACK}改变时间 STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}改变高亮选择的命令执行的时间,按住Ctrl单击可为所有命令设置时间 @@ -4602,8 +4596,6 @@ STR_TIMETABLE_EXPECTED :{BLACK}预期 STR_TIMETABLE_SCHEDULED :{BLACK}表定时间 STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}切换显示(根据实际情况计算的)预期时间或表定时间 -STR_TIMETABLE_ARRIVAL :A: {COLOUR}{DATE_TINY} -STR_TIMETABLE_DEPARTURE :D: {COLOUR}{DATE_TINY} # Date window (for timetable) diff --git a/src/lang/slovak.txt b/src/lang/slovak.txt index e04ca99626..7a01b41ad6 100644 --- a/src/lang/slovak.txt +++ b/src/lang/slovak.txt @@ -318,6 +318,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL} st{P STR_UNITS_HEIGHT_METRIC :{DECIMAL} m STR_UNITS_HEIGHT_SI :{DECIMAL} m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filter: STR_LIST_FILTER_OSKTITLE :{BLACK}Vložiť aspoň jedno klúčové slovo pre filtrovanie @@ -779,8 +780,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Kliknú STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Kliknite na hudobnú stopu pre jej odstránenie z programu (len Vlastný1 alebo Vlastný2) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Najlepšie spoločnosti, ktoré dosiahli rok {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Tabuľka spoločnosti v roku {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Obchodník STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN.g :Obchodníci @@ -1704,8 +1703,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Povolí použit STR_CONFIG_SETTING_LOADING_INDICATORS :Zobraziť ukazovatele nakladania/vykladania: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Zvoľte či indikátory nakladania/vykladania budú zobrazené nad vozidlom. -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Zobraziť cestovné poriadky v tiknutiach namiesto dní: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Zobrazí časy cestovania v cestovnom poriadku v herných tiknutiach namiesto dní +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Zobraziť príchody a odchody v cestovných poriadkoch: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Zobrazí predpokladané časy príchodov a odchodov v časových rozpisoch. @@ -4583,8 +4581,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(prestávka {ST STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(cesta {STRING}, nerozvrhnuté) STR_TIMETABLE_STAY_FOR :prestávka {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :a cestuj {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}d{P eň ni ní} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}tiknut{P ie ia í} STR_TIMETABLE_TOTAL_TIME :{BLACK}Na dokončenie cestovného poriadku je potrebných {STRING} STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Na dokončenie cestovného poriadku je potrebných aspoň {STRING} (nie všetko je určené) @@ -4593,10 +4589,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Toto voz STR_TIMETABLE_STATUS_LATE :{BLACK}Toto vozidlo mešká {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}Toto vozidlo ide {STRING} skôr STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Tento cestovný poriadok ešte nezačal -STR_TIMETABLE_STATUS_START_AT :{BLACK}Tento cestovný poriadok začne {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Začiatočný dátum -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Vyberte dátum začiatku cestovného poriadku. Ctrl+klik rozdelí od daného dátumu rovnomerne všetky vozidlá zdieľajúce tieto príkazy na základe ich relatívneho poradia, ak je cestovný poriadok kompletne vyplnený + STR_TIMETABLE_CHANGE_TIME :{BLACK}Zmeniť čas STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Zmeniť dĺžku trvania označeného príkazu. Ctrl+klik nastaví čas pre všetky príkazy @@ -4620,8 +4614,6 @@ STR_TIMETABLE_EXPECTED :{BLACK}Očakáv STR_TIMETABLE_SCHEDULED :{BLACK}Plánované STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Prepnúť medzi očakávaným a plánovaným -STR_TIMETABLE_ARRIVAL :P: {COLOUR}{DATE_TINY} -STR_TIMETABLE_DEPARTURE :O: {COLOUR}{DATE_TINY} # Date window (for timetable) diff --git a/src/lang/slovenian.txt b/src/lang/slovenian.txt index 4425bcc73b..7c28205376 100644 --- a/src/lang/slovenian.txt +++ b/src/lang/slovenian.txt @@ -378,6 +378,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL} ft STR_UNITS_HEIGHT_METRIC :{DECIMAL} m STR_UNITS_HEIGHT_SI :{DECIMAL} m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtriraj niz: STR_LIST_FILTER_OSKTITLE :{BLACK}Vnesite niz za filtriranje @@ -819,8 +820,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Klikni n STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Klikni na skladbo, če jo želiš odstraniti iz programa (samo Poljubno1 ali Poljubno2) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Najboljša podjetja, ki so dosegla {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Seznam najboljših podjetij v {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Poslovnež STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Podjetnik @@ -1632,8 +1631,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Omogoči uporab STR_CONFIG_SETTING_LOADING_INDICATORS :Uporabi pregledno polnenje: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Izbira prikaza stanja med polnjenjem vozil. -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Prikaz urnikov v pikah namesto dneh: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Prikaži čase potovanja v časovnih tabelah kot enote igre namesto dni. +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Prikaži prihod in odhod v urnikih: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Prikaži pričakovane čase odhodov in prihodov v časovnih tabelah. @@ -4167,8 +4165,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(počakaj najve STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(Potuj z največ {STRING}, brez časovne tabele) STR_TIMETABLE_STAY_FOR :in ostani za {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :s potovanjem za {STRING} -STR_TIMETABLE_DAYS :{COMMA} d{P an neva nevi ni} -STR_TIMETABLE_TICKS :{COMMA} pik{P a i e ""} STR_TIMETABLE_TOTAL_TIME :{BLACK}Ta urnik bo potreboval {STRING} do zaključka STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Ta urnik bo potreboval vsaj {STRING} do zaključka (ni vse zajeto v urniku) @@ -4177,10 +4173,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}To vozil STR_TIMETABLE_STATUS_LATE :{BLACK}To vozilo zamuja za {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}To vozilo prehiteva za {STRING} . STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Ta urnik se še ni začel -STR_TIMETABLE_STATUS_START_AT :{BLACK}Ta urnik se bo začel ob {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Začetni datum -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Izberi datum za začetek te časovne tabele. Ctrl+klik nastavi začetek te časovne tabele in razporedi vsa vozila, ki si delijo ta ukaz, enakomerno glede na njihov relativni ukaz, če je ta popolnoma naravnan po časovni tabeli + STR_TIMETABLE_CHANGE_TIME :{BLACK}Spremeni čas STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Spremeni čas, ki naj bi ga označeni ukaz porabil diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt index 6450180b39..1c27e5fd52 100644 --- a/src/lang/spanish.txt +++ b/src/lang/spanish.txt @@ -238,6 +238,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtro: STR_LIST_FILTER_OSKTITLE :{BLACK}Introduce texto para filtrar @@ -699,8 +700,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Clica en STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Clica sobre la canción para quitarla del programa actual (solo Personalizado1 y 2) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Top de empresas que han alcanzado {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Tabla clasificatoria de empresas en {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Persona de negocios STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Empresario @@ -1599,8 +1598,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Activa el uso d STR_CONFIG_SETTING_LOADING_INDICATORS :Usar indicadores de carga: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Permite escoger si se deben de mostrar indicadores de carga encima de los vehículos que están en estaciones -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Mostrar horario en tics en vez de en días: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Muestra los tiempos de viaje en los horarios en tics en lugar de en días +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Mostrar salidas y llegadas en los horarios: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Muestra fechas de llegada y salida previstas en los horarios @@ -4466,8 +4464,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(permanecer {ST STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(viajar durante {STRING}, sin programar) STR_TIMETABLE_STAY_FOR :y permanecer {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :y viajar durante {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}día{P "" s} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}tic{P "" s} STR_TIMETABLE_TOTAL_TIME :{BLACK}El horario tardará {STRING} en recorrerse STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}El horario tardará al menos {STRING} en recorrerse (no todas las órdenes) @@ -4476,10 +4472,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Este veh STR_TIMETABLE_STATUS_LATE :{BLACK}Este vehículo actualmente está retrasado {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}Este vehículo actualmente está adelantado {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Este horario no ha comenzado -STR_TIMETABLE_STATUS_START_AT :{BLACK}Este horario comenzará el {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Fecha de inicio -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Selecciona la fecha de inicio del horario. Ctrl+click distribuye uniformemente todos los vehículos que compartan este horario a partir de la fecha proporcionada, basados en su orden relativo, siempre que el horario esté completamente rellenado + STR_TIMETABLE_CHANGE_TIME :{BLACK}Modificar duración STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Modifica la duración de la orden seleccionada. Ctrl+clic establece la duración para todas las órdenes diff --git a/src/lang/spanish_MX.txt b/src/lang/spanish_MX.txt index 6233052156..c73c53cd4e 100644 --- a/src/lang/spanish_MX.txt +++ b/src/lang/spanish_MX.txt @@ -238,6 +238,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtrar: STR_LIST_FILTER_OSKTITLE :{BLACK}Indicar texto a filtrar @@ -699,8 +700,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Clic en STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Clic en la pista de música para quitarla del programa actual (solo Personal 1 y 2) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Lista de empresas que han llegado a {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Tabla de clasificación de empresas en {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Empresario(a) STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Empresario @@ -1599,8 +1598,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Activar el uso STR_CONFIG_SETTING_LOADING_INDICATORS :Usar indicadores de carga: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Mostrar indicadores sobre los vehículos mientras cargan o descargan -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Mostrar tiempo de viaje en ticks en lugar de días: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Mostrar los tiempos de viaje en los itinerarios en impulsos de reloj de sistema (ticks) en lugar de días +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Mostrar salidas y llegadas en itinerarios: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Mostrar tiempos anticipados de llegadas y salidas en los itinerarios @@ -4467,8 +4465,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(esperar {STRIN STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(viajar {STRING}, no programado) STR_TIMETABLE_STAY_FOR :y esperar {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :y viajar {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}día{P "" s} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}tick{P "" s} STR_TIMETABLE_TOTAL_TIME :{BLACK}El itinerario completo se recorre en {STRING} STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}El itinerario completo se recorre en {STRING} (no todo programado) @@ -4477,10 +4473,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Este veh STR_TIMETABLE_STATUS_LATE :{BLACK}Este vehículo va retrasado por {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}Este vehículo va adelantado por {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Este itinerario no ha comenzado -STR_TIMETABLE_STATUS_START_AT :{BLACK}Este itinerario comenzará el {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Fecha de inicio -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}Modifica la cantidad de tiempo que la orden seleccionada debe tomar. Ctrl+clic modifica la duración para todas las órdenes diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index 914b670c1d..8749a84be0 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -255,6 +255,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Sökfilter: STR_LIST_FILTER_OSKTITLE :{BLACK}Skriv in ett eller flera sökord att filtrera listan efter @@ -716,8 +717,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Klicka p STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Klicka på ett musikstycke för att ta bort det från spellistan (endast Personlig1 och Personlig2) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}De bästa företagen som nådde {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Företagslista för {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Affärsman STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Entreprenör @@ -1651,8 +1650,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Möjliggör anv STR_CONFIG_SETTING_LOADING_INDICATORS :Använd lastningsindikatorer: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Välj om lastningsindikatorer visas ovanför lastande och avlastande fordon, eller ej -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Visa tidtabeller räknat i ticks istället för dagar: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Visa restider i tidtabeller i antal tick istället för dagar +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Visa ankomster och avgångar i tidtabeller: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Visa förväntade ankomst- och avgångstider i tidtabeller @@ -4545,8 +4543,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(stanna {STRING STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(resor för {STRING}, ej schemalagd) STR_TIMETABLE_STAY_FOR :och stanna i {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :och res i {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}dag{P "" ar} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}tick STR_TIMETABLE_TOTAL_TIME :{BLACK}Den här tidtabellen kommer ta {STRING} att slutföra STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Denna tidtabell kommer att ta åtminstone {STRING} att slutföra (allt är inte inlagt i en tidtabell) @@ -4555,10 +4551,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Detta fo STR_TIMETABLE_STATUS_LATE :{BLACK}Detta fordon är för tillfället {STRING} sen STR_TIMETABLE_STATUS_EARLY :{BLACK}Detta fordon är för tillfället {STRING} tidig STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Den här tidtabellen har inte startat ännu -STR_TIMETABLE_STATUS_START_AT :{BLACK}Den här tidtabellen kommer starta {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Startdatum -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Välj ett datum som startpunkt för den här tidtabellen. Om tidtabellen är fullt tidssatt så gör ett Ctrl+klick alla fordon som delar dessa order fördelas jämt från det givna datumet, baserat på deras relativa ordning + STR_TIMETABLE_CHANGE_TIME :{BLACK}Ändra tid STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Ändra hur lång tid den markerade ordern bör ta. Ctrl+klick ställer in tiden för alla ordrar @@ -4582,8 +4576,6 @@ STR_TIMETABLE_EXPECTED :{BLACK}Förvän STR_TIMETABLE_SCHEDULED :{BLACK}Schemalagt STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Ändra mellan förväntat och schemalagt -STR_TIMETABLE_ARRIVAL :A: {COLOUR}{DATE_TINY} -STR_TIMETABLE_DEPARTURE :D: {COLOUR}{DATE_TINY} # Date window (for timetable) diff --git a/src/lang/tamil.txt b/src/lang/tamil.txt index 1d164e49ee..577a6f955e 100644 --- a/src/lang/tamil.txt +++ b/src/lang/tamil.txt @@ -229,6 +229,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}மீ STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}மீ + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}வடிகட்டி தொடர்: STR_LIST_FILTER_OSKTITLE :{BLACK}Enter filter string @@ -674,8 +675,6 @@ STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}நி STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}தற்போதைய பிரோகிராமிலிருந்து இசைத்தடத்தினை நீக்க சொடுக்கவும் (பயனரால் மாற்றப்பட்ட1 அல்லது 2 மட்டும்) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}{NUM} அடைந்த சிறந்த நிறுவனங்கள் -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}நிறுவனங்களின் பட்டியல் {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :வியாபாரி STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :தொழில்முனைவோர் @@ -1456,8 +1455,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :வாகனங STR_CONFIG_SETTING_LOADING_INDICATORS :ஏற்றுதல் குறிகாட்டிகளைப் பயன்படுத்தவும்: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :வாகனங்களை ஏற்றுவதற்கு அல்லது இறக்குவதற்கு மேலே ஏற்றுதல் குறிகாட்டிகள் காட்டப்படுகிறதா என்பதைத் தேர்ந்தெடுக்கவும் -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :கால அட்டவணையை நாட்களில் அல்லாமல் சொடுக்குகளில் காட்டு: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :கால அட்டவணையை நாட்களில் அல்லாமல் சொடுக்குகளில் காட்டு +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :கால அட்டவணைகளில் காலங்களைக் காட்டவும்: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :எதிர்பார்த்த வருகை மற்றும் புறப்படும் நேரங்களை கால அட்டவணையில் காட்டவும் @@ -3999,8 +3997,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :({STRING} வ STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(பயணி {STRING}, நேர அட்டவணை இடப்படாதது) STR_TIMETABLE_STAY_FOR :மற்றும் {STRING} இற்கு நிற்கவும் STR_TIMETABLE_AND_TRAVEL_FOR :மற்றும் {STRING} இற்கு பயணிக்கவும் -STR_TIMETABLE_DAYS :{COMMA}{NBSP}நாள்{P "" "நாட்கள்"} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}நொடி{P "" கள்} STR_TIMETABLE_TOTAL_TIME :{BLACK}இந்த கால அட்டவணை முடிய {STRING} காலமாகும் STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}இந்த கால அட்டவணை முடிய குரைந்தபட்சம் {STRING} காலமாவது ஆகும்.(ஏனெனில் அனைத்தும் கால அட்டவணைபடவில்லை) @@ -4009,9 +4005,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}இந STR_TIMETABLE_STATUS_LATE :{BLACK}இந்த வாகனம் {STRING} காலதாமதமாக ஓடிக்கொண்டிருக்கிறது STR_TIMETABLE_STATUS_EARLY :{BLACK}இந்த வாகனம் {STRING} சீக்கிரமாக ஓடிக்கொண்டிருக்கிறது STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}கால அட்டவணை இன்னும் தொடங்கவில்லை -STR_TIMETABLE_STATUS_START_AT :{BLACK}இந்த கால அட்டவணை {STRING} அன்று தொடங்கும் -STR_TIMETABLE_STARTING_DATE :{BLACK}ஆரம்ப தேதி + STR_TIMETABLE_CHANGE_TIME :{BLACK}நேரத்தை மாற்று STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}இந்தக் கட்டளையின் கால அளவினை மாற்றவும் diff --git a/src/lang/thai.txt b/src/lang/thai.txt index 1eb2d8a276..cb5798c642 100644 --- a/src/lang/thai.txt +++ b/src/lang/thai.txt @@ -226,6 +226,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL} ฟ STR_UNITS_HEIGHT_METRIC :{DECIMAL} เมตร STR_UNITS_HEIGHT_SI :{DECIMAL} ม. + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}คำกรอง: STR_LIST_FILTER_OSKTITLE :{BLACK}ใส่คำกรอง @@ -671,8 +672,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}คล STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}คลิกที่ชื่อเพลงเพื่อลบออกจากโปรแกรม (Custom1 or Custom2 เท่านั้น) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}บริษัทชั้นนำที่ก้าวไปสู่ {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}ตารางแสดงการแข่งขันของบริษัทใน {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :นักธุรกิจ STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :ผู้ประกอบการ @@ -1490,8 +1489,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :เปิดใ STR_CONFIG_SETTING_LOADING_INDICATORS :แสดงสถานะการขนถ่ายเมื่อกำลังขนถ่ายที่สถานี: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :เลือกเพื่อแสดงตัวเลขปริมาณการบรรทุกขณะขนถ่ายที่สถานีของพาหนะ -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :แสดงตารางเวลาในแบบติ๊กแทนแบบวัน: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :แสดงเวลาในการเดินทางในตารางเวลาเป็น ticks แทนที่ days +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :แสดงเวลามาถึงและออกไปในตารางเวลา: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :แสดงการคาดการณ์เวลาในการเดินทางไปถึงหรือเวลาออกของยานพาหนะในตารางเวลา @@ -4128,8 +4126,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(ตารา STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(ตารางการเดินทางของ {STRING}, ไม่ได้ถูกกำหนดเวลาไว้) STR_TIMETABLE_STAY_FOR :หยุดเป็นเวลา {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :และเดินทาง {STRING} -STR_TIMETABLE_DAYS :{COMMA} วัน -STR_TIMETABLE_TICKS :{COMMA} tick STR_TIMETABLE_TOTAL_TIME :{BLACK}ตารางเวลานี้เสร็จสิ้นโดยใช้เวลาทั้งหมด {STRING} STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}ตารางเวลานี้ใช้เวลารวมทั้งสิ้น {STRING} (และยังไม่สมบูรณ์) @@ -4138,10 +4134,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}ยา STR_TIMETABLE_STATUS_LATE :{BLACK}ยานพาหนะนี้เดินทางช้ากว่าเวลาปกติอยู่ {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}ยานพาหนะนี้เดินทางเร็วกว่าเวลาปกติอยู่ {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}ตารางเวลายังไม่เริ่มต้น -STR_TIMETABLE_STATUS_START_AT :{BLACK}ตารางเวลานี้จะเริ่มใน {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}วันที่เริ่มต้น -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}เลือกวันที่ที่จะให้เริ่มต้นตารางเวลา. Ctrl+Click เพื่อให้ยานพาหนะที่ใช้ตารางเวลานี้เริ่มต้นที่จุดเดียวกัน, ถ้าตารางเวลาสมบูรณ์แล้ว + STR_TIMETABLE_CHANGE_TIME :{BLACK}ปรับเปลี่ยนเวลา STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}เปลี่ยนเวลาที่ตำแหน่งไฮไลท์ในรายการ diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index 36b7a26cc3..03e036c28a 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -255,6 +255,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}米 STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}公尺 + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}篩選: STR_LIST_FILTER_OSKTITLE :{BLACK}輸入一個或多個關鍵字詞以篩選此列表 @@ -717,8 +718,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}點擊 STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}點選音樂從目前清單中移除 (僅限「自訂一」或「自訂二」 # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}公司已達到 {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}公司排行榜 {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :商人 STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :企業家 @@ -1644,8 +1643,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :啟用可以為 STR_CONFIG_SETTING_LOADING_INDICATORS :使用裝載進度指示:{STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :選擇是否在車輛裝卸的時候顯示裝載狀況。 -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :顯示時刻表時以刻度數目取代日為單位:{STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :在時刻表上以刻度數目取代日數顯示運行時間。 +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :顯示時刻表排定的到離時間:{STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :在時刻表上顯示預料的到站、出發時間。 @@ -4538,8 +4536,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :等待 {STRING} STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(運行 {STRING} ,未指定時間) STR_TIMETABLE_STAY_FOR :並等待 {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :並運行 {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}日 -STR_TIMETABLE_TICKS :{COMMA}{NBSP}個時間標記 STR_TIMETABLE_TOTAL_TIME :{BLACK}此時刻表跑完全程需時 {STRING} STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}此時刻表跑完全程至少需時 {STRING} (此表尚未完成) @@ -4548,10 +4544,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}此車 STR_TIMETABLE_STATUS_LATE :{BLACK}此車輛目前比表定時間遲 {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}此車輛目前比表定時間早 {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}此時刻表尚未實施 -STR_TIMETABLE_STATUS_START_AT :{BLACK}此時刻表實施日期為 {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}實施日期 -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}選擇此時刻表開始實施的日期。如按住Ctrl鍵點選此掣,而時刻表每一項指令皆已指定持續時間,則系統會使所有共用此時刻表的車輛之間的間隔平均。 + STR_TIMETABLE_CHANGE_TIME :{BLACK}修改時刻 STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}修改選取指令所需的時間。按住 Ctrl 點選可設定所有指令的時間。 @@ -4575,8 +4569,6 @@ STR_TIMETABLE_EXPECTED :{BLACK}實際 STR_TIMETABLE_SCHEDULED :{BLACK}表定時間 STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}切換顯示 (根據實際情況的) 預期時間 或 表定時間 -STR_TIMETABLE_ARRIVAL :到: {COLOUR}{DATE_TINY} -STR_TIMETABLE_DEPARTURE :發: {COLOUR}{DATE_TINY} # Date window (for timetable) diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt index 188977a911..d3267cb0a7 100644 --- a/src/lang/turkish.txt +++ b/src/lang/turkish.txt @@ -256,6 +256,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtre: STR_LIST_FILTER_OSKTITLE :{BLACK}Listeyi filtrelemek için anahtar sözcük girin @@ -718,8 +719,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Kullanı STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Kullanılan programdan kaldırılacak parçaya tıklayın (Özel1 veya Özel2 için) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK} {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK} {NUM} senesindeki şirket ligi STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :İş insanı STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Girişimci @@ -1655,8 +1654,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Araçları grup STR_CONFIG_SETTING_LOADING_INDICATORS :Araç yükleme bilgisini göster: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Yükleme veya boşaltma yapan araçların üzerinde yükleme işaretlerinin görünüp görünmeyeceğini seçin -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Zaman tablosunda gün yerine işlemci zamanı kullan: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Zaman çizelgelerinde yolculuk sürelerini gün yerine oyun zamanı cinsinden göster +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Çıkış ve varışları çizelgelerde göster: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Zaman çizelgelerinde tahmini varış ve ayrılış zamanlarını göster @@ -4564,8 +4562,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :({STRING} kalma STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :({STRING} için seyahat, hareket saati yok) STR_TIMETABLE_STAY_FOR :{STRING} bekle STR_TIMETABLE_AND_TRAVEL_FOR :ve şuraya sefer yap: {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}gün -STR_TIMETABLE_TICKS :{COMMA}{NBSP}birim STR_TIMETABLE_TOTAL_TIME :{BLACK}Bu zaman çizelgesinin bitmesi {STRING} sürecek STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Bu zaman çizelgesinin bitmesi en az {STRING} sürecek (tamamı hesaplanmadı) @@ -4574,10 +4570,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Bu araç STR_TIMETABLE_STATUS_LATE :{BLACK}Bu araç {STRING} geç çalışıyor STR_TIMETABLE_STATUS_EARLY :{BLACK}Bu araç {STRING} erken çalışıyor STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Bu çizelge henüz başlatılmadı -STR_TIMETABLE_STATUS_START_AT :{BLACK}Bu çizelge {STRING} tarihinde başlayacak -STR_TIMETABLE_STARTING_DATE :{BLACK}Başlangıç tarihi -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Bu zaman çizelgesinin başlangıcı olarak bir tarih seçin. Ctrl+Tıklama eğer komuta zaman çizelgesi uygulanmışsa bu komutu paylaşan tüm araçlara göreli komutlarını baz alarak belirtilen tarihten itibaren eşit dağıtır. + STR_TIMETABLE_CHANGE_TIME :{BLACK}Zamanı değiştir STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Seçili talimatın harcaması gereken süreyi değiştir. Ctrl+Tıklama bütün talimatların süresini değiştirir @@ -4601,8 +4595,6 @@ STR_TIMETABLE_EXPECTED :{BLACK}Beklenen STR_TIMETABLE_SCHEDULED :{BLACK}Programlanan STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Beklenen ile programlanan arasında geçiş yap -STR_TIMETABLE_ARRIVAL :A: {COLOUR}{DATE_TINY} -STR_TIMETABLE_DEPARTURE :D: {COLOUR}{DATE_TINY} # Date window (for timetable) diff --git a/src/lang/ukrainian.txt b/src/lang/ukrainian.txt index a497550f16..3e9de47466 100644 --- a/src/lang/ukrainian.txt +++ b/src/lang/ukrainian.txt @@ -363,6 +363,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}м STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}м + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Фільтр: STR_LIST_FILTER_OSKTITLE :{BLACK}Введіть одне чи більше слів для фільтрування списку @@ -827,8 +828,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Вибе STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Клацніть мишою на мелодії для її видалення зі списку (лише Набір1 та Набір2) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Кращі компанії, які досягли {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Таблиця компаній з {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Підприємець STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Підприємець @@ -1746,8 +1745,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Вмикає в STR_CONFIG_SETTING_LOADING_INDICATORS :Показувати індикатори завантаження: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Вмикає\вимикає відображення індикатора процесу завантаження над транспортними засобами. -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Показувати розклад в тіках замість днів: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Відображати час руху в розкладах в тіках замість днів +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Показувати час прибуття та відправлення у розкладах: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Відображати очікуваний час прибуття та відправлення у розкладі @@ -4627,8 +4625,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(стояти STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(їхати протягом {STRING}, без розкладу) STR_TIMETABLE_STAY_FOR :і стояти {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :і прямувати до {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}д{P ень ні нів} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}одиниц{P я і ь} STR_TIMETABLE_TOTAL_TIME :{BLACK}Цей розклад займе {STRING} STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Цей розклад займе якнайменше {STRING} (не все враховано) @@ -4637,10 +4633,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Цей STR_TIMETABLE_STATUS_LATE :{BLACK}Цей транспорт запізнюється на {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}Цей транспорт випереджує розклад на {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Цей розклад ще не почався -STR_TIMETABLE_STATUS_START_AT :{BLACK}Цей розклад почнеться о {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Дата початку -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Оберіть дату як точку відліку даного розкладу. Ctrl+клац мишою рівномірно розподіляє весь транспорт, що має ці спільні завдання, згідно його відносного порядку розміщення, якщо порядок повністю розписаний у розкладі + STR_TIMETABLE_CHANGE_TIME :{BLACK}Змінити час STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Змінити час, впродовж якого має виконуватись наказ. Ctrl+клац змінить час в усіх завданнях diff --git a/src/lang/urdu.txt b/src/lang/urdu.txt index 2060def919..afa61cebac 100644 --- a/src/lang/urdu.txt +++ b/src/lang/urdu.txt @@ -219,6 +219,7 @@ STR_UNITS_FORCE_SI :{NBSP}{DECIMAL} STR_UNITS_HEIGHT_IMPERIAL :{NBSP}{DECIMAL} فٹ STR_UNITS_HEIGHT_SI :{NBSP}{DECIMAL} میٹر + # Common window strings STR_LIST_FILTER_OSKTITLE :{BLACK} چھان کے الفاظ درج کیجیئے STR_LIST_FILTER_TOOLTIP :{BLACK} فھرست کے چھان کے لیے کوئی حرف دیجیئے @@ -644,8 +645,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}موجو STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}موجودہ پروگرام میں سے نکالنے کے لئے گانے پر کلک کریں (صرف اپنی مرضی کے مطابق 1 یا 2) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}سر فہرست کمپنیاں جو {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}کمپنیوں کی فہرست میں {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :کاروباری STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :سرمایہ دار @@ -1281,7 +1280,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS :گاڑیوں ک STR_CONFIG_SETTING_LOADING_INDICATORS :سامان بھرنے کی نشانی دکھائیں: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :اوقات کا جدول دنوں کی بجائے ٹِکس میں دکھائیں: {STRING} +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :قوقات کے جدول میں آمد اور روانگی دکھائیں: {STRING} @@ -2678,6 +2677,7 @@ STR_TIMETABLE_TRAVEL_FOR_SPEED :{STRING} کے + STR_TIMETABLE_CHANGE_SPEED :{BLACK}حد رفتار تبدیل کریں STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}منتخب کردہ حکم کی زیادہ سے زیادہ حد رفتار تبدیل کریں diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index f8c1178640..11cc7ff40d 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -255,6 +255,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Lọc: STR_LIST_FILTER_OSKTITLE :{BLACK}Nhập một hoặc nhiều từ khóa để lọc danh sách @@ -718,8 +719,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Click v STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Click vào bài nhạc để xóa khỏi chương trình hiện tại (cho "Tự chọn 1" hay "Tự chọn 2") # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Những công ty đứng đầu đã đạt được {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Bảng tầm cỡ công ty trong {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Doanh Nhân STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Nhà Thầu @@ -1656,8 +1655,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Cho phép sử STR_CONFIG_SETTING_LOADING_INDICATORS :Hiển thị quá trình nạp hàng: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Lựa chọn liệu có chỉ thị tỉ lệ bốc xếp hiển thị khi bốc xếp hàng -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Hiện lịch trình ở dạng số nhịp thay vì ngày: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Hiển thị thời gian trong bảng lịch trình bằng bộ đếm trò chơi thay vì ngày +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Hiển thị nơi đến và nơi đi trên lịch trình: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Hiển thị thời gian đi và đến trong bảng lịch trình @@ -4566,8 +4564,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(ở lại {STR STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(di chuyển đến {STRING}, chưa có lịch trình) STR_TIMETABLE_STAY_FOR :và ở lại trong {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :và di chuyển trong {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}ngày -STR_TIMETABLE_TICKS :{COMMA}{NBSP}nhịp STR_TIMETABLE_TOTAL_TIME :{BLACK}Lịch trình này sẽ mất {STRING} để hoàn thành STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Lịch trình này sẽ mất ít nhất {STRING} để hoàn thành (không phải tất cả điểm được lập lịch trình) @@ -4576,10 +4572,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Phương STR_TIMETABLE_STATUS_LATE :{BLACK}Phương tiện này đang chạy trễ dự kiến {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}Phương tiện này đang chạy sớm hơn dự kiến {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Bảng lịch trình này chưa khởi tạo -STR_TIMETABLE_STATUS_START_AT :{BLACK}Bảng lịch trình sẽ bắt đầu lúc {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Ngày bắt đầu -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Lựa chọn ngày bắt đầu trong bảng lịch trình này. Ctrl+Click phân bổ cho tất cả các phương tiện chia sẻ lộ trình này bắt đầu từ ngày được chọn một cách đồng đều theo thứ tự tương đối giữa chúng, nếu như lộ trình đã lên lịch đầy đủ. + STR_TIMETABLE_CHANGE_TIME :{BLACK}Đổi thời gian STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Thay đổi thời lượng của điểm lộ trình được phép sử dụng. Ctrl+Click đặt thời gian cho mọi lộ trình @@ -4603,8 +4597,6 @@ STR_TIMETABLE_EXPECTED :{BLACK}Mong mu STR_TIMETABLE_SCHEDULED :{BLACK}Chốt lịch STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Chuyển giữa lịch mong muốn và lịch được chốt -STR_TIMETABLE_ARRIVAL :ĐN: {COLOUR}{DATE_TINY} -STR_TIMETABLE_DEPARTURE :KH: {COLOUR}{DATE_TINY} # Date window (for timetable) diff --git a/src/lang/welsh.txt b/src/lang/welsh.txt index e7fac0868b..c50e759abb 100644 --- a/src/lang/welsh.txt +++ b/src/lang/welsh.txt @@ -231,6 +231,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m + # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Hidlydd: STR_LIST_FILTER_OSKTITLE :{BLACK}Rhowch un neu fwy o allweddeiriau i hildio'r rhestr @@ -673,8 +674,6 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Cliciwch STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Cliciwch i dynnu trac cerddoriaeth o'r rhaglen gyfredol (Cyfaddas 1 Neu Cyfaddas 2 yn unig) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Y Cwmnïau Brig a gyrhaeddodd Lefel {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Y Tabl Cynghrair Cwmnïau yn {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Rheolwr Busnes STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Entrepreneur @@ -1525,8 +1524,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Galluogi defnyd STR_CONFIG_SETTING_LOADING_INDICATORS :Dangos llwytho: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Dewis a fydd dangosyddion llwytho'n cael eu dangos uwch cerbydau sy'n llwytho neu dadlwytho -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Dangos amserlen fesul ticiau yn hytrach na dyddiau: {STRING} -STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Dangos amseroedd teithio mewn amserlenni mewn ticiau yn hytrach na dyddiau +###length 3 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Dangos cyrraedd a gadael mewn amserlenni: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Dangos amseroedd cyrraedd a gadael rhagdybiedig mewn amserlenni @@ -4156,8 +4154,6 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(aros am {STRIN STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(teithio am {STRING}, heb ei amserlennu) STR_TIMETABLE_STAY_FOR :aros am {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :a theithio am {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}diwrnod -STR_TIMETABLE_TICKS :{COMMA}{NBSP}tic STR_TIMETABLE_TOTAL_TIME :{BLACK}Bydd yr amserlen hon yn cymryd {STRING} i'w chwblhau STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Bydd yr amserlen hon yn cymryd o leiaf {STRING} i'w chwblhau (heb ei hamserlennu'n llwyr) @@ -4166,10 +4162,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Mae'r ce STR_TIMETABLE_STATUS_LATE :{BLACK}Mae'r cerbyd hwn yn rhedeg {STRING} yn hwyr ar hyn o bryd STR_TIMETABLE_STATUS_EARLY :{BLACK}Mae'r cerbyd hwn yn rhedeg {STRING} yn gynnar ar hyn o bryd STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Nid yw'r amserlen yma wedi dechrau -STR_TIMETABLE_STATUS_START_AT :{BLACK}Bydd yr amserlen yma'n dechrau ar {STRING} -STR_TIMETABLE_STARTING_DATE :{BLACK}Dyddiad dechrau -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Dewis dyddiad fel pwynt dechrau ar gyfer yr amserlen yma. Mae Ctrl+Clic yn gosod pwynt dechrau yr amselen yma ac yn dosbarthu'r holl gerbydau sy'n rhannu'r gorchymyn yma yn gyson yn ôl eu trefn cymharol, os yw'r gorchymyn wedi ei amserlennu'n llwyr + STR_TIMETABLE_CHANGE_TIME :{BLACK}Newid Amser STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Newid faint o amser y dylai'r gorchymyn a amlygwyd ei gymryd From 0a8bcdd34470d2b96b393963f113980f09f3103d Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 11 Dec 2023 21:03:54 +0000 Subject: [PATCH 068/105] Change: Be selective about clearing sprite/font caches on interface scale change. (#11576) Sprite cache contains all zoom levels anyway, so does not need to be reloaded. Font cache does not need to be clear if the font zoom hasn't changed, i.e. when changing the max sprite zoom level setting. --- src/gfx.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/gfx.cpp b/src/gfx.cpp index 9275a44137..7c95da4259 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -1982,17 +1982,17 @@ bool AdjustGUIZoom(bool automatic) UpdateGUIZoom(); if (old_scale == _gui_scale && old_gui_zoom == _gui_zoom) return false; - /* Reload sprites if sprite zoom level has changed. */ + /* Update cursors if sprite zoom level has changed. */ if (old_gui_zoom != _gui_zoom) { - GfxClearSpriteCache(); VideoDriver::GetInstance()->ClearSystemSprites(); UpdateCursorSize(); - } else if (old_font_zoom != _font_zoom) { + } + if (old_font_zoom != _font_zoom) { GfxClearFontSpriteCache(); + ClearFontCache(); + LoadStringWidthTable(); } - ClearFontCache(); - LoadStringWidthTable(); UpdateAllVirtCoords(); /* Adjust all window sizes to match the new zoom level, so that they don't appear From 6c5aeae01b87cbb40b195c50499927068e4a2bd0 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 13 Dec 2023 02:19:16 +0000 Subject: [PATCH 069/105] Fix #11577: Extra viewport opened in wrong location. (#11578) ExtraViewportWindow calls IninitializeViewport() with focus as 0, which is ambiguous as focus should be either a TileIndex or a VehicleID. Instead, pass the tile and let InitializeViewport() handle setting all the coordinates. --- src/viewport.cpp | 19 +++++++++++++++---- src/viewport_gui.cpp | 19 +------------------ 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/src/viewport.cpp b/src/viewport.cpp index 5d1b4f634c..797f16aaae 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -242,11 +242,22 @@ void InitializeWindowViewport(Window *w, int x, int y, veh = Vehicle::Get(vp->follow_vehicle); pt = MapXYZToViewport(vp, veh->x_pos, veh->y_pos, veh->z_pos); } else { - x = TileX(std::get(focus)) * TILE_SIZE; - y = TileY(std::get(focus)) * TILE_SIZE; - + TileIndex tile = std::get(focus); + if (tile == INVALID_TILE) { + /* No tile? Use center of main viewport. */ + const Window *mw = GetMainWindow(); + + /* center on same place as main window (zoom is maximum, no adjustment needed) */ + pt.x = mw->viewport->scrollpos_x + mw->viewport->virtual_width / 2; + pt.x -= vp->virtual_width / 2; + pt.y = mw->viewport->scrollpos_y + mw->viewport->virtual_height / 2; + pt.y -= vp->virtual_height / 2; + } else { + x = TileX(tile) * TILE_SIZE; + y = TileY(tile) * TILE_SIZE; + pt = MapXYZToViewport(vp, x, y, GetSlopePixelZ(x, y)); + } vp->follow_vehicle = INVALID_VEHICLE; - pt = MapXYZToViewport(vp, x, y, GetSlopePixelZ(x, y)); } vp->scrollpos_x = pt.x; diff --git a/src/viewport_gui.cpp b/src/viewport_gui.cpp index 1f5178aff2..ccf02c31fc 100644 --- a/src/viewport_gui.cpp +++ b/src/viewport_gui.cpp @@ -57,25 +57,8 @@ public: this->InitNested(window_number); NWidgetViewport *nvp = this->GetWidget(WID_EV_VIEWPORT); - nvp->InitializeViewport(this, 0, ScaleZoomGUI(ZOOM_LVL_VIEWPORT)); + nvp->InitializeViewport(this, tile, ScaleZoomGUI(ZOOM_LVL_VIEWPORT)); if (_settings_client.gui.zoom_min == viewport->zoom) this->DisableWidget(WID_EV_ZOOM_IN); - - Point pt; - if (tile == INVALID_TILE) { - /* No tile? Use center of main viewport. */ - const Window *w = GetMainWindow(); - - /* center on same place as main window (zoom is maximum, no adjustment needed) */ - pt.x = w->viewport->scrollpos_x + w->viewport->virtual_width / 2; - pt.y = w->viewport->scrollpos_y + w->viewport->virtual_height / 2; - } else { - pt = RemapCoords(TileX(tile) * TILE_SIZE + TILE_SIZE / 2, TileY(tile) * TILE_SIZE + TILE_SIZE / 2, TilePixelHeight(tile)); - } - - this->viewport->scrollpos_x = pt.x - this->viewport->virtual_width / 2; - this->viewport->scrollpos_y = pt.y - this->viewport->virtual_height / 2; - this->viewport->dest_scrollpos_x = this->viewport->scrollpos_x; - this->viewport->dest_scrollpos_y = this->viewport->scrollpos_y; } void SetStringParameters(int widget) const override From 8e0500100190ad57eaf2ef90c9bcd5cb7cdd747a Mon Sep 17 00:00:00 2001 From: translators Date: Wed, 13 Dec 2023 18:38:37 +0000 Subject: [PATCH 070/105] Update: Translations from eints english (au): 18 changes by krysclarke russian: 18 changes by Ln-Wolf --- src/lang/english_AU.txt | 18 ++++++++++++++++++ src/lang/russian.txt | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index 871ce18296..f469740615 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -255,6 +255,9 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m +STR_UNITS_DAYS :{COMMA}{NBSP}day{P "" s} +STR_UNITS_SECONDS :{COMMA}{NBSP}second{P "" s} +STR_UNITS_TICKS :{COMMA}{NBSP}tick{P "" s} # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filter: @@ -719,6 +722,7 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Click on STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Click on music track to remove it from current programme (Custom1 or Custom2 only) # Highscore window +STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}Top companies STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Businessperson STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Entrepreneur @@ -1655,7 +1659,12 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Enable usage of STR_CONFIG_SETTING_LOADING_INDICATORS :Use loading indicators: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Select whether loading indicators are displayed above loading or unloading vehicles +STR_CONFIG_SETTING_TIMETABLE_MODE :Time units for timetables: {STRING} +STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Select the time units used for vehicle timetables ###length 3 +STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS :Days +STR_CONFIG_SETTING_TIMETABLE_MODE_SECONDS :Seconds +STR_CONFIG_SETTING_TIMETABLE_MODE_TICKS :Ticks STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Show arrival and departure in timetables: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Display anticipated arrival and departure times in timetables @@ -4572,8 +4581,13 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}This veh STR_TIMETABLE_STATUS_LATE :{BLACK}This vehicle is currently running {STRING} late STR_TIMETABLE_STATUS_EARLY :{BLACK}This vehicle is currently running {STRING} early STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}This timetable has not yet started +STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}This timetable will start at {STRING} +STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}This timetable will start in {COMMA} seconds +STR_TIMETABLE_START :{BLACK}Start Timetable +STR_TIMETABLE_START_TOOLTIP :{BLACK}Select when this timetable starts. Ctrl+Click evenly distributes the start of all vehicles sharing this order based on their relative order, if the order is completely timetabled +STR_TIMETABLE_START_SECONDS_QUERY :Seconds until timetable starts STR_TIMETABLE_CHANGE_TIME :{BLACK}Change Time STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Change the amount of time that the highlighted order should take. Ctrl+Click sets the time for all orders @@ -4597,6 +4611,10 @@ STR_TIMETABLE_EXPECTED :{BLACK}Expected STR_TIMETABLE_SCHEDULED :{BLACK}Scheduled STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Switch between expected and scheduled +STR_TIMETABLE_ARRIVAL_DATE :A: {COLOUR}{DATE_TINY} +STR_TIMETABLE_DEPARTURE_DATE :D: {COLOUR}{DATE_TINY} +STR_TIMETABLE_ARRIVAL_SECONDS_IN_FUTURE :A: {COLOUR}{COMMA} sec +STR_TIMETABLE_DEPARTURE_SECONDS_IN_FUTURE :D: {COLOUR}{COMMA} sec # Date window (for timetable) diff --git a/src/lang/russian.txt b/src/lang/russian.txt index 3d73c6f08e..06c3671e5c 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -381,6 +381,9 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}м STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}м +STR_UNITS_DAYS :{COMMA}{NBSP}д{P ень ня ней} +STR_UNITS_SECONDS :{COMMA}{NBSP}секунд{P а ы ""} +STR_UNITS_TICKS :{COMMA}{NBSP}тик{P "" а ов} # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Фильтр: @@ -857,6 +860,7 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Щёлк STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Выберите трек для удаления из пользовательского списка # Highscore window +STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}Крупнейшие компании STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Бизнесмен STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN.abl :бизнесменом @@ -1806,7 +1810,12 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Включит STR_CONFIG_SETTING_LOADING_INDICATORS :Показывать индикатор загрузки: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Отображение индикаторов загрузки над загружающимся и разгружающимся транспортом +STR_CONFIG_SETTING_TIMETABLE_MODE :Единицы времени в графиках: {STRING} +STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Единицы времени, используемые в графиках движения транспорта ###length 3 +STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS :дни +STR_CONFIG_SETTING_TIMETABLE_MODE_SECONDS :секунды +STR_CONFIG_SETTING_TIMETABLE_MODE_TICKS :тики STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Показывать время прибытия и отправления в графиках: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Показывать ожидаемое время прибытия и отправления в графиках движения @@ -4759,8 +4768,13 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Этот STR_TIMETABLE_STATUS_LATE :{BLACK}Этот транспорт опаздывает на {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}Этот транспорт опережает график на {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}График движения ещё не установлен +STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}Этот график будет запущен {STRING} +STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}До запуска графика осталось {COMMA} секунд{P а ы ""} +STR_TIMETABLE_START :{BLACK}Запуск графика +STR_TIMETABLE_START_TOOLTIP :{BLACK}Выберите время запуска графика. Ctrl+щелчок запустит транспортные средства, следующие по этому маршруту, через равные промежутки времени, если график движения по маршруту полностью рассчитан. +STR_TIMETABLE_START_SECONDS_QUERY :Секунд до запуска графика STR_TIMETABLE_CHANGE_TIME :{BLACK}Изменить время STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Изменить время исполнения выделенного задания. Ctrl+щелчок устанавливает время для всех заданий. @@ -4784,6 +4798,10 @@ STR_TIMETABLE_EXPECTED :{BLACK}Ожид STR_TIMETABLE_SCHEDULED :{BLACK}График STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Переключение между графиком движения и ожидаемым временем прибытия/отправления +STR_TIMETABLE_ARRIVAL_DATE :П: {COLOUR}{DATE_TINY} +STR_TIMETABLE_DEPARTURE_DATE :О: {COLOUR}{DATE_TINY} +STR_TIMETABLE_ARRIVAL_SECONDS_IN_FUTURE :П: {COLOUR}{COMMA} с +STR_TIMETABLE_DEPARTURE_SECONDS_IN_FUTURE :О: {COLOUR}{COMMA} с # Date window (for timetable) From d6515d6c982815694070b39cbc9124cb25001739 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 13 Dec 2023 19:51:44 +0000 Subject: [PATCH 071/105] Fix 0a8bcdd: Scaling non-sprite fonts does not depend on _font_zoom changing. (#11579) --- src/gfx.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gfx.cpp b/src/gfx.cpp index 7c95da4259..28650dff00 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -1989,9 +1989,9 @@ bool AdjustGUIZoom(bool automatic) } if (old_font_zoom != _font_zoom) { GfxClearFontSpriteCache(); - ClearFontCache(); - LoadStringWidthTable(); } + ClearFontCache(); + LoadStringWidthTable(); UpdateAllVirtCoords(); From 12bb7501283d8841e0e56ce7b57371c21d4ebc6f Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 14 Dec 2023 01:48:45 +0000 Subject: [PATCH 072/105] Codechange: Cargo filters no longer take an index. (#11582) Update naming of functions to reflect that parameter is now a cargoid. --- src/group_gui.cpp | 2 +- src/industry_gui.cpp | 24 ++++++++++++------------ src/vehicle_gui.cpp | 12 ++++++------ src/vehicle_gui_base.h | 2 +- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/group_gui.cpp b/src/group_gui.cpp index 7d89d6afd0..56c46adf11 100644 --- a/src/group_gui.cpp +++ b/src/group_gui.cpp @@ -953,7 +953,7 @@ public: break; case WID_GL_FILTER_BY_CARGO: // Select a cargo filter criteria - this->SetCargoFilterIndex(index); + this->SetCargoFilter(index); break; case WID_GL_MANAGE_VEHICLES_DROPDOWN: diff --git a/src/industry_gui.cpp b/src/industry_gui.cpp index fa85ba502d..d4f659f9b8 100644 --- a/src/industry_gui.cpp +++ b/src/industry_gui.cpp @@ -1332,13 +1332,13 @@ protected: }; /** - * Set cargo filter list item index. - * @param index The index of the cargo to be set + * Set produced cargo filter for the industry list. + * @param cid The cargo to be set */ - void SetProducedCargoFilterIndex(byte index) + void SetProducedCargoFilter(CargoID cid) { - if (this->produced_cargo_filter_criteria != index) { - this->produced_cargo_filter_criteria = index; + if (this->produced_cargo_filter_criteria != cid) { + this->produced_cargo_filter_criteria = cid; /* deactivate filter if criteria is 'Show All', activate it otherwise */ bool is_filtering_necessary = this->produced_cargo_filter_criteria != CF_ANY || this->accepted_cargo_filter_criteria != CF_ANY; @@ -1349,13 +1349,13 @@ protected: } /** - * Set cargo filter list item index. - * @param index The index of the cargo to be set + * Set accepted cargo filter for the industry list. + * @param index The cargo to be set */ - void SetAcceptedCargoFilterIndex(byte index) + void SetAcceptedCargoFilter(CargoID cid) { - if (this->accepted_cargo_filter_criteria != index) { - this->accepted_cargo_filter_criteria = index; + if (this->accepted_cargo_filter_criteria != cid) { + this->accepted_cargo_filter_criteria = cid; /* deactivate filter if criteria is 'Show All', activate it otherwise */ bool is_filtering_necessary = this->produced_cargo_filter_criteria != CF_ANY || this->accepted_cargo_filter_criteria != CF_ANY; @@ -1803,13 +1803,13 @@ public: } case WID_ID_FILTER_BY_ACC_CARGO: { - this->SetAcceptedCargoFilterIndex(index); + this->SetAcceptedCargoFilter(index); this->BuildSortIndustriesList(); break; } case WID_ID_FILTER_BY_PROD_CARGO: { - this->SetProducedCargoFilterIndex(index); + this->SetProducedCargoFilter(index); this->BuildSortIndustriesList(); break; } diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index fa130bb58e..de7bdb479a 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -300,13 +300,13 @@ static GUIVehicleGroupList::FilterFunction * const _filter_funcs[] = { }; /** - * Set cargo filter list item index. - * @param index The index to be set + * Set cargo filter for the vehicle group list. + * @param cid The cargo to be set. */ -void BaseVehicleListWindow::SetCargoFilterIndex(byte index) +void BaseVehicleListWindow::SetCargoFilter(CargoID cid) { - if (this->cargo_filter_criteria != index) { - this->cargo_filter_criteria = index; + if (this->cargo_filter_criteria != cid) { + this->cargo_filter_criteria = cid; /* Deactivate filter if criteria is 'Show All', activate it otherwise. */ this->vehgroups.SetFilterState(this->cargo_filter_criteria != CF_ANY); this->vehgroups.SetFilterType(0); @@ -2093,7 +2093,7 @@ public: break; case WID_VL_FILTER_BY_CARGO: - this->SetCargoFilterIndex(index); + this->SetCargoFilter(index); break; case WID_VL_MANAGE_VEHICLES_DROPDOWN: diff --git a/src/vehicle_gui_base.h b/src/vehicle_gui_base.h index 734053949c..9f9981caf2 100644 --- a/src/vehicle_gui_base.h +++ b/src/vehicle_gui_base.h @@ -121,7 +121,7 @@ struct BaseVehicleListWindow : public Window { void UpdateVehicleGroupBy(GroupBy group_by); void SortVehicleList(); void BuildVehicleList(); - void SetCargoFilterIndex(byte index); + void SetCargoFilter(byte index); void SetCargoFilterArray(); void FilterVehicleList(); StringID GetCargoFilterLabel(CargoID cid) const; From 97b86b714721b96086cc827830ded2331cbe0670 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Thu, 14 Dec 2023 15:41:31 +0000 Subject: [PATCH 073/105] Codechange: Use MakeParameters with GetNextParameter in FormatString (#11583) Instead of StringParameters subspan, to avoid GSs being able to cause subspan boundary assertion failures --- src/strings.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/strings.cpp b/src/strings.cpp index 6742f7565e..841f55d76b 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -1231,7 +1231,7 @@ static void FormatString(StringBuilder &builder, const char *str_arg, StringPara } default: { - StringParameters tmp_params(args, 1); + auto tmp_params = MakeParameters(args.GetNextParameter()); GetStringWithArgs(builder, cargo_str, tmp_params); break; } @@ -1245,7 +1245,7 @@ static void FormatString(StringBuilder &builder, const char *str_arg, StringPara if (IsValidCargoID(cargo) && cargo >= CargoSpec::GetArraySize()) break; StringID cargo_str = !IsValidCargoID(cargo) ? STR_QUANTITY_N_A : CargoSpec::Get(cargo)->quantifier; - StringParameters tmp_args(args, 1); + auto tmp_args = MakeParameters(args.GetNextParameter()); GetStringWithArgs(builder, cargo_str, tmp_args); break; } @@ -1405,7 +1405,7 @@ static void FormatString(StringBuilder &builder, const char *str_arg, StringPara case SCC_DEPOT_NAME: { // {DEPOT} VehicleType vt = args.GetNextParameter(); if (vt == VEH_AIRCRAFT) { - StringParameters tmp_params = StringParameters(args, 1); + auto tmp_params = MakeParameters(args.GetNextParameter()); GetStringWithArgs(builder, STR_FORMAT_DEPOT_NAME_AIRCRAFT, tmp_params); break; } From 63c006a174f43cbf48f12a02b2bdc1a2576b7be3 Mon Sep 17 00:00:00 2001 From: translators Date: Thu, 14 Dec 2023 18:38:27 +0000 Subject: [PATCH 074/105] Update: Translations from eints korean: 20 changes by telk5093 danish: 13 changes by bscargo portuguese (brazilian): 18 changes by pasantoro --- src/lang/brazilian_portuguese.txt | 18 ++++++++++++++++++ src/lang/danish.txt | 13 +++++++++++++ src/lang/korean.txt | 22 ++++++++++++++++++++-- 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index 0bbd6e809d..409fa8a152 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -256,6 +256,9 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m +STR_UNITS_DAYS :{COMMA}{NBSP}dia{P "" s} +STR_UNITS_SECONDS :{COMMA}{NBSP}sedundo{P "" s} +STR_UNITS_TICKS :{COMMA}{NBSP}tique{P "" s} # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtro: @@ -720,6 +723,7 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Clique n STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Clique na faixa de música para remover do programa atual (apenas Personalizado 1 ou Personalizado 2) # Highscore window +STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}Melhores empresas STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Empresário STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Empreendedor @@ -1656,7 +1660,12 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Ativa o uso da STR_CONFIG_SETTING_LOADING_INDICATORS :Usar indicadores de carga: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Seleciona se os indicadores de carga são exibidos sobre os veículos (des)carregando +STR_CONFIG_SETTING_TIMETABLE_MODE :Unidades de tempo para as ordens: {STRING} +STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Selecionar as unidades de tempo usadas nas ordens dos veículos ###length 3 +STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS :Dias +STR_CONFIG_SETTING_TIMETABLE_MODE_SECONDS :Segundos +STR_CONFIG_SETTING_TIMETABLE_MODE_TICKS :Tiques STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Mostrar chegada e saída nos planos de horário: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Exibe tempos de chegada e partida anticipados nos planos de horário @@ -4573,8 +4582,13 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Este ve STR_TIMETABLE_STATUS_LATE :{BLACK}Este veículo está atualmente circulando {STRING} atrasado STR_TIMETABLE_STATUS_EARLY :{BLACK}Este veículo está atualmente circulando {STRING} adiantado STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Este horário ainda não começou +STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}Essa ordem irá iniciar às {STRING} +STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}Essa ordem irá iniciar em {COMMA} segundos +STR_TIMETABLE_START :{BLACK}Iniciar Ordem +STR_TIMETABLE_START_TOOLTIP :{BLACK}Selecionar quando essa ordem inicia. Ctrl+Click distribui igualmente a partida de todos os veículos que compartilham essa ordem com base em sua ordem relativa, se a ordem for totalmente programada +STR_TIMETABLE_START_SECONDS_QUERY :Segundos até a ordem iniciar STR_TIMETABLE_CHANGE_TIME :{BLACK}Mudar horário STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Mudar a duração do tempo que a ordem em destaque deve durar. Ctrl+Clique define o tempo para todas as ordens @@ -4598,6 +4612,10 @@ STR_TIMETABLE_EXPECTED :{BLACK}Esperado STR_TIMETABLE_SCHEDULED :{BLACK}Agendado STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Trocar entre esperado e agendado +STR_TIMETABLE_ARRIVAL_DATE :A: {COLOUR}{DATE_TINY} +STR_TIMETABLE_DEPARTURE_DATE :D: {COLOUR}{DATE_TINY} +STR_TIMETABLE_ARRIVAL_SECONDS_IN_FUTURE :A: {COLOUR}{COMMA} segundos +STR_TIMETABLE_DEPARTURE_SECONDS_IN_FUTURE :D: {COLOUR}{COMMA} segundos # Date window (for timetable) diff --git a/src/lang/danish.txt b/src/lang/danish.txt index 4aae73298c..508e183215 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -255,6 +255,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL} fod STR_UNITS_HEIGHT_METRIC :{DECIMAL} m STR_UNITS_HEIGHT_SI :{DECIMAL} m +STR_UNITS_DAYS :{COMMA}{NBSP}dag{P "" s} # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtrer udtryk: @@ -719,6 +720,7 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Klik på STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Klik på et musiknummer for at fjerne det fra programlisten (kun for Custom1/Custom2) # Highscore window +STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}Top virksomheder STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Forretningsmand STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Entreprenør @@ -1655,7 +1657,10 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Aktiver brug af STR_CONFIG_SETTING_LOADING_INDICATORS :Benyt laste-indikatorer: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Vælg om lastnings-indikatorer vises ved pålæsning og aflæsning af køretøjer +STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Vælg de tidsenheder, der skal bruges til køreplaner ###length 3 +STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS :Dage +STR_CONFIG_SETTING_TIMETABLE_MODE_SECONDS :Sekunder STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Vis ankomst og afgang i tidsplaner: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Vis forventede ankomst-og afgangstider i tidsplaner @@ -4572,8 +4577,13 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Dette tr STR_TIMETABLE_STATUS_LATE :{BLACK}Dette transportmiddel er nu {STRING} forsinket STR_TIMETABLE_STATUS_EARLY :{BLACK}Dette transportmiddel er nu {STRING} foran køreplanen STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Denne tidsplan er endnu ikke begyndt. +STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}Denne tidsplan starter kl {STRING} +STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}Denne tidsplan starter om {COMMA} Sekunder +STR_TIMETABLE_START :{BLACK}Start tidsplan +STR_TIMETABLE_START_TOOLTIP :{BLACK}Vælg, hvornår denne tidsplan starter. Ctrl+klik fordeler starten af alle køretøjer, der deler denne rækkefølge, jævnt baseret på deres relative rækkefølge, hvis ordren er fuldstændig tidsplanlagt +STR_TIMETABLE_START_SECONDS_QUERY :Sekunder til tidsplanen starter STR_TIMETABLE_CHANGE_TIME :{BLACK}Ændre tid STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Ændre den tid, som den fremhævede rækkefølge skal tage. Ctrl+Click angiver tidspunktet for alle ordrer @@ -4597,6 +4607,9 @@ STR_TIMETABLE_EXPECTED :{BLACK}Forvente STR_TIMETABLE_SCHEDULED :{BLACK}Planlagt STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Skift mellem forventet og tidslagt +STR_TIMETABLE_ARRIVAL_DATE :A: {COLOUR}{DATE_TINY} +STR_TIMETABLE_DEPARTURE_DATE :D: {COLOUR}{DATE_TINY} +STR_TIMETABLE_ARRIVAL_SECONDS_IN_FUTURE :A: {COLOUR}{COMMA} sek # Date window (for timetable) diff --git a/src/lang/korean.txt b/src/lang/korean.txt index 8475d13259..f475b6c2f4 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -256,6 +256,9 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}피트 STR_UNITS_HEIGHT_METRIC :{DECIMAL}m STR_UNITS_HEIGHT_SI :{DECIMAL}m +STR_UNITS_DAYS :{COMMA}일 +STR_UNITS_SECONDS :{COMMA}초 +STR_UNITS_TICKS :{COMMA}틱 # Common window strings STR_LIST_FILTER_TITLE :{BLACK}검색: @@ -720,6 +723,7 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}배경 STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}배경 음악 목록에서 음악을 제거하려면 클릭하세요. (사용자1, 사용자2에서만 사용 가능) # Highscore window +STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}최고의 회사 STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :{G=f}초보자 STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :{G=f}사업가 @@ -1656,7 +1660,12 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :고급 차량 STR_CONFIG_SETTING_LOADING_INDICATORS :적재율 표시: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :적재나 하차하는 차량 위에 적재/하차율을 표시할지 말지를 선택합니다. +STR_CONFIG_SETTING_TIMETABLE_MODE :시간표에 사용할 시간 단위: {STRING} +STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :차량 시간표에 사용할 시간 단위를 선택합니다 ###length 3 +STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS :일 +STR_CONFIG_SETTING_TIMETABLE_MODE_SECONDS :초 +STR_CONFIG_SETTING_TIMETABLE_MODE_TICKS :틱 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :시간표에서 출발일과 도착일 표시: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :열차 시간표에서 예상 출발 & 도착 시간을 표시합니다. @@ -2345,7 +2354,7 @@ STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}멀티 STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}비밀번호 설정 STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}서버에 공개적으로 접근하는 것을 막고 싶을 때 비밀번호를 걸어 보호합니다. -STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}공개 여부 +STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}공개 여부: STR_NETWORK_START_SERVER_VISIBILITY_TOOLTIP :{BLACK}서버 목록에 이 서버를 공개할 지 여부를 설정합니다 STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM}명 STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}최대 접속자 수: @@ -4566,15 +4575,20 @@ STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :({STRING} 동 STR_TIMETABLE_STAY_FOR :& {STRING} 동안 정차 STR_TIMETABLE_AND_TRAVEL_FOR :& 다음 목적지({STRING})로 이동 -STR_TIMETABLE_TOTAL_TIME :{BLACK}이 시간표는 완주하는데 {STRING}이 걸릴 것입니다. +STR_TIMETABLE_TOTAL_TIME :{BLACK}이 시간표는 완주하는데 {STRING}이 걸립니다 STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}이 시간표를 완주하는데 최소 {STRING}이 필요합니다 (시간표가 일부만 지정됨) STR_TIMETABLE_STATUS_ON_TIME :{BLACK}이 차량은 지금 정시운행 중입니다 STR_TIMETABLE_STATUS_LATE :{BLACK}이 차량은 현재 {STRING} 늦게 운행하고 있습니다 STR_TIMETABLE_STATUS_EARLY :{BLACK}이 차량은 현재 {STRING} 빨리 운행하고 있습니다 STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}이 시간표는 아직 시작되지 않았습니다 +STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}이 시간표는 {STRING}에 시작합니다 +STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}이 시간표는 {COMMA}초 뒤에 시작합니다 +STR_TIMETABLE_START :{BLACK}시간표 시작 +STR_TIMETABLE_START_TOOLTIP :{BLACK}이 시간표가 언제 시작할지 선택합니다. CTRL+클릭하면, 만약 모든 경로에 시간표가 작성되어 있는 경우 이 경로를 공유하고 있는 모든 차량을 차량의 상대적인 순서에 따라 동일하게 배치시킵니다 +STR_TIMETABLE_START_SECONDS_QUERY :시간표를 이 시간(초) 뒤에 시작 STR_TIMETABLE_CHANGE_TIME :{BLACK}시간값 변경 STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}선택한 경로에서 소요되는 시간 값을 변경합니다. CTRL+클릭하면 모든 경로에 그 시간 값을 설정합니다 @@ -4598,6 +4612,10 @@ STR_TIMETABLE_EXPECTED :{BLACK}예정 STR_TIMETABLE_SCHEDULED :{BLACK}예정 소요시간 기준 STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}시간표 검사 기준을 도착 예정일과 도착 예정 시간 기준 중에서 선택합니다 +STR_TIMETABLE_ARRIVAL_DATE :착: {COLOUR}{DATE_TINY} +STR_TIMETABLE_DEPARTURE_DATE :발: {COLOUR}{DATE_TINY} +STR_TIMETABLE_ARRIVAL_SECONDS_IN_FUTURE :착: {COLOUR}{COMMA}초 +STR_TIMETABLE_DEPARTURE_SECONDS_IN_FUTURE :발: {COLOUR}{COMMA}초 # Date window (for timetable) From da2d21f5b0f5a3a5df1f44601e59fe1f3695fd10 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 14 Dec 2023 19:35:35 +0000 Subject: [PATCH 075/105] Fix: Left-over printf-style format passed to fmt. (#11584) --- src/console_cmds.cpp | 2 +- src/map.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index 60f9e6100f..9a1bf76590 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -2272,7 +2272,7 @@ DEF_CONSOLE_CMD(ConNewGRFProfile) started++; if (!grfids.empty()) grfids += ", "; - fmt::format_to(std::back_inserter(grfids), "[{%:08X}]", BSWAP32(pr.grffile->grfid)); + fmt::format_to(std::back_inserter(grfids), "[{:08X}]", BSWAP32(pr.grffile->grfid)); } } if (started > 0) { diff --git a/src/map.cpp b/src/map.cpp index f9a8ff5db9..77e510d498 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -82,7 +82,7 @@ TileIndex TileAdd(TileIndex tile, TileIndexDiff add, y = TileY(tile) + dy; if (x >= Map::SizeX() || y >= Map::SizeY()) { - std::string message = fmt::format("TILE_ADD({}) when adding 0x{:04X} and 0x{%04X} failed", + std::string message = fmt::format("TILE_ADD({}) when adding 0x{:04X} and 0x{:04X} failed", exp, tile, add); #if !defined(_MSC_VER) fmt::print(stderr, "{}:{} {}\n", file, line, message); From 47dd04d16ca2a0185deafeacd71f89e883c7b8cc Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 14 Dec 2023 20:05:38 +0000 Subject: [PATCH 076/105] Fix: Don't crash when saving a crashlog save with no main window open. --- src/saveload/misc_sl.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/saveload/misc_sl.cpp b/src/saveload/misc_sl.cpp index d0c04daa05..f50cab48b5 100644 --- a/src/saveload/misc_sl.cpp +++ b/src/saveload/misc_sl.cpp @@ -37,11 +37,18 @@ ZoomLevel _saved_scrollpos_zoom; void SaveViewportBeforeSaveGame() { - const Window *w = GetMainWindow(); - - _saved_scrollpos_x = w->viewport->scrollpos_x; - _saved_scrollpos_y = w->viewport->scrollpos_y; - _saved_scrollpos_zoom = w->viewport->zoom; + /* Don't use GetMainWindow() in case the window does not exist. */ + const Window *w = FindWindowById(WC_MAIN_WINDOW, 0); + if (w == nullptr || w->viewport == nullptr) { + /* Ensure saved position is clearly invalid. */ + _saved_scrollpos_x = INT_MAX; + _saved_scrollpos_y = INT_MAX; + _saved_scrollpos_zoom = ZOOM_LVL_END; + } else { + _saved_scrollpos_x = w->viewport->scrollpos_x; + _saved_scrollpos_y = w->viewport->scrollpos_y; + _saved_scrollpos_zoom = w->viewport->zoom; + } } void ResetViewportAfterLoadGame() From bbf3028f89901ac4e8c0de221d626b8eafb809a2 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 14 Dec 2023 20:07:40 +0000 Subject: [PATCH 077/105] Fix #11585: Crash when cleaning AI/GS with nested AsyncMode. Do not throw sanity check when in_shutdown is true. This is also applied to ExecMode and TestMode as they follow the same pattern. --- src/script/api/script_asyncmode.cpp | 4 ++-- src/script/api/script_execmode.cpp | 4 ++-- src/script/api/script_testmode.cpp | 4 ++-- src/script/script_instance.hpp | 5 +++++ 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/script/api/script_asyncmode.cpp b/src/script/api/script_asyncmode.cpp index afad59187d..6a2128febc 100644 --- a/src/script/api/script_asyncmode.cpp +++ b/src/script/api/script_asyncmode.cpp @@ -48,8 +48,8 @@ ScriptAsyncMode::ScriptAsyncMode(HSQUIRRELVM vm) void ScriptAsyncMode::FinalRelease() { if (this->GetDoCommandAsyncModeInstance() != this) { - /* Ignore this error if the script already died. */ - if (!ScriptObject::GetActiveInstance()->IsDead()) { + /* Ignore this error if the script is not alive. */ + if (ScriptObject::GetActiveInstance()->IsAlive()) { throw Script_FatalError("Asyncmode object was removed while it was not the latest *Mode object created."); } } diff --git a/src/script/api/script_execmode.cpp b/src/script/api/script_execmode.cpp index 6a34288cb2..007dd1ef58 100644 --- a/src/script/api/script_execmode.cpp +++ b/src/script/api/script_execmode.cpp @@ -31,8 +31,8 @@ ScriptExecMode::ScriptExecMode() void ScriptExecMode::FinalRelease() { if (this->GetDoCommandModeInstance() != this) { - /* Ignore this error if the script already died. */ - if (!ScriptObject::GetActiveInstance()->IsDead()) { + /* Ignore this error if the script is not alive. */ + if (ScriptObject::GetActiveInstance()->IsAlive()) { throw Script_FatalError("ScriptExecMode object was removed while it was not the latest *Mode object created."); } } diff --git a/src/script/api/script_testmode.cpp b/src/script/api/script_testmode.cpp index 70055586fe..a38deff548 100644 --- a/src/script/api/script_testmode.cpp +++ b/src/script/api/script_testmode.cpp @@ -31,8 +31,8 @@ ScriptTestMode::ScriptTestMode() void ScriptTestMode::FinalRelease() { if (this->GetDoCommandModeInstance() != this) { - /* Ignore this error if the script already died. */ - if (!ScriptObject::GetActiveInstance()->IsDead()) { + /* Ignore this error if the script is not alive. */ + if (ScriptObject::GetActiveInstance()->IsAlive()) { throw Script_FatalError("Testmode object was removed while it was not the latest *Mode object created."); } } diff --git a/src/script/script_instance.hpp b/src/script/script_instance.hpp index 8273b67ed0..342cb822b6 100644 --- a/src/script/script_instance.hpp +++ b/src/script/script_instance.hpp @@ -152,6 +152,11 @@ public: */ inline bool IsDead() const { return this->is_dead; } + /** + * Return whether the script is alive. + */ + inline bool IsAlive() const { return !this->IsDead() && !this->in_shutdown; } + /** * Call the script Save function and save all data in the savegame. */ From 7726f8f245ccfe70e11b33e74e71defb1d6b03c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Guilloux?= Date: Thu, 14 Dec 2023 22:29:44 +0100 Subject: [PATCH 078/105] Fix: [Script] Properly store the previous AsyncMode state (#11587) --- src/script/api/script_asyncmode.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/script/api/script_asyncmode.cpp b/src/script/api/script_asyncmode.cpp index 6a2128febc..4e95460e72 100644 --- a/src/script/api/script_asyncmode.cpp +++ b/src/script/api/script_asyncmode.cpp @@ -39,8 +39,8 @@ ScriptAsyncMode::ScriptAsyncMode(HSQUIRRELVM vm) throw sq_throwerror(vm, "Argument must be a boolean"); } - this->last_mode = this->GetDoCommandMode(); - this->last_instance = this->GetDoCommandModeInstance(); + this->last_mode = this->GetDoCommandAsyncMode(); + this->last_instance = this->GetDoCommandAsyncModeInstance(); this->SetDoCommandAsyncMode(sqasync ? &ScriptAsyncMode::AsyncModeProc : &ScriptAsyncMode::NonAsyncModeProc, this); } From 302e8852c12b44dbee9822932adc967ba173cba8 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Fri, 15 Dec 2023 01:25:36 +0000 Subject: [PATCH 079/105] Fix: Crash if squirrel compatibility scripts cannot be parsed. (#11589) --- src/script/script_instance.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/script/script_instance.cpp b/src/script/script_instance.cpp index 42d536b028..1371fbc821 100644 --- a/src/script/script_instance.cpp +++ b/src/script/script_instance.cpp @@ -76,6 +76,10 @@ void ScriptInstance::Initialize(const std::string &main_script, const std::strin /* Register the API functions and classes */ this->engine->SetGlobalPointer(this->engine); this->RegisterAPI(); + if (this->IsDead()) { + /* Failed to register API; a message has already been logged. */ + return; + } try { ScriptObject::SetAllowDoCommand(false); From 1e8aa9ce2262e8c2df9b589c4b7104f57b85e307 Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Wed, 13 Dec 2023 17:02:06 -0500 Subject: [PATCH 080/105] Add: Use more tooltips in World Generation GUI --- src/genworld_gui.cpp | 112 +++++++++++++++++++++---------------------- src/lang/english.txt | 11 +++++ 2 files changed, 67 insertions(+), 56 deletions(-) diff --git a/src/genworld_gui.cpp b/src/genworld_gui.cpp index 5fa8a0a289..1d99ed1c93 100644 --- a/src/genworld_gui.cpp +++ b/src/genworld_gui.cpp @@ -91,11 +91,11 @@ static const NWidgetPart _nested_generate_landscape_widgets[] = { /* Labels on the left side (global column 1). */ NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, WidgetDimensions::unscaled.vsep_sparse, 0), NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_MAPSIZE, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_TERRAIN_TYPE, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_VARIETY, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_SMOOTHNESS, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_QUANTITY_OF_RIVERS, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_BORDER_TYPE, STR_NULL), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_TERRAIN_TYPE, STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_VARIETY, STR_CONFIG_SETTING_VARIETY_HELPTEXT), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_SMOOTHNESS, STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_QUANTITY_OF_RIVERS, STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_BORDER_TYPE, STR_MAPGEN_BORDER_TYPE_TOOLTIP), SetFill(1, 1), EndContainer(), /* Widgets on the right side (global column 2). */ @@ -106,11 +106,11 @@ static const NWidgetPart _nested_generate_landscape_widgets[] = { NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_BY, STR_NULL), SetFill(0, 1), SetAlignment(SA_CENTER), NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_MAPSIZE_Y_PULLDOWN), SetDataTip(STR_JUST_INT, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1), EndContainer(), - NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TERRAIN_PULLDOWN), SetDataTip(STR_JUST_STRING1, STR_NULL), SetFill(1, 1), - NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_VARIETY_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 1), - NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_SMOOTHNESS_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 1), - NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_RIVER_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_BORDERS_RANDOM), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 1), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TERRAIN_PULLDOWN), SetDataTip(STR_JUST_STRING1, STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT), SetFill(1, 1), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_VARIETY_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_CONFIG_SETTING_VARIETY_HELPTEXT), SetFill(1, 1), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_SMOOTHNESS_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT), SetFill(1, 1), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_RIVER_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT), SetFill(1, 1), + NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_BORDERS_RANDOM), SetDataTip(STR_JUST_STRING, STR_MAPGEN_BORDER_TYPE_TOOLTIP), SetFill(1, 1), EndContainer(), EndContainer(), @@ -119,15 +119,15 @@ static const NWidgetPart _nested_generate_landscape_widgets[] = { /* Labels on the left side (global column 3). */ NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, WidgetDimensions::unscaled.vsep_sparse, 0), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_GL_CLIMATE_SEL_LABEL), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_SNOW_COVERAGE, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_DESERT_COVERAGE, STR_NULL), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_SNOW_COVERAGE, STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_DESERT_COVERAGE, STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT), SetFill(1, 1), NWidget(NWID_SPACER), SetFill(1, 1), EndContainer(), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_DATE, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_TOWN_NAME_LABEL, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_NUMBER_OF_TOWNS, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_NUMBER_OF_INDUSTRIES, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_SEA_LEVEL, STR_NULL), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_DATE, STR_MAPGEN_DATE_TOOLTIP), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_TOWN_NAME_LABEL, STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_NUMBER_OF_TOWNS, STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_NUMBER_OF_INDUSTRIES, STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_SEA_LEVEL, STR_MAPGEN_SEA_LEVEL_TOOLTIP), SetFill(1, 1), EndContainer(), /* Widgets on the right side (global column 4). */ @@ -137,13 +137,13 @@ static const NWidgetPart _nested_generate_landscape_widgets[] = { /* Snow coverage. */ NWidget(NWID_HORIZONTAL), NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_SNOW_COVERAGE_DOWN), SetDataTip(SPR_ARROW_DOWN, STR_MAPGEN_SNOW_COVERAGE_DOWN), SetFill(0, 1), - NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_SNOW_COVERAGE_TEXT), SetDataTip(STR_MAPGEN_SNOW_COVERAGE_TEXT, STR_NULL), SetFill(1, 1), + NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_SNOW_COVERAGE_TEXT), SetDataTip(STR_MAPGEN_SNOW_COVERAGE_TEXT, STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT), SetFill(1, 1), NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_SNOW_COVERAGE_UP), SetDataTip(SPR_ARROW_UP, STR_MAPGEN_SNOW_COVERAGE_UP), SetFill(0, 1), EndContainer(), /* Desert coverage. */ NWidget(NWID_HORIZONTAL), NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_DESERT_COVERAGE_DOWN), SetDataTip(SPR_ARROW_DOWN, STR_MAPGEN_DESERT_COVERAGE_DOWN), SetFill(0, 1), - NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_DESERT_COVERAGE_TEXT), SetDataTip(STR_MAPGEN_DESERT_COVERAGE_TEXT, STR_NULL), SetFill(1, 1), + NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_DESERT_COVERAGE_TEXT), SetDataTip(STR_MAPGEN_DESERT_COVERAGE_TEXT, STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT), SetFill(1, 1), NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_DESERT_COVERAGE_UP), SetDataTip(SPR_ARROW_UP, STR_MAPGEN_DESERT_COVERAGE_UP), SetFill(0, 1), EndContainer(), /* Temperate/Toyland spacer. */ @@ -152,13 +152,13 @@ static const NWidgetPart _nested_generate_landscape_widgets[] = { /* Starting date. */ NWidget(NWID_HORIZONTAL), NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_START_DATE_DOWN), SetDataTip(SPR_ARROW_DOWN, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD), SetFill(0, 1), - NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_GL_START_DATE_TEXT), SetDataTip(STR_JUST_DATE_LONG, STR_NULL), SetFill(1, 1), + NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_GL_START_DATE_TEXT), SetDataTip(STR_JUST_DATE_LONG, STR_MAPGEN_DATE_TOOLTIP), SetFill(1, 1), NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_START_DATE_UP), SetDataTip(SPR_ARROW_UP, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD), SetFill(0, 1), EndContainer(), NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWNNAME_DROPDOWN), SetDataTip(STR_JUST_STRING, STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP), SetFill(1, 1), - NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWN_PULLDOWN), SetDataTip(STR_JUST_STRING1, STR_NULL), SetFill(1, 1), - NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_INDUSTRY_PULLDOWN), SetDataTip(STR_JUST_STRING1, STR_NULL), SetFill(1, 1), - NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_WATER_PULLDOWN), SetDataTip(STR_JUST_STRING1, STR_NULL), SetFill(1, 1), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWN_PULLDOWN), SetDataTip(STR_JUST_STRING1, STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP), SetFill(1, 1), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_INDUSTRY_PULLDOWN), SetDataTip(STR_JUST_STRING1, STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP), SetFill(1, 1), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_WATER_PULLDOWN), SetDataTip(STR_JUST_STRING1, STR_MAPGEN_SEA_LEVEL_TOOLTIP), SetFill(1, 1), EndContainer(), EndContainer(), EndContainer(), @@ -187,7 +187,7 @@ static const NWidgetPart _nested_generate_landscape_widgets[] = { EndContainer(), /* Generate */ - NWidget(WWT_PUSHTXTBTN, COLOUR_GREEN, WID_GL_GENERATE_BUTTON), SetMinimalTextLines(3, 0), SetDataTip(STR_MAPGEN_GENERATE, STR_NULL), SetFill(1, 1), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREEN, WID_GL_GENERATE_BUTTON), SetMinimalTextLines(3, 0), SetDataTip(STR_MAPGEN_GENERATE, STR_MAPGEN_GENERATE_TOOLTIP), SetFill(1, 1), EndContainer(), EndContainer(), }; @@ -211,8 +211,8 @@ static const NWidgetPart _nested_heightmap_load_widgets[] = { NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_normal, 0), /* Heightmap name label. */ - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_HEIGHTMAP_NAME, STR_NULL), - NWidget(WWT_TEXT, COLOUR_ORANGE, WID_GL_HEIGHTMAP_NAME_TEXT), SetTextStyle(TC_ORANGE), SetDataTip(STR_JUST_RAW_STRING, STR_NULL), SetFill(1, 0), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_HEIGHTMAP_NAME, STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP), + NWidget(WWT_TEXT, COLOUR_ORANGE, WID_GL_HEIGHTMAP_NAME_TEXT), SetTextStyle(TC_ORANGE), SetDataTip(STR_JUST_RAW_STRING, STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP), SetFill(1, 0), EndContainer(), /* Generation options. */ @@ -222,30 +222,30 @@ static const NWidgetPart _nested_heightmap_load_widgets[] = { /* Labels on the left side (global column 1). */ NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, WidgetDimensions::unscaled.vsep_sparse, 0), /* Land generation option labels. */ - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_HEIGHTMAP_SIZE_LABEL, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_MAPSIZE, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_HEIGHTMAP_ROTATION, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_HEIGHTMAP_HEIGHT, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_QUANTITY_OF_RIVERS, STR_NULL), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_HEIGHTMAP_SIZE_LABEL, STR_MAPGEN_HEIGHTMAP_SIZE_LABEL_TOOLTIP), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_MAPSIZE, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_HEIGHTMAP_ROTATION, STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_HEIGHTMAP_HEIGHT, STR_MAPGEN_HEIGHTMAP_HEIGHT_TOOLTIP), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_QUANTITY_OF_RIVERS, STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT), SetFill(1, 1), EndContainer(), /* Left half widgets (global column 2) */ NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, WidgetDimensions::unscaled.vsep_sparse, 0), - NWidget(WWT_TEXT, COLOUR_ORANGE, WID_GL_HEIGHTMAP_SIZE_TEXT), SetDataTip(STR_MAPGEN_HEIGHTMAP_SIZE, STR_NULL), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE, WID_GL_HEIGHTMAP_SIZE_TEXT), SetDataTip(STR_MAPGEN_HEIGHTMAP_SIZE, STR_MAPGEN_HEIGHTMAP_SIZE_LABEL_TOOLTIP), SetFill(1, 1), /* Mapsize X * Y. */ NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_normal, 0), - NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_MAPSIZE_X_PULLDOWN), SetDataTip(STR_JUST_INT, STR_NULL), SetFill(1, 1), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_MAPSIZE_X_PULLDOWN), SetDataTip(STR_JUST_INT, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1), NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_BY, STR_NULL), SetFill(0, 1), SetAlignment(SA_CENTER), - NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_MAPSIZE_Y_PULLDOWN), SetDataTip(STR_JUST_INT, STR_NULL), SetFill(1, 1), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_MAPSIZE_Y_PULLDOWN), SetDataTip(STR_JUST_INT, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1), EndContainer(), - NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_HEIGHTMAP_ROTATION_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 1), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_HEIGHTMAP_ROTATION_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP), SetFill(1, 1), /* Heightmap highest peak. */ NWidget(NWID_HORIZONTAL), NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_HEIGHTMAP_HEIGHT_DOWN), SetDataTip(SPR_ARROW_DOWN, STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN), SetFill(0, 1), - NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_HEIGHTMAP_HEIGHT_TEXT), SetDataTip(STR_JUST_INT, STR_NULL), SetFill(1, 1), + NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_HEIGHTMAP_HEIGHT_TEXT), SetDataTip(STR_JUST_INT, STR_MAPGEN_HEIGHTMAP_HEIGHT_TOOLTIP), SetFill(1, 1), NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_HEIGHTMAP_HEIGHT_UP), SetDataTip(SPR_ARROW_UP, STR_MAPGEN_HEIGHTMAP_HEIGHT_UP), SetFill(0, 1), EndContainer(), - NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_RIVER_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 1), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_RIVER_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT), SetFill(1, 1), EndContainer(), EndContainer(), @@ -254,14 +254,14 @@ static const NWidgetPart _nested_heightmap_load_widgets[] = { /* Right half labels (global column 3) */ NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, WidgetDimensions::unscaled.vsep_sparse, 0), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_GL_CLIMATE_SEL_LABEL), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_SNOW_COVERAGE, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_DESERT_COVERAGE, STR_NULL), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_SNOW_COVERAGE, STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_DESERT_COVERAGE, STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT), SetFill(1, 1), NWidget(NWID_SPACER), SetFill(1, 1), EndContainer(), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_DATE, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_TOWN_NAME_LABEL, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_NUMBER_OF_TOWNS, STR_NULL), SetFill(1, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_NUMBER_OF_INDUSTRIES, STR_NULL), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_DATE, STR_MAPGEN_DATE_TOOLTIP), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_TOWN_NAME_LABEL, STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_NUMBER_OF_TOWNS, STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP), SetFill(1, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_NUMBER_OF_INDUSTRIES, STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP), SetFill(1, 1), EndContainer(), /* Right half widgets (global column 4) */ @@ -271,13 +271,13 @@ static const NWidgetPart _nested_heightmap_load_widgets[] = { /* Snow coverage. */ NWidget(NWID_HORIZONTAL), NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_SNOW_COVERAGE_DOWN), SetDataTip(SPR_ARROW_DOWN, STR_MAPGEN_SNOW_COVERAGE_DOWN), SetFill(0, 1), - NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_SNOW_COVERAGE_TEXT), SetDataTip(STR_MAPGEN_SNOW_COVERAGE_TEXT, STR_NULL), SetFill(1, 1), + NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_SNOW_COVERAGE_TEXT), SetDataTip(STR_MAPGEN_SNOW_COVERAGE_TEXT, STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT), SetFill(1, 1), NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_SNOW_COVERAGE_UP), SetDataTip(SPR_ARROW_UP, STR_MAPGEN_SNOW_COVERAGE_UP), SetFill(0, 1), EndContainer(), /* Desert coverage. */ NWidget(NWID_HORIZONTAL), NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_DESERT_COVERAGE_DOWN), SetDataTip(SPR_ARROW_DOWN, STR_MAPGEN_DESERT_COVERAGE_DOWN), SetFill(0, 1), - NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_DESERT_COVERAGE_TEXT), SetDataTip(STR_MAPGEN_DESERT_COVERAGE_TEXT, STR_NULL), SetFill(1, 1), + NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_DESERT_COVERAGE_TEXT), SetDataTip(STR_MAPGEN_DESERT_COVERAGE_TEXT, STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT), SetFill(1, 1), NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_DESERT_COVERAGE_UP), SetDataTip(SPR_ARROW_UP, STR_MAPGEN_DESERT_COVERAGE_UP), SetFill(0, 1), EndContainer(), /* Temperate/Toyland spacer. */ @@ -286,12 +286,12 @@ static const NWidgetPart _nested_heightmap_load_widgets[] = { /* Starting date. */ NWidget(NWID_HORIZONTAL), NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_START_DATE_DOWN), SetDataTip(SPR_ARROW_DOWN, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD), SetFill(0, 1), - NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_GL_START_DATE_TEXT), SetDataTip(STR_JUST_DATE_LONG, STR_NULL), SetFill(1, 1), + NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_GL_START_DATE_TEXT), SetDataTip(STR_JUST_DATE_LONG, STR_MAPGEN_DATE_TOOLTIP), SetFill(1, 1), NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_START_DATE_UP), SetDataTip(SPR_ARROW_UP, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD), SetFill(0, 1), EndContainer(), NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWNNAME_DROPDOWN), SetDataTip(STR_JUST_STRING, STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP), SetFill(1, 1), - NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWN_PULLDOWN), SetDataTip(STR_JUST_STRING1, STR_NULL), SetFill(1, 1), - NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_INDUSTRY_PULLDOWN), SetDataTip(STR_JUST_STRING1, STR_NULL), SetFill(1, 1), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWN_PULLDOWN), SetDataTip(STR_JUST_STRING1, STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP), SetFill(1, 1), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_INDUSTRY_PULLDOWN), SetDataTip(STR_JUST_STRING1, STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP), SetFill(1, 1), EndContainer(), EndContainer(), EndContainer(), @@ -304,7 +304,7 @@ static const NWidgetPart _nested_heightmap_load_widgets[] = { EndContainer(), /* Generate */ - NWidget(WWT_PUSHTXTBTN, COLOUR_GREEN, WID_GL_GENERATE_BUTTON), SetMinimalTextLines(3, 0), SetDataTip(STR_MAPGEN_GENERATE, STR_NULL), SetFill(1, 1), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREEN, WID_GL_GENERATE_BUTTON), SetMinimalTextLines(3, 0), SetDataTip(STR_MAPGEN_GENERATE, STR_MAPGEN_GENERATE_TOOLTIP), SetFill(1, 1), EndContainer(), EndContainer(), }; @@ -1280,30 +1280,30 @@ static const NWidgetPart _nested_create_scenario_widgets[] = { NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_normal, 0), /* Labels. */ NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, WidgetDimensions::unscaled.vsep_sparse, 0), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_MAPSIZE, STR_NULL), SetFill(0, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_DATE, STR_NULL), SetFill(0, 1), - NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_SE_MAPGEN_FLAT_WORLD_HEIGHT, STR_NULL), SetFill(0, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_MAPSIZE, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(0, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_DATE, STR_MAPGEN_DATE_TOOLTIP), SetFill(0, 1), + NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_SE_MAPGEN_FLAT_WORLD_HEIGHT, STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_TOOLTIP), SetFill(0, 1), EndContainer(), NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, WidgetDimensions::unscaled.vsep_sparse, 0), /* Map size. */ NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_normal, 0), - NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_CS_MAPSIZE_X_PULLDOWN), SetDataTip(STR_JUST_INT, STR_NULL), SetFill(1, 1), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_CS_MAPSIZE_X_PULLDOWN), SetDataTip(STR_JUST_INT, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1), NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_BY, STR_NULL), SetFill(0, 1), SetAlignment(SA_CENTER), - NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_CS_MAPSIZE_Y_PULLDOWN), SetDataTip(STR_JUST_INT, STR_NULL), SetFill(1, 1), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_CS_MAPSIZE_Y_PULLDOWN), SetDataTip(STR_JUST_INT, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1), EndContainer(), /* Date. */ NWidget(NWID_HORIZONTAL), NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_CS_START_DATE_DOWN), SetFill(0, 1), SetDataTip(SPR_ARROW_DOWN, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD), - NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_CS_START_DATE_TEXT), SetFill(1, 1), SetDataTip(STR_JUST_DATE_LONG, STR_NULL), + NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_CS_START_DATE_TEXT), SetFill(1, 1), SetDataTip(STR_JUST_DATE_LONG, STR_MAPGEN_DATE_TOOLTIP), NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_CS_START_DATE_UP), SetFill(0, 1), SetDataTip(SPR_ARROW_UP, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD), EndContainer(), /* Flat map height. */ NWidget(NWID_HORIZONTAL), NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_CS_FLAT_LAND_HEIGHT_DOWN), SetFill(0, 1), SetDataTip(SPR_ARROW_DOWN, STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN), - NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_CS_FLAT_LAND_HEIGHT_TEXT), SetFill(1, 1), SetDataTip(STR_JUST_INT, STR_NULL), + NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_CS_FLAT_LAND_HEIGHT_TEXT), SetFill(1, 1), SetDataTip(STR_JUST_INT, STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_TOOLTIP), NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_CS_FLAT_LAND_HEIGHT_UP), SetFill(0, 1), SetDataTip(SPR_ARROW_UP, STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP), EndContainer(), EndContainer(), diff --git a/src/lang/english.txt b/src/lang/english.txt index ec6f3ec932..b9e4e15310 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1539,6 +1539,7 @@ STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Drive on left STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Drive on right STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Heightmap rotation: {STRING2} +STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP :Choose which way the heightmap image is rotated to fit into the game world ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Counter clockwise STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :Clockwise @@ -3208,11 +3209,15 @@ STR_MAPGEN_MAPSIZE :{BLACK}Map size STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Select the size of the map in tiles. The number of available tiles will be slightly smaller STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}No. of towns: +STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP :{BLACK}Select the density of towns, or a custom number STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Town names: STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Select style of town names STR_MAPGEN_DATE :{BLACK}Date: +STR_MAPGEN_DATE_TOOLTIP :{BLACK}Select starting date STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}No. of industries: +STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP :{BLACK}Select the density of industries, or a custom number STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Highest peak: +STR_MAPGEN_HEIGHTMAP_HEIGHT_TOOLTIP :{BLACK}Choose the highest peak that the game will attempt to create, measured in elevation above sea level STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}Increase the maximum height of highest peak on the map by one STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}Decrease the maximum height of highest peak on the map by one STR_MAPGEN_SNOW_COVERAGE :{BLACK}Snow coverage: @@ -3225,10 +3230,12 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Decrease STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terrain type: STR_MAPGEN_SEA_LEVEL :{BLACK}Sea level: +STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK}Select the sea level STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Rivers: STR_MAPGEN_SMOOTHNESS :{BLACK}Smoothness: STR_MAPGEN_VARIETY :{BLACK}Variety distribution: STR_MAPGEN_GENERATE :{WHITE}Generate +STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Create the world and play OpenTTD! STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF Settings STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Display NewGRF settings STR_MAPGEN_AI_SETTINGS :{BLACK}AI Settings @@ -3261,6 +3268,7 @@ STR_MAPGEN_TOWN_NAME_CATALAN :Catalan # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Map edges: +STR_MAPGEN_BORDER_TYPE_TOOLTIP :{BLACK}Choose the borders of the game world STR_MAPGEN_NORTHWEST :{BLACK}Northwest STR_MAPGEN_NORTHEAST :{BLACK}Northeast STR_MAPGEN_SOUTHEAST :{BLACK}Southeast @@ -3273,7 +3281,9 @@ STR_MAPGEN_BORDER_MANUAL :{BLACK}Manual STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Heightmap rotation: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Heightmap name: +STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP :{BLACK}The name of the heightmap image file STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Size: +STR_MAPGEN_HEIGHTMAP_SIZE_LABEL_TOOLTIP :{BLACK}The size of the source heightmap image. For best results, each edge should match an available map edge length in OpenTTD, such as 256, 512, 1024, etc. STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM} STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT :{WHITE}Target peak height @@ -3288,6 +3298,7 @@ STR_SE_MAPGEN_FLAT_WORLD :{WHITE}Flat lan STR_SE_MAPGEN_FLAT_WORLD_TOOLTIP :{BLACK}Generate a flat land STR_SE_MAPGEN_RANDOM_LAND :{WHITE}Random land STR_SE_MAPGEN_FLAT_WORLD_HEIGHT :{BLACK}Height of flat land: +STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_TOOLTIP :{BLACK}Choose the height of the land above sea level STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN :{BLACK}Move the height of flat land one down STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}Move the height of flat land one up From 1343d7e25aa98ecc880f69f31800b5b8fb6d9acc Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Wed, 13 Dec 2023 17:03:39 -0500 Subject: [PATCH 081/105] Change: Don't mention TerraGenesis in setting helptexts We no longer show the land generator in the World Generation GUI, so this is less important to explain in tooltips. --- src/lang/english.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lang/english.txt b/src/lang/english.txt index b9e4e15310..ad3fbf831b 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1491,7 +1491,7 @@ STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Original STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis STR_CONFIG_SETTING_TERRAIN_TYPE :Terrain type: {STRING2} -STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(TerraGenesis only) Hilliness of the landscape +STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :Hilliness of the landscape STR_CONFIG_SETTING_INDUSTRY_DENSITY :Industry density: {STRING2} STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Set how many industries should be generated and what level should be maintained during the game @@ -1511,7 +1511,7 @@ STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Control the app STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Roughness of terrain: {STRING2} -STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(TerraGenesis only) Choose the frequency of hills: Smooth landscapes have fewer, more wide-spread hills. Rough landscapes have many hills, which may look repetitive +STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :Choose the frequency of hills: Smooth landscapes have fewer, more wide-spread hills. Rough landscapes have many hills, which may look repetitive ###length 4 STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Very Smooth STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :Smooth @@ -1519,7 +1519,7 @@ STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :Rough STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :Very Rough STR_CONFIG_SETTING_VARIETY :Variety distribution: {STRING2} -STR_CONFIG_SETTING_VARIETY_HELPTEXT :(TerraGenesis only) Control whether the map contains both mountainous and flat areas. Since this only makes the map flatter, other settings should be set to mountainous +STR_CONFIG_SETTING_VARIETY_HELPTEXT :Control whether the map contains both mountainous and flat areas. Since this only makes the map flatter, other settings should be set to mountainous STR_CONFIG_SETTING_RIVER_AMOUNT :River amount: {STRING2} STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :Choose how many rivers to generate From 8816c9dd2693ab1f00f70772b32b1da2e33986c0 Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Wed, 13 Dec 2023 17:41:09 -0500 Subject: [PATCH 082/105] Change: Improve and standardize wording of World Generation helptexts --- src/lang/english.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/lang/english.txt b/src/lang/english.txt index ad3fbf831b..b9f21666b1 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1491,7 +1491,7 @@ STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Original STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis STR_CONFIG_SETTING_TERRAIN_TYPE :Terrain type: {STRING2} -STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :Hilliness of the landscape +STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :Choose the height of hills and mountains of the landscape STR_CONFIG_SETTING_INDUSTRY_DENSITY :Industry density: {STRING2} STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Set how many industries should be generated and what level should be maintained during the game @@ -1500,18 +1500,18 @@ STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Maximum distanc STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Limit for how far from the map border oil refineries and oil rigs can be constructed. On island maps this ensures they are near the coast. On maps larger than 256 tiles, this value is scaled up. STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Snow line height: {STRING2} -STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Controls at what height snow starts in sub-arctic landscape. Snow also affects industry generation and town growth requirements. Can only be modified via Scenario Editor or is otherwise calculated via "snow coverage" +STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Choose at what height snow starts in sub-arctic landscape. Snow also affects industry generation and town growth requirements. Can only be modified via Scenario Editor or is otherwise calculated via "snow coverage" STR_CONFIG_SETTING_SNOW_COVERAGE :Snow coverage: {STRING2} -STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Controls the approximate amount of snow on the sub-arctic landscape. Snow also affects industry generation and town growth requirements. Only used during map generation. Land just above sea level is always without snow +STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Choose the approximate amount of snow on the sub-arctic landscape. Snow also affects industry generation and town growth requirements. Only used during map generation. Sea level and coast tiles never have snow. STR_CONFIG_SETTING_SNOW_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_DESERT_COVERAGE :Desert coverage: {STRING2} -STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Control the approximate amount of desert on the tropical landscape. Desert also affects industry generation. Only used during map generation +STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Choose the approximate amount of desert on the tropical landscape. Desert also affects industry generation and town growth requirements. Only used during map generation STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Roughness of terrain: {STRING2} -STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :Choose the frequency of hills: Smooth landscapes have fewer, more wide-spread hills. Rough landscapes have many hills, which may look repetitive +STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :Choose the shape and number of hills. Smooth landscapes have fewer, wider hills, while rough landscapes have more, smaller hills. ###length 4 STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Very Smooth STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :Smooth @@ -1519,7 +1519,7 @@ STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :Rough STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :Very Rough STR_CONFIG_SETTING_VARIETY :Variety distribution: {STRING2} -STR_CONFIG_SETTING_VARIETY_HELPTEXT :Control whether the map contains both mountainous and flat areas. Since this only makes the map flatter, other settings should be set to mountainous +STR_CONFIG_SETTING_VARIETY_HELPTEXT :Choose if the map contains both mountains and flat areas. The higher the variety, the more differences in elevation between mountainous and flat areas. STR_CONFIG_SETTING_RIVER_AMOUNT :River amount: {STRING2} STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :Choose how many rivers to generate From 0e6038f0e5f754237e34b9260214f1ff6b250809 Mon Sep 17 00:00:00 2001 From: translators Date: Fri, 15 Dec 2023 18:38:09 +0000 Subject: [PATCH 083/105] Update: Translations from eints english (us): 19 changes by 2TallTyler vietnamese: 14 changes by KhoiCanDev turkish: 26 changes by BeratSJ dutch: 19 changes by Afoklala --- src/lang/dutch.txt | 20 +++++++++++++++++++- src/lang/english_US.txt | 20 +++++++++++++++++++- src/lang/turkish.txt | 28 ++++++++++++++++++++++++++-- src/lang/vietnamese.txt | 17 ++++++++++++++--- 4 files changed, 78 insertions(+), 7 deletions(-) diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index 7ad0f7e9ed..5ddd1e5dc5 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -255,6 +255,9 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m +STR_UNITS_DAYS :{COMMA}{NBSP}dag{P "" en} +STR_UNITS_SECONDS :{COMMA}{NBSP}seconde{P "" n} +STR_UNITS_TICKS :{COMMA}{NBSP}tik{P "" ken} # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filter: @@ -719,6 +722,7 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Klik op STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Klik op een nummer om dit uit het programma te verwijderen (alleen Aangepast1 en Aangepast2) # Highscore window +STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}Hoogst genoteerde bedrijven STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :ZZP'er STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Ondernemer @@ -1655,7 +1659,12 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Schakelt het ge STR_CONFIG_SETTING_LOADING_INDICATORS :Laadpercentages gebruiken: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Geef aan of laadindicatoren worden weergegeven boven ladende of lossende voertuigen +STR_CONFIG_SETTING_TIMETABLE_MODE :Tijdeenheid voor dienstregelingen: {STRING} +STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Selecteer de tijdeenheid voor dienstregelingen ###length 3 +STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS :Dagen +STR_CONFIG_SETTING_TIMETABLE_MODE_SECONDS :Seconden +STR_CONFIG_SETTING_TIMETABLE_MODE_TICKS :Tikken STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Aankomst- en vertrektijden in dienstregeling weergeven: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Geef de verwachte aankomst-en vertrektijden in de dienstregeling weer @@ -2344,7 +2353,7 @@ STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}De speln STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Wachtwoord instellen STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Beveilig je spel met een wachtwoord als je niet wilt dat dit algemeen toegankelijk is -STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Zichtbaarheid +STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Zichtbaarheid: STR_NETWORK_START_SERVER_VISIBILITY_TOOLTIP :{BLACK}Bepaalt of andere mensen je server kunnen zien in de openbare lijst STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} speler{P "" s} STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Maximumaantal spelers: @@ -4572,8 +4581,13 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Dit voer STR_TIMETABLE_STATUS_LATE :{BLACK}Dit voertuig heeft {STRING} vertraging STR_TIMETABLE_STATUS_EARLY :{BLACK}Dit voertuig is {STRING} te vroeg STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Deze dienstregeling is nog niet gestart +STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}Deze dienstregeling begint om {STRING} +STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}Deze dienstregeling start over {COMMA} seconden +STR_TIMETABLE_START :{BLACK}Start dienstregeling +STR_TIMETABLE_START_TOOLTIP :{BLACK}Selecteer wanneer deze dienstregeling start. Ctrl+klik verdeelt de start van alle voertuigen met deze orders op basis van hun relatieve volgorde, mits de order een volledige dienstregeling heeft +STR_TIMETABLE_START_SECONDS_QUERY :Seconden tot de dienstregeling start STR_TIMETABLE_CHANGE_TIME :{BLACK}Tijd wijzigen STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Verander de tijdsduur die de geselecteerde order mag duren. Met Ctrl+klik stel je de tijd voor alle orders in @@ -4597,6 +4611,10 @@ STR_TIMETABLE_EXPECTED :{BLACK}Verwacht STR_TIMETABLE_SCHEDULED :{BLACK}Volgens dienstregeling STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Wissel tussen verwacht en volgens dienstregeling +STR_TIMETABLE_ARRIVAL_DATE :A: {COLOUR}{DATE_TINY} +STR_TIMETABLE_DEPARTURE_DATE :V: {COLOUR}{DATE_TINY} +STR_TIMETABLE_ARRIVAL_SECONDS_IN_FUTURE :A: {COLOUR}{COMMA} sec +STR_TIMETABLE_DEPARTURE_SECONDS_IN_FUTURE :V: {COLOUR}{COMMA} sec # Date window (for timetable) diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index cda40540a7..78cd3f4118 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -255,6 +255,9 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m +STR_UNITS_DAYS :{COMMA}{NBSP}day{P "" s} +STR_UNITS_SECONDS :{COMMA}{NBSP}second{P "" s} +STR_UNITS_TICKS :{COMMA}{NBSP}tick{P "" s} # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filter: @@ -719,6 +722,7 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Click on STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Click on music track to remove it from current program (Custom1 or Custom2 only) # Highscore window +STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}Top companies STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Businessperson STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Entrepreneur @@ -1655,7 +1659,12 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Enable usage of STR_CONFIG_SETTING_LOADING_INDICATORS :Use loading indicators: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Select whether loading indicators are displayed above loading or unloading vehicles +STR_CONFIG_SETTING_TIMETABLE_MODE :Time units for timetables: {STRING} +STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Select the time units used for vehicle timetables ###length 3 +STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS :Days +STR_CONFIG_SETTING_TIMETABLE_MODE_SECONDS :Seconds +STR_CONFIG_SETTING_TIMETABLE_MODE_TICKS :Ticks STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Show arrival and departure in timetables: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Display anticipated arrival and departure times in timetables @@ -2344,7 +2353,7 @@ STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}The game STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Set password STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Protect your game with a password if you don't want it to be publicly accessible -STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Visibility +STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Visibility: STR_NETWORK_START_SERVER_VISIBILITY_TOOLTIP :{BLACK}Whether other people can see your server in the public listing STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} client{P "" s} STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Maximum number of clients: @@ -4572,8 +4581,13 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}This veh STR_TIMETABLE_STATUS_LATE :{BLACK}This vehicle is currently running {STRING} late STR_TIMETABLE_STATUS_EARLY :{BLACK}This vehicle is currently running {STRING} early STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}This timetable has not yet started +STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}This timetable will start at {STRING} +STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}This timetable will start in {COMMA} seconds +STR_TIMETABLE_START :{BLACK}Start Timetable +STR_TIMETABLE_START_TOOLTIP :{BLACK}Select when this timetable starts. Ctrl+Click evenly distributes the start of all vehicles sharing this order based on their relative order, if the order is completely timetabled +STR_TIMETABLE_START_SECONDS_QUERY :Seconds until timetable starts STR_TIMETABLE_CHANGE_TIME :{BLACK}Change Time STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Change the amount of time that the highlighted order should take. Ctrl+Click sets the time for all orders @@ -4597,6 +4611,10 @@ STR_TIMETABLE_EXPECTED :{BLACK}Expected STR_TIMETABLE_SCHEDULED :{BLACK}Scheduled STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Switch between expected and scheduled +STR_TIMETABLE_ARRIVAL_DATE :A: {COLOUR}{DATE_TINY} +STR_TIMETABLE_DEPARTURE_DATE :D: {COLOUR}{DATE_TINY} +STR_TIMETABLE_ARRIVAL_SECONDS_IN_FUTURE :A: {COLOUR}{COMMA} sec +STR_TIMETABLE_DEPARTURE_SECONDS_IN_FUTURE :D: {COLOUR}{COMMA} sec # Date window (for timetable) diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt index d3267cb0a7..eecec8e4e7 100644 --- a/src/lang/turkish.txt +++ b/src/lang/turkish.txt @@ -256,6 +256,9 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m +STR_UNITS_DAYS :{COMMA}{NBSP}gün{P "ler" } +STR_UNITS_SECONDS :{COMMA}{NBSP}saniye{P "ler" } +STR_UNITS_TICKS :{COMMA}{NBSP}tik{P "ler" } # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtre: @@ -518,6 +521,7 @@ STR_ABOUT_MENU_ABOUT_OPENTTD :'OpenTTD' Hakk STR_ABOUT_MENU_SPRITE_ALIGNER :Nesne hizalayıcı STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Çerçeveleri aç/kapa STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Kirli blokları renklendir/renklendirme +STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES :Araç ana hatlarını değiştir # Place in highscore window ###length 15 @@ -719,6 +723,7 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Kullanı STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Kullanılan programdan kaldırılacak parçaya tıklayın (Özel1 veya Özel2 için) # Highscore window +STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}En iyi şirketler STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :İş insanı STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Girişimci @@ -1072,6 +1077,7 @@ STR_GAME_OPTIONS_BASE_MUSIC :{BLACK}Temel m STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :{BLACK}Kullanılacak temel müzik kümesini seçin STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}Temel müzik hakkında daha fazla bilgi +STR_BASESET_STATUS :{STRING} {RED}({NUM} eksik/bozuk dosya{P "lar" }) STR_ERROR_RESOLUTION_LIST_FAILED :{WHITE}Desteklenen çözünürlük listesi alınamadı STR_ERROR_FULLSCREEN_FAILED :{WHITE}Tam ekran kipi başarısız @@ -1654,7 +1660,12 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Araçları grup STR_CONFIG_SETTING_LOADING_INDICATORS :Araç yükleme bilgisini göster: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Yükleme veya boşaltma yapan araçların üzerinde yükleme işaretlerinin görünüp görünmeyeceğini seçin +STR_CONFIG_SETTING_TIMETABLE_MODE :Birim zaman için zaman çizelgesi: {STRING} +STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Araç zaman çizelgeleri için kullanılan zaman birimlerini seçin ###length 3 +STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS :Gün +STR_CONFIG_SETTING_TIMETABLE_MODE_SECONDS :Saniye +STR_CONFIG_SETTING_TIMETABLE_MODE_TICKS :tikler STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Çıkış ve varışları çizelgelerde göster: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Zaman çizelgelerinde tahmini varış ve ayrılış zamanlarını göster @@ -2343,7 +2354,7 @@ STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}Bu oyun STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Parola koy STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Erişimi kısıtlamak için oyuna parola koy -STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Görünürlük +STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Görünürlük: STR_NETWORK_START_SERVER_VISIBILITY_TOOLTIP :{BLACK}Halka açık listelemede öbür oyuncuların sizin sunucunuzu görüp göremeyeceği STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} istemci STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Azami istemci sayısı: @@ -3364,6 +3375,7 @@ STR_SAVE_PRESET_SAVE :{BLACK}Kaydet STR_SAVE_PRESET_SAVE_TOOLTIP :{BLACK}Ön ayarı geçerli seçili isimle kaydet # NewGRF parameters window +STR_BASEGRF_PARAMETERS_CAPTION :{WHITE}Temel grafik parametrelerini değiştirin STR_NEWGRF_PARAMETERS_CAPTION :{WHITE}NewGRF parametrelerini değiştir STR_NEWGRF_PARAMETERS_CLOSE :{BLACK}Kapat STR_NEWGRF_PARAMETERS_RESET :{BLACK}Sıfırla @@ -4570,8 +4582,13 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Bu araç STR_TIMETABLE_STATUS_LATE :{BLACK}Bu araç {STRING} geç çalışıyor STR_TIMETABLE_STATUS_EARLY :{BLACK}Bu araç {STRING} erken çalışıyor STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Bu çizelge henüz başlatılmadı +STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}Bu zaman çizelgesi {STRING} itibariyla başlayacak +STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}Bu zaman çizelgesi {COMMA} saniye içinde başlayacak +STR_TIMETABLE_START :{BLACK}Zaman Çizelgesini Başlat +STR_TIMETABLE_START_TOOLTIP :{BLACK}Bu zaman çizelgesinin ne zaman başlayacağını seçin. Sipariş tamamen zaman çizelgesine uygunsa, Ctrl+Tıklama bu sırayı paylaşan tüm araçların startını göreceli sıralarına göre eşit olarak dağıtır +STR_TIMETABLE_START_SECONDS_QUERY :Zaman çizelgesinin başlamasına saniyeler kaldı STR_TIMETABLE_CHANGE_TIME :{BLACK}Zamanı değiştir STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Seçili talimatın harcaması gereken süreyi değiştir. Ctrl+Tıklama bütün talimatların süresini değiştirir @@ -4595,6 +4612,10 @@ STR_TIMETABLE_EXPECTED :{BLACK}Beklenen STR_TIMETABLE_SCHEDULED :{BLACK}Programlanan STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Beklenen ile programlanan arasında geçiş yap +STR_TIMETABLE_ARRIVAL_DATE :A: {COLOUR}{DATE_TINY} +STR_TIMETABLE_DEPARTURE_DATE :D: {COLOUR}{DATE_TINY} +STR_TIMETABLE_ARRIVAL_SECONDS_IN_FUTURE :A: {COLOUR}{COMMA} saniye +STR_TIMETABLE_DEPARTURE_SECONDS_IN_FUTURE :{COLOUR}{COMMA} saniye # Date window (for timetable) @@ -4697,8 +4718,10 @@ STR_TEXTFILE_NAVBACK_TOOLTIP :{BLACK}Gezinme STR_TEXTFILE_NAVFORWARD_TOOLTIP :{BLACK}Gezinme geçmişinde ileri dönme STR_TEXTFILE_WRAP_TEXT :{WHITE}Metni kaydır STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Metni, okumak için gezinmeyi önlemek üzere kaydır -STR_TEXTFILE_VIEW_README :{BLACK}Benioku dosyasını göster +STR_TEXTFILE_VIEW_README :{BLACK}Benioku +STR_TEXTFILE_VIEW_README_TOOLTIP :Bu içeriğe ilişkin benioku dosyasını görüntüle STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Değişiklik kayıtları +STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP :Bu içerik için değişiklik günlüğünü görüntüle STR_TEXTFILE_VIEW_LICENCE :{BLACK}Lisans STR_TEXTFILE_VIEW_LICENCE_TOOLTIP :Bu içeriğin lisansını incele ###length 5 @@ -5163,6 +5186,7 @@ STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Aracın STR_ERROR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}Araçlar sadece istasyonlarda bekleyebilir STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}Araç bu istasyonda durmuyor STR_ERROR_TIMETABLE_INCOMPLETE :{WHITE}... zaman çizelgesi eksik +STR_ERROR_TIMETABLE_NOT_STARTED :{WHITE}... zaman çizelgesi henüz başlamadı # Sign related errors STR_ERROR_TOO_MANY_SIGNS :{WHITE}... çok fazla tabela var diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index 11cc7ff40d..99273b8f10 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -255,6 +255,8 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m +STR_UNITS_SECONDS :{COMMA}{NBSP}giây +STR_UNITS_TICKS :{COMMA}{NBSP}tick # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Lọc: @@ -719,6 +721,7 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Click v STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Click vào bài nhạc để xóa khỏi chương trình hiện tại (cho "Tự chọn 1" hay "Tự chọn 2") # Highscore window +STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}Những công ty hàng đầu STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Doanh Nhân STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Nhà Thầu @@ -1655,7 +1658,11 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Cho phép sử STR_CONFIG_SETTING_LOADING_INDICATORS :Hiển thị quá trình nạp hàng: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Lựa chọn liệu có chỉ thị tỉ lệ bốc xếp hiển thị khi bốc xếp hàng +STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Chọn đơn vị thời gian sử dụng cho bảng biểu của phương tiện ###length 3 +STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS :Ngày +STR_CONFIG_SETTING_TIMETABLE_MODE_SECONDS :Giây +STR_CONFIG_SETTING_TIMETABLE_MODE_TICKS :Tick STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Hiển thị nơi đến và nơi đi trên lịch trình: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Hiển thị thời gian đi và đến trong bảng lịch trình @@ -2344,7 +2351,7 @@ STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}Tên c STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Đặt mật khẩu STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Bảo vệ game của bạn bằng mật khẩu nếu bạn không muốn người khác vào tùy tiện -STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Hiển thị +STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Hiển thị: STR_NETWORK_START_SERVER_VISIBILITY_TOOLTIP :{BLACK}Cho phép người khác thấy server của bạn trong danh sách công khai STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} máy trạm STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Số máy trạm tối đa: @@ -2579,7 +2586,7 @@ STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}Tìm nh STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}Bạn đang thoát khỏi OpenTTD! STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}Có nhiều điều kiện và điều khoản để tải nội dung từ những trang ngoài.{}Bạn sẽ phải tham khảo trang ngoài để đọc những hướng dẫn cài nội dung vào OpenTTD.{}Bạn có muốn tiếp tục? STR_CONTENT_FILTER_TITLE :{BLACK}Lọc theo tên: -STR_CONTENT_OPEN_URL :{BLACK}Đến trang web +STR_CONTENT_OPEN_URL :{BLACK}Trang web STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}Đến trang web của nội dung này STR_CONTENT_DOWNLOAD_CAPTION :{BLACK}Tải về STR_CONTENT_DOWNLOAD_CAPTION_TOOLTIP :{BLACK}Tải các nội dung đã chọn về @@ -4572,6 +4579,7 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Phương STR_TIMETABLE_STATUS_LATE :{BLACK}Phương tiện này đang chạy trễ dự kiến {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}Phương tiện này đang chạy sớm hơn dự kiến {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Bảng lịch trình này chưa khởi tạo +STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}Lịch trình này sẽ bắt đầu trong {COMMA} giây @@ -4597,6 +4605,7 @@ STR_TIMETABLE_EXPECTED :{BLACK}Mong mu STR_TIMETABLE_SCHEDULED :{BLACK}Chốt lịch STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Chuyển giữa lịch mong muốn và lịch được chốt +STR_TIMETABLE_ARRIVAL_SECONDS_IN_FUTURE :Đến: {COLOUR}{COMMA} giây # Date window (for timetable) @@ -4699,9 +4708,11 @@ STR_TEXTFILE_NAVBACK_TOOLTIP :{BLACK}Trở v STR_TEXTFILE_NAVFORWARD_TOOLTIP :{BLACK}Trở về sau trong lịch sử điều hướng STR_TEXTFILE_WRAP_TEXT :{WHITE}Ép văn bản STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Ép chữ cái vừa khung cửa sổ để khỏi phải cuộn chuột -STR_TEXTFILE_VIEW_README :{BLACK}Xem readme +STR_TEXTFILE_VIEW_README :{BLACK}Readme +STR_TEXTFILE_VIEW_README_TOOLTIP :Xem readme của nội dung này STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Lịch sử thay đổi STR_TEXTFILE_VIEW_LICENCE :{BLACK}Giấy phép +STR_TEXTFILE_VIEW_LICENCE_TOOLTIP :Xem giấy phép của nội dung này ###length 5 STR_TEXTFILE_README_CAPTION :{WHITE}Readme của {STRING} {STRING} STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}Lịch sử thay đổi của {STRING} {STRING} From 651343d69e40c2b39ce2c9d47616799ae121e49c Mon Sep 17 00:00:00 2001 From: translators Date: Sat, 16 Dec 2023 18:36:51 +0000 Subject: [PATCH 084/105] Update: Translations from eints english (au): 17 changes by krysclarke english (us): 17 changes by 2TallTyler italian: 30 changes by Rivarossi russian: 17 changes by Ln-Wolf french: 36 changes by ottdfevr portuguese (brazilian): 30 changes by pasantoro --- src/lang/brazilian_portuguese.txt | 49 +++++++++++++++++++------------ src/lang/english_AU.txt | 23 +++++++++++---- src/lang/english_US.txt | 23 +++++++++++---- src/lang/french.txt | 43 ++++++++++++++++++++++----- src/lang/italian.txt | 32 ++++++++++++++++++-- src/lang/russian.txt | 23 +++++++++++---- 6 files changed, 147 insertions(+), 46 deletions(-) diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index 409fa8a152..ae5ffeb53c 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -1492,7 +1492,7 @@ STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Original STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis STR_CONFIG_SETTING_TERRAIN_TYPE :Tipo de terreno: {STRING} -STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(TerraGenesis apenas) O quão acidentado é o terreno +STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(Apenas TerraGenesis) Relevo do terreno STR_CONFIG_SETTING_INDUSTRY_DENSITY :Densidade de indústrias: {STRING} STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Define quantas indústrias devem ser geradas e o nível que deve ser mantido durante o jogo @@ -1501,18 +1501,18 @@ STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Dist máx da bo STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Refinarias são construídas apenas nas bordas, ou no litoral, para ilhas STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Altura da linha de neve: {STRING} -STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Controla a que altitude a neve começa nos climas sub-árticos. Neve também afeta geração de indústrias e necessidades para o crescimento das cidades. Só pode ser modificado por meio do Editor de cenário ou é de outra forma calculado por meio de "cobertura de neve" +STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Controla a que altura começa a neve no clima sub-ártico. A neve também afeta a geração de indústrias e os requisitos de crescimento das localidades. Só pode ser modificado no Editor de Cenário ou então é calculado usando a "cobertura de neve" STR_CONFIG_SETTING_SNOW_COVERAGE :Cobertura de neve: {STRING} -STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Controla a quantidade aproximada de neve no terreno subártico. A neve também afeta os requisitos de geração de indústria e crescimento de cidades. Usado apenas durante a geração de mapas. Terreno logo acima do nível do mar é sempre sem neve +STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Controla a quantidade aproximada de neve no clima sub-ártico. A neve também afeta a geração das indústrias e os requisitos de crescimento das localidades. Usado apenas durante a geração do mapa. O terreno logo acima do nível do mar nunca terá neve. STR_CONFIG_SETTING_SNOW_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_DESERT_COVERAGE :Cobertura do deserto: {STRING} -STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Controla a quantidade aproximada de deserto no terreno tropical. O deserto também afeta a geração de indústrias. Usado apenas durante a geração do mapa +STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Controla a quantidade aproximada de deserto no clima tropical. O deserto também afeta a geração das indústrias. Usado apenas durante a geração do mapa STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Irregularidade do terreno: {STRING} -STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(TerraGenesis apenas) Escolhe a frequência de colinas: Terrenos planos têm menos colinas, mais espalhadas. Montanhosos tem mais colinas, que pode se tornar repetitivo +STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(Apenas TerraGenesis) Escolhe a frequência de montes: paisagens macias têm menos montes e mais espalhados. Paisagens duras têm muitos montes, que podem parecer repetitivos ###length 4 STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Muito Regular STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :Regular @@ -1520,7 +1520,7 @@ STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :Irregular STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :Muito Irregular STR_CONFIG_SETTING_VARIETY :Distribuição de variedade: {STRING} -STR_CONFIG_SETTING_VARIETY_HELPTEXT :(TerraGenesis apenas) Controla se o mapa contém tanto áreas montanhosas como planas. Como isso apenas torna o mapa mais plano, as outras configurações devem ser mantidas em montanhoso +STR_CONFIG_SETTING_VARIETY_HELPTEXT :(Apenas TerraGenesis) Controla se o mapa contém áreas planas e montanhosas. Como isto apenas torna o mapa mais plano, outras definições devem ser definidas como montanhosas STR_CONFIG_SETTING_RIVER_AMOUNT :Quantidade de rios: {STRING} STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :Escolha quantos rios a serem gerados @@ -1540,6 +1540,7 @@ STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Dirigem na esqu STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Dirigem na direita STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Rotação do mapa topográfico: {STRING} +STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP :Escolher como a imagem do mapa topográfico será rotacionado para se ajustar ao mapa do jogo ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Sentido Anti-Horário STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :Sentido Horário @@ -2253,9 +2254,9 @@ STR_FACE_SAVE :{BLACK}Salvar STR_FACE_SAVE_TOOLTIP :{BLACK}Salvar face favorita STR_FACE_SAVE_DONE :{WHITE}Este rosto irá ser salvo como seu rosto favorito no arquivo de configuração do OpenTTD STR_FACE_EUROPEAN :{BLACK}Europeu -STR_FACE_SELECT_EUROPEAN :{BLACK}Selecione faces Européias +STR_FACE_SELECT_EUROPEAN :{BLACK}Selecionar faces Européias STR_FACE_AFRICAN :{BLACK}Africano -STR_FACE_SELECT_AFRICAN :{BLACK}Selecione faces Africanas +STR_FACE_SELECT_AFRICAN :{BLACK}Selecionar faces Africanas STR_FACE_YES :Sim STR_FACE_NO :Não STR_FACE_MOUSTACHE_EARRING_TOOLTIP :{BLACK}Ativar bigode ou brinco @@ -2599,7 +2600,7 @@ STR_CONTENT_DETAIL_TITLE :{SILVER}INFORMA ###length 5 STR_CONTENT_DETAIL_SUBTITLE_UNSELECTED :{SILVER}Você não selecionou para ser baixado STR_CONTENT_DETAIL_SUBTITLE_SELECTED :{SILVER}Você selecionou para ser baixado -STR_CONTENT_DETAIL_SUBTITLE_AUTOSELECTED :{SILVER}Esse dependente será baixado +STR_CONTENT_DETAIL_SUBTITLE_AUTOSELECTED :{SILVER}Esta dependência foi seleccionada para ser baixada STR_CONTENT_DETAIL_SUBTITLE_ALREADY_HERE :{SILVER}Você já baixou isso STR_CONTENT_DETAIL_SUBTITLE_DOES_NOT_EXIST :{SILVER}Esse conteúdo é desconhecido e não pode ser baixado pelo OpenTTD @@ -2667,7 +2668,7 @@ STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Definir STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Legenda do Fluxo de Carga STR_LINKGRAPH_LEGEND_ALL :{BLACK}Todas STR_LINKGRAPH_LEGEND_NONE :{BLACK}Nenhuma -STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Selecione companhias a serem exibidas +STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Selecionar as empresas a serem exibidas STR_LINKGRAPH_LEGEND_COMPANY_TOOLTIP :{BLACK}{STRING}{}{COMPANY} # Linkgraph legend window and linkgraph legend in smallmap @@ -2948,7 +2949,7 @@ STR_FOUND_TOWN_CITY :{BLACK}Cidade STR_FOUND_TOWN_CITY_TOOLTIP :{BLACK}Cidades grandes cresem mais rápido que as cidades normais{}Dependendo das configs. são maiores quando fundadas. STR_FOUND_TOWN_ROAD_LAYOUT :{YELLOW}Disposição das ruas das cidades -STR_FOUND_TOWN_SELECT_TOWN_ROAD_LAYOUT :{BLACK}Selecione a disposição de ruas a ser utilizada nessa cidade +STR_FOUND_TOWN_SELECT_TOWN_ROAD_LAYOUT :{BLACK}Seleccionar disposição das estradas utilizada para esta localidade STR_FOUND_TOWN_SELECT_LAYOUT_ORIGINAL :{BLACK}Original STR_FOUND_TOWN_SELECT_LAYOUT_BETTER_ROADS :{BLACK}Melhorado STR_FOUND_TOWN_SELECT_LAYOUT_2X2_GRID :{BLACK}Quadras 2x2 @@ -2957,7 +2958,7 @@ STR_FOUND_TOWN_SELECT_LAYOUT_RANDOM :{BLACK}Randômi # Fund new industry window STR_FUND_INDUSTRY_CAPTION :{WHITE}Financiar Indústria -STR_FUND_INDUSTRY_SELECTION_TOOLTIP :{BLACK}Escolha a indústria apropriada +STR_FUND_INDUSTRY_SELECTION_TOOLTIP :{BLACK}Escolher a indústria apropriada desta lista STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES :{BLACK}Criar indústrias aleatórias STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_TOOLTIP :{BLACK}Cobrir o mapa com indústrias colocadas aleatoriamente STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_CAPTION :{WHITE}Criar indústrias aleatórias @@ -2983,10 +2984,10 @@ STR_INDUSTRY_DISPLAY_CHAIN :{BLACK}Cadeia d STR_INDUSTRY_DISPLAY_CHAIN_TOOLTIP :{BLACK}Exibe indústrias que suprem e aceitam carga STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP :{BLACK}Exiba também no minimapa STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP_TOOLTIP :{BLACK}Selecione as indústrias exibidas no minimapa também -STR_INDUSTRY_CARGOES_SELECT_CARGO :{BLACK}Seleciona carga -STR_INDUSTRY_CARGOES_SELECT_CARGO_TOOLTIP :{BLACK}Seleciona a carga que você deseja exibir -STR_INDUSTRY_CARGOES_SELECT_INDUSTRY :{BLACK}Seleciona indústria -STR_INDUSTRY_CARGOES_SELECT_INDUSTRY_TOOLTIP :{BLACK}Seleciona a indústria que você deseja exibir +STR_INDUSTRY_CARGOES_SELECT_CARGO :{BLACK}Selecionar carga +STR_INDUSTRY_CARGOES_SELECT_CARGO_TOOLTIP :{BLACK}Selecionar a carga que você deseja exibir +STR_INDUSTRY_CARGOES_SELECT_INDUSTRY :{BLACK}Selecionar a indústria +STR_INDUSTRY_CARGOES_SELECT_INDUSTRY_TOOLTIP :{BLACK}Selecionar a indústria que você deseja exibir # Land area window STR_LAND_AREA_INFORMATION_CAPTION :{WHITE}Informações do Terreno @@ -3209,13 +3210,17 @@ STR_MAPGEN_MAPSIZE :{BLACK}Dimensõ STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Seleciona o tamanho do mapa em quadrados. O número de quadrados disponíveis será um pouco menor STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}No. de cidades: +STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP :{BLACK}Selecionar a densidade de cidades ou fornecer um número STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Nome das cidades: STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Selecionar o estilo dos nomes das cidades STR_MAPGEN_DATE :{BLACK}Data: +STR_MAPGEN_DATE_TOOLTIP :{BLACK}Selecionar a data inicial STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}No. de indústrias: +STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP :{BLACK}Selecione a densidade de indústrias ou forneça um número STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Pico mais alto: +STR_MAPGEN_HEIGHTMAP_HEIGHT_TOOLTIP :{BLACK}Escolher o pico mais alto que o jogo tentará criar, medido em elevação acima do nível do mar STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}Aumentar a altura máxima do pico mais alto no mapa por um -STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}Diminuir a altura máxima do pico mais alto no mapa por um +STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}Diminuir de uma unidade a altura máxima do pico mais alto no mapa STR_MAPGEN_SNOW_COVERAGE :{BLACK}Cobertura de neve: STR_MAPGEN_SNOW_COVERAGE_UP :{BLACK}Aumentar em dez porcento a cobertura de neve STR_MAPGEN_SNOW_COVERAGE_DOWN :{BLACK}Reduzir em dez porcento a cobertura de neve @@ -3226,10 +3231,12 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Diminuir STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_TERRAIN_TYPE :{BLACK}Tipo de terreno STR_MAPGEN_SEA_LEVEL :{BLACK}Nível do mar: +STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK}Selecionar o nível do mar STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Rios: STR_MAPGEN_SMOOTHNESS :{BLACK}Regularidade STR_MAPGEN_VARIETY :{BLACK}Distribuição da variedade STR_MAPGEN_GENERATE :{WHITE}Gerar +STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Criar o mapa e jogar o OpenTTD! STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}Definições de NewGRF STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Mostrar definições de NewGRF STR_MAPGEN_AI_SETTINGS :{BLACK}Definições de IA @@ -3262,6 +3269,7 @@ STR_MAPGEN_TOWN_NAME_CATALAN :Catalão # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Bordas do mapa: +STR_MAPGEN_BORDER_TYPE_TOOLTIP :{BLACK}Escolher as bordas do mapa do jogo STR_MAPGEN_NORTHWEST :{BLACK}Noroeste STR_MAPGEN_NORTHEAST :{BLACK}Nordeste STR_MAPGEN_SOUTHEAST :{BLACK}Sudeste @@ -3274,7 +3282,9 @@ STR_MAPGEN_BORDER_MANUAL :{BLACK}Manual STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Rotação do mapa topográfico: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Nome do mapa topográfico: +STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP :{BLACK}O nome do arquivo de imagem do mapa topográfico STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Tamanho: +STR_MAPGEN_HEIGHTMAP_SIZE_LABEL_TOOLTIP :{BLACK}O tamanho da imagem do mapa topográfico original. Para melhores resultados, cada lado deve ser igual a um comprimento de lado de mapa disponível no OpenTTD, como 256, 512, 1024, etc. STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM} STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT :{WHITE}Altura alvo do pico @@ -3289,6 +3299,7 @@ STR_SE_MAPGEN_FLAT_WORLD :{WHITE}Terra pl STR_SE_MAPGEN_FLAT_WORLD_TOOLTIP :{BLACK}Gera uma terra plana STR_SE_MAPGEN_RANDOM_LAND :{WHITE}Terra randômica STR_SE_MAPGEN_FLAT_WORLD_HEIGHT :{BLACK}Altitude da terra plana +STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_TOOLTIP :{BLACK}Escolher a elevação do terreno acima do nível do mar STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN :{BLACK}Mover a altitude da terra plana em uma unidade a menos STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}Mover a altitude da terra plana em uma unidade a mais @@ -3316,7 +3327,7 @@ STR_NEWGRF_SETTINGS_CAPTION :{WHITE}Configur STR_NEWGRF_SETTINGS_INFO_TITLE :{WHITE}Informação detalhada de NewGRF STR_NEWGRF_SETTINGS_ACTIVE_LIST :{WHITE}Arquivos NewGRF ativos STR_NEWGRF_SETTINGS_INACTIVE_LIST :{WHITE}Arquivos NewGRF inativos -STR_NEWGRF_SETTINGS_SELECT_PRESET :{ORANGE}Selecione um modelo: +STR_NEWGRF_SETTINGS_SELECT_PRESET :{ORANGE}Seleccionar predefinição: STR_NEWGRF_FILTER_TITLE :{ORANGE}Filtro: STR_NEWGRF_SETTINGS_PRESET_LIST_TOOLTIP :{BLACK}Carrega o padrão selecionado STR_NEWGRF_SETTINGS_PRESET_SAVE :{BLACK}Salvar padrão @@ -4372,7 +4383,7 @@ STR_REFIT_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Nova cap STR_REFIT_NEW_CAPACITY_INCOME_FROM_REFIT :{BLACK}Nova capacidade: {GOLD}{CARGO_LONG}{}{BLACK}Lucro vindo da adaptação: {GREEN}{CURRENCY_LONG} STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}Nova capacidade: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Custo da adaptação: {RED}{CURRENCY_LONG} STR_REFIT_NEW_CAPACITY_INCOME_FROM_AIRCRAFT_REFIT :{BLACK}Nova capacidade: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Lucro da adaptação: {GREEN}{CURRENCY_LONG} -STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Selecione os veículos para recuperar. Arrastar com o mouse permite a seleção de vários veículos. Clicar em espaço vazio selecionará todo o veículo. Ctrl+Clique selecionará um veículo e a lista de construção em seguida +STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Selecionar os veículos para recuperar. Arrastar com o mouse permite a seleção de vários veículos. Clicar em espaço vazio selecionará todo o veículo. Ctrl+Clique selecionará um veículo e a lista de construção em seguida ###length VEHICLE_TYPES STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Selecionar tipo de carga para o trem diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index f469740615..a5f3bd9d8c 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -1491,7 +1491,7 @@ STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Original STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis STR_CONFIG_SETTING_TERRAIN_TYPE :Terrain type: {STRING} -STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(TerraGenesis only) Hilliness of the landscape +STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :Choose the height of hills and mountains of the landscape STR_CONFIG_SETTING_INDUSTRY_DENSITY :Industry density: {STRING} STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Set how many industries should be generated and what level should be maintained during the game @@ -1500,18 +1500,18 @@ STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Maximum distanc STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Oil refineries are only constructed near the map border, that is at the coast for island maps STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Snow line height: {STRING} -STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Controls at what height snow starts in sub-arctic landscape. Snow also affects industry generation and town growth requirements. Can only be modified via Scenario Editor or is otherwise calculated via "snow coverage" +STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Choose at what height snow starts in sub-arctic landscape. Snow also affects industry generation and town growth requirements. Can only be modified via Scenario Editor or is otherwise calculated via "snow coverage" STR_CONFIG_SETTING_SNOW_COVERAGE :Snow coverage: {STRING} -STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Controls the approximate amount of snow on the sub-arctic landscape. Snow also affects industry generation and town growth requirements. Only used during map generation. Land just above sea level is always without snow +STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Choose the approximate amount of snow on the sub-arctic landscape. Snow also affects industry generation and town growth requirements. Only used during map generation. Sea level and coast tiles never have snow. STR_CONFIG_SETTING_SNOW_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_DESERT_COVERAGE :Desert coverage: {STRING} -STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Control the approximate amount of desert on the tropical landscape. Desert also affects industry generation. Only used during map generation +STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Choose the approximate amount of desert on the tropical landscape. Desert also affects industry generation and town growth requirements. Only used during map generation STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Roughness of terrain: {STRING} -STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(TerraGenesis only) Choose the frequency of hills: Smooth landscapes have fewer, more wide-spread hills. Rough landscapes have many hills, which may look repetitive +STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :Choose the shape and number of hills. Smooth landscapes have fewer, wider hills, while rough landscapes have more, smaller hills. ###length 4 STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Very Smooth STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :Smooth @@ -1519,7 +1519,7 @@ STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :Rough STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :Very Rough STR_CONFIG_SETTING_VARIETY :Variety distribution: {STRING} -STR_CONFIG_SETTING_VARIETY_HELPTEXT :(TerraGenesis only) Control whether the map contains both mountainous and flat areas. Since this only makes the map flatter, other settings should be set to mountainous +STR_CONFIG_SETTING_VARIETY_HELPTEXT :Choose if the map contains both mountains and flat areas. The higher the variety, the more differences in elevation between mountainous and flat areas. STR_CONFIG_SETTING_RIVER_AMOUNT :River amount: {STRING} STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :Choose how many rivers to generate @@ -1539,6 +1539,7 @@ STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Drive on left STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Drive on right STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Heightmap rotation: {STRING} +STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP :Choose which way the heightmap image is rotated to fit into the game world ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Counter clockwise STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :Clockwise @@ -3208,11 +3209,15 @@ STR_MAPGEN_MAPSIZE :{BLACK}Map size STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Select the size of the map in tiles. The number of available tiles will be slightly smaller STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}No. of towns: +STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP :{BLACK}Select the density of towns, or a custom number STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Town names: STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Select style of town names STR_MAPGEN_DATE :{BLACK}Date: +STR_MAPGEN_DATE_TOOLTIP :{BLACK}Select starting date STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}No. of industries: +STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP :{BLACK}Select the density of industries, or a custom number STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Highest peak: +STR_MAPGEN_HEIGHTMAP_HEIGHT_TOOLTIP :{BLACK}Choose the highest peak that the game will attempt to create, measured in elevation above sea level STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}Increase the maximum height of highest peak on the map by one STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}Decrease the maximum height of highest peak on the map by one STR_MAPGEN_SNOW_COVERAGE :{BLACK}Snow coverage: @@ -3225,10 +3230,12 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Decrease STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terrain type: STR_MAPGEN_SEA_LEVEL :{BLACK}Sea level: +STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK}Select the sea level STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Rivers: STR_MAPGEN_SMOOTHNESS :{BLACK}Smoothness: STR_MAPGEN_VARIETY :{BLACK}Variety distribution: STR_MAPGEN_GENERATE :{WHITE}Generate +STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Create the world and play OpenTTD! STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF Settings STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Display NewGRF settings STR_MAPGEN_AI_SETTINGS :{BLACK}AI Settings @@ -3261,6 +3268,7 @@ STR_MAPGEN_TOWN_NAME_CATALAN :Catalan # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Map edges: +STR_MAPGEN_BORDER_TYPE_TOOLTIP :{BLACK}Choose the borders of the game world STR_MAPGEN_NORTHWEST :{BLACK}Northwest STR_MAPGEN_NORTHEAST :{BLACK}Northeast STR_MAPGEN_SOUTHEAST :{BLACK}Southeast @@ -3273,7 +3281,9 @@ STR_MAPGEN_BORDER_MANUAL :{BLACK}Manual STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Heightmap rotation: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Heightmap name: +STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP :{BLACK}The name of the heightmap image file STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Size: +STR_MAPGEN_HEIGHTMAP_SIZE_LABEL_TOOLTIP :{BLACK}The size of the source heightmap image. For best results, each edge should match an available map edge length in OpenTTD, such as 256, 512, 1024, etc. STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM} STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT :{WHITE}Target peak height @@ -3288,6 +3298,7 @@ STR_SE_MAPGEN_FLAT_WORLD :{WHITE}Flat lan STR_SE_MAPGEN_FLAT_WORLD_TOOLTIP :{BLACK}Generate a flat land STR_SE_MAPGEN_RANDOM_LAND :{WHITE}Random land STR_SE_MAPGEN_FLAT_WORLD_HEIGHT :{BLACK}Height of flat land: +STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_TOOLTIP :{BLACK}Choose the height of the land above sea level STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN :{BLACK}Move the height of flat land one down STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}Move the height of flat land one up diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index 78cd3f4118..4f34c40b26 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -1491,7 +1491,7 @@ STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Original STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis STR_CONFIG_SETTING_TERRAIN_TYPE :Terrain type: {STRING} -STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(TerraGenesis only) Hilliness of the landscape +STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :Choose the height of hills and mountains of the landscape STR_CONFIG_SETTING_INDUSTRY_DENSITY :Industry density: {STRING} STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Set how many industries should be generated and what level should be maintained during the game @@ -1500,18 +1500,18 @@ STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Maximum distanc STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Limit for how far from the map border oil refineries and oil rigs can be constructed. On island maps this ensures they are near the coast. On maps larger than 256 tiles, this value is scaled up. STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Snow line height: {STRING} -STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Controls at what height snow starts in sub-arctic landscape. Snow also affects industry generation and town growth requirements. Can only be modified via Scenario Editor or is otherwise calculated via "snow coverage" +STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Choose at what height snow starts in sub-arctic landscape. Snow also affects industry generation and town growth requirements. Can only be modified via Scenario Editor or is otherwise calculated via "snow coverage" STR_CONFIG_SETTING_SNOW_COVERAGE :Snow coverage: {STRING} -STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Controls the approximate amount of snow on the sub-arctic landscape. Snow also affects industry generation and town growth requirements. Only used during map generation. Land just above sea level is always without snow +STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Choose the approximate amount of snow on the sub-arctic landscape. Snow also affects industry generation and town growth requirements. Only used during map generation. Sea level and coast tiles never have snow. STR_CONFIG_SETTING_SNOW_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_DESERT_COVERAGE :Desert coverage: {STRING} -STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Control the approximate amount of desert on the tropical landscape. Desert also affects industry generation. Only used during map generation +STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Choose the approximate amount of desert on the tropical landscape. Desert also affects industry generation and town growth requirements. Only used during map generation STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Roughness of terrain: {STRING} -STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(TerraGenesis only) Choose the frequency of hills: Smooth landscapes have fewer, more wide-spread hills. Rough landscapes have many hills, which may look repetitive +STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :Choose the shape and number of hills. Smooth landscapes have fewer, wider hills, while rough landscapes have more, smaller hills. ###length 4 STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Very Smooth STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :Smooth @@ -1519,7 +1519,7 @@ STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :Rough STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :Very Rough STR_CONFIG_SETTING_VARIETY :Variety distribution: {STRING} -STR_CONFIG_SETTING_VARIETY_HELPTEXT :(TerraGenesis only) Control whether the map contains both mountainous and flat areas. Since this only makes the map flatter, other settings should be set to mountainous +STR_CONFIG_SETTING_VARIETY_HELPTEXT :Choose if the map contains both mountains and flat areas. The higher the variety, the more differences in elevation between mountainous and flat areas. STR_CONFIG_SETTING_RIVER_AMOUNT :River amount: {STRING} STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :Choose how many rivers to generate @@ -1539,6 +1539,7 @@ STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Drive on left STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Drive on right STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Heightmap rotation: {STRING} +STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP :Choose which way the heightmap image is rotated to fit into the game world ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Counter-clockwise STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :Clockwise @@ -3208,11 +3209,15 @@ STR_MAPGEN_MAPSIZE :{BLACK}Map size STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Select the size of the map in tiles. The number of available tiles will be slightly smaller STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}No. of towns: +STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP :{BLACK}Select the density of towns, or a custom number STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Town names: STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Select style of town names STR_MAPGEN_DATE :{BLACK}Date: +STR_MAPGEN_DATE_TOOLTIP :{BLACK}Select starting date STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}No. of industries: +STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP :{BLACK}Select the density of industries, or a custom number STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Highest peak: +STR_MAPGEN_HEIGHTMAP_HEIGHT_TOOLTIP :{BLACK}Choose the highest peak that the game will attempt to create, measured in elevation above sea level STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}Increase the maximum height of highest peak on the map by one STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}Decrease the maximum height of highest peak on the map by one STR_MAPGEN_SNOW_COVERAGE :{BLACK}Snow coverage: @@ -3225,10 +3230,12 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Decrease STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terrain type: STR_MAPGEN_SEA_LEVEL :{BLACK}Sea level: +STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK}Select the sea level STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Rivers: STR_MAPGEN_SMOOTHNESS :{BLACK}Smoothness: STR_MAPGEN_VARIETY :{BLACK}Variety distribution: STR_MAPGEN_GENERATE :{WHITE}Generate +STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Create the world and play OpenTTD! STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF Settings STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Display NewGRF settings STR_MAPGEN_AI_SETTINGS :{BLACK}AI Settings @@ -3261,6 +3268,7 @@ STR_MAPGEN_TOWN_NAME_CATALAN :Catalan # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Map edges: +STR_MAPGEN_BORDER_TYPE_TOOLTIP :{BLACK}Choose the borders of the game world STR_MAPGEN_NORTHWEST :{BLACK}Northwest STR_MAPGEN_NORTHEAST :{BLACK}Northeast STR_MAPGEN_SOUTHEAST :{BLACK}Southeast @@ -3273,7 +3281,9 @@ STR_MAPGEN_BORDER_MANUAL :{BLACK}Manual STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Heightmap rotation: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Heightmap name: +STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP :{BLACK}The name of the heightmap image file STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Size: +STR_MAPGEN_HEIGHTMAP_SIZE_LABEL_TOOLTIP :{BLACK}The size of the source heightmap image. For best results, each edge should match an available map edge length in OpenTTD, such as 256, 512, 1024, etc. STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM} STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT :{WHITE}Target peak height @@ -3288,6 +3298,7 @@ STR_SE_MAPGEN_FLAT_WORLD :{WHITE}Flat lan STR_SE_MAPGEN_FLAT_WORLD_TOOLTIP :{BLACK}Generate a flat land STR_SE_MAPGEN_RANDOM_LAND :{WHITE}Random land STR_SE_MAPGEN_FLAT_WORLD_HEIGHT :{BLACK}Height of flat land: +STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_TOOLTIP :{BLACK}Choose the height of the land above sea level STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN :{BLACK}Move the height of flat land down one STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}Move the height of flat land up one diff --git a/src/lang/french.txt b/src/lang/french.txt index 5aff8966ca..18444b3d74 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -256,6 +256,9 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m +STR_UNITS_DAYS :{COMMA}{NBSP}jour{P "" s} +STR_UNITS_SECONDS :{COMMA}{NBSP}seconde{P "" s} +STR_UNITS_TICKS :{COMMA}{NBSP}tick{P "" s} # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtre{NBSP}: @@ -720,6 +723,7 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Cliquer STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Cliquer sur une piste pour la retirer du programme courant (Personnalisé 1 ou Personnalisé 2 seulement) # Highscore window +STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}Top 5 des compagnies STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Personne d'affaires STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Entrepreneur @@ -1488,7 +1492,7 @@ STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Original STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis STR_CONFIG_SETTING_TERRAIN_TYPE :Type de terrain{NBSP}: {STRING} -STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(TerraGenesis only) Vallonnement du paysage +STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :Chosir la hauteur des collines et montagnes du paysage STR_CONFIG_SETTING_INDUSTRY_DENSITY :Densité des industries{NBSP}: {STRING} STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Définit combien d'industries doivent être générée et quel niveau doit être maintenu pendant la partie @@ -1497,18 +1501,18 @@ STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Distance maximu STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Limite de distance par rapport au bord de la carte où les raffineries et les plateformes pétrolières peuvent être construites. Sur les cartes d'îles cela assure qu'elles sont près de la côte. Sur les cartes plus large que 256 tuiles, cette valeur est mise à l'échelle. STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Altitude d'enneigement{NBSP}: {STRING} -STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Contrôle à quelle altitude la neige commence dans le climat sub-arctique. La neige affecte aussi la génération des industries et les exigences pour la croissance des villes. Ne peut être modifié que via l'éditeur de scénario autrement il est calculé via "couverture de neige" +STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Chosir à quelle altitude la neige commence dans le climat sub-arctique. La neige affecte aussi la génération des industries et les exigences pour la croissance des villes. Ne peut être modifié que via l'éditeur de scénario autrement il est calculé via "couverture de neige" STR_CONFIG_SETTING_SNOW_COVERAGE :Couverture de neige: {STRING} -STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Contrôle la quantité approximative de neige sur le paysage sub-arctique. La neige affecte également la production des industrielles et les besoins de croissance des villes. Seulement utilisé lors de la création de la carte. La terre juste au-dessus du niveau de la mer est toujours sans neige +STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Contrôle la quantité approximative de neige sur le paysage sub-arctique. La neige affecte également la création d'industries et les besoins des villes pour croître. Seulement utilisé lors de la création de la carte. L'eau et les côtes ne seront jamais enneigées. STR_CONFIG_SETTING_SNOW_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_DESERT_COVERAGE :Couverture du désert: {STRING} -STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Contrôlez la quantité approximative de zone du désert sur le paysage tropical. Le désert affecte également la création du nombre d'industries. Uniquement utilisé lors de la création de la carte +STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Choisir la quantité approximative de zone du désert sur le paysage tropical. Le désert affecte également le nombre d'industries créées et les besoins des villes pour croître. Uniquement utilisé lors de la création de la carte STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Rugosité du terrain{NBSP}: {STRING} -STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(TerraGenesis only) Choisir la fréquence des collines{NBSP}: Les paysages doux ont des collines moins nombreuses et plus éloignées. Les paysages rudes ont beaucoup de collines, ce qui peut sembler répétitif +STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :Choisir la forme et le nombre de collines. Les paysages doux ont des collines basses et larges, tandis que les paysages rugueux ont de plus petites collines. ###length 4 STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Très lisse STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :Lisse @@ -1516,7 +1520,7 @@ STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :Rugueux STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :Très rugueux STR_CONFIG_SETTING_VARIETY :Distribution de variété{NBSP}: {STRING} -STR_CONFIG_SETTING_VARIETY_HELPTEXT :(TerraGenesis seulement) Contrôle si la carte contient à la fois de la montagne et du terrain plat. Comme cela rend seulement la carte plus plate, les autres paramètres doivent être définis sur montagneux +STR_CONFIG_SETTING_VARIETY_HELPTEXT :Contrôle si la carte contient à la fois des montagnes et des plaines. Plus la valeur est élevée, plus la différence d'élévation entre le plateau montagneux et les plaines sera importante. STR_CONFIG_SETTING_RIVER_AMOUNT :Quantité de rivières{NBSP}: {STRING} STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :Choisir combien de rivières générer @@ -1536,6 +1540,7 @@ STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Conduite à gau STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Conduite à droite STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Rotation de la carte d'altitude{NBSP}: {STRING} +STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP :Choisir de quelle manière l'image de la carte d'altitude est pivotée pour s'insérer correctement dans la carte actuelle. ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Anti-horaire STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :Horaire @@ -1656,7 +1661,12 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Active l'utilis STR_CONFIG_SETTING_LOADING_INDICATORS :Utiliser les indicateurs de chargement{NBSP}: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Choisir si les indicateurs de chargement doivent être affichés au dessus des véhicules qui chargent ou déchargent +STR_CONFIG_SETTING_TIMETABLE_MODE :Unité de temps pour les horaires{NBSP}: {STRING} +STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Sélectionner l'unité de temps utilisée pour les horaires des véhicules ###length 3 +STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS :Jours +STR_CONFIG_SETTING_TIMETABLE_MODE_SECONDS :Secondes +STR_CONFIG_SETTING_TIMETABLE_MODE_TICKS :Ticks STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Afficher l'arrivée et le départ dans les horaires{NBSP}: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Afficher les temps d'arrivée et de départ prévues dans les horaires @@ -3200,11 +3210,15 @@ STR_MAPGEN_MAPSIZE :{BLACK}Taille d STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Définir la taille de la carte en cases. Le nombre de cases utilisables sera légèrement plus petit STR_MAPGEN_BY :{BLACK}{NBSP}× STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Nb. de villes{NBSP}: +STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP :{BLACK}Sélectionner la quantité de villes sur la carte ou entrer un nombre précis STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Nom des villes{NBSP}: STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Sélectionner la nationalité des noms des villes STR_MAPGEN_DATE :{BLACK}Date{NBSP}: +STR_MAPGEN_DATE_TOOLTIP :{BLACK}Chosir la date de départ STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Nb. d'industries{NBSP}: +STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP :{BLACK}Sélectionner la quantité d'industries sur la carte ou entrer un nombre précis STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Sommet le plus élevé: +STR_MAPGEN_HEIGHTMAP_HEIGHT_TOOLTIP :{BLACK}Chosir le plus haut pic que le jeu pourra créer (mesuré par rapport au niveau de l'eau) STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}Augmenter la hauteur maximale du plus haut sommet de la carte de un STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}Diminuer la hauteur maximale du plus haut sommet de la carte de un STR_MAPGEN_SNOW_COVERAGE :{BLACK}Couverture de la neige: @@ -3217,10 +3231,12 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Diminuer STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_TERRAIN_TYPE :{BLACK}Type de terrain{NBSP}: STR_MAPGEN_SEA_LEVEL :{BLACK}Niveau de la mer{NBSP}: +STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK}Sélectionner le niveau de l'eau STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Nb. de rivières{NBSP}: STR_MAPGEN_SMOOTHNESS :{BLACK}Lissage{NBSP}: STR_MAPGEN_VARIETY :{BLACK}Variété de distribution{NBSP}: STR_MAPGEN_GENERATE :{WHITE}Créer +STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Créer la carte et jouer à OpenTTD ! STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}Paramètres NewGRF STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Afficher la configuration des NewGRF STR_MAPGEN_AI_SETTINGS :{BLACK}Paramètres des IAs @@ -3253,6 +3269,7 @@ STR_MAPGEN_TOWN_NAME_CATALAN :Catalans # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Bords de la carte{NBSP}: +STR_MAPGEN_BORDER_TYPE_TOOLTIP :{BLACK}Choisir les bordures de la carte STR_MAPGEN_NORTHWEST :{BLACK}Nord-Ouest STR_MAPGEN_NORTHEAST :{BLACK}Nord-Est STR_MAPGEN_SOUTHEAST :{BLACK}Sud-Est @@ -3265,7 +3282,9 @@ STR_MAPGEN_BORDER_MANUAL :{BLACK}Manuel STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Rotation de la carte d'altitude{NBSP}: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Nom de la carte d'altitude{NBSP}: +STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP :{BLACK}Nom de l'image de la carte d'altitude STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Taille{NBSP}: +STR_MAPGEN_HEIGHTMAP_SIZE_LABEL_TOOLTIP :{BLACK}Taille de l'image de la carte d'altitude. Pour un meilleur résultat, chaque longueur de bordure doit correspondre à une taille de bordure disponible sur OpenTTD (256, 512, 1024, etc). STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM}{NBSP}×{NBSP}{NUM} STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT :{WHITE}Hauteur du pic @@ -3280,6 +3299,7 @@ STR_SE_MAPGEN_FLAT_WORLD :{WHITE}Terrain STR_SE_MAPGEN_FLAT_WORLD_TOOLTIP :{BLACK}Créer un monde plat STR_SE_MAPGEN_RANDOM_LAND :{WHITE}Terrain aléatoire STR_SE_MAPGEN_FLAT_WORLD_HEIGHT :{BLACK}Altitude du terrain plat{NBSP}: +STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_TOOLTIP :{BLACK}Choisir la hauteur du sol par rapport au niveau de l'eau STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN :{BLACK}Diminuer l'altitude du terrain plat STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}Augmenter l'altitude du terrain plat @@ -4573,8 +4593,13 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Ce véhi STR_TIMETABLE_STATUS_LATE :{BLACK}Ce véhicule est en retard de {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}Ce véhicule est en avance de {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Cet horaire n'a pas encore démarré +STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}Cet horaire démarrera le/à {STRING} +STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}Cet horaire commencera dans {COMMA} seconde{P "" s} +STR_TIMETABLE_START :{BLACK}Démarrer l'horaire +STR_TIMETABLE_START_TOOLTIP :{BLACK}Sélectionner quand l'horaire doit démarrer. Ctrl-clic pourra donner l'ordre de démarrer l'horaire aux véhicules qui le partagent, seulement si leurs ordres sont complètement définis dans leurs horaires respectifs +STR_TIMETABLE_START_SECONDS_QUERY :Nombre de secondes avant que l'horaire ne commence STR_TIMETABLE_CHANGE_TIME :{BLACK}Modifier la durée STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Modifier la durée de l'ordre sélectionné. Ctrl-clic pour définir la durée pour tous les ordres @@ -4598,6 +4623,10 @@ STR_TIMETABLE_EXPECTED :{BLACK}Attendu STR_TIMETABLE_SCHEDULED :{BLACK}Planifié STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Alterner entre attendu et planifié +STR_TIMETABLE_ARRIVAL_DATE :A: {COLOUR}{DATE_TINY} +STR_TIMETABLE_DEPARTURE_DATE :D: {COLOUR}{DATE_TINY} +STR_TIMETABLE_ARRIVAL_SECONDS_IN_FUTURE :A: {COLOUR}{COMMA} seconde{P "" s} +STR_TIMETABLE_DEPARTURE_SECONDS_IN_FUTURE :D: {COLOUR}{COMMA} seconde{P "" s} # Date window (for timetable) @@ -4779,7 +4808,7 @@ STR_WARNING_FALLBACK_SOUNDSET :{WHITE}Seuls le STR_WARNING_SCREENSHOT_SIZE_CAPTION :{WHITE}Très grande capture d'écran STR_WARNING_SCREENSHOT_SIZE_MESSAGE :{YELLOW}La capture d'écran aura une résolution de {COMMA} x {COMMA} pixels. Faire cette capture peut prendre un moment . Êtes-vous sûr de vouloir continuer{NBSP}? -STR_MESSAGE_HEIGHTMAP_SUCCESSFULLY :{WHITE}La carte de hauteur a bien été enregistrée sous '{STRING}'. Le pic le plus élevé est {NUM} +STR_MESSAGE_HEIGHTMAP_SUCCESSFULLY :{WHITE}La carte d'altitude a bien été enregistrée sous '{STRING}'. Le pic le plus élevé est {NUM} STR_MESSAGE_SCREENSHOT_SUCCESSFULLY :{WHITE}Copie d'écran enregistrée avec succès sous "{STRING}" STR_ERROR_SCREENSHOT_FAILED :{WHITE}Échec de la copie d'écran{NBSP}! diff --git a/src/lang/italian.txt b/src/lang/italian.txt index 6720e1b090..288dc05eaa 100644 --- a/src/lang/italian.txt +++ b/src/lang/italian.txt @@ -257,6 +257,9 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m +STR_UNITS_DAYS :{COMMA}{NBSP}giorn{P "o" i} +STR_UNITS_SECONDS :{COMMA}{NBSP}second{P "o" i} +STR_UNITS_TICKS :{COMMA}{NBSP}tick{P "" s} # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtro: @@ -721,6 +724,7 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Fare cli STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Fare clic su un brano per rimuoverlo dal programma corrente (solo Personale1 o Personale2) # Highscore window +STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}Aziende top STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Commerciante STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Imprenditore @@ -1531,7 +1535,7 @@ STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Massima distanz STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Limita la distanza dal bordo della mappa entro cui possono essere costruite raffinerie e piattaforme petrolifere. Nelle mappe insulari sono comunque sempre vicino alla costa. Su mappe più grandi di 256 caselle il valore aumenta proporzionalmente. STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Altezza delle nevi perenni: {STRING} -STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Determina la quota alla quale appare la neve nei paesaggi subartici. La neve ha anche l'effetto di influenzare la generazione delle industrie e i requisiti per la crescita delle città. Può essere modificato solo tramite l'Editor di scenari o altrimenti calcolato tramite "Aree innevate". +STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Scegliere a quale altezza inizia a nevicare nel paesaggio sub-artico. La neve influisce anche sulla generazione di industrie e sui requisiti di crescita delle città. Può essere modificato solo tramite l'Editor scenari o viene altrimenti calcolato tramite le "Aree innevate". STR_CONFIG_SETTING_SNOW_COVERAGE :Aree innevate: {STRING} STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Regola la quantità approssimativa di neve presente nel paesaggio subartico. La neve influisce anche sulla generazione dell'industria e sui requisiti di crescita della città. Si può impostare solo durante la generazione della mappa o nelle impostazioni prima dell'inizio di una nuova partita. La terra appena sopra il livello del mare non è mai innevata. @@ -1542,7 +1546,7 @@ STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Regola la quant STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Irregolarità del terreno: {STRING} -STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(Solo con TerraGenesis) Seleziona la frequenza delle colline. I paesaggi morbidi presentano poche colline di forma allargata. I paesaggi accidentati hanno molte colline, che potrebbero apparire ripetitive. +STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :Scegliere la forma e il numero di colline. I paesaggi morbidi hanno un numero minore di colline più ampie, mentre i paesaggi ruvidi hanno un numero maggiore di colline più piccole. ###length 4 STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Molto morbido STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :Morbido @@ -1570,6 +1574,7 @@ STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Guida a sinistr STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Guida a destra STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Rotazione heightmap: {STRING} +STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP :Scegliere il modo in cui l'immagine della heightmap viene ruotata per adattarsi al mondo di gioco. ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Antioraria STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :Oraria @@ -1690,7 +1695,11 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Abilita l'utili STR_CONFIG_SETTING_LOADING_INDICATORS :Utilizza gli indicatori di caricamento: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Determina se gli indicatori di caricamento sono mostrati sopra i veicoli in caricamento o scaricamento +STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Selezionare le unità di tempo utilizzate per gli orari dei veicoli. ###length 3 +STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS :Giorni +STR_CONFIG_SETTING_TIMETABLE_MODE_SECONDS :Secondi +STR_CONFIG_SETTING_TIMETABLE_MODE_TICKS :Ticks STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Mostra gli arrivi e le partenze nelle tabelle orarie: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Mostra gli orari di arrivo e partenza previsti nelle tabelle orarie @@ -3240,11 +3249,15 @@ STR_MAPGEN_MAPSIZE :{BLACK}Area map STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Seleziona l'area della mappa espressa in caselle. Il numero effettivo di caselle disponibili sarà leggermente inferiore STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Numero città: +STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP :{BLACK}Selezionare la densità di città o un numero personalizzato. STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Nomi città: STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Seleziona lo stile per i nomi delle città STR_MAPGEN_DATE :{BLACK}Data: +STR_MAPGEN_DATE_TOOLTIP :{BLACK}Selezionare la data di inizio STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Numero industrie: +STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP :{BLACK}Selezionare la densità delle industrie o un numero personalizzato. STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Picco massimo: +STR_MAPGEN_HEIGHTMAP_HEIGHT_TOOLTIP :{BLACK}Scegliere la vetta più alta che il gioco tenterà di creare, misurata in altezza sul livello del mare STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}Aumenta la massima altezza del picco più alto sulla mappa di uno STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}Diminuisci la massima altezza del picco più alto sulla mappa di uno STR_MAPGEN_SNOW_COVERAGE :{BLACK}Aree innevate: @@ -3257,10 +3270,12 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Diminuis STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_TERRAIN_TYPE :{BLACK}Tipo di terreno: STR_MAPGEN_SEA_LEVEL :{BLACK}Livello di mare: +STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK}Selezionare il livello del mare STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Fiumi: STR_MAPGEN_SMOOTHNESS :{BLACK}Levigatezza: STR_MAPGEN_VARIETY :{BLACK}Varietà del terreno: STR_MAPGEN_GENERATE :{WHITE}Genera +STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Crea il mondo e gioca a OpenTTD! STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}Impostazioni NewGRF STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Mostra impostazioni NewGRF STR_MAPGEN_AI_SETTINGS :{BLACK}Impostazioni IA @@ -3293,6 +3308,7 @@ STR_MAPGEN_TOWN_NAME_CATALAN :Catalani # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Bordi della mappa: +STR_MAPGEN_BORDER_TYPE_TOOLTIP :{BLACK}Scegliere i confini del mondo di gioco STR_MAPGEN_NORTHWEST :{BLACK}Nord-ovest STR_MAPGEN_NORTHEAST :{BLACK}Nord-est STR_MAPGEN_SOUTHEAST :{BLACK}Sud-est @@ -3305,7 +3321,9 @@ STR_MAPGEN_BORDER_MANUAL :{BLACK}Manuale STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Rotazione heightmap: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Nome heightmap: +STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP :{BLACK}Il nome del file dell'immagine heightmap STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Dim.: +STR_MAPGEN_HEIGHTMAP_SIZE_LABEL_TOOLTIP :{BLACK}La dimensione dell'immagine heightmap di origine. Per ottenere risultati ottimali, ogni bordo deve corrispondere alla lunghezza del bordo della mappa disponibile in OpenTTD, ad esempio 256, 512, 1024, ecc. STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM} STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT :{WHITE}Limite altezza massima @@ -3320,6 +3338,7 @@ STR_SE_MAPGEN_FLAT_WORLD :{WHITE}Pianeggi STR_SE_MAPGEN_FLAT_WORLD_TOOLTIP :{BLACK}Genera un terreno pianeggiante STR_SE_MAPGEN_RANDOM_LAND :{WHITE}Casuale STR_SE_MAPGEN_FLAT_WORLD_HEIGHT :{BLACK}Altezza terreno pianeggiante: +STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_TOOLTIP :{BLACK}Scegliere l'altitudine del terreno sul livello del mare STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN :{BLACK}Sposta in giù di uno l'altezza del terreno pianeggiante STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}Sposta in su di uno l'altezza del terreno pianeggiante @@ -4613,8 +4632,13 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Il veico STR_TIMETABLE_STATUS_LATE :{BLACK}Il veicolo viaggia con un ritardo di {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}Il veicolo viaggia con un anticipo di {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Il viaggio non è ancora iniziato +STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}Questo orario inizierà alle ore {STRING} +STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}Questo orario inizierà tra {COMMA} secondi. +STR_TIMETABLE_START :{BLACK}Orario di partenza +STR_TIMETABLE_START_TOOLTIP :{BLACK}Selezionare quando inizia l'orario. Ctrl+Click distribuisce uniformemente l'inizio di tutti i veicoli che condividono l'ordine in base al loro ordine relativo, se l'ordine è completamente programmato. +STR_TIMETABLE_START_SECONDS_QUERY :Secondi prima dell'inizio dell'orario STR_TIMETABLE_CHANGE_TIME :{BLACK}Cambia tempo STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Cambia la quantità di tempo che dovrebbe essere impiegata per l'ordine selezionato. CTRL+clic imposta il tempo di tutti gli ordini @@ -4638,6 +4662,10 @@ STR_TIMETABLE_EXPECTED :{BLACK}Orari at STR_TIMETABLE_SCHEDULED :{BLACK}Orari programmati STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Alterna fra la visualizzazione degli orari attesi e degli orari programmati +STR_TIMETABLE_ARRIVAL_DATE :A: {COLOUR}{DATE_TINY} +STR_TIMETABLE_DEPARTURE_DATE :D: {COLOUR}{DATE_TINY} +STR_TIMETABLE_ARRIVAL_SECONDS_IN_FUTURE :A: {COLOUR}{COMMA} sec +STR_TIMETABLE_DEPARTURE_SECONDS_IN_FUTURE :D: {COLOUR}{COMMA} sec # Date window (for timetable) diff --git a/src/lang/russian.txt b/src/lang/russian.txt index 06c3671e5c..177ac17012 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -1642,7 +1642,7 @@ STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Оригина STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis STR_CONFIG_SETTING_TERRAIN_TYPE :Тип ландшафта: {STRING} -STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(Только для TerraGenesis){}Холмистость ландшафта +STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :Укажите высоту гор и холмов на карте STR_CONFIG_SETTING_INDUSTRY_DENSITY :Количество предприятий: {STRING} STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Выберите, сколько предприятий создавать в начале и на каком уровне поддерживать их количество в процессе игры. @@ -1651,18 +1651,18 @@ STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Макс. ра STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Эта настройка ограничивает расстояние от края карты до нефтяных платформ и нефтеперерабатывающих заводов. Таким образом, на краях карты, оканчивающихся водой, они будут строиться у берега. На картах размером более 256 это значение будет соответственно увеличено. STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Высота снеговой линии: {STRING} -STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Это значение определяет, на какой высоте в субарктическом климате устанавливается снеговой покров. Наличие снега влияет на расстановку предприятий и на условия роста городов.{}Значение может быть установлено только в редакторе сценариев; иначе оно рассчитывается в зависимости от значения «снежного покрытия». +STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Выберите, на какой высоте в субарктическом климате устанавливается снеговой покров. Наличие снега влияет на расстановку предприятий и на условия роста городов.{}Значение может быть изменено только в редакторе сценариев; иначе оно рассчитывается в зависимости от значения «снежного покрытия». STR_CONFIG_SETTING_SNOW_COVERAGE :Снежное покрытие: {STRING} -STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Это значение определяет примерную относительную площадь суши, покрытой снегом в субарктическом климате. Наличие снега влияет на расположение предприятий и на условия роста городов.{}Используется только при создании карты. Земля чуть выше уровня моря никогда не покрывается снегом. +STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Выберите примерную относительную площадь суши, покрытой снегом в субарктическом климате. Наличие снега влияет на расположение предприятий и на условия роста городов.{}Это значение используется только при создании карты. Земля на уровне моря и береговые клетки никогда не покрываются снегом. STR_CONFIG_SETTING_SNOW_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_DESERT_COVERAGE :Песчаное покрытие: {STRING} -STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Это значение определяет примерную относительную площадь суши, покрытой песком в тропическом климате. Пустыни влияют на расположение предприятий.{}Используется только при создании карты. +STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Выберите примерную относительную площадь суши, покрытой песком в тропическом климате. Пустыни влияют на расположение предприятий и условия роста городов.{}Это значение используется только при создании карты. STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Грубость ландшафта: {STRING} -STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(Только для TerraGenesis){}Выберите количество гор и холмов на карте. На гладком ландшафте холмов немного и они более пологие. На грубом - много гор, и ландшафт может показаться слишком однообразным. +STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :Выберите количество и вид холмов на карте. На гладком ландшафте холмов немного и они более широкие. На грубом холмов много, но они меньше в размерах. ###length 4 STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Очень гладкий STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :Гладкий @@ -1670,7 +1670,7 @@ STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :Грубый STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :Очень грубый STR_CONFIG_SETTING_VARIETY :Разнообразие ландшафта: {STRING} -STR_CONFIG_SETTING_VARIETY_HELPTEXT :(Только для TerraGenesis){}Определяет наличие на карте как горных, так и равнинных областей. Поскольку данная настройка влияет только на сглаживание карты, остальные настройки должны быть выставлены в горный ландшафт. +STR_CONFIG_SETTING_VARIETY_HELPTEXT :Определяет наличие на карте как горных, так и равнинных областей. Чем выше разнообразие, тем выше разница в высоте между этими зонами. STR_CONFIG_SETTING_RIVER_AMOUNT :Количество рек: {STRING} STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :Выберите количество рек на карте @@ -1690,6 +1690,7 @@ STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Левосто STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Правостороннее STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Вращение карты высот: {STRING} +STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP :Изображение карты высот можно развернуть, чтобы оно соответствовало игровой карте. ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Против часовой стрелки STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :По часовой стрелке @@ -3383,11 +3384,15 @@ STR_MAPGEN_MAPSIZE :{BLACK}Разм STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Выберите размер карты в клетках. Размер поля, доступного игрокам, будет немного меньше. STR_MAPGEN_BY :{BLACK}× STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Количество городов: +STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP :{BLACK}Выберите плотность расположения городов на карте, или укажите их точное количество STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Названия городов: STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Язык, который будет использоваться для выбора названий населённых пунктов STR_MAPGEN_DATE :{BLACK}Дата: +STR_MAPGEN_DATE_TOOLTIP :{BLACK}Выберите начальную дату в игре STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Кол-во предпр.: +STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP :{BLACK}Выберите плотность расположения предприятий на карте, или укажите их точное количество STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Высочайшая вершина: +STR_MAPGEN_HEIGHTMAP_HEIGHT_TOOLTIP :{BLACK}Укажите максимальную высоту гор, создаваемых генератором карт (относительно уровня моря) STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}Увеличить максимальную высоту гор на карте на 1 STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}Уменьшить максимальную высоту гор на карте на 1 STR_MAPGEN_SNOW_COVERAGE :{BLACK}Снежное покрытие: @@ -3400,10 +3405,12 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Умен STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_TERRAIN_TYPE :{BLACK}Тип ландшафта: STR_MAPGEN_SEA_LEVEL :{BLACK}Количество морей и озёр: +STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK}Выберите значение уровня моря STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Количество рек: STR_MAPGEN_SMOOTHNESS :{BLACK}Грубость ландшафта: STR_MAPGEN_VARIETY :{BLACK}Разнообразие ландшафта: STR_MAPGEN_GENERATE :{WHITE}Создать +STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Сгенерировать карту и начать игру! STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}Настройки NewGRF STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Показать настройки NewGRF STR_MAPGEN_AI_SETTINGS :{BLACK}Настройки ИИ @@ -3436,6 +3443,7 @@ STR_MAPGEN_TOWN_NAME_CATALAN :Каталан # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Края карты: +STR_MAPGEN_BORDER_TYPE_TOOLTIP :{BLACK}Выберите типы границ игровой карты STR_MAPGEN_NORTHWEST :{BLACK}Северо-запад STR_MAPGEN_NORTHEAST :{BLACK}Северо-восток STR_MAPGEN_SOUTHEAST :{BLACK}Юго-восток @@ -3448,7 +3456,9 @@ STR_MAPGEN_BORDER_MANUAL :{BLACK}Вруч STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Поворот карты: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Название карты: +STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP :{BLACK}Имя файла с изображением, используемым для карты высот STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Размер: +STR_MAPGEN_HEIGHTMAP_SIZE_LABEL_TOOLTIP :{BLACK}Размеры исходного изображения для карты высот. Для наилучшего результата они должны соответствовать размерам карты OpenTTD: 256, 512, 1024 и{NBSP}т.{NBSP}д. STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} × {NUM} STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT :{WHITE}Максимальная высота @@ -3463,6 +3473,7 @@ STR_SE_MAPGEN_FLAT_WORLD :{WHITE}Плос STR_SE_MAPGEN_FLAT_WORLD_TOOLTIP :{BLACK}Создать ровную землю STR_SE_MAPGEN_RANDOM_LAND :{WHITE}Случайный рельеф STR_SE_MAPGEN_FLAT_WORLD_HEIGHT :{BLACK}Высота над уровнем моря: +STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_TOOLTIP :{BLACK}Выберите высоту ландшафта над уровнем моря STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN :{BLACK}Поднять уровень ровной земли на 1 STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}Опустить уровень ровной земли на 1 From 661e0cd82df200df13249ca8f84d0ed4e5f7e25c Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 16 Dec 2023 23:08:42 +0000 Subject: [PATCH 085/105] Fix: Make compact picker windows expand to fill if necessary. (#11591) --- src/rail_gui.cpp | 2 +- src/road_gui.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index 13620db689..5eab87035e 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -1535,7 +1535,7 @@ static const NWidgetPart _nested_station_builder_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_PANEL, COLOUR_DARK_GREEN), NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_normal, 0), SetPadding(WidgetDimensions::unscaled.picker), - NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_normal, 0), + NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_normal, 0), SetPIPRatio(1, 0, 1), NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_picker, 0), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_BRAS_FILTER_CONTAINER), NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_normal, 0), diff --git a/src/road_gui.cpp b/src/road_gui.cpp index d289753022..fecb5387aa 100644 --- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -1607,7 +1607,7 @@ static const NWidgetPart _nested_road_station_picker_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_PANEL, COLOUR_DARK_GREEN), NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_normal, 0), SetPadding(WidgetDimensions::unscaled.picker), - NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_normal, 0), + NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_normal, 0), SetPIPRatio(1, 0, 1), NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_picker, 0), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_BROS_FILTER_CONTAINER), NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_normal, 0), @@ -1696,7 +1696,7 @@ static const NWidgetPart _nested_tram_station_picker_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_PANEL, COLOUR_DARK_GREEN), NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_normal, 0), SetPadding(WidgetDimensions::unscaled.picker), - NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_normal, 0), + NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_normal, 0), SetPIPRatio(1, 0, 1), NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_picker, 0), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_BROS_FILTER_CONTAINER), NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_normal, 0), From 8ab3838387e62f44ba17bc41396a1649a62f8b4a Mon Sep 17 00:00:00 2001 From: translators Date: Sun, 17 Dec 2023 18:37:38 +0000 Subject: [PATCH 086/105] Update: Translations from eints vietnamese: 20 changes by KhoiCanDev italian: 5 changes by Rivarossi --- src/lang/italian.txt | 9 +++++---- src/lang/vietnamese.txt | 22 ++++++++++++++++++++-- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/lang/italian.txt b/src/lang/italian.txt index 288dc05eaa..6d300ac363 100644 --- a/src/lang/italian.txt +++ b/src/lang/italian.txt @@ -1526,7 +1526,7 @@ STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Originale STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis STR_CONFIG_SETTING_TERRAIN_TYPE :Tipo di terreno: {STRING} -STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(Solo con TerraGenesis) Tipo di dislivelli presenti nel paesaggio. +STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :Scegliere l'altezza delle colline e delle montagne del paesaggio STR_CONFIG_SETTING_INDUSTRY_DENSITY :Densità delle industrie: {STRING.fs} STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Determina quante industrie sono generate e a quale livello di densità sulla mappa sono mantenute nel corso della partita. @@ -1538,11 +1538,11 @@ STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Altezza delle n STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Scegliere a quale altezza inizia a nevicare nel paesaggio sub-artico. La neve influisce anche sulla generazione di industrie e sui requisiti di crescita delle città. Può essere modificato solo tramite l'Editor scenari o viene altrimenti calcolato tramite le "Aree innevate". STR_CONFIG_SETTING_SNOW_COVERAGE :Aree innevate: {STRING} -STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Regola la quantità approssimativa di neve presente nel paesaggio subartico. La neve influisce anche sulla generazione dell'industria e sui requisiti di crescita della città. Si può impostare solo durante la generazione della mappa o nelle impostazioni prima dell'inizio di una nuova partita. La terra appena sopra il livello del mare non è mai innevata. +STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Scegliere la quantità approssimativa di neve sul paesaggio sub-artico. La neve influisce anche sulla generazione di industrie e sui requisiti di crescita delle città. Si usa solo durante la generazione della mappa. Le caselle del livello del mare e della costa non hanno mai neve. STR_CONFIG_SETTING_SNOW_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_DESERT_COVERAGE :Aree desertiche: {STRING} -STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Regola la quantità approssimativa di deserto nei paesaggi tropicali. Il deserto influenza anche la generazione di industrie. Si può impostare solo durante la generazione della mappa o nelle impostazioni prima dell'inizio di una nuova partita. +STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Scegliere la quantità approssimativa di deserto nel paesaggio tropicale. Il deserto influisce anche sulla generazione di industrie e sui requisiti di crescita delle città. Utilizzato solo durante la generazione della mappa STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Irregolarità del terreno: {STRING} @@ -1554,7 +1554,7 @@ STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :Accidentato STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :Molto accidentato STR_CONFIG_SETTING_VARIETY :Varietà del terreno: {STRING} -STR_CONFIG_SETTING_VARIETY_HELPTEXT :(Solo con TerraGenesis) Determina in quale misura la mappa affianca aree montuose ed aree pianeggianti. Poiché questa impostazione agisce abbassando progressivamente la quota del terreno, le altre impostazioni dovrebbero essere impostate per un terreno montuoso. +STR_CONFIG_SETTING_VARIETY_HELPTEXT :Scegliere se la mappa deve contenere sia montagne che aree pianeggianti. Più alta è la varietà, maggiori sono le differenze di altitudine tra aree montuose e pianeggianti. STR_CONFIG_SETTING_RIVER_AMOUNT :Quantità di fiumi: {STRING} STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :Imposta la quantità di fiumi da generare. @@ -1695,6 +1695,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Abilita l'utili STR_CONFIG_SETTING_LOADING_INDICATORS :Utilizza gli indicatori di caricamento: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Determina se gli indicatori di caricamento sono mostrati sopra i veicoli in caricamento o scaricamento +STR_CONFIG_SETTING_TIMETABLE_MODE :Unità di tempo per gli orari: {STRING} STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Selezionare le unità di tempo utilizzate per gli orari dei veicoli. ###length 3 STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS :Giorni diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index 99273b8f10..008e2bb737 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -255,6 +255,7 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m +STR_UNITS_DAYS :{COMMA}{NBSP}ngày STR_UNITS_SECONDS :{COMMA}{NBSP}giây STR_UNITS_TICKS :{COMMA}{NBSP}tick @@ -1490,7 +1491,7 @@ STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Nguyên Bản STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis STR_CONFIG_SETTING_TERRAIN_TYPE :Kiểu nền đất: {STRING} -STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(Chỉ cho TerraGenesis) Địa hình nhiều đồi núi +STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :Chọn độ cao của đồi núi trên địa hình STR_CONFIG_SETTING_INDUSTRY_DENSITY :Mật độ nhà máy: {STRING} STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Thiết lập số nhà máy sẽ được tạo ra và mức độ dùy trì trong ván chơi @@ -1518,7 +1519,7 @@ STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :Gồ Ghề STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :Rất Gồ Ghề STR_CONFIG_SETTING_VARIETY :Phân bổ sự đa dạng: {STRING} -STR_CONFIG_SETTING_VARIETY_HELPTEXT :(Chỉ cho TerraGenesis) Điều chỉnh liệu rằng bản đồ gồm cả vùng núi cao và vùng đồng bằng. Đây chỉ là điều chỉnh cho sự bằng phẳng hơn, các thiết lập khác sẽ điều chỉnh cho vùng núi. +STR_CONFIG_SETTING_VARIETY_HELPTEXT :Điều chỉnh liệu rằng bản đồ gồm cả vùng núi cao và vùng đồng bằng. Độ đa dạng càng cao thì sự chênh lệch về độ cao giữa vùng núi và vùng đồng bằng càng nhiều. STR_CONFIG_SETTING_RIVER_AMOUNT :Số lượng sông ngòi: {STRING} STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :Chọn số lượng sông ngòi được khởi tạo @@ -1538,6 +1539,7 @@ STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Lái bên trái STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Lái bên phải STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Xoay bản đồ địa hình: {STRING} +STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP :Chọn chiều xoay của ảnh địa hình để dùng trong thế giới của trò chơi ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Ngược chiều đồng hồ STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :Xuôi chiều đồng hồ @@ -1658,6 +1660,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Cho phép sử STR_CONFIG_SETTING_LOADING_INDICATORS :Hiển thị quá trình nạp hàng: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Lựa chọn liệu có chỉ thị tỉ lệ bốc xếp hiển thị khi bốc xếp hàng +STR_CONFIG_SETTING_TIMETABLE_MODE :Đơn vị thời gian của bảng biểu: {STRING} STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Chọn đơn vị thời gian sử dụng cho bảng biểu của phương tiện ###length 3 STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS :Ngày @@ -3206,10 +3209,13 @@ STR_MAPGEN_MAPSIZE :{BLACK}Kích th STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Lựa chọn kích thước bản đồ theo đơn vị ô. Số lượng ô thực sự có thể nhỏ hơn 1 chút. STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Số lượng đô thị: +STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP :{BLACK}Chọn độ dày đặc của thị trấn, hoặc nhập một số tự chọn STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Tên thị trấn: STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Lựa chọn kiểu tên thị trấn STR_MAPGEN_DATE :{BLACK}Thời điểm: +STR_MAPGEN_DATE_TOOLTIP :{BLACK}Chọn ngày bắt đầu STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Số lượng nhà máy: +STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP :Chọn độ dày đặc của nhà máy, hoặc nhập một số tự chọn STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Độ cao đỉnh cao nhất: STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}Tăng chiều cao tối đa của đỉnh cao nhất lên một đơn vị STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}Giảm độ cao tối đa của đỉnh cao nhất trên bản đồ một đơn vị @@ -3223,10 +3229,12 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Giảm STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_TERRAIN_TYPE :{BLACK}Kiểu nền đất: STR_MAPGEN_SEA_LEVEL :{BLACK}Mực nước biển: +STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK}Chọn mực nước biển STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Số sông/suối: STR_MAPGEN_SMOOTHNESS :{BLACK}Độ phẳng phiu: STR_MAPGEN_VARIETY :{BLACK}Phân bổ sự đa dạng: STR_MAPGEN_GENERATE :{WHITE}Khởi Tạo +STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Kiến tạo thế giới và chơi với OpenTTD! STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}Thiết Lập NewGRF STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Hiển thị tùy chỉnh NewGRF STR_MAPGEN_AI_SETTINGS :{BLACK}Thiết lập AI @@ -3259,6 +3267,7 @@ STR_MAPGEN_TOWN_NAME_CATALAN :Catalan # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Rìa bản đồ: +STR_MAPGEN_BORDER_TYPE_TOOLTIP :{BLACK}Chọn loại ranh giới của thế giới của trò chơi STR_MAPGEN_NORTHWEST :{BLACK}Tây Bắc STR_MAPGEN_NORTHEAST :{BLACK}Đông Bắc STR_MAPGEN_SOUTHEAST :{BLACK}Đông Nam @@ -3271,6 +3280,7 @@ STR_MAPGEN_BORDER_MANUAL :{BLACK}Bằng T STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Xoay bản đồ địa hình: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Tên bản đồ địa hình: +STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP :{BLACK}Tên tập tin bản đồ địa hình STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Cỡ: STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM} @@ -3286,6 +3296,7 @@ STR_SE_MAPGEN_FLAT_WORLD :{WHITE}Đất b STR_SE_MAPGEN_FLAT_WORLD_TOOLTIP :{BLACK}Tạo ra đất bằng STR_SE_MAPGEN_RANDOM_LAND :{WHITE}Nền đất ngẫu nhiên STR_SE_MAPGEN_FLAT_WORLD_HEIGHT :{BLACK}Độ cao của đồng bằng: +STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_TOOLTIP :{BLACK}Chọn độ cao của đất so với mực nước biển STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN :{BLACK}Hạ độ cao của đồng bằng xuống một STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}Nâng độ cao của đồng bằng lên một @@ -4579,9 +4590,12 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Phương STR_TIMETABLE_STATUS_LATE :{BLACK}Phương tiện này đang chạy trễ dự kiến {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}Phương tiện này đang chạy sớm hơn dự kiến {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Bảng lịch trình này chưa khởi tạo +STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}Bảng biểu sẽ bắt đầu lúc {STRING} STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}Lịch trình này sẽ bắt đầu trong {COMMA} giây +STR_TIMETABLE_START :{BLACK}Khởi động bảng biểu +STR_TIMETABLE_START_SECONDS_QUERY :Số giây cho đến khi lịch trình bắt đầu STR_TIMETABLE_CHANGE_TIME :{BLACK}Đổi thời gian STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Thay đổi thời lượng của điểm lộ trình được phép sử dụng. Ctrl+Click đặt thời gian cho mọi lộ trình @@ -4605,7 +4619,10 @@ STR_TIMETABLE_EXPECTED :{BLACK}Mong mu STR_TIMETABLE_SCHEDULED :{BLACK}Chốt lịch STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Chuyển giữa lịch mong muốn và lịch được chốt +STR_TIMETABLE_ARRIVAL_DATE :Đến: {COLOUR}{DATE_TINY} +STR_TIMETABLE_DEPARTURE_DATE :Đến: {COLOUR}{DATE_TINY} STR_TIMETABLE_ARRIVAL_SECONDS_IN_FUTURE :Đến: {COLOUR}{COMMA} giây +STR_TIMETABLE_DEPARTURE_SECONDS_IN_FUTURE :Đến: {COLOUR}{COMMA} giây # Date window (for timetable) @@ -4711,6 +4728,7 @@ STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Ép ch STR_TEXTFILE_VIEW_README :{BLACK}Readme STR_TEXTFILE_VIEW_README_TOOLTIP :Xem readme của nội dung này STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Lịch sử thay đổi +STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP :Xem lịch sử thay đổi của nội dung này STR_TEXTFILE_VIEW_LICENCE :{BLACK}Giấy phép STR_TEXTFILE_VIEW_LICENCE_TOOLTIP :Xem giấy phép của nội dung này ###length 5 From c05ffb22bd4d87ec1c69639cfc63fa56f7037381 Mon Sep 17 00:00:00 2001 From: SamuXarick <43006711+SamuXarick@users.noreply.github.com> Date: Sun, 17 Dec 2023 21:50:53 +0000 Subject: [PATCH 087/105] Fix #10452: Don't let AyStar max_search_nodes unattended when initializing (#11544) Add a constant with the default value of 10000 and have the pathfinding settings refer to it. Add a preventative method to AyStar when it's initializing, to limit the number of max_search_nodes if left unattended. --- src/pathfinder/npf/aystar.cpp | 3 +++ src/pathfinder/npf/aystar.h | 2 ++ src/pathfinder/pathfinder_type.h | 1 + src/table/settings/pathfinding_settings.ini | 4 ++-- 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/pathfinder/npf/aystar.cpp b/src/pathfinder/npf/aystar.cpp index 698b8183ac..b52b762d84 100644 --- a/src/pathfinder/npf/aystar.cpp +++ b/src/pathfinder/npf/aystar.cpp @@ -301,4 +301,7 @@ void AyStar::Init(Hash_HashProc hash, uint num_buckets) * When that one gets full it reserves another one, till this number * That is why it can stay this high */ this->openlist_queue.Init(102400); + + /* Set a reasonable default limit */ + this->max_search_nodes = AYSTAR_DEF_MAX_SEARCH_NODES; } diff --git a/src/pathfinder/npf/aystar.h b/src/pathfinder/npf/aystar.h index 7046fcf570..5bd2368172 100644 --- a/src/pathfinder/npf/aystar.h +++ b/src/pathfinder/npf/aystar.h @@ -20,6 +20,8 @@ #include "../../tile_type.h" #include "../../track_type.h" +static const int AYSTAR_DEF_MAX_SEARCH_NODES = 10000; ///< Reference limit for #AyStar::max_search_nodes + /** Return status of #AyStar methods. */ enum AystarStatus { AYSTAR_FOUND_END_NODE, ///< An end node was found. diff --git a/src/pathfinder/pathfinder_type.h b/src/pathfinder/pathfinder_type.h index eb0381d8a3..379297adfc 100644 --- a/src/pathfinder/pathfinder_type.h +++ b/src/pathfinder/pathfinder_type.h @@ -11,6 +11,7 @@ #define PATHFINDER_TYPE_H #include "../tile_type.h" +#include "npf/aystar.h" /** Length (penalty) of one tile with NPF */ static const int NPF_TILE_LENGTH = 100; diff --git a/src/table/settings/pathfinding_settings.ini b/src/table/settings/pathfinding_settings.ini index df2494d351..e06e8d501b 100644 --- a/src/table/settings/pathfinding_settings.ini +++ b/src/table/settings/pathfinding_settings.ini @@ -168,7 +168,7 @@ cat = SC_EXPERT [SDT_VAR] var = pf.npf.npf_max_search_nodes type = SLE_UINT -def = 10000 +def = AYSTAR_DEF_MAX_SEARCH_NODES min = 500 max = 100000 cat = SC_EXPERT @@ -325,7 +325,7 @@ cat = SC_EXPERT var = pf.yapf.max_search_nodes type = SLE_UINT from = SLV_28 -def = 10000 +def = AYSTAR_DEF_MAX_SEARCH_NODES min = 500 max = 1000000 cat = SC_EXPERT From b19a6c3b817cc6790df8d24e61450ce33fa915b1 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 18 Dec 2023 13:05:06 +0000 Subject: [PATCH 088/105] Fix: Window width/height was doubly-scaled with automatic DPI switch. (#11598) --- src/gfx.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/gfx.cpp b/src/gfx.cpp index 28650dff00..c6562b8f09 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -2002,8 +2002,6 @@ bool AdjustGUIZoom(bool automatic) if (automatic) { w->left = (w->left * _gui_scale) / old_scale; w->top = (w->top * _gui_scale) / old_scale; - w->width = (w->width * _gui_scale) / old_scale; - w->height = (w->height * _gui_scale) / old_scale; } if (w->viewport != nullptr) { w->viewport->zoom = Clamp(ZoomLevel(w->viewport->zoom - zoom_shift), _settings_client.gui.zoom_min, _settings_client.gui.zoom_max); From 9b7a5bc876d3bf62c11823f685452ca75b8c60b3 Mon Sep 17 00:00:00 2001 From: translators Date: Mon, 18 Dec 2023 18:39:11 +0000 Subject: [PATCH 089/105] Update: Translations from eints vietnamese: 1 change by KhoiCanDev danish: 4 changes by bscargo --- src/lang/danish.txt | 4 ++++ src/lang/vietnamese.txt | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/lang/danish.txt b/src/lang/danish.txt index 508e183215..63ef2596cf 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -1537,6 +1537,7 @@ STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Kør i venstre STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Kør i højre side STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Rotér højdekort: {STRING} +STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP :Vælg, hvilken vej højdekortets billede skal roteres for at passe ind i spilverdenen ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Mod uret STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :Med uret @@ -3204,9 +3205,11 @@ STR_MAPGEN_MAPSIZE :{BLACK}Kortstø STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Vælg kortets størrelse i fliser. Antallet af tilgængelige fliser vil være en anelse mindre STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Antal byer: +STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP :{BLACK}Vælg tætheden af byer eller et brugerdefineret nummer STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Bynavne: STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Vælg stil for bynavne STR_MAPGEN_DATE :{BLACK}Dato: +STR_MAPGEN_DATE_TOOLTIP :{BLACK}Vælg startdato STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Antal industrier: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Højeste bjergtop: STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}Forøger den maksimale højde på højeste bjergtop på kortet med én @@ -3225,6 +3228,7 @@ STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Floder: STR_MAPGEN_SMOOTHNESS :{BLACK}Blødhed: STR_MAPGEN_VARIETY :{BLACK}Varietet af distributionen: STR_MAPGEN_GENERATE :{WHITE}Generer +STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Skab en verden og spil OpenTTD! STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF indstillinger STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Vis indstillinger for NewGRF STR_MAPGEN_AI_SETTINGS :{BLACK}AI indstillinger diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index 008e2bb737..d29cbb867c 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -1511,7 +1511,7 @@ STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Điều chỉnh STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Độ gồ ghề của địa chất: {STRING} -STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(Chỉ cho TerraGenesis) Chọn mức độ trùng điệp của núi: địa hình bằng phẳng thì ít hơn, địa hình đồi núi thì nhiều hơn. Địa hình gồ ghề có nhiều núi và trông có vẻ lặp lại +STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :Chọn hình dạng và số lượng đồi núi. Địa hình bằng phẳng có ít núi nhưng chúng sẽ rộng hơn, trong khi địa hình gồ ghề có nhiều núi với kích cỡ nhỏ. ###length 4 STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Rất Phẳng STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :Phẳng From fddcaef74a623a820017172860c5ad58c14e80ab Mon Sep 17 00:00:00 2001 From: SamuXarick <43006711+SamuXarick@users.noreply.github.com> Date: Mon, 11 Dec 2023 17:04:41 +0000 Subject: [PATCH 090/105] Codechange: Use town zone constants instead of magic numbers --- src/newgrf_town.cpp | 20 ++++++++++---------- src/road_cmd.cpp | 4 ++++ src/script/api/script_town.cpp | 2 +- src/town_cmd.cpp | 16 ++++++++-------- 4 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/newgrf_town.cpp b/src/newgrf_town.cpp index 83eda4204c..5565551ee0 100644 --- a/src/newgrf_town.cpp +++ b/src/newgrf_town.cpp @@ -51,16 +51,16 @@ case 0x8A: return this->t->grow_counter / Ticks::TOWN_GROWTH_TICKS; case 0x92: return this->t->flags; // In original game, 0x92 and 0x93 are really one word. Since flags is a byte, this is to adjust case 0x93: return 0; - case 0x94: return ClampTo(this->t->cache.squared_town_zone_radius[0]); - case 0x95: return GB(ClampTo(this->t->cache.squared_town_zone_radius[0]), 8, 8); - case 0x96: return ClampTo(this->t->cache.squared_town_zone_radius[1]); - case 0x97: return GB(ClampTo(this->t->cache.squared_town_zone_radius[1]), 8, 8); - case 0x98: return ClampTo(this->t->cache.squared_town_zone_radius[2]); - case 0x99: return GB(ClampTo(this->t->cache.squared_town_zone_radius[2]), 8, 8); - case 0x9A: return ClampTo(this->t->cache.squared_town_zone_radius[3]); - case 0x9B: return GB(ClampTo(this->t->cache.squared_town_zone_radius[3]), 8, 8); - case 0x9C: return ClampTo(this->t->cache.squared_town_zone_radius[4]); - case 0x9D: return GB(ClampTo(this->t->cache.squared_town_zone_radius[4]), 8, 8); + case 0x94: return ClampTo(this->t->cache.squared_town_zone_radius[HZB_TOWN_EDGE]); + case 0x95: return GB(ClampTo(this->t->cache.squared_town_zone_radius[HZB_TOWN_EDGE]), 8, 8); + case 0x96: return ClampTo(this->t->cache.squared_town_zone_radius[HZB_TOWN_OUTSKIRT]); + case 0x97: return GB(ClampTo(this->t->cache.squared_town_zone_radius[HZB_TOWN_OUTSKIRT]), 8, 8); + case 0x98: return ClampTo(this->t->cache.squared_town_zone_radius[HZB_TOWN_OUTER_SUBURB]); + case 0x99: return GB(ClampTo(this->t->cache.squared_town_zone_radius[HZB_TOWN_OUTER_SUBURB]), 8, 8); + case 0x9A: return ClampTo(this->t->cache.squared_town_zone_radius[HZB_TOWN_INNER_SUBURB]); + case 0x9B: return GB(ClampTo(this->t->cache.squared_town_zone_radius[HZB_TOWN_INNER_SUBURB]), 8, 8); + case 0x9C: return ClampTo(this->t->cache.squared_town_zone_radius[HZB_TOWN_CENTRE]); + case 0x9D: return GB(ClampTo(this->t->cache.squared_town_zone_radius[HZB_TOWN_CENTRE]), 8, 8); case 0x9E: return this->t->ratings[0]; case 0x9F: return GB(this->t->ratings[0], 8, 8); case 0xA0: return this->t->ratings[1]; diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index a71d2005e7..53cc8e2278 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -1937,6 +1937,8 @@ static const Roadside _town_road_types[][2] = { { ROADSIDE_STREET_LIGHTS, ROADSIDE_PAVED } }; +static_assert(lengthof(_town_road_types) == HZB_END); + static const Roadside _town_road_types_2[][2] = { { ROADSIDE_GRASS, ROADSIDE_GRASS }, { ROADSIDE_PAVED, ROADSIDE_PAVED }, @@ -1945,6 +1947,8 @@ static const Roadside _town_road_types_2[][2] = { { ROADSIDE_STREET_LIGHTS, ROADSIDE_PAVED } }; +static_assert(lengthof(_town_road_types_2) == HZB_END); + static void TileLoop_Road(TileIndex tile) { diff --git a/src/script/api/script_town.cpp b/src/script/api/script_town.cpp index b884374b6c..57e94db7de 100644 --- a/src/script/api/script_town.cpp +++ b/src/script/api/script_town.cpp @@ -206,7 +206,7 @@ if (!IsValidTown(town_id)) return false; const Town *t = ::Town::Get(town_id); - return ((uint32_t)GetDistanceSquareToTile(town_id, tile) <= t->cache.squared_town_zone_radius[0]); + return ((uint32_t)GetDistanceSquareToTile(town_id, tile) <= t->cache.squared_town_zone_radius[HZB_TOWN_EDGE]); } /* static */ bool ScriptTown::HasStatue(TownID town_id) diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 48fbf03940..8a40d3d457 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -1819,7 +1819,7 @@ static bool GrowTown(Town *t) */ void UpdateTownRadius(Town *t) { - static const uint32_t _town_squared_town_zone_radius_data[23][5] = { + static const uint32_t _town_squared_town_zone_radius_data[23][HZB_END] = { { 4, 0, 0, 0, 0}, // 0 { 16, 0, 0, 0, 0}, { 25, 0, 0, 0, 0}, @@ -1852,11 +1852,11 @@ void UpdateTownRadius(Town *t) /* Actually we are proportional to sqrt() but that's right because we are covering an area. * The offsets are to make sure the radii do not decrease in size when going from the table * to the calculated value.*/ - t->cache.squared_town_zone_radius[0] = mass * 15 - 40; - t->cache.squared_town_zone_radius[1] = mass * 9 - 15; - t->cache.squared_town_zone_radius[2] = 0; - t->cache.squared_town_zone_radius[3] = mass * 5 - 5; - t->cache.squared_town_zone_radius[4] = mass * 3 + 5; + t->cache.squared_town_zone_radius[HZB_TOWN_EDGE] = mass * 15 - 40; + t->cache.squared_town_zone_radius[HZB_TOWN_OUTSKIRT] = mass * 9 - 15; + t->cache.squared_town_zone_radius[HZB_TOWN_OUTER_SUBURB] = 0; + t->cache.squared_town_zone_radius[HZB_TOWN_INNER_SUBURB] = mass * 5 - 5; + t->cache.squared_town_zone_radius[HZB_TOWN_CENTRE] = mass * 3 + 5; } } @@ -3482,9 +3482,9 @@ static void ForAllStationsNearTown(Town *t, Func func) * The true radius is not stored or calculated anywhere, only the squared radius. */ /* The efficiency of this search might be improved for large towns and many stations on the map, * by using an integer square root approximation giving a value not less than the true square root. */ - uint search_radius = t->cache.squared_town_zone_radius[0] / 2; + uint search_radius = t->cache.squared_town_zone_radius[HZB_TOWN_EDGE] / 2; ForAllStationsRadius(t->xy, search_radius, [&](const Station * st) { - if (DistanceSquare(st->xy, t->xy) <= t->cache.squared_town_zone_radius[0]) { + if (DistanceSquare(st->xy, t->xy) <= t->cache.squared_town_zone_radius[HZB_TOWN_EDGE]) { func(st); } }); From e8d2ebb016f736c8c59b3b406fac8a0648e94c77 Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Tue, 19 Dec 2023 09:09:46 -0500 Subject: [PATCH 091/105] Fix: Add missing includes to timers from script implementation files (#11604) --- src/script/api/script_basestation.cpp | 1 + src/script/api/script_date.hpp | 2 +- src/script/api/script_engine.cpp | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/script/api/script_basestation.cpp b/src/script/api/script_basestation.cpp index 2dc0ce6c81..2c450937b5 100644 --- a/src/script/api/script_basestation.cpp +++ b/src/script/api/script_basestation.cpp @@ -15,6 +15,7 @@ #include "../../strings_func.h" #include "../../station_cmd.h" #include "../../waypoint_cmd.h" +#include "../../timer/timer_game_calendar.h" #include "table/strings.h" #include "../../safeguards.h" diff --git a/src/script/api/script_date.hpp b/src/script/api/script_date.hpp index b224c6e62b..43d197226f 100644 --- a/src/script/api/script_date.hpp +++ b/src/script/api/script_date.hpp @@ -11,7 +11,7 @@ #define SCRIPT_DATE_HPP #include "script_object.hpp" -#include "timer/timer_game_calendar.h" +#include "../../timer/timer_game_calendar.h" /** * Class that handles all date related (calculation) functions. diff --git a/src/script/api/script_engine.cpp b/src/script/api/script_engine.cpp index 6475e9d003..bce5816251 100644 --- a/src/script/api/script_engine.cpp +++ b/src/script/api/script_engine.cpp @@ -18,6 +18,7 @@ #include "../../engine_func.h" #include "../../articulated_vehicles.h" #include "../../engine_cmd.h" +#include "../../timer/timer_game_calendar.h" #include "table/strings.h" #include "../../safeguards.h" From 7d3ae4a058968078ff7d3156ed05e5dd8af49281 Mon Sep 17 00:00:00 2001 From: Finn Willard Date: Sat, 17 Jun 2023 16:28:45 -0700 Subject: [PATCH 092/105] Add: Hotkey to focus town directory filter box Co-authored-by: Tyler Trahan --- src/town_gui.cpp | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/town_gui.cpp b/src/town_gui.cpp index 81a561676b..dddfc6d81f 100644 --- a/src/town_gui.cpp +++ b/src/town_gui.cpp @@ -38,6 +38,7 @@ #include "timer/timer_game_calendar.h" #include "timer/timer_window.h" #include "zoom_func.h" +#include "hotkeys.h" #include "widgets/town_widget.h" @@ -694,6 +695,11 @@ static const NWidgetPart _nested_town_directory_widgets[] = { EndContainer(), }; +/** Enum referring to the Hotkeys in the town directory window */ +enum TownDirectoryHotkeys { + TDHK_FOCUS_FILTER_BOX, ///< Focus the filter box +}; + /** Town directory window class. */ struct TownDirectoryWindow : public Window { private: @@ -1006,6 +1012,23 @@ public: this->towns.ForceResort(); } } + + EventState OnHotkey(int hotkey) override + { + switch (hotkey) { + case TDHK_FOCUS_FILTER_BOX: + this->SetFocusedWidget(WID_TD_FILTER); + SetFocusedWindow(this); // The user has asked to give focus to the text box, so make sure this window is focused. + break; + default: + return ES_NOT_HANDLED; + } + return ES_HANDLED; + } + + static inline HotkeyList hotkeys {"towndirectory", { + Hotkey('F', "focus_filter_box", TDHK_FOCUS_FILTER_BOX), + }}; }; Listing TownDirectoryWindow::last_sorting = {false, 0}; @@ -1029,7 +1052,8 @@ static WindowDesc _town_directory_desc(__FILE__, __LINE__, WDP_AUTO, "list_towns", 208, 202, WC_TOWN_DIRECTORY, WC_NONE, 0, - std::begin(_nested_town_directory_widgets), std::end(_nested_town_directory_widgets) + std::begin(_nested_town_directory_widgets), std::end(_nested_town_directory_widgets), + &TownDirectoryWindow::hotkeys ); void ShowTownDirectory() From 3a42340db3009bfb907394466685e6ae87147ce4 Mon Sep 17 00:00:00 2001 From: Finn Willard Date: Sat, 17 Jun 2023 17:51:10 -0700 Subject: [PATCH 093/105] Add: Hotkey to focus industry directory filter box Co-authored-by: Tyler Trahan --- src/industry_gui.cpp | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/industry_gui.cpp b/src/industry_gui.cpp index d4f659f9b8..6ed6f03ea7 100644 --- a/src/industry_gui.cpp +++ b/src/industry_gui.cpp @@ -44,6 +44,7 @@ #include "stringfilter_type.h" #include "timer/timer.h" #include "timer/timer_window.h" +#include "hotkeys.h" #include "table/strings.h" @@ -1299,7 +1300,10 @@ static bool CDECL CargoFilter(const Industry * const *industry, const std::pair< static GUIIndustryList::FilterFunction * const _filter_funcs[] = { &CargoFilter }; - +/** Enum referring to the Hotkeys in the industry directory window */ +enum IndustryDirectoryHotkeys { + IDHK_FOCUS_FILTER_BOX, ///< Focus the filter box +}; /** * The list of industries. */ @@ -1864,6 +1868,23 @@ public: break; } } + + EventState OnHotkey(int hotkey) override + { + switch (hotkey) { + case IDHK_FOCUS_FILTER_BOX: + this->SetFocusedWidget(WID_ID_FILTER); + SetFocusedWindow(this); // The user has asked to give focus to the text box, so make sure this window is focused. + break; + default: + return ES_NOT_HANDLED; + } + return ES_HANDLED; + } + + static inline HotkeyList hotkeys {"industrydirectory", { + Hotkey('F', "focus_filter_box", IDHK_FOCUS_FILTER_BOX), + }}; }; Listing IndustryDirectoryWindow::last_sorting = {false, 0}; @@ -1893,7 +1914,8 @@ static WindowDesc _industry_directory_desc(__FILE__, __LINE__, WDP_AUTO, "list_industries", 428, 190, WC_INDUSTRY_DIRECTORY, WC_NONE, 0, - std::begin(_nested_industry_directory_widgets), std::end(_nested_industry_directory_widgets) + std::begin(_nested_industry_directory_widgets), std::end(_nested_industry_directory_widgets), + &IndustryDirectoryWindow::hotkeys ); void ShowIndustryDirectory() From 111b4e6060421be6c62a043abb0ff78c4b107822 Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Tue, 19 Dec 2023 21:15:15 -0500 Subject: [PATCH 094/105] Doc: Fix broken links in COMPILING and CONTRIBUTING guides (#11608) --- COMPILING.md | 2 +- CONTRIBUTING.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/COMPILING.md b/COMPILING.md index 299494288b..5ed519553e 100644 --- a/COMPILING.md +++ b/COMPILING.md @@ -38,7 +38,7 @@ OpenTTD needs the Platform SDK, if it isn't installed already. This can be done during installing Visual Studio, by selecting `Visual C++ MFC for x86 and x64` (and possibly `Visual C++ ATL for x86 and x64` depending on your version). If not, you -can get download it as [MS Windows Platform SDK](https://developer.microsoft.com/en-US/windows/downloads/windows-10-sdk). +can get download it as [MS Windows Platform SDK](https://developer.microsoft.com/en-us/windows/downloads/windows-sdk). Install the SDK by following the instructions as given. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0f773ff320..668d73d700 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -112,7 +112,7 @@ Every pull request should have a clear scope, with no unrelated commits. Adhering to the following process is the best way to get your work included in the project: -1. [Fork](https://help.github.com/fork-a-repo/) the project, clone your fork, and configure the remotes: +1. [Fork](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo) the project, clone your fork, and configure the remotes: ```bash git clone https://github.com//OpenTTD.git openttd @@ -266,7 +266,7 @@ This is inevitable, because it is a main feature of git. If you are concerned about your privacy, we strongly recommend to use "Anonymous <anonymous@openttd.org>" as the git commit author. We might refuse anonymous contributions if malicious intent is suspected. Please note that the contributor identity, once given, is used for copyright verification and to provide proof should a malicious commit be made. -As such, the [EU GDPR](https://www.eugdpr.org/key-changes.html) "right to be forgotten" does not apply, as this is an overriding legitimate interest. +As such, the [EU GDPR](https://gdpr.eu) "right to be forgotten" does not apply, as this is an overriding legitimate interest. Please also note that your commit is public and as such will potentially be processed by many third-parties. Git's distributed nature makes it impossible to track where exactly your commit, and thus your personal data, will be stored and be processed. From 313ee13e5fb5dc29f58136c10a61165515acdb7c Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 19 Dec 2023 23:21:12 +0000 Subject: [PATCH 095/105] Codechange: Add Rect version of FillDrawPixelInfo(). This simplifies most callers as they longer have to split out a rect. --- src/dock_gui.cpp | 2 +- src/gfx_func.h | 5 +++++ src/industry_gui.cpp | 4 ++-- src/misc_gui.cpp | 2 +- src/newgrf_debug_gui.cpp | 2 +- src/object_gui.cpp | 4 ++-- src/rail_gui.cpp | 10 +++++----- src/road_gui.cpp | 6 +++--- src/roadveh_gui.cpp | 2 +- src/smallmap_gui.cpp | 2 +- src/story_gui.cpp | 2 +- src/textfile_gui.cpp | 2 +- src/train_gui.cpp | 2 +- 13 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/dock_gui.cpp b/src/dock_gui.cpp index c74eed9e94..ba2d3c3cd5 100644 --- a/src/dock_gui.cpp +++ b/src/dock_gui.cpp @@ -549,7 +549,7 @@ public: case WID_BDD_Y: { Axis axis = widget == WID_BDD_X ? AXIS_X : AXIS_Y; - if (FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.Width(), r.Height())) { + if (FillDrawPixelInfo(&tmp_dpi, r)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); int x = (r.Width() - ScaleSpriteTrad(96)) / 2; int y = (r.Height() - ScaleSpriteTrad(64)) / 2; diff --git a/src/gfx_func.h b/src/gfx_func.h index e889109674..9210c4fedf 100644 --- a/src/gfx_func.h +++ b/src/gfx_func.h @@ -153,6 +153,11 @@ void CheckBlitter(); bool FillDrawPixelInfo(DrawPixelInfo *n, int left, int top, int width, int height); +static inline bool FillDrawPixelInfo(DrawPixelInfo *n, const Rect &r) +{ + return FillDrawPixelInfo(n, r.left, r.top, r.Width(), r.Height()); +} + /** * Determine where to draw a centred object inside a widget. * @param min The top or left coordinate. diff --git a/src/industry_gui.cpp b/src/industry_gui.cpp index 6ed6f03ea7..73f4aeee6b 100644 --- a/src/industry_gui.cpp +++ b/src/industry_gui.cpp @@ -1675,7 +1675,7 @@ public: /* Setup a clipping rectangle... */ DrawPixelInfo tmp_dpi; - if (!FillDrawPixelInfo(&tmp_dpi, ir.left, ir.top, ir.Width(), ir.Height())) return; + if (!FillDrawPixelInfo(&tmp_dpi, ir)) return; /* ...but keep coordinates relative to the window. */ tmp_dpi.left += ir.left; tmp_dpi.top += ir.top; @@ -2982,7 +2982,7 @@ struct IndustryCargoesWindow : public Window { Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); DrawPixelInfo tmp_dpi; - if (!FillDrawPixelInfo(&tmp_dpi, ir.left, ir.top, ir.Width(), ir.Height())) return; + if (!FillDrawPixelInfo(&tmp_dpi, ir)) return; AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); int left_pos = WidgetDimensions::scaled.frametext.left - WidgetDimensions::scaled.bevel.left; diff --git a/src/misc_gui.cpp b/src/misc_gui.cpp index f5dbba0505..d2367c67b0 100644 --- a/src/misc_gui.cpp +++ b/src/misc_gui.cpp @@ -799,7 +799,7 @@ void QueryString::DrawEditBox(const Window *w, int wid) const fr = fr.Shrink(WidgetDimensions::scaled.framerect); /* Limit the drawing of the string inside the widget boundaries */ DrawPixelInfo dpi; - if (!FillDrawPixelInfo(&dpi, fr.left, fr.top, fr.Width(), fr.Height())) return; + if (!FillDrawPixelInfo(&dpi, fr)) return; AutoRestoreBackup dpi_backup(_cur_dpi, &dpi); diff --git a/src/newgrf_debug_gui.cpp b/src/newgrf_debug_gui.cpp index 732c9d2aef..51df78f6c9 100644 --- a/src/newgrf_debug_gui.cpp +++ b/src/newgrf_debug_gui.cpp @@ -912,7 +912,7 @@ struct SpriteAlignerWindow : Window { } DrawPixelInfo new_dpi; - if (!FillDrawPixelInfo(&new_dpi, ir.left, ir.top, ir.Width(), ir.Height())) break; + if (!FillDrawPixelInfo(&new_dpi, ir)) break; AutoRestoreBackup dpi_backup(_cur_dpi, &new_dpi); DrawSprite(this->current_sprite, PAL_NONE, x, y, nullptr, SpriteAlignerWindow::zoom); diff --git a/src/object_gui.cpp b/src/object_gui.cpp index 8740a4f25c..facf30e18f 100644 --- a/src/object_gui.cpp +++ b/src/object_gui.cpp @@ -337,7 +337,7 @@ public: DrawPixelInfo tmp_dpi; /* Set up a clipping area for the preview. */ - if (FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.Width(), r.Height())) { + if (FillDrawPixelInfo(&tmp_dpi, r)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); if (spec->grf_prop.grffile == nullptr) { extern const DrawTileSprites _objects[]; @@ -362,7 +362,7 @@ public: } DrawPixelInfo tmp_dpi; /* Set up a clipping area for the preview. */ - if (FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.Width(), r.Height())) { + if (FillDrawPixelInfo(&tmp_dpi, r)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); if (spec->grf_prop.grffile == nullptr) { extern const DrawTileSprites _objects[]; diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index 5eab87035e..328e3f0625 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -1243,7 +1243,7 @@ public: switch (GB(widget, 0, 16)) { case WID_BRAS_PLATFORM_DIR_X: /* Set up a clipping area for the '/' station preview */ - if (FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.Width(), r.Height())) { + if (FillDrawPixelInfo(&tmp_dpi, r)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); int y = (r.Height() + ScaleSpriteTrad(58)) / 2 - ScaleSpriteTrad(31); @@ -1255,7 +1255,7 @@ public: case WID_BRAS_PLATFORM_DIR_Y: /* Set up a clipping area for the '\' station preview */ - if (FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.Width(), r.Height())) { + if (FillDrawPixelInfo(&tmp_dpi, r)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); int y = (r.Height() + ScaleSpriteTrad(58)) / 2 - ScaleSpriteTrad(31); @@ -1290,7 +1290,7 @@ public: } /* Set up a clipping area for the station preview. */ - if (FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.Width(), r.Height())) { + if (FillDrawPixelInfo(&tmp_dpi, r)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); int y = (r.Height() + ScaleSpriteTrad(58)) / 2 - ScaleSpriteTrad(31); @@ -1905,7 +1905,7 @@ struct BuildRailDepotWindow : public PickerWindowBase { if (!IsInsideMM(widget, WID_BRAD_DEPOT_NE, WID_BRAD_DEPOT_NW + 1)) return; DrawPixelInfo tmp_dpi; - if (FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.Width(), r.Height())) { + if (FillDrawPixelInfo(&tmp_dpi, r)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); int y = (r.Height() + ScaleSpriteTrad(48)) / 2 - ScaleSpriteTrad(31); @@ -2095,7 +2095,7 @@ struct BuildRailWaypointWindow : PickerWindowBase { const StationSpec *statspec = this->waypoints->GetSpec(type); DrawPixelInfo tmp_dpi; - if (FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.Width(), r.Height())) { + if (FillDrawPixelInfo(&tmp_dpi, r)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); int y = (r.Height() + ScaleSpriteTrad(58)) / 2 - ScaleSpriteTrad(31); diff --git a/src/road_gui.cpp b/src/road_gui.cpp index fecb5387aa..4e53907026 100644 --- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -1029,7 +1029,7 @@ struct BuildRoadDepotWindow : public PickerWindowBase { if (!IsInsideMM(widget, WID_BROD_DEPOT_NE, WID_BROD_DEPOT_NW + 1)) return; DrawPixelInfo tmp_dpi; - if (FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.Width(), r.Height())) { + if (FillDrawPixelInfo(&tmp_dpi, r)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); int y = (r.Height() + ScaleSpriteTrad(48)) / 2 - ScaleSpriteTrad(31); @@ -1417,7 +1417,7 @@ public: const RoadStopSpec *spec = RoadStopClass::Get(_roadstop_gui_settings.roadstop_class)->GetSpec(_roadstop_gui_settings.roadstop_type); bool disabled = (spec != nullptr && widget < WID_BROS_STATION_X && HasBit(spec->flags, RSF_DRIVE_THROUGH_ONLY)); DrawPixelInfo tmp_dpi; - if (FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.Width(), r.Height())) { + if (FillDrawPixelInfo(&tmp_dpi, r)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); int y = (r.Height() + ScaleSpriteTrad(48)) / 2 - ScaleSpriteTrad(31); @@ -1459,7 +1459,7 @@ public: /* Set up a clipping area for the sprite preview. */ DrawPixelInfo tmp_dpi; - if (FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.Width(), r.Height())) { + if (FillDrawPixelInfo(&tmp_dpi, r)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); int y = (r.Height() + ScaleSpriteTrad(48)) / 2 - ScaleSpriteTrad(31); diff --git a/src/roadveh_gui.cpp b/src/roadveh_gui.cpp index 576e679c4e..f2ee0c6684 100644 --- a/src/roadveh_gui.cpp +++ b/src/roadveh_gui.cpp @@ -128,7 +128,7 @@ void DrawRoadVehImage(const Vehicle *v, const Rect &r, VehicleID selection, Engi DrawPixelInfo tmp_dpi; int max_width = r.Width(); - if (!FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.Width(), r.Height())) return; + if (!FillDrawPixelInfo(&tmp_dpi, r)) return; AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); diff --git a/src/smallmap_gui.cpp b/src/smallmap_gui.cpp index 1614c04e1c..3d0c76ca7b 100644 --- a/src/smallmap_gui.cpp +++ b/src/smallmap_gui.cpp @@ -1543,7 +1543,7 @@ public: case WID_SM_MAP: { Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); DrawPixelInfo new_dpi; - if (!FillDrawPixelInfo(&new_dpi, ir.left, ir.top, ir.Width(), ir.Height())) return; + if (!FillDrawPixelInfo(&new_dpi, ir)) return; this->DrawSmallMap(&new_dpi); break; } diff --git a/src/story_gui.cpp b/src/story_gui.cpp index 15cd7ac994..81c8517f36 100644 --- a/src/story_gui.cpp +++ b/src/story_gui.cpp @@ -688,7 +688,7 @@ public: /* Set up a clipping region for the panel. */ DrawPixelInfo tmp_dpi; - if (!FillDrawPixelInfo(&tmp_dpi, fr.left, fr.top, fr.Width(), fr.Height())) return; + if (!FillDrawPixelInfo(&tmp_dpi, fr)) return; AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); diff --git a/src/textfile_gui.cpp b/src/textfile_gui.cpp index abfcb25632..578ac7924a 100644 --- a/src/textfile_gui.cpp +++ b/src/textfile_gui.cpp @@ -555,7 +555,7 @@ void TextfileWindow::AfterLoadMarkdown() Rect fr = r.Shrink(WidgetDimensions::scaled.frametext); DrawPixelInfo new_dpi; - if (!FillDrawPixelInfo(&new_dpi, fr.left, fr.top, fr.Width(), fr.Height())) return; + if (!FillDrawPixelInfo(&new_dpi, fr)) return; AutoRestoreBackup dpi_backup(_cur_dpi, &new_dpi); /* Draw content (now coordinates given to DrawString* are local to the new clipping region). */ diff --git a/src/train_gui.cpp b/src/train_gui.cpp index ed7bf46b19..7048c0b818 100644 --- a/src/train_gui.cpp +++ b/src/train_gui.cpp @@ -101,7 +101,7 @@ void DrawTrainImage(const Train *v, const Rect &r, VehicleID selection, EngineIm int highlight_r = 0; int max_width = r.Width(); - if (!FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.Width(), r.Height())) return; + if (!FillDrawPixelInfo(&tmp_dpi, r)) return; { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); From 712a4bb40b1f373f020445bbf9207020fbdd46d4 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 20 Dec 2023 00:15:33 +0000 Subject: [PATCH 096/105] Fix: Prevent picker preview sprites from overflowing button bevel. --- src/dock_gui.cpp | 7 ++++--- src/object_gui.cpp | 14 ++++++++------ src/rail_gui.cpp | 41 ++++++++++++++++++++++++----------------- src/road_gui.cpp | 23 +++++++++++++---------- 4 files changed, 49 insertions(+), 36 deletions(-) diff --git a/src/dock_gui.cpp b/src/dock_gui.cpp index ba2d3c3cd5..3997fd74c6 100644 --- a/src/dock_gui.cpp +++ b/src/dock_gui.cpp @@ -549,10 +549,11 @@ public: case WID_BDD_Y: { Axis axis = widget == WID_BDD_X ? AXIS_X : AXIS_Y; - if (FillDrawPixelInfo(&tmp_dpi, r)) { + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); + if (FillDrawPixelInfo(&tmp_dpi, ir)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); - int x = (r.Width() - ScaleSpriteTrad(96)) / 2; - int y = (r.Height() - ScaleSpriteTrad(64)) / 2; + int x = (ir.Width() - ScaleSpriteTrad(96)) / 2; + int y = (ir.Height() - ScaleSpriteTrad(64)) / 2; int x1 = ScaleSpriteTrad(63); int x2 = ScaleSpriteTrad(31); DrawShipDepotSprite(x + (axis == AXIS_X ? x1 : x2), y + ScaleSpriteTrad(17), axis, DEPOT_PART_NORTH); diff --git a/src/object_gui.cpp b/src/object_gui.cpp index facf30e18f..7e84be8c16 100644 --- a/src/object_gui.cpp +++ b/src/object_gui.cpp @@ -337,14 +337,15 @@ public: DrawPixelInfo tmp_dpi; /* Set up a clipping area for the preview. */ - if (FillDrawPixelInfo(&tmp_dpi, r)) { + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); + if (FillDrawPixelInfo(&tmp_dpi, ir)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); if (spec->grf_prop.grffile == nullptr) { extern const DrawTileSprites _objects[]; const DrawTileSprites *dts = &_objects[spec->grf_prop.local_id]; - DrawOrigTileSeqInGUI(r.Width() / 2 - 1, (r.Height() + matrix_height / 2) / 2 - this->object_margin - ScaleSpriteTrad(TILE_PIXELS), dts, PAL_NONE); + DrawOrigTileSeqInGUI(ir.Width() / 2 - 1, (ir.Height() + matrix_height / 2) / 2 - this->object_margin - ScaleSpriteTrad(TILE_PIXELS), dts, PAL_NONE); } else { - DrawNewObjectTileInGUI(r.Width() / 2 - 1, (r.Height() + matrix_height / 2) / 2 - this->object_margin - ScaleSpriteTrad(TILE_PIXELS), spec, GB(widget, 16, 16)); + DrawNewObjectTileInGUI(ir.Width() / 2 - 1, (ir.Height() + matrix_height / 2) / 2 - this->object_margin - ScaleSpriteTrad(TILE_PIXELS), spec, GB(widget, 16, 16)); } } break; @@ -362,14 +363,15 @@ public: } DrawPixelInfo tmp_dpi; /* Set up a clipping area for the preview. */ - if (FillDrawPixelInfo(&tmp_dpi, r)) { + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); + if (FillDrawPixelInfo(&tmp_dpi, ir)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); if (spec->grf_prop.grffile == nullptr) { extern const DrawTileSprites _objects[]; const DrawTileSprites *dts = &_objects[spec->grf_prop.local_id]; - DrawOrigTileSeqInGUI(r.Width() / 2 - 1, r.Height() - this->object_margin - ScaleSpriteTrad(TILE_PIXELS), dts, PAL_NONE); + DrawOrigTileSeqInGUI(ir.Width() / 2 - 1, ir.Height() - this->object_margin - ScaleSpriteTrad(TILE_PIXELS), dts, PAL_NONE); } else { - DrawNewObjectTileInGUI(r.Width() / 2 - 1, r.Height() - this->object_margin - ScaleSpriteTrad(TILE_PIXELS), spec, + DrawNewObjectTileInGUI(ir.Width() / 2 - 1, ir.Height() - this->object_margin - ScaleSpriteTrad(TILE_PIXELS), spec, std::min(_selected_object_view, spec->views - 1)); } } diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index 328e3f0625..82e67da2ca 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -1241,29 +1241,33 @@ public: DrawPixelInfo tmp_dpi; switch (GB(widget, 0, 16)) { - case WID_BRAS_PLATFORM_DIR_X: + case WID_BRAS_PLATFORM_DIR_X: { /* Set up a clipping area for the '/' station preview */ - if (FillDrawPixelInfo(&tmp_dpi, r)) { + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); + if (FillDrawPixelInfo(&tmp_dpi, ir)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); - int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); - int y = (r.Height() + ScaleSpriteTrad(58)) / 2 - ScaleSpriteTrad(31); + int x = (ir.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); + int y = (ir.Height() + ScaleSpriteTrad(58)) / 2 - ScaleSpriteTrad(31); if (!DrawStationTile(x, y, _cur_railtype, AXIS_X, _railstation.station_class, _railstation.station_type)) { StationPickerDrawSprite(x, y, STATION_RAIL, _cur_railtype, INVALID_ROADTYPE, 2); } } break; + } - case WID_BRAS_PLATFORM_DIR_Y: + case WID_BRAS_PLATFORM_DIR_Y: { /* Set up a clipping area for the '\' station preview */ - if (FillDrawPixelInfo(&tmp_dpi, r)) { + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); + if (FillDrawPixelInfo(&tmp_dpi, ir)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); - int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); - int y = (r.Height() + ScaleSpriteTrad(58)) / 2 - ScaleSpriteTrad(31); + int x = (ir.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); + int y = (ir.Height() + ScaleSpriteTrad(58)) / 2 - ScaleSpriteTrad(31); if (!DrawStationTile(x, y, _cur_railtype, AXIS_Y, _railstation.station_class, _railstation.station_type)) { StationPickerDrawSprite(x, y, STATION_RAIL, _cur_railtype, INVALID_ROADTYPE, 3); } } break; + } case WID_BRAS_NEWST_LIST: { Rect ir = r.Shrink(WidgetDimensions::scaled.matrix); @@ -1290,10 +1294,11 @@ public: } /* Set up a clipping area for the station preview. */ - if (FillDrawPixelInfo(&tmp_dpi, r)) { + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); + if (FillDrawPixelInfo(&tmp_dpi, ir)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); - int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); - int y = (r.Height() + ScaleSpriteTrad(58)) / 2 - ScaleSpriteTrad(31); + int x = (ir.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); + int y = (ir.Height() + ScaleSpriteTrad(58)) / 2 - ScaleSpriteTrad(31); if (!DrawStationTile(x, y, _cur_railtype, _railstation.orientation, _railstation.station_class, type)) { StationPickerDrawSprite(x, y, STATION_RAIL, _cur_railtype, INVALID_ROADTYPE, 2 + _railstation.orientation); } @@ -1905,10 +1910,11 @@ struct BuildRailDepotWindow : public PickerWindowBase { if (!IsInsideMM(widget, WID_BRAD_DEPOT_NE, WID_BRAD_DEPOT_NW + 1)) return; DrawPixelInfo tmp_dpi; - if (FillDrawPixelInfo(&tmp_dpi, r)) { + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); + if (FillDrawPixelInfo(&tmp_dpi, ir)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); - int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); - int y = (r.Height() + ScaleSpriteTrad(48)) / 2 - ScaleSpriteTrad(31); + int x = (ir.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); + int y = (ir.Height() + ScaleSpriteTrad(48)) / 2 - ScaleSpriteTrad(31); DrawTrainDepotSprite(x, y, widget - WID_BRAD_DEPOT_NE + DIAGDIR_NE, _cur_railtype); } } @@ -2095,10 +2101,11 @@ struct BuildRailWaypointWindow : PickerWindowBase { const StationSpec *statspec = this->waypoints->GetSpec(type); DrawPixelInfo tmp_dpi; - if (FillDrawPixelInfo(&tmp_dpi, r)) { + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); + if (FillDrawPixelInfo(&tmp_dpi, ir)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); - int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); - int y = (r.Height() + ScaleSpriteTrad(58)) / 2 - ScaleSpriteTrad(31); + int x = (ir.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); + int y = (ir.Height() + ScaleSpriteTrad(58)) / 2 - ScaleSpriteTrad(31); DrawWaypointSprite(x, y, type, _cur_railtype); } diff --git a/src/road_gui.cpp b/src/road_gui.cpp index 4e53907026..cd00b7ad3e 100644 --- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -1029,10 +1029,11 @@ struct BuildRoadDepotWindow : public PickerWindowBase { if (!IsInsideMM(widget, WID_BROD_DEPOT_NE, WID_BROD_DEPOT_NW + 1)) return; DrawPixelInfo tmp_dpi; - if (FillDrawPixelInfo(&tmp_dpi, r)) { + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); + if (FillDrawPixelInfo(&tmp_dpi, ir)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); - int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); - int y = (r.Height() + ScaleSpriteTrad(48)) / 2 - ScaleSpriteTrad(31); + int x = (ir.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); + int y = (ir.Height() + ScaleSpriteTrad(48)) / 2 - ScaleSpriteTrad(31); DrawRoadDepotSprite(x, y, (DiagDirection)(widget - WID_BROD_DEPOT_NE + DIAGDIR_NE), _cur_roadtype); } } @@ -1417,13 +1418,14 @@ public: const RoadStopSpec *spec = RoadStopClass::Get(_roadstop_gui_settings.roadstop_class)->GetSpec(_roadstop_gui_settings.roadstop_type); bool disabled = (spec != nullptr && widget < WID_BROS_STATION_X && HasBit(spec->flags, RSF_DRIVE_THROUGH_ONLY)); DrawPixelInfo tmp_dpi; - if (FillDrawPixelInfo(&tmp_dpi, r)) { + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); + if (FillDrawPixelInfo(&tmp_dpi, ir)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); - int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); - int y = (r.Height() + ScaleSpriteTrad(48)) / 2 - ScaleSpriteTrad(31); + int x = (ir.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); + int y = (ir.Height() + ScaleSpriteTrad(48)) / 2 - ScaleSpriteTrad(31); if (spec == nullptr || disabled) { StationPickerDrawSprite(x, y, st, INVALID_RAILTYPE, _cur_roadtype, widget - WID_BROS_STATION_NE); - if (disabled) GfxFillRect(1, 1, r.Width() - 1, r.Height() - 1, PC_BLACK, FILLRECT_CHECKER); + if (disabled) GfxFillRect(0, 0, ir.Width(), ir.Height(), PC_BLACK, FILLRECT_CHECKER); } else { DrawRoadStopTile(x, y, _cur_roadtype, spec, st, widget - WID_BROS_STATION_NE); } @@ -1459,10 +1461,11 @@ public: /* Set up a clipping area for the sprite preview. */ DrawPixelInfo tmp_dpi; - if (FillDrawPixelInfo(&tmp_dpi, r)) { + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); + if (FillDrawPixelInfo(&tmp_dpi, ir)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); - int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); - int y = (r.Height() + ScaleSpriteTrad(48)) / 2 - ScaleSpriteTrad(31); + int x = (ir.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); + int y = (ir.Height() + ScaleSpriteTrad(48)) / 2 - ScaleSpriteTrad(31); if (spec == nullptr) { StationPickerDrawSprite(x, y, st, INVALID_RAILTYPE, _cur_roadtype, _roadstop_gui_settings.orientation); } else { From 7466c3c39e2fa32e55a599aa792011b62bfcb54a Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 20 Dec 2023 00:20:51 +0000 Subject: [PATCH 097/105] Fix: Draw unavailable mask over picker sprite instead of behind it. This makes these disabled picker buttons consistent with other disabled buttons. --- src/object_gui.cpp | 6 +++--- src/rail_gui.cpp | 8 ++++---- src/road_gui.cpp | 9 ++++----- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/object_gui.cpp b/src/object_gui.cpp index 7e84be8c16..084cd0caed 100644 --- a/src/object_gui.cpp +++ b/src/object_gui.cpp @@ -358,9 +358,6 @@ public: const ObjectSpec *spec = objclass->GetSpec(obj_index); if (spec == nullptr) break; - if (!spec->IsAvailable()) { - GfxFillRect(r.Shrink(WidgetDimensions::scaled.bevel), PC_BLACK, FILLRECT_CHECKER); - } DrawPixelInfo tmp_dpi; /* Set up a clipping area for the preview. */ Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); @@ -375,6 +372,9 @@ public: std::min(_selected_object_view, spec->views - 1)); } } + if (!spec->IsAvailable()) { + GfxFillRect(ir, PC_BLACK, FILLRECT_CHECKER); + } break; } diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index 82e67da2ca..c655852820 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -1289,9 +1289,6 @@ public: assert(type < _railstation.station_count); /* Check station availability callback */ const StationSpec *statspec = StationClass::Get(_railstation.station_class)->GetSpec(type); - if (!IsStationAvailable(statspec)) { - GfxFillRect(r.Shrink(WidgetDimensions::scaled.bevel), PC_BLACK, FILLRECT_CHECKER); - } /* Set up a clipping area for the station preview. */ Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); @@ -1303,6 +1300,9 @@ public: StationPickerDrawSprite(x, y, STATION_RAIL, _cur_railtype, INVALID_ROADTYPE, 2 + _railstation.orientation); } } + if (!IsStationAvailable(statspec)) { + GfxFillRect(ir, PC_BLACK, FILLRECT_CHECKER); + } break; } } @@ -2110,7 +2110,7 @@ struct BuildRailWaypointWindow : PickerWindowBase { } if (!IsStationAvailable(statspec)) { - GfxFillRect(r.Shrink(WidgetDimensions::scaled.bevel), PC_BLACK, FILLRECT_CHECKER); + GfxFillRect(ir, PC_BLACK, FILLRECT_CHECKER); } } } diff --git a/src/road_gui.cpp b/src/road_gui.cpp index cd00b7ad3e..1364a0c94a 100644 --- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -1425,11 +1425,11 @@ public: int y = (ir.Height() + ScaleSpriteTrad(48)) / 2 - ScaleSpriteTrad(31); if (spec == nullptr || disabled) { StationPickerDrawSprite(x, y, st, INVALID_RAILTYPE, _cur_roadtype, widget - WID_BROS_STATION_NE); - if (disabled) GfxFillRect(0, 0, ir.Width(), ir.Height(), PC_BLACK, FILLRECT_CHECKER); } else { DrawRoadStopTile(x, y, _cur_roadtype, spec, st, widget - WID_BROS_STATION_NE); } } + if (disabled) GfxFillRect(ir, PC_BLACK, FILLRECT_CHECKER); break; } @@ -1455,10 +1455,6 @@ public: const RoadStopSpec *spec = RoadStopClass::Get(_roadstop_gui_settings.roadstop_class)->GetSpec(type); StationType st = GetRoadStationTypeByWindowClass(this->window_class); - if (!IsRoadStopAvailable(spec, st)) { - GfxFillRect(r.Shrink(WidgetDimensions::scaled.bevel), PC_BLACK, FILLRECT_CHECKER); - } - /* Set up a clipping area for the sprite preview. */ DrawPixelInfo tmp_dpi; Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); @@ -1474,6 +1470,9 @@ public: DrawRoadStopTile(x, y, _cur_roadtype, spec, st, (uint8_t)orientation); } } + if (!IsRoadStopAvailable(spec, st)) { + GfxFillRect(ir, PC_BLACK, FILLRECT_CHECKER); + } break; } } From b85ecf9ac22709b275ec9b927c04ca5eec485717 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 20 Dec 2023 20:38:21 +0000 Subject: [PATCH 098/105] Codechange: Replace pointer to Sprite array with reference to SpriteCollection. (#11580) Add `SpriteLoader::SpriteCollection` type which is an array of `SpriteLoad::Sprite`. This removes the ambiguity of what `SpriteLoader::Sprite *` is pointing to, and cleans up mismatches using both dereference -> and array access [] for the same object. --- src/blitter/32bpp_anim_sse4.hpp | 2 +- src/blitter/32bpp_optimized.cpp | 18 +++++++++--------- src/blitter/32bpp_optimized.hpp | 4 ++-- src/blitter/32bpp_simple.cpp | 16 ++++++++-------- src/blitter/32bpp_simple.hpp | 2 +- src/blitter/32bpp_sse2.cpp | 12 ++++++------ src/blitter/32bpp_sse2.hpp | 4 ++-- src/blitter/40bpp_anim.cpp | 2 +- src/blitter/40bpp_anim.hpp | 2 +- src/blitter/8bpp_optimized.cpp | 12 ++++++------ src/blitter/8bpp_optimized.hpp | 2 +- src/blitter/8bpp_simple.cpp | 16 ++++++++-------- src/blitter/8bpp_simple.hpp | 2 +- src/blitter/null.cpp | 10 +++++----- src/blitter/null.hpp | 2 +- src/fontcache/freetypefontcache.cpp | 5 +++-- src/fontcache/truetypefontcache.cpp | 6 +++--- src/os/macosx/font_osx.cpp | 5 +++-- src/os/windows/font_win32.cpp | 5 +++-- src/spritecache.cpp | 12 ++++++------ src/spriteloader/grf.cpp | 6 +++--- src/spriteloader/grf.hpp | 2 +- src/spriteloader/spriteloader.hpp | 9 +++++++-- src/video/opengl.cpp | 14 +++++++------- src/video/opengl.h | 2 +- 25 files changed, 90 insertions(+), 82 deletions(-) diff --git a/src/blitter/32bpp_anim_sse4.hpp b/src/blitter/32bpp_anim_sse4.hpp index 1b32e085c5..379e7e9647 100644 --- a/src/blitter/32bpp_anim_sse4.hpp +++ b/src/blitter/32bpp_anim_sse4.hpp @@ -39,7 +39,7 @@ public: template void Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom); void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom) override; - Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) override { + Sprite *Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) override { return Blitter_32bppSSE_Base::Encode(sprite, allocator); } const char *GetName() override { return "32bpp-sse4-anim"; } diff --git a/src/blitter/32bpp_optimized.cpp b/src/blitter/32bpp_optimized.cpp index 104a3cc97d..5492178b51 100644 --- a/src/blitter/32bpp_optimized.cpp +++ b/src/blitter/32bpp_optimized.cpp @@ -272,7 +272,7 @@ void Blitter_32bppOptimized::Draw(Blitter::BlitterParams *bp, BlitterMode mode, this->Draw(bp, mode, zoom); } -template Sprite *Blitter_32bppOptimized::EncodeInternal(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) +template Sprite *Blitter_32bppOptimized::EncodeInternal(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) { /* streams of pixels (a, r, g, b channels) * @@ -293,7 +293,7 @@ template Sprite *Blitter_32bppOptimized::EncodeInternal(const ZoomLevel zoom_min; ZoomLevel zoom_max; - if (sprite->type == SpriteType::Font) { + if (sprite[ZOOM_LVL_NORMAL].type == SpriteType::Font) { zoom_min = ZOOM_LVL_NORMAL; zoom_max = ZOOM_LVL_NORMAL; } else { @@ -403,10 +403,10 @@ template Sprite *Blitter_32bppOptimized::EncodeInternal(const Sprite *dest_sprite = (Sprite *)allocator(sizeof(*dest_sprite) + sizeof(SpriteData) + len); - dest_sprite->height = sprite->height; - dest_sprite->width = sprite->width; - dest_sprite->x_offs = sprite->x_offs; - dest_sprite->y_offs = sprite->y_offs; + dest_sprite->height = sprite[ZOOM_LVL_NORMAL].height; + dest_sprite->width = sprite[ZOOM_LVL_NORMAL].width; + dest_sprite->x_offs = sprite[ZOOM_LVL_NORMAL].x_offs; + dest_sprite->y_offs = sprite[ZOOM_LVL_NORMAL].y_offs; SpriteData *dst = (SpriteData *)dest_sprite->data; memset(dst, 0, sizeof(*dst)); @@ -425,10 +425,10 @@ template Sprite *Blitter_32bppOptimized::EncodeInternal(const return dest_sprite; } -template Sprite *Blitter_32bppOptimized::EncodeInternal(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator); -template Sprite *Blitter_32bppOptimized::EncodeInternal(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator); +template Sprite *Blitter_32bppOptimized::EncodeInternal(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator); +template Sprite *Blitter_32bppOptimized::EncodeInternal(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator); -Sprite *Blitter_32bppOptimized::Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) +Sprite *Blitter_32bppOptimized::Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) { return this->EncodeInternal(sprite, allocator); } diff --git a/src/blitter/32bpp_optimized.hpp b/src/blitter/32bpp_optimized.hpp index 9df64eb6c6..e40a0ec667 100644 --- a/src/blitter/32bpp_optimized.hpp +++ b/src/blitter/32bpp_optimized.hpp @@ -22,7 +22,7 @@ public: }; void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom) override; - Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) override; + Sprite *Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) override; const char *GetName() override { return "32bpp-optimized"; } @@ -30,7 +30,7 @@ public: protected: template void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom); - template Sprite *EncodeInternal(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator); + template Sprite *EncodeInternal(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator); }; /** Factory for the optimised 32 bpp blitter (without palette animation). */ diff --git a/src/blitter/32bpp_simple.cpp b/src/blitter/32bpp_simple.cpp index 97c0a6bb2b..30aff86b76 100644 --- a/src/blitter/32bpp_simple.cpp +++ b/src/blitter/32bpp_simple.cpp @@ -109,20 +109,20 @@ void Blitter_32bppSimple::DrawColourMappingRect(void *dst, int width, int height Debug(misc, 0, "32bpp blitter doesn't know how to draw this colour table ('{}')", pal); } -Sprite *Blitter_32bppSimple::Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) +Sprite *Blitter_32bppSimple::Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) { Blitter_32bppSimple::Pixel *dst; - Sprite *dest_sprite = (Sprite *)allocator(sizeof(*dest_sprite) + (size_t)sprite->height * (size_t)sprite->width * sizeof(*dst)); + Sprite *dest_sprite = (Sprite *)allocator(sizeof(*dest_sprite) + (size_t)sprite[ZOOM_LVL_NORMAL].height * (size_t)sprite[ZOOM_LVL_NORMAL].width * sizeof(*dst)); - dest_sprite->height = sprite->height; - dest_sprite->width = sprite->width; - dest_sprite->x_offs = sprite->x_offs; - dest_sprite->y_offs = sprite->y_offs; + dest_sprite->height = sprite[ZOOM_LVL_NORMAL].height; + dest_sprite->width = sprite[ZOOM_LVL_NORMAL].width; + dest_sprite->x_offs = sprite[ZOOM_LVL_NORMAL].x_offs; + dest_sprite->y_offs = sprite[ZOOM_LVL_NORMAL].y_offs; dst = (Blitter_32bppSimple::Pixel *)dest_sprite->data; - SpriteLoader::CommonPixel *src = (SpriteLoader::CommonPixel *)sprite->data; + SpriteLoader::CommonPixel *src = (SpriteLoader::CommonPixel *)sprite[ZOOM_LVL_NORMAL].data; - for (int i = 0; i < sprite->height * sprite->width; i++) { + for (int i = 0; i < sprite[ZOOM_LVL_NORMAL].height * sprite[ZOOM_LVL_NORMAL].width; i++) { if (src->m == 0) { dst[i].r = src->r; dst[i].g = src->g; diff --git a/src/blitter/32bpp_simple.hpp b/src/blitter/32bpp_simple.hpp index 9a7417d378..df154ce57d 100644 --- a/src/blitter/32bpp_simple.hpp +++ b/src/blitter/32bpp_simple.hpp @@ -26,7 +26,7 @@ class Blitter_32bppSimple : public Blitter_32bppBase { public: void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom) override; void DrawColourMappingRect(void *dst, int width, int height, PaletteID pal) override; - Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) override; + Sprite *Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) override; const char *GetName() override { return "32bpp-simple"; } }; diff --git a/src/blitter/32bpp_sse2.cpp b/src/blitter/32bpp_sse2.cpp index e841713b09..1638127b56 100644 --- a/src/blitter/32bpp_sse2.cpp +++ b/src/blitter/32bpp_sse2.cpp @@ -20,7 +20,7 @@ /** Instantiation of the SSE2 32bpp blitter factory. */ static FBlitter_32bppSSE2 iFBlitter_32bppSSE2; -Sprite *Blitter_32bppSSE_Base::Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) +Sprite *Blitter_32bppSSE_Base::Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) { /* First uint32_t of a line = the number of transparent pixels from the left. * Second uint32_t of a line = the number of transparent pixels from the right. @@ -28,7 +28,7 @@ Sprite *Blitter_32bppSSE_Base::Encode(const SpriteLoader::Sprite *sprite, Alloca */ ZoomLevel zoom_min = ZOOM_LVL_NORMAL; ZoomLevel zoom_max = ZOOM_LVL_NORMAL; - if (sprite->type != SpriteType::Font) { + if (sprite[ZOOM_LVL_NORMAL].type != SpriteType::Font) { zoom_min = _settings_client.gui.zoom_min; zoom_max = _settings_client.gui.zoom_max; if (zoom_max == zoom_min) zoom_max = ZOOM_LVL_MAX; @@ -52,10 +52,10 @@ Sprite *Blitter_32bppSSE_Base::Encode(const SpriteLoader::Sprite *sprite, Alloca } Sprite *dst_sprite = (Sprite *) allocator(sizeof(Sprite) + sizeof(SpriteData) + all_sprites_size); - dst_sprite->height = sprite->height; - dst_sprite->width = sprite->width; - dst_sprite->x_offs = sprite->x_offs; - dst_sprite->y_offs = sprite->y_offs; + dst_sprite->height = sprite[ZOOM_LVL_NORMAL].height; + dst_sprite->width = sprite[ZOOM_LVL_NORMAL].width; + dst_sprite->x_offs = sprite[ZOOM_LVL_NORMAL].x_offs; + dst_sprite->y_offs = sprite[ZOOM_LVL_NORMAL].y_offs; memcpy(dst_sprite->data, &sd, sizeof(SpriteData)); /* Copy colours and determine flags. */ diff --git a/src/blitter/32bpp_sse2.hpp b/src/blitter/32bpp_sse2.hpp index 37f9661b1d..fa643dd3cd 100644 --- a/src/blitter/32bpp_sse2.hpp +++ b/src/blitter/32bpp_sse2.hpp @@ -76,7 +76,7 @@ public: byte data[]; ///< Data, all zoomlevels. }; - Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator); + Sprite *Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator); }; DECLARE_ENUM_AS_BIT_SET(Blitter_32bppSSE_Base::SpriteFlags); @@ -88,7 +88,7 @@ public: template void Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom); - Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) override { + Sprite *Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) override { return Blitter_32bppSSE_Base::Encode(sprite, allocator); } diff --git a/src/blitter/40bpp_anim.cpp b/src/blitter/40bpp_anim.cpp index 4503ccb26f..0b6d7410c2 100644 --- a/src/blitter/40bpp_anim.cpp +++ b/src/blitter/40bpp_anim.cpp @@ -377,7 +377,7 @@ void Blitter_40bppAnim::DrawColourMappingRect(void *dst, int width, int height, } } -Sprite *Blitter_40bppAnim::Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) +Sprite *Blitter_40bppAnim::Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) { return this->EncodeInternal(sprite, allocator); } diff --git a/src/blitter/40bpp_anim.hpp b/src/blitter/40bpp_anim.hpp index fac3d64d3c..4371100914 100644 --- a/src/blitter/40bpp_anim.hpp +++ b/src/blitter/40bpp_anim.hpp @@ -27,7 +27,7 @@ public: void ScrollBuffer(void *video, int &left, int &top, int &width, int &height, int scroll_x, int scroll_y) override; void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom) override; void DrawColourMappingRect(void *dst, int width, int height, PaletteID pal) override; - Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) override; + Sprite *Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) override; size_t BufferSize(uint width, uint height) override; Blitter::PaletteAnimation UsePaletteAnimation() override; bool NeedsAnimationBuffer() override; diff --git a/src/blitter/8bpp_optimized.cpp b/src/blitter/8bpp_optimized.cpp index bfc03f26c8..e86a2a2ff8 100644 --- a/src/blitter/8bpp_optimized.cpp +++ b/src/blitter/8bpp_optimized.cpp @@ -119,7 +119,7 @@ void Blitter_8bppOptimized::Draw(Blitter::BlitterParams *bp, BlitterMode mode, Z } } -Sprite *Blitter_8bppOptimized::Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) +Sprite *Blitter_8bppOptimized::Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) { /* Make memory for all zoom-levels */ uint memory = sizeof(SpriteData); @@ -127,7 +127,7 @@ Sprite *Blitter_8bppOptimized::Encode(const SpriteLoader::Sprite *sprite, Alloca ZoomLevel zoom_min; ZoomLevel zoom_max; - if (sprite->type == SpriteType::Font) { + if (sprite[ZOOM_LVL_NORMAL].type == SpriteType::Font) { zoom_min = ZOOM_LVL_NORMAL; zoom_max = ZOOM_LVL_NORMAL; } else { @@ -220,10 +220,10 @@ Sprite *Blitter_8bppOptimized::Encode(const SpriteLoader::Sprite *sprite, Alloca /* Allocate the exact amount of memory we need */ Sprite *dest_sprite = (Sprite *)allocator(sizeof(*dest_sprite) + size); - dest_sprite->height = sprite->height; - dest_sprite->width = sprite->width; - dest_sprite->x_offs = sprite->x_offs; - dest_sprite->y_offs = sprite->y_offs; + dest_sprite->height = sprite[ZOOM_LVL_NORMAL].height; + dest_sprite->width = sprite[ZOOM_LVL_NORMAL].width; + dest_sprite->x_offs = sprite[ZOOM_LVL_NORMAL].x_offs; + dest_sprite->y_offs = sprite[ZOOM_LVL_NORMAL].y_offs; memcpy(dest_sprite->data, temp_dst, size); return dest_sprite; diff --git a/src/blitter/8bpp_optimized.hpp b/src/blitter/8bpp_optimized.hpp index 59e9f017b5..169dee0c26 100644 --- a/src/blitter/8bpp_optimized.hpp +++ b/src/blitter/8bpp_optimized.hpp @@ -23,7 +23,7 @@ public: }; void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom) override; - Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) override; + Sprite *Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) override; const char *GetName() override { return "8bpp-optimized"; } }; diff --git a/src/blitter/8bpp_simple.cpp b/src/blitter/8bpp_simple.cpp index a6a556a3c7..be86ddcbe4 100644 --- a/src/blitter/8bpp_simple.cpp +++ b/src/blitter/8bpp_simple.cpp @@ -60,19 +60,19 @@ void Blitter_8bppSimple::Draw(Blitter::BlitterParams *bp, BlitterMode mode, Zoom } } -Sprite *Blitter_8bppSimple::Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) +Sprite *Blitter_8bppSimple::Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) { Sprite *dest_sprite; - dest_sprite = (Sprite *)allocator(sizeof(*dest_sprite) + (size_t)sprite->height * (size_t)sprite->width); + dest_sprite = (Sprite *)allocator(sizeof(*dest_sprite) + (size_t)sprite[ZOOM_LVL_NORMAL].height * (size_t)sprite[ZOOM_LVL_NORMAL].width); - dest_sprite->height = sprite->height; - dest_sprite->width = sprite->width; - dest_sprite->x_offs = sprite->x_offs; - dest_sprite->y_offs = sprite->y_offs; + dest_sprite->height = sprite[ZOOM_LVL_NORMAL].height; + dest_sprite->width = sprite[ZOOM_LVL_NORMAL].width; + dest_sprite->x_offs = sprite[ZOOM_LVL_NORMAL].x_offs; + dest_sprite->y_offs = sprite[ZOOM_LVL_NORMAL].y_offs; /* Copy over only the 'remap' channel, as that is what we care about in 8bpp */ - for (int i = 0; i < sprite->height * sprite->width; i++) { - dest_sprite->data[i] = sprite->data[i].m; + for (int i = 0; i < sprite[ZOOM_LVL_NORMAL].height * sprite[ZOOM_LVL_NORMAL].width; i++) { + dest_sprite->data[i] = sprite[ZOOM_LVL_NORMAL].data[i].m; } return dest_sprite; diff --git a/src/blitter/8bpp_simple.hpp b/src/blitter/8bpp_simple.hpp index 7f3c0a8aad..455d76d937 100644 --- a/src/blitter/8bpp_simple.hpp +++ b/src/blitter/8bpp_simple.hpp @@ -17,7 +17,7 @@ class Blitter_8bppSimple FINAL : public Blitter_8bppBase { public: void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom) override; - Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) override; + Sprite *Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) override; const char *GetName() override { return "8bpp-simple"; } }; diff --git a/src/blitter/null.cpp b/src/blitter/null.cpp index 29747b0f96..f73b5ae331 100644 --- a/src/blitter/null.cpp +++ b/src/blitter/null.cpp @@ -15,15 +15,15 @@ /** Instantiation of the null blitter factory. */ static FBlitter_Null iFBlitter_Null; -Sprite *Blitter_Null::Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) +Sprite *Blitter_Null::Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) { Sprite *dest_sprite; dest_sprite = (Sprite *)allocator(sizeof(*dest_sprite)); - dest_sprite->height = sprite->height; - dest_sprite->width = sprite->width; - dest_sprite->x_offs = sprite->x_offs; - dest_sprite->y_offs = sprite->y_offs; + dest_sprite->height = sprite[ZOOM_LVL_NORMAL].height; + dest_sprite->width = sprite[ZOOM_LVL_NORMAL].width; + dest_sprite->x_offs = sprite[ZOOM_LVL_NORMAL].x_offs; + dest_sprite->y_offs = sprite[ZOOM_LVL_NORMAL].y_offs; return dest_sprite; } diff --git a/src/blitter/null.hpp b/src/blitter/null.hpp index abf2a5b59f..61c5cab9de 100644 --- a/src/blitter/null.hpp +++ b/src/blitter/null.hpp @@ -18,7 +18,7 @@ public: uint8_t GetScreenDepth() override { return 0; } void Draw(Blitter::BlitterParams *, BlitterMode, ZoomLevel) override {}; void DrawColourMappingRect(void *, int, int, PaletteID) override {}; - Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) override; + Sprite *Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) override; void *MoveTo(void *, int, int) override { return nullptr; }; void SetPixel(void *, int, int, uint8_t) override {}; void DrawRect(void *, int, int, uint8_t) override {}; diff --git a/src/fontcache/freetypefontcache.cpp b/src/fontcache/freetypefontcache.cpp index bb6f282d0e..3e6ddd0f80 100644 --- a/src/fontcache/freetypefontcache.cpp +++ b/src/fontcache/freetypefontcache.cpp @@ -235,7 +235,8 @@ const Sprite *FreeTypeFontCache::InternalGetGlyph(GlyphID key, bool aa) if (width > MAX_GLYPH_DIM || height > MAX_GLYPH_DIM) UserError("Font glyph is too large"); /* FreeType has rendered the glyph, now we allocate a sprite and copy the image into it */ - SpriteLoader::Sprite sprite; + SpriteLoader::SpriteCollection spritecollection; + SpriteLoader::Sprite &sprite = spritecollection[ZOOM_LVL_NORMAL]; sprite.AllocateData(ZOOM_LVL_NORMAL, static_cast(width) * height); sprite.type = SpriteType::Font; sprite.colours = (aa ? SCC_PAL | SCC_ALPHA : SCC_PAL); @@ -266,7 +267,7 @@ const Sprite *FreeTypeFontCache::InternalGetGlyph(GlyphID key, bool aa) } GlyphEntry new_glyph; - new_glyph.sprite = BlitterFactory::GetCurrentBlitter()->Encode(&sprite, SimpleSpriteAlloc); + new_glyph.sprite = BlitterFactory::GetCurrentBlitter()->Encode(spritecollection, SimpleSpriteAlloc); new_glyph.width = slot->advance.x >> 6; this->SetGlyphPtr(key, &new_glyph); diff --git a/src/fontcache/truetypefontcache.cpp b/src/fontcache/truetypefontcache.cpp index ced99c3f47..196add775c 100644 --- a/src/fontcache/truetypefontcache.cpp +++ b/src/fontcache/truetypefontcache.cpp @@ -136,7 +136,7 @@ const Sprite *TrueTypeFontCache::GetGlyph(GlyphID key) }; #undef CPSET #undef CP___ - static const SpriteLoader::Sprite builtin_questionmark = { + static const SpriteLoader::SpriteCollection builtin_questionmark = {{ { 10, // height 8, // width 0, // x_offs @@ -144,9 +144,9 @@ const Sprite *TrueTypeFontCache::GetGlyph(GlyphID key) SpriteType::Font, SCC_PAL, builtin_questionmark_data - }; + } }}; - Sprite *spr = BlitterFactory::GetCurrentBlitter()->Encode(&builtin_questionmark, SimpleSpriteAlloc); + Sprite *spr = BlitterFactory::GetCurrentBlitter()->Encode(builtin_questionmark, SimpleSpriteAlloc); assert(spr != nullptr); GlyphEntry new_glyph; new_glyph.sprite = spr; diff --git a/src/os/macosx/font_osx.cpp b/src/os/macosx/font_osx.cpp index a9fad3764a..a41af5a26f 100644 --- a/src/os/macosx/font_osx.cpp +++ b/src/os/macosx/font_osx.cpp @@ -240,7 +240,8 @@ const Sprite *CoreTextFontCache::InternalGetGlyph(GlyphID key, bool use_aa) /* Limit glyph size to prevent overflows later on. */ if (width > MAX_GLYPH_DIM || height > MAX_GLYPH_DIM) UserError("Font glyph is too large"); - SpriteLoader::Sprite sprite; + SpriteLoader::SpriteCollection spritecollection; + SpriteLoader::Sprite &sprite = spritecollection[ZOOM_LVL_NORMAL]; sprite.AllocateData(ZOOM_LVL_NORMAL, width * height); sprite.type = SpriteType::Font; sprite.colours = (use_aa ? SCC_PAL | SCC_ALPHA : SCC_PAL); @@ -290,7 +291,7 @@ const Sprite *CoreTextFontCache::InternalGetGlyph(GlyphID key, bool use_aa) } GlyphEntry new_glyph; - new_glyph.sprite = BlitterFactory::GetCurrentBlitter()->Encode(&sprite, SimpleSpriteAlloc); + new_glyph.sprite = BlitterFactory::GetCurrentBlitter()->Encode(spritecollection, SimpleSpriteAlloc); new_glyph.width = (byte)std::round(CTFontGetAdvancesForGlyphs(this->font.get(), kCTFontOrientationDefault, &glyph, nullptr, 1)); this->SetGlyphPtr(key, &new_glyph); diff --git a/src/os/windows/font_win32.cpp b/src/os/windows/font_win32.cpp index ddc275fc45..3d863b4dc0 100644 --- a/src/os/windows/font_win32.cpp +++ b/src/os/windows/font_win32.cpp @@ -230,7 +230,8 @@ void Win32FontCache::ClearFontCache() GetGlyphOutline(this->dc, key, GGO_GLYPH_INDEX | (aa ? GGO_GRAY8_BITMAP : GGO_BITMAP), &gm, size, bmp, &mat); /* GDI has rendered the glyph, now we allocate a sprite and copy the image into it. */ - SpriteLoader::Sprite sprite; + SpriteLoader::SpriteCollection spritecollection; + SpriteLoader::Sprite &sprite = spritecollection[ZOOM_LVL_NORMAL]; sprite.AllocateData(ZOOM_LVL_NORMAL, width * height); sprite.type = SpriteType::Font; sprite.colours = (aa ? SCC_PAL | SCC_ALPHA : SCC_PAL); @@ -270,7 +271,7 @@ void Win32FontCache::ClearFontCache() } GlyphEntry new_glyph; - new_glyph.sprite = BlitterFactory::GetCurrentBlitter()->Encode(&sprite, SimpleSpriteAlloc); + new_glyph.sprite = BlitterFactory::GetCurrentBlitter()->Encode(spritecollection, SimpleSpriteAlloc); new_glyph.width = gm.gmCellIncX; this->SetGlyphPtr(key, &new_glyph); diff --git a/src/spritecache.cpp b/src/spritecache.cpp index 1811a047fe..5857146348 100644 --- a/src/spritecache.cpp +++ b/src/spritecache.cpp @@ -213,7 +213,7 @@ uint GetMaxSpriteID() return _spritecache_items; } -static bool ResizeSpriteIn(SpriteLoader::Sprite *sprite, ZoomLevel src, ZoomLevel tgt) +static bool ResizeSpriteIn(SpriteLoader::SpriteCollection &sprite, ZoomLevel src, ZoomLevel tgt) { uint8_t scaled_1 = ScaleByZoom(1, (ZoomLevel)(src - tgt)); @@ -240,7 +240,7 @@ static bool ResizeSpriteIn(SpriteLoader::Sprite *sprite, ZoomLevel src, ZoomLeve return true; } -static void ResizeSpriteOut(SpriteLoader::Sprite *sprite, ZoomLevel zoom) +static void ResizeSpriteOut(SpriteLoader::SpriteCollection &sprite, ZoomLevel zoom) { /* Algorithm based on 32bpp_Optimized::ResizeSprite() */ sprite[zoom].width = UnScaleByZoom(sprite[ZOOM_LVL_NORMAL].width, zoom); @@ -323,7 +323,7 @@ static bool PadSingleSprite(SpriteLoader::Sprite *sprite, ZoomLevel zoom, uint p return true; } -static bool PadSprites(SpriteLoader::Sprite *sprite, uint8_t sprite_avail, SpriteEncoder *encoder) +static bool PadSprites(SpriteLoader::SpriteCollection &sprite, uint8_t sprite_avail, SpriteEncoder *encoder) { /* Get minimum top left corner coordinates. */ int min_xoffs = INT32_MAX; @@ -371,7 +371,7 @@ static bool PadSprites(SpriteLoader::Sprite *sprite, uint8_t sprite_avail, Sprit return true; } -static bool ResizeSprites(SpriteLoader::Sprite *sprite, uint8_t sprite_avail, SpriteEncoder *encoder) +static bool ResizeSprites(SpriteLoader::SpriteCollection &sprite, uint8_t sprite_avail, SpriteEncoder *encoder) { /* Create a fully zoomed image if it does not exist */ ZoomLevel first_avail = static_cast(FIND_FIRST_BIT(sprite_avail)); @@ -457,7 +457,7 @@ static void *ReadSprite(const SpriteCache *sc, SpriteID id, SpriteType sprite_ty Debug(sprite, 9, "Load sprite {}", id); - SpriteLoader::Sprite sprite[ZOOM_LVL_END]; + SpriteLoader::SpriteCollection sprite; uint8_t sprite_avail = 0; sprite[ZOOM_LVL_NORMAL].type = sprite_type; @@ -509,7 +509,7 @@ static void *ReadSprite(const SpriteCache *sc, SpriteID id, SpriteType sprite_ty return (void*)GetRawSprite(SPR_IMG_QUERY, SpriteType::Normal, allocator, encoder); } - if (sprite->type == SpriteType::Font && _font_zoom != ZOOM_LVL_NORMAL) { + if (sprite[ZOOM_LVL_NORMAL].type == SpriteType::Font && _font_zoom != ZOOM_LVL_NORMAL) { /* Make ZOOM_LVL_NORMAL be ZOOM_LVL_GUI */ sprite[ZOOM_LVL_NORMAL].width = sprite[_font_zoom].width; sprite[ZOOM_LVL_NORMAL].height = sprite[_font_zoom].height; diff --git a/src/spriteloader/grf.cpp b/src/spriteloader/grf.cpp index ce18212886..f88182935a 100644 --- a/src/spriteloader/grf.cpp +++ b/src/spriteloader/grf.cpp @@ -215,7 +215,7 @@ bool DecodeSingleSprite(SpriteLoader::Sprite *sprite, SpriteFile &file, size_t f return true; } -uint8_t LoadSpriteV1(SpriteLoader::Sprite *sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp) +uint8_t LoadSpriteV1(SpriteLoader::SpriteCollection &sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp) { /* Check the requested colour depth. */ if (load_32bpp) return 0; @@ -252,7 +252,7 @@ uint8_t LoadSpriteV1(SpriteLoader::Sprite *sprite, SpriteFile &file, size_t file return 0; } -uint8_t LoadSpriteV2(SpriteLoader::Sprite *sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, byte control_flags) +uint8_t LoadSpriteV2(SpriteLoader::SpriteCollection &sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, byte control_flags) { static const ZoomLevel zoom_lvl_map[6] = {ZOOM_LVL_OUT_4X, ZOOM_LVL_NORMAL, ZOOM_LVL_OUT_2X, ZOOM_LVL_OUT_8X, ZOOM_LVL_OUT_16X, ZOOM_LVL_OUT_32X}; @@ -350,7 +350,7 @@ uint8_t LoadSpriteV2(SpriteLoader::Sprite *sprite, SpriteFile &file, size_t file return loaded_sprites; } -uint8_t SpriteLoaderGrf::LoadSprite(SpriteLoader::Sprite *sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, byte control_flags) +uint8_t SpriteLoaderGrf::LoadSprite(SpriteLoader::SpriteCollection &sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, byte control_flags) { if (this->container_ver >= 2) { return LoadSpriteV2(sprite, file, file_pos, sprite_type, load_32bpp, control_flags); diff --git a/src/spriteloader/grf.hpp b/src/spriteloader/grf.hpp index e9ec85726a..338714401b 100644 --- a/src/spriteloader/grf.hpp +++ b/src/spriteloader/grf.hpp @@ -17,7 +17,7 @@ class SpriteLoaderGrf : public SpriteLoader { byte container_ver; public: SpriteLoaderGrf(byte container_ver) : container_ver(container_ver) {} - uint8_t LoadSprite(SpriteLoader::Sprite *sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, byte control_flags) override; + uint8_t LoadSprite(SpriteLoader::SpriteCollection &sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, byte control_flags) override; }; #endif /* SPRITELOADER_GRF_HPP */ diff --git a/src/spriteloader/spriteloader.hpp b/src/spriteloader/spriteloader.hpp index c7157db61e..a835fbc5bb 100644 --- a/src/spriteloader/spriteloader.hpp +++ b/src/spriteloader/spriteloader.hpp @@ -65,6 +65,11 @@ public: static ReusableBuffer buffer[ZOOM_LVL_END]; }; + /** + * Type defining a collection of sprites, one for each zoom level. + */ + using SpriteCollection = std::array; + /** * Load a sprite from the disk and return a sprite struct which is the same for all loaders. * @param[out] sprite The sprites to fill with data. @@ -75,7 +80,7 @@ public: * @param control_flags Control flags, see SpriteCacheCtrlFlags. * @return Bit mask of the zoom levels successfully loaded or 0 if no sprite could be loaded. */ - virtual uint8_t LoadSprite(SpriteLoader::Sprite *sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, byte control_flags) = 0; + virtual uint8_t LoadSprite(SpriteLoader::SpriteCollection &sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, byte control_flags) = 0; virtual ~SpriteLoader() = default; }; @@ -94,7 +99,7 @@ public: /** * Convert a sprite from the loader to our own format. */ - virtual Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) = 0; + virtual Sprite *Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) = 0; /** * Get the value which the height and width on a sprite have to be aligned by. diff --git a/src/video/opengl.cpp b/src/video/opengl.cpp index 886a048ff0..641ebaca54 100644 --- a/src/video/opengl.cpp +++ b/src/video/opengl.cpp @@ -1264,23 +1264,23 @@ void OpenGLBackend::ReleaseAnimBuffer(const Rect &update_rect) } } -/* virtual */ Sprite *OpenGLBackend::Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) +/* virtual */ Sprite *OpenGLBackend::Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) { /* Allocate and construct sprite data. */ Sprite *dest_sprite = (Sprite *)allocator(sizeof(*dest_sprite) + sizeof(OpenGLSprite)); OpenGLSprite *gl_sprite = (OpenGLSprite *)dest_sprite->data; - new (gl_sprite) OpenGLSprite(sprite->width, sprite->height, sprite->type == SpriteType::Font ? 1 : ZOOM_LVL_END, sprite->colours); + new (gl_sprite) OpenGLSprite(sprite[ZOOM_LVL_NORMAL].width, sprite[ZOOM_LVL_NORMAL].height, sprite[ZOOM_LVL_NORMAL].type == SpriteType::Font ? 1 : ZOOM_LVL_END, sprite[ZOOM_LVL_NORMAL].colours); /* Upload texture data. */ - for (int i = 0; i < (sprite->type == SpriteType::Font ? 1 : ZOOM_LVL_END); i++) { + for (int i = 0; i < (sprite[ZOOM_LVL_NORMAL].type == SpriteType::Font ? 1 : ZOOM_LVL_END); i++) { gl_sprite->Update(sprite[i].width, sprite[i].height, i, sprite[i].data); } - dest_sprite->height = sprite->height; - dest_sprite->width = sprite->width; - dest_sprite->x_offs = sprite->x_offs; - dest_sprite->y_offs = sprite->y_offs; + dest_sprite->height = sprite[ZOOM_LVL_NORMAL].height; + dest_sprite->width = sprite[ZOOM_LVL_NORMAL].width; + dest_sprite->x_offs = sprite[ZOOM_LVL_NORMAL].x_offs; + dest_sprite->y_offs = sprite[ZOOM_LVL_NORMAL].y_offs; return dest_sprite; } diff --git a/src/video/opengl.h b/src/video/opengl.h index 9c0086fab4..7c5c0f70be 100644 --- a/src/video/opengl.h +++ b/src/video/opengl.h @@ -109,7 +109,7 @@ public: bool Is32BppSupported() override { return true; } uint GetSpriteAlignment() override { return 1u << (ZOOM_LVL_END - 1); } - Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) override; + Sprite *Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) override; }; From 4a2038e301550d8ae58c6d74a39ac2b207b198c0 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Fri, 15 Dec 2023 13:22:14 +0000 Subject: [PATCH 099/105] Codechange: Make script debug window filter state per-window. --- src/script/script_gui.cpp | 116 ++++++++++++++++++++++---------------- 1 file changed, 67 insertions(+), 49 deletions(-) diff --git a/src/script/script_gui.cpp b/src/script/script_gui.cpp index 0c492f3b6f..162c49ef65 100644 --- a/src/script/script_gui.cpp +++ b/src/script/script_gui.cpp @@ -692,23 +692,34 @@ static bool SetScriptButtonColour(NWidgetCore &button, bool dead, bool paused) 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. + struct FilterState { + std::string break_string; ///< The string to match to the AI output + CompanyID script_debug_company; ///< The AI that is (was last) being debugged. + bool break_check_enabled; ///< Stop an AI when it prints a matching string + bool case_sensitive_break_check; ///< Is the matching done case-sensitive + }; + + static inline FilterState initial_state = { + "", + INVALID_COMPANY, + true, + false, + }; + 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 std::string break_string; ///< 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 + StringFilter break_string_filter; ///< Log filter for break. int highlight_row; ///< The output row that matches the given string, or -1 Scrollbar *vscroll; ///< Cache of the vertical scrollbar. + FilterState filter; ScriptLogTypes::LogData &GetLogData() const { - if (script_debug_company == OWNER_DEITY) return Game::GetInstance()->GetLogData(); - return Company::Get(script_debug_company)->ai_instance->GetLogData(); + if (this->filter.script_debug_company == OWNER_DEITY) return Game::GetInstance()->GetLogData(); + return Company::Get(this->filter.script_debug_company)->ai_instance->GetLogData(); } /** @@ -717,11 +728,11 @@ struct ScriptDebugWindow : public Window { */ bool IsDead() const { - if (script_debug_company == OWNER_DEITY) { + if (this->filter.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(); + return !Company::IsValidAiID(this->filter.script_debug_company) || Company::Get(this->filter.script_debug_company)->ai_instance->IsDead(); } /** @@ -745,9 +756,9 @@ struct ScriptDebugWindow : public Window { void SelectValidDebugCompany() { /* Check if the currently selected company is still active. */ - if (this->IsValidDebugCompany(script_debug_company)) return; + if (this->IsValidDebugCompany(this->filter.script_debug_company)) return; - script_debug_company = INVALID_COMPANY; + this->filter.script_debug_company = INVALID_COMPANY; for (const Company *c : Company::Iterate()) { if (c->is_ai) { @@ -767,13 +778,16 @@ struct ScriptDebugWindow : public Window { */ ScriptDebugWindow(WindowDesc *desc, WindowNumber number) : Window(desc), break_editbox(MAX_BREAK_STR_STRING_LENGTH) { + this->filter = ScriptDebugWindow::initial_state; + this->break_string_filter = {&this->filter.case_sensitive_break_check, false}; + 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; + if (!this->show_break_box) this->filter.break_check_enabled = false; this->last_vscroll_pos = 0; this->autoscroll = true; @@ -784,12 +798,17 @@ struct ScriptDebugWindow : public Window { SetWidgetsDisabledState(!this->show_break_box, WID_SCRD_BREAK_STR_ON_OFF_BTN, WID_SCRD_BREAK_STR_EDIT_BOX, WID_SCRD_MATCH_CASE_BTN); /* Restore the break string value from static variable */ - this->break_editbox.text.Assign(this->break_string); + this->break_editbox.text.Assign(this->filter.break_string); this->SelectValidDebugCompany(); this->InvalidateData(-1); } + ~ScriptDebugWindow() + { + ScriptDebugWindow::initial_state = this->filter; + } + void UpdateWidgetSize(int widget, Dimension *size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension *fill, [[maybe_unused]] Dimension *resize) override { if (widget == WID_SCRD_LOG_PANEL) { @@ -811,16 +830,16 @@ struct ScriptDebugWindow : public Window { { if (widget != WID_SCRD_NAME_TEXT) return; - if (script_debug_company == OWNER_DEITY) { + if (this->filter.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)) { + } else if (this->filter.script_debug_company == INVALID_COMPANY || !Company::IsValidAiID(this->filter.script_debug_company)) { SetDParam(0, STR_EMPTY); } else { - const AIInfo *info = Company::Get(script_debug_company)->ai_info; + const AIInfo *info = Company::Get(this->filter.script_debug_company)->ai_info; assert(info != nullptr); SetDParam(0, STR_AI_DEBUG_NAME_AND_VERSION); SetDParamStr(1, info->GetName()); @@ -863,7 +882,7 @@ struct ScriptDebugWindow : public Window { */ void DrawWidgetLog(const Rect &r) const { - if (script_debug_company == INVALID_COMPANY) return; + if (this->filter.script_debug_company == INVALID_COMPANY) return; ScriptLogTypes::LogData &log = this->GetLogData(); if (log.empty()) return; @@ -899,8 +918,8 @@ struct ScriptDebugWindow : public Window { */ void UpdateLogScroll() { - this->SetWidgetDisabledState(WID_SCRD_SCROLLBAR, script_debug_company == INVALID_COMPANY); - if (script_debug_company == INVALID_COMPANY) return; + this->SetWidgetDisabledState(WID_SCRD_SCROLLBAR, this->filter.script_debug_company == INVALID_COMPANY); + if (this->filter.script_debug_company == INVALID_COMPANY) return; ScriptLogTypes::LogData &log = this->GetLogData(); @@ -942,7 +961,7 @@ struct ScriptDebugWindow : public Window { NWidgetCore *button = this->GetWidget(i + WID_SCRD_COMPANY_BUTTON_START); button->SetDisabled(!valid); - button->SetLowered(script_debug_company == i); + button->SetLowered(this->filter.script_debug_company == i); SetScriptButtonColour(*button, dead, paused); } } @@ -959,7 +978,7 @@ struct ScriptDebugWindow : public Window { NWidgetCore *button = this->GetWidget(WID_SCRD_SCRIPT_GAME); button->SetDisabled(!valid); - button->SetLowered(script_debug_company == OWNER_DEITY); + button->SetLowered(this->filter.script_debug_company == OWNER_DEITY); SetScriptButtonColour(*button, dead, paused); } @@ -971,7 +990,7 @@ struct ScriptDebugWindow : public Window { { if (!this->IsValidDebugCompany(show_script)) return; - script_debug_company = show_script; + this->filter.script_debug_company = show_script; this->highlight_row = -1; // The highlight of one Script make little sense for another Script. @@ -1000,33 +1019,33 @@ struct ScriptDebugWindow : public Window { break; case WID_SCRD_RELOAD_TOGGLE: - if (script_debug_company == OWNER_DEITY) break; + if (this->filter.script_debug_company == OWNER_DEITY) break; /* First kill the company of the AI, then start a new one. This should start the current AI again */ - Command::Post(CCA_DELETE, script_debug_company, CRR_MANUAL, INVALID_CLIENT_ID); - Command::Post(CCA_NEW_AI, script_debug_company, CRR_NONE, INVALID_CLIENT_ID); + Command::Post(CCA_DELETE, this->filter.script_debug_company, CRR_MANUAL, INVALID_CLIENT_ID); + Command::Post(CCA_NEW_AI, this->filter.script_debug_company, CRR_NONE, INVALID_CLIENT_ID); break; case WID_SCRD_SETTINGS: - ShowScriptSettingsWindow(script_debug_company); + ShowScriptSettingsWindow(this->filter.script_debug_company); break; case WID_SCRD_BREAK_STR_ON_OFF_BTN: - this->break_check_enabled = !this->break_check_enabled; + this->filter.break_check_enabled = !this->filter.break_check_enabled; this->InvalidateData(-1); break; case WID_SCRD_MATCH_CASE_BTN: - this->case_sensitive_break_check = !this->case_sensitive_break_check; + this->filter.case_sensitive_break_check = !this->filter.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) { + if (this->filter.script_debug_company == OWNER_DEITY) { Game::Unpause(); } else { - AI::Unpause(script_debug_company); + AI::Unpause(this->filter.script_debug_company); } } @@ -1058,8 +1077,8 @@ struct ScriptDebugWindow : public Window { 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. */ - this->break_string = this->break_editbox.text.buf; - break_string_filter.SetFilterTerm(this->break_string); + this->filter.break_string = this->break_editbox.text.buf; + this->break_string_filter.SetFilterTerm(this->filter.break_string); } /** @@ -1072,7 +1091,9 @@ struct ScriptDebugWindow : public Window { { /* 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()) { + if (!gui_scope && data == this->filter.script_debug_company && + this->IsValidDebugCompany(this->filter.script_debug_company) && + this->filter.break_check_enabled && !this->break_string_filter.IsEmpty()) { /* Get the log instance of the active company */ ScriptLogTypes::LogData &log = this->GetLogData(); @@ -1082,10 +1103,10 @@ struct ScriptDebugWindow : public Window { if (this->break_string_filter.GetState()) { /* Pause execution of script. */ if (!this->IsDead()) { - if (script_debug_company == OWNER_DEITY) { + if (this->filter.script_debug_company == OWNER_DEITY) { Game::Pause(); } else { - AI::Pause(script_debug_company); + AI::Pause(this->filter.script_debug_company); } } @@ -1104,19 +1125,22 @@ struct ScriptDebugWindow : public Window { this->SelectValidDebugCompany(); - this->vscroll->SetCount(script_debug_company != INVALID_COMPANY ? this->GetLogData().size() : 0); + this->vscroll->SetCount(this->filter.script_debug_company != INVALID_COMPANY ? this->GetLogData().size() : 0); this->UpdateAIButtonsState(); this->UpdateGSButtonState(); - 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->SetWidgetLoweredState(WID_SCRD_BREAK_STR_ON_OFF_BTN, this->filter.break_check_enabled); + this->SetWidgetLoweredState(WID_SCRD_MATCH_CASE_BTN, this->filter.case_sensitive_break_check); - this->SetWidgetDisabledState(WID_SCRD_SETTINGS, script_debug_company == INVALID_COMPANY); + this->SetWidgetDisabledState(WID_SCRD_SETTINGS, this->filter.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); - this->SetWidgetDisabledState(WID_SCRD_CONTINUE_BTN, script_debug_company == INVALID_COMPANY || - (script_debug_company == OWNER_DEITY ? !Game::IsPaused() : !AI::IsPaused(script_debug_company))); + this->SetWidgetDisabledState(WID_SCRD_RELOAD_TOGGLE, + this->filter.script_debug_company == INVALID_COMPANY || + this->filter.script_debug_company == OWNER_DEITY || + this->filter.script_debug_company == _local_company); + this->SetWidgetDisabledState(WID_SCRD_CONTINUE_BTN, this->filter.script_debug_company == INVALID_COMPANY || + (this->filter.script_debug_company == OWNER_DEITY ? !Game::IsPaused() : !AI::IsPaused(this->filter.script_debug_company))); } void OnResize() override @@ -1163,12 +1187,6 @@ struct ScriptDebugWindow : public Window { }, ScriptDebugGlobalHotkeys}; }; -CompanyID ScriptDebugWindow::script_debug_company = INVALID_COMPANY; -std::string ScriptDebugWindow::break_string; -bool ScriptDebugWindow::break_check_enabled = true; -bool ScriptDebugWindow::case_sensitive_break_check = false; -StringFilter ScriptDebugWindow::break_string_filter(&ScriptDebugWindow::case_sensitive_break_check, false); - /** Make a number of rows with buttons for each company for the Script debug window. */ NWidgetBase *MakeCompanyButtonRowsScriptDebug(int *biggest_index) { @@ -1252,7 +1270,7 @@ Window *ShowScriptDebugWindow(CompanyID show_company) */ void InitializeScriptGui() { - ScriptDebugWindow::script_debug_company = INVALID_COMPANY; + ScriptDebugWindow::initial_state.script_debug_company = INVALID_COMPANY; } /** Open the AI debug window if one of the AI scripts has crashed. */ From 0ca4b4e146aa0904c9d974ab1b3f8b0bf1f9c9cf Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Fri, 15 Dec 2023 13:22:15 +0000 Subject: [PATCH 100/105] Change: Allow opening multiple script debug windows by holding Ctrl. --- src/ai/ai_core.cpp | 4 +-- src/game/game_core.cpp | 2 +- src/lang/english.txt | 4 +-- src/script/api/script_log.cpp | 2 +- src/script/script_gui.cpp | 49 ++++++++++++++++++++++++++++------- src/script/script_gui.h | 2 +- src/toolbar_gui.cpp | 2 +- 7 files changed, 47 insertions(+), 18 deletions(-) diff --git a/src/ai/ai_core.cpp b/src/ai/ai_core.cpp index 1251b652af..c910f22a83 100644 --- a/src/ai/ai_core.cpp +++ b/src/ai/ai_core.cpp @@ -62,7 +62,7 @@ cur_company.Restore(); - InvalidateWindowData(WC_SCRIPT_DEBUG, 0, -1); + InvalidateWindowClassesData(WC_SCRIPT_DEBUG, -1); return; } @@ -113,7 +113,7 @@ cur_company.Restore(); - InvalidateWindowData(WC_SCRIPT_DEBUG, 0, -1); + InvalidateWindowClassesData(WC_SCRIPT_DEBUG, -1); CloseWindowById(WC_SCRIPT_SETTINGS, company); } diff --git a/src/game/game_core.cpp b/src/game/game_core.cpp index 865aa2a8fc..c7763429ff 100644 --- a/src/game/game_core.cpp +++ b/src/game/game_core.cpp @@ -96,7 +96,7 @@ cur_company.Restore(); - InvalidateWindowData(WC_SCRIPT_DEBUG, 0, -1); + InvalidateWindowClassesData(WC_SCRIPT_DEBUG, -1); } /* static */ void Game::Uninitialize(bool keepConfig) diff --git a/src/lang/english.txt b/src/lang/english.txt index b9f21666b1..3aa24bce81 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -4653,9 +4653,9 @@ STR_AI_DEBUG_MATCH_CASE :{BLACK}Match ca STR_AI_DEBUG_MATCH_CASE_TOOLTIP :{BLACK}Toggle matching case when comparing AI log messages against the break string STR_AI_DEBUG_CONTINUE :{BLACK}Continue STR_AI_DEBUG_CONTINUE_TOOLTIP :{BLACK}Unpause and continue the AI -STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}View debug output of this AI +STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}View debug output of this AI. Ctrl-Click to open in a new window STR_AI_GAME_SCRIPT :{BLACK}Game Script -STR_AI_GAME_SCRIPT_TOOLTIP :{BLACK}Check the Game Script log +STR_AI_GAME_SCRIPT_TOOLTIP :{BLACK}Check the Game Script log. Ctrl-Click to open in a new window STR_ERROR_AI_NO_AI_FOUND :No suitable AI found to load.{}This AI is a dummy AI and won't do anything.{}You can download several AIs via the 'Online Content' system STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}One of the running scripts crashed. Please report this to the script author with a screenshot of the AI/Game Script Debug Window diff --git a/src/script/api/script_log.cpp b/src/script/api/script_log.cpp index adab8f709a..bb6fb0060f 100644 --- a/src/script/api/script_log.cpp +++ b/src/script/api/script_log.cpp @@ -58,5 +58,5 @@ /* Also still print to debug window */ Debug(script, level, "[{}] [{}] {}", (uint)ScriptObject::GetRootCompany(), logc, line.text); - InvalidateWindowData(WC_SCRIPT_DEBUG, 0, ScriptObject::GetRootCompany()); + InvalidateWindowClassesData(WC_SCRIPT_DEBUG, ScriptObject::GetRootCompany()); } diff --git a/src/script/script_gui.cpp b/src/script/script_gui.cpp index 162c49ef65..16b2d678ec 100644 --- a/src/script/script_gui.cpp +++ b/src/script/script_gui.cpp @@ -776,7 +776,7 @@ struct ScriptDebugWindow : public 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) + ScriptDebugWindow(WindowDesc *desc, WindowNumber number, Owner show_company) : Window(desc), break_editbox(MAX_BREAK_STR_STRING_LENGTH) { this->filter = ScriptDebugWindow::initial_state; this->break_string_filter = {&this->filter.case_sensitive_break_check, false}; @@ -800,7 +800,11 @@ struct ScriptDebugWindow : public Window { /* Restore the break string value from static variable */ this->break_editbox.text.Assign(this->filter.break_string); - this->SelectValidDebugCompany(); + if (show_company == INVALID_COMPANY) { + this->SelectValidDebugCompany(); + } else { + this->ChangeToScript(show_company); + } this->InvalidateData(-1); } @@ -985,11 +989,18 @@ struct ScriptDebugWindow : public Window { /** * Change all settings to select another Script. * @param show_ai The new AI to show. + * @param new_window Open the script in a new window. */ - void ChangeToScript(CompanyID show_script) + void ChangeToScript(CompanyID show_script, bool new_window = false) { if (!this->IsValidDebugCompany(show_script)) return; + if (new_window) { + ScriptDebugWindow::initial_state = this->filter; + ShowScriptDebugWindow(show_script, true); + return; + } + this->filter.script_debug_company = show_script; this->highlight_row = -1; // The highlight of one Script make little sense for another Script. @@ -1010,12 +1021,12 @@ struct ScriptDebugWindow : public Window { /* 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)); + ChangeToScript((CompanyID)(widget - WID_SCRD_COMPANY_BUTTON_START), _ctrl_pressed); } switch (widget) { case WID_SCRD_SCRIPT_GAME: - ChangeToScript(OWNER_DEITY); + ChangeToScript(OWNER_DEITY, _ctrl_pressed); break; case WID_SCRD_RELOAD_TOGGLE: @@ -1250,14 +1261,32 @@ static WindowDesc _script_debug_desc(__FILE__, __LINE__, /** * Open the Script debug window and select the given company. * @param show_company Display debug information about this AI company. + * @param new_window Show in new window instead of existing window. */ -Window *ShowScriptDebugWindow(CompanyID show_company) +Window *ShowScriptDebugWindow(CompanyID show_company, bool new_window) { 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; + int i = 0; + if (new_window) { + /* find next free window number for script debug */ + while (FindWindowById(WC_SCRIPT_DEBUG, i) != nullptr) i++; + } else { + /* Find existing window showing show_company. */ + for (Window *w : Window::Iterate()) { + if (w->window_class == WC_SCRIPT_DEBUG && static_cast(w)->filter.script_debug_company == show_company) { + return BringWindowToFrontById(w->window_class, w->window_number); + } + } + + /* Maybe there's a window showing a different company which can be switched. */ + ScriptDebugWindow *w = static_cast(FindWindowByClass(WC_SCRIPT_DEBUG)); + if (w != nullptr) { + BringWindowToFrontById(w->window_class, w->window_number); + w->ChangeToScript(show_company); + return w; + } + } + return new ScriptDebugWindow(&_script_debug_desc, i, show_company); } else { ShowErrorMessage(STR_ERROR_AI_DEBUG_SERVER_ONLY, INVALID_STRING_ID, WL_INFO); } diff --git a/src/script/script_gui.h b/src/script/script_gui.h index 1775d52489..807557ac69 100644 --- a/src/script/script_gui.h +++ b/src/script/script_gui.h @@ -14,7 +14,7 @@ #include "../textfile_type.h" void ShowScriptListWindow(CompanyID slot, bool show_all); -Window *ShowScriptDebugWindow(CompanyID show_company = INVALID_COMPANY); +Window *ShowScriptDebugWindow(CompanyID show_company = INVALID_COMPANY, bool new_window = false); void ShowScriptSettingsWindow(CompanyID slot); void ShowScriptTextfileWindow(TextfileType file_type, CompanyID slot); void ShowScriptDebugWindowIfScriptError(); diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index 70b2fb5ec8..b4e3f4ed77 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -1120,7 +1120,7 @@ static CallBackFunction MenuClickHelp(int index) case 0: return PlaceLandBlockInfo(); case 1: ShowHelpWindow(); break; case 2: IConsoleSwitch(); break; - case 3: ShowScriptDebugWindow(); break; + case 3: ShowScriptDebugWindow(INVALID_COMPANY, _ctrl_pressed); break; case 4: ShowScreenshotWindow(); break; case 5: ShowFramerateWindow(); break; case 6: ShowAboutWindow(); break; From 2d3af141812a759b58820e3cc96a76020ace4b5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Guilloux?= Date: Wed, 20 Dec 2023 22:50:03 +0100 Subject: [PATCH 101/105] Add: Horizontal scroll for script debug log (#11597) --- src/script/api/script_log_types.hpp | 1 + src/script/script_gui.cpp | 32 ++++++++++++++++++++++------- src/widgets/script_widget.h | 3 ++- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/script/api/script_log_types.hpp b/src/script/api/script_log_types.hpp index d868f9d120..d52be944f8 100644 --- a/src/script/api/script_log_types.hpp +++ b/src/script/api/script_log_types.hpp @@ -32,6 +32,7 @@ namespace ScriptLogTypes { struct LogLine { std::string text; ///< The text ScriptLogType type; ///< Text type + uint width; ///< The text width }; /** diff --git a/src/script/script_gui.cpp b/src/script/script_gui.cpp index 16b2d678ec..52f33023d4 100644 --- a/src/script/script_gui.cpp +++ b/src/script/script_gui.cpp @@ -714,6 +714,7 @@ struct ScriptDebugWindow : public Window { StringFilter break_string_filter; ///< Log filter for break. int highlight_row; ///< The output row that matches the given string, or -1 Scrollbar *vscroll; ///< Cache of the vertical scrollbar. + Scrollbar *hscroll; ///< Cache of the horizontal scrollbar. FilterState filter; ScriptLogTypes::LogData &GetLogData() const @@ -782,7 +783,8 @@ struct ScriptDebugWindow : public Window { this->break_string_filter = {&this->filter.case_sensitive_break_check, false}; this->CreateNestedTree(); - this->vscroll = this->GetScrollbar(WID_SCRD_SCROLLBAR); + this->vscroll = this->GetScrollbar(WID_SCRD_VSCROLLBAR); + this->hscroll = this->GetScrollbar(WID_SCRD_HSCROLLBAR); 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); @@ -796,6 +798,7 @@ struct ScriptDebugWindow : public Window { 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); + this->hscroll->SetStepSize(10); // Speed up horizontal scrollbar /* Restore the break string value from static variable */ this->break_editbox.text.Assign(this->filter.break_string); @@ -805,6 +808,10 @@ struct ScriptDebugWindow : public Window { } else { this->ChangeToScript(show_company); } + } + + void OnInit() override + { this->InvalidateData(-1); } @@ -912,7 +919,7 @@ struct ScriptDebugWindow : public Window { if (colour == TC_BLACK) colour = TC_WHITE; // Make black text readable by inverting it to white. } - DrawString(tr, line.text, colour, SA_LEFT | SA_FORCE); + DrawString(-this->hscroll->GetPosition(), tr.right, tr.top, line.text, colour, SA_LEFT | SA_FORCE); tr.top += this->resize.step_height; } } @@ -922,7 +929,7 @@ struct ScriptDebugWindow : public Window { */ void UpdateLogScroll() { - this->SetWidgetDisabledState(WID_SCRD_SCROLLBAR, this->filter.script_debug_company == INVALID_COMPANY); + this->SetWidgetsDisabledState(this->filter.script_debug_company == INVALID_COMPANY, WID_SCRD_VSCROLLBAR, WID_SCRD_HSCROLLBAR); if (this->filter.script_debug_company == INVALID_COMPANY) return; ScriptLogTypes::LogData &log = this->GetLogData(); @@ -932,7 +939,7 @@ struct ScriptDebugWindow : public Window { this->vscroll->SetCount(scroll_count); /* We need a repaint */ - this->SetWidgetDirty(WID_SCRD_SCROLLBAR); + this->SetWidgetDirty(WID_SCRD_VSCROLLBAR); } if (log.empty()) return; @@ -944,7 +951,7 @@ struct ScriptDebugWindow : public Window { if (this->autoscroll && this->vscroll->SetPosition((int)log.size())) { /* We need a repaint */ - this->SetWidgetDirty(WID_SCRD_SCROLLBAR); + this->SetWidgetDirty(WID_SCRD_VSCROLLBAR); this->SetWidgetDirty(WID_SCRD_LOG_PANEL); } @@ -1136,7 +1143,16 @@ struct ScriptDebugWindow : public Window { this->SelectValidDebugCompany(); + uint max_width = 0; + if (this->filter.script_debug_company != INVALID_COMPANY) { + for (auto &line : this->GetLogData()) { + if (line.width == 0 || data == -1) line.width = GetStringBoundingBox(line.text).width; + max_width = std::max(max_width, line.width); + } + } + this->vscroll->SetCount(this->filter.script_debug_company != INVALID_COMPANY ? this->GetLogData().size() : 0); + this->hscroll->SetCount(max_width + WidgetDimensions::scaled.frametext.Horizontal()); this->UpdateAIButtonsState(); this->UpdateGSButtonState(); @@ -1157,6 +1173,7 @@ struct ScriptDebugWindow : public Window { void OnResize() override { this->vscroll->SetCapacityFromWidget(this, WID_SCRD_LOG_PANEL, WidgetDimensions::scaled.framerect.Vertical()); + this->hscroll->SetCapacityFromWidget(this, WID_SCRD_LOG_PANEL); } /** @@ -1225,7 +1242,7 @@ static const NWidgetPart _nested_script_debug_widgets[] = { 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), + NWidget(WWT_PANEL, COLOUR_GREY, WID_SCRD_LOG_PANEL), SetMinimalSize(287, 180), SetResize(1, 1), SetScrollbar(WID_SCRD_VSCROLLBAR), EndContainer(), /* Break string widgets */ NWidget(NWID_SELECTION, INVALID_COLOUR, WID_SCRD_BREAK_STRING_WIDGETS), @@ -1241,9 +1258,10 @@ static const NWidgetPart _nested_script_debug_widgets[] = { 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(), + NWidget(NWID_HSCROLLBAR, COLOUR_GREY, WID_SCRD_HSCROLLBAR), EndContainer(), NWidget(NWID_VERTICAL), - NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_SCRD_SCROLLBAR), + NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_SCRD_VSCROLLBAR), NWidget(WWT_RESIZEBOX, COLOUR_GREY), EndContainer(), EndContainer(), diff --git a/src/widgets/script_widget.h b/src/widgets/script_widget.h index 0566995f8d..d4ba17e452 100644 --- a/src/widgets/script_widget.h +++ b/src/widgets/script_widget.h @@ -41,7 +41,7 @@ enum ScriptDebugWidgets { 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_VSCROLLBAR, ///< Vertical 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. @@ -49,6 +49,7 @@ enum ScriptDebugWidgets { 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. + WID_SCRD_HSCROLLBAR, ///< Horizontal scrollbar of the log panel. }; #endif /* WIDGETS_SCRIPT_WIDGET_H */ From c1afbc94157652262c044801233b5101fc2e24af Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 20 Dec 2023 22:10:05 +0000 Subject: [PATCH 102/105] Fix: Update widget dimensions before updating viewport signs. (#11611) Viewport signs used fullbevel WidgetDimensions before it was updated for the new interface scale. --- src/gfx.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gfx.cpp b/src/gfx.cpp index c6562b8f09..4b1373cfcd 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -1993,6 +1993,7 @@ bool AdjustGUIZoom(bool automatic) ClearFontCache(); LoadStringWidthTable(); + SetupWidgetDimensions(); UpdateAllVirtCoords(); /* Adjust all window sizes to match the new zoom level, so that they don't appear From fd0aa3dd19ce9645a14c7e1c1dd698986ae5bede Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Fri, 22 Dec 2023 15:23:42 +0000 Subject: [PATCH 103/105] Fix #11515: Zoom level could wrap around when changing interface scale. (#11615) This happened due to converting the new value to unsigned before clamping instead of after. --- src/gfx.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gfx.cpp b/src/gfx.cpp index 4b1373cfcd..3896647611 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -2005,7 +2005,7 @@ bool AdjustGUIZoom(bool automatic) w->top = (w->top * _gui_scale) / old_scale; } if (w->viewport != nullptr) { - w->viewport->zoom = Clamp(ZoomLevel(w->viewport->zoom - zoom_shift), _settings_client.gui.zoom_min, _settings_client.gui.zoom_max); + w->viewport->zoom = static_cast(Clamp(w->viewport->zoom - zoom_shift, _settings_client.gui.zoom_min, _settings_client.gui.zoom_max)); } } From acfe367507df0b76868d5aca41d4985987d3b32e Mon Sep 17 00:00:00 2001 From: Darragh <90960999+Darragh-Hazell@users.noreply.github.com> Date: Sat, 23 Dec 2023 03:56:09 +1100 Subject: [PATCH 104/105] Fix #11442: "default" colour in group colour window is not updated when changing master colour (#11614) Updated SelectCompanyLiveryWindow.DrawWidget method to check if a group's livery.in_use 0 bit is set, rendering the company's default colour if it has not been. --- src/company_gui.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/company_gui.cpp b/src/company_gui.cpp index 24c4552a43..2d9753323e 100644 --- a/src/company_gui.cpp +++ b/src/company_gui.cpp @@ -924,9 +924,10 @@ public: y += this->line_height; }; + const Company *c = Company::Get((CompanyID)this->window_number); + if (livery_class < LC_GROUP_RAIL) { int pos = this->vscroll->GetPosition(); - const Company *c = Company::Get((CompanyID)this->window_number); for (LiveryScheme scheme = LS_DEFAULT; scheme < LS_END; scheme++) { if (_livery_class[scheme] == this->livery_class && HasBit(_loaded_newgrf_features.used_liveries, scheme)) { if (pos-- > 0) continue; @@ -937,8 +938,9 @@ public: uint max = static_cast(std::min(this->vscroll->GetPosition() + this->vscroll->GetCapacity(), this->groups.size())); for (uint i = this->vscroll->GetPosition(); i < max; ++i) { const Group *g = this->groups[i]; + const bool livery_set = HasBit(g->livery.in_use, 0); SetDParam(0, g->index); - draw_livery(STR_GROUP_NAME, g->livery, this->sel == g->index, false, this->indents[i] * WidgetDimensions::scaled.hsep_indent); + draw_livery(STR_GROUP_NAME, livery_set ? g->livery : c->livery[LS_DEFAULT], this->sel == g->index, livery_set, this->indents[i] * WidgetDimensions::scaled.hsep_indent); } } } From 5cb7a16edc6ceda7430f1b8c9dedffd6e910090b Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 23 Dec 2023 13:17:33 +0000 Subject: [PATCH 105/105] Fix #11618: Don't try to display unavailable zoom levels in sprite aligner. (#11619) --- src/newgrf_debug_gui.cpp | 3 +++ src/settings_table.cpp | 1 + 2 files changed, 4 insertions(+) diff --git a/src/newgrf_debug_gui.cpp b/src/newgrf_debug_gui.cpp index 51df78f6c9..4edac598f0 100644 --- a/src/newgrf_debug_gui.cpp +++ b/src/newgrf_debug_gui.cpp @@ -827,6 +827,7 @@ struct SpriteAlignerWindow : Window { { /* On first opening, set initial zoom to current zoom level. */ if (SpriteAlignerWindow::zoom == ZOOM_LVL_END) SpriteAlignerWindow::zoom = _gui_zoom; + SpriteAlignerWindow::zoom = Clamp(SpriteAlignerWindow::zoom, _settings_client.gui.zoom_min, _settings_client.gui.zoom_max); this->CreateNestedTree(); this->vscroll = this->GetScrollbar(WID_SA_SCROLLBAR); @@ -1073,7 +1074,9 @@ struct SpriteAlignerWindow : Window { this->vscroll->SetCount(_newgrf_debug_sprite_picker.sprites.size()); } + SpriteAlignerWindow::zoom = Clamp(SpriteAlignerWindow::zoom, _settings_client.gui.zoom_min, _settings_client.gui.zoom_max); for (ZoomLevel z = ZOOM_LVL_NORMAL; z < ZOOM_LVL_END; z++) { + this->SetWidgetsDisabledState(z < _settings_client.gui.zoom_min || z > _settings_client.gui.zoom_max, WID_SA_ZOOM + z); this->SetWidgetsLoweredState(SpriteAlignerWindow::zoom == z, WID_SA_ZOOM + z); } } diff --git a/src/settings_table.cpp b/src/settings_table.cpp index e6b95f6890..d4c41b59f7 100644 --- a/src/settings_table.cpp +++ b/src/settings_table.cpp @@ -265,6 +265,7 @@ static void ZoomMinMaxChanged(int32_t) { ConstrainAllViewportsZoom(); GfxClearSpriteCache(); + InvalidateWindowClassesData(WC_SPRITE_ALIGNER); if (AdjustGUIZoom(false)) { ReInitAllWindows(true); }