diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e955294b04..4454aa1770 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -148,6 +148,7 @@ add_files( driver.cpp driver.h dropdown.cpp + dropdown_common_type.h dropdown_func.h dropdown_type.h economy.cpp diff --git a/src/airport_gui.cpp b/src/airport_gui.cpp index 891e432b33..1746f0d5f1 100644 --- a/src/airport_gui.cpp +++ b/src/airport_gui.cpp @@ -23,6 +23,7 @@ #include "newgrf_airport.h" #include "newgrf_callbacks.h" #include "dropdown_type.h" +#include "dropdown_func.h" #include "core/geometry_func.hpp" #include "hotkeys.h" #include "vehicle_func.h" @@ -233,7 +234,7 @@ class BuildAirportWindow : public PickerWindowBase { DropDownList list; for (uint i = 0; AirportClass::IsClassIDValid((AirportClassID)i); i++) { - list.push_back(std::make_unique(AirportClass::Get((AirportClassID)i)->name, i, false)); + list.push_back(MakeDropDownListStringItem(AirportClass::Get((AirportClassID)i)->name, i, false)); } return list; diff --git a/src/autoreplace_gui.cpp b/src/autoreplace_gui.cpp index 6366264f65..6cfe0d8422 100644 --- a/src/autoreplace_gui.cpp +++ b/src/autoreplace_gui.cpp @@ -24,6 +24,7 @@ #include "core/geometry_func.hpp" #include "rail_gui.h" #include "road_gui.h" +#include "dropdown_type.h" #include "dropdown_func.h" #include "widgets/autoreplace_widget.h" @@ -562,8 +563,8 @@ public: case WID_RV_TRAIN_ENGINEWAGON_DROPDOWN: { DropDownList list; - list.push_back(std::make_unique(STR_REPLACE_ENGINES, 1, false)); - list.push_back(std::make_unique(STR_REPLACE_WAGONS, 0, false)); + list.push_back(MakeDropDownListStringItem(STR_REPLACE_ENGINES, 1)); + list.push_back(MakeDropDownListStringItem(STR_REPLACE_WAGONS, 0)); ShowDropDownList(this, std::move(list), this->replace_engines ? 1 : 0, WID_RV_TRAIN_ENGINEWAGON_DROPDOWN); break; } diff --git a/src/blitter/32bpp_optimized.cpp b/src/blitter/32bpp_optimized.cpp index 3fca934753..6bb42e8ace 100644 --- a/src/blitter/32bpp_optimized.cpp +++ b/src/blitter/32bpp_optimized.cpp @@ -317,9 +317,9 @@ template Sprite *Blitter_32bppOptimized::EncodeInternal(const ZoomLevel zoom_max; uint8_t missing_zoom_levels = 0; - if (sprite[ZOOM_LVL_NORMAL].type == SpriteType::Font) { - zoom_min = ZOOM_LVL_NORMAL; - zoom_max = ZOOM_LVL_NORMAL; + if (sprite[ZOOM_LVL_MIN].type == SpriteType::Font) { + zoom_min = ZOOM_LVL_MIN; + zoom_max = ZOOM_LVL_MIN; } else { zoom_min = _settings_client.gui.zoom_min; zoom_max = (ZoomLevel) std::min(_settings_client.gui.zoom_max, ZOOM_LVL_DRAW_SPR); @@ -478,10 +478,10 @@ template Sprite *Blitter_32bppOptimized::EncodeInternal(const missing_zoom_levels = UINT8_MAX; } - 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; + dest_sprite->height = sprite[ZOOM_LVL_MIN].height; + dest_sprite->width = sprite[ZOOM_LVL_MIN].width; + dest_sprite->x_offs = sprite[ZOOM_LVL_MIN].x_offs; + dest_sprite->y_offs = sprite[ZOOM_LVL_MIN].y_offs; dest_sprite->next = nullptr; dest_sprite->missing_zoom_levels = missing_zoom_levels; diff --git a/src/blitter/32bpp_simple.cpp b/src/blitter/32bpp_simple.cpp index 41d5f3d730..230b4d997f 100644 --- a/src/blitter/32bpp_simple.cpp +++ b/src/blitter/32bpp_simple.cpp @@ -137,19 +137,19 @@ void Blitter_32bppSimple::DrawColourMappingRect(void *dst, int width, int height 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[ZOOM_LVL_NORMAL].height * (size_t)sprite[ZOOM_LVL_NORMAL].width * sizeof(*dst)); + Sprite *dest_sprite = (Sprite *)allocator(sizeof(*dest_sprite) + (size_t)sprite[ZOOM_LVL_MIN].height * (size_t)sprite[ZOOM_LVL_MIN].width * sizeof(*dst)); - 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; + dest_sprite->height = sprite[ZOOM_LVL_MIN].height; + dest_sprite->width = sprite[ZOOM_LVL_MIN].width; + dest_sprite->x_offs = sprite[ZOOM_LVL_MIN].x_offs; + dest_sprite->y_offs = sprite[ZOOM_LVL_MIN].y_offs; dest_sprite->next = nullptr; dest_sprite->missing_zoom_levels = 0; dst = (Blitter_32bppSimple::Pixel *)dest_sprite->data; - SpriteLoader::CommonPixel *src = (SpriteLoader::CommonPixel *)sprite[ZOOM_LVL_NORMAL].data; + SpriteLoader::CommonPixel *src = (SpriteLoader::CommonPixel *)sprite[ZOOM_LVL_MIN].data; - for (int i = 0; i < sprite[ZOOM_LVL_NORMAL].height * sprite[ZOOM_LVL_NORMAL].width; i++) { + for (int i = 0; i < sprite[ZOOM_LVL_MIN].height * sprite[ZOOM_LVL_MIN].width; i++) { if (src->m == 0) { dst[i].r = src->r; dst[i].g = src->g; diff --git a/src/blitter/32bpp_sse2.cpp b/src/blitter/32bpp_sse2.cpp index 21a1d39745..63db557785 100644 --- a/src/blitter/32bpp_sse2.cpp +++ b/src/blitter/32bpp_sse2.cpp @@ -26,10 +26,10 @@ Sprite *Blitter_32bppSSE_Base::Encode(const SpriteLoader::SpriteCollection &spri * Second uint32_t of a line = the number of transparent pixels from the right. * Then all RGBA then all MV. */ - ZoomLevel zoom_min = ZOOM_LVL_NORMAL; - ZoomLevel zoom_max = ZOOM_LVL_NORMAL; + ZoomLevel zoom_min = ZOOM_LVL_MIN; + ZoomLevel zoom_max = ZOOM_LVL_MIN; uint8_t missing_zoom_levels = 0; - if (sprite[ZOOM_LVL_NORMAL].type != SpriteType::Font) { + if (sprite[ZOOM_LVL_MIN].type != SpriteType::Font) { zoom_min = _settings_client.gui.zoom_min; zoom_max = (ZoomLevel) std::min(_settings_client.gui.zoom_max, ZOOM_LVL_DRAW_SPR); if (zoom_max == zoom_min) zoom_max = ZOOM_LVL_DRAW_SPR; @@ -62,10 +62,10 @@ Sprite *Blitter_32bppSSE_Base::Encode(const SpriteLoader::SpriteCollection &spri } Sprite *dst_sprite = (Sprite *) allocator(sizeof(Sprite) + sizeof(SpriteData) + all_sprites_size); - 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; + dst_sprite->height = sprite[ZOOM_LVL_MIN].height; + dst_sprite->width = sprite[ZOOM_LVL_MIN].width; + dst_sprite->x_offs = sprite[ZOOM_LVL_MIN].x_offs; + dst_sprite->y_offs = sprite[ZOOM_LVL_MIN].y_offs; dst_sprite->next = nullptr; dst_sprite->missing_zoom_levels = missing_zoom_levels; memcpy(dst_sprite->data, &sd, sizeof(SpriteData)); diff --git a/src/blitter/32bpp_sse_type.h b/src/blitter/32bpp_sse_type.h index e8662e4949..57de1d6d58 100644 --- a/src/blitter/32bpp_sse_type.h +++ b/src/blitter/32bpp_sse_type.h @@ -28,7 +28,7 @@ #endif #define META_LENGTH 2 ///< Number of uint32_t inserted before each line of pixels in a sprite. -#define MARGIN_NORMAL_THRESHOLD (zoom == ZOOM_LVL_OUT_32X ? 8 : 4) ///< Minimum width to use margins with BM_NORMAL. +#define MARGIN_NORMAL_THRESHOLD (zoom == ZOOM_LVL_OUT_8X ? 8 : 4) ///< Minimum width to use margins with BM_NORMAL. #define MARGIN_REMAP_THRESHOLD 4 ///< Minimum width to use margins with BM_COLOUR_REMAP. #undef ALIGN diff --git a/src/blitter/8bpp_optimized.cpp b/src/blitter/8bpp_optimized.cpp index d61acdc0b0..90f82048d2 100644 --- a/src/blitter/8bpp_optimized.cpp +++ b/src/blitter/8bpp_optimized.cpp @@ -129,9 +129,9 @@ Sprite *Blitter_8bppOptimized::Encode(const SpriteLoader::SpriteCollection &spri ZoomLevel zoom_min; ZoomLevel zoom_max; - if (sprite[ZOOM_LVL_NORMAL].type == SpriteType::Font) { - zoom_min = ZOOM_LVL_NORMAL; - zoom_max = ZOOM_LVL_NORMAL; + if (sprite[ZOOM_LVL_MIN].type == SpriteType::Font) { + zoom_min = ZOOM_LVL_MIN; + zoom_max = ZOOM_LVL_MIN; } else { zoom_min = _settings_client.gui.zoom_min; zoom_max = (ZoomLevel) std::min(_settings_client.gui.zoom_max, ZOOM_LVL_DRAW_SPR); @@ -222,10 +222,10 @@ Sprite *Blitter_8bppOptimized::Encode(const SpriteLoader::SpriteCollection &spri /* Allocate the exact amount of memory we need */ Sprite *dest_sprite = (Sprite *)allocator(sizeof(*dest_sprite) + size); - 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; + dest_sprite->height = sprite[ZOOM_LVL_MIN].height; + dest_sprite->width = sprite[ZOOM_LVL_MIN].width; + dest_sprite->x_offs = sprite[ZOOM_LVL_MIN].x_offs; + dest_sprite->y_offs = sprite[ZOOM_LVL_MIN].y_offs; dest_sprite->next = nullptr; dest_sprite->missing_zoom_levels = 0; memcpy(dest_sprite->data, temp_dst, size); diff --git a/src/blitter/8bpp_simple.cpp b/src/blitter/8bpp_simple.cpp index 7282d8daa7..379e1c8743 100644 --- a/src/blitter/8bpp_simple.cpp +++ b/src/blitter/8bpp_simple.cpp @@ -65,18 +65,18 @@ void Blitter_8bppSimple::Draw(Blitter::BlitterParams *bp, BlitterMode mode, Zoom Sprite *Blitter_8bppSimple::Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) { Sprite *dest_sprite; - dest_sprite = (Sprite *)allocator(sizeof(*dest_sprite) + (size_t)sprite[ZOOM_LVL_NORMAL].height * (size_t)sprite[ZOOM_LVL_NORMAL].width); + dest_sprite = (Sprite *)allocator(sizeof(*dest_sprite) + (size_t)sprite[ZOOM_LVL_MIN].height * (size_t)sprite[ZOOM_LVL_MIN].width); - 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; + dest_sprite->height = sprite[ZOOM_LVL_MIN].height; + dest_sprite->width = sprite[ZOOM_LVL_MIN].width; + dest_sprite->x_offs = sprite[ZOOM_LVL_MIN].x_offs; + dest_sprite->y_offs = sprite[ZOOM_LVL_MIN].y_offs; dest_sprite->next = nullptr; dest_sprite->missing_zoom_levels = 0; /* Copy over only the 'remap' channel, as that is what we care about in 8bpp */ - 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; + for (int i = 0; i < sprite[ZOOM_LVL_MIN].height * sprite[ZOOM_LVL_MIN].width; i++) { + dest_sprite->data[i] = sprite[ZOOM_LVL_MIN].data[i].m; } return dest_sprite; diff --git a/src/blitter/factory.hpp b/src/blitter/factory.hpp index e03d5f2934..1bf4da0b99 100644 --- a/src/blitter/factory.hpp +++ b/src/blitter/factory.hpp @@ -94,7 +94,7 @@ public: * @param name the blitter to select. * @post Sets the blitter so GetCurrentBlitter() returns it too. */ - static Blitter *SelectBlitter(const std::string &name) + static Blitter *SelectBlitter(const std::string_view name) { BlitterFactory *b = GetBlitterFactory(name); if (b == nullptr) return nullptr; @@ -112,17 +112,17 @@ public: * @param name the blitter factory to select. * @return The blitter factory, or nullptr when there isn't one with the wanted name. */ - static BlitterFactory *GetBlitterFactory(const std::string &name) + static BlitterFactory *GetBlitterFactory(const std::string_view name) { #if defined(DEDICATED) - const char *default_blitter = "null"; + const std::string_view default_blitter = "null"; #elif defined(WITH_COCOA) - const char *default_blitter = "32bpp-anim"; + const std::string_view default_blitter = "32bpp-anim"; #else - const char *default_blitter = "8bpp-optimized"; + const std::string_view default_blitter = "8bpp-optimized"; #endif if (GetBlitters().empty()) return nullptr; - const char *bname = name.empty() ? default_blitter : name.c_str(); + const std::string_view bname = name.empty() ? default_blitter : name; for (auto &it : GetBlitters()) { BlitterFactory *b = it.second; diff --git a/src/blitter/null.cpp b/src/blitter/null.cpp index 8efa5802ce..e6f98acb35 100644 --- a/src/blitter/null.cpp +++ b/src/blitter/null.cpp @@ -20,10 +20,10 @@ Sprite *Blitter_Null::Encode(const SpriteLoader::SpriteCollection &sprite, Alloc Sprite *dest_sprite; dest_sprite = (Sprite *)allocator(sizeof(*dest_sprite)); - 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; + dest_sprite->height = sprite[ZOOM_LVL_MIN].height; + dest_sprite->width = sprite[ZOOM_LVL_MIN].width; + dest_sprite->x_offs = sprite[ZOOM_LVL_MIN].x_offs; + dest_sprite->y_offs = sprite[ZOOM_LVL_MIN].y_offs; dest_sprite->next = nullptr; dest_sprite->missing_zoom_levels = 0; diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index 3899410cf0..edb8531cd2 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -25,6 +25,7 @@ #include "window_func.h" #include "date_func.h" #include "vehicle_func.h" +#include "dropdown_type.h" #include "dropdown_func.h" #include "engine_gui.h" #include "cargotype.h" @@ -1408,23 +1409,23 @@ struct BuildVehicleWindowBase : Window { DropDownList list; /* Add item for disabling filtering. */ - list.push_back(std::make_unique(this->GetCargoFilterLabel(CargoFilterCriteria::CF_ANY), CargoFilterCriteria::CF_ANY, false)); + list.push_back(MakeDropDownListStringItem(this->GetCargoFilterLabel(CargoFilterCriteria::CF_ANY), CargoFilterCriteria::CF_ANY, false)); /* Specific filters for trains. */ if (this->vehicle_type == VEH_TRAIN) { if (!hide_engines) { /* Add item for locomotives only in case of trains. */ - list.push_back(std::make_unique(this->GetCargoFilterLabel(CargoFilterCriteria::CF_ENGINES), CargoFilterCriteria::CF_ENGINES, false)); + list.push_back(MakeDropDownListStringItem(this->GetCargoFilterLabel(CargoFilterCriteria::CF_ENGINES), CargoFilterCriteria::CF_ENGINES, false)); } /* Add item for vehicles not carrying anything, e.g. train engines. * This could also be useful for eyecandy vehicles of other types, but is likely too confusing for joe, */ - list.push_back(std::make_unique(this->GetCargoFilterLabel(CargoFilterCriteria::CF_NONE), CargoFilterCriteria::CF_NONE, false)); + list.push_back(MakeDropDownListStringItem(this->GetCargoFilterLabel(CargoFilterCriteria::CF_NONE), CargoFilterCriteria::CF_NONE, false)); } /* Add cargos */ Dimension d = GetLargestCargoIconSize(); for (const CargoSpec *cs : _sorted_standard_cargo_specs) { - list.push_back(std::make_unique(d, cs->GetCargoIcon(), PAL_NONE, cs->name, cs->Index(), false)); + list.push_back(MakeDropDownListIconItem(d, cs->GetCargoIcon(), PAL_NONE, cs->name, cs->Index(), false)); } return list; diff --git a/src/clear_cmd.cpp b/src/clear_cmd.cpp index 7834dacb2f..324ecbb78d 100644 --- a/src/clear_cmd.cpp +++ b/src/clear_cmd.cpp @@ -173,7 +173,7 @@ static void DrawTile_Clear(TileInfo *ti, DrawTileProcParams params) break; case CLEAR_FIELDS: - if (params.min_visible_height <= 4 * ZOOM_LVL_BASE) { + if (params.min_visible_height <= (4 * ZOOM_BASE)) { DrawGroundSprite(GetSpriteIDForFields(ti->tileh, GetFieldType(ti->tile)), PAL_NONE); DrawClearLandFence(ti); } diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp index 9d296be4a6..2a8a753921 100644 --- a/src/company_cmd.cpp +++ b/src/company_cmd.cpp @@ -1346,6 +1346,7 @@ CommandCost CmdRenamePresident(TileIndex tile, DoCommandFlag flags, uint32_t p1, } } + InvalidateWindowClassesData(WC_COMPANY, 1); MarkWholeScreenDirty(); CompanyAdminUpdate(c); } diff --git a/src/company_gui.cpp b/src/company_gui.cpp index 495f70e5ec..770ee8080f 100644 --- a/src/company_gui.cpp +++ b/src/company_gui.cpp @@ -24,6 +24,7 @@ #include "strings_func.h" #include "date_func.h" #include "dropdown_type.h" +#include "dropdown_common_type.h" #include "tilehighlight_func.h" #include "company_base.h" #include "core/geometry_func.hpp" @@ -592,26 +593,6 @@ void ShowCompanyFinances(CompanyID company) new CompanyFinancesWindow(&_company_finances_desc, company); } -/* List of colours for the livery window */ -static const StringID _colour_dropdown[] = { - STR_COLOUR_DARK_BLUE, - STR_COLOUR_PALE_GREEN, - STR_COLOUR_PINK, - STR_COLOUR_YELLOW, - STR_COLOUR_RED, - STR_COLOUR_LIGHT_BLUE, - STR_COLOUR_GREEN, - STR_COLOUR_DARK_GREEN, - STR_COLOUR_BLUE, - STR_COLOUR_CREAM, - STR_COLOUR_MAUVE, - STR_COLOUR_PURPLE, - STR_COLOUR_ORANGE, - STR_COLOUR_BROWN, - STR_COLOUR_GREY, - STR_COLOUR_WHITE, -}; - /* Association of liveries to livery classes */ static const LiveryClass _livery_class[LS_END] = { LC_OTHER, @@ -629,7 +610,7 @@ static const LiveryClass _livery_class[LS_END] = { template class DropDownListColourItem : public DropDownIcon> { public: - DropDownListColourItem(int colour, bool masked) : DropDownIcon>(TSprite, GENERAL_SPRITE_COLOUR(colour % COLOUR_END), colour < COLOUR_END ? _colour_dropdown[colour] : STR_COLOUR_DEFAULT, colour, masked) + DropDownListColourItem(int colour, bool masked) : DropDownIcon>(TSprite, GENERAL_SPRITE_COLOUR(colour % COLOUR_END), colour < COLOUR_END ? (STR_COLOUR_DARK_BLUE + colour) : STR_COLOUR_DEFAULT, colour, masked) { } }; @@ -687,8 +668,8 @@ private: default_col = (primary ? default_livery->colour1 : default_livery->colour2) + COLOUR_END; 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))); + for (Colours colour = COLOUR_BEGIN; colour != COLOUR_END; colour++) { + list.push_back(std::make_unique>(colour, HasBit(used_colours, colour))); } uint8_t sel; @@ -823,8 +804,8 @@ public: case WID_SCL_PRI_COL_DROPDOWN: { this->square = GetSpriteSize(SPR_SQUARE); int string_padding = this->square.width + WidgetDimensions::scaled.hsep_normal + padding.width; - for (const StringID *id = _colour_dropdown; id != endof(_colour_dropdown); id++) { - size->width = std::max(size->width, GetStringBoundingBox(*id).width + string_padding); + for (Colours colour = COLOUR_BEGIN; colour != COLOUR_END; colour++) { + size->width = std::max(size->width, GetStringBoundingBox(STR_COLOUR_DARK_BLUE + colour).width + string_padding); } size->width = std::max(size->width, GetStringBoundingBox(STR_COLOUR_DEFAULT).width + string_padding); break; @@ -2585,6 +2566,14 @@ struct CompanyWindow : Window } } + void OnResize() override + { + NWidgetResizeBase *wid = this->GetWidget(WID_C_FACE_TITLE); + SetDParam(0, this->owner); + int y = GetStringHeight(STR_COMPANY_VIEW_PRESIDENT_MANAGER_TITLE, wid->current_x); + if (wid->UpdateVerticalSize(y)) this->ReInit(0, 0); + } + void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override { switch (widget) { @@ -2728,7 +2717,6 @@ struct CompanyWindow : Window } } - /** * Some data on this window has become invalid. * @param data Information about the changed data. @@ -2736,25 +2724,30 @@ struct CompanyWindow : Window */ void OnInvalidateData(int data = 0, bool gui_scope = true) override { - if (this->window_number == _local_company) return; + if (this->window_number != _local_company) { + if (_settings_game.economy.allow_shares) { // Shares are allowed + const Company *c = Company::Get(this->window_number); - if (_settings_game.economy.allow_shares) { // Shares are allowed - const Company *c = Company::Get(this->window_number); + /* If all shares are owned by someone (none by nobody), disable buy button */ + this->SetWidgetDisabledState(WID_C_BUY_SHARE, GetAmountOwnedBy(c, INVALID_OWNER) == 0 || + /* Only 25% left to buy. If the company is human, disable buying it up.. TODO issues! */ + (GetAmountOwnedBy(c, INVALID_OWNER) == 1 && !c->is_ai) || + /* Spectators cannot do anything of course */ + _local_company == COMPANY_SPECTATOR); - /* If all shares are owned by someone (none by nobody), disable buy button */ - this->SetWidgetDisabledState(WID_C_BUY_SHARE, GetAmountOwnedBy(c, INVALID_OWNER) == 0 || - /* Only 25% left to buy. If the company is human, disable buying it up.. TODO issues! */ - (GetAmountOwnedBy(c, INVALID_OWNER) == 1 && !c->is_ai) || - /* Spectators cannot do anything of course */ - _local_company == COMPANY_SPECTATOR); + /* If the company doesn't own any shares, disable sell button */ + this->SetWidgetDisabledState(WID_C_SELL_SHARE, (GetAmountOwnedBy(c, _local_company) == 0) || + /* Spectators cannot do anything of course */ + _local_company == COMPANY_SPECTATOR); + } else { // Shares are not allowed, disable buy/sell buttons + this->DisableWidget(WID_C_BUY_SHARE); + this->DisableWidget(WID_C_SELL_SHARE); + } + } - /* If the company doesn't own any shares, disable sell button */ - this->SetWidgetDisabledState(WID_C_SELL_SHARE, (GetAmountOwnedBy(c, _local_company) == 0) || - /* Spectators cannot do anything of course */ - _local_company == COMPANY_SPECTATOR); - } else { // Shares are not allowed, disable buy/sell buttons - this->DisableWidget(WID_C_BUY_SHARE); - this->DisableWidget(WID_C_SELL_SHARE); + if (gui_scope && data == 1) { + /* Manually call OnResize to adjust minimum height of president name widget. */ + OnResize(); } } }; diff --git a/src/crashlog.cpp b/src/crashlog.cpp index 236cc58f53..0f94abc858 100644 --- a/src/crashlog.cpp +++ b/src/crashlog.cpp @@ -498,19 +498,17 @@ char *CrashLog::LogGamelog(char *buffer, const char *last) const */ char *CrashLog::LogRecentNews(char *buffer, const char *last) const { - uint total = 0; - for (NewsItem *news = _latest_news; news != nullptr; news = news->prev) { - total++; - } + uint total = static_cast(GetNews().size()); uint show = std::min(total, 32); buffer += seprintf(buffer, last, "Recent news messages (%u of %u):\n", show, total); int i = 0; - for (NewsItem *news = _latest_news; i < 32 && news != nullptr; news = news->prev, i++) { - CalTime::YearMonthDay ymd = CalTime::ConvertDateToYMD(news->date); + for (const auto &news : GetNews()) { + CalTime::YearMonthDay ymd = CalTime::ConvertDateToYMD(news.date); buffer += seprintf(buffer, last, "(%i-%02i-%02i) StringID: %u, Type: %u, Ref1: %u, %u, Ref2: %u, %u\n", - ymd.year.base(), ymd.month + 1, ymd.day, news->string_id, news->type, - news->reftype1, news->ref1, news->reftype2, news->ref2); + ymd.year.base(), ymd.month + 1, ymd.day, news.string_id, news.type, + news.reftype1, news.ref1, news.reftype2, news.ref2); + if (++i > 32) break; } buffer += seprintf(buffer, last, "\n"); return buffer; diff --git a/src/date_gui.cpp b/src/date_gui.cpp index 55b5d919ba..bb458bc47b 100644 --- a/src/date_gui.cpp +++ b/src/date_gui.cpp @@ -16,6 +16,7 @@ #include "core/geometry_func.hpp" #include "settings_type.h" #include "dropdown_type.h" +#include "dropdown_func.h" #include "widgets/date_widget.h" @@ -81,14 +82,14 @@ struct SetDateWindow : Window { case WID_SD_DAY: for (uint i = 0; i < 31; i++) { - list.push_back(std::make_unique(STR_DAY_NUMBER_1ST + i, i + 1, false)); + list.push_back(MakeDropDownListStringItem(STR_DAY_NUMBER_1ST + i, i + 1)); } selected = this->date.day; break; case WID_SD_MONTH: for (uint i = 0; i < 12; i++) { - list.push_back(std::make_unique(STR_MONTH_JAN + i, i, false)); + list.push_back(MakeDropDownListStringItem(STR_MONTH_JAN + i, i)); } selected = this->date.month; break; @@ -96,7 +97,7 @@ struct SetDateWindow : Window { case WID_SD_YEAR: for (EconTime::Year i = this->min_year; i <= this->max_year; i++) { SetDParam(0, i); - list.push_back(std::make_unique(STR_JUST_INT, i.base(), false)); + list.push_back(MakeDropDownListStringItem(STR_JUST_INT, i.base())); } selected = this->date.year.base(); break; @@ -206,7 +207,7 @@ struct SetMinutesWindow : SetDateWindow case WID_SD_DAY: for (uint i = 0; i < 60; i++) { SetDParam(0, i); - list.emplace_back(new DropDownListStringItem(STR_JUST_INT, i, false)); + list.push_back(MakeDropDownListStringItem(STR_JUST_INT, i, false)); } selected = this->minutes.ClockMinute(); break; @@ -214,7 +215,7 @@ struct SetMinutesWindow : SetDateWindow case WID_SD_MONTH: for (uint i = 0; i < 24; i++) { SetDParam(0, i); - list.emplace_back(new DropDownListStringItem(STR_JUST_INT, i, false)); + list.push_back(MakeDropDownListStringItem(STR_JUST_INT, i, false)); } selected = this->minutes.ClockHour(); diff --git a/src/dropdown.cpp b/src/dropdown.cpp index fd299a25f2..5861bd7283 100644 --- a/src/dropdown.cpp +++ b/src/dropdown.cpp @@ -8,18 +8,49 @@ /** @file dropdown.cpp Implementation of the dropdown widget. */ #include "stdafx.h" -#include "window_gui.h" +#include "dropdown_type.h" +#include "dropdown_func.h" +#include "dropdown_common_type.h" #include "string_func.h" #include "strings_func.h" +#include "window_gui.h" #include "window_func.h" #include "guitimer_func.h" #include "zoom_func.h" -#include "dropdown_type.h" #include "widgets/dropdown_widget.h" #include "safeguards.h" +std::unique_ptr MakeDropDownListDividerItem() +{ + return std::make_unique(-1); +} + +std::unique_ptr MakeDropDownListStringItem(StringID str, int value, bool masked, bool shaded) +{ + return std::make_unique(str, value, masked, shaded); +} + +std::unique_ptr MakeDropDownListStringItem(const std::string &str, int value, bool masked, bool shaded) +{ + return std::make_unique(str, value, masked, shaded); +} + +std::unique_ptr MakeDropDownListIconItem(SpriteID sprite, PaletteID palette, StringID str, int value, bool masked, bool shaded) +{ + return std::make_unique(sprite, palette, str, value, masked, shaded); +} + +std::unique_ptr MakeDropDownListIconItem(const Dimension &dim, SpriteID sprite, PaletteID palette, StringID str, int value, bool masked, bool shaded) +{ + return std::make_unique(dim, sprite, palette, str, value, masked, shaded); +} + +std::unique_ptr MakeDropDownListCheckedItem(bool checked, StringID str, int value, bool masked, bool shaded) +{ + return std::make_unique(checked, str, value, masked, shaded); +} static constexpr NWidgetPart _nested_dropdown_menu_widgets[] = { NWidget(NWID_HORIZONTAL), @@ -451,7 +482,7 @@ void ShowDropDownMenu(Window *w, const StringID *strings, int selected, WidgetID for (uint i = 0; strings[i] != INVALID_STRING_ID; i++) { if (i >= 32 || !HasBit(hidden_mask, i)) { - list.push_back(std::make_unique(strings[i], i, i < 32 && HasBit(disabled_mask, i))); + list.push_back(MakeDropDownListStringItem(strings[i], i, i < 32 && HasBit(disabled_mask, i))); } } diff --git a/src/dropdown_common_type.h b/src/dropdown_common_type.h new file mode 100644 index 0000000000..da0513e92f --- /dev/null +++ b/src/dropdown_common_type.h @@ -0,0 +1,180 @@ +/* + * This file is part of OpenTTD. + * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. + * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . + */ + +/** @file dropdown_common_type.h Common drop down list components. */ + +#ifndef DROPDOWN_COMMON_TYPE_H +#define DROPDOWN_COMMON_TYPE_H + +#include "gfx_func.h" +#include "gfx_type.h" +#include "palette_func.h" +#include "string_func.h" +#include "strings_func.h" +#include "table/strings.h" +#include "window_gui.h" + +/** + * Drop down divider component. + * @tparam TBase Base component. + * @tparam TFs Font size -- used to determine height. + */ +template +class DropDownDivider : public TBase { +public: + 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()); } + + void Draw(const Rect &full, const Rect &, bool, Colours bg_colour) const override + { + uint8_t c1 = GetColourGradient(bg_colour, SHADE_DARK); + uint8_t c2 = GetColourGradient(bg_colour, SHADE_LIGHTEST); + + 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); + } +}; + +/** + * 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); + } + + void SetColourFlags(TextColour colour_flags) { this->colour_flags = colour_flags; } + + /** + * 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; + } +}; + +/** + * Drop down icon component. + * @tparam TBase Base component. + * @tparam TEnd Position icon at end if true, or start if false. + */ +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: + 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; + } + + 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(); } + + 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); + } +}; + +/** + * 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>; + +#endif /* DROPDOWN_COMMON_TYPE_H */ diff --git a/src/dropdown_func.h b/src/dropdown_func.h index ea0001d9f3..362219834f 100644 --- a/src/dropdown_func.h +++ b/src/dropdown_func.h @@ -21,4 +21,12 @@ int HideDropDownMenu(Window *pw); void GetParentWindowInfo(Window *w, WindowClass &parent_wc, WindowNumber &parent_wn); +/* Helper functions for commonly used drop down list items. */ +std::unique_ptr MakeDropDownListDividerItem(); +std::unique_ptr MakeDropDownListStringItem(StringID str, int value, bool masked = false, bool shaded = false); +std::unique_ptr MakeDropDownListStringItem(const std::string &str, int value, bool masked = false, bool shaded = false); +std::unique_ptr MakeDropDownListIconItem(SpriteID sprite, PaletteID palette, StringID str, int value, bool masked = false, bool shaded = false); +std::unique_ptr MakeDropDownListIconItem(const Dimension &dim, SpriteID sprite, PaletteID palette, StringID str, int value, bool masked = false, bool shaded = false); +std::unique_ptr MakeDropDownListCheckedItem(bool checked, StringID str, int value, bool masked = false, bool shaded = false); + #endif /* DROPDOWN_FUNC_H */ diff --git a/src/dropdown_type.h b/src/dropdown_type.h index 970ff0ce55..9262423f51 100644 --- a/src/dropdown_type.h +++ b/src/dropdown_type.h @@ -13,9 +13,6 @@ #include "window_type.h" #include "gfx_func.h" #include "gfx_type.h" -#include "string_func.h" -#include "strings_func.h" -#include "table/strings.h" #include "window_gui.h" #include @@ -58,159 +55,6 @@ public: } }; -/** - * Drop down divider component. - * @tparam TBase Base component. - * @tparam TFs Font size -- used to determine height. - */ -template -class DropDownDivider : public TBase { -public: - 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()); } - - void Draw(const Rect &full, const Rect &, bool, Colours bg_colour) const override - { - uint8_t c1 = GetColourGradient(bg_colour, SHADE_DARK); - uint8_t c2 = GetColourGradient(bg_colour, SHADE_LIGHTEST); - - 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); - } -}; - -/** - * 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); - } - - void SetColourFlags(TextColour colour_flags) { this->colour_flags = colour_flags; } - - /** - * 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; - } -}; - -/** - * Drop down icon component. - * @tparam TBase Base component. - * @tparam TEnd Position icon at end if true, or start if false. - */ -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: - 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; - } - - 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(); } - - 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); - } -}; - -/** - * 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); - } -}; - /** * Drop down unselectable component. * @tparam TBase Base component. @@ -224,12 +68,6 @@ public: bool Selectable() const override { return false; } }; -/* 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. */ diff --git a/src/fontcache/freetypefontcache.cpp b/src/fontcache/freetypefontcache.cpp index 3b1833eb0c..ca5eb70a16 100644 --- a/src/fontcache/freetypefontcache.cpp +++ b/src/fontcache/freetypefontcache.cpp @@ -275,8 +275,8 @@ const Sprite *FreeTypeFontCache::InternalGetGlyph(GlyphID key, bool aa) /* FreeType has rendered the glyph, now we allocate a sprite and copy the image into it */ SpriteLoader::SpriteCollection spritecollection; - SpriteLoader::Sprite &sprite = spritecollection[ZOOM_LVL_NORMAL]; - sprite.AllocateData(ZOOM_LVL_NORMAL, static_cast(width) * height); + SpriteLoader::Sprite &sprite = spritecollection[ZOOM_LVL_MIN]; + sprite.AllocateData(ZOOM_LVL_MIN, static_cast(width) * height); sprite.type = SpriteType::Font; sprite.colours = (aa ? SCC_PAL | SCC_ALPHA : SCC_PAL); sprite.width = width; diff --git a/src/fontcache/spritefontcache.cpp b/src/fontcache/spritefontcache.cpp index 344dea76af..2baf223d2d 100644 --- a/src/fontcache/spritefontcache.cpp +++ b/src/fontcache/spritefontcache.cpp @@ -23,12 +23,12 @@ static const int ASCII_LETTERSTART = 32; ///< First printable ASCII letter. /** * Scale traditional pixel dimensions to font zoom level, for drawing sprite fonts. - * @param value Pixel amount at #ZOOM_LVL_BASE (traditional "normal" interface size). + * @param value Pixel amount at #ZOOM_BASE (traditional "normal" interface size). * @return Pixel amount at _font_zoom (current interface size). */ static int ScaleFontTrad(int value) { - return UnScaleByZoom(value * ZOOM_LVL_BASE, _font_zoom); + return UnScaleByZoom(value * ZOOM_BASE, _font_zoom); } /** diff --git a/src/game/game_gui.cpp b/src/game/game_gui.cpp index 2e59aa4f23..4fa6b18279 100644 --- a/src/game/game_gui.cpp +++ b/src/game/game_gui.cpp @@ -14,6 +14,7 @@ #include "../window_func.h" #include "../network/network.h" #include "../network/network_content.h" +#include "../dropdown_type.h" #include "../dropdown_func.h" #include "../settings_type.h" @@ -324,7 +325,7 @@ struct GSConfigWindow : public Window { DropDownList list; for (int i = config_item.min_value; i <= config_item.max_value; i++) { - list.push_back(std::make_unique(config_item.labels.find(i)->second, i, false)); + list.push_back(MakeDropDownListStringItem(config_item.labels.find(i)->second, i)); } ShowDropDownListAt(this, std::move(list), old_val, WID_GSC_SETTING_DROPDOWN, wi_rect, COLOUR_ORANGE); diff --git a/src/genworld_gui.cpp b/src/genworld_gui.cpp index 60614df281..bcd125dfe0 100644 --- a/src/genworld_gui.cpp +++ b/src/genworld_gui.cpp @@ -20,6 +20,7 @@ #include "string_func.h" #include "gui.h" #include "dropdown_type.h" +#include "dropdown_common_type.h" #include "dropdown_func.h" #include "querystring_gui.h" #include "town.h" @@ -392,7 +393,7 @@ static DropDownList BuildMapsizeDropDown(int other_dimension) for (uint i = MIN_MAP_SIZE_BITS; i <= MAX_MAP_SIZE_BITS; i++) { SetDParam(0, 1LL << i); - list.push_back(std::make_unique((i + other_dimension > MAX_MAP_TILES_BITS) ? STR_RED_INT : STR_JUST_INT, i, false)); + list.push_back(MakeDropDownListStringItem((i + other_dimension > MAX_MAP_TILES_BITS) ? STR_RED_INT : STR_JUST_INT, i, false)); } return list; @@ -405,20 +406,20 @@ static DropDownList BuildTownNameDropDown() /* Add and sort newgrf townnames generators */ const auto &grf_names = GetGRFTownNameList(); for (uint i = 0; i < grf_names.size(); i++) { - list.push_back(std::make_unique(grf_names[i], BUILTIN_TOWNNAME_GENERATOR_COUNT + i, false)); + list.push_back(MakeDropDownListStringItem(grf_names[i], BUILTIN_TOWNNAME_GENERATOR_COUNT + i)); } std::sort(list.begin(), list.end(), DropDownListStringItem::NatSortFunc); 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(MakeDropDownListDividerItem()); // separator line newgrf_size++; } /* Add and sort original townnames generators */ for (uint i = 0; i < BUILTIN_TOWNNAME_GENERATOR_COUNT; i++) { - list.push_back(std::make_unique(STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH + i, i, false)); + list.push_back(MakeDropDownListStringItem(STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH + i, i)); } std::sort(list.begin() + newgrf_size, list.end(), DropDownListStringItem::NatSortFunc); diff --git a/src/gfx.cpp b/src/gfx.cpp index 94f8c6aea5..333071c2f9 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -79,11 +79,11 @@ struct GfxBlitterCtx { }; static void GfxMainBlitterViewport(const GfxBlitterCtx &ctx, const Sprite *sprite, int x, int y, BlitterMode mode, const SubSprite *sub = nullptr, SpriteID sprite_id = SPR_CURSOR_MOUSE); -static void GfxMainBlitter(const GfxBlitterCtx &ctx, const Sprite *sprite, int x, int y, BlitterMode mode, const SubSprite *sub = nullptr, SpriteID sprite_id = SPR_CURSOR_MOUSE, ZoomLevel zoom = ZOOM_LVL_NORMAL); +static void GfxMainBlitter(const GfxBlitterCtx &ctx, const Sprite *sprite, int x, int y, BlitterMode mode, const SubSprite *sub = nullptr, SpriteID sprite_id = SPR_CURSOR_MOUSE, ZoomLevel zoom = ZOOM_LVL_MIN); static ReusableBuffer _cursor_backup; -ZoomLevel _gui_zoom = ZOOM_LVL_OUT_4X; ///< GUI Zoom level +ZoomLevel _gui_zoom = ZOOM_LVL_NORMAL; ///< GUI Zoom level ZoomLevel _font_zoom = _gui_zoom; ///< Sprite font Zoom level (not clamped) int _gui_scale = MIN_INTERFACE_SCALE; ///< GUI scale, 100 is 100%. int _gui_scale_cfg; ///< GUI scale in config. @@ -113,7 +113,7 @@ uint32_t _gfx_debug_flags; /** * Applies a certain FillRectMode-operation to a rectangle [left, right] x [top, bottom] on the screen. * - * @pre dpi->zoom == ZOOM_LVL_NORMAL, right >= left, bottom >= top + * @pre dpi->zoom == ZOOM_LVL_MIN, right >= left, bottom >= top * @param blitter Blitter to use * @param dpi Draw pixel info * @param left Minimum X (inclusive) @@ -132,7 +132,7 @@ void GfxFillRect(Blitter *blitter, const DrawPixelInfo *dpi, int left, int top, const int otop = top; const int oleft = left; - if (dpi->zoom != ZOOM_LVL_NORMAL) return; + if (dpi->zoom != ZOOM_LVL_MIN) return; if (left > right || top > bottom) return; if (right < dpi->left || left >= dpi->left + dpi->width) return; if (bottom < dpi->top || top >= dpi->top + dpi->height) return; @@ -219,7 +219,7 @@ static std::vector MakePolygonSegments(const std::vector &sh * The odd-even winding rule is used, i.e. self-intersecting polygons will have holes in them. * Left and top edges are inclusive, right and bottom edges are exclusive. * @note For rectangles the GfxFillRect function will be faster. - * @pre dpi->zoom == ZOOM_LVL_NORMAL + * @pre dpi->zoom == ZOOM_LVL_MIN * @param shape List of points on the polygon. * @param colour An 8 bit palette index (FILLRECT_OPAQUE and FILLRECT_CHECKER) or a recolour spritenumber (FILLRECT_RECOLOUR). * @param mode @@ -232,7 +232,7 @@ void GfxFillPolygon(const std::vector &shape, int colour, FillRectMode mo { Blitter *blitter = BlitterFactory::GetCurrentBlitter(); const DrawPixelInfo *dpi = _cur_dpi; - if (dpi->zoom != ZOOM_LVL_NORMAL) return; + if (dpi->zoom != ZOOM_LVL_MIN) return; std::vector segments = MakePolygonSegments(shape, Point{ dpi->left, dpi->top }); @@ -1289,7 +1289,7 @@ std::unique_ptr DrawSpriteToRgbaBuffer(SpriteID spriteId, ZoomLevel static void GfxMainBlitterViewport(const GfxBlitterCtx &ctx, const Sprite *sprite, int x, int y, BlitterMode mode, const SubSprite *sub, SpriteID sprite_id) { - GfxBlitter(ctx, sprite, x, y, mode, sub, sprite_id, ctx.dpi->zoom); + GfxBlitter(ctx, sprite, x, y, mode, sub, sprite_id, ctx.dpi->zoom); } static void GfxMainBlitter(const GfxBlitterCtx &ctx, const Sprite *sprite, int x, int y, BlitterMode mode, const SubSprite *sub, SpriteID sprite_id, ZoomLevel zoom) @@ -1632,7 +1632,7 @@ void DrawDirtyBlocks() _cur_dpi->height = _screen.height; _cur_dpi->pitch = _screen.pitch; _cur_dpi->dst_ptr = _screen.dst_ptr; - _cur_dpi->zoom = ZOOM_LVL_NORMAL; + _cur_dpi->zoom = ZOOM_LVL_MIN; _dirty_viewport = vp; _dirty_viewport_disp_flags = w->viewport_widget->disp_flags; @@ -1932,7 +1932,7 @@ bool FillDrawPixelInfo(DrawPixelInfo *n, int left, int top, int width, int heigh Blitter *blitter = BlitterFactory::GetCurrentBlitter(); const DrawPixelInfo *o = _cur_dpi; - n->zoom = ZOOM_LVL_NORMAL; + n->zoom = ZOOM_LVL_MIN; assert(width > 0); assert(height > 0); @@ -2158,7 +2158,7 @@ void UpdateGUIZoom() _gui_scale = Clamp(_gui_scale_cfg, MIN_INTERFACE_SCALE, MAX_INTERFACE_SCALE); } - int8_t new_zoom = ScaleGUITrad(1) <= 1 ? ZOOM_LVL_OUT_4X : ScaleGUITrad(1) >= 4 ? ZOOM_LVL_MIN : ZOOM_LVL_OUT_2X; + int8_t new_zoom = ScaleGUITrad(1) <= 1 ? ZOOM_LVL_NORMAL : ScaleGUITrad(1) >= 4 ? ZOOM_LVL_IN_4X : ZOOM_LVL_IN_2X; /* Font glyphs should not be clamped to min/max zoom. */ _font_zoom = static_cast(new_zoom); /* Ensure the gui_zoom is clamped between min/max. */ diff --git a/src/gfxinit.cpp b/src/gfxinit.cpp index ee38c98a58..6a795e770d 100644 --- a/src/gfxinit.cpp +++ b/src/gfxinit.cpp @@ -22,6 +22,7 @@ #include "clear_func.h" #include "tree_map.h" #include "scope.h" +#include "debug_fmt.h" #include "table/tree_land.h" #include "blitter/32bpp_base.hpp" @@ -54,25 +55,25 @@ static SpriteFile &LoadGrfFile(const std::string &filename, uint load_index, boo SpriteFile &file = OpenCachedSpriteFile(filename, BASESET_DIR, needs_palette_remap); - DEBUG(sprite, 2, "Reading grf-file '%s'", filename.c_str()); + Debug(sprite, 2, "Reading grf-file '{}'", filename); uint8_t container_ver = file.GetContainerVersion(); - if (container_ver == 0) usererror("Base grf '%s' is corrupt", filename.c_str()); + if (container_ver == 0) UserError("Base grf '{}' is corrupt", filename); ReadGRFSpriteOffsets(file); if (container_ver >= 2) { /* Read compression. */ uint8_t compression = file.ReadByte(); - if (compression != 0) usererror("Unsupported compression format"); + if (compression != 0) UserError("Unsupported compression format"); } while (LoadNextSprite(load_index, file, sprite_id)) { load_index++; sprite_id++; if (load_index >= MAX_SPRITES) { - usererror("Too many sprites. Recompile with higher MAX_SPRITES value or remove some custom GRF files."); + UserError("Too many sprites. Recompile with higher MAX_SPRITES value or remove some custom GRF files."); } } - DEBUG(sprite, 2, "Currently %i sprites are loaded", load_index); + Debug(sprite, 2, "Currently {} sprites are loaded", load_index); return file; } @@ -91,15 +92,15 @@ static void LoadGrfFileIndexed(const std::string &filename, const SpriteID *inde SpriteFile &file = OpenCachedSpriteFile(filename, BASESET_DIR, needs_palette_remap); - DEBUG(sprite, 2, "Reading indexed grf-file '%s'", filename.c_str()); + Debug(sprite, 2, "Reading indexed grf-file '{}'", filename); uint8_t container_ver = file.GetContainerVersion(); - if (container_ver == 0) usererror("Base grf '%s' is corrupt", filename.c_str()); + if (container_ver == 0) UserError("Base grf '{}' is corrupt", filename); ReadGRFSpriteOffsets(file); if (container_ver >= 2) { /* Read compression. */ uint8_t compression = file.ReadByte(); - if (compression != 0) usererror("Unsupported compression format"); + if (compression != 0) UserError("Unsupported compression format"); } while ((start = *index_tbl++) != END) { @@ -124,40 +125,31 @@ void CheckExternalFiles() const GraphicsSet *used_set = BaseGraphics::GetUsedSet(); - DEBUG(grf, 1, "Using the %s base graphics set", used_set->name.c_str()); - - static const size_t ERROR_MESSAGE_LENGTH = 256; - static const size_t MISSING_FILE_MESSAGE_LENGTH = 128; - - /* Allocate for a message for each missing file and for one error - * message per set. - */ - char error_msg[MISSING_FILE_MESSAGE_LENGTH * (GraphicsSet::NUM_FILES + SoundsSet::NUM_FILES) + 2 * ERROR_MESSAGE_LENGTH]; - error_msg[0] = '\0'; - char *add_pos = error_msg; - const char *last = lastof(error_msg); + Debug(grf, 1, "Using the {} base graphics set", used_set->name); + std::string error_msg; + auto output_iterator = std::back_inserter(error_msg); if (used_set->GetNumInvalid() != 0) { /* Not all files were loaded successfully, see which ones */ - add_pos += seprintf(add_pos, last, "Trying to load graphics set '%s', but it is incomplete. The game will probably not run correctly until you properly install this set or select another one. See section 4.1 of README.md.\n\nThe following files are corrupted or missing:\n", used_set->name.c_str()); + fmt::format_to(output_iterator, "Trying to load graphics set '{}', but it is incomplete. The game will probably not run correctly until you properly install this set or select another one. See section 4.1 of README.md.\n\nThe following files are corrupted or missing:\n", used_set->name); for (uint i = 0; i < GraphicsSet::NUM_FILES; i++) { MD5File::ChecksumResult res = GraphicsSet::CheckMD5(&used_set->files[i], BASESET_DIR); - if (res != MD5File::CR_MATCH) add_pos += seprintf(add_pos, last, "\t%s is %s (%s)\n", used_set->files[i].filename.c_str(), res == MD5File::CR_MISMATCH ? "corrupt" : "missing", used_set->files[i].missing_warning.c_str()); + if (res != MD5File::CR_MATCH) fmt::format_to(output_iterator, "\t{} is {} ({})\n", used_set->files[i].filename, res == MD5File::CR_MISMATCH ? "corrupt" : "missing", used_set->files[i].missing_warning); } - add_pos += seprintf(add_pos, last, "\n"); + fmt::format_to(output_iterator, "\n"); } const SoundsSet *sounds_set = BaseSounds::GetUsedSet(); if (sounds_set->GetNumInvalid() != 0) { - add_pos += seprintf(add_pos, last, "Trying to load sound set '%s', but it is incomplete. The game will probably not run correctly until you properly install this set or select another one. See section 4.1 of README.md.\n\nThe following files are corrupted or missing:\n", sounds_set->name.c_str()); + fmt::format_to(output_iterator, "Trying to load sound set '{}', but it is incomplete. The game will probably not run correctly until you properly install this set or select another one. See section 4.1 of README.md.\n\nThe following files are corrupted or missing:\n", sounds_set->name); static_assert(SoundsSet::NUM_FILES == 1); /* No need to loop each file, as long as there is only a single * sound file. */ - add_pos += seprintf(add_pos, last, "\t%s is %s (%s)\n", sounds_set->files->filename.c_str(), SoundsSet::CheckMD5(sounds_set->files, BASESET_DIR) == MD5File::CR_MISMATCH ? "corrupt" : "missing", sounds_set->files->missing_warning.c_str()); + fmt::format_to(output_iterator, "\t{} is {} ({})\n", sounds_set->files->filename, SoundsSet::CheckMD5(sounds_set->files, BASESET_DIR) == MD5File::CR_MISMATCH ? "corrupt" : "missing", sounds_set->files->missing_warning); } - if (add_pos != error_msg) ShowInfoF("%s", error_msg); + if (!error_msg.empty()) ShowInfoI(error_msg); } void InitGRFGlobalVars() @@ -271,9 +263,9 @@ static void LoadSpriteTables() LoadNewGRF(SPR_NEWGRFS_BASE, 2); uint total_extra_graphics = SPR_NEWGRFS_BASE - SPR_OPENTTD_BASE; - DEBUG(sprite, 4, "Checking sprites from fallback grf"); + Debug(sprite, 4, "Checking sprites from fallback grf"); _missing_extra_graphics = GetSpriteCountForFile(master_filename, SPR_OPENTTD_BASE, SPR_NEWGRFS_BASE); - DEBUG(sprite, 1, "%u extra sprites, %u from baseset, %u from fallback", total_extra_graphics, total_extra_graphics - _missing_extra_graphics, _missing_extra_graphics); + Debug(sprite, 1, "{} extra sprites, {} from baseset, {} from fallback", total_extra_graphics, total_extra_graphics - _missing_extra_graphics, _missing_extra_graphics); /* The original baseset extra graphics intentionally make use of the fallback graphics. * Let's say everything which provides less than 500 sprites misses the rest intentionally. */ @@ -286,19 +278,19 @@ static void LoadSpriteTables() } -static void RealChangeBlitter(const char *repl_blitter) +static void RealChangeBlitter(const std::string_view repl_blitter) { - const char *cur_blitter = BlitterFactory::GetCurrentBlitter()->GetName(); - if (strcmp(cur_blitter, repl_blitter) == 0) return; + const std::string_view cur_blitter = BlitterFactory::GetCurrentBlitter()->GetName(); + if (cur_blitter == repl_blitter) return; - DEBUG(driver, 1, "Switching blitter from '%s' to '%s'... ", cur_blitter, repl_blitter); + Debug(driver, 1, "Switching blitter from '{}' to '{}'... ", cur_blitter, repl_blitter); Blitter *new_blitter = BlitterFactory::SelectBlitter(repl_blitter); if (new_blitter == nullptr) NOT_REACHED(); - DEBUG(driver, 1, "Successfully switched to %s.", repl_blitter); + Debug(driver, 1, "Successfully switched to {}.", repl_blitter); if (!VideoDriver::GetInstance()->AfterBlitterChange()) { /* Failed to switch blitter, let's hope we can return to the old one. */ - if (BlitterFactory::SelectBlitter(cur_blitter) == nullptr || !VideoDriver::GetInstance()->AfterBlitterChange()) usererror("Failed to reinitialize video driver. Specify a fixed blitter in the config"); + if (BlitterFactory::SelectBlitter(cur_blitter) == nullptr || !VideoDriver::GetInstance()->AfterBlitterChange()) UserError("Failed to reinitialize video driver. Specify a fixed blitter in the config"); } /* Clear caches that might have sprites for another blitter. */ @@ -337,7 +329,7 @@ static bool SwitchNewGRFBlitter() /* Search the best blitter. */ static const struct { - const char *name; + const std::string_view name; uint animation; ///< 0: no support, 1: do support, 2: both uint min_base_depth, max_base_depth, min_grf_depth, max_grf_depth; } replacement_blitters[] = { @@ -357,23 +349,22 @@ static bool SwitchNewGRFBlitter() }; const bool animation_wanted = HasBit(_display_opt, DO_FULL_ANIMATION); - const char *cur_blitter = BlitterFactory::GetCurrentBlitter()->GetName(); + const std::string_view cur_blitter = BlitterFactory::GetCurrentBlitter()->GetName(); - for (uint i = 0; i < lengthof(replacement_blitters); i++) { - if (animation_wanted && (replacement_blitters[i].animation == 0)) continue; - if (!animation_wanted && (replacement_blitters[i].animation == 1)) continue; + for (const auto &replacement_blitter : replacement_blitters) { + if (animation_wanted && (replacement_blitter.animation == 0)) continue; + if (!animation_wanted && (replacement_blitter.animation == 1)) continue; - if (!IsInsideMM(depth_wanted_by_base, replacement_blitters[i].min_base_depth, replacement_blitters[i].max_base_depth + 1)) continue; - if (!IsInsideMM(depth_wanted_by_grf, replacement_blitters[i].min_grf_depth, replacement_blitters[i].max_grf_depth + 1)) continue; - const char *repl_blitter = replacement_blitters[i].name; + if (!IsInsideMM(depth_wanted_by_base, replacement_blitter.min_base_depth, replacement_blitter.max_base_depth + 1)) continue; + if (!IsInsideMM(depth_wanted_by_grf, replacement_blitter.min_grf_depth, replacement_blitter.max_grf_depth + 1)) continue; - if (strcmp(repl_blitter, cur_blitter) == 0) { + if (replacement_blitter.name == cur_blitter) { return false; } - if (BlitterFactory::GetBlitterFactory(repl_blitter) == nullptr) continue; + if (BlitterFactory::GetBlitterFactory(replacement_blitter.name) == nullptr) continue; /* Inform the video driver we want to switch blitter as soon as possible. */ - VideoDriver::GetInstance()->QueueOnMainThread(std::bind(&RealChangeBlitter, repl_blitter)); + VideoDriver::GetInstance()->QueueOnMainThread(std::bind(&RealChangeBlitter, replacement_blitter.name)); break; } @@ -518,7 +509,7 @@ void GfxDetermineMainColours() /** Initialise and load all the sprites. */ void GfxLoadSprites() { - DEBUG(sprite, 2, "Loading sprite set %d", _settings_game.game_creation.landscape); + Debug(sprite, 2, "Loading sprite set {}", _settings_game.game_creation.landscape); _grf_bug_too_many_strings = false; @@ -533,7 +524,7 @@ void GfxLoadSprites() UpdateRouteStepSpriteSize(); UpdateCursorSize(); - DEBUG(sprite, 2, "Completed loading sprite set %d", _settings_game.game_creation.landscape); + Debug(sprite, 2, "Completed loading sprite set {}", _settings_game.game_creation.landscape); } GraphicsSet::GraphicsSet() diff --git a/src/graph_gui.cpp b/src/graph_gui.cpp index 4c8ea2301b..8df843d72d 100644 --- a/src/graph_gui.cpp +++ b/src/graph_gui.cpp @@ -119,7 +119,7 @@ static std::unique_ptr MakeNWidgetCompanyLines() { auto vert = std::make_unique(NC_EQUALSIZE); vert->SetPadding(2, 2, 2, 2); - uint sprite_height = GetSpriteSize(SPR_COMPANY_ICON, nullptr, ZOOM_LVL_OUT_4X).height; + uint sprite_height = GetSpriteSize(SPR_COMPANY_ICON, nullptr, ZOOM_LVL_NORMAL).height; for (WidgetID widnum = WID_GL_FIRST_COMPANY; widnum <= WID_GL_LAST_COMPANY; widnum++) { auto panel = std::make_unique(WWT_PANEL, COLOUR_BROWN, widnum); diff --git a/src/industry_gui.cpp b/src/industry_gui.cpp index 8150347067..68d0cd0c4d 100644 --- a/src/industry_gui.cpp +++ b/src/industry_gui.cpp @@ -29,6 +29,7 @@ #include "string_func.h" #include "sortlist_type.h" #include "dropdown_func.h" +#include "dropdown_common_type.h" #include "company_base.h" #include "core/geometry_func.hpp" #include "core/random_func.hpp" @@ -1793,14 +1794,14 @@ public: DropDownList list; /* Add item for disabling filtering. */ - list.push_back(std::make_unique(this->GetCargoFilterLabel(CargoFilterCriteria::CF_ANY), CargoFilterCriteria::CF_ANY, false)); + list.push_back(MakeDropDownListStringItem(this->GetCargoFilterLabel(CargoFilterCriteria::CF_ANY), CargoFilterCriteria::CF_ANY)); /* Add item for industries not producing anything, e.g. power plants */ - list.push_back(std::make_unique(this->GetCargoFilterLabel(CargoFilterCriteria::CF_NONE), CargoFilterCriteria::CF_NONE, false)); + list.push_back(MakeDropDownListStringItem(this->GetCargoFilterLabel(CargoFilterCriteria::CF_NONE), CargoFilterCriteria::CF_NONE)); /* Add cargos */ Dimension d = GetLargestCargoIconSize(); for (const CargoSpec *cs : _sorted_standard_cargo_specs) { - list.push_back(std::make_unique(d, cs->GetCargoIcon(), PAL_NONE, cs->name, cs->Index(), false)); + list.push_back(MakeDropDownListIconItem(d, cs->GetCargoIcon(), PAL_NONE, cs->name, cs->Index())); } return list; @@ -3151,7 +3152,7 @@ struct IndustryCargoesWindow : public Window { } else { DropDownList list; auto add_item = [&](StringID string, int result) { - std::unique_ptr item(new DropDownListStringItem(string, result, false)); + std::unique_ptr item = std::make_unique(string, result, false); item->SetColourFlags(TC_FORCED); list.emplace_back(std::move(item)); }; @@ -3167,7 +3168,7 @@ struct IndustryCargoesWindow : public Window { DropDownList lst; Dimension d = GetLargestCargoIconSize(); for (const CargoSpec *cs : _sorted_standard_cargo_specs) { - lst.push_back(std::make_unique(d, cs->GetCargoIcon(), PAL_NONE, cs->name, cs->Index(), false)); + lst.push_back(MakeDropDownListIconItem(d, cs->GetCargoIcon(), PAL_NONE, cs->name, cs->Index())); } if (!lst.empty()) { int selected = (this->ind_cargo >= NUM_INDUSTRYTYPES) ? (int)(this->ind_cargo - NUM_INDUSTRYTYPES) : -1; @@ -3181,7 +3182,7 @@ struct IndustryCargoesWindow : public Window { for (IndustryType ind : _sorted_industry_types) { const IndustrySpec *indsp = GetIndustrySpec(ind); if (!indsp->enabled) continue; - lst.push_back(std::make_unique(indsp->name, ind, false)); + lst.push_back(MakeDropDownListStringItem(indsp->name, ind)); } if (!lst.empty()) { int selected = (this->ind_cargo < NUM_INDUSTRYTYPES) ? (int)this->ind_cargo : -1; diff --git a/src/landscape.h b/src/landscape.h index 0236d2ecab..61f1d532c4 100644 --- a/src/landscape.h +++ b/src/landscape.h @@ -110,8 +110,8 @@ inline std::tuple GetFoundationPixelSlope(TileIndex tile) inline Point RemapCoords(int x, int y, int z) { Point pt; - pt.x = (y - x) * 2 * ZOOM_LVL_BASE; - pt.y = (y + x - z) * ZOOM_LVL_BASE; + pt.x = (y - x) * 2 * ZOOM_BASE; + pt.y = (y + x - z) * ZOOM_BASE; return pt; } @@ -139,7 +139,7 @@ inline Point RemapCoords2(int x, int y) */ inline Point InverseRemapCoords(int x, int y) { - Point pt = {(y * 2 - x) >> (2 + ZOOM_LVL_SHIFT), (y * 2 + x) >> (2 + ZOOM_LVL_SHIFT)}; + Point pt = {(y * 2 - x) >> (2 + ZOOM_BASE_SHIFT), (y * 2 + x) >> (2 + ZOOM_BASE_SHIFT)}; return pt; } diff --git a/src/lang/afrikaans.txt b/src/lang/afrikaans.txt index 1464775f3b..39c3d41dfa 100644 --- a/src/lang/afrikaans.txt +++ b/src/lang/afrikaans.txt @@ -4258,9 +4258,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Beraamde STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Stoor van speletjie is nog besig,{}wag asb tot dit klaar is! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Outostoor het misluk STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Kan nie skyf lees nie -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Speletjie Spaar Misluk{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Kan nie lêer uitvee nie -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Speletjie Laai Misluk{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Interne fout: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Gebreekte gespaarde spel - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Spaarspeletjie is gemaak met nuwer uitgawe diff --git a/src/lang/arabic_egypt.txt b/src/lang/arabic_egypt.txt index 8372a2ecfa..9a0bbec625 100644 --- a/src/lang/arabic_egypt.txt +++ b/src/lang/arabic_egypt.txt @@ -4058,9 +4058,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}الدخ STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}الحفظ مازال جاريا الآن{}الرجاء الأنتظار حتر ينتهي STR_ERROR_AUTOSAVE_FAILED :{WHITE}فشل الحفظ التلقائي STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}لا يمكن قرائة القرص -STR_ERROR_GAME_SAVE_FAILED :{WHITE}فشل حفظ اللعبة{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}لا يمكن حذف الملف -STR_ERROR_GAME_LOAD_FAILED :{WHITE}فشل فتح اللعبة{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :خطأ داخلي: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :لعبه محفوظه غير صالحه - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :اللعبة حفظت بنسخة أحدث diff --git a/src/lang/basque.txt b/src/lang/basque.txt index 1cf05d136b..bfbd18e830 100644 --- a/src/lang/basque.txt +++ b/src/lang/basque.txt @@ -4014,9 +4014,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Gutxi go STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Oraindik artxiboa gordetzen,{}mesedez itxaron amaitu arte! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Gordetze automatikoak huts egin du STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Ezin izan da driverra irakurri -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Jokoa gordetzeak huts egin du{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Ezin izan da artxiboa ezabatu -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Jokoa kargatzeak huts egin du{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Barne akatsa: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Gordetako jokoa hautsia dago - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Gordetako jokoa bertsio berriago batekin egin da diff --git a/src/lang/belarusian.txt b/src/lang/belarusian.txt index 70152eab27..7f2ed1e1b9 100644 --- a/src/lang/belarusian.txt +++ b/src/lang/belarusian.txt @@ -5250,9 +5250,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Мерк STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Ідзе захаваньне,{}калі ласка, дачакайцеся завяршэньня! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Памылка аўтазахаваньня STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Не атрымалася прачытаць дыск -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Немагчыма захаваць гульню{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Немагчыма выдаліць файл -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Немагчыма загрузіць гульню{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Унутраная памылка: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Файл пашкоджаны — {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Захаваньне зроблена ў больш новай вэрсіі diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index 609943fac6..e2a8bfcdd7 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -270,7 +270,7 @@ STR_UNITS_PERIODS :{NUM}{NBSP}per # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtro: STR_LIST_FILTER_OSKTITLE :{BLACK}Inserir uma ou mais palavras-chave para filtrar a lista -STR_LIST_FILTER_TOOLTIP :{BLACK}Digite uma ou mais palavras-chave para procurar na lista +STR_LIST_FILTER_TOOLTIP :{BLACK}Introduza uma ou mais palavras-chave para procurar na lista STR_TOOLTIP_GROUP_ORDER :{BLACK}Escolher a ordem de agrupamento STR_TOOLTIP_SORT_ORDER :{BLACK}Escolher a ordenação (descendente/ascendente) @@ -405,7 +405,7 @@ STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Construi STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}Construir infraestrutura rodoviária STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}Construir infraestrutura para bondes STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}Construir infraestrutura hidroviária -STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}Construir aeroportos +STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}Construir aeroporto STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}Abrir menu de paisagismo, menu de árvores ou colocar uma placa STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW :{BLACK}Abrir janela de som/música STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}Abrir última mensagem/notícia, histórico de mensagens ou apagar todas as mensagens @@ -418,7 +418,7 @@ STR_SCENEDIT_TOOLBAR_OPENTTD :{YELLOW}OpenTTD STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR :{YELLOW}Editor de Cenário STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD :{BLACK}Mover a data inicial 1 ano para trás STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD :{BLACK}Mover a data inicial 1 ano para frente -STR_SCENEDIT_TOOLBAR_TOOLTIP_SET_DATE :{BLACK}Clique para digitar o ano de início +STR_SCENEDIT_TOOLBAR_TOOLTIP_SET_DATE :{BLACK}Clique para alterar o ano de início STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}Abrir mapa, visualização extra, lista de placas, de localidades ou de indústrias STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}Abrir menu de paisagismo ou gerar um novo mundo STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Construir ou gerar localidades @@ -506,7 +506,7 @@ STR_ROAD_MENU_ROAD_CONSTRUCTION :Construção de STR_ROAD_MENU_TRAM_CONSTRUCTION :Construção de linha de bonde # Waterways construction menu -STR_WATERWAYS_MENU_WATERWAYS_CONSTRUCTION :Construção de hidrovias +STR_WATERWAYS_MENU_WATERWAYS_CONSTRUCTION :Construção de hidrovia # Aairport construction menu STR_AIRCRAFT_MENU_AIRPORT_CONSTRUCTION :Construção de aeroporto @@ -668,7 +668,7 @@ STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}Total: STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP_YEARS :{BLACK}Número de veículos que geraram lucro no último ano. Isso inclui veículos rodoviários, trens, embarcações e aeronaves STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP_PERIODS :{BLACK}Número de veículos que geraram lucro no último período. Isso inclui veículos rodoviários, trens, embarcações e aeronaves -STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}Número de estações atendidas recentemente. Estações de trem, paradas de ônibus, aeroportos, etc. são contados separadamente, mesmo que pertençam à mesma estação +STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}Número de estações atendidas recentemente. Estações de trem, paradas de ônibus, aeroportos, etc., são contados separadamente, mesmo que pertençam à mesma estação STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_YEARS :{BLACK}Lucro do veículo com o menor rendimento (apenas veículos com mais de dois anos são considerados) STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_PERIODS :{BLACK}Lucro do veículo com o menor rendimento (apenas veículos com mais de dois períodos são considerados) STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}Quantia de dinheiro obtida no trimestre com o menor lucro dos últimos 12 trimestres @@ -680,7 +680,7 @@ STR_PERFORMANCE_DETAIL_LOAN_TOOLTIP :{BLACK}O montan STR_PERFORMANCE_DETAIL_TOTAL_TOOLTIP :{BLACK}Total de pontos de pontos possíveis # Music window -STR_MUSIC_JAZZ_JUKEBOX_CAPTION :{WHITE}Jukebox de Jazz +STR_MUSIC_JAZZ_JUKEBOX_CAPTION :{WHITE}Jukebox de Música STR_MUSIC_PLAYLIST_ALL :{TINY_FONT}{BLACK}Todos STR_MUSIC_PLAYLIST_OLD_STYLE :{TINY_FONT}{BLACK}Antigo STR_MUSIC_PLAYLIST_NEW_STYLE :{TINY_FONT}{BLACK}Moderno @@ -1530,8 +1530,8 @@ STR_CONFIG_SETTING_ERRMSG_DURATION :Duração da me STR_CONFIG_SETTING_ERRMSG_DURATION_HELPTEXT :Tempo de exibição de mensagens de erro numa janela vermelha. Algumas mensagens de erro (crítico) não são fechadas automaticamente após este tempo e precisam ser fechadas manualmente STR_CONFIG_SETTING_HOVER_DELAY :Mostrar textos de ajuda: {STRING} -STR_CONFIG_SETTING_HOVER_DELAY_HELPTEXT :Tempo que o cursor deve ficar sobre algum elemento da interface para que os textos de ajuda sejam mostrados. Outro modo de exibir os textos de ajuda é fixar este valor em 0 e clicar com o botão direito do mouse -STR_CONFIG_SETTING_HOVER_DELAY_VALUE :Manter o cursor por {COMMA} milissegundo{P 0 "" s} +STR_CONFIG_SETTING_HOVER_DELAY_HELPTEXT :Tempo que o ponteiro do mouse deve ficar sobre algum elemento da interface para que os textos de ajuda sejam mostrados. Outro modo de exibir os textos de ajuda é fixar este valor em 0 e clicar com o botão direito do mouse +STR_CONFIG_SETTING_HOVER_DELAY_VALUE :Manter o ponteiro por {COMMA} milissegundo{P 0 "" s} ###setting-zero-is-special STR_CONFIG_SETTING_HOVER_DELAY_DISABLED :Botão direito @@ -1673,7 +1673,7 @@ STR_CONFIG_SETTING_SCROLLWHEEL_SCROLL :Mover o mapa STR_CONFIG_SETTING_SCROLLWHEEL_OFF :Desativado STR_CONFIG_SETTING_OSK_ACTIVATION :Teclado virtual: {STRING} -STR_CONFIG_SETTING_OSK_ACTIVATION_HELPTEXT :Escolher o método para mostrar o teclado virtual para inserir texto em caixas de diálogo usando o cursor. Isto é útil para dispositivos pequenos que não possuem teclados +STR_CONFIG_SETTING_OSK_ACTIVATION_HELPTEXT :Escolher o método para mostrar o teclado virtual para inserir texto em caixas de diálogo usando apenas o cursor. Isto é útil para dispositivos pequenos que não possuem teclados ###length 4 STR_CONFIG_SETTING_OSK_ACTIVATION_DISABLED :Desativado STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Clique duplo @@ -1736,7 +1736,7 @@ STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Mostrar chegada STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Mostrar os horários previstos de chegada e de partida nos quadros de horários STR_CONFIG_SETTING_QUICKGOTO :Criação rápida de ordens de veículos: {STRING} -STR_CONFIG_SETTING_QUICKGOTO_HELPTEXT :Pré-selecionar o cursor 'Ir Para' ao abrir a janela de ordens +STR_CONFIG_SETTING_QUICKGOTO_HELPTEXT :Pré-selecionar o 'cursor Ir para' ao abrir a janela de ordens STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE :Tipo de trilho padrão (ao iniciar novo/abrir jogo): {STRING} STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_HELPTEXT :Tipo de trilho a ser selecionado ao iniciar novo/abrir um jogo. 'Primeiro disponível' seleciona o tipo de trilho mais antigo. 'Último disponível' seleciona o tipo mais novo de trilho e 'Mais utilizado' seleciona o tipo que é mais usado atualmente @@ -1749,7 +1749,7 @@ STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION :Mostrar caminho STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION_HELPTEXT :Usar uma cor diferente nos trajetos reservados para auxiliar na solução de problemas com trens que se recusam a entrar em seções controlados por sinais de caminho STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS :Manter as ferramentas de construção ativas após o uso: {STRING} -STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS_HELPTEXT :Manter as ferramentas de construção de pontes, túneis, etc. abertas após o uso +STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS_HELPTEXT :Manter as ferramentas de construção de pontes, túneis, etc., abertas após o uso STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS :Remover automaticamente os sinais durante a construção de ferrovias: {STRING} STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS_HELPTEXT :Remover automaticamente os sinais durante a construção de ferrovias se os sinais estiverem no caminho. Isso pode, potencialmente, causar acidentes de trens @@ -2420,8 +2420,8 @@ STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Adiciona STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Iniciar servidor STR_NETWORK_SERVER_LIST_START_SERVER_TOOLTIP :{BLACK}Iniciar um servidor próprio -STR_NETWORK_SERVER_LIST_PLAYER_NAME_OSKTITLE :{BLACK}Digitar o seu nome -STR_NETWORK_SERVER_LIST_ENTER_SERVER_ADDRESS :{BLACK}Digitar o endereço de servidor ou código de convite +STR_NETWORK_SERVER_LIST_PLAYER_NAME_OSKTITLE :{BLACK}Introduza o seu nome +STR_NETWORK_SERVER_LIST_ENTER_SERVER_ADDRESS :{BLACK}Endereço do servidor ou código de convite # Start new multiplayer server STR_NETWORK_START_SERVER_CAPTION :{WHITE}Iniciar novo jogo multijogador @@ -2440,7 +2440,7 @@ STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} em STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Número máximo de empresas: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Limitar o servidor a um certo número de empresas -STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Coloque o nome para o jogo em rede +STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Introduza um nome para o jogo em rede # Network connecting window STR_NETWORK_CONNECTING_CAPTION :{WHITE}Conectando... @@ -2461,8 +2461,8 @@ STR_NETWORK_CONNECTING_SPECIAL_2 :{BLACK}Obtendo STR_NETWORK_CONNECTION_DISCONNECT :{BLACK}Desconectar -STR_NETWORK_NEED_GAME_PASSWORD_CAPTION :{WHITE}Servidor protegido. Digite a senha -STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION :{WHITE}Empresa protegida. Digite a senha +STR_NETWORK_NEED_GAME_PASSWORD_CAPTION :{WHITE}Servidor protegido. Introduza a senha +STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION :{WHITE}Empresa protegida. Introduza a senha # Network company list added strings STR_NETWORK_COMPANY_LIST_CLIENT_LIST :Jogadores conectados @@ -2560,7 +2560,7 @@ STR_NETWORK_CHAT_CLIENT :[Privado] {STRI STR_NETWORK_CHAT_TO_CLIENT :[Privado] Para {STRING}: {WHITE}{STRING} STR_NETWORK_CHAT_ALL :[Todos] {STRING}: {WHITE}{STRING} STR_NETWORK_CHAT_EXTERNAL :[{3:STRING}] {0:STRING}: {WHITE}{1:STRING} -STR_NETWORK_CHAT_OSKTITLE :{BLACK}Digitar a mensagem para conversar na rede +STR_NETWORK_CHAT_OSKTITLE :{BLACK}Introduza a mensagem para conversar na rede # Network messages STR_NETWORK_ERROR_NOTAVAILABLE :{WHITE}Não foram encontradas interfaces de rede ou o jogo foi compilado sem ENABLE_NETWORK @@ -2646,14 +2646,14 @@ STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}O servid STR_NETWORK_MESSAGE_KICKED :*** {STRING} foi expulso. Motivo: ({STRING}) STR_NETWORK_ERROR_COORDINATOR_REGISTRATION_FAILED :{WHITE}Falha ao registrar o servidor -STR_NETWORK_ERROR_COORDINATOR_REUSE_OF_INVITE_CODE :{WHITE}Outro servidor com o mesmo código de convite foi registrado. Mudando para o tipo de jogo "local". +STR_NETWORK_ERROR_COORDINATOR_REUSE_OF_INVITE_CODE :{WHITE}Outro servidor com o mesmo código de convite foi registrado. Mudando o jogo para o tipo "local". STR_NETWORK_ERROR_COORDINATOR_ISOLATED :{WHITE}O seu servidor não permite conexões remotas STR_NETWORK_ERROR_COORDINATOR_ISOLATED_DETAIL :{WHITE}Outros jogadores não poderão se conectar ao seu servidor # Content downloading window STR_CONTENT_TITLE :{WHITE}Download de conteúdo STR_CONTENT_TYPE_CAPTION :{BLACK}Tipo -STR_CONTENT_TYPE_CAPTION_TOOLTIP :{BLACK}Tipo do conteúdo +STR_CONTENT_TYPE_CAPTION_TOOLTIP :{BLACK}Tipo de conteúdo STR_CONTENT_NAME_CAPTION :{BLACK}Nome STR_CONTENT_NAME_CAPTION_TOOLTIP :{BLACK}Nome do conteúdo STR_CONTENT_MATRIX_TOOLTIP :{BLACK}Clique numa linha para ver os detalhes{}Clique na caixa de seleção para marcar e fazer o download @@ -2912,8 +2912,8 @@ STR_STATION_BUILD_CARGO_TRAM_ORIENTATION :{WHITE}Orienta STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Escolher a orientação da estação de bondes de carga # Waterways toolbar (last two for SE only) -STR_WATERWAYS_TOOLBAR_CAPTION :{WHITE}Construção de Hidrovias -STR_WATERWAYS_TOOLBAR_CAPTION_SE :{WHITE}Hidrovias +STR_WATERWAYS_TOOLBAR_CAPTION :{WHITE}Construção de Hidrovia +STR_WATERWAYS_TOOLBAR_CAPTION_SE :{WHITE}Hidrovia STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP :{BLACK}Construir canais. Pressione também Shift para só mostrar o custo estimado STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP :{BLACK}Construir eclusas. Pressione também Shift para só mostrar o custo estimado STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}Construir depósito de embarcações (para compra e manutenção de embarcações). Pressione também Shift para só mostrar o custo estimado @@ -2982,11 +2982,11 @@ STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Plantar STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Plantar Aleatoriamente STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Plantar árvores aleatoriamente no terreno STR_TREES_MODE_NORMAL_BUTTON :{BLACK}Normal -STR_TREES_MODE_NORMAL_TOOLTIP :{BLACK}Plantar árvores isoladas ao arrastar o cursor sobre o terreno +STR_TREES_MODE_NORMAL_TOOLTIP :{BLACK}Plantar árvores isoladas ao arrastar o ponteiro sobre o terreno STR_TREES_MODE_FOREST_SM_BUTTON :{BLACK}Bosque -STR_TREES_MODE_FOREST_SM_TOOLTIP :{BLACK}Plantar florestas pequenas ao arrastar o cursor sobre o terreno +STR_TREES_MODE_FOREST_SM_TOOLTIP :{BLACK}Plantar florestas pequenas ao arrastar o ponteiro sobre o terreno STR_TREES_MODE_FOREST_LG_BUTTON :{BLACK}Floresta -STR_TREES_MODE_FOREST_LG_TOOLTIP :{BLACK}Plantar florestas grandes ao arrastar o cursor sobre o terreno +STR_TREES_MODE_FOREST_LG_TOOLTIP :{BLACK}Plantar florestas grandes ao arrastar o ponteiro sobre o terreno # Land generation window (SE) STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}Geração de Terreno @@ -3014,8 +3014,8 @@ STR_FOUND_TOWN_EXPAND_ALL_TOWNS :{BLACK}Expandir STR_FOUND_TOWN_EXPAND_ALL_TOWNS_TOOLTIP :{BLACK}Fazer com que todas as localidades cresçam ligeiramente STR_FOUND_TOWN_NAME_TITLE :{YELLOW}Nome da localidade: -STR_FOUND_TOWN_NAME_EDITOR_TITLE :{BLACK}Digitar o nome da localidade -STR_FOUND_TOWN_NAME_EDITOR_HELP :{BLACK}Clique para digitar o nome da localidade +STR_FOUND_TOWN_NAME_EDITOR_TITLE :{BLACK}Introduza o nome da localidade +STR_FOUND_TOWN_NAME_EDITOR_HELP :{BLACK}Clique para editar o nome da localidade STR_FOUND_TOWN_NAME_RANDOM_BUTTON :{BLACK}Nome aleatório STR_FOUND_TOWN_NAME_RANDOM_TOOLTIP :{BLACK}Gerar novo nome aleatório @@ -3283,7 +3283,7 @@ STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Você q STR_SAVELOAD_DIRECTORY :{STRING} (Diretório) STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (Diretório raiz) -STR_SAVELOAD_OSKTITLE :{BLACK}Digitar um nome para o jogo que será gravado +STR_SAVELOAD_OSKTITLE :{BLACK}Introduza um nome para o jogo que será gravado # World generation STR_MAPGEN_WORLD_GENERATION_CAPTION :{WHITE}Geração de Mapas @@ -3459,7 +3459,7 @@ STR_NEWGRF_SETTINGS_INCOMPATIBLE :{RED}Incompatí # NewGRF save preset window STR_SAVE_PRESET_CAPTION :{WHITE}Salvar predefinição STR_SAVE_PRESET_LIST_TOOLTIP :{BLACK}Lista de predefinições disponíveis, selecione uma para copiar o nome e usar na gravação abaixo -STR_SAVE_PRESET_TITLE :{BLACK}Digitar um nome para a predefinição +STR_SAVE_PRESET_TITLE :{BLACK}Introduza um nome para a predefinição STR_SAVE_PRESET_EDITBOX_TOOLTIP :{BLACK}Nome que está selecionado para salvar a predefinição STR_SAVE_PRESET_CANCEL :{BLACK}Cancelar STR_SAVE_PRESET_CANCEL_TOOLTIP :{BLACK}Não alterar a predefinição @@ -3603,7 +3603,7 @@ STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}Centrali STR_EDIT_SIGN_NEXT_SIGN_TOOLTIP :{BLACK}Ir para a próxima placa STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Ir para a placa anterior -STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Digitar um nome para a placa +STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Introduza um nome para a placa # Town directory window STR_TOWN_DIRECTORY_CAPTION :{WHITE}Localidades @@ -3920,7 +3920,7 @@ STR_COMPANY_VIEW_PRESIDENT_NAME_TOOLTIP :{BLACK}Alterar STR_COMPANY_VIEW_COMPANY_NAME_QUERY_CAPTION :Nome da Empresa STR_COMPANY_VIEW_PRESIDENT_S_NAME_QUERY_CAPTION :Nome do Presidente -STR_COMPANY_VIEW_GIVE_MONEY_QUERY_CAPTION :Digitar a quantia de dinheiro que você quer dar +STR_COMPANY_VIEW_GIVE_MONEY_QUERY_CAPTION :Introduza o valor que você quer dar STR_BUY_COMPANY_MESSAGE :{WHITE}Estamos procurando uma empresa de transportes para comprar a nossa empresa.{}{}Você deseja comprar {COMPANY} por {CURRENCY_LONG}? STR_BUY_COMPANY_HOSTILE_TAKEOVER :{WHITE}Na aquisição hostil de {COMPANY} você irá adquirir todos os ativos, liquidar todos os empréstimos e pagar dois anos de lucros.{}{}O total estimado é de {CURRENCY_LONG}.{}{}Você deseja continuar esta aquisição hostil? @@ -4271,9 +4271,9 @@ STR_ENGINE_PREVIEW_SHIP :{G=f}embarcaç STR_ENGINE_PREVIEW_TEXT3 :{BLACK}{STRING}{}{5:STRING}{}{STRING} STR_ENGINE_PREVIEW_TEXT4 :{BLACK}{STRING}{}{STRING}{}{STRING}{}{STRING} STR_ENGINE_PREVIEW_COST_WEIGHT :Custo: {CURRENCY_LONG} Peso: {WEIGHT_SHORT} -STR_ENGINE_PREVIEW_COST_MAX_SPEED :Custo: {CURRENCY_LONG} Velocidade máx.: {VELOCITY} +STR_ENGINE_PREVIEW_COST_MAX_SPEED :Custo: {CURRENCY_LONG} Veloc. máx.: {VELOCITY} STR_ENGINE_PREVIEW_SPEED_POWER :Velocidade: {VELOCITY} Potência: {POWER} -STR_ENGINE_PREVIEW_SPEED_POWER_MAX_TE :Velocidade: {VELOCITY} Potência: {POWER} Tração máx.: {FORCE} +STR_ENGINE_PREVIEW_SPEED_POWER_MAX_TE :Veloc.: {VELOCITY} Potência: {POWER} Tração máx.: {FORCE} STR_ENGINE_PREVIEW_TYPE :Tipo de aeronave: {STRING} STR_ENGINE_PREVIEW_TYPE_RANGE :Tipo de aeronave: {STRING} Autonomia: {COMMA} quadrados STR_ENGINE_PREVIEW_RUNCOST_YEAR :Custo Operacional: {CURRENCY_LONG}/ano @@ -4431,9 +4431,9 @@ STR_VEHICLE_INFO_AGE_RUNNING_COST_PERIOD :{BLACK}Idade: { STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Velocidade máx.: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Velocidade máx.: {LTBLUE}{VELOCITY} {BLACK}Tipo de aeronave: {LTBLUE}{STRING} -STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Velocidade máx.: {LTBLUE}{VELOCITY} {BLACK}Tipo de aeronave: {LTBLUE}{STRING} {BLACK}Autonomia: {LTBLUE}{COMMA} quadrados -STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Peso: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potência: {LTBLUE}{POWER}{BLACK} Velocidade máx.: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Peso: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potência: {LTBLUE}{POWER}{BLACK} Velocidade máx.: {LTBLUE}{VELOCITY} {BLACK}Força de Tração máx.: {LTBLUE}{FORCE} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Veloc. máx.: {LTBLUE}{VELOCITY} {BLACK}Tipo de aeronave: {LTBLUE}{STRING} {BLACK}Autonomia: {LTBLUE}{COMMA} quadrados +STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Peso: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potência: {LTBLUE}{POWER}{BLACK} Veloc. máx.: {LTBLUE}{VELOCITY} +STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Peso: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potência: {LTBLUE}{POWER}{BLACK} Veloc. máx.: {LTBLUE}{VELOCITY} {BLACK}Tração máx.: {LTBLUE}{FORCE} STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Lucro neste ano: {LTBLUE}{CURRENCY_LONG} (último ano: {CURRENCY_LONG}) STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Lucro neste ano: {LTBLUE}{CURRENCY_LONG} (último ano: {CURRENCY_LONG}) {BLACK}Desempenho mín.: {LTBLUE}{POWER_TO_WEIGHT} @@ -4602,7 +4602,7 @@ STR_ORDER_CONDITIONAL_COMPARATOR_IS_TRUE :for verdadeiro STR_ORDER_CONDITIONAL_COMPARATOR_IS_FALSE :for falso STR_ORDER_CONDITIONAL_VALUE_TOOLTIP :{BLACK}O valor para comparar com os dados do veículo -STR_ORDER_CONDITIONAL_VALUE_CAPT :{WHITE}Digitar um valor para comparar +STR_ORDER_CONDITIONAL_VALUE_CAPT :{WHITE}Introduza um valor para comparar STR_ORDERS_SKIP_BUTTON :{BLACK}Saltar STR_ORDERS_SKIP_TOOLTIP :{BLACK}Saltar a ordem atual e iniciar a próxima. Ctrl+Clique para saltar até a ordem selecionada @@ -4900,9 +4900,9 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Receita STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Gravação ainda sendo executada,{}por favor aguarde até terminar! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Salvamento automático falhou STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Não é possível ler a unidade -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Salvar Jogo Falhou{}{STRING} +STR_ERROR_GAME_SAVE_FAILED :{WHITE}Falha ao salvar jogo... STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Não é possível apagar o arquivo -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Abrir Jogo Falhou{}{STRING} +STR_ERROR_GAME_LOAD_FAILED :{WHITE}Falha ao abrir jogo... STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Erro interno: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Jogo salvo está corrompido - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Jogo salvo foi feito com uma versão mais recente @@ -4954,7 +4954,7 @@ STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION :{WHITE}Terreno STR_ERROR_CAN_T_DO_THIS :{WHITE}Não é possível fazer isto... STR_ERROR_BUILDING_MUST_BE_DEMOLISHED :{WHITE}A construção deve ser demolida primeiro STR_ERROR_CAN_T_CLEAR_THIS_AREA :{WHITE}Não é possível limpar esta área... -STR_ERROR_SITE_UNSUITABLE :{WHITE}... local inadequado +STR_ERROR_SITE_UNSUITABLE :{WHITE}... local não adequado STR_ERROR_ALREADY_BUILT :{WHITE}... já construído STR_ERROR_OWNED_BY :{WHITE}... pertence a {STRING} STR_ERROR_AREA_IS_OWNED_BY_ANOTHER :{WHITE}... área pertence a outra empresa @@ -4972,9 +4972,9 @@ STR_ERROR_LOCAL_AUTHORITY_REFUSES_NOISE :{WHITE}A autori STR_ERROR_BRIBE_FAILED :{WHITE}A sua tentativa de suborno foi descoberta por um investigador regional # Levelling errors -STR_ERROR_CAN_T_RAISE_LAND_HERE :{WHITE}Não é possível elevar terreno aqui... -STR_ERROR_CAN_T_LOWER_LAND_HERE :{WHITE}Não é possível abaixar terreno aqui... -STR_ERROR_CAN_T_LEVEL_LAND_HERE :{WHITE}Não é possível nivelar o terreno aqui... +STR_ERROR_CAN_T_RAISE_LAND_HERE :{WHITE}Não é possível elevar este terreno... +STR_ERROR_CAN_T_LOWER_LAND_HERE :{WHITE}Não é possível abaixar este terreno... +STR_ERROR_CAN_T_LEVEL_LAND_HERE :{WHITE}Não é possível nivelar este terreno... STR_ERROR_EXCAVATION_WOULD_DAMAGE :{WHITE}A escavação danificaria o túnel STR_ERROR_ALREADY_AT_SEA_LEVEL :{WHITE}... já está ao nível do mar STR_ERROR_TOO_HIGH :{WHITE}... muito alto @@ -5082,7 +5082,7 @@ STR_ERROR_CAN_T_BUILD_TRAIN_WAYPOINT :{WHITE}Não é STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}Não é possível colocar boia aqui... STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}Não é possível alterar o nome do ponto de controle... -STR_ERROR_CAN_T_REMOVE_TRAIN_WAYPOINT :{WHITE}Não é possível remover ponto de controle de trem daqui... +STR_ERROR_CAN_T_REMOVE_TRAIN_WAYPOINT :{WHITE}Não é possível remover ponto de controle de trem aqui... STR_ERROR_MUST_REMOVE_RAILWAYPOINT_FIRST :{WHITE}Precisa remover o ponto de controle ferroviário primeiro STR_ERROR_BUOY_IN_THE_WAY :{WHITE}... boia no caminho STR_ERROR_BUOY_IS_IN_USE :{WHITE}... boia está em uso por outra empresa! @@ -5137,25 +5137,25 @@ STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Passagen STR_ERROR_CROSSING_DISALLOWED_ROAD :{WHITE}Passagens de nível não são permitidas para este tipo de estrada STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Não é possível construir sinais aqui... STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Não é possível construir ferrovia aqui... -STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Não é possível remover ferrovia daqui... -STR_ERROR_CAN_T_REMOVE_SIGNALS_FROM :{WHITE}Não é possível remover sinais daqui... -STR_ERROR_SIGNAL_CAN_T_CONVERT_SIGNALS_HERE :{WHITE}Não é possível converter os sinais daqui... +STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Não é possível remover ferrovia aqui... +STR_ERROR_CAN_T_REMOVE_SIGNALS_FROM :{WHITE}Não é possível remover sinais aqui... +STR_ERROR_SIGNAL_CAN_T_CONVERT_SIGNALS_HERE :{WHITE}Não é possível converter os sinais aqui... STR_ERROR_THERE_IS_NO_RAILROAD_TRACK :{WHITE}... não existe uma ferrovia STR_ERROR_THERE_ARE_NO_SIGNALS :{WHITE}... não existem sinais -STR_ERROR_CAN_T_CONVERT_RAIL :{WHITE}Não é possível converter o tipo de trilho daqui... +STR_ERROR_CAN_T_CONVERT_RAIL :{WHITE}Não é possível converter o tipo de trilho aqui... # Road construction errors STR_ERROR_MUST_REMOVE_ROAD_FIRST :{WHITE}Precisa remover a estrada primeiro STR_ERROR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION :{WHITE}... estradas de sentido único não podem ter junções STR_ERROR_CAN_T_BUILD_ROAD_HERE :{WHITE}Não é possível construir estrada aqui... STR_ERROR_CAN_T_BUILD_TRAMWAY_HERE :{WHITE}Não é possível construir linha de bonde aqui... -STR_ERROR_CAN_T_REMOVE_ROAD_FROM :{WHITE}Não é possível remover estrada daqui... -STR_ERROR_CAN_T_REMOVE_TRAMWAY_FROM :{WHITE}Não é possível remover linha de bonde daqui... +STR_ERROR_CAN_T_REMOVE_ROAD_FROM :{WHITE}Não é possível remover estrada aqui... +STR_ERROR_CAN_T_REMOVE_TRAMWAY_FROM :{WHITE}Não é possível remover linha de bonde aqui... STR_ERROR_THERE_IS_NO_ROAD :{WHITE}... não existe uma estrada STR_ERROR_THERE_IS_NO_TRAMWAY :{WHITE}... não existe uma linha de bonde -STR_ERROR_CAN_T_CONVERT_ROAD :{WHITE}Não é possível converter o tipo de estrada daqui... -STR_ERROR_CAN_T_CONVERT_TRAMWAY :{WHITE}Não é possível converter o tipo de linha de bonde daqui... +STR_ERROR_CAN_T_CONVERT_ROAD :{WHITE}Não é possível converter o tipo de estrada aqui... +STR_ERROR_CAN_T_CONVERT_TRAMWAY :{WHITE}Não é possível converter o tipo de linha de bonde aqui... STR_ERROR_NO_SUITABLE_ROAD :{WHITE}Estrada não adequada STR_ERROR_NO_SUITABLE_TRAMWAY :{WHITE}Linha de bonde não adequada diff --git a/src/lang/bulgarian.txt b/src/lang/bulgarian.txt index b87e821ef3..a4d9052309 100644 --- a/src/lang/bulgarian.txt +++ b/src/lang/bulgarian.txt @@ -4290,9 +4290,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Приб STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Записването продължава,{}моля изчакайте да сръши! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Автозапазването е неуспешно STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Не може да прочете диска -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Запазването на играта е неуспешно{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Изтриването на файла е неуспешно -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Отварянето на играта е неуспешно{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Вътрешна грешка: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Запазената игра е повредена - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Запазената игра е направена от по-нова версия diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index d7d186a725..519ab8d79d 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -4900,9 +4900,9 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Ingresso STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Es desa la partida.{}Espera que acabi l'operació! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Ha fallat el desat automàtic STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Impossible llegir la unitat de disc -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Error guardant la partida{}{STRING} +STR_ERROR_GAME_SAVE_FAILED :{WHITE}La partida no s'ha pogut desar... STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Impossible esborrar l'arxiu -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Error carregant la partida{}{STRING} +STR_ERROR_GAME_LOAD_FAILED :{WHITE}La partida no s'ha pogut carregar... STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Error Intern: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :L'arxiu de la partida està corromput - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :La partida està desada amb una versió més moderna diff --git a/src/lang/croatian.txt b/src/lang/croatian.txt index 724e182ef3..1b4c9abb6f 100644 --- a/src/lang/croatian.txt +++ b/src/lang/croatian.txt @@ -4444,9 +4444,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Predviđ STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Spremanje još u tijeku,{}molimo pričekajte dok se ne završi! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Automatsko spremanje neuspješno STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Ne mogu pročitati disk -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Spremanje igre nije uspjelo{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Ne mogu obrisati datoteku -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Učitavanje igre nije uspjelo{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Interna greška: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Pokvarena spremljena igra - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Spremljena igra je stvorena s novijom verzijom diff --git a/src/lang/czech.txt b/src/lang/czech.txt index 7789f85d76..bab4f69f32 100644 --- a/src/lang/czech.txt +++ b/src/lang/czech.txt @@ -4988,9 +4988,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Odhadova STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Ukládání ještě běží,{}počkej prosím, než doběhne! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Automatické uložení selhalo STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Nelze číst z jednotky -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Uložení hry selhalo{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Nelze smazat soubor -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Nelze otevřít hru{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Vnitřní chyba: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Poškozená hra - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Uložená hra je z novější verze diff --git a/src/lang/danish.txt b/src/lang/danish.txt index 144d89d38b..1e81cb03c9 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -4899,9 +4899,9 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Anslået STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Gemmer stadig,{}vent venligst! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Fejl under autogem STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Kan ikke læse drevet -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Fejl under gemning af spil{}{STRING} +STR_ERROR_GAME_SAVE_FAILED :{WHITE}Fejl under lagring af spil... STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Kan ikke slette fil -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Fejl under indlæsning af spil{}{STRING} +STR_ERROR_GAME_LOAD_FAILED :{WHITE}Fejl under indlæsning af spil... STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Intern fejl: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Ødelagt gemt spil - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Spillet er gemt med en nyere version diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index ec62376bf9..3c24b2d5d0 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -4899,9 +4899,9 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Verwacht STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Opslaan van spel is nog bezig,{}Wacht tot dit voltooid is! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Automatisch opslaan mislukt STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Kan niet lezen van schijf -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Opslaan spel mislukt{}{STRING} +STR_ERROR_GAME_SAVE_FAILED :{WHITE}Spel opslaan mislukt... STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Kan bestand niet verwijderen -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Laden spel mislukt{}{STRING} +STR_ERROR_GAME_LOAD_FAILED :{WHITE}Spel laden spel mislukt... STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Interne fout: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Opgeslagen spel beschadigd - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Opgeslagen spel hoort bij een nieuwere versie diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index 7a041367d2..03b42319c3 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -4899,9 +4899,9 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Estimate STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Saving still in progress,{}please wait until it is finished! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Autosave failed STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Unable to read drive -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Game Save Failed{}{STRING} +STR_ERROR_GAME_SAVE_FAILED :{WHITE}Game save failed... STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Unable to delete file -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Game Load Failed{}{STRING} +STR_ERROR_GAME_LOAD_FAILED :{WHITE}Game load failed... STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Internal error: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Broken savegame - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Savegame is made with newer version diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index 13fba7db15..c2d29d3cd4 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -4899,9 +4899,9 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Estimate STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Saving still in progress,{}please wait until it is finished! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Autosave failed STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Unable to read drive -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Game Save Failed{}{STRING} +STR_ERROR_GAME_SAVE_FAILED :{WHITE}Game save failed... STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Unable to delete file -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Game Load Failed{}{STRING} +STR_ERROR_GAME_LOAD_FAILED :{WHITE}Game load failed... STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Internal error: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Broken savegame - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Savegame is made with newer version diff --git a/src/lang/esperanto.txt b/src/lang/esperanto.txt index 56e91dbcf5..a9c026defe 100644 --- a/src/lang/esperanto.txt +++ b/src/lang/esperanto.txt @@ -4772,9 +4772,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Atendata STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Ankoraŭ konservas,{}bv atendi ĝis finiĝo! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Fiaskis aŭtomate konservi STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Ne eblas legi diskon -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Ludkonservado Fiaskis{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Ne eblas forviŝi dosieron -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Ludŝarĝado Fiaskis{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Interna eraro: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Rompa konservludo - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Tiu ĉi ludo estis konservita per pli nova versio diff --git a/src/lang/estonian.txt b/src/lang/estonian.txt index db972c203b..da14456b8d 100644 --- a/src/lang/estonian.txt +++ b/src/lang/estonian.txt @@ -4953,9 +4953,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Eeldatav STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Ikka salvestamisel,{}palun oota salvestuse lõpuni! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Välpsalvestus ebaõnnestus STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Ei suuda kettalt lugeda -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Mängu salvestamine nurjus{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Faili ei saa kustutada -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Mängu laadimine nurjus{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Süsteemi viga: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Katkine salvestus - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Salvestus on tehtud uuemas osas diff --git a/src/lang/faroese.txt b/src/lang/faroese.txt index 64d5129a6b..de440942b3 100644 --- a/src/lang/faroese.txt +++ b/src/lang/faroese.txt @@ -3673,9 +3673,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Inntøku STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Goyming er enn í gongd,{}vinarliga bíða til ta er liðugt! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Sjálvgoymsla eydnaðist ikki STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Ikki ført fyri at lesa drev -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Eydnaðist ikki at goyma spæl{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Ikki ført fyri at strika fílu -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Eydnaðist ikki at heinta spæl{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Innanhýsis villa: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Goymda spæli er broti - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Goymda spæli er frá nýggjari útgávu diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index b2c3a9f219..962a27f6e6 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -4899,9 +4899,9 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Arvioitu STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Tallentaminen käynnissä,{}odota, kunnes se päättyy! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Automaattitallennus epäonnistui. STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Asemaa ei voi lukea. -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Tallennus epäonnistui.{}{STRING} +STR_ERROR_GAME_SAVE_FAILED :{WHITE}Pelin tallennus epäonnistui… STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Tiedostoa ei voi poistaa. -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Lataus epäonnistui.{}{STRING} +STR_ERROR_GAME_LOAD_FAILED :{WHITE}Pelin lataus epäonnistui… STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Sisäinen virhe: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Viallinen tallennus – {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Tallennus on tehty uudemmalla versiolla diff --git a/src/lang/french.txt b/src/lang/french.txt index 88351d273f..bf07d3f45a 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -4900,9 +4900,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Revenu e STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Sauvegarde en cours...{}Veuillez attendre la fin du processus{NBSP}! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Échec de l'enregistrement automatique STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Impossible d'accéder au disque -STR_ERROR_GAME_SAVE_FAILED :{WHITE}La sauvegarde a échoué{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Impossible de supprimer le fichier -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Le chargement a échoué{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Erreur interne{NBSP}: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Sauvegarde corrompue − {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Sauvegarde modifiée avec une version plus récente diff --git a/src/lang/frisian.txt b/src/lang/frisian.txt index fd4860a2ac..b0c7608282 100644 --- a/src/lang/frisian.txt +++ b/src/lang/frisian.txt @@ -3861,9 +3861,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Dit gjit STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Spul noch an it bewarjen,{}graach nog efkes geduld! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Automatysk opslaan net slagge STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Koe net fan 'e skiif lêze -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Opslaan Mislearre{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Kin bestân net fuortsmite -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Laden Mislearre{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Interne flater: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Stikkene savegame - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Spul is makke mei in neiere fersje diff --git a/src/lang/gaelic.txt b/src/lang/gaelic.txt index c164597285..59b87fb62d 100644 --- a/src/lang/gaelic.txt +++ b/src/lang/gaelic.txt @@ -4401,9 +4401,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Tuairmse STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Ga shàbhaladh fhathast,{}fuirich greis gus am bi e deiseil! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Dh’fhàillig leis an fhèin-shàbhaladh STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Cha ghabh an draibh leughadh -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Dh’fhàillig le sàbhaladh a’ gheama{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Cha ghabh am faidhle sguabadh às -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Dh’fhàillig le luchdadh a’ gheama{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Mearachd taobh a-staigh: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Tha an geama air shàbhaladh briste - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Chaidh an sàbhaladh seo a dhèanamh le tionndadh as ùire dhen gheama diff --git a/src/lang/galician.txt b/src/lang/galician.txt index dfd284472d..86dd8f30c6 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -4898,9 +4898,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Ingreso STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Gravación en progreso,{}por favor agarda ata que remate! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Autogravado fallido STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}No se pode lee-la unidade -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Gravación da partida fallida{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Non se pode borra-lo arquivo -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Carga da partida fallida{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Erro interno: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Partida gravada corrupta - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :A partida gravouse cunha versión máis nova do xogo diff --git a/src/lang/german.txt b/src/lang/german.txt index db7508884e..73a9b4d2b0 100644 --- a/src/lang/german.txt +++ b/src/lang/german.txt @@ -4450,10 +4450,10 @@ STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Kapazit STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Transfer-Einnahmen: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_DETAILS_SERVICING_INTERVAL_DAYS :{BLACK}Wartungsintervall: {LTBLUE}{COMMA}{NBSP}Tag{P "" e} {BLACK} {STRING} -STR_VEHICLE_DETAILS_SERVICING_INTERVAL_MINUTES :{BLACK}Wartungsintervall: {LTBLUE}{COMMA}{NBSP}Minute{P "" n}{BLACK} {STRING} +STR_VEHICLE_DETAILS_SERVICING_INTERVAL_MINUTES :{BLACK}Wartungsintervall: {LTBLUE}{COMMA}{NBSP}Minuten{BLACK} {STRING} STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}Wartungsintervall: {LTBLUE}{COMMA}%{BLACK} {STRING} STR_VEHICLE_DETAILS_LAST_SERVICE_DATE :Zuletzt gewartet: {LTBLUE}{DATE_LONG} -STR_VEHICLE_DETAILS_LAST_SERVICE_MINUTES_AGO :Zuletzt gewartet: vor {LTBLUE}{NUM} Minuten +STR_VEHICLE_DETAILS_LAST_SERVICE_MINUTES_AGO :Zuletzt gewartet: vor {LTBLUE}{NUM} Minute{P "" n} STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}Erhöhe Serviceintervall um 10 Tage. Strg+Klick um das Serviceintervall um 5 Tage zu erhöhen STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}Erhöhe Serviceintervall um 5 Minuten. Strg+Klick um das Serviceintervall um 1 Minute zu erhöhen STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}Erhöhe Serviceintervall um 10 Prozent. Strg+Klick um das Serviceintervall um 5 Prozent zu erhöhen @@ -4644,7 +4644,7 @@ STR_ORDER_REFIT_ORDER :(auf {STRING} u STR_ORDER_REFIT_STOP_ORDER :(auf {STRING} umrüsten und stoppen) STR_ORDER_STOP_ORDER :(Stopp) -STR_ORDER_WAIT_TO_UNBUNCH :(warte auf Entpulkung) +STR_ORDER_WAIT_TO_UNBUNCH :(Warte auf Entpulkung) STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING} STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(Station unbenutzbar){POP_COLOUR} {STRING} {STATION} {STRING} @@ -4900,9 +4900,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Geschät STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Speichern läuft,{}bitte warten, bis es beendet ist! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Autosicherung fehlgeschlagen STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Laufwerk nicht betriebsbereit -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Spielspeicherung fehlgeschlagen{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Datei kann nicht gelöscht werden -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Laden des Spieles fehlgeschlagen{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Interner Fehler: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Spielstandsdatei defekt – {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Spielstand wurde mit einer neueren Spielversion erstellt diff --git a/src/lang/greek.txt b/src/lang/greek.txt index e03ed82e41..556f5ee773 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -344,7 +344,7 @@ STR_TOOLTIP_CLOSE_WINDOW :{BLACK}Κλεί STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS :{BLACK}Τίτλος παραθύρου - σύρετε το για να το μετακινήσετε STR_TOOLTIP_SHADE :{BLACK}Σκίαση παραθύρου - Εμφάνιση μόνο της μπάρας τιτλου STR_TOOLTIP_DEBUG :{BLACK}Εμφάνιση πληροφοριών αποσφαλμάτωσης για NewGRF -STR_TOOLTIP_DEFSIZE :{BLACK}Κλιμακώνει το παράθυρο στο προκαθορισμένο μέγεθος. Με Ctrl+Click αποθηκεύεται το τρέχον μέγεθος ως προκαθορισμένο +STR_TOOLTIP_DEFSIZE :{BLACK}Κλιμακώνει το παράθυρο στο προκαθορισμένο μέγεθος. Με Ctrl+Κλικ αποθηκεύεται το τρέχον μέγεθος ως προκαθορισμένο STR_TOOLTIP_STICKY :{BLACK}Σημειώστε αυτό το παραθύρο ωστέ να μην κλείνει από το πλήκτρο «Κλείσιμο Όλων των Παραθύρων». Πατήστε Ctrl+Κλικ για να αποθηκεύσετε την κατάσταση απο επιλογή STR_TOOLTIP_RESIZE :{BLACK}Κάντε κλίκ και σύρετε για να αλλάξετε το μέγεθος του παραθύρου STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW :{BLACK}Εναλλαγή μεγάλου/μικρού παραθύρου @@ -972,7 +972,7 @@ STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_OIL :{BIG_FONT}{BLAC STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_FARM :{BIG_FONT}{BLACK}Βελτιωμένες μέθοδοι καλλιέργειας στην {INDUSTRY} αναμένονται να διπλασιάσουν την παραγωγή! STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_SMOOTH :{BIG_FONT}{BLACK} Η παραγωγή {STRING.geniki} στ{G o η ο} {INDUSTRY} αυξήθηκε κατά {COMMA}%! STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL :{BIG_FONT}{BLACK}Η παραγωγή στ{G o η ο} {INDUSTRY} μειώθηκε κατά 50% -STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_FARM :{BIG_FONT}{BLACK}Μόλυνση από έντομα προκαλεί καταστροφή στη {INDUSTRY}!{}Η παραγωγή μειώθηκε κατά 50% +STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_FARM :{BIG_FONT}{BLACK}Προσβολή από έντομα προκαλεί καταστροφή στη {INDUSTRY}!{}Η παραγωγή μειώθηκε κατά 50% STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_SMOOTH :{BIG_FONT}{BLACK} Η παραγωγή {STRING.geniki} στ{G o η ο} {INDUSTRY} μειώθηκε κατά {COMMA}%! ###length VEHICLE_TYPES @@ -1460,13 +1460,13 @@ STR_CONFIG_SETTING_INFLATION :Πληθωρι STR_CONFIG_SETTING_INFLATION_HELPTEXT :Ενεργοποίηση του πληθωρισμού στην οικονομία, όπου τα κόστη αυξάνονται ελάχιστα ταχύτερα από τις πληρωμές STR_CONFIG_SETTING_MAX_BRIDGE_LENGTH :Μέγιστο μήκος γέφυρας: {STRING} -STR_CONFIG_SETTING_MAX_BRIDGE_LENGTH_HELPTEXT :Μέγιστο μήκος για κτίσιμο γεφυρών +STR_CONFIG_SETTING_MAX_BRIDGE_LENGTH_HELPTEXT :Μέγιστο μήκος για κατασκευή γεφυρών STR_CONFIG_SETTING_MAX_BRIDGE_HEIGHT :Μέγιστο ύψος γέφυρας: {STRING} -STR_CONFIG_SETTING_MAX_BRIDGE_HEIGHT_HELPTEXT :Μέγιστο ύψος για το χτίσιμο γεφυρών +STR_CONFIG_SETTING_MAX_BRIDGE_HEIGHT_HELPTEXT :Μέγιστο ύψος για την κατασκευή γεφυρών STR_CONFIG_SETTING_MAX_TUNNEL_LENGTH :Μέγιστο μήκος σήραγγας: {STRING} -STR_CONFIG_SETTING_MAX_TUNNEL_LENGTH_HELPTEXT :Μέγιστο μήκος για κτίσιμο συράγγων +STR_CONFIG_SETTING_MAX_TUNNEL_LENGTH_HELPTEXT :Μέγιστο μήκος για κατασκευή σηράγγων STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD :Χειροκίνητη μέθοδος κατασκευής βιομηχανιών πρώτων υλών: {STRING} STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_HELPTEXT :Μέθοδος χρηματοδότησης πρωτογενούς βιομηχανίας. «Καμία» σημαίνει ότι δεν γίνεται να χρηματοδοτηθεί καμία βιομηχανία, «Αναζήτηση» σημαίνει ότι η χρηματοδότηση είναι εφικτή, αλλά η κατασκευή πραγματοποιείται σε τυχαίο σημείο του χάρτη και είναι πιθανό να αποτύχει, «Όπως οι άλλες βιομηχανίες» σημαίνει πως οι πρωτογενείς βιομηχανίες είναι εφικτό να κατασκευαστούν από εταιρείες όπως οι δευτερογενείς βιομηχανίες σε οποιαδήποτε θέση θέλουν @@ -1476,7 +1476,7 @@ STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_NORMAL :Όπως οι STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_PROSPECTING :Διερεύνηση προοπτικών STR_CONFIG_SETTING_INDUSTRY_PLATFORM :Επίπεδη περιοχή γύρω από βιομηχανίες: {STRING} -STR_CONFIG_SETTING_INDUSTRY_PLATFORM_HELPTEXT :Επίπεδος χώρος γύρω από μια βιομηχανία. Αυτό εξασφαλίζει ότι θα παραμείνει διαθέσιμος κενός χώρος γύρω από μια βιομηχανία για να κτισθούν γραμμές, κλπ +STR_CONFIG_SETTING_INDUSTRY_PLATFORM_HELPTEXT :Επίπεδος χώρος γύρω από μια βιομηχανία. Αυτό εξασφαλίζει ότι θα παραμείνει διαθέσιμος κενός χώρος γύρω από μια βιομηχανία για να κατασκευαστούν γραμμές, κλπ STR_CONFIG_SETTING_MULTIPINDTOWN :Επιτρέπονται πολλαπλές όμοιες βιομηχανίες ανά πόλη: {STRING} STR_CONFIG_SETTING_MULTIPINDTOWN_HELPTEXT :Συνήθως, μια πόλη δεν επιθυμεί περισσότερες από μία βιομηχανία κάθε είδους. Αυτή η ρύθμιση επιτρέπει περισσότερες βιομηχανίες του ίδιου είδους στην ίδια πόλη. @@ -2018,7 +2018,7 @@ STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} τετ STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :Όταν σύρετε, διατηρείται σταθερή απόσταση μεταξύ των σημάτων: {STRING} STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Επιλέξτε τη συμπεριφορά της τοποθέτησης σημάτων όταν πατάτε Ctrl και σύρετε. Όταν είναι απενεργοποιημένο, τα σήματα τοποθετούνται γύρω από σήραγγες και γέφυρες για να αποφεύγονται μεγάλα τμήματα χωρίς σήματα. Όταν είναι ενεργοποιημένο, τα σήματα τοποθετούνται κάθε n τετραγωνίδια, κάνοντας ευκολότερη την ευθυγράμμιση των σημάτων σε παράλληλες γραμμές -STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Αυτόματο κτίσιμο σηματοφόρων πριν από το: {STRING} +STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Αυτόματη κατασκευή σηματοφόρων πριν από το: {STRING} STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Ορίζεται το έτος κατά το οποίο θα χρησιμοποιούνται τα ηλεκτρικά σήματα στις σιδηροτροχιές. Πριν από αυτό, θα χρησιμοποιούνται μηχανικά σήματα (που έχουν ακριβώς την ίδια λειτουργία, αλλά έχουν διαφορετική μορφή) STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Περιήγηση στους τύπους σηματοδότησης: {STRING} @@ -2042,9 +2042,9 @@ STR_CONFIG_SETTING_TOWN_LAYOUT_2X2_GRID :πλέγμα 2x STR_CONFIG_SETTING_TOWN_LAYOUT_3X3_GRID :πλέγμα 3x3 STR_CONFIG_SETTING_TOWN_LAYOUT_RANDOM :Τυχαίο -STR_CONFIG_SETTING_ALLOW_TOWN_ROADS :Οι πόλεις επιτρέπεται να χτίσουν δρόμους: {STRING} +STR_CONFIG_SETTING_ALLOW_TOWN_ROADS :Οι πόλεις επιτρέπεται να κατασκευάζουν δρόμους: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Επιτρέπεται στις πόλεις να κατασκευάζουν δρόμους για ανάπτυξη. Απενεργοποιήστε για να αποτρέπονται οι τοπικές αρχές από την αυτόνομη κατασκευή δρόμων -STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Οι πόλεις επιτρέπουν το κτίσιμο ισόπεδων διασταυρώσεων: {STRING} +STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Οι πόλεις επιτρέπουν την κατασκευή ισόπεδων διασταυρώσεων: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Ενεργοποιώντας αυτήν τη ρύθμιση επιτρέπει στις πόλεις να κατασκευάζουν επίπεδες διαβάσεις STR_CONFIG_SETTING_NOISE_LEVEL :Περιορισμός τοποθέτησης αεροδρομίων ανάλογα με το επίπεδο θορύβου: {STRING} @@ -2755,7 +2755,7 @@ STR_CONTENT_SELECT_UPDATES_CAPTION_TOOLTIP :{BLACK}Μαρκ STR_CONTENT_UNSELECT_ALL_CAPTION :{BLACK}Αποεπιλογή όλων STR_CONTENT_UNSELECT_ALL_CAPTION_TOOLTIP :{BLACK}Σημείωση όλων των περιεχομένων να μην κατέβουν STR_CONTENT_SEARCH_EXTERNAL :{BLACK}Αναζήτηση εξωτερικών ιστοσελίδων -STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}Ψάξτε για περιεχόμενο που δεν είναι διαθέσιμο μέσω την υπηρεσία λήψης περιεχομένου του OpenTTD σε ιστοσελίδες που δεν είναι συνδεδεμένες με το OpenTTD +STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}Αναζήτηση για περιεχόμενο που δεν είναι διαθέσιμο μέσω την υπηρεσία λήψης περιεχομένου του OpenTTD σε ιστοσελίδες που δεν σχετίζονται με το OpenTTD STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}Φεύγετε από το OpenTTD! STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}Οι όροι και προϋποθέσεις για τη λήψη περιεχομένου από εξωτερικές ιστοσελίδες διαφέρουν.{}Θα πρέπει να αναφερθείτε στις εξωτερικές ιστοσελίδες για οδηγίες περί της εγκατάστασης του περιεχομένου στο OpenTTD.{}Θέλετε να συνεχίσετε; STR_CONTENT_FILTER_TITLE :{BLACK}Ετικέτα/όνομα φίλτρου: @@ -2773,7 +2773,7 @@ STR_CONTENT_DETAIL_SUBTITLE_AUTOSELECTED :{SILVER}Αυτ STR_CONTENT_DETAIL_SUBTITLE_ALREADY_HERE :{SILVER}Το έχετε ήδη αυτό STR_CONTENT_DETAIL_SUBTITLE_DOES_NOT_EXIST :{SILVER}Αυτό το περιεχόμενο είναι άγνωστο και δεν γίνεται να κατέβει από το OpenTTD -STR_CONTENT_DETAIL_UPDATE :{SILVER}Αυτό είναι αντικατάσταση ενός υπάρχοντος {STRING} +STR_CONTENT_DETAIL_UPDATE :{SILVER}Αυτό αντικαθιστά ένα υπάρχον {STRING} STR_CONTENT_DETAIL_NAME :{SILVER}Όνομα: {WHITE}{STRING} STR_CONTENT_DETAIL_VERSION :{SILVER}Έκδοση: {WHITE}{STRING} STR_CONTENT_DETAIL_DESCRIPTION :{SILVER}Περιγραφή: {WHITE}{STRING} @@ -2830,7 +2830,7 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Εναλ STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Εναλλαγή διαφάνειας για γέφυρες. Ctrl+Κλικ για να την κλειδώσετε STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Εναλλαγή διαφάνειας για κτίρια όπως φάρους και κεραίες. Ctrl+Κλικ για να την κλειδώσετε STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Εναλλαγή διαφάνειας για τις συνδέσεις. Ctrl+Κλικ για να την κλειδώσετε -STR_TRANSPARENT_TEXT_TOOLTIP :{BLACK}Εναλλαγή διαφάνειας για φόρτωση και κείμενο κόστους/εσόδων. Ctrl+Click για να την κλειδώσετε +STR_TRANSPARENT_TEXT_TOOLTIP :{BLACK}Εναλλαγή διαφάνειας για φόρτωση και κείμενο κόστους/εσόδων. Ctrl+Κλικ για να την κλειδώσετε STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Επιλέξτε τα αντικείμενα που θα είναι αόρατα αντί για διάφανα # Linkgraph legend window @@ -2864,10 +2864,10 @@ STR_STATION_BUILD_INFRASTRUCTURE_COST_PERIOD :{BLACK}Κόστ # Join station window STR_JOIN_STATION_CAPTION :{WHITE}Συνένωση σταθμού -STR_JOIN_STATION_CREATE_SPLITTED_STATION :{YELLOW}Χτίστε ένα ξεχωριστό σταθμό +STR_JOIN_STATION_CREATE_SPLITTED_STATION :{YELLOW}Κατασκευάστε ένα ξεχωριστό σταθμό STR_JOIN_WAYPOINT_CAPTION :{WHITE}Συνένωση σημείου καθοδήγησης -STR_JOIN_WAYPOINT_CREATE_SPLITTED_WAYPOINT :{YELLOW}Κτίσιμο ενός ξεχωριστού σημείου καθοδήγησης +STR_JOIN_WAYPOINT_CREATE_SPLITTED_WAYPOINT :{YELLOW}κατασκευή ενός ξεχωριστού σημείου καθοδήγησης # Generic toolbar STR_TOOLBAR_DISABLED_NO_VEHICLE_AVAILABLE :{BLACK}Απενεργοποιημένο διότι δεν υπάρχουν διαθέσιμα οχήματα για αυτή την υποδομή @@ -2914,7 +2914,7 @@ STR_STATION_BUILD_DRAG_DROP :{BLACK}Σύρε STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}Φτιάξε ένα σταθμό χρησιμοποιώντας σύρσιμο και ελευθέρωση STR_STATION_BUILD_STATION_CLASS_TOOLTIP :{BLACK}Επιλογή τύπου σταθμών για εμφάνιση -STR_STATION_BUILD_STATION_TYPE_TOOLTIP :{BLACK}Επιλέξτε τον τύπο του σταθμού προς κτίσιμο +STR_STATION_BUILD_STATION_TYPE_TOOLTIP :{BLACK}Επιλέξτε τον τύπο του σταθμού προς κατασκευή STR_STATION_CLASS_DFLT :Προεπιλεγμένος STR_STATION_CLASS_DFLT_STATION :Προεπιλεγμένος σταθμός @@ -2928,16 +2928,16 @@ STR_BUILD_SIGNAL_TOGGLE_ADVANCED_SIGNAL_TOOLTIP :{BLACK}Εναλ STR_BUILD_SIGNAL_SEMAPHORE_NORM_TOOLTIP :{BLACK}Σηματοδότες Τμήματος (σηματοφόρος){}Αυτός είναι ο πιο βασικός τύπος σηματοδότη, επιτρέποντας μόνο ένα τρένο να βρίσκεται σε κάθε τμήμα κάθε φορά STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TOOLTIP :{BLACK}Σηματοδότης-Εισόδου (σηματοφόρος){}Πράσινο όσο υπάρχει ένας ή περισσότεροι πράσινοι σηματοδότες-εξόδου στο επόμενο τμήμα γράμμης. Διαφορετικά δείχνει κόκκινο STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP :{BLACK}Σηματοδότης-Εξόδου (σηματοφόρος){}Συμπεριφέρεται με τον ίδιο τρόπο οπως οι σηματοδότες τμήματος αλλά είναι απαραίτητο να τεθεί το σωστό χρώμα στους προ-σηματοδότες είσοδου και συνδυαστικούς -STR_BUILD_SIGNAL_SEMAPHORE_COMBO_TOOLTIP :{BLACK}Συνδυαστικός Σηματοδότης (σηματοφόρος){}Ο συνδυαστικός σηματοδότης απλά λειτουργεί ταυτόχρονα ως σηματοδότης εισόδου και εξόδου. Αυτό επιτρέπει το κτίσιμο μεγάλυτερων «δέντρων» με προ-σηματοδότες +STR_BUILD_SIGNAL_SEMAPHORE_COMBO_TOOLTIP :{BLACK}Συνδυαστικός Σηματοδότης (σηματοφόρος){}Ο συνδυαστικός σηματοδότης απλά λειτουργεί ταυτόχρονα ως σηματοδότης εισόδου και εξόδου. Αυτό επιτρέπει την κατασκευή μεγάλυτερων «δέντρων» με προ-σηματοδότες STR_BUILD_SIGNAL_SEMAPHORE_PBS_TOOLTIP :{BLACK}Σηματοδότης Τροχιάς (σηματοφόρος){}Ένας σηματοδότης τροχιάς επιτρέπει σε περισσότερα από ένα τρένο να είναι σε ένα κομμάτι ελέγχου την ίδια στιγμή, εάν το τρένο μπορεί να δεσμεύσει τροχιά σε ασφαλές σημείο στάσης. Κανονικοί σηματοδότες τροχιάς μπορούν να περαστούν από την πίσω πλευρά STR_BUILD_SIGNAL_SEMAPHORE_PBS_OWAY_TOOLTIP :{BLACK}Μονόδρομος Σηματοδότης Τροχιάς (σηματοφόρος){}Ένας σηματοδότης τροχιάς επιτρέπει σε περισσότερα από ένα τρένο να είναι σε ένα κομμάτι ελέγχου την ίδια στιγμή, εάν το τρένο μπορεί να δεσμεύσει τροχιά σε ασφαλές σημείο στάσης. Μονόδρομοι σηματοδότες τροχιάς δεν μπορούν να περαστούν από την πίσω πλευρά. STR_BUILD_SIGNAL_ELECTRIC_NORM_TOOLTIP :{BLACK}Σηματοδότης Τμήματος (ηλεκτρικός){}Αυτός είναι ο πιο βασικός τύπος σηματοδότη, επιτρέποντας μόνο ένα τρένο να είναι στο ίδιο τμήμα την ίδια στιγμή. STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TOOLTIP :{BLACK}Σηματοδότης Εισόδου (ηλεκτρικός){}Πράσινο όσο υπάρχει ένας ή περισσότεροι πράσινοι σηματοδότες εξόδου στο επόμενο τμήμα γραμμής. Διαφορετικά είναι κόκκινο STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}Σηματοδότης Εξόδου (ηλεκτρικός){}Συμπεριφέρεται με τον ίδιο τρόπο όπως οι σηματοδότες τμήματος αλλά είναι απαραίτητο να θέσει το σωστό χρώμα στους προ-σηματοδότες εισόδου και συνδυαστικούς -STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}Συνδυαστικός Σηματοδότης (ηλεκτρικός){}Ο συνδυαστικός σηματοδότης δουλεύει απλά ως σηματοδότης εισόδου και εξόδου ταυτόχρονα. Αυτό σας επιτρέπει το κτίσιμο μεγάλων «δέντρων» με προ-σηματοδότες +STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}Συνδυαστικός Σηματοδότης (ηλεκτρικός){}Ο συνδυαστικός σηματοδότης δουλεύει απλά ως σηματοδότης εισόδου και εξόδου ταυτόχρονα. Αυτό σας επιτρέπει την κατασκευή μεγάλων «δέντρων» με προ-σηματοδότες STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP :{BLACK}Σηματοδότης Τροχιάς (ηλεκτρικός){}Ένας σηματοδότης τροχιάς επιτρέπει σε περισσότερα από ένα τρένο να είναι σε ένα κομμάτι ελέγχου την ίδια στιγμή, εάν το τρένο μπορεί να δεσμεύσει τροχιά σε ασφαλές σημείο στάσης. Κανονικοί σηματοδότες τροχιάς μπορούν να περαστούν από την πίσω πλευρά STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP :{BLACK}Μονόδρομος Σηματοδότης Τροχιάς (ηλεκτρικός){}Ένας σηματοδότης τροχιάς επιτρέπει σε περισσότερα από ένα τρένο να είναι σε ένα κομμάτι ελέγχου την ίδια στιγμή, εάν το τρένο μπορεί να δεσμεύσει τροχιά σε ασφαλές σημείο στάσης. Μονόδρομοι σηματοδότες τροχιάς δεν μπορούν να περαστούν από την πίσω πλευρά -STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Μετατροπή σήματος{}Κάντε κλικ σε ένα υπάρχον σήμα για να το μετατρέψετε στον επιλεγμένο τύπο και παραλλαγή. Ctrl+Click για εναλλαγή της υπάρχουσας παραλλαγής. Το Shift+Click εμφανίζει το εκτιμώμενο κόστος μετατροπής +STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Μετατροπή σήματος{}Κάντε κλικ σε ένα υπάρχον σήμα για να το μετατρέψετε στον επιλεγμένο τύπο και παραλλαγή. Ctrl+Κλικ για εναλλαγή της υπάρχουσας παραλλαγής. Το Shift+Κλικ εμφανίζει το εκτιμώμενο κόστος μετατροπής STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP :{BLACK}Απόσταση μεταξύ σηματοδοτών με σύρσιμο STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_DECREASE_TOOLTIP :{BLACK}Μείωση απόστασης μεταξύ σηματοδοτών με σύρσιμο STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}Αύξηση απόστασης μεταξύ σηματοδοτών με σύρσιμο @@ -2979,7 +2979,7 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}Κατα STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Κατασκευή τούνελ δρόμου. Επιπρόσθετα, με Shift εμφανίζεται εκτίμηση κόστους μόνο STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Κατασκευή τούνελ τροχιοδρόμου. Επιπρόσθετα πατήστε το Shift για εμφάνιση εκτίμησης κόστους μόνο STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}Εναλλαγή κατασκευής/αφαίρεσης για αυτοκινητόδρομους -STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Εναλλαγή κτισίματος/αφαίρεσης της κατασκευής τροχιόδρομου +STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Εναλλαγή προσθήκης/αφαίρεσης για την κατασκευή τροχιόδρομου STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD :{BLACK}Μετατρέψτε/Αναβαθμίστε τον τύπο του δρόμου. Επιπρόσθετα, με Shift εμφανίζεται εκτίμηση κόστους μόνο STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM :{BLACK}Μετατρέψτε/Αναβαθμίστε τον τύπο του τραμ. Επιπρόσθετα, με Shift εμφανίζεται εκτίμηση κόστους μόνο @@ -3058,7 +3058,7 @@ STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Αγορ # Object construction window STR_OBJECT_BUILD_CAPTION :{WHITE}Επιλογή Αντικείμενου STR_OBJECT_BUILD_TOOLTIP :{BLACK}Επιλογή αντικείμενου για κατασκευή. Ctrl+Κλικ+Σύρσιμο για διαγώνια επιλογή. Επιπρόσθετα, με Shift εμφανίζεται εκτίμηση κόστους μόνο -STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}Επιλογή της κατηγορίας του αντικείμενου για κτίσιμο +STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}Επιλογή της κατηγορίας του αντικείμενου για κατασκευή STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}Προεπισκόπηση του αντικείμενου STR_OBJECT_BUILD_SIZE :{BLACK}Μέγεθος: {GOLD}{NUM} x {NUM} τετράγωνα @@ -3135,7 +3135,7 @@ STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_TOOLTIP :{BLACK}Γέμι STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_CAPTION :{WHITE}Δημιουργία τυχαίων βιομηχανιών STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_QUERY :{YELLOW}Σίγουρα θέλετε να δημιουργήσετε πολλές τυχαίες βιομηχανίες; STR_FUND_INDUSTRY_INDUSTRY_BUILD_COST :{BLACK}Κόστος: {YELLOW}{CURRENCY_LONG} -STR_FUND_INDUSTRY_PROSPECT_NEW_INDUSTRY :{BLACK}Διερεύνηση +STR_FUND_INDUSTRY_PROSPECT_NEW_INDUSTRY :{BLACK}Προοπτική STR_FUND_INDUSTRY_BUILD_NEW_INDUSTRY :{BLACK}Κατασκευή STR_FUND_INDUSTRY_FUND_NEW_INDUSTRY :{BLACK}Χρηματοδότηση STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES :{BLACK}Αφαίρεση όλων των βιομηχανιών @@ -3379,7 +3379,7 @@ STR_SAVELOAD_OSKTITLE :{BLACK}Δώστ # World generation STR_MAPGEN_WORLD_GENERATION_CAPTION :{WHITE}Δημιουργία Κόσμου STR_MAPGEN_MAPSIZE :{BLACK}Διάσταση χάρτη: -STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Επιλέξτε το μέγεθος του χάρτη σε τετραγωνίδια. Ο αριθμός των τετραγωνίδιων διαθέσιμα για κτίσιμο θα είναι λίγο χαμηλότερος +STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Επιλέξτε το μέγεθος του χάρτη σε τετραγωνίδια. Ο αριθμός των τετραγωνίδιων διαθέσιμα για κατασκευή θα είναι λίγο χαμηλότερος STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Αριθμός πόλεων: STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP :Επιλέξτε την πυκνότητα των πόλεων ή έναν προσαρμοσμένο αριθμό @@ -3748,7 +3748,7 @@ STR_LOCAL_AUTHORITY_ACTION_SMALL_ADVERTISING_CAMPAIGN :Μικρή δι STR_LOCAL_AUTHORITY_ACTION_MEDIUM_ADVERTISING_CAMPAIGN :Μεσαία διαφημιστική καμπάνια STR_LOCAL_AUTHORITY_ACTION_LARGE_ADVERTISING_CAMPAIGN :Μεγάλη διαφημιστική καμπάνια STR_LOCAL_AUTHORITY_ACTION_ROAD_RECONSTRUCTION :Επιχορήγηση ανακατασκευής τοπικού οδικού δικτύου -STR_LOCAL_AUTHORITY_ACTION_STATUE_OF_COMPANY :Κτίσιμο αγάλματος του ιδιοκτήτη της εταιρίας +STR_LOCAL_AUTHORITY_ACTION_STATUE_OF_COMPANY :Κατασκευή αγάλματος του ιδιοκτήτη της εταιρίας STR_LOCAL_AUTHORITY_ACTION_NEW_BUILDINGS :Επιχορήγηση νέων κτιρίων STR_LOCAL_AUTHORITY_ACTION_EXCLUSIVE_TRANSPORT :Αγορά αποκλειστικών δικαιωμάτων μεταφοράς STR_LOCAL_AUTHORITY_ACTION_BRIBE :Δωροδοκήστε την τοπική αρχή @@ -3759,7 +3759,7 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{PUSH_COLOUR}{Y STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}Έναρξη μεγάλης τοπικής διαφημιστικής καμπάνιας, για να προσελκύσετε περισσότερους επιβάτες και εμπορεύματα στις μεταφορικές σας υπηρεσίες.{}Παρέχει μία προσωρινή ώθηση στην βαθμολογία σταθμού σε μία μεγάλη ακτίνα γύρω από το κέντρο της πόλης.{}{POP_COLOUR} Κόστος: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION_MONTHS :{PUSH_COLOUR}{YELLOW}Χρηματοδοτήστε την ανακατασκευή του αστικού οδικού δικτύου.{}Προκαλεί σημαντική αναστάτωση της οδικής κυκλοφορίας για έως και 6 μήνες.{}{POP_COLOUR}Κόστος: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION_MINUTES :{PUSH_COLOUR}{YELLOW}Χρηματοδοτήστε την ανακατασκευή του αστικού οδικού δικτύου.{}Προκαλεί σημαντική αναστάτωση της οδικής κυκλοφορίας για έως και 6 λεπτά.{}{POP_COLOUR}Κόστος: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Χτίστε ένα άγαλμα προς τιμήν της εταιρίας σας.{}Παρέχει μία μόνιμη ώθηση στην βαθμολογία σταθμών σε αυτή την πόλη.{}{POP_COLOUR}Κόστος: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Κατασκευάστε ένα άγαλμα προς τιμήν της εταιρίας σας.{}Παρέχει μία μόνιμη ώθηση στην βαθμολογία σταθμών σε αυτή την πόλη.{}{POP_COLOUR}Κόστος: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Χρηματοδοτήστε την κατασκευή νέων κτιρίων στην πόλη.{}Παρέχει μια προσωρινή ώθηση στην ανάπτυξη αυτής της πόλης.{}{POP_COLOUR}Κόστος: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MONTHS :{PUSH_COLOUR}{YELLOW}Αγοράστε αποκλειστικά δικαιώματα μεταφοράς στην πόλη για 12 μήνες.{}Η δημοτική αρχή δεν θα επιτρέψει στους επιβάτες και στο φορτίο να χρησιμοποιούν τους σταθμούς των ανταγωνιστών σας. Μια επιτυχημένη δωροδοκία από έναν ανταγωνιστή θα ακυρώσει αυτό το συμβόλαιο.{}{POP_COLOUR}Κόστος: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MINUTES :{PUSH_COLOUR}{YELLOW}Αγοράστε αποκλειστικά δικαιώματα μεταφοράς στην πόλη για 12 λεπτά.{}Η δημοτική αρχή δεν θα επιτρέψει στους επιβάτες και στο φορτίο να χρησιμοποιούν τους σταθμούς των ανταγωνιστών σας. Μια επιτυχημένη δωροδοκία από έναν ανταγωνιστή θα ακυρώσει αυτό το συμβόλαιο.{}{POP_COLOUR}Κόστος: {CURRENCY_LONG} @@ -3988,8 +3988,8 @@ STR_COMPANY_VIEW_INFRASTRUCTURE_STATION :{WHITE}{COMMA} STR_COMPANY_VIEW_INFRASTRUCTURE_AIRPORT :{WHITE}{COMMA} αεροδρόμι{P ο α} STR_COMPANY_VIEW_INFRASTRUCTURE_NONE :{WHITE}Τίποτα -STR_COMPANY_VIEW_BUILD_HQ_BUTTON :{BLACK}Κτίσιμο Αρχηγείου -STR_COMPANY_VIEW_BUILD_HQ_TOOLTIP :{BLACK}Κτίσιμο αρχηγείου εταιρίας +STR_COMPANY_VIEW_BUILD_HQ_BUTTON :{BLACK}Κατασκευή Αρχηγείου +STR_COMPANY_VIEW_BUILD_HQ_TOOLTIP :{BLACK}Κατασκευή αρχηγείου εταιρίας STR_COMPANY_VIEW_VIEW_HQ_BUTTON :{BLACK}Προβολή Αρχηγείου STR_COMPANY_VIEW_VIEW_HQ_TOOLTIP :{BLACK}Προβολή αρχηγείου εταιρίας STR_COMPANY_VIEW_RELOCATE_HQ :{BLACK}Ανοικοδόμηση Αρχηγείου @@ -4014,7 +4014,7 @@ STR_COMPANY_VIEW_COMPANY_NAME_QUERY_CAPTION :Όνομα Ετ STR_COMPANY_VIEW_PRESIDENT_S_NAME_QUERY_CAPTION :Όνομα Διευθυντή STR_COMPANY_VIEW_GIVE_MONEY_QUERY_CAPTION :Εισάγετε το χρηματικό ποσό που θέλετε να δώσετε -STR_BUY_COMPANY_MESSAGE :{WHITE}Ψάχνουμε μία εταιρία μεταφορών για να εξαγοράσει την εταιρία μας.{}{}Θέλετε να εξαγοράσετε την {COMPANY} για {CURRENCY_LONG}; +STR_BUY_COMPANY_MESSAGE :{WHITE}Αναζητούμε μια εταιρία μεταφορών για να εξαγοράσει την εταιρία μας.{}{}Θέλετε να εξαγοράσετε την {COMPANY} για {CURRENCY_LONG}; STR_BUY_COMPANY_HOSTILE_TAKEOVER :{WHITE}Σε μια εχθρική εξαγορά της {COMPANY} θα αγοράσετε όλα τα περιουσιακά στοιχεία, θα εξοφλήσετε όλα τα δάνεια και θα πληρώσετε κέρδη δύο ετών.{}{}Το σύνολο εκτιμάται ότι είναι {CURRENCY_LONG}.{}{}Θέλετε να προχωρήσετε με αυτήν την εχθρική εξαγορά; # Company infrastructure window @@ -4429,7 +4429,7 @@ STR_REPLACE_TRAM_VEHICLES :Οχήματα STR_REPLACE_REMOVE_WAGON :{BLACK}Αφαίρεση βαγονιού: ({STRING}): {ORANGE}{STRING} STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Υποχρεώνει την αυτόματη αντικατάσταση να διατηρεί σταθερό το μήκος του τρένου αφαιρώντας βαγόνια (ξεκινώντας από μπροστά), όταν η αντικατάσταση της μηχανής κάνει το τρένο μεγαλύτερο -STR_REPLACE_REMOVE_WAGON_GROUP_HELP :{STRING}. Πατήστε Ctrl+Click για εφαρμογή επίσης στην υπό-ομάδα +STR_REPLACE_REMOVE_WAGON_GROUP_HELP :{STRING}. Πατήστε Ctrl+Κλικ για εφαρμογή επίσης στην υπό-ομάδα # Vehicle view STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE} @@ -4553,12 +4553,12 @@ STR_VEHICLE_DETAILS_SERVICING_INTERVAL_MINUTES :{BLACK}Διάσ STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}Διάστημα επισκευών: {LTBLUE}{COMMA}%{BLACK} {STRING} STR_VEHICLE_DETAILS_LAST_SERVICE_DATE :Τελευταίο service: {LTBLUE}{DATE_LONG} STR_VEHICLE_DETAILS_LAST_SERVICE_MINUTES_AGO :Τελευταίο service: {LTBLUE}{NUM} λεπτ{P 0 ό ά} πριν -STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}Αύξηση του διαστήματος συντήρησης κατά 10 ημέρες. Ctrl+Click για αύξηση του διαστήματος συντήρησης κατά 5 ημέρες -STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}Αύξηση του διαστήματος συντήρησης κατά 5 λεπτά. Ctrl+Click για αύξηση του διαστήματος συντήρησης κατά 1 λεπτό -STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}Αύξηση του διαστήματος εξυπηρέτησης κατά 10 τοις εκατό. Ctrl+Click για αύξηση του διαστήματος εξυπηρέτησης κατά 5 τοις εκατό -STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :Μειώστε το διάστημα μεταξύ των σέρβις κατά 10 ημέρες. Ctrl+Click για να μειώσετε το διάστημα συντήρησης κατά 5 ημέρες -STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :Μειώστε το διάστημα μεταξύ των σέρβις κατά 5 λεπτά. Ctrl+Click για να μειώσετε το διάστημα συντήρησης κατά 1 λεπτό -STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :Μειώστε το διάστημα μεταξύ των σέρβις κατά 10 τοις εκατό. Ctrl+Click για να μειώσετε το διάστημα συντήρησης κατά 5 τοις εκατό. +STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}Αύξηση του διαστήματος συντήρησης κατά 10 ημέρες. Ctrl+Κλικ για αύξηση του διαστήματος συντήρησης κατά 5 ημέρες +STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}Αύξηση του διαστήματος συντήρησης κατά 5 λεπτά. Ctrl+Κλικ για αύξηση του διαστήματος συντήρησης κατά 1 λεπτό +STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}Αύξηση του διαστήματος εξυπηρέτησης κατά 10 τοις εκατό. Ctrl+Κλικ για αύξηση του διαστήματος εξυπηρέτησης κατά 5 τοις εκατό +STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}Μειώστε το διάστημα μεταξύ των σέρβις κατά 10 ημέρες. Ctrl+Κλικ για να μειώσετε το διάστημα συντήρησης κατά 5 ημέρες +STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}Μειώστε το διάστημα μεταξύ των σέρβις κατά 5 λεπτά. Ctrl+Κλικ για να μειώσετε το διάστημα συντήρησης κατά 1 λεπτό +STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}Μειώστε το διάστημα μεταξύ των σέρβις κατά 10 τοις εκατό. Ctrl+Κλικ για να μειώσετε το διάστημα συντήρησης κατά 5 τοις εκατό. STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}Αλλάξτε τον τύπο διαστήματος επισκευών STR_VEHICLE_DETAILS_DEFAULT :Προκαθορισμένο @@ -4632,7 +4632,7 @@ STR_ORDER_INDEX :{COMMA}:{NBSP} STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING} STR_ORDERS_END_OF_ORDERS :- - Τέλος Εντολών - - -STR_ORDERS_END_OF_SHARED_ORDERS :- - Τέλος Μοιρασμένων Οδηγιών - - +STR_ORDERS_END_OF_SHARED_ORDERS :- - Τέλος Διαμοιρασμένων Εντολών - - # Order bottom buttons STR_ORDER_NON_STOP :{BLACK}Χωρίς στάση @@ -4717,7 +4717,7 @@ STR_ORDER_GO_TO_NEAREST_DEPOT :Πήγαινε STR_ORDER_GO_TO_NEAREST_HANGAR :Πήγαινε στο κοντινότερο υπόστεγο STR_ORDER_CONDITIONAL :Εκτέλεση εντόλης υπο προυπόθεση STR_ORDER_SHARE :Μοίρασμα εντολών -STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Εισάγετε μια νέα εντολή πριν την επιλεγμένη ή προσθέστε στο τέλος της λίστας. Ctrl+Κλικ σε έναν σταθμό για ορισμό εντολής σε "πλήρης φόρτωση οποιουδήποτε εμπορεύματος", σε σημείο διαδρομής για αντιστροφή εντολής "χωρίς στάση εξ ορισμού" ή σε αμαξοστάσιο για "αποσύνδεση". Κάντε κλικ σε άλλο όχημα για να αντιγράψετε τις εντολές του ή Ctrl+Click για διαμοιρασμό εντολών. Μια εντολή αμαξοστασίου απενεργοποιεί την αυτόματη συντήρηση του οχήματος +STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Εισάγετε μια νέα εντολή πριν την επιλεγμένη ή προσθέστε στο τέλος της λίστας. Ctrl+Κλικ σε έναν σταθμό για ορισμό εντολής σε "πλήρης φόρτωση οποιουδήποτε εμπορεύματος", σε σημείο διαδρομής για αντιστροφή εντολής "χωρίς στάση εξ ορισμού" ή σε αμαξοστάσιο για "αποσύνδεση". Κάντε κλικ σε άλλο όχημα για να αντιγράψετε τις εντολές του ή Ctrl+Κλικ για διαμοιρασμό εντολών. Μια εντολή αμαξοστασίου απενεργοποιεί την αυτόματη συντήρηση του οχήματος STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP :{BLACK}Εμφάνιση όλων των οχημάτων που μοιράζονται αυτό το δρομολόγιο @@ -4825,7 +4825,7 @@ STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}Αυτό STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}Αυτό το δρομολόγιο θα ξεκινήσει σε {COMMA} δευτερόλεπτα STR_TIMETABLE_START :{BLACK}Εκκίνηση δρομολογίου -STR_TIMETABLE_START_TOOLTIP :{BLACK}Επιλέξτε πότε ξεκινά αυτό το δρομολόγιο. Ctrl+Click για ομοιόμορφη κατανομή της εκκίνησης όλων των οχημάτων που μοιράζονται αυτήν την εντολή με βάση τη σχετική τους εντολή, εάν η εντολή είναι πλήρως προγραμματισμένη +STR_TIMETABLE_START_TOOLTIP :{BLACK}Επιλέξτε πότε ξεκινά αυτό το δρομολόγιο. Ctrl+Κλικ για ομοιόμορφη κατανομή της εκκίνησης όλων των οχημάτων που μοιράζονται αυτήν την εντολή με βάση τη σχετική τους εντολή, εάν η εντολή είναι πλήρως προγραμματισμένη STR_TIMETABLE_START_SECONDS_QUERY :Δευτερόλεπτα μέχρι την έναρξη του δρομολογίου @@ -4913,7 +4913,7 @@ STR_AI_CONFIG_AI :{SILVER}AI STR_AI_CONFIG_CHANGE_AI :{BLACK}Διάλεξε ΤΝ STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}Δέσμη Ενεργειών -STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Φόρτωση άλλης δέσμης ενεργειών. Ctrl+Click για εμφάνιση όλων των διαθέσιμων εκδόσεων +STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Φόρτωση άλλης δέσμης ενεργειών. Ctrl+Κλικ για εμφάνιση όλων των διαθέσιμων εκδόσεων STR_AI_CONFIG_CONFIGURE :{BLACK}Ρυθμίσεις STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Ρύθμιση των παραμέτρων της Δέσμης Ενεργειών @@ -4999,9 +4999,9 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Υπολ STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Η αποθήκευση είναι σε εξέλιξη,{}παρακαλώ περιμένετε να τελειώσει! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Η αυτόματη αποθήκευση απέτυχε STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Αδύνατη η ανάγνωση του δίσκου -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Η Αποθήκευση Παιχνιδιού Απέτυχε{}{STRING} +STR_ERROR_GAME_SAVE_FAILED :{WHITE}Η αποθήκευση του παιχνιδιού απέτυχε... STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Αδύνατη η διαγραφή του αρχείου -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Η Φόρτωση Παιχνιδιού Απέτυχε{}{STRING} +STR_ERROR_GAME_LOAD_FAILED :{WHITE}Το φόρτωμα του παιχνιδιού απέτυχε... STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Εσωτερικό λάθος: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Χαλασμένο αποθηκευμένο παιχνίδι - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Το αποθηκευμένο παιχνίδι είναι φτιαγμένο με νεότερη έκδοση @@ -5054,7 +5054,7 @@ STR_ERROR_CAN_T_DO_THIS :{WHITE}Αυτό STR_ERROR_BUILDING_MUST_BE_DEMOLISHED :{WHITE}Το κτίριο πρέπει πρώτα να κατεδαφιστεί STR_ERROR_CAN_T_CLEAR_THIS_AREA :{WHITE}Είναι αδύνατο να καθαριστεί αυτή η περιοχή... STR_ERROR_SITE_UNSUITABLE :{WHITE}... ακατάλληλη περιοχή -STR_ERROR_ALREADY_BUILT :{WHITE}... ήδη κτισμένο +STR_ERROR_ALREADY_BUILT :{WHITE}... ήδη κατασκευασμένο STR_ERROR_OWNED_BY :{WHITE}... ιδιοκτησία του {STRING} STR_ERROR_AREA_IS_OWNED_BY_ANOTHER :{WHITE}... η περιοχή είναι ιδιοκτησία άλλης εταιρίας STR_ERROR_TERRAFORM_LIMIT_REACHED :{WHITE}... υπερβαίνει το όριο διαμόρφωσης του εδάφους @@ -5092,12 +5092,12 @@ STR_ERROR_CAN_T_REPAY_LOAN :{WHITE}Αδύν STR_ERROR_INSUFFICIENT_FUNDS :{WHITE}Δεν είναι δυνατό να δοθούν χρήματα που είναι δανεισμένα από τη τράπεζα... STR_ERROR_CAN_T_GIVE_MONEY :{WHITE}Δεν μπορείτε να δώσετε χρήματα σε αυτή την εταιρία... STR_ERROR_CAN_T_BUY_COMPANY :{WHITE}Αδύνατη η εξαγορά της εταιρίας... -STR_ERROR_CAN_T_BUILD_COMPANY_HEADQUARTERS :{WHITE}Δεν μπορεί να κτιστεί αρχηγείο εταιρίας... +STR_ERROR_CAN_T_BUILD_COMPANY_HEADQUARTERS :{WHITE}Δεν μπορεί να κατασκευαστεί αρχηγείο εταιρίας... # Town related errors STR_ERROR_CAN_T_GENERATE_TOWN :{WHITE}Αδύνατο να κατασκευαστούν πόλεις... STR_ERROR_CAN_T_RENAME_TOWN :{WHITE}Δεν μπορεί να μετονομαστεί η πόλη... -STR_ERROR_CAN_T_FOUND_TOWN_HERE :{WHITE}Αδύνατο να κτιστεί πόλη εδώ... +STR_ERROR_CAN_T_FOUND_TOWN_HERE :{WHITE}Αδύνατο να ιδρυθεί πόλη εδώ... STR_ERROR_CAN_T_EXPAND_TOWN :{WHITE}Δεν μπορεί να γίνει επέκταση της πόλης... STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... πολύ κοντά στην άκρη του χάρτη STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... πολύ κοντά σε άλλη πόλη @@ -5110,22 +5110,22 @@ STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... δε # Industry related errors STR_ERROR_TOO_MANY_INDUSTRIES :{WHITE}... πάρα πολλές βιομηχανίες STR_ERROR_CAN_T_GENERATE_INDUSTRIES :{WHITE}Δε γίνεται να δημιουργηθούν βιομηχανίες... -STR_ERROR_CAN_T_BUILD_HERE :{WHITE}Δεν μπορεί να κτιστεί {G ο η το} {STRING} εδώ... -STR_ERROR_CAN_T_CONSTRUCT_THIS_INDUSTRY :{WHITE}Δεν είναι δυνατό να κτιστεί αυτός ο τύπος βιομηχανίας εδώ... +STR_ERROR_CAN_T_BUILD_HERE :{WHITE}Δεν μπορεί να κατασκευαστεί {G ο η το} {STRING} εδώ... +STR_ERROR_CAN_T_CONSTRUCT_THIS_INDUSTRY :{WHITE}Δεν είναι δυνατό να κατασκευαστεί αυτός ο τύπος βιομηχανίας εδώ... STR_ERROR_CAN_T_PROSPECT_INDUSTRY :{WHITE}Δεν βρέθηκαν ευκαιρίες για τη βιομηχανία... STR_ERROR_INDUSTRY_TOO_CLOSE :{WHITE}... πολύ κοντά σε άλλη βιομηχανία -STR_ERROR_MUST_FOUND_TOWN_FIRST :{WHITE}... πρέπει να κτιστεί πόλη πρώτα +STR_ERROR_MUST_FOUND_TOWN_FIRST :{WHITE}... πρέπει να ιδρυθεί πόλη πρώτα STR_ERROR_ONLY_ONE_ALLOWED_PER_TOWN :{WHITE}... επιτρέπεται μόνο μία ανά πόλη -STR_ERROR_CAN_ONLY_BE_BUILT_IN_TOWNS_WITH_POPULATION_OF_1200 :{WHITE}... μπορεί να κτιστεί μόνο σε πόλεις με πληθυσμό άνω των 1200 -STR_ERROR_CAN_ONLY_BE_BUILT_IN_RAINFOREST :{WHITE}... μπορεί να κτιστεί μόνο σε δασώδεις περιοχές -STR_ERROR_CAN_ONLY_BE_BUILT_IN_DESERT :{WHITE}... μπορεί να κτιστεί μόνο σε ερημικές περιοχές -STR_ERROR_CAN_ONLY_BE_BUILT_IN_TOWNS :{WHITE}... μπορεί να κτιστεί μόνο σε πόλεις (αντικαθιστώντας σπίτια) -STR_ERROR_CAN_ONLY_BE_BUILT_NEAR_TOWN_CENTER :{WHITE}... μπορεί να κτιστεί μόνο κοντά σε κέντρα πόλεων -STR_ERROR_CAN_ONLY_BE_BUILT_IN_LOW_AREAS :{WHITE}... μπορεί να κτιστεί μόνο σε χαμηλές περιοχές +STR_ERROR_CAN_ONLY_BE_BUILT_IN_TOWNS_WITH_POPULATION_OF_1200 :{WHITE}... μπορεί να κατασκευαστεί μόνο σε πόλεις με πληθυσμό άνω των 1200 +STR_ERROR_CAN_ONLY_BE_BUILT_IN_RAINFOREST :{WHITE}... μπορεί να κατασκευαστεί μόνο σε δασώδεις περιοχές +STR_ERROR_CAN_ONLY_BE_BUILT_IN_DESERT :{WHITE}... μπορεί να κατασκευαστεί μόνο σε ερημικές περιοχές +STR_ERROR_CAN_ONLY_BE_BUILT_IN_TOWNS :{WHITE}... μπορεί να κατασκευαστεί μόνο σε πόλεις (αντικαθιστώντας σπίτια) +STR_ERROR_CAN_ONLY_BE_BUILT_NEAR_TOWN_CENTER :{WHITE}... μπορεί να κατασκευαστεί μόνο κοντά σε κέντρα πόλεων +STR_ERROR_CAN_ONLY_BE_BUILT_IN_LOW_AREAS :{WHITE}... μπορεί να κατασκευαστεί μόνο σε χαμηλές περιοχές STR_ERROR_CAN_ONLY_BE_POSITIONED :{WHITE}... μπορούν να τοποθετηθούν μόνο στις άκρες του χάρτη STR_ERROR_FOREST_CAN_ONLY_BE_PLANTED :{WHITE}... δάση μπορούν να φυτευτούν μόνο πάνω από τη γραμμή του χιονιού -STR_ERROR_CAN_ONLY_BE_BUILT_ABOVE_SNOW_LINE :{WHITE}... μπορεί να κτιστεί μόνο πάνω από τη γραμμή του χιονιού -STR_ERROR_CAN_ONLY_BE_BUILT_BELOW_SNOW_LINE :{WHITE}... μπορεί να κτιστεί μόνο κάτω από τη γραμμή του χιονιού +STR_ERROR_CAN_ONLY_BE_BUILT_ABOVE_SNOW_LINE :{WHITE}... μπορεί να κατασκευαστεί μόνο πάνω από τη γραμμή του χιονιού +STR_ERROR_CAN_ONLY_BE_BUILT_BELOW_SNOW_LINE :{WHITE}... μπορεί να κατασκευαστεί μόνο κάτω από τη γραμμή του χιονιού STR_ERROR_PROSPECTING_WAS_UNLUCKY :{WHITE}Η χρηματοδότηση απέτυχε να προσκομήσει αποτελέσματα λόγω κακής τύχης· δοκιμάστε ξάνα STR_ERROR_NO_SUITABLE_PLACES_FOR_PROSPECTING :{WHITE}Δεν υπήρχαν κατάλληλα μέρη για προοπτική για αυτόν τον κλάδο @@ -5133,13 +5133,13 @@ STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES :{WHITE}Δεν STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES_EXPLANATION :{WHITE}Αλλαγή παραμέτρων δημιουργίας χάρτη για καλύτερα αποτελέσματα # Station construction related errors -STR_ERROR_CAN_T_BUILD_RAILROAD_STATION :{WHITE}Δεν μπορεί να κτιστεί σταθμός τρένων εδώ... -STR_ERROR_CAN_T_BUILD_BUS_STATION :{WHITE}Δεν μπορεί να κτιστεί στάση λεωφορείων... -STR_ERROR_CAN_T_BUILD_TRUCK_STATION :{WHITE}Δεν μπορεί να κτιστεί σταθμός φορτηγών... -STR_ERROR_CAN_T_BUILD_PASSENGER_TRAM_STATION :{WHITE}Δεν μπορεί να κτιστεί επιβατικός σταθμός τραμ... -STR_ERROR_CAN_T_BUILD_CARGO_TRAM_STATION :{WHITE}Δεν μπορεί να κτιστεί σταθμός τραμ... -STR_ERROR_CAN_T_BUILD_DOCK_HERE :{WHITE}Δεν μπορεί να κτιστεί λιμένας εδώ... -STR_ERROR_CAN_T_BUILD_AIRPORT_HERE :{WHITE}Δεν μπορεί να κτιστεί αεροδρόμιο εδώ... +STR_ERROR_CAN_T_BUILD_RAILROAD_STATION :{WHITE}Δεν μπορεί να κατασκευαστεί σταθμός τρένων εδώ... +STR_ERROR_CAN_T_BUILD_BUS_STATION :{WHITE}Δεν μπορεί να κατασκευαστεί στάση λεωφορείων... +STR_ERROR_CAN_T_BUILD_TRUCK_STATION :{WHITE}Δεν μπορεί να κατασκευαστεί σταθμός φορτηγών... +STR_ERROR_CAN_T_BUILD_PASSENGER_TRAM_STATION :{WHITE}Δεν μπορεί να κατασκευαστεί επιβατικός σταθμός τραμ... +STR_ERROR_CAN_T_BUILD_CARGO_TRAM_STATION :{WHITE}Δεν μπορεί να κατασκευαστεί σταθμός τραμ... +STR_ERROR_CAN_T_BUILD_DOCK_HERE :{WHITE}Δεν μπορεί να κατασκευαστεί λιμένας εδώ... +STR_ERROR_CAN_T_BUILD_AIRPORT_HERE :{WHITE}Δεν μπορεί να κατασκευαστεί αεροδρόμιο εδώ... STR_ERROR_ADJOINS_MORE_THAN_ONE_EXISTING :{WHITE}Γειτονεύει με περισσότερες από μια υπάρχουσες περιοχές σταθμών/φόρτωσης STR_ERROR_STATION_TOO_SPREAD_OUT :{WHITE}... ο σταθμός είναι υπερβολικά απλωμένος @@ -5177,7 +5177,7 @@ STR_ERROR_MUST_DEMOLISH_AIRPORT_FIRST :{WHITE}Πρέπ STR_ERROR_WAYPOINT_ADJOINS_MORE_THAN_ONE_EXISTING :{WHITE}Προστίθεται σε περισσότερο από ένα υπάρχον σημείο καθοδήγησης STR_ERROR_TOO_CLOSE_TO_ANOTHER_WAYPOINT :{WHITE}Πολύ κοντά σε άλλο σημείο καθοδήγησης -STR_ERROR_CAN_T_BUILD_TRAIN_WAYPOINT :{WHITE}Δεν μπορεί να χτιστεί σημείο καθοδήγησης τρένου εδώ... +STR_ERROR_CAN_T_BUILD_TRAIN_WAYPOINT :{WHITE}Δεν μπορεί να κατασκευαστεί σημείο καθοδήγησης τρένου εδώ... STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}Δεν μπορεί να τοποθετηθεί σημαδούρα εδώ... STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}Αδύνατο να αλλαχτεί το όνομα του σημείου καθοδήγησης... @@ -5187,10 +5187,10 @@ STR_ERROR_BUOY_IN_THE_WAY :{WHITE}... ση STR_ERROR_BUOY_IS_IN_USE :{WHITE}... σημαδούρα σε χρήση από άλλη εταιρία! # Depot related errors -STR_ERROR_CAN_T_BUILD_TRAIN_DEPOT :{WHITE}Δεν μπορεί να κτιστεί αμαξοστάσιο εδώ... -STR_ERROR_CAN_T_BUILD_ROAD_DEPOT :{WHITE}Δεν μπορεί να κτιστεί σταθμός οχημάτων εδώ... -STR_ERROR_CAN_T_BUILD_TRAM_DEPOT :{WHITE}Δεν μπορεί να κτιστεί σταθμαρχείο τραμ εδώ... -STR_ERROR_CAN_T_BUILD_SHIP_DEPOT :{WHITE}Δεν μπορεί να κτιστεί ναυπηγείο πλοίων εδώ... +STR_ERROR_CAN_T_BUILD_TRAIN_DEPOT :{WHITE}Δεν μπορεί να κατασκευαστεί αμαξοστάσιο εδώ... +STR_ERROR_CAN_T_BUILD_ROAD_DEPOT :{WHITE}Δεν μπορεί να κατασκευαστεί σταθμός οχημάτων εδώ... +STR_ERROR_CAN_T_BUILD_TRAM_DEPOT :{WHITE}Δεν μπορεί να κατασκευαστεί σταθμαρχείο τραμ εδώ... +STR_ERROR_CAN_T_BUILD_SHIP_DEPOT :{WHITE}Δεν μπορεί να κατασκευαστεί ναυπηγείο πλοίων εδώ... STR_ERROR_CAN_T_RENAME_DEPOT :{WHITE}Δεν μπορεί να μετονομαστεί το αμαξοστάσιο/ναυπηγείο... @@ -5235,7 +5235,7 @@ STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Η δρ STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Δεν επιτρέπονται ισόπεδες διασταυρώσεις για αυτόν τον τύπο σιδηροδρόμου STR_ERROR_CROSSING_DISALLOWED_ROAD :{WHITE}Οι ισόπεδες διαβάσεις δεν επιτρέπονται για αυτό τον τύπο δρόμου STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Δεν μπορούν να τοποθετοηθούν σηματοδότες εδώ... -STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Δεν μπορεί να κτιστεί σιδηρόδρομος εδώ... +STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Δεν μπορεί να κατασκευαστεί σιδηρόδρομος εδώ... STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Δεν μπορεί να αφαιρεθεί σιδηρόδρομος από εδώ... STR_ERROR_CAN_T_REMOVE_SIGNALS_FROM :{WHITE}Αδύνατο να αφαιρεθούν σηματοδότες από εδώ... STR_ERROR_SIGNAL_CAN_T_CONVERT_SIGNALS_HERE :{WHITE}Δεν μπορούν να μετατραπούν οι σηματοδότες εδώ... @@ -5247,8 +5247,8 @@ STR_ERROR_CAN_T_CONVERT_RAIL :{WHITE}Δε γ # Road construction errors STR_ERROR_MUST_REMOVE_ROAD_FIRST :{WHITE}Πρέπει πρώτα να αφαιρεθεί ο δρόμος STR_ERROR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION :{WHITE}... οι μονόδρομοι δεν μπορούν να έχουν διασταυρώσεις -STR_ERROR_CAN_T_BUILD_ROAD_HERE :{WHITE}Δεν μπορεί να κτιστεί δρόμος εδώ... -STR_ERROR_CAN_T_BUILD_TRAMWAY_HERE :{WHITE}Δεν μπορεί να κτιστεί τροχιοδρόμος εδώ... +STR_ERROR_CAN_T_BUILD_ROAD_HERE :{WHITE}Δεν μπορεί να κατασκευαστεί δρόμος εδώ... +STR_ERROR_CAN_T_BUILD_TRAMWAY_HERE :{WHITE}Δεν μπορεί να κατασκευαστεί τροχιοδρόμος εδώ... STR_ERROR_CAN_T_REMOVE_ROAD_FROM :{WHITE}Αδύνατο να αφαιρεθεί δρόμος από εδώ... STR_ERROR_CAN_T_REMOVE_TRAMWAY_FROM :{WHITE}Δεν μπορεί να αφαιρεθεί τροχιόδρομος από εδώ... STR_ERROR_THERE_IS_NO_ROAD :{WHITE}... δεν υπάρχει δρόμος @@ -5259,16 +5259,16 @@ STR_ERROR_NO_SUITABLE_ROAD :{WHITE}Δεν STR_ERROR_NO_SUITABLE_TRAMWAY :{WHITE}Καμία κατάλληλη γραμμή του τραμ # Waterway construction errors -STR_ERROR_CAN_T_BUILD_CANALS :{WHITE}Δεν μπορεί να κτιστεί κανάλι εδώ -STR_ERROR_CAN_T_BUILD_LOCKS :{WHITE}Δεν μπορεί να κτιστεί υδατοφράκτης εδώ... +STR_ERROR_CAN_T_BUILD_CANALS :{WHITE}Δεν μπορεί να κατασκευαστεί κανάλι εδώ +STR_ERROR_CAN_T_BUILD_LOCKS :{WHITE}Δεν μπορεί να κατασκευαστεί υδατοφράκτης εδώ... STR_ERROR_CAN_T_PLACE_RIVERS :{WHITE}Δεν μπορούν να τοποθετηθούν ποτάμια εδώ... -STR_ERROR_MUST_BE_BUILT_ON_WATER :{WHITE}... πρέπει να κτιστεί στο νερό -STR_ERROR_CAN_T_BUILD_ON_WATER :{WHITE}... αδύνατο να κτιστεί στο νερό -STR_ERROR_CAN_T_BUILD_ON_SEA :{WHITE}... αδύνατο να κτιστεί στην ανοικτή θάλασσα -STR_ERROR_CAN_T_BUILD_ON_CANAL :{WHITE}... αδύνατο να κτιστεί σε κανάλι -STR_ERROR_CAN_T_BUILD_ON_RIVER :{WHITE}... αδύνατο να κτιστεί σε ποτάμι +STR_ERROR_MUST_BE_BUILT_ON_WATER :{WHITE}... πρέπει να κατασκευαστεί στο νερό +STR_ERROR_CAN_T_BUILD_ON_WATER :{WHITE}... αδύνατο να κατασκευαστεί στο νερό +STR_ERROR_CAN_T_BUILD_ON_SEA :{WHITE}... αδύνατο να κατασκευαστεί στην ανοικτή θάλασσα +STR_ERROR_CAN_T_BUILD_ON_CANAL :{WHITE}... αδύνατο να κατασκευαστεί σε κανάλι +STR_ERROR_CAN_T_BUILD_ON_RIVER :{WHITE}... αδύνατο να κατασκευαστεί σε ποτάμι STR_ERROR_MUST_DEMOLISH_CANAL_FIRST :{WHITE}Πρέπει να κατεδαφιστεί το κανάλι πρώτα -STR_ERROR_CAN_T_BUILD_AQUEDUCT_HERE :{WHITE}Δεν μπορεί να κτιστεί κανάλι εδώ... +STR_ERROR_CAN_T_BUILD_AQUEDUCT_HERE :{WHITE}Δεν μπορεί να κατασκευαστεί κανάλι εδώ... # Tree related errors STR_ERROR_TREE_ALREADY_HERE :{WHITE}... υπάρχει ήδη δέντρο εδώ @@ -5276,7 +5276,7 @@ STR_ERROR_TREE_WRONG_TERRAIN_FOR_TREE_TYPE :{WHITE}... λά STR_ERROR_CAN_T_PLANT_TREE_HERE :{WHITE}Δεν γίνεται να φυτευτεί δέντρο εδώ... # Bridge related errors -STR_ERROR_CAN_T_BUILD_BRIDGE_HERE :{WHITE}Δεν μπορεί να κτιστεί γέφυρα εδώ... +STR_ERROR_CAN_T_BUILD_BRIDGE_HERE :{WHITE}Δεν μπορεί να κατασκευαστεί γέφυρα εδώ... STR_ERROR_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Πρέπει πρώτα να καταστραφεί η γέφυρα STR_ERROR_CAN_T_START_AND_END_ON :{WHITE}Δεν γίνεται να ξεκινάει και να τελειώνει στο ίδιο σημείο STR_ERROR_BRIDGEHEADS_NOT_SAME_HEIGHT :{WHITE}Η γέφυρα δεν καταλήγει στο ίδιο επίπεδο @@ -5288,7 +5288,7 @@ STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... η STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Η γέφυρα θα καταλήξει εκτός χάρτη # Tunnel related errors -STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Δεν μπορεί να κτιστεί τούνελ εδώ... +STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Δεν μπορεί να κατασκευαστεί τούνελ εδώ... STR_ERROR_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Ακατάλληλη τοποθεσία για είσοδο τούνελ STR_ERROR_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Πρέπει πρώτα να καταστραφεί το τούνελ STR_ERROR_ANOTHER_TUNNEL_IN_THE_WAY :{WHITE}Υπάρχει άλλο τούνελ στη μέση @@ -5298,10 +5298,10 @@ STR_ERROR_TUNNEL_TOO_LONG :{WHITE}... το # Object related errors STR_ERROR_TOO_MANY_OBJECTS :{WHITE}... πάρα πολλά αντικείμενα -STR_ERROR_CAN_T_BUILD_OBJECT :{WHITE}Δεν μπορεί να κτιστεί το αντικείμενο... +STR_ERROR_CAN_T_BUILD_OBJECT :{WHITE}Δεν μπορεί να κατασκευαστεί το αντικείμενο... STR_ERROR_OBJECT_IN_THE_WAY :{WHITE}Αντικείμενο στη μέση STR_ERROR_COMPANY_HEADQUARTERS_IN :{WHITE}... κεντρικά γραφεία εταιρίας στη μέση -STR_ERROR_CAN_T_PURCHASE_THIS_LAND :{WHITE}Αδύνατο να αγοραστεί το έδαφος... +STR_ERROR_CAN_T_PURCHASE_THIS_LAND :{WHITE}Αδύνατο να γίνει αγορά αυτής της περιοχής εδάφους... STR_ERROR_YOU_ALREADY_OWN_IT :{WHITE}... είστε ήδη ιδιοκτήτης! STR_ERROR_BUILD_OBJECT_LIMIT_REACHED :{WHITE}... έχετε φτάσει το όριο οικοδομήσεων @@ -5354,10 +5354,10 @@ STR_ERROR_CAN_T_SEND_SHIP_TO_DEPOT :{WHITE}Δεν STR_ERROR_CAN_T_SEND_AIRCRAFT_TO_HANGAR :{WHITE}Δεν μπορεί να σταλθεί το αεροσκάφος στο υπόστεγο... ###length VEHICLE_TYPES -STR_ERROR_CAN_T_BUY_TRAIN :{WHITE}Δεν μπορεί να αγοραστεί όχημα σιδηρόδρομου... -STR_ERROR_CAN_T_BUY_ROAD_VEHICLE :{WHITE}Δεν μπορεί να αγοραστεί όχημα δρόμου... -STR_ERROR_CAN_T_BUY_SHIP :{WHITE}Δεν μπορεί να αγοραστεί πλοίο... -STR_ERROR_CAN_T_BUY_AIRCRAFT :{WHITE}Δεν μπορεί να αγοραστεί αεροσκάφος... +STR_ERROR_CAN_T_BUY_TRAIN :{WHITE}Δεν μπορεί να γίνει αγορά οχήματος σιδηροδρόμου... +STR_ERROR_CAN_T_BUY_ROAD_VEHICLE :{WHITE}Δεν μπορεί να γίνει αγορά οχήματος δρόμου... +STR_ERROR_CAN_T_BUY_SHIP :{WHITE}Δεν μπορεί να γίνει αγορά πλοίου... +STR_ERROR_CAN_T_BUY_AIRCRAFT :{WHITE}Δεν μπορεί να γίνει αγορά αεροσκάφους... ###length VEHICLE_TYPES STR_ERROR_CAN_T_RENAME_TRAIN_TYPE :{WHITE}Δεν μπορεί να μετονομαστεί ο τύπος τρένου... diff --git a/src/lang/hebrew.txt b/src/lang/hebrew.txt index 61153d52f4..f0e4e8e050 100644 --- a/src/lang/hebrew.txt +++ b/src/lang/hebrew.txt @@ -4320,9 +4320,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}{CURRENC STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}!שמירה מתבצעת,{} אנא המתן עד לסיום השמירה STR_ERROR_AUTOSAVE_FAILED :{WHITE}שמירה אוטומטית נכשלה STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}לא ניתן לקרוא מהדיסק -STR_ERROR_GAME_SAVE_FAILED :{WHITE}שמירת המשחק נכשלה{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}לא ניתן למחוק את הקובץ -STR_ERROR_GAME_LOAD_FAILED :{WHITE}טעינת המשחק נכשלה{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :שגיאה פנימית: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :קובץ השמיקה פגום - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :קובץ השמירה נשמר עם גירסא חדישה יותר של המשחק diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index b36d8f0d3f..6a5c4626bc 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -4960,9 +4960,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Becsült STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}A mentés még tart,{}kérlek várd meg a végét! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Automatikus mentés sikertelen STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Nem olvasható a meghajtó -STR_ERROR_GAME_SAVE_FAILED :{WHITE}A mentés nem sikerült{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Nem sikerült törölni a fájlt -STR_ERROR_GAME_LOAD_FAILED :{WHITE}A betöltés nem sikerült{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Belső hiba: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Hibás játékállás-mentés - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :A játékállást újabb verzió mentette el diff --git a/src/lang/icelandic.txt b/src/lang/icelandic.txt index 1c647aa56c..efaa345255 100644 --- a/src/lang/icelandic.txt +++ b/src/lang/icelandic.txt @@ -3902,9 +3902,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Áætla STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Vistun er enn í gangi,{}vinsamlegast bíddu á meðan hún klárst! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Sjálfvirk vistun mistókst STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Get ekki lesið af drifi -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Vistun leiks mistókst{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Get ekki eytt skrá -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Mistókst að opna leik{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Innri villa: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Bilun í vistuðum leik - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Leikur er vistaður í nýrri útgáfu diff --git a/src/lang/indonesian.txt b/src/lang/indonesian.txt index 1b86a05322..fc35a85f1e 100644 --- a/src/lang/indonesian.txt +++ b/src/lang/indonesian.txt @@ -4785,9 +4785,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Perkiraa STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Penyimpanan sedang berlangsung,{}mohon tunggu hingga selesai STR_ERROR_AUTOSAVE_FAILED :{WHITE}Simpan otomatis gagal STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Tidak dapat membaca drive -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Penyimpanan Game gagal{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Tidak mampu untuk menghapus file/berkas -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Gagal membuka permainan{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Kesalahan Internal: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Berkas simpanan permainan rusak - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Berkas simpanan dibuat dari versi yang lebih baru diff --git a/src/lang/irish.txt b/src/lang/irish.txt index 0c924c4744..80d9f5a895 100644 --- a/src/lang/irish.txt +++ b/src/lang/irish.txt @@ -4494,9 +4494,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Ioncam M STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Fós ag sábháil,{}fan go mbeidh sé críochnaithe! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Theip ar uathshábháil STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Ní féidir an tiomántán a léamh -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Theip ar Shábháil Cluiche{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Ní féidir comhad a scriosadh -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Theip ar Lódáil Cluiche{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Earráid inmheánach: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Cluiche sábháilte briste - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Rinneadh an cluiche sábháilte le leagan níos nuaí diff --git a/src/lang/italian.txt b/src/lang/italian.txt index c9169f681e..150c81a623 100644 --- a/src/lang/italian.txt +++ b/src/lang/italian.txt @@ -4938,9 +4938,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Ricavo s STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Salvataggio in corso,{}prego attenderne la fine! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Salvataggio automatico non riuscito STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Impossibile leggere dall'unità -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Salvataggio non riuscito{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Impossibile eliminare il file -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Caricamento non riuscito{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Errore interno: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Salvataggio danneggiato - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Salvataggio creato con una versione più recente diff --git a/src/lang/japanese.txt b/src/lang/japanese.txt index 0e03d0d796..84b2a8ae91 100644 --- a/src/lang/japanese.txt +++ b/src/lang/japanese.txt @@ -4612,9 +4612,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}収益( STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}ゲームを保存しています{}完了までしばらくお待ちください! STR_ERROR_AUTOSAVE_FAILED :{WHITE}自動保存に失敗しました STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}ドライブを読み込めません -STR_ERROR_GAME_SAVE_FAILED :{WHITE}ゲームの保存に失敗しました{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}ファイルを削除できません -STR_ERROR_GAME_LOAD_FAILED :{WHITE}ゲームの読み込みに失敗しました{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :内部エラー: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :破損したセーブゲーム: {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :このファイルは上位のバージョンによって保存されたものです diff --git a/src/lang/korean.txt b/src/lang/korean.txt index b14d28bb48..d6107ffc1f 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -4900,9 +4900,9 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}예상 STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}저장 중입니다.{}끝날 때까지 기다려주세요! STR_ERROR_AUTOSAVE_FAILED :{WHITE}자동 저장 실패 STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}드라이브를 읽을 수 없습니다 -STR_ERROR_GAME_SAVE_FAILED :{WHITE}게임 저장 실패{}{STRING} +STR_ERROR_GAME_SAVE_FAILED :{WHITE}게임을 저장하지 못 했습니다... STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}파일을 삭제할 수 없습니다 -STR_ERROR_GAME_LOAD_FAILED :{WHITE}게임 불러오기 실패{}{STRING} +STR_ERROR_GAME_LOAD_FAILED :{WHITE}게임을 불러오지 못 했습니다... STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :내부 오류: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :손상된 게임 저장 파일 - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :상위 버전의 게임 저장 파일입니다 diff --git a/src/lang/latin.txt b/src/lang/latin.txt index c7d49e4dee..0aa15daf06 100644 --- a/src/lang/latin.txt +++ b/src/lang/latin.txt @@ -4392,9 +4392,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Reditus STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Adhuc in servando,{}maneas usque ad terminum! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Autoservare defecit STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Non poterat discum legere -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Servare Ludum Defecit{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Non poterat fasciculum delere -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Legere Ludum Defecit{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Mendum internum: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Ludus corruptus - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Ludus servatus est in editione noviore diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt index 04c0579bfe..16c5ab140e 100644 --- a/src/lang/latvian.txt +++ b/src/lang/latvian.txt @@ -4908,9 +4908,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Plānoti STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Notiek saglabāšana,{}lLūdzu uzgaidiet! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Automātiskā saglabāšana neizdevās STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Nevar lasīt disku -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Spēles saglabāšana neizdevās{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Nevar dzēst failu -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Spēles ielādēšana neizdevās{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Iekšēja kļūda: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Bojāts saglabātās spēles fails - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Spēle ir saglabāta ar jaunāku versiju diff --git a/src/lang/lithuanian.txt b/src/lang/lithuanian.txt index 5775ec7d33..5f5198f4c5 100644 --- a/src/lang/lithuanian.txt +++ b/src/lang/lithuanian.txt @@ -4817,9 +4817,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Numatomo STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Vyksta išsaugojimas,{}palaukite kol baigsis! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Automatinis išsaugojimas nepavyko STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Negali pasiekti disko -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Žaidimo išsaugoti nepavyko{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Failo ištrinti nepavyko -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Žaidimo atverti nepavyko{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Vidinė klaida: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Sugadintas išsaugotas žaidimas - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Išsaugotas žaidimas iš naujesnės versijos diff --git a/src/lang/luxembourgish.txt b/src/lang/luxembourgish.txt index c792bcc4c0..3a15cff1eb 100644 --- a/src/lang/luxembourgish.txt +++ b/src/lang/luxembourgish.txt @@ -4896,9 +4896,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Geschät STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Nach amgaangen ze späicheren.{} W.e.g. waarde bis daat fäerdeg ass! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Fehler beim Autospäicheren STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Kann net um Laafwierk liesen -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Fehler beim Späicheren{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Kann d'Datei net läschen -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Fehler beim Lueden{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Interne Feeler: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Futtissen Späicherstand - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Spillstand ass mat enger méi neier Versioun gemaach diff --git a/src/lang/malay.txt b/src/lang/malay.txt index ed6e37ed7a..4e8d12693c 100644 --- a/src/lang/malay.txt +++ b/src/lang/malay.txt @@ -3808,9 +3808,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Jangkaan STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Penyimpanan sedang berlaku,{}sila tunggu sehingga selesai! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Penyimpanan automatik gagal dilakukan STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Gagal dalam membaca cakera -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Penyimpanan Permainan Gagal{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Tidak boleh memadamkan fail -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Pembukaan Permainan Gagal{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Kesilapan dalaman: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Simpanan permainan yang rosak - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Simpanan permainan ini telah dibuat dengan versi yang lebih baru diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index 6654abd5f7..3eaf13fca4 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -4901,9 +4901,9 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Anslått STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Lagring pågår enda,{}vennligst vent til den er klar! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Automatisk lagring mislyktes STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Kan ikke lese fra disk -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Lagring av spillet mislyktes{}{STRING} +STR_ERROR_GAME_SAVE_FAILED :{WHITE}Lagring av spillet mislyktes... STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Kan ikke slette fil -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Lasting av spill mislyktes{}{STRING} +STR_ERROR_GAME_LOAD_FAILED :{WHITE}Lasting av spill mislyktes... STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Intern feil: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Ødelagt lagret spill - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Spillet er lagret i en nyere versjon diff --git a/src/lang/norwegian_nynorsk.txt b/src/lang/norwegian_nynorsk.txt index 5cc21b2d1b..e0adda199c 100644 --- a/src/lang/norwegian_nynorsk.txt +++ b/src/lang/norwegian_nynorsk.txt @@ -4036,9 +4036,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Berekna STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Lagring foregår framleis,{}ver venleg å vente til det er ferdig! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Autolagring gjekk gale STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Kan ikkje lese frå disk -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Lagring av spelet mislukkast{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Kan ikkje slette fil -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Feil ved henting av spel{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Intern feil: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Øydelagd lagra spel - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Spelet er lagra i ein nyare versjon diff --git a/src/lang/persian.txt b/src/lang/persian.txt index 68274b0bdf..f184fdb6d8 100644 --- a/src/lang/persian.txt +++ b/src/lang/persian.txt @@ -3494,9 +3494,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}در آ # Saveload messages STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}درایو خوانده می شود -STR_ERROR_GAME_SAVE_FAILED :{WHITE}بازی ذخیره نشد{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}فایل حذف نمی شود -STR_ERROR_GAME_LOAD_FAILED :{WHITE}بازی بارگزاری نشد{}{STRING} # Map generation messages diff --git a/src/lang/polish.txt b/src/lang/polish.txt index fb7c10d992..8ac204df73 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -5285,9 +5285,9 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Szacowan STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Zapisywanie trwa,{}proszę zaczekać do zakończenia! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Błąd autozapisu STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Nie można odczytać napędu -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Nie można zapisać gry{}{STRING} +STR_ERROR_GAME_SAVE_FAILED :{WHITE}Nie można zapisać gry... STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Nie można usunąć pliku -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Nie można wczytać gry{}{STRING} +STR_ERROR_GAME_LOAD_FAILED :{WHITE}Nie można wczytać gry... STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Błąd wewnętrzny: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Zepsuta zapisana gra - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Zapisana gra zrobiona w nowszej wersji diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index b9b503ba75..8fe6e61310 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -4900,9 +4900,9 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Lucro Es STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Gravação ainda em curso,{}por favor aguarde! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Falha ao guardar automaticamente STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Não é possível ler unidade -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Falha ao guardar jogo{}{STRING} +STR_ERROR_GAME_SAVE_FAILED :{WHITE}Falha ao guardar jogo... STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Não é possível eliminar ficheiro -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Falha ao abrir jogo{}{STRING} +STR_ERROR_GAME_LOAD_FAILED :{WHITE}Falha ao carregar jogo... STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Erro interno: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Ficheiro corrompido - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Jogo gravado numa versão mais recente do jogo diff --git a/src/lang/romanian.txt b/src/lang/romanian.txt index ae588cd4d6..0d7686fa32 100644 --- a/src/lang/romanian.txt +++ b/src/lang/romanian.txt @@ -4892,9 +4892,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Venit es STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Salvarea se efectueaza încã,{}vã rugãm asteptati pânã se încheie! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Auto-salvarea a esuat STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Discul nu a putut fi citit -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Salvarea jocului eșuată{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Ștergerea fișierului a eșuat -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Încărcarea jocului eșuată{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Eroare internă: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Salvare eronată - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Salvarea a fost făcută cu o versiune mai nouă diff --git a/src/lang/russian.txt b/src/lang/russian.txt index f4d7f5da4f..1ced93984e 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -2822,7 +2822,7 @@ STR_CONTENT_OPEN_URL :{BLACK}Веб- STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}Посетить веб-сайт с информацией об этом модуле STR_CONTENT_DOWNLOAD_CAPTION :{BLACK}Скачать STR_CONTENT_DOWNLOAD_CAPTION_TOOLTIP :{BLACK}Начать загрузку выбранного контента -STR_CONTENT_TOTAL_DOWNLOAD_SIZE :{SILVER}Всего для загруки: {WHITE}{BYTES} +STR_CONTENT_TOTAL_DOWNLOAD_SIZE :{SILVER}Всего для загрузки: {WHITE}{BYTES} STR_CONTENT_DETAIL_TITLE :{SILVER}ИНФОРМАЦИЯ О КОНТЕНТЕ ###length 5 @@ -5086,9 +5086,9 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Пред STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Идёт сохранение;{}пожалуйста, дождитесь завершения! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Ошибка автосохранения STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Не удалось прочитать диск -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Невозможно сохранить игру{}{STRING} +STR_ERROR_GAME_SAVE_FAILED :{WHITE}Невозможно сохранить игру... STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Невозможно удалить файл -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Невозможно загрузить игру{}{STRING} +STR_ERROR_GAME_LOAD_FAILED :{WHITE}Невозможно загрузить игру... STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Внутренняя ошибка: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Файл повреждён - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Сохранение сделано в более новой версии diff --git a/src/lang/serbian.txt b/src/lang/serbian.txt index a46c855be2..0eb1a5fe9c 100644 --- a/src/lang/serbian.txt +++ b/src/lang/serbian.txt @@ -5004,9 +5004,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Procena STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Čuvanje je još u toku,{}molimo sačekaj dok se ne završi! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Neuspešno automatsko čuvanje STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Čitanje sa diska nije uspelo -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Čuvanje pozicije nije uspelo{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Brisanje datoteke nije uspelo -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Učitavanje pozicije nije uspelo{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Unutrašnja greška: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Neispravno sačuvana igra - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Igra je sačuvana sa novijom verzijom igre diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index f6bed665f7..9b454332df 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -4899,9 +4899,9 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}预计 STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}保存仍在继续{}请耐心等待…… STR_ERROR_AUTOSAVE_FAILED :{WHITE}自动保存失败 STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}不能读取驱动器 -STR_ERROR_GAME_SAVE_FAILED :{WHITE}保存游戏失败{}{STRING} +STR_ERROR_GAME_SAVE_FAILED :{WHITE}保存游戏失败…… STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}不能删除文件 -STR_ERROR_GAME_LOAD_FAILED :{WHITE}游戏存档读取失败{}{STRING} +STR_ERROR_GAME_LOAD_FAILED :{WHITE}读取游戏失败…… STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :内部错误: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :无法识别的存档 - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :该存档是新版本的。当前版本无法读取。 diff --git a/src/lang/slovak.txt b/src/lang/slovak.txt index 4284d488a5..4366fb9c1c 100644 --- a/src/lang/slovak.txt +++ b/src/lang/slovak.txt @@ -4967,9 +4967,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Odhadova STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Ukladanie hry ešte beží,{}počkajte prosím na dokončenie! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Automatické ukladanie zlyhalo STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Zariadenie je nečitateľné -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Uloženie hry zlyhalo{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Súbor sa nedá vymazať -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Nahratie hry zlyhalo{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Interná chyba: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Poškodená uložená hra - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Hra bola uložená vo vyššej verzii diff --git a/src/lang/slovenian.txt b/src/lang/slovenian.txt index de8be0e05c..2a88be52f2 100644 --- a/src/lang/slovenian.txt +++ b/src/lang/slovenian.txt @@ -4285,9 +4285,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Predvide STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Shranjevanje poteka,{}Prosim počakaj, da se zaključi! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Samodejno shranjevanje spodletelo STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Pogona ni mogoče prebrati -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Shranjevanje igre ni uspelo{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Datoteke ni mogoče zbrisati -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Nalaganje igre ni uspelo{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Interna napaka: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Napaka v shranjeni igri - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Igra je bila shranjena z novejso razlicico diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt index e6782944b2..76df3cab47 100644 --- a/src/lang/spanish.txt +++ b/src/lang/spanish.txt @@ -4450,10 +4450,10 @@ STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Capacida STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Créditos de Transferencia: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_DETAILS_SERVICING_INTERVAL_DAYS :{BLACK}Intervalo de mantenimiento: {LTBLUE}{COMMA}{NBSP}días{BLACK} {STRING} -STR_VEHICLE_DETAILS_SERVICING_INTERVAL_MINUTES :{BLACK}Intervalo de mantenimiento: {LTBLUE}{COMMA}{NBSP}minutos{BLACK} {STRING} +STR_VEHICLE_DETAILS_SERVICING_INTERVAL_MINUTES :{BLACK}Intervalo de mantenimiento: {LTBLUE}{COMMA}{NBSP}minuto{P "" s}{BLACK} {STRING} STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}Intervalo de mantenimiento: {LTBLUE}{COMMA}%{BLACK} {STRING} STR_VEHICLE_DETAILS_LAST_SERVICE_DATE :Último mantenimiento: {LTBLUE}{DATE_LONG} -STR_VEHICLE_DETAILS_LAST_SERVICE_MINUTES_AGO :Último mantenimiento: {LTBLUE}hace {NUM} minutos +STR_VEHICLE_DETAILS_LAST_SERVICE_MINUTES_AGO :Último mantenimiento: {LTBLUE}hace {NUM} minuto{P "" s} STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}Incrementar el intervalo de mantenimiento en 10 días. Ctrl+clic para incrementar el período en 5 días STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}Incrementar el intervalo de mantenimiento en 5 minutos. Ctrl+clic para incrementar el período en un minuto STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}Incrementar el intervalo de mantenimiento en un 10%. Ctrl+clic para incrementar el período en un 5% @@ -4644,7 +4644,7 @@ STR_ORDER_REFIT_ORDER :(Reformar a {ST STR_ORDER_REFIT_STOP_ORDER :(Reformar a {STRING} y detenerse) STR_ORDER_STOP_ORDER :(Detenerse) -STR_ORDER_WAIT_TO_UNBUNCH :(esperar para distanciarse) +STR_ORDER_WAIT_TO_UNBUNCH :(Esperar para distanciarse) STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING} STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(No puede usar la estación){POP_COLOUR} {STRING} {STATION} {STRING} @@ -4900,9 +4900,9 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Ingreso STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}El guardado está en progreso,{}¡por favor espera hasta que termine! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Error al autoguardar STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}No es posible leer la unidad -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Error guardando partida{}{STRING} +STR_ERROR_GAME_SAVE_FAILED :{WHITE}Error al guardar la partida... STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}No es posible borrar el archivo -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Carga de Partida Errónea{}{STRING} +STR_ERROR_GAME_LOAD_FAILED :{WHITE}Error al cargar la partida... STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Error interno: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Partida guardada corrupta - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :La partida guardada ha sido realizada con una versión más nueva @@ -4996,7 +4996,7 @@ STR_ERROR_CAN_T_BUY_COMPANY :{WHITE}No se pu STR_ERROR_CAN_T_BUILD_COMPANY_HEADQUARTERS :{WHITE}No puede construirse la sede de la empresa... # Town related errors -STR_ERROR_CAN_T_GENERATE_TOWN :{WHITE}No se puede construir ningún municipio +STR_ERROR_CAN_T_GENERATE_TOWN :{WHITE}No se puede generar ningún municipio... STR_ERROR_CAN_T_RENAME_TOWN :{WHITE}No se puede renombrar el municipio... STR_ERROR_CAN_T_FOUND_TOWN_HERE :{WHITE}No se puede construir un municipio aquí... STR_ERROR_CAN_T_EXPAND_TOWN :{WHITE}No se puede expandir este municipio... diff --git a/src/lang/spanish_MX.txt b/src/lang/spanish_MX.txt index 8b127708c1..eec6d84e01 100644 --- a/src/lang/spanish_MX.txt +++ b/src/lang/spanish_MX.txt @@ -4781,9 +4781,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Ingreso STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Se sigue guardando la partida,{}¡por favor espera hasta que termine! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Error en guardado automático STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}No es posible leer la unidad de disco -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Error guardando partida{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}No es posible eliminar el archivo -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Error al cargar partida{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Error interno: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Archivo con errores - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :La partida guardada es de una versión más reciente del juego diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index 532a9ca307..c86a05f7e3 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -2858,14 +2858,14 @@ STR_SELECT_BRIDGE_INFO_NAME :{GOLD}{STRING} STR_SELECT_BRIDGE_INFO_NAME_MAX_SPEED :{GOLD}{STRING},{} {VELOCITY} STR_SELECT_BRIDGE_INFO_NAME_COST :{GOLD}{0:STRING},{} {WHITE}{2:CURRENCY_LONG} STR_SELECT_BRIDGE_INFO_NAME_MAX_SPEED_COST :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY_LONG} -STR_BRIDGE_NAME_SUSPENSION_STEEL :Hängbro, Stål -STR_BRIDGE_NAME_GIRDER_STEEL :Balkbro, Stål -STR_BRIDGE_NAME_CANTILEVER_STEEL :Konsolbro, Stål -STR_BRIDGE_NAME_SUSPENSION_CONCRETE :Hängbro, Betong +STR_BRIDGE_NAME_SUSPENSION_STEEL :Hängbro, stål +STR_BRIDGE_NAME_GIRDER_STEEL :Balkbro, stål +STR_BRIDGE_NAME_CANTILEVER_STEEL :Konsolbro, stål +STR_BRIDGE_NAME_SUSPENSION_CONCRETE :Hängbro, betong STR_BRIDGE_NAME_WOODEN :Träbro STR_BRIDGE_NAME_CONCRETE :Betongbro -STR_BRIDGE_NAME_TUBULAR_STEEL :Rörbro, Stål -STR_BRIDGE_TUBULAR_SILICON :Rörbro, Kisel +STR_BRIDGE_NAME_TUBULAR_STEEL :Rörbro, stål +STR_BRIDGE_TUBULAR_SILICON :Rörbro, kisel # Road construction toolbar @@ -4899,9 +4899,9 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Uppskatt STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Sparar fortfarande,{}vänta tills det är slutfört! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Autosparning misslyckades STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Kan inte läsa från disk -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Sparandet av spelet misslyckades{}{STRING} +STR_ERROR_GAME_SAVE_FAILED :{WHITE}Sparandet av spelet misslyckades... STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Kan inte ta bort filen -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Inläsningen av spelet misslyckades{}{STRING} +STR_ERROR_GAME_LOAD_FAILED :{WHITE}Inläsningen av spelet misslyckades... STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Internt fel: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Trasig sparfil - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Sparfilen är gjord med en nyare version diff --git a/src/lang/tamil.txt b/src/lang/tamil.txt index 4ff1227a29..2193062821 100644 --- a/src/lang/tamil.txt +++ b/src/lang/tamil.txt @@ -4498,9 +4498,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}மத STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}பதிவாகிக்கொண்டிருக்கிறது,{}சிறிது நேரம் பொறுங்கள்,! STR_ERROR_AUTOSAVE_FAILED :{WHITE}தானியங்கிபதிவு தோல்வியடைந்தது STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}கணினி சேமிப்பகத்தினை படிக்க இயலவில்லை -STR_ERROR_GAME_SAVE_FAILED :{WHITE}ஆட்டத்தின் படிவு தோல்வியடைந்தது{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}கோப்பினை நீக்க இயலவில்லை -STR_ERROR_GAME_LOAD_FAILED :{WHITE}ஆட்டம் பதிவேறுவது தோல்வியடைந்தது{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :உள்பிழை: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :உடைந்த பதிவுஆட்டம் - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :புதிய பதிப்பினால் பதிவுஆட்டம் உருவாக்கப்பட்டுள்ளது diff --git a/src/lang/thai.txt b/src/lang/thai.txt index 274479bae1..e943336d16 100644 --- a/src/lang/thai.txt +++ b/src/lang/thai.txt @@ -4242,9 +4242,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}รา STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}ขณะนี้กำลังบันทึก,{}โปรดรอจนกว่าจะเสร็จ! STR_ERROR_AUTOSAVE_FAILED :{WHITE}บันทึกอัตโนมัติล้มเหลว!!! STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}ไม่สามารถอ่านข้อมูลได้ -STR_ERROR_GAME_SAVE_FAILED :{WHITE}บันทึกเกมล้มเหลว!!!{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}ไม่สามารถทำการลบไฟล์ -STR_ERROR_GAME_LOAD_FAILED :{WHITE}โหลดเกมล้มเหลว{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :ข้อผิดพลาดจากภายใน: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :เกมที่บันทึกไว้ เสีย - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :เกมที่บันทึกไว้ สำหรับเวอร์ชันใหม่ diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index e25c202054..53866eae5f 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -4726,9 +4726,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}預估 STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}遊戲還在儲存中,{}請稍候! STR_ERROR_AUTOSAVE_FAILED :{WHITE}自動儲存失敗 STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}無法讀取磁碟 -STR_ERROR_GAME_SAVE_FAILED :{WHITE}遊戲儲存失敗{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}無法刪除檔案 -STR_ERROR_GAME_LOAD_FAILED :{WHITE}遊戲載入失敗{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :內部錯誤:{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :損壞的存檔 - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :該存檔是由較新版本的遊戲所產生 diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt index 6d2ab610d8..2d5b6fa1a9 100644 --- a/src/lang/turkish.txt +++ b/src/lang/turkish.txt @@ -4898,9 +4898,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Tahmini STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Kayıt işlemi sürüyor,{}lütfen bitene kadar bekleyin! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Otomatik kayıt başarısız STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Sürücü okunamıyor -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Oyun kaydedilemedi{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Dosya silinemedi -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Dosya yüklenemedi{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :İç hata: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Bozuk kayıtlı oyun - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Oyun yeni bir sürümle kaydedilmiş. diff --git a/src/lang/ukrainian.txt b/src/lang/ukrainian.txt index b3d071428f..76bc68375b 100644 --- a/src/lang/ukrainian.txt +++ b/src/lang/ukrainian.txt @@ -1871,7 +1871,7 @@ STR_CONFIG_SETTING_TIMETABLE_MODE_TICKS :Цоків STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Показувати час прибуття та відправлення у розкладах: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Відображати очікуваний час прибуття та відправлення у розкладі -STR_CONFIG_SETTING_QUICKGOTO :Прискорене створення наказів транспорту: {STRING} +STR_CONFIG_SETTING_QUICKGOTO :Прискорене створення завдань для транспорту: {STRING} STR_CONFIG_SETTING_QUICKGOTO_HELPTEXT :При відображенні списка завдань транспортного засобу автоматично натискається кнопка створення нових завдань STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE :Тип колії на початку нової/завантаженної гри: {STRING} @@ -2227,8 +2227,8 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_IMPERIAL :Імперсь STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_METRIC :Метричні (л) STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_SI :СІ (м³) -STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE :Одиниці тяглової сили: {STRING} -STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_HELPTEXT :Якщо тяглова сила відображається на інтерфейсі: показувати її в обраній одиниці виміру +STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE :Одиниці тягового зусилля: {STRING} +STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_HELPTEXT :Якщо тягове зусилля відображається на інтерфейсі: показувати її в обраній одиниці виміру ###length 3 STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_IMPERIAL :Імперські (фунт-сили) STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_METRIC :Метричні (кгс) @@ -2413,17 +2413,17 @@ STR_LIVERY_AIRCRAFT_GROUP_EMPTY :Не налаш ###length 23 STR_LIVERY_DEFAULT :Базовий колір -STR_LIVERY_STEAM :Паровоз -STR_LIVERY_DIESEL :Тепловоз -STR_LIVERY_ELECTRIC :Електровоз +STR_LIVERY_STEAM :Паротяг +STR_LIVERY_DIESEL :Теплотяг +STR_LIVERY_ELECTRIC :Електротяг STR_LIVERY_MONORAIL :Монорейковий локомотив STR_LIVERY_MAGLEV :Магнітний локомотив -STR_LIVERY_DMU :Багатосекційний тепловоз -STR_LIVERY_EMU :Багатосекційний електровоз -STR_LIVERY_PASSENGER_WAGON_STEAM :Пасажирський вагон (паровоз) -STR_LIVERY_PASSENGER_WAGON_DIESEL :Пасажирський вагон (тепловоз) -STR_LIVERY_PASSENGER_WAGON_ELECTRIC :Пасажирський вагон (електровоз) -STR_LIVERY_PASSENGER_WAGON_MONORAIL :Пасажирський вагон (монорейка) +STR_LIVERY_DMU :Багатосекційний теплотяг +STR_LIVERY_EMU :Багатосекційний електротяг +STR_LIVERY_PASSENGER_WAGON_STEAM :Пасажирський вагон (паротяговий) +STR_LIVERY_PASSENGER_WAGON_DIESEL :Пасажирський вагон (теплотяговий) +STR_LIVERY_PASSENGER_WAGON_ELECTRIC :Пасажирський вагон (електротяговий) +STR_LIVERY_PASSENGER_WAGON_MONORAIL :Пасажирський вагон (монорейковий) STR_LIVERY_PASSENGER_WAGON_MAGLEV :Пасажирський вагон (маглев) STR_LIVERY_FREIGHT_WAGON :Вантажний вагон STR_LIVERY_BUS :Автобус @@ -2907,8 +2907,8 @@ STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP :{BLACK}Не п STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP :{BLACK}Підсвічувати зону покриття станції STR_STATION_BUILD_ACCEPTS_CARGO :{BLACK}Приймає: {GOLD}{CARGO_LIST} STR_STATION_BUILD_SUPPLIES_CARGO :{BLACK}Постачає: {GOLD}{CARGO_LIST} -STR_STATION_BUILD_INFRASTRUCTURE_COST_YEAR :{BLACK} Вартість експлуатації: {GOLD}{CURRENCY_SHORT}/рік -STR_STATION_BUILD_INFRASTRUCTURE_COST_PERIOD :{BLACK} Вартість експлуатації: {GOLD}{CURRENCY_SHORT}/період +STR_STATION_BUILD_INFRASTRUCTURE_COST_YEAR :{BLACK}Вартість експлуатації: {GOLD}{CURRENCY_SHORT}/рік +STR_STATION_BUILD_INFRASTRUCTURE_COST_PERIOD :{BLACK}Вартість експлуатації: {GOLD}{CURRENCY_SHORT}/період # Join station window STR_JOIN_STATION_CAPTION :{WHITE}Об'єднати станцію @@ -4213,8 +4213,8 @@ STR_PURCHASE_INFO_SPEED_POWER :{BLACK}Швид STR_PURCHASE_INFO_SPEED :{BLACK}Швидкість: {GOLD}{VELOCITY} STR_PURCHASE_INFO_SPEED_OCEAN :{BLACK}Швидкість в океані: {GOLD}{VELOCITY} STR_PURCHASE_INFO_SPEED_CANAL :{BLACK}Швидкість в каналі/річці: {GOLD}{VELOCITY} -STR_PURCHASE_INFO_RUNNINGCOST_YEAR :{BLACK} Вартість експлуатації: {GOLD}{CURRENCY_LONG}/рік -STR_PURCHASE_INFO_RUNNINGCOST_PERIOD :{BLACK} Вартість експлуатації: {GOLD}{CURRENCY_LONG}/період +STR_PURCHASE_INFO_RUNNINGCOST_YEAR :{BLACK}Вартість експлуатації: {GOLD}{CURRENCY_LONG}/рік +STR_PURCHASE_INFO_RUNNINGCOST_PERIOD :{BLACK}Вартість експлуатації: {GOLD}{CURRENCY_LONG}/період STR_PURCHASE_INFO_CAPACITY :{BLACK}Місткість: {GOLD}{CARGO_LONG} {STRING} STR_PURCHASE_INFO_REFITTABLE :(змінюється) STR_PURCHASE_INFO_DESIGNED_LIFE :{BLACK}Рік випуску: {GOLD}{NUM}{BLACK} Вік: {GOLD}{COMMA} р{P ік оки оків} @@ -4231,7 +4231,7 @@ STR_PURCHASE_INFO_ALL_TYPES :Всі типи STR_PURCHASE_INFO_NONE :Нема STR_PURCHASE_INFO_ENGINES_ONLY :Тільки локомотиви STR_PURCHASE_INFO_ALL_BUT :Всі, крім {CARGO_LIST} -STR_PURCHASE_INFO_MAX_TE :{BLACK}Максимальна тягова сила: {GOLD}{FORCE} +STR_PURCHASE_INFO_MAX_TE :{BLACK}Максимальне тягове зусилля: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Дальність: {GOLD}{COMMA} клітинок STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Тип літака: {GOLD}{STRING} @@ -4534,7 +4534,7 @@ STR_VEHICLE_STATUS_TRAIN_STUCK :{ORANGE}Очі STR_VEHICLE_STATUS_AIRCRAFT_TOO_FAR :{ORANGE}Занадто далеко до наступного місця призначення STR_VEHICLE_STATUS_HEADING_FOR_STATION_VEL :{LTBLUE}{1:VELOCITY} - Прямує до {0:STATION} -STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}{VELOCITY} - Без наказів +STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}{VELOCITY} - Без завдань STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}{1:VELOCITY} - Прямує до {0:WAYPOINT} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}{1:VELOCITY} - Прямує до {0:DEPOT} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}{1:VELOCITY} - Техогляд у {0:DEPOT} @@ -4565,8 +4565,8 @@ STR_VEHICLE_DETAILS_AIRCRAFT_RENAME :{BLACK}Назв STR_VEHICLE_INFO_AGE :{COMMA} р{P ік оки оків} ({COMMA}) STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} р{P ік оки оків} ({COMMA}) -STR_VEHICLE_INFO_AGE_RUNNING_COST_YR :{BLACK}Вік: {LTBLUE}{STRING}{BLACK} Вартість експлуатації: {LTBLUE}{CURRENCY_LONG}/рік -STR_VEHICLE_INFO_AGE_RUNNING_COST_PERIOD :{BLACK}Вік: {LTBLUE}{STRING}{BLACK} Вартість експлуатації: {LTBLUE}{CURRENCY_LONG}/період +STR_VEHICLE_INFO_AGE_RUNNING_COST_YR :{BLACK}Вік: {LTBLUE}{STRING}{BLACK}Вартість експлуатації: {LTBLUE}{CURRENCY_LONG}/рік +STR_VEHICLE_INFO_AGE_RUNNING_COST_PERIOD :{BLACK}Вік: {LTBLUE}{STRING}{BLACK}Вартість експлуатації: {LTBLUE}{CURRENCY_LONG}/період STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Макс. швидкість: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Макс. швидкість: {LTBLUE}{VELOCITY} {BLACK}Тип: {LTBLUE}{STRING} @@ -4671,8 +4671,8 @@ STR_ORDERS_LIST_TOOLTIP :{BLACK}Марш STR_ORDER_INDEX :{COMMA}:{NBSP} STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING} -STR_ORDERS_END_OF_ORDERS :- - Кінець наказів - - -STR_ORDERS_END_OF_SHARED_ORDERS :- - Кінець спільних наказів - - +STR_ORDERS_END_OF_ORDERS :- - Кінець завдань - - +STR_ORDERS_END_OF_SHARED_ORDERS :- - Кінець спільних завдань - - # Order bottom buttons STR_ORDER_NON_STOP :{BLACK}Без зупинки @@ -5041,9 +5041,9 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Приб STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Збереження...{}зачекайте, доки завершиться! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Помилка автозбереження STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Неможливо прочитати пристрій -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Помилка запису гри{}{STRING} +STR_ERROR_GAME_SAVE_FAILED : STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Неможливо стерти файл -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Помилка завантаження гри{}{STRING} +STR_ERROR_GAME_LOAD_FAILED : STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Внутрішня помилка: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Файл збереженої гри пошкоджений - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Файл збереженої гри зроблений більш новою версією @@ -5435,8 +5435,8 @@ STR_ERROR_CAN_T_MAKE_ROAD_VEHICLE_TURN :{WHITE}Немо STR_ERROR_AIRCRAFT_IS_IN_FLIGHT :{WHITE}Літак у польоті # Order related errors -STR_ERROR_NO_MORE_SPACE_FOR_ORDERS :{WHITE}Немає місця для наказів -STR_ERROR_TOO_MANY_ORDERS :{WHITE}Дуже багато наказів +STR_ERROR_NO_MORE_SPACE_FOR_ORDERS :{WHITE}Немає місця для нових завдань +STR_ERROR_TOO_MANY_ORDERS :{WHITE}Занадто багато завдань STR_ERROR_CAN_T_INSERT_NEW_ORDER :{WHITE}Неможливо додати наказ... STR_ERROR_CAN_T_DELETE_THIS_ORDER :{WHITE}Неможливо видалити наказ... STR_ERROR_CAN_T_MODIFY_THIS_ORDER :{WHITE}Неможливо змінити наказ... @@ -5658,33 +5658,33 @@ STR_SV_STNAME_FALLBACK :{STRING}, ст ##id 0x8000 ###length 116 # Vehicle names -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_KIRBY_PAUL_TANK_STEAM :Kirby Paul Tank (паровоз) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_MJS_250_DIESEL :MJS 250 (тепловоз) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_KIRBY_PAUL_TANK_STEAM :Kirby Paul Tank (паротяг) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_MJS_250_DIESEL :MJS 250 (теплотяг) STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_PLODDYPHUT_CHOO_CHOO :Ploddyphut Choo-Choo STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_POWERNAUT_CHOO_CHOO :Powernaut Choo-Choo STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_MIGHTYMOVER_CHOO_CHOO :MightyMover Choo-Choo -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_PLODDYPHUT_DIESEL :Ploddyphut (тепловоз) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_POWERNAUT_DIESEL :Powernaut (тепловоз) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_WILLS_2_8_0_STEAM :Wills 2-8-0 (паровоз) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_CHANEY_JUBILEE_STEAM :Chaney 'Jubilee' (паровоз) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_GINZU_A4_STEAM :Ginzu 'A4' (паровоз) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_8P_STEAM :SH '8P' (паровоз) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_MANLEY_MOREL_DMU_DIESEL :Manley-Morel DMU (тепловоз) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_DASH_DIESEL :'Dash' (тепловоз) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_HENDRY_25_DIESEL :SH/Hendry '25' (тепловоз) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_UU_37_DIESEL :UU '37' (тепловоз) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_FLOSS_47_DIESEL :Floss '47' (тепловоз) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_CS_4000_DIESEL :CS 4000 (тепловоз) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_CS_2400_DIESEL :CS 2400 (тепловоз) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_CENTENNIAL_DIESEL :Centennial (тепловоз) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_KELLING_3100_DIESEL :Kelling 3100 (тепловоз) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_TURNER_TURBO_DIESEL :Turner Turbo (тепловоз) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_MJS_1000_DIESEL :MJS 1000 (тепловоз) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_125_DIESEL :SH '125' (тепловоз) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_30_ELECTRIC :SH '30' (електровоз) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_40_ELECTRIC :SH '40' (електровоз) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_T_I_M_ELECTRIC :'T.I.M.' (електровоз) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_ASIASTAR_ELECTRIC :'AsiaStar' (електровоз) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_PLODDYPHUT_DIESEL :Ploddyphut (теплотяг) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_POWERNAUT_DIESEL :Powernaut (теплотяг) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_WILLS_2_8_0_STEAM :Wills 2-8-0 (паротяг) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_CHANEY_JUBILEE_STEAM :Chaney 'Jubilee' (паротяг) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_GINZU_A4_STEAM :Ginzu 'A4' (паротяг) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_8P_STEAM :SH '8P' (паротяг) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_MANLEY_MOREL_DMU_DIESEL :Manley-Morel DMU (теплотяг) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_DASH_DIESEL :'Dash' (теплотяг) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_HENDRY_25_DIESEL :SH/Hendry '25' (теплотяг) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_UU_37_DIESEL :UU '37' (теплотяг) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_FLOSS_47_DIESEL :Floss '47' (теплотяг) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_CS_4000_DIESEL :CS 4000 (теплотяг) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_CS_2400_DIESEL :CS 2400 (теплотяг) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_CENTENNIAL_DIESEL :Centennial (теплотяг) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_KELLING_3100_DIESEL :Kelling 3100 (теплотяг) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_TURNER_TURBO_DIESEL :Turner Turbo (теплотяг) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_MJS_1000_DIESEL :MJS 1000 (теплотяг) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_125_DIESEL :SH '125' (теплотяг) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_30_ELECTRIC :SH '30' (електротяг) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_40_ELECTRIC :SH '40' (електротяг) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_T_I_M_ELECTRIC :'T.I.M.' (електротяг) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_ASIASTAR_ELECTRIC :'AsiaStar' (електротяг) STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_PASSENGER_CAR :Пасажирський вагон STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_MAIL_VAN :Поштовий вагон STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COAL_CAR :Вагон для вугілля @@ -5712,8 +5712,8 @@ STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_TOY_VAN :Вагон дл STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_BATTERY_TRUCK :Вагон для батарейок STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_FIZZY_DRINK_TRUCK :Вагон для газованої води STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_PLASTIC_TRUCK :Вагон для пластиліну -STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_X2001_ELECTRIC :'X2001' (електровоз) -STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_MILLENNIUM_Z1_ELECTRIC :'Millennium Z1' (електровоз) +STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_X2001_ELECTRIC :'X2001' (електротяг) +STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_MILLENNIUM_Z1_ELECTRIC :'Millennium Z1' (електротяг) STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_WIZZOWOW_Z99 :Wizzowow Z99 STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_PASSENGER_CAR :Пасажирський вагон STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_MAIL_VAN :Поштовий вагон @@ -5742,10 +5742,10 @@ STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_TOY_VAN :Вагон дл STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_BATTERY_TRUCK :Вагон для батарейок STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_FIZZY_DRINK_TRUCK :Вагон для газованої води STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_PLASTIC_TRUCK :Вагон для пластиліну -STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV1_LEVIATHAN_ELECTRIC :Lev1 'Leviathan' (електровоз) -STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV2_CYCLOPS_ELECTRIC :Lev2 'Cyclops' (електровоз) -STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV3_PEGASUS_ELECTRIC :Lev3 'Pegasus' (електровоз) -STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV4_CHIMAERA_ELECTRIC :Lev4 'Chimaera' (електровоз) +STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV1_LEVIATHAN_ELECTRIC :Lev1 'Leviathan' (електротяг) +STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV2_CYCLOPS_ELECTRIC :Lev2 'Cyclops' (електротяг) +STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV3_PEGASUS_ELECTRIC :Lev3 'Pegasus' (електротяг) +STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV4_CHIMAERA_ELECTRIC :Lev4 'Chimaera' (електротяг) STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_WIZZOWOW_ROCKETEER :Wizzowow Rocketeer STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_PASSENGER_CAR :Пасажирський вагон STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_MAIL_VAN :Поштовий вагон diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index b23f17c21b..e92e3b05f7 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -4643,7 +4643,7 @@ STR_ORDER_REFIT_ORDER :(Cải biến t STR_ORDER_REFIT_STOP_ORDER :(Cải biến thành {STRING} và dừng) STR_ORDER_STOP_ORDER :(Dừng) -STR_ORDER_WAIT_TO_UNBUNCH :(chờ để gỡ gộp) +STR_ORDER_WAIT_TO_UNBUNCH :(Chờ để gỡ gộp) STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING} STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(Không thể sử dụng trạm){POP_COLOUR} {STRING} {STATION} {STRING} @@ -4899,9 +4899,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Thu nh STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Đang lưu vào đĩa,{}hãy chờ cho đến khi hoàn thành! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Tự lưu gặp lỗi STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Không đọc được đĩa -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Lưu ván chơi có lỗi{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Không thể xoá file -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Nạp ván chơi thất bại{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Lỗi kỹ thuật: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Bản lưu ván chơi bị hỏng - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Bản lưu ván chơi dành cho phiên bản mới hơn diff --git a/src/lang/welsh.txt b/src/lang/welsh.txt index 1a4deca7a4..c92814a9d1 100644 --- a/src/lang/welsh.txt +++ b/src/lang/welsh.txt @@ -4899,9 +4899,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Amcangyf STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Mae'r gêm wrthi'n cael ei chadw,{}Arhoswch nes y bydd y broses wedi'i chwblhau! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Methodd yr Awtogadw STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Methu darllen y gyriant -STR_ERROR_GAME_SAVE_FAILED :{WHITE}Methwyd â Chadw Gêm{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Methu Dileu Ffeil -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Methwyd â Llwytho Gêm{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Gwall mewnol: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Mae'r gêm a gadwyd wedi torri - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Mae'r gêm a gadwyd wedi ei chadw mewn fersiwn ddiweddarach diff --git a/src/main_gui.cpp b/src/main_gui.cpp index f4aa06cd2d..c74da1bdce 100644 --- a/src/main_gui.cpp +++ b/src/main_gui.cpp @@ -282,18 +282,18 @@ struct MainWindow : Window if (_game_mode == GM_MENU) { ViewportDoDrawProcessAllPending(); - static const SpriteID title_sprites[] = {SPR_OTTD_O, SPR_OTTD_P, SPR_OTTD_E, SPR_OTTD_N, SPR_OTTD_T, SPR_OTTD_T, SPR_OTTD_D}; + static const std::initializer_list title_sprites = {SPR_OTTD_O, SPR_OTTD_P, SPR_OTTD_E, SPR_OTTD_N, SPR_OTTD_T, SPR_OTTD_T, SPR_OTTD_D}; uint letter_spacing = ScaleGUITrad(10); - int name_width = (lengthof(title_sprites) - 1) * letter_spacing; + int name_width = static_cast(std::size(title_sprites) - 1) * letter_spacing; - for (uint i = 0; i < lengthof(title_sprites); i++) { - name_width += GetSpriteSize(title_sprites[i]).width; + for (const SpriteID &sprite : title_sprites) { + name_width += GetSpriteSize(sprite).width; } int off_x = (this->width - name_width) / 2; - for (uint i = 0; i < lengthof(title_sprites); i++) { - DrawSprite(title_sprites[i], PAL_NONE, off_x, ScaleGUITrad(50)); - off_x += GetSpriteSize(title_sprites[i]).width + letter_spacing; + for (const SpriteID &sprite : title_sprites) { + DrawSprite(sprite, PAL_NONE, off_x, ScaleGUITrad(50)); + off_x += GetSpriteSize(sprite).width + letter_spacing; } } } diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index a8201dbeb5..152a6cdc25 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -77,9 +77,9 @@ static DropDownList BuildVisibilityDropDownList() { DropDownList list; - list.push_back(std::make_unique(STR_NETWORK_SERVER_VISIBILITY_LOCAL, SERVER_GAME_TYPE_LOCAL, false)); - list.push_back(std::make_unique(STR_NETWORK_SERVER_VISIBILITY_INVITE_ONLY, SERVER_GAME_TYPE_INVITE_ONLY, false)); - list.push_back(std::make_unique(STR_NETWORK_SERVER_VISIBILITY_PUBLIC, SERVER_GAME_TYPE_PUBLIC, false)); + list.push_back(MakeDropDownListStringItem(STR_NETWORK_SERVER_VISIBILITY_LOCAL, SERVER_GAME_TYPE_LOCAL)); + list.push_back(MakeDropDownListStringItem(STR_NETWORK_SERVER_VISIBILITY_INVITE_ONLY, SERVER_GAME_TYPE_INVITE_ONLY)); + list.push_back(MakeDropDownListStringItem(STR_NETWORK_SERVER_VISIBILITY_PUBLIC, SERVER_GAME_TYPE_PUBLIC)); return list; } @@ -105,8 +105,8 @@ public: this->Add(std::make_unique(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NG_YEARS, STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION, STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION_TOOLTIP)); leaf = std::make_unique(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NG_INFO, STR_EMPTY, STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP); - leaf->SetMinimalSize(14 + GetSpriteSize(SPR_LOCK, nullptr, ZOOM_LVL_OUT_4X).width - + GetSpriteSize(SPR_BLOT, nullptr, ZOOM_LVL_OUT_4X).width, 12); + leaf->SetMinimalSize(14 + GetSpriteSize(SPR_LOCK, nullptr, ZOOM_LVL_NORMAL).width + + GetSpriteSize(SPR_BLOT, nullptr, ZOOM_LVL_NORMAL).width, 12); leaf->SetFill(0, 1); this->Add(std::move(leaf)); } @@ -1507,8 +1507,8 @@ private: static void OnClickClientAdmin([[maybe_unused]] NetworkClientListWindow *w, [[maybe_unused]] Point pt, ClientID client_id) { DropDownList list; - list.push_back(std::make_unique(STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK, DD_CLIENT_ADMIN_KICK, false)); - list.push_back(std::make_unique(STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN, DD_CLIENT_ADMIN_BAN, false)); + list.push_back(MakeDropDownListStringItem(STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK, DD_CLIENT_ADMIN_KICK)); + list.push_back(MakeDropDownListStringItem(STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN, DD_CLIENT_ADMIN_BAN)); Rect wi_rect; wi_rect.left = pt.x; @@ -1529,8 +1529,8 @@ private: static void OnClickCompanyAdmin([[maybe_unused]] NetworkClientListWindow *w, [[maybe_unused]] Point pt, CompanyID company_id) { DropDownList list; - list.push_back(std::make_unique(STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_RESET, DD_COMPANY_ADMIN_RESET, NetworkCompanyHasClients(company_id))); - list.push_back(std::make_unique(STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_UNLOCK, DD_COMPANY_ADMIN_UNLOCK, !NetworkCompanyIsPassworded(company_id))); + list.push_back(MakeDropDownListStringItem(STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_RESET, DD_COMPANY_ADMIN_RESET, NetworkCompanyHasClients(company_id))); + list.push_back(MakeDropDownListStringItem(STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_UNLOCK, DD_COMPANY_ADMIN_UNLOCK, !NetworkCompanyIsPassworded(company_id))); Rect wi_rect; wi_rect.left = pt.x; diff --git a/src/newgrf_debug_gui.cpp b/src/newgrf_debug_gui.cpp index 45c49ed229..894bb6b2e9 100644 --- a/src/newgrf_debug_gui.cpp +++ b/src/newgrf_debug_gui.cpp @@ -1053,13 +1053,13 @@ struct NewGRFInspectWindow : Window { case WID_NGRFI_SPRITE_DUMP_OPTIONS: { DropDownList list; - list.push_back(std::make_unique(STR_NEWGRF_INSPECT_SPRITE_DUMP_GOTO, NGIWDDO_GOTO_SPRITE, false)); - list.push_back(std::make_unique(STR_NEWGRF_INSPECT_SPRITE_DUMP_CLEAR, NGIWDDO_CLEAR, false)); - list.push_back(std::make_unique(-1, false)); - list.push_back(std::make_unique(!this->click_to_mark_mode, STR_NEWGRF_INSPECT_SPRITE_DUMP_CLICK_TO_HIGHLIGHT, NGIWDDO_CLICK_TO_HIGHLIGHT, false)); - list.push_back(std::make_unique(this->click_to_mark_mode, STR_NEWGRF_INSPECT_SPRITE_DUMP_CLICK_TO_MARK, NGIWDDO_CLICK_TO_MARK, false)); - list.push_back(std::make_unique(-1, false)); - list.push_back(std::make_unique(this->sprite_dump_more_details, STR_NEWGRF_INSPECT_SPRITE_DUMP_MORE_DETAILS, NGIWDDO_MORE_DETAILS, false)); + list.push_back(MakeDropDownListStringItem(STR_NEWGRF_INSPECT_SPRITE_DUMP_GOTO, NGIWDDO_GOTO_SPRITE, false)); + list.push_back(MakeDropDownListStringItem(STR_NEWGRF_INSPECT_SPRITE_DUMP_CLEAR, NGIWDDO_CLEAR, false)); + list.push_back(MakeDropDownListDividerItem()); + list.push_back(MakeDropDownListCheckedItem(!this->click_to_mark_mode, STR_NEWGRF_INSPECT_SPRITE_DUMP_CLICK_TO_HIGHLIGHT, NGIWDDO_CLICK_TO_HIGHLIGHT, false)); + list.push_back(MakeDropDownListCheckedItem(this->click_to_mark_mode, STR_NEWGRF_INSPECT_SPRITE_DUMP_CLICK_TO_MARK, NGIWDDO_CLICK_TO_MARK, false)); + list.push_back(MakeDropDownListDividerItem()); + list.push_back(MakeDropDownListCheckedItem(this->sprite_dump_more_details, STR_NEWGRF_INSPECT_SPRITE_DUMP_MORE_DETAILS, NGIWDDO_MORE_DETAILS, false)); ShowDropDownList(this, std::move(list), 0, WID_NGRFI_SPRITE_DUMP_OPTIONS, 140); break; @@ -1673,7 +1673,7 @@ struct SpriteAlignerWindow : Window { } SpriteAlignerWindow::zoom = Clamp(SpriteAlignerWindow::zoom, _settings_client.gui.zoom_min, _settings_client.gui.zoom_max); - for (ZoomLevel z = ZOOM_LVL_NORMAL; z < ZOOM_LVL_SPR_COUNT; z++) { + for (ZoomLevel z = ZOOM_LVL_BEGIN; z < ZOOM_LVL_SPR_COUNT; 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); } @@ -1742,12 +1742,12 @@ static constexpr NWidgetPart _nested_sprite_aligner_widgets[] = { 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), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SA_ZOOM + ZOOM_LVL_IN_4X), SetDataTip(STR_CONFIG_SETTING_ZOOM_LVL_MIN, STR_NULL), SetFill(1, 0), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SA_ZOOM + ZOOM_LVL_IN_2X), SetDataTip(STR_CONFIG_SETTING_ZOOM_LVL_IN_2X, STR_NULL), SetFill(1, 0), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SA_ZOOM + ZOOM_LVL_NORMAL), SetDataTip(STR_CONFIG_SETTING_ZOOM_LVL_NORMAL, STR_NULL), SetFill(1, 0), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SA_ZOOM + ZOOM_LVL_OUT_2X), SetDataTip(STR_CONFIG_SETTING_ZOOM_LVL_OUT_2X, STR_NULL), SetFill(1, 0), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SA_ZOOM + ZOOM_LVL_OUT_4X), SetDataTip(STR_CONFIG_SETTING_ZOOM_LVL_OUT_4X, STR_NULL), SetFill(1, 0), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SA_ZOOM + ZOOM_LVL_OUT_8X), SetDataTip(STR_CONFIG_SETTING_ZOOM_LVL_OUT_8X, STR_NULL), SetFill(1, 0), EndContainer(), EndContainer(), EndContainer(), diff --git a/src/newgrf_gui.cpp b/src/newgrf_gui.cpp index 6425fbb8ee..3dd86c71c6 100644 --- a/src/newgrf_gui.cpp +++ b/src/newgrf_gui.cpp @@ -406,7 +406,7 @@ struct NewGRFParametersWindow : public Window { DropDownList list; for (uint32_t i = par_info.min_value; i <= par_info.max_value; i++) { - list.push_back(std::make_unique(GetGRFStringFromGRFText(par_info.value_names.find(i)->second), i, false)); + list.push_back(MakeDropDownListStringItem(GetGRFStringFromGRFText(par_info.value_names.find(i)->second), i)); } ShowDropDownListAt(this, std::move(list), old_val, WID_NP_SETTING_DROPDOWN, wi_rect, COLOUR_ORANGE); @@ -971,10 +971,10 @@ struct NewGRFWindow : public Window, NewGRFScanCallback { DropDownList list; /* Add 'None' option for clearing list */ - list.push_back(std::make_unique(STR_NONE, -1, false)); + list.push_back(MakeDropDownListStringItem(STR_NONE, -1)); for (uint i = 0; i < this->grf_presets.size(); i++) { - list.push_back(std::make_unique(this->grf_presets[i], i, false)); + list.push_back(MakeDropDownListStringItem(this->grf_presets[i], i)); } this->CloseChildWindows(WC_QUERY_STRING); // Remove the parameter query window diff --git a/src/news_func.h b/src/news_func.h index 4c2b5050a5..f98e895d8f 100644 --- a/src/news_func.h +++ b/src/news_func.h @@ -55,7 +55,7 @@ inline void AddIndustryNewsItem(StringID string, NewsType type, IndustryID indus void NewsLoop(); void InitNewsItemStructs(); -extern const NewsItem *_statusbar_news_item; +const NewsItem *GetStatusbarNews(); void DeleteInvalidEngineNews(); void DeleteVehicleNews(VehicleID vid, StringID news); diff --git a/src/news_gui.cpp b/src/news_gui.cpp index 2fde1d91e7..b716c90c50 100644 --- a/src/news_gui.cpp +++ b/src/news_gui.cpp @@ -22,7 +22,6 @@ #include "town.h" #include "sound_func.h" #include "string_func.h" -#include "dropdown_func.h" #include "statusbar_gui.h" #include "company_manager_face.h" #include "company_func.h" @@ -42,25 +41,42 @@ #include "safeguards.h" -const NewsItem *_statusbar_news_item = nullptr; +static const uint MIN_NEWS_AMOUNT = 30; ///< preferred minimum amount of news messages. +static const uint MAX_NEWS_AMOUNT = 1U << 10; ///< Do not exceed this number of news messages. -static uint MIN_NEWS_AMOUNT = 30; ///< preferred minimum amount of news messages -static uint MAX_NEWS_AMOUNT = 1 << 10; ///< Do not exceed this number of news messages -static uint _total_news = 0; ///< current number of news items -static NewsItem *_oldest_news = nullptr; ///< head of news items queue -NewsItem *_latest_news = nullptr; ///< tail of news items queue +static NewsContainer _news; ///< List of news, with newest items at the start. /** * Forced news item. * Users can force an item by accessing the history or "last message". - * If the message being shown was forced by the user, a pointer is stored - * in _forced_news. Otherwise, \a _forced_news variable is nullptr. + * If the message being shown was forced by the user, an iterater is stored + * in _forced_news. Otherwise, \a _forced_news variable is the end of \a _news. */ -static const NewsItem *_forced_news = nullptr; +static NewsIterator _forced_news = std::end(_news); /** Current news item (last item shown regularly). */ -static const NewsItem *_current_news = nullptr; +static NewsIterator _current_news = std::end(_news); +/** Current status bar news item. */ +static NewsIterator _statusbar_news = std::end(_news); + +/** + * Get pointer to the current status bar news item. + * @return Pointer to the current status bar news item, or nullptr if there is none. + */ +const NewsItem *GetStatusbarNews() +{ + return (_statusbar_news == std::end(_news)) ? nullptr : &*_statusbar_news; +} + +/** + * Get read-only reference to all news items. + * @return Read-only reference to all news items. + */ +const NewsContainer &GetNews() +{ + return _news; +} /** * Get the position a news-reference is referencing. @@ -486,7 +502,7 @@ struct NewsWindow : Window { case WID_N_CLOSEBOX: NewsWindow::duration = 0; this->Close(); - _forced_news = nullptr; + _forced_news = std::end(_news); break; case WID_N_CAPTION: @@ -624,29 +640,21 @@ static void ShowNewspaper(const NewsItem *ni) } /** Show news item in the ticker */ -static void ShowTicker(const NewsItem *ni) +static void ShowTicker(NewsIterator ni) { if (_settings_client.sound.news_ticker) SndPlayFx(SND_16_NEWS_TICKER); - _statusbar_news_item = ni; + _statusbar_news = ni; InvalidateWindowData(WC_STATUS_BAR, 0, SBI_SHOW_TICKER); } /** Initialize the news-items data structures */ void InitNewsItemStructs() { - for (NewsItem *ni = _oldest_news; ni != nullptr; ) { - NewsItem *next = ni->next; - delete ni; - ni = next; - } - - _total_news = 0; - _oldest_news = nullptr; - _latest_news = nullptr; - _forced_news = nullptr; - _current_news = nullptr; - _statusbar_news_item = nullptr; + _news.clear(); + _forced_news = std::end(_news); + _current_news = std::end(_news); + _statusbar_news = std::end(_news); NewsWindow::duration = 0; } @@ -656,7 +664,7 @@ void InitNewsItemStructs() */ static bool ReadyForNextTickerItem() { - const NewsItem *ni = _statusbar_news_item; + const NewsItem *ni = GetStatusbarNews(); if (ni == nullptr) return true; /* Ticker message @@ -670,8 +678,7 @@ static bool ReadyForNextTickerItem() */ static bool ReadyForNextNewsItem() { - const NewsItem *ni = _forced_news == nullptr ? _current_news : _forced_news; - if (ni == nullptr) return true; + if (_forced_news == std::end(_news) && _current_news == std::end(_news)) return true; /* neither newsticker nor newspaper are running */ return (NewsWindow::duration <= 0 || FindWindowById(WC_NEWS_WINDOW, 0) == nullptr); @@ -680,116 +687,98 @@ static bool ReadyForNextNewsItem() /** Move to the next ticker item */ static void MoveToNextTickerItem() { + assert(!std::empty(_news)); + /* There is no status bar, so no reason to show news; * especially important with the end game screen when * there is no status bar but possible news. */ if (FindWindowById(WC_STATUS_BAR, 0) == nullptr) return; - /* if we're not at the last item, then move on */ - while (_statusbar_news_item != _latest_news) { - _statusbar_news_item = (_statusbar_news_item == nullptr) ? _oldest_news : _statusbar_news_item->next; - const NewsItem *ni = _statusbar_news_item; - const NewsType type = ni->type; + /* if we're not at the latest item, then move on */ + while (_statusbar_news != std::begin(_news)) { + --_statusbar_news; + const NewsType type = _statusbar_news->type; /* check the date, don't show too old items */ - if (_scaled_tick_counter - ni->creation_tick > _news_type_data[type].age * DAY_TICKS) continue; + if (_scaled_tick_counter - _statusbar_news->creation_tick > _news_type_data[type].age * DAY_TICKS) continue; switch (_news_type_data[type].GetDisplay()) { default: NOT_REACHED(); case ND_OFF: // Off - show nothing only a small reminder in the status bar InvalidateWindowData(WC_STATUS_BAR, 0, SBI_SHOW_REMINDER); - break; + return; case ND_SUMMARY: // Summary - show ticker - ShowTicker(ni); - break; + ShowTicker(_statusbar_news); + return; case ND_FULL: // Full - show newspaper, skipped here - continue; + break;; } - return; } } /** Move to the next news item */ static void MoveToNextNewsItem() { + assert(!std::empty(_news)); + /* There is no status bar, so no reason to show news; * especially important with the end game screen when * there is no status bar but possible news. */ if (FindWindowById(WC_STATUS_BAR, 0) == nullptr) return; CloseWindowById(WC_NEWS_WINDOW, 0); // close the newspapers window if shown - _forced_news = nullptr; + _forced_news = std::end(_news); - /* if we're not at the last item, then move on */ - while (_current_news != _latest_news) { - _current_news = (_current_news == nullptr) ? _oldest_news : _current_news->next; - const NewsItem *ni = _current_news; - const NewsType type = ni->type; + /* if we're not at the latest item, then move on */ + while (_current_news != std::begin(_news)) { + --_current_news; + const NewsType type = _current_news->type; /* check the date, don't show too old items */ - if (_scaled_tick_counter - ni->creation_tick > _news_type_data[type].age * DAY_TICKS) continue; + if (_scaled_tick_counter - _current_news->creation_tick > _news_type_data[type].age * DAY_TICKS) continue; switch (_news_type_data[type].GetDisplay()) { default: NOT_REACHED(); case ND_OFF: // Off - show nothing only a small reminder in the status bar, skipped here - continue; + break; case ND_SUMMARY: // Summary - show ticker, skipped here - continue; + break;; case ND_FULL: // Full - show newspaper - ShowNewspaper(ni); - break; + ShowNewspaper(&*_current_news); + return; } - return; } } /** Delete a news item from the queue */ -static void DeleteNewsItem(NewsItem *ni) +static std::list::iterator DeleteNewsItem(std::list::iterator ni) { - /* Delete the news from the news queue. */ - if (ni->prev != nullptr) { - ni->prev->next = ni->next; - } else { - assert(_oldest_news == ni); - _oldest_news = ni->next; - } - - if (ni->next != nullptr) { - ni->next->prev = ni->prev; - } else { - assert(_latest_news == ni); - _latest_news = ni->prev; - } - - _total_news--; - if (_forced_news == ni || _current_news == ni) { /* When we're the current news, go to the previous item first; * we just possibly made that the last news item. */ - if (_current_news == ni) _current_news = ni->prev; + if (_current_news == ni) _current_news = (_current_news == std::begin(_news)) ? std::end(_news) : std::prev(_current_news); /* About to remove the currently forced item (shown as newspapers) || * about to remove the currently displayed item (newspapers) */ MoveToNextNewsItem(); } - if (_statusbar_news_item == ni) { + if (_statusbar_news == ni) { /* When we're the current news, go to the previous item first; * we just possibly made that the last news item. */ - _statusbar_news_item = ni->prev; + if (_statusbar_news == ni) _statusbar_news = (_statusbar_news == std::begin(_news)) ? std::end(_news) : std::prev(_statusbar_news); /* About to remove the currently displayed item (ticker, or just a reminder) */ InvalidateWindowData(WC_STATUS_BAR, 0, SBI_NEWS_DELETED); // invalidate the statusbar MoveToNextTickerItem(); } - delete ni; - - SetWindowDirty(WC_MESSAGE_HISTORY, 0); + /* Delete the news from the news queue. */ + return _news.erase(ni); } /** @@ -831,27 +820,14 @@ void AddNewsItem(StringID string, NewsType type, NewsFlag flags, NewsReferenceTy if (_game_mode == GM_MENU) return; /* Create new news item node */ - NewsItem *ni = new NewsItem(string, type, flags, reftype1, ref1, reftype2, ref2, data); - - if (_total_news++ == 0) { - assert(_oldest_news == nullptr); - _oldest_news = ni; - ni->prev = nullptr; - } else { - assert(_latest_news->next == nullptr); - _latest_news->next = ni; - ni->prev = _latest_news; - } - - ni->next = nullptr; - _latest_news = ni; + _news.emplace_front(string, type, flags, reftype1, ref1, reftype2, ref2, data); /* Keep the number of stored news items to a managable number */ - if (_total_news > MAX_NEWS_AMOUNT) { - DeleteNewsItem(_oldest_news); + if (std::size(_news) > MAX_NEWS_AMOUNT) { + DeleteNewsItem(std::prev(std::end(_news))); } - SetWindowDirty(WC_MESSAGE_HISTORY, 0); + InvalidateWindowData(WC_MESSAGE_HISTORY, 0); } /** @@ -918,6 +894,29 @@ CommandCost CmdCustomNewsItem(TileIndex tile, DoCommandFlag flags, uint32_t p1, return CommandCost(); } +/** + * Delete news items by predicate, and invalidate the message history if necessary. + * @tparam Tmin Stop if the number of news items remaining reaches \a min items. + * @tparam Tpredicate Condition for a news item to be deleted. + */ +template +void DeleteNews(Tpredicate predicate) +{ + bool dirty = false; + for (auto it = std::rbegin(_news); it != std::rend(_news); /* nothing */) { + if constexpr (Tmin > 0) { + if (std::size(_news) <= Tmin) break; + } + if (predicate(*it)) { + it = std::make_reverse_iterator(DeleteNewsItem(std::prev(it.base()))); + dirty = true; + } else { + ++it; + } + } + if (dirty) InvalidateWindowData(WC_MESSAGE_HISTORY, 0); +} + /** * Delete a news item type about a vehicle. * When the news item type is INVALID_STRING_ID all news about the vehicle gets deleted. @@ -926,16 +925,9 @@ CommandCost CmdCustomNewsItem(TileIndex tile, DoCommandFlag flags, uint32_t p1, */ void DeleteVehicleNews(VehicleID vid, StringID news) { - NewsItem *ni = _oldest_news; - - while (ni != nullptr) { - NewsItem *next = ni->next; - if (((ni->reftype1 == NR_VEHICLE && ni->ref1 == vid) || (ni->reftype2 == NR_VEHICLE && ni->ref2 == vid)) && - (news == INVALID_STRING_ID || ni->string_id == news)) { - DeleteNewsItem(ni); - } - ni = next; - } + DeleteNews([&](const auto &ni) { + return ((ni.reftype1 == NR_VEHICLE && ni.ref1 == vid) || (ni.reftype2 == NR_VEHICLE && ni.ref2 == vid)) && (news == INVALID_STRING_ID || ni.string_id == news); + }); } /** @@ -945,15 +937,9 @@ void DeleteVehicleNews(VehicleID vid, StringID news) */ void DeleteStationNews(StationID sid) { - NewsItem *ni = _oldest_news; - - while (ni != nullptr) { - NewsItem *next = ni->next; - if ((ni->reftype1 == NR_STATION && ni->ref1 == sid) || (ni->reftype2 == NR_STATION && ni->ref2 == sid)) { - DeleteNewsItem(ni); - } - ni = next; - } + DeleteNews([&](const auto &ni) { + return (ni.reftype1 == NR_STATION && ni.ref1 == sid) || (ni.reftype2 == NR_STATION && ni.ref2 == sid); + }); } /** @@ -962,15 +948,9 @@ void DeleteStationNews(StationID sid) */ void DeleteIndustryNews(IndustryID iid) { - NewsItem *ni = _oldest_news; - - while (ni != nullptr) { - NewsItem *next = ni->next; - if ((ni->reftype1 == NR_INDUSTRY && ni->ref1 == iid) || (ni->reftype2 == NR_INDUSTRY && ni->ref2 == iid)) { - DeleteNewsItem(ni); - } - ni = next; - } + DeleteNews([&](const auto &ni) { + return (ni.reftype1 == NR_INDUSTRY && ni.ref1 == iid) || (ni.reftype2 == NR_INDUSTRY && ni.ref2 == iid); + }); } /** @@ -978,25 +958,17 @@ void DeleteIndustryNews(IndustryID iid) */ void DeleteInvalidEngineNews() { - NewsItem *ni = _oldest_news; - - while (ni != nullptr) { - NewsItem *next = ni->next; - if ((ni->reftype1 == NR_ENGINE && (!Engine::IsValidID(ni->ref1) || !Engine::Get(ni->ref1)->IsEnabled())) || - (ni->reftype2 == NR_ENGINE && (!Engine::IsValidID(ni->ref2) || !Engine::Get(ni->ref2)->IsEnabled()))) { - DeleteNewsItem(ni); - } - ni = next; - } + DeleteNews([](const auto &ni) { + return (ni.reftype1 == NR_ENGINE && (!Engine::IsValidID(ni.ref1) || !Engine::Get(ni.ref1)->IsEnabled())) || + (ni.reftype2 == NR_ENGINE && (!Engine::IsValidID(ni.ref2) || !Engine::Get(ni.ref2)->IsEnabled())); + }); } static void RemoveOldNewsItems() { - NewsItem *next; - for (NewsItem *cur = _oldest_news; _total_news > MIN_NEWS_AMOUNT && cur != nullptr; cur = next) { - next = cur->next; - if (_scaled_tick_counter - cur->creation_tick > (uint)(_news_type_data[cur->type].age * _settings_client.gui.news_message_timeout * DAY_TICKS)) DeleteNewsItem(cur); - } + DeleteNews([](const auto &ni) { + return _scaled_tick_counter - ni.creation_tick > (uint)(_news_type_data[ni.type].age * _settings_client.gui.news_message_timeout * DAY_TICKS); + }); } /** @@ -1007,17 +979,17 @@ static void RemoveOldNewsItems() */ void ChangeVehicleNews(VehicleID from_index, VehicleID to_index) { - for (NewsItem *ni = _oldest_news; ni != nullptr; ni = ni->next) { - if (ni->reftype1 == NR_VEHICLE && ni->ref1 == from_index) ni->ref1 = to_index; - if (ni->reftype2 == NR_VEHICLE && ni->ref2 == from_index) ni->ref2 = to_index; - if (ni->flags & NF_VEHICLE_PARAM0 && ni->params[0].data == from_index) ni->params[0] = to_index; + for (auto &ni : _news) { + if (ni.reftype1 == NR_VEHICLE && ni.ref1 == from_index) ni.ref1 = to_index; + if (ni.reftype2 == NR_VEHICLE && ni.ref2 == from_index) ni.ref2 = to_index; + if (ni.flags & NF_VEHICLE_PARAM0 && ni.params[0].data == from_index) ni.params[0] = to_index; } } void NewsLoop() { /* no news item yet */ - if (_total_news == 0) return; + if (std::empty(_news)) return; static uint8_t _last_clean_month = 0; @@ -1031,9 +1003,9 @@ void NewsLoop() } /** Do a forced show of a specific message */ -static void ShowNewsMessage(const NewsItem *ni) +static void ShowNewsMessage(NewsIterator ni) { - assert(_total_news != 0); + assert(!std::empty(_news)); /* Delete the news window */ CloseWindowById(WC_NEWS_WINDOW, 0); @@ -1041,9 +1013,9 @@ static void ShowNewsMessage(const NewsItem *ni) /* setup forced news item */ _forced_news = ni; - if (_forced_news != nullptr) { + if (_forced_news != std::end(_news)) { CloseWindowById(WC_NEWS_WINDOW, 0); - ShowNewspaper(ni); + ShowNewspaper(&*ni); } } @@ -1062,26 +1034,26 @@ bool HideActiveNewsMessage() /** Show previous news item */ void ShowLastNewsMessage() { - const NewsItem *ni = nullptr; - if (_total_news == 0) { - return; - } else if (_forced_news == nullptr) { + if (std::empty(_news)) return; + + NewsIterator ni; + if (_forced_news == std::end(_news)) { /* Not forced any news yet, show the current one, unless a news window is * open (which can only be the current one), then show the previous item */ - if (_current_news == nullptr) { + if (_current_news == std::end(_news)) { /* No news were shown yet resp. the last shown one was already deleted. - * Threat this as if _forced_news reached _oldest_news; so, wrap around and start anew with the latest. */ - ni = _latest_news; + * Treat this as if _forced_news reached the oldest news; so, wrap around and start anew with the latest. */ + ni = std::begin(_news); } else { const Window *w = FindWindowById(WC_NEWS_WINDOW, 0); - ni = (w == nullptr || (_current_news == _oldest_news)) ? _current_news : _current_news->prev; + ni = (w == nullptr || (std::next(_current_news) == std::end(_news))) ? _current_news : std::next(_current_news); } - } else if (_forced_news == _oldest_news) { + } else if (std::next(_forced_news) == std::end(_news)) { /* We have reached the oldest news, start anew with the latest */ - ni = _latest_news; + ni = std::begin(_news); } else { /* 'Scrolling' through news history show each one in turn */ - ni = _forced_news->prev; + ni = std::next(_forced_news); } bool wrap = false; for (;;) { @@ -1090,11 +1062,11 @@ void ShowLastNewsMessage() break; } - ni = ni->prev; - if (ni == nullptr) { + ++ni; + if (ni == std::end(_news)) { if (wrap) break; /* We have reached the oldest news, start anew with the latest */ - ni = _latest_news; + ni = std::begin(_news); wrap = true; } } @@ -1151,37 +1123,23 @@ struct MessageHistoryWindow : Window { } } - void OnPaint() override - { - this->OnInvalidateData(0); - this->DrawWidgets(); - } - void DrawWidget(const Rect &r, WidgetID widget) const override { - if (widget != WID_MH_BACKGROUND || _total_news == 0) return; - - /* Find the first news item to display. */ - NewsItem *ni = _latest_news; - for (int n = this->vscroll->GetPosition(); n > 0; n--) { - ni = ni->prev; - if (ni == nullptr) return; - } + if (widget != WID_MH_BACKGROUND || std::empty(_news)) return; /* Fill the widget with news items. */ bool rtl = _current_text_dir == TD_RTL; Rect news = r.Shrink(WidgetDimensions::scaled.framerect).Indent(this->date_width + WidgetDimensions::scaled.hsep_wide, rtl); Rect date = r.Shrink(WidgetDimensions::scaled.framerect).WithWidth(this->date_width, rtl); int y = news.top; - for (int n = this->vscroll->GetCapacity(); n > 0; n--) { + + auto [first, last] = this->vscroll->GetVisibleRangeIterators(_news); + for (auto ni = first; ni != last; ++ni) { SetDParam(0, ni->date); DrawString(date.left, date.right, y, STR_JUST_DATE_TINY, TC_WHITE); - DrawNewsString(news.left, news.right, y, TC_WHITE, ni); + DrawNewsString(news.left, news.right, y, TC_WHITE, &*ni); y += this->line_height; - - ni = ni->prev; - if (ni == nullptr) return; } } @@ -1193,19 +1151,18 @@ struct MessageHistoryWindow : Window { void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override { if (!gui_scope) return; - this->vscroll->SetCount(_total_news); + this->vscroll->SetCount(std::size(_news)); } void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override { if (widget == WID_MH_BACKGROUND) { - NewsItem *ni = _latest_news; - if (ni == nullptr) return; - - for (int n = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_MH_BACKGROUND, WidgetDimensions::scaled.framerect.top); n > 0; n--) { - ni = ni->prev; - if (ni == nullptr) return; - } + /* Scheduled window invalidations currently occur after the input loop, which means the scrollbar count + * could be invalid, so ensure it's correct now. Potentially this means that item clicked on might be + * different as well. */ + this->vscroll->SetCount(std::size(_news)); + auto ni = this->vscroll->GetScrolledItemFromWidget(_news, pt.y, this, widget); + if (ni == std::end(_news)) return; ShowNewsMessage(ni); } diff --git a/src/news_gui.h b/src/news_gui.h index 059d51ad32..c7fea6cebd 100644 --- a/src/news_gui.h +++ b/src/news_gui.h @@ -16,6 +16,6 @@ void ShowLastNewsMessage(); void ShowMessageHistory(); bool HideActiveNewsMessage(); -extern NewsItem *_latest_news; +const NewsContainer &GetNews(); #endif /* NEWS_GUI_H */ diff --git a/src/news_type.h b/src/news_type.h index d65b938e9d..a9da12f4be 100644 --- a/src/news_type.h +++ b/src/news_type.h @@ -15,6 +15,7 @@ #include "gfx_type.h" #include "strings_type.h" #include "sound_type.h" +#include #include /** @@ -126,8 +127,6 @@ struct NewsAllocatedData { /** Information about a single item of news. */ struct NewsItem { - NewsItem *prev; ///< Previous news item - NewsItem *next; ///< Next news item StringID string_id; ///< Message text CalTime::Date date; ///< Date of the news uint64_t creation_tick; ///< Tick when news was created @@ -169,4 +168,7 @@ struct CompanyNewsInformation : NewsAllocatedData { CompanyNewsInformation(const struct Company *c, const struct Company *other = nullptr); }; +using NewsContainer = std::list; ///< Container type for storing news items. +using NewsIterator = NewsContainer::const_iterator; ///< Iterator type for news items. + #endif /* NEWS_TYPE_H */ diff --git a/src/openttd.cpp b/src/openttd.cpp index 2381a491bc..6cfb3aaf25 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -1049,7 +1049,7 @@ int openttd_main(int argc, char *argv[]) InitializeSpriteSorter(); /* Initialize the zoom level of the screen to normal */ - _screen.zoom = ZOOM_LVL_NORMAL; + _screen.zoom = ZOOM_LVL_MIN; /* The video driver is now selected, now initialise GUI zoom */ AdjustGUIZoom(AGZM_STARTUP); diff --git a/src/order_gui.cpp b/src/order_gui.cpp index d3287cc29b..8ffe71bfb4 100644 --- a/src/order_gui.cpp +++ b/src/order_gui.cpp @@ -2885,15 +2885,15 @@ public: if (order == nullptr) break; DropDownList list; - list.push_back(std::make_unique(STR_ORDER_DUPLICATE_ORDER, 0, false)); - if (order->IsType(OT_CONDITIONAL)) list.push_back(std::make_unique(STR_ORDER_CHANGE_JUMP_TARGET, 1, false)); + list.push_back(MakeDropDownListStringItem(STR_ORDER_DUPLICATE_ORDER, 0, false)); + if (order->IsType(OT_CONDITIONAL)) list.push_back(MakeDropDownListStringItem(STR_ORDER_CHANGE_JUMP_TARGET, 1, false)); if (this->vehicle->type == VEH_TRAIN && order->IsType(OT_GOTO_STATION) && (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) == 0) { const OrderStopLocation osl = order->GetStopLocation(); - list.push_back(std::make_unique(-1, false)); - list.push_back(std::make_unique(osl == OSL_PLATFORM_NEAR_END, STR_ORDER_STOP_LOCATION_NEAR_END, 0x200 + OSL_PLATFORM_NEAR_END, false)); - list.push_back(std::make_unique(osl == OSL_PLATFORM_MIDDLE, STR_ORDER_STOP_LOCATION_MIDDLE, 0x200 + OSL_PLATFORM_MIDDLE, false)); - list.push_back(std::make_unique(osl == OSL_PLATFORM_FAR_END, STR_ORDER_STOP_LOCATION_FAR_END, 0x200 + OSL_PLATFORM_FAR_END, false)); + list.push_back(MakeDropDownListDividerItem()); + list.push_back(MakeDropDownListCheckedItem(osl == OSL_PLATFORM_NEAR_END, STR_ORDER_STOP_LOCATION_NEAR_END, 0x200 + OSL_PLATFORM_NEAR_END, false)); + list.push_back(MakeDropDownListCheckedItem(osl == OSL_PLATFORM_MIDDLE, STR_ORDER_STOP_LOCATION_MIDDLE, 0x200 + OSL_PLATFORM_MIDDLE, false)); + list.push_back(MakeDropDownListCheckedItem(osl == OSL_PLATFORM_FAR_END, STR_ORDER_STOP_LOCATION_FAR_END, 0x200 + OSL_PLATFORM_FAR_END, false)); if (osl == OSL_PLATFORM_THROUGH || _settings_client.gui.show_adv_load_mode_features) { bool allowed = _settings_client.gui.show_adv_load_mode_features; if (allowed) { @@ -2905,28 +2905,28 @@ public: } } } - list.push_back(std::make_unique(osl == OSL_PLATFORM_THROUGH, STR_ORDER_STOP_LOCATION_THROUGH, 0x200 + OSL_PLATFORM_THROUGH, !allowed)); + list.push_back(MakeDropDownListCheckedItem(osl == OSL_PLATFORM_THROUGH, STR_ORDER_STOP_LOCATION_THROUGH, 0x200 + OSL_PLATFORM_THROUGH, !allowed)); } } if (this->vehicle->type == VEH_ROAD && (order->IsType(OT_GOTO_STATION) || order->IsType(OT_GOTO_WAYPOINT)) && _settings_game.pf.pathfinder_for_roadvehs == VPF_YAPF) { const DiagDirection dir = order->GetRoadVehTravelDirection(); if (_settings_client.gui.show_adv_load_mode_features || dir != INVALID_DIAGDIR) { - list.push_back(std::make_unique(-1, false)); - list.push_back(std::make_unique(dir == INVALID_DIAGDIR, STR_ORDER_RV_DIR_ANY, 0x300 + INVALID_DIAGDIR, false)); - list.push_back(std::make_unique(dir == DIAGDIR_NE, STR_ORDER_RV_DIR_NE, 0x300 + DIAGDIR_NE, false)); - list.push_back(std::make_unique(dir == DIAGDIR_SE, STR_ORDER_RV_DIR_SE, 0x300 + DIAGDIR_SE, false)); - list.push_back(std::make_unique(dir == DIAGDIR_SW, STR_ORDER_RV_DIR_SW, 0x300 + DIAGDIR_SW, false)); - list.push_back(std::make_unique(dir == DIAGDIR_NW, STR_ORDER_RV_DIR_NW, 0x300 + DIAGDIR_NW, false)); + list.push_back(MakeDropDownListDividerItem()); + list.push_back(MakeDropDownListCheckedItem(dir == INVALID_DIAGDIR, STR_ORDER_RV_DIR_ANY, 0x300 + INVALID_DIAGDIR, false)); + list.push_back(MakeDropDownListCheckedItem(dir == DIAGDIR_NE, STR_ORDER_RV_DIR_NE, 0x300 + DIAGDIR_NE, false)); + list.push_back(MakeDropDownListCheckedItem(dir == DIAGDIR_SE, STR_ORDER_RV_DIR_SE, 0x300 + DIAGDIR_SE, false)); + list.push_back(MakeDropDownListCheckedItem(dir == DIAGDIR_SW, STR_ORDER_RV_DIR_SW, 0x300 + DIAGDIR_SW, false)); + list.push_back(MakeDropDownListCheckedItem(dir == DIAGDIR_NW, STR_ORDER_RV_DIR_NW, 0x300 + DIAGDIR_NW, false)); } } if (!order->IsType(OT_IMPLICIT)) { - list.push_back(std::make_unique(-1, false)); + list.push_back(MakeDropDownListDividerItem()); const Colours current_colour = order->GetColour(); - list.push_back(std::make_unique(current_colour == INVALID_COLOUR, STR_COLOUR_DEFAULT, 0x100 + INVALID_COLOUR, false)); + list.push_back(MakeDropDownListCheckedItem(current_colour == INVALID_COLOUR, STR_COLOUR_DEFAULT, 0x100 + INVALID_COLOUR, false)); auto add_colour = [&](Colours colour) { - list.push_back(std::make_unique(current_colour == colour, STR_COLOUR_DARK_BLUE + colour, 0x100 + colour, false)); + list.push_back(MakeDropDownListCheckedItem(current_colour == colour, STR_COLOUR_DARK_BLUE + colour, 0x100 + colour, false)); }; add_colour(COLOUR_YELLOW); add_colour(COLOUR_LIGHT_BLUE); @@ -2985,17 +2985,17 @@ public: } } DropDownList list; - list.push_back(std::make_unique(STR_ORDER_GO_TO, ODDI_GO_TO, false)); - list.push_back(std::make_unique((this->vehicle->type == VEH_AIRCRAFT) ? STR_ORDER_GO_TO_NEAREST_HANGAR : STR_ORDER_GO_TO_NEAREST_DEPOT, ODDI_GO_TO_NEAREST_DEPOT, false)); - list.push_back(std::make_unique(STR_ORDER_CONDITIONAL, ODDI_CONDITIONAL, false)); - list.push_back(std::make_unique(STR_ORDER_SHARE, ODDI_SHARE, false)); - list.push_back(std::make_unique(STR_ORDER_TRY_ACQUIRE_SLOT_BUTTON, ODDI_TRY_ACQUIRE_SLOT, false)); - list.push_back(std::make_unique(STR_ORDER_RELEASE_SLOT_BUTTON, ODDI_RELEASE_SLOT, false)); + list.push_back(MakeDropDownListStringItem(STR_ORDER_GO_TO, ODDI_GO_TO, false)); + list.push_back(MakeDropDownListStringItem((this->vehicle->type == VEH_AIRCRAFT) ? STR_ORDER_GO_TO_NEAREST_HANGAR : STR_ORDER_GO_TO_NEAREST_DEPOT, ODDI_GO_TO_NEAREST_DEPOT, false)); + list.push_back(MakeDropDownListStringItem(STR_ORDER_CONDITIONAL, ODDI_CONDITIONAL, false)); + list.push_back(MakeDropDownListStringItem(STR_ORDER_SHARE, ODDI_SHARE, false)); + list.push_back(MakeDropDownListStringItem(STR_ORDER_TRY_ACQUIRE_SLOT_BUTTON, ODDI_TRY_ACQUIRE_SLOT, false)); + list.push_back(MakeDropDownListStringItem(STR_ORDER_RELEASE_SLOT_BUTTON, ODDI_RELEASE_SLOT, false)); if (show_counters) { - list.push_back(std::make_unique(STR_ORDER_CHANGE_COUNTER_BUTTON, ODDI_CHANGE_COUNTER, false)); + list.push_back(MakeDropDownListStringItem(STR_ORDER_CHANGE_COUNTER_BUTTON, ODDI_CHANGE_COUNTER, false)); } - list.push_back(std::make_unique(STR_ORDER_LABEL_TEXT_BUTTON, ODDI_LABEL_TEXT, false)); - list.push_back(std::make_unique(STR_ORDER_LABEL_DEPARTURES_VIA_BUTTON, ODDI_LABEL_DEPARTURES_VIA, false)); + list.push_back(MakeDropDownListStringItem(STR_ORDER_LABEL_TEXT_BUTTON, ODDI_LABEL_TEXT, false)); + list.push_back(MakeDropDownListStringItem(STR_ORDER_LABEL_DEPARTURES_VIA_BUTTON, ODDI_LABEL_DEPARTURES_VIA, false)); ShowDropDownList(this, std::move(list), sel, WID_O_GOTO, 0, DDMF_NONE, DDSF_SHARED); } @@ -3073,9 +3073,9 @@ public: const DispatchSchedule &ds = this->vehicle->orders->GetDispatchScheduleByIndex(i); if (ds.ScheduleName().empty()) { SetDParam(0, i + 1); - list.emplace_back(new DropDownListStringItem(STR_TIMETABLE_ASSIGN_SCHEDULE_ID, i, false)); + list.push_back(MakeDropDownListStringItem(STR_TIMETABLE_ASSIGN_SCHEDULE_ID, i, false)); } else { - list.emplace_back(new DropDownListStringItem(ds.ScheduleName(), i, false)); + list.push_back(MakeDropDownListStringItem(ds.ScheduleName(), i, false)); } } if (!list.empty()) ShowDropDownList(this, std::move(list), selected, WID_O_COND_SCHED_SELECT, 0); @@ -3104,7 +3104,7 @@ public: DropDownList list; for (size_t i = 0; i < _sorted_standard_cargo_specs.size(); ++i) { const CargoSpec *cs = _sorted_cargo_specs[i]; - list.emplace_back(new DropDownListStringItem(cs->name, cs->Index(), false)); + list.push_back(MakeDropDownListStringItem(cs->name, cs->Index(), false)); } if (!list.empty()) ShowDropDownList(this, std::move(list), value, widget, 0); break; @@ -3149,7 +3149,7 @@ public: continue; } } - list.push_back(std::make_unique(OrderStringForVariable(this->vehicle, _order_conditional_variable[i]), _order_conditional_variable[i], false)); + list.push_back(MakeDropDownListStringItem(OrderStringForVariable(this->vehicle, _order_conditional_variable[i]), _order_conditional_variable[i], false)); } ShowDropDownList(this, std::move(list), ocv, WID_O_COND_VARIABLE); break; @@ -3164,11 +3164,11 @@ public: const int false_cond = ((int)OCC_IS_FALSE) << 16; int first_last_value = 0; SB(first_last_value, ODCB_MODE_START, ODCB_MODE_COUNT, ODCM_FIRST_LAST); - list.emplace_back(new DropDownListStringItem(STR_ORDER_CONDITIONAL_COMPARATOR_DISPATCH_SLOT_IS_FIRST, true_cond | first_last_value, false)); - list.emplace_back(new DropDownListStringItem(STR_ORDER_CONDITIONAL_COMPARATOR_DISPATCH_SLOT_IS_NOT_FIRST, false_cond | first_last_value, false)); + list.push_back(MakeDropDownListStringItem(STR_ORDER_CONDITIONAL_COMPARATOR_DISPATCH_SLOT_IS_FIRST, true_cond | first_last_value, false)); + list.push_back(MakeDropDownListStringItem(STR_ORDER_CONDITIONAL_COMPARATOR_DISPATCH_SLOT_IS_NOT_FIRST, false_cond | first_last_value, false)); SetBit(first_last_value, ODFLCB_LAST_SLOT); - list.emplace_back(new DropDownListStringItem(STR_ORDER_CONDITIONAL_COMPARATOR_DISPATCH_SLOT_IS_LAST, true_cond | first_last_value, false)); - list.emplace_back(new DropDownListStringItem(STR_ORDER_CONDITIONAL_COMPARATOR_DISPATCH_SLOT_IS_NOT_LAST, false_cond | first_last_value, false)); + list.push_back(MakeDropDownListStringItem(STR_ORDER_CONDITIONAL_COMPARATOR_DISPATCH_SLOT_IS_LAST, true_cond | first_last_value, false)); + list.push_back(MakeDropDownListStringItem(STR_ORDER_CONDITIONAL_COMPARATOR_DISPATCH_SLOT_IS_NOT_LAST, false_cond | first_last_value, false)); uint16_t slot_flags = 0; uint schedule_index = GB(o->GetXData(), 0, 16); @@ -3185,8 +3185,8 @@ public: SB(tag_cond_value, ODCB_MODE_START, ODCB_MODE_COUNT, OCDM_TAG); SB(tag_cond_value, ODFLCB_TAG_START, ODFLCB_TAG_COUNT, tag); SetDParam(0, tag + 1); - list.emplace_back(new DropDownListStringItem(STR_ORDER_CONDITIONAL_COMPARATOR_DISPATCH_SLOT_HAS_TAG, true_cond | tag_cond_value, false)); - list.emplace_back(new DropDownListStringItem(STR_ORDER_CONDITIONAL_COMPARATOR_DISPATCH_SLOT_DOESNT_HAVE_TAG, false_cond | tag_cond_value, false)); + list.push_back(MakeDropDownListStringItem(STR_ORDER_CONDITIONAL_COMPARATOR_DISPATCH_SLOT_HAS_TAG, true_cond | tag_cond_value, false)); + list.push_back(MakeDropDownListStringItem(STR_ORDER_CONDITIONAL_COMPARATOR_DISPATCH_SLOT_DOESNT_HAVE_TAG, false_cond | tag_cond_value, false)); } } @@ -3280,9 +3280,9 @@ public: case WID_O_COUNTER_OP: { DropDownList list; - list.emplace_back(new DropDownListStringItem(STR_TRACE_RESTRICT_COUNTER_INCREASE, 0, false)); - list.emplace_back(new DropDownListStringItem(STR_TRACE_RESTRICT_COUNTER_DECREASE, 1, false)); - list.emplace_back(new DropDownListStringItem(STR_TRACE_RESTRICT_COUNTER_SET, 2, false)); + list.push_back(MakeDropDownListStringItem(STR_TRACE_RESTRICT_COUNTER_INCREASE, 0, false)); + list.push_back(MakeDropDownListStringItem(STR_TRACE_RESTRICT_COUNTER_DECREASE, 1, false)); + list.push_back(MakeDropDownListStringItem(STR_TRACE_RESTRICT_COUNTER_SET, 2, false)); int selected = this->vehicle->GetOrder(this->OrderGetSel())->GetCounterOperation(); ShowDropDownList(this, std::move(list), selected, WID_O_COUNTER_OP, 0); break; @@ -3314,8 +3314,8 @@ public: case WID_O_DEPARTURE_VIA_TYPE: { DropDownList list; - list.emplace_back(new DropDownListStringItem(STR_ORDER_LABEL_DEPARTURES_SHOW_AS_VIA, OLST_DEPARTURES_VIA, false)); - list.emplace_back(new DropDownListStringItem(STR_ORDER_LABEL_DEPARTURES_REMOVE_VIA, OLST_DEPARTURES_REMOVE_VIA, false)); + list.push_back(MakeDropDownListStringItem(STR_ORDER_LABEL_DEPARTURES_SHOW_AS_VIA, OLST_DEPARTURES_VIA, false)); + list.push_back(MakeDropDownListStringItem(STR_ORDER_LABEL_DEPARTURES_REMOVE_VIA, OLST_DEPARTURES_REMOVE_VIA, false)); int selected = this->vehicle->GetOrder(this->OrderGetSel())->GetLabelSubType(); ShowDropDownList(this, std::move(list), selected, WID_O_DEPARTURE_VIA_TYPE, 0); break; diff --git a/src/os/macosx/font_osx.cpp b/src/os/macosx/font_osx.cpp index 21bd16753c..5d9a7eea91 100644 --- a/src/os/macosx/font_osx.cpp +++ b/src/os/macosx/font_osx.cpp @@ -244,8 +244,8 @@ const Sprite *CoreTextFontCache::InternalGetGlyph(GlyphID key, bool use_aa) if (width > MAX_GLYPH_DIM || height > MAX_GLYPH_DIM) usererror("Font glyph is too large"); SpriteLoader::SpriteCollection spritecollection; - SpriteLoader::Sprite &sprite = spritecollection[ZOOM_LVL_NORMAL]; - sprite.AllocateData(ZOOM_LVL_NORMAL, width * height); + SpriteLoader::Sprite &sprite = spritecollection[ZOOM_LVL_MIN]; + sprite.AllocateData(ZOOM_LVL_MIN, width * height); sprite.type = SpriteType::Font; sprite.colours = (use_aa ? SCC_PAL | SCC_ALPHA : SCC_PAL); sprite.width = width; diff --git a/src/os/windows/font_win32.cpp b/src/os/windows/font_win32.cpp index 55424611f8..d8ebfaeb47 100644 --- a/src/os/windows/font_win32.cpp +++ b/src/os/windows/font_win32.cpp @@ -229,8 +229,8 @@ void Win32FontCache::ClearFontCache() /* GDI has rendered the glyph, now we allocate a sprite and copy the image into it. */ SpriteLoader::SpriteCollection spritecollection; - SpriteLoader::Sprite &sprite = spritecollection[ZOOM_LVL_NORMAL]; - sprite.AllocateData(ZOOM_LVL_NORMAL, width * height); + SpriteLoader::Sprite &sprite = spritecollection[ZOOM_LVL_MIN]; + sprite.AllocateData(ZOOM_LVL_MIN, width * height); sprite.type = SpriteType::Font; sprite.colours = (aa ? SCC_PAL | SCC_ALPHA : SCC_PAL); sprite.width = width; diff --git a/src/plans.cpp b/src/plans.cpp index b19181e2f7..89e9efcaf2 100644 --- a/src/plans.cpp +++ b/src/plans.cpp @@ -47,8 +47,8 @@ void PlanLine::UpdateVisualExtents() if (y > max_y) max_y = y; } - this->viewport_extents = { (int)(min_x * TILE_SIZE * 2 * ZOOM_LVL_BASE), (int)(min_y * TILE_SIZE * ZOOM_LVL_BASE), - (int)((max_x + 1) * TILE_SIZE * 2 * ZOOM_LVL_BASE), (int)((max_y + 1) * TILE_SIZE * ZOOM_LVL_BASE) }; + this->viewport_extents = { (int)(min_x * TILE_SIZE * 2 * ZOOM_BASE), (int)(min_y * TILE_SIZE * ZOOM_BASE), + (int)((max_x + 1) * TILE_SIZE * 2 * ZOOM_BASE), (int)((max_y + 1) * TILE_SIZE * ZOOM_BASE) }; } bool Plan::ValidateNewLine() diff --git a/src/plans_gui.cpp b/src/plans_gui.cpp index fc88b8a3fc..ea15bb18f6 100644 --- a/src/plans_gui.cpp +++ b/src/plans_gui.cpp @@ -15,6 +15,7 @@ #include "company_base.h" #include "company_gui.h" #include "settings_gui.h" +#include "dropdown_func.h" #include "window_gui.h" #include "window_func.h" #include "viewport_func.h" @@ -172,7 +173,7 @@ struct PlansWindow : Window { if (_current_plan) { DropDownList list; auto add_colour = [&](Colours colour) { - list.emplace_back(new DropDownListStringItem(STR_COLOUR_DARK_BLUE + colour, colour, false)); + list.push_back(MakeDropDownListStringItem(STR_COLOUR_DARK_BLUE + colour, colour, false)); }; add_colour(COLOUR_WHITE); add_colour(COLOUR_YELLOW); diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index 3c9a2898cc..be75995918 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -3991,7 +3991,7 @@ static void DrawTile_Track(TileInfo *ti, DrawTileProcParams params) _drawtile_track_palette = COMPANY_SPRITE_COLOUR(GetTileOwner(ti->tile)); if (IsPlainRail(ti->tile)) { - if (!IsBridgeAbove(ti->tile) && params.min_visible_height > std::max(SIGNAL_DIRTY_TOP, (TILE_HEIGHT + BB_HEIGHT_UNDER_BRIDGE) * ZOOM_LVL_BASE) && !_signal_sprite_oversized) return; + if (!IsBridgeAbove(ti->tile) && params.min_visible_height > std::max(SIGNAL_DIRTY_TOP, (TILE_HEIGHT + BB_HEIGHT_UNDER_BRIDGE) * ZOOM_BASE) && !_signal_sprite_oversized) return; TrackBits rails = GetTrackBits(ti->tile); diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index 507dd11a97..5a6a260cc2 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -23,6 +23,7 @@ #include "sound_func.h" #include "company_func.h" #include "dropdown_type.h" +#include "dropdown_func.h" #include "tunnelbridge.h" #include "tilehighlight_func.h" #include "spritecache.h" @@ -2214,10 +2215,10 @@ public: case WID_BS_STYLE: { DropDownList list; - list.emplace_back(new DropDownListStringItem(STR_BUILD_SIGNAL_DEFAULT_STYLE, 0, false)); + list.push_back(MakeDropDownListStringItem(STR_BUILD_SIGNAL_DEFAULT_STYLE, 0, false)); for (uint i = 0; i < _num_new_signal_styles; i++) { if (HasBit(_enabled_new_signal_styles_mask, i + 1)) { - list.emplace_back(new DropDownListStringItem(_new_signal_styles[i].name, i + 1, false)); + list.push_back(MakeDropDownListStringItem(_new_signal_styles[i].name, i + 1, false)); } } ShowDropDownList(this, std::move(list), _cur_signal_style, widget); @@ -2844,7 +2845,7 @@ DropDownList GetRailTypeDropDownList(bool for_replacement, bool all_option) DropDownList list; if (all_option) { - list.push_back(std::make_unique(STR_REPLACE_ALL_RAILTYPE, INVALID_RAILTYPE, false)); + list.push_back(MakeDropDownListStringItem(STR_REPLACE_ALL_RAILTYPE, INVALID_RAILTYPE)); } Dimension d = { 0, 0 }; @@ -2866,16 +2867,16 @@ DropDownList GetRailTypeDropDownList(bool for_replacement, bool all_option) SetDParam(0, rti->strings.menu_text); SetDParam(1, rti->max_speed); if (for_replacement) { - list.push_back(std::make_unique(rti->strings.replace_text, rt, !HasBit(avail_railtypes, rt))); + list.push_back(MakeDropDownListStringItem(rti->strings.replace_text, rt, !HasBit(avail_railtypes, rt))); } else { StringID str = rti->max_speed > 0 ? STR_TOOLBAR_RAILTYPE_VELOCITY : STR_JUST_STRING; - list.push_back(std::make_unique(d, rti->gui_sprites.build_x_rail, PAL_NONE, str, rt, !HasBit(avail_railtypes, rt))); + list.push_back(MakeDropDownListIconItem(d, rti->gui_sprites.build_x_rail, PAL_NONE, str, rt, !HasBit(avail_railtypes, rt))); } } if (list.empty()) { /* Empty dropdowns are not allowed */ - list.push_back(std::make_unique(STR_NONE, INVALID_RAILTYPE, true)); + list.push_back(MakeDropDownListStringItem(STR_NONE, INVALID_RAILTYPE, true)); } return list; diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index c9b4b5b832..145d2f3459 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -2286,7 +2286,7 @@ void DrawRoadBitsTunnelBridge(TileInfo *ti) /** Tile callback function for rendering a road tile to the screen */ static void DrawTile_Road(TileInfo *ti, DrawTileProcParams params) { - if (!IsBridgeAbove(ti->tile) && GetRoadTileType(ti->tile) != ROAD_TILE_DEPOT && params.min_visible_height > (int)((TILE_HEIGHT + BB_HEIGHT_UNDER_BRIDGE) * ZOOM_LVL_BASE)) return; + if (!IsBridgeAbove(ti->tile) && GetRoadTileType(ti->tile) != ROAD_TILE_DEPOT && params.min_visible_height > (int)((TILE_HEIGHT + BB_HEIGHT_UNDER_BRIDGE) * ZOOM_BASE)) return; switch (GetRoadTileType(ti->tile)) { case ROAD_TILE_NORMAL: diff --git a/src/road_gui.cpp b/src/road_gui.cpp index d8d7ca54c4..663da869a4 100644 --- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -27,6 +27,8 @@ #include "hotkeys.h" #include "road_gui.h" #include "zoom_func.h" +#include "dropdown_type.h" +#include "dropdown_func.h" #include "engine_base.h" #include "strings_func.h" #include "core/geometry_func.hpp" @@ -2319,7 +2321,7 @@ DropDownList GetRoadTypeDropDownList(RoadTramTypes rtts, bool for_replacement, b DropDownList list; if (all_option) { - list.push_back(std::make_unique(STR_REPLACE_ALL_ROADTYPE, INVALID_ROADTYPE, false)); + list.push_back(MakeDropDownListStringItem(STR_REPLACE_ALL_ROADTYPE, INVALID_ROADTYPE)); } Dimension d = { 0, 0 }; @@ -2341,16 +2343,16 @@ DropDownList GetRoadTypeDropDownList(RoadTramTypes rtts, bool for_replacement, b SetDParam(0, rti->strings.menu_text); SetDParam(1, rti->max_speed / 2); if (for_replacement) { - list.push_back(std::make_unique(rti->strings.replace_text, rt, !HasBit(avail_roadtypes, rt))); + list.push_back(MakeDropDownListStringItem(rti->strings.replace_text, rt, !HasBit(avail_roadtypes, rt))); } else { StringID str = rti->max_speed > 0 ? STR_TOOLBAR_RAILTYPE_VELOCITY : STR_JUST_STRING; - list.push_back(std::make_unique(d, rti->gui_sprites.build_x_road, PAL_NONE, str, rt, !HasBit(avail_roadtypes, rt))); + list.push_back(MakeDropDownListIconItem(d, rti->gui_sprites.build_x_road, PAL_NONE, str, rt, !HasBit(avail_roadtypes, rt))); } } if (list.empty()) { /* Empty dropdowns are not allowed */ - list.push_back(std::make_unique(STR_NONE, INVALID_ROADTYPE, true)); + list.push_back(MakeDropDownListStringItem(STR_NONE, INVALID_ROADTYPE, true)); } return list; @@ -2383,12 +2385,12 @@ 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; - list.push_back(std::make_unique(d, rti->gui_sprites.build_x_road, PAL_NONE, str, rt, !HasBit(avail_roadtypes, rt))); + list.push_back(MakeDropDownListIconItem(d, rti->gui_sprites.build_x_road, PAL_NONE, str, rt, !HasBit(avail_roadtypes, rt))); } if (list.empty()) { /* Empty dropdowns are not allowed */ - list.push_back(std::make_unique(STR_NONE, -1, true)); + list.push_back(MakeDropDownListStringItem(STR_NONE, -1, true)); } return list; diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index f693658f30..1ec2a22a00 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -3325,9 +3325,9 @@ bool AfterLoadGame() if (IsSavegameVersionBefore(SLV_165)) { /* Adjust zoom level to account for new levels */ - _saved_scrollpos_zoom = static_cast(_saved_scrollpos_zoom + ZOOM_LVL_SHIFT); - _saved_scrollpos_x *= ZOOM_LVL_BASE; - _saved_scrollpos_y *= ZOOM_LVL_BASE; + _saved_scrollpos_zoom = static_cast(_saved_scrollpos_zoom + ZOOM_BASE_SHIFT); + _saved_scrollpos_x *= ZOOM_BASE; + _saved_scrollpos_y *= ZOOM_BASE; } /* When any NewGRF has been changed the availability of some vehicles might diff --git a/src/schdispatch_gui.cpp b/src/schdispatch_gui.cpp index 4c8649db06..d9d80fce07 100644 --- a/src/schdispatch_gui.cpp +++ b/src/schdispatch_gui.cpp @@ -26,6 +26,8 @@ #include "settings_type.h" #include "viewport_func.h" #include "zoom_func.h" +#include "dropdown_func.h" +#include "dropdown_common_type.h" #include "core/geometry_func.hpp" #include "tilehighlight_func.h" @@ -1040,7 +1042,7 @@ struct SchdispatchWindow : GeneralVehicleWindow { const DispatchSchedule &schedule = this->GetSelectedSchedule(); DropDownList list; auto add_item = [&](StringID string, int result) { - std::unique_ptr item(new DropDownListStringItem(string, result, false)); + std::unique_ptr item = std::make_unique(string, result, false); item->SetColourFlags(TC_FORCED); list.emplace_back(std::move(item)); }; @@ -1049,7 +1051,7 @@ struct SchdispatchWindow : GeneralVehicleWindow { add_item(STR_SCHDISPATCH_REMOVE_SCHEDULE, SCH_MD_REMOVE_SCHEDULE); add_item(STR_SCHDISPATCH_DUPLICATE_SCHEDULE, SCH_MD_DUPLICATE_SCHEDULE); add_item(STR_SCHDISPATCH_APPEND_VEHICLE_SCHEDULES, SCH_MD_APPEND_VEHICLE_SCHEDULES); - list.push_back(std::make_unique(schedule.GetScheduledDispatchReuseSlots(), STR_SCHDISPATCH_REUSE_DEPARTURE_SLOTS, SCH_MD_REUSE_DEPARTURE_SLOTS, false)); + list.push_back(MakeDropDownListCheckedItem(schedule.GetScheduledDispatchReuseSlots(), STR_SCHDISPATCH_REUSE_DEPARTURE_SLOTS, SCH_MD_REUSE_DEPARTURE_SLOTS, false)); ShowDropDownList(this, std::move(list), -1, WID_SCHDISPATCH_MANAGEMENT); break; } @@ -1105,7 +1107,7 @@ struct SchdispatchWindow : GeneralVehicleWindow { DropDownList list; auto add_item = [&](StringID str, uint bit, bool disabled) { - list.push_back(std::make_unique(HasBit(selected_slot->flags, bit), str, bit, disabled)); + list.push_back(MakeDropDownListCheckedItem(HasBit(selected_slot->flags, bit), str, bit, disabled)); }; add_item(STR_SCHDISPATCH_REUSE_THIS_DEPARTURE_SLOT, DispatchSlot::SDSF_REUSE_SLOT, schedule.GetScheduledDispatchReuseSlots()); for (uint8_t flag_bit = DispatchSlot::SDSF_FIRST_TAG; flag_bit <= DispatchSlot::SDSF_LAST_TAG; flag_bit++) { @@ -1515,7 +1517,7 @@ struct ScheduledDispatchAddSlotsWindow : Window { DropDownList list; for (uint i = 0; i < 24; i++) { SetDParam(0, i); - list.emplace_back(new DropDownListStringItem(STR_JUST_INT, i, false)); + list.push_back(MakeDropDownListStringItem(STR_JUST_INT, i, false)); } ShowDropDownList(this, std::move(list), current.ClockHour(), widget); }; @@ -1524,7 +1526,7 @@ struct ScheduledDispatchAddSlotsWindow : Window { DropDownList list; for (uint i = 0; i < 60; i++) { SetDParam(0, i); - list.emplace_back(new DropDownListStringItem(STR_JUST_INT, i, false)); + list.push_back(MakeDropDownListStringItem(STR_JUST_INT, i, false)); } ShowDropDownList(this, std::move(list), current.ClockMinute(), widget); }; diff --git a/src/script/script_gui.cpp b/src/script/script_gui.cpp index 791fc93612..a7469a6f07 100644 --- a/src/script/script_gui.cpp +++ b/src/script/script_gui.cpp @@ -15,9 +15,10 @@ #include "../stringfilter_type.h" #include "../company_base.h" #include "../company_gui.h" +#include "../dropdown_type.h" +#include "../dropdown_func.h" #include "../window_func.h" #include "../network/network.h" -#include "../dropdown_func.h" #include "../hotkeys.h" #include "../string_func.h" #include "../settings_type.h" @@ -483,7 +484,7 @@ struct ScriptSettingsWindow : public Window { DropDownList list; for (int i = config_item.min_value; i <= config_item.max_value; i++) { - list.push_back(std::make_unique(config_item.labels.find(i)->second, i, false)); + list.push_back(MakeDropDownListStringItem(config_item.labels.find(i)->second, i)); } ShowDropDownListAt(this, std::move(list), old_val, WID_SCRS_SETTING_DROPDOWN, wi_rect, COLOUR_ORANGE); diff --git a/src/settings.cpp b/src/settings.cpp index beeab2be1d..3c0c52cfdd 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -2981,7 +2981,7 @@ void LoadFromConfig(bool startup) if (FindWindowById(WC_ERRMSG, 0) == nullptr) ShowFirstError(); } else { PostTransparencyOptionLoad(); - if (_fallback_gui_zoom_max && _settings_client.gui.zoom_max <= ZOOM_LVL_OUT_32X) { + if (_fallback_gui_zoom_max && _settings_client.gui.zoom_max <= ZOOM_LVL_OUT_8X) { _settings_client.gui.zoom_max = ZOOM_LVL_MAX; } } diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 15229b7172..d7ab516cd3 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -21,6 +21,7 @@ #include "string_func.h" #include "dropdown_type.h" #include "dropdown_func.h" +#include "dropdown_common_type.h" #include "slider_func.h" #include "highscore.h" #include "base_media_base.h" @@ -134,6 +135,18 @@ void ShowBaseSetTextfileWindow(TextfileType file_type, const TBaseSet *baseset, new BaseSetTextfileWindow(file_type, baseset, content_type); } +template +DropDownList BuildSetDropDownList(int *selected_index) +{ + int n = T::GetNumSets(); + *selected_index = T::GetIndexOfUsedSet(); + DropDownList list; + for (int i = 0; i < n; i++) { + list.push_back(MakeDropDownListStringItem(T::GetSet(i)->GetListLabel(), i)); + } + return list; +} + std::set _refresh_rates = { 30, 60, 75, 90, 100, 120, 144, 240 }; /** @@ -415,18 +428,18 @@ struct GameOptionsWindow : Window { int i = ¤cy - _currency_specs.data(); if (i == CURRENCY_CUSTOM) continue; if (currency.code.empty()) { - list.push_back(std::make_unique(currency.name, i, HasBit(disabled, i))); + list.push_back(MakeDropDownListStringItem(currency.name, i, HasBit(disabled, i))); } else { SetDParam(0, currency.name); SetDParamStr(1, currency.code); - list.push_back(std::make_unique(STR_GAME_OPTIONS_CURRENCY_CODE, i, HasBit(disabled, i))); + list.push_back(MakeDropDownListStringItem(STR_GAME_OPTIONS_CURRENCY_CODE, i, HasBit(disabled, i))); } } 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(STR_GAME_OPTIONS_CURRENCY_CUSTOM, CURRENCY_CUSTOM, HasBit(disabled, CURRENCY_CUSTOM))); + list.push_back(MakeDropDownListDividerItem()); // separator line + list.push_back(MakeDropDownListStringItem(STR_GAME_OPTIONS_CURRENCY_CUSTOM, CURRENCY_CUSTOM, HasBit(disabled, CURRENCY_CUSTOM))); break; } @@ -443,7 +456,7 @@ struct GameOptionsWindow : Window { const StringID *items = _autosave_dropdown; for (uint i = 0; *items != INVALID_STRING_ID; items++, i++) { - list.push_back(std::make_unique(*items, i, false)); + list.push_back(MakeDropDownListStringItem(*items, i)); } break; } @@ -465,7 +478,7 @@ struct GameOptionsWindow : Window { SetDParamStr(0, _languages[i].name); } SetDParam(1, (LANGUAGE_TOTAL_STRINGS - _languages[i].missing) * 100 / LANGUAGE_TOTAL_STRINGS); - list.push_back(std::make_unique(hide_percentage ? STR_JUST_RAW_STRING : STR_GAME_OPTIONS_LANGUAGE_PERCENTAGE, i, false)); + list.push_back(MakeDropDownListStringItem(hide_percentage ? STR_JUST_RAW_STRING : STR_GAME_OPTIONS_LANGUAGE_PERCENTAGE, i)); } std::sort(list.begin(), list.end(), DropDownListStringItem::NatSortFunc); break; @@ -478,7 +491,7 @@ struct GameOptionsWindow : Window { for (uint i = 0; i < _resolutions.size(); i++) { SetDParam(0, _resolutions[i].width); SetDParam(1, _resolutions[i].height); - list.push_back(std::make_unique(STR_GAME_OPTIONS_RESOLUTION_ITEM, i, false)); + list.push_back(MakeDropDownListStringItem(STR_GAME_OPTIONS_RESOLUTION_ITEM, i)); } break; @@ -487,7 +500,7 @@ struct GameOptionsWindow : Window { auto i = std::distance(_refresh_rates.begin(), it); if (*it == _settings_client.gui.refresh_rate) *selected_index = i; SetDParam(0, *it); - list.push_back(std::make_unique(STR_GAME_OPTIONS_REFRESH_RATE_ITEM, i, false)); + list.push_back(MakeDropDownListStringItem(STR_GAME_OPTIONS_REFRESH_RATE_ITEM, i)); } break; @@ -2929,15 +2942,15 @@ struct GameSettingsWindow : Window { * we don't want to allow comparing with new game's settings. */ bool disabled = mode == RM_CHANGED_AGAINST_NEW && settings_ptr == &_settings_newgame; - list.push_back(std::make_unique(_game_settings_restrict_dropdown[mode], mode, disabled)); + list.push_back(MakeDropDownListStringItem(_game_settings_restrict_dropdown[mode], mode, disabled)); } break; case WID_GS_TYPE_DROPDOWN: - list.push_back(std::make_unique(STR_CONFIG_SETTING_TYPE_DROPDOWN_ALL, ST_ALL, false)); - list.push_back(std::make_unique(_game_mode == GM_MENU ? STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_MENU : STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_INGAME, ST_GAME, false)); - list.push_back(std::make_unique(_game_mode == GM_MENU ? STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_MENU : STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_INGAME, ST_COMPANY, false)); - list.push_back(std::make_unique(STR_CONFIG_SETTING_TYPE_DROPDOWN_CLIENT, ST_CLIENT, false)); + list.push_back(MakeDropDownListStringItem(STR_CONFIG_SETTING_TYPE_DROPDOWN_ALL, ST_ALL)); + list.push_back(MakeDropDownListStringItem(_game_mode == GM_MENU ? STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_MENU : STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_INGAME, ST_GAME)); + list.push_back(MakeDropDownListStringItem(_game_mode == GM_MENU ? STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_MENU : STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_INGAME, ST_COMPANY)); + list.push_back(MakeDropDownListStringItem(STR_CONFIG_SETTING_TYPE_DROPDOWN_CLIENT, ST_CLIENT)); break; } return list; @@ -3139,11 +3152,11 @@ struct GameSettingsWindow : Window { } assert_msg(val >= sd->min && val <= (int)sd->max, "min: %d, max: %d, val: %d", sd->min, sd->max, val); sd->SetValueDParams(0, val); - list.push_back(std::make_unique(STR_JUST_STRING2, val, false)); + list.push_back(MakeDropDownListStringItem(STR_JUST_STRING2, val, false)); } } else if ((sd->flags & SF_ENUM)) { for (const SettingDescEnumEntry *enumlist = sd->enumlist; enumlist != nullptr && enumlist->str != STR_NULL; enumlist++) { - list.push_back(std::make_unique(enumlist->str, enumlist->val, false)); + list.push_back(MakeDropDownListStringItem(enumlist->str, enumlist->val, false)); } } diff --git a/src/settings_gui.h b/src/settings_gui.h index c95345b00a..bca6888ac7 100644 --- a/src/settings_gui.h +++ b/src/settings_gui.h @@ -23,17 +23,7 @@ void DrawDropDownButton(int x, int y, Colours button_colour, bool state, bool cl void DrawBoolButton(int x, int y, bool state, bool clickable); template -DropDownList BuildSetDropDownList(int *selected_index) -{ - int n = T::GetNumSets(); - *selected_index = T::GetIndexOfUsedSet(); - DropDownList list; - for (int i = 0; i < n; i++) { - list.push_back(std::make_unique(T::GetSet(i)->GetListLabel(), i, false)); - } - return list; -} - +DropDownList BuildSetDropDownList(int *selected_index); /* Actually implemented in music_gui.cpp */ void ChangeMusicSet(int index); diff --git a/src/signal_type.h b/src/signal_type.h index 0fbffa59a9..1df8a16238 100644 --- a/src/signal_type.h +++ b/src/signal_type.h @@ -74,9 +74,9 @@ enum SignalCycleGroups : uint8_t { }; DECLARE_ENUM_AS_BIT_SET(SignalCycleGroups) -static const int SIGNAL_DIRTY_LEFT = 14 * ZOOM_LVL_BASE; -static const int SIGNAL_DIRTY_RIGHT = 14 * ZOOM_LVL_BASE; -static const int SIGNAL_DIRTY_TOP = 30 * ZOOM_LVL_BASE; -static const int SIGNAL_DIRTY_BOTTOM = 5 * ZOOM_LVL_BASE; +static const int SIGNAL_DIRTY_LEFT = 14 * ZOOM_BASE; +static const int SIGNAL_DIRTY_RIGHT = 14 * ZOOM_BASE; +static const int SIGNAL_DIRTY_TOP = 30 * ZOOM_BASE; +static const int SIGNAL_DIRTY_BOTTOM = 5 * ZOOM_BASE; #endif /* SIGNAL_TYPE_H */ diff --git a/src/signs.cpp b/src/signs.cpp index 9fc3dc691e..a3a15e18e7 100644 --- a/src/signs.cpp +++ b/src/signs.cpp @@ -53,7 +53,7 @@ void Sign::UpdateVirtCoord() SetDParam(0, this->index); bool shown = HasBit(_display_opt, DO_SHOW_SIGNS) && !(this->IsCompetitorOwned() && !HasBit(_display_opt, DO_SHOW_COMPETITOR_SIGNS)); - this->sign.UpdatePosition(shown ? ZOOM_LVL_DRAW_SPR : ZOOM_LVL_END, pt.x, pt.y - 6 * ZOOM_LVL_BASE, STR_WHITE_SIGN); + this->sign.UpdatePosition(shown ? ZOOM_LVL_DRAW_SPR : ZOOM_LVL_END, pt.x, pt.y - 6 * ZOOM_BASE, STR_WHITE_SIGN); if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeSign(this->index)); } diff --git a/src/smallmap_gui.cpp b/src/smallmap_gui.cpp index d248a69688..d9e697f95a 100644 --- a/src/smallmap_gui.cpp +++ b/src/smallmap_gui.cpp @@ -1717,7 +1717,7 @@ void SmallMapWindow::ScreenshotCallbackHandler(void *buf, uint y, uint pitch, ui dpi.height = n; dpi.width = (((MapMaxX() + MapMaxY()) * 2) * this->ui_zoom) / this->tile_zoom; dpi.pitch = pitch; - dpi.zoom = ZOOM_LVL_NORMAL; + dpi.zoom = ZOOM_LVL_MIN; dpi.left = 0; dpi.top = y; diff --git a/src/spritecache.cpp b/src/spritecache.cpp index d1f2573ca7..28f47b22cf 100644 --- a/src/spritecache.cpp +++ b/src/spritecache.cpp @@ -239,11 +239,11 @@ static bool ResizeSpriteIn(SpriteLoader::SpriteCollection &sprite, ZoomLevel src static void ResizeSpriteOut(SpriteLoader::SpriteCollection &sprite, ZoomLevel zoom, bool dry_run) { /* Algorithm based on 32bpp_Optimized::ResizeSprite() */ - sprite[zoom].width = UnScaleByZoom(sprite[ZOOM_LVL_NORMAL].width, zoom); - sprite[zoom].height = UnScaleByZoom(sprite[ZOOM_LVL_NORMAL].height, zoom); - sprite[zoom].x_offs = UnScaleByZoom(sprite[ZOOM_LVL_NORMAL].x_offs, zoom); - sprite[zoom].y_offs = UnScaleByZoom(sprite[ZOOM_LVL_NORMAL].y_offs, zoom); - sprite[zoom].colours = sprite[ZOOM_LVL_NORMAL].colours; + sprite[zoom].width = UnScaleByZoom(sprite[ZOOM_LVL_MIN].width, zoom); + sprite[zoom].height = UnScaleByZoom(sprite[ZOOM_LVL_MIN].height, zoom); + sprite[zoom].x_offs = UnScaleByZoom(sprite[ZOOM_LVL_MIN].x_offs, zoom); + sprite[zoom].y_offs = UnScaleByZoom(sprite[ZOOM_LVL_MIN].y_offs, zoom); + sprite[zoom].colours = sprite[ZOOM_LVL_MIN].colours; if (dry_run) { sprite[zoom].data = nullptr; @@ -383,13 +383,13 @@ static bool ResizeSprites(SpriteLoader::SpriteCollection &sprite, unsigned int s if (first_avail < _settings_client.gui.sprite_zoom_min) { const unsigned int below_min_zoom_mask = (1 << _settings_client.gui.sprite_zoom_min) - 1; if ((zoom_levels & below_min_zoom_mask) != 0 && !HasBit(sprite_avail, _settings_client.gui.sprite_zoom_min)) { - if (!HasBit(sprite_avail, ZOOM_LVL_OUT_2X)) ResizeSpriteOut(sprite, ZOOM_LVL_OUT_2X, false); - if (_settings_client.gui.sprite_zoom_min == ZOOM_LVL_OUT_4X) { - if (first_avail != ZOOM_LVL_NORMAL) { - /* Ensure dimensions of ZOOM_LVL_NORMAL are set if the first available sprite level was ZOOM_LVL_OUT_2X */ - if (!ResizeSpriteIn(sprite, first_avail, ZOOM_LVL_NORMAL, true)) return false; + if (!HasBit(sprite_avail, ZOOM_LVL_IN_2X)) ResizeSpriteOut(sprite, ZOOM_LVL_IN_2X, false); + if (_settings_client.gui.sprite_zoom_min == ZOOM_LVL_NORMAL) { + if (first_avail != ZOOM_LVL_MIN) { + /* Ensure dimensions of ZOOM_LVL_MIN are set if the first available sprite level was ZOOM_LVL_IN_2X */ + if (!ResizeSpriteIn(sprite, first_avail, ZOOM_LVL_MIN, true)) return false; } - ResizeSpriteOut(sprite, ZOOM_LVL_OUT_4X, false); + ResizeSpriteOut(sprite, ZOOM_LVL_NORMAL, false); } sprite_avail &= ~below_min_zoom_mask; SetBit(sprite_avail, _settings_client.gui.sprite_zoom_min); @@ -411,13 +411,13 @@ static bool ResizeSprites(SpriteLoader::SpriteCollection &sprite, unsigned int s } /* Create a fully zoomed image if it does not exist */ - if (first_avail != ZOOM_LVL_NORMAL) { - if (!ResizeSpriteIn(sprite, first_avail, ZOOM_LVL_NORMAL, !HasBit(zoom_levels, ZOOM_LVL_NORMAL))) return false; - SetBit(sprite_avail, ZOOM_LVL_NORMAL); + if (first_avail != ZOOM_LVL_MIN) { + if (!ResizeSpriteIn(sprite, first_avail, ZOOM_LVL_MIN, !HasBit(zoom_levels, ZOOM_LVL_MIN))) return false; + SetBit(sprite_avail, ZOOM_LVL_MIN); } /* Create a zoomed image of the first required zoom if there any no sources which are equally or more zoomed in */ - if (zoom_levels != 0 && start > ZOOM_LVL_NORMAL && start < first_avail && HasBit(zoom_levels, start)) { + if (zoom_levels != 0 && start > ZOOM_LVL_MIN && start < first_avail && HasBit(zoom_levels, start)) { if (!ResizeSpriteIn(sprite, first_avail, start, false)) return false; SetBit(sprite_avail, start); } @@ -426,13 +426,13 @@ static bool ResizeSprites(SpriteLoader::SpriteCollection &sprite, unsigned int s if (!PadSprites(sprite, sprite_avail, encoder)) return false; /* Create other missing zoom levels */ - for (ZoomLevel zoom = ZOOM_LVL_OUT_2X; zoom != ZOOM_LVL_SPR_END; zoom++) { + for (ZoomLevel zoom = ZOOM_LVL_IN_2X; zoom != ZOOM_LVL_SPR_END; zoom++) { if (HasBit(sprite_avail, zoom)) { /* Check that size and offsets match the fully zoomed image. */ - assert(sprite[zoom].width == UnScaleByZoom(sprite[ZOOM_LVL_NORMAL].width, zoom)); - assert(sprite[zoom].height == UnScaleByZoom(sprite[ZOOM_LVL_NORMAL].height, zoom)); - assert(sprite[zoom].x_offs == UnScaleByZoom(sprite[ZOOM_LVL_NORMAL].x_offs, zoom)); - assert(sprite[zoom].y_offs == UnScaleByZoom(sprite[ZOOM_LVL_NORMAL].y_offs, zoom)); + assert(sprite[zoom].width == UnScaleByZoom(sprite[ZOOM_LVL_MIN].width, zoom)); + assert(sprite[zoom].height == UnScaleByZoom(sprite[ZOOM_LVL_MIN].height, zoom)); + assert(sprite[zoom].x_offs == UnScaleByZoom(sprite[ZOOM_LVL_MIN].x_offs, zoom)); + assert(sprite[zoom].y_offs == UnScaleByZoom(sprite[ZOOM_LVL_MIN].y_offs, zoom)); } /* Zoom level is not available, or unusable, so create it */ @@ -526,7 +526,7 @@ static void *ReadSprite(const SpriteCache *sc, SpriteID id, SpriteType sprite_ty SpriteLoader::SpriteCollection sprite; uint8_t sprite_avail = 0; - sprite[ZOOM_LVL_NORMAL].type = sprite_type; + sprite[ZOOM_LVL_MIN].type = sprite_type; SpriteLoaderGrf sprite_loader(file.GetContainerVersion()); if (sprite_type != SpriteType::MapGen && sc->GetHasNonPalette() && encoder->Is32BppSupported()) { @@ -553,17 +553,17 @@ static void *ReadSprite(const SpriteCache *sc, SpriteID id, SpriteType sprite_ty * Ugly: yes. Other solution: no. Blame the original author or * something ;) The image should really have been a data-stream * (so type = 0xFF basically). */ - uint num = sprite[ZOOM_LVL_NORMAL].width * sprite[ZOOM_LVL_NORMAL].height; + uint num = sprite[ZOOM_LVL_MIN].width * sprite[ZOOM_LVL_MIN].height; Sprite *s = (Sprite *)allocator(sizeof(*s) + num); - s->width = sprite[ZOOM_LVL_NORMAL].width; - s->height = sprite[ZOOM_LVL_NORMAL].height; - s->x_offs = sprite[ZOOM_LVL_NORMAL].x_offs; - s->y_offs = sprite[ZOOM_LVL_NORMAL].y_offs; + s->width = sprite[ZOOM_LVL_MIN].width; + s->height = sprite[ZOOM_LVL_MIN].height; + s->x_offs = sprite[ZOOM_LVL_MIN].x_offs; + s->y_offs = sprite[ZOOM_LVL_MIN].y_offs; s->next = nullptr; s->missing_zoom_levels = 0; - SpriteLoader::CommonPixel *src = sprite[ZOOM_LVL_NORMAL].data; + SpriteLoader::CommonPixel *src = sprite[ZOOM_LVL_MIN].data; uint8_t *dest = s->data; while (num-- > 0) { *dest++ = src->m; @@ -578,17 +578,17 @@ static void *ReadSprite(const SpriteCache *sc, SpriteID id, SpriteType sprite_ty return (void*)GetRawSprite(SPR_IMG_QUERY, SpriteType::Normal, UINT8_MAX, allocator, encoder); } - 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; - sprite[ZOOM_LVL_NORMAL].x_offs = sprite[_font_zoom].x_offs; - sprite[ZOOM_LVL_NORMAL].y_offs = sprite[_font_zoom].y_offs; - sprite[ZOOM_LVL_NORMAL].data = sprite[_font_zoom].data; - sprite[ZOOM_LVL_NORMAL].colours = sprite[_font_zoom].colours; + if (sprite[ZOOM_LVL_MIN].type == SpriteType::Font && _font_zoom != ZOOM_LVL_MIN) { + /* Make ZOOM_LVL_MIN be ZOOM_LVL_GUI */ + sprite[ZOOM_LVL_MIN].width = sprite[_font_zoom].width; + sprite[ZOOM_LVL_MIN].height = sprite[_font_zoom].height; + sprite[ZOOM_LVL_MIN].x_offs = sprite[_font_zoom].x_offs; + sprite[ZOOM_LVL_MIN].y_offs = sprite[_font_zoom].y_offs; + sprite[ZOOM_LVL_MIN].data = sprite[_font_zoom].data; + sprite[ZOOM_LVL_MIN].colours = sprite[_font_zoom].colours; } - if (sprite[ZOOM_LVL_NORMAL].type == SpriteType::Normal) { + if (sprite[ZOOM_LVL_MIN].type == SpriteType::Normal) { /* Remove unwanted zoom levels before encoding */ for (ZoomLevel zoom = ZOOM_LVL_BEGIN; zoom != ZOOM_LVL_SPR_END; zoom++) { if (!HasBit(zoom_levels, zoom)) sprite[zoom].data = nullptr; @@ -654,7 +654,7 @@ void ReadGRFSpriteOffsets(SpriteFile &file) uint8_t zoom = file.ReadByte(); length--; if (colour != 0) { - 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}; + static const ZoomLevel zoom_lvl_map[6] = {ZOOM_LVL_NORMAL, ZOOM_LVL_IN_4X, ZOOM_LVL_IN_2X, ZOOM_LVL_OUT_2X, ZOOM_LVL_OUT_4X, ZOOM_LVL_OUT_8X}; if (zoom < 6) SetBit(offset.control_flags, static_cast(zoom_lvl_map[zoom]) + static_cast((colour != SCC_PAL) ? SCC_32BPP_ZOOM_START : SCC_PAL_ZOOM_START)); } } @@ -1031,7 +1031,7 @@ uint32_t GetSpriteMainColour(SpriteID sprite_id, PaletteID palette_id) size_t file_pos = sc->file_pos; SpriteLoader::SpriteCollection sprites; - sprites[ZOOM_LVL_NORMAL].type = SpriteType::Normal; + sprites[ZOOM_LVL_MIN].type = SpriteType::Normal; SpriteLoaderGrf sprite_loader(file.GetContainerVersion()); uint8_t sprite_avail; const uint8_t screen_depth = BlitterFactory::GetCurrentBlitter()->GetScreenDepth(); diff --git a/src/spritecache.h b/src/spritecache.h index 8198fb9d66..caa7e22619 100644 --- a/src/spritecache.h +++ b/src/spritecache.h @@ -29,8 +29,8 @@ struct Sprite { }; /* - * Allow skipping sprites with zoom < ZOOM_LVL_OUT_4X, for sprite min zoom setting at 1x, if ZOOM_LVL_OUT_4X bit of present zoom levels is set. - * Allow skipping sprites with zoom < ZOOM_LVL_OUT_2X, for sprite min zoom setting at 2x, if either ZOOM_LVL_OUT_4X or ZOOM_LVL_OUT_2X bits of present zoom levels are set. + * Allow skipping sprites with zoom < ZOOM_LVL_NORMAL, for sprite min zoom setting at 1x, if ZOOM_LVL_NORMAL bit of present zoom levels is set. + * Allow skipping sprites with zoom < ZOOM_LVL_IN_2X, for sprite min zoom setting at 2x, if either ZOOM_LVL_NORMAL or ZOOM_LVL_IN_2X bits of present zoom levels are set. */ enum SpriteCacheCtrlFlags { SCC_PAL_ZOOM_START = 0, ///< Start bit of present zoom levels in palette mode. diff --git a/src/spriteloader/grf.cpp b/src/spriteloader/grf.cpp index db5bfc75b8..edbf79b3d3 100644 --- a/src/spriteloader/grf.cpp +++ b/src/spriteloader/grf.cpp @@ -230,7 +230,7 @@ uint8_t LoadSpriteV1(SpriteLoader::SpriteCollection &sprite, SpriteFile &file, s /* Type 0xFF indicates either a colourmap or some other non-sprite info; we do not handle them here */ if (type == 0xFF) return 0; - ZoomLevel zoom_lvl = (sprite_type != SpriteType::MapGen) ? ZOOM_LVL_OUT_4X : ZOOM_LVL_NORMAL; + ZoomLevel zoom_lvl = (sprite_type != SpriteType::MapGen) ? ZOOM_LVL_NORMAL : ZOOM_LVL_MIN; sprite[zoom_lvl].height = file.ReadByte(); sprite[zoom_lvl].width = file.ReadWord(); @@ -258,7 +258,7 @@ uint8_t LoadSpriteV1(SpriteLoader::SpriteCollection &sprite, SpriteFile &file, s uint8_t LoadSpriteV2(SpriteLoader::SpriteCollection &sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, uint count, uint16_t control_flags, uint8_t zoom_levels) { - 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}; + static const ZoomLevel zoom_lvl_map[6] = {ZOOM_LVL_NORMAL, ZOOM_LVL_IN_4X, ZOOM_LVL_IN_2X, ZOOM_LVL_OUT_2X, ZOOM_LVL_OUT_4X, ZOOM_LVL_OUT_8X}; /* Is the sprite not present/stripped in the GRF? */ if (file_pos == SIZE_MAX) return 0; @@ -268,18 +268,18 @@ uint8_t LoadSpriteV2(SpriteLoader::SpriteCollection &sprite, SpriteFile &file, s uint8_t available_levels = GB(control_flags, load_32bpp ? SCC_32BPP_ZOOM_START : SCC_PAL_ZOOM_START, 6); uint8_t skip_levels = 0; - ZoomLevel zoom_min = sprite_type == SpriteType::Font ? ZOOM_LVL_NORMAL : _settings_client.gui.sprite_zoom_min; + ZoomLevel zoom_min = sprite_type == SpriteType::Font ? ZOOM_LVL_MIN : _settings_client.gui.sprite_zoom_min; if (unlikely(sprite_type == SpriteType::MapGen)) { available_levels = UINT8_MAX; zoom_levels = 0x3F; } else if (available_levels != 0) { - if (zoom_min >= ZOOM_LVL_OUT_2X && (HasBit(available_levels, ZOOM_LVL_OUT_2X) || HasBit(available_levels, ZOOM_LVL_OUT_4X))) { - ClrBit(available_levels, ZOOM_LVL_NORMAL); + if (zoom_min >= ZOOM_LVL_IN_2X && (HasBit(available_levels, ZOOM_LVL_IN_2X) || HasBit(available_levels, ZOOM_LVL_NORMAL))) { + ClrBit(available_levels, ZOOM_LVL_IN_4X); } - if (zoom_min >= ZOOM_LVL_OUT_4X && HasBit(available_levels, ZOOM_LVL_OUT_4X)) { - ClrBit(available_levels, ZOOM_LVL_NORMAL); - ClrBit(available_levels, ZOOM_LVL_OUT_2X); + if (zoom_min >= ZOOM_LVL_NORMAL && HasBit(available_levels, ZOOM_LVL_NORMAL)) { + ClrBit(available_levels, ZOOM_LVL_IN_4X); + ClrBit(available_levels, ZOOM_LVL_IN_2X); } if (zoom_levels == 0) { skip_levels = available_levels; @@ -333,7 +333,7 @@ uint8_t LoadSpriteV2(SpriteLoader::SpriteCollection &sprite, SpriteFile &file, s } if (is_wanted_colour_depth && is_wanted_zoom_lvl) { - ZoomLevel zoom_lvl = (sprite_type != SpriteType::MapGen) ? zoom_lvl_map[zoom] : ZOOM_LVL_NORMAL; + ZoomLevel zoom_lvl = (sprite_type != SpriteType::MapGen) ? zoom_lvl_map[zoom] : ZOOM_LVL_MIN; if (HasBit(loaded_sprites, zoom_lvl)) { /* We already have this zoom level, skip sprite. */ diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 8fc6f40cc0..746c01eb88 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -512,8 +512,8 @@ void Station::UpdateVirtCoord() if (IsHeadless()) return; Point pt = RemapCoords2(TileX(this->xy) * TILE_SIZE, TileY(this->xy) * TILE_SIZE); - pt.y -= 32 * ZOOM_LVL_BASE; - if ((this->facilities & FACIL_AIRPORT) && this->airport.type == AT_OILRIG) pt.y -= 16 * ZOOM_LVL_BASE; + pt.y -= 32 * ZOOM_BASE; + if ((this->facilities & FACIL_AIRPORT) && this->airport.type == AT_OILRIG) pt.y -= 16 * ZOOM_BASE; if (_viewport_sign_kdtree_valid && this->sign.kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeStation(this->index)); diff --git a/src/station_gui.cpp b/src/station_gui.cpp index 4fe8965244..97ea9696c6 100644 --- a/src/station_gui.cpp +++ b/src/station_gui.cpp @@ -20,6 +20,8 @@ #include "string_func.h" #include "window_func.h" #include "viewport_func.h" +#include "dropdown_type.h" +#include "dropdown_common_type.h" #include "dropdown_func.h" #include "station_base.h" #include "waypoint_base.h" @@ -644,8 +646,8 @@ public: using DropDownListCargoItem = DropDownCheck>; DropDownList list; - list.push_back(std::make_unique(STR_STATION_LIST_CARGO_FILTER_SELECT_ALL, CargoFilterCriteria::CF_SELECT_ALL)); - list.push_back(std::make_unique(-1)); + list.push_back(MakeDropDownListStringItem(STR_STATION_LIST_CARGO_FILTER_SELECT_ALL, CargoFilterCriteria::CF_SELECT_ALL)); + list.push_back(MakeDropDownListDividerItem()); bool any_hidden = false; @@ -667,8 +669,8 @@ public: } if (!expanded && any_hidden) { - if (list.size() > 2) list.push_back(std::make_unique(-1)); - list.push_back(std::make_unique(STR_STATION_LIST_CARGO_FILTER_EXPAND, CargoFilterCriteria::CF_EXPAND_LIST)); + if (list.size() > 2) list.push_back(MakeDropDownListDividerItem()); + list.push_back(MakeDropDownListStringItem(STR_STATION_LIST_CARGO_FILTER_EXPAND, CargoFilterCriteria::CF_EXPAND_LIST)); } return list; diff --git a/src/statusbar_gui.cpp b/src/statusbar_gui.cpp index 85bd3eb351..48e2874556 100644 --- a/src/statusbar_gui.cpp +++ b/src/statusbar_gui.cpp @@ -184,9 +184,9 @@ struct StatusBarWindow : Window { } else if (_pause_mode != PM_UNPAUSED) { StringID msg = (_pause_mode & PM_PAUSED_LINK_GRAPH) ? STR_STATUSBAR_PAUSED_LINK_GRAPH : STR_STATUSBAR_PAUSED; DrawString(tr, msg, TC_FROMSTRING, SA_HOR_CENTER); - } else if (this->ticker_scroll < TICKER_STOP && _statusbar_news_item != nullptr && _statusbar_news_item->string_id != 0) { + } else if (this->ticker_scroll < TICKER_STOP && GetStatusbarNews() != nullptr && GetStatusbarNews()->string_id != 0) { /* Draw the scrolling news text */ - if (!DrawScrollingStatusText(_statusbar_news_item, ScaleGUITrad(this->ticker_scroll), tr.left, tr.right, tr.top, tr.bottom)) { + if (!DrawScrollingStatusText(GetStatusbarNews(), ScaleGUITrad(this->ticker_scroll), tr.left, tr.right, tr.top, tr.bottom)) { InvalidateWindowData(WC_STATUS_BAR, 0, SBI_NEWS_DELETED); if (Company::IsValidID(_local_company)) { /* This is the default text */ diff --git a/src/story_gui.cpp b/src/story_gui.cpp index a3aea8953e..79291ad309 100644 --- a/src/story_gui.cpp +++ b/src/story_gui.cpp @@ -256,11 +256,11 @@ protected: for (const StoryPage *p : this->story_pages) { bool current_page = p->index == this->selected_page_id; if (!p->title.empty()) { - list.push_back(std::make_unique(p->title, p->index, current_page)); + list.push_back(MakeDropDownListStringItem(p->title, p->index, current_page)); } else { /* No custom title => use a generic page title with page number. */ SetDParam(0, page_num); - list.push_back(std::make_unique(STR_STORY_BOOK_GENERIC_PAGE_ITEM, p->index, current_page)); + list.push_back(MakeDropDownListStringItem(STR_STORY_BOOK_GENERIC_PAGE_ITEM, p->index, current_page)); } page_num++; } diff --git a/src/table/newgrf_debug_data.h b/src/table/newgrf_debug_data.h index 2d47aa9e53..017a02a790 100644 --- a/src/table/newgrf_debug_data.h +++ b/src/table/newgrf_debug_data.h @@ -1520,7 +1520,7 @@ class NIHSignals : public NIHelper { /* virtual */ void FillOptionsDropDown(uint index, DropDownList &list) const override { - list.push_back(std::make_unique(STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_RAIL_TYPE, 0, !IsTileType(index, MP_RAILWAY))); + list.push_back(MakeDropDownListStringItem(STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_RAIL_TYPE, 0, !IsTileType(index, MP_RAILWAY))); } /* virtual */ void OnOptionsDropdownSelect(uint index, int selected) const override @@ -1807,8 +1807,8 @@ class NIHRailType : public NIHelper { /* virtual */ void FillOptionsDropDown(uint index, DropDownList &list) const override { - list.push_back(std::make_unique(STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_ROAD_TYPE, 0, !IsLevelCrossingTile(index))); - list.push_back(std::make_unique(STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_SIGNALS, 1, !(IsTileType(index, MP_RAILWAY) && HasSignals(index)))); + list.push_back(MakeDropDownListStringItem(STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_ROAD_TYPE, 0, !IsLevelCrossingTile(index))); + list.push_back(MakeDropDownListStringItem(STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_SIGNALS, 1, !(IsTileType(index, MP_RAILWAY) && HasSignals(index)))); } /* virtual */ void OnOptionsDropdownSelect(uint index, int selected) const override @@ -2389,7 +2389,7 @@ class NIHRoadType : public NIHelper { /* virtual */ void FillOptionsDropDown(uint index, DropDownList &list) const override { - list.push_back(std::make_unique(STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_RAIL_TYPE, 0, !IsLevelCrossingTile(index))); + list.push_back(MakeDropDownListStringItem(STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_RAIL_TYPE, 0, !IsLevelCrossingTile(index))); } /* virtual */ void OnOptionsDropdownSelect(uint index, int selected) const override diff --git a/src/table/settings/gui_settings.ini b/src/table/settings/gui_settings.ini index 9991cf4a21..743255a60f 100644 --- a/src/table/settings/gui_settings.ini +++ b/src/table/settings/gui_settings.ini @@ -441,7 +441,7 @@ type = SLE_UINT8 flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = ZOOM_LVL_MIN min = ZOOM_LVL_MIN -max = ZOOM_LVL_OUT_4X +max = ZOOM_LVL_NORMAL str = STR_CONFIG_SETTING_ZOOM_MIN strhelp = STR_CONFIG_SETTING_ZOOM_MIN_HELPTEXT strval = STR_CONFIG_SETTING_ZOOM_LVL_MIN @@ -453,7 +453,7 @@ var = gui.zoom_max type = SLE_UINT8 flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = ZOOM_LVL_MAX -min = ZOOM_LVL_OUT_8X +min = ZOOM_LVL_OUT_2X max = ZOOM_LVL_MAX str = STR_CONFIG_SETTING_ZOOM_MAX strhelp = STR_CONFIG_SETTING_ZOOM_MAX_HELPTEXT @@ -468,7 +468,7 @@ type = SLE_UINT8 flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = ZOOM_LVL_MIN min = ZOOM_LVL_MIN -max = ZOOM_LVL_OUT_4X +max = ZOOM_LVL_NORMAL str = STR_CONFIG_SETTING_SPRITE_ZOOM_MIN strhelp = STR_CONFIG_SETTING_SPRITE_ZOOM_MIN_HELPTEXT strval = STR_CONFIG_SETTING_SPRITE_ZOOM_LVL_MIN diff --git a/src/texteff.cpp b/src/texteff.cpp index 7e8b0ea0fb..3f959de486 100644 --- a/src/texteff.cpp +++ b/src/texteff.cpp @@ -36,7 +36,7 @@ static TextEffectID _free_text_effect = 0; /** Reset the text effect */ void TextEffect::Reset() { - this->MarkDirty(ZOOM_LVL_OUT_8X); + this->MarkDirty(ZOOM_LVL_TEXT_EFFECT); this->width_normal = 0; this->string_id = INVALID_STRING_ID; this->params_1 = _free_text_effect; @@ -69,7 +69,7 @@ TextEffectID AddTextEffect(StringID msg, int center, int y, uint8_t duration, Te te.width_normal = 0; SetDParam(0, param1); SetDParam(1, param2); - te.UpdatePosition(ZOOM_LVL_OUT_8X, center, y, msg); + te.UpdatePosition(ZOOM_LVL_TEXT_EFFECT, center, y, msg); return i; } @@ -85,7 +85,7 @@ void UpdateTextEffect(TextEffectID te_id, StringID msg, uint64_t param1, uint64_ SetDParam(0, param1); SetDParam(1, param2); - te->UpdatePosition(ZOOM_LVL_OUT_8X, te->center, te->top, te->string_id, te->string_id - 1); + te->UpdatePosition(ZOOM_LVL_TEXT_EFFECT, te->center, te->top, te->string_id, te->string_id - 1); } void UpdateAllTextEffectVirtCoords() @@ -94,7 +94,7 @@ void UpdateAllTextEffectVirtCoords() if (te.string_id == INVALID_STRING_ID) continue; SetDParam(0, te.params_1); SetDParam(1, te.params_2); - te.UpdatePosition(ZOOM_LVL_OUT_8X, te.center, te.top, te.string_id, te.string_id - 1); + te.UpdatePosition(ZOOM_LVL_TEXT_EFFECT, te.center, te.top, te.string_id, te.string_id - 1); } } @@ -118,10 +118,10 @@ void MoveAllTextEffects(uint delta_ms) continue; } - te.MarkDirty(ZOOM_LVL_OUT_8X); + te.MarkDirty(ZOOM_LVL_TEXT_EFFECT); te.duration -= count; - te.top -= count * ZOOM_LVL_BASE; - te.MarkDirty(ZOOM_LVL_OUT_8X); + te.top -= count * ZOOM_BASE; + te.MarkDirty(ZOOM_LVL_TEXT_EFFECT); } } @@ -135,7 +135,7 @@ void InitTextEffects() void DrawTextEffects(ViewportDrawerDynamic *vdd, DrawPixelInfo *dpi, bool load_transparent) { /* Don't draw the text effects when zoomed out a lot */ - if (dpi->zoom > ZOOM_LVL_OUT_8X) return; + if (dpi->zoom > ZOOM_LVL_TEXT_EFFECT) return; const int bottom_threshold = dpi->top + dpi->height; const int top_threshold = dpi->top - ScaleByZoom(WidgetDimensions::scaled.framerect.Horizontal() + GetCharacterHeight(FS_NORMAL), dpi->zoom); @@ -144,7 +144,7 @@ void DrawTextEffects(ViewportDrawerDynamic *vdd, DrawPixelInfo *dpi, bool load_t for (TextEffect &te : _text_effects) { if (te.string_id == INVALID_STRING_ID) continue; if ((te.mode == TE_RISING || show_loading) && te.top > top_threshold && te.top < bottom_threshold) { - ViewportAddString(vdd, dpi, ZOOM_LVL_OUT_8X, &te, te.string_id, te.string_id - 1, STR_NULL, te.params_1, te.params_2); + ViewportAddString(vdd, dpi, ZOOM_LVL_TEXT_EFFECT, &te, te.string_id, te.string_id - 1, STR_NULL, te.params_1, te.params_2); } } } diff --git a/src/textfile_gui.cpp b/src/textfile_gui.cpp index a44fd7fd80..2c571cd57c 100644 --- a/src/textfile_gui.cpp +++ b/src/textfile_gui.cpp @@ -16,6 +16,7 @@ #include "string_func.h" #include "textfile_gui.h" #include "dropdown_type.h" +#include "dropdown_func.h" #include "gfx_layout.h" #include "debug.h" #include "debug_fmt.h" @@ -536,7 +537,7 @@ void TextfileWindow::AfterLoadMarkdown() DropDownList list; for (size_t line : this->jumplist) { SetDParamStr(0, this->lines[line].text); - list.push_back(std::make_unique(STR_TEXTFILE_JUMPLIST_ITEM, (int)line, false)); + list.push_back(MakeDropDownListStringItem(STR_TEXTFILE_JUMPLIST_ITEM, (int)line)); } ShowDropDownList(this, std::move(list), -1, widget); break; diff --git a/src/tile_type.h b/src/tile_type.h index 13bb24d42d..df6d96f8b9 100644 --- a/src/tile_type.h +++ b/src/tile_type.h @@ -12,12 +12,12 @@ static const uint TILE_SIZE = 16; ///< Tile size in world coordinates. static const uint TILE_UNIT_MASK = TILE_SIZE - 1; ///< For masking in/out the inner-tile world coordinate units. -static const uint TILE_PIXELS = 32; ///< Pixel distance between tile columns/rows in #ZOOM_LVL_BASE. -static const uint TILE_HEIGHT = 8; ///< Height of a height level in world coordinate AND in pixels in #ZOOM_LVL_BASE. +static const uint TILE_PIXELS = 32; ///< Pixel distance between tile columns/rows in #ZOOM_BASE. +static const uint TILE_HEIGHT = 8; ///< Height of a height level in world coordinate AND in pixels in #ZOOM_BASE. -static const uint MAX_BUILDING_PIXELS = 200; ///< Maximum height of a building in pixels in #ZOOM_LVL_BASE. (Also applies to "bridge buildings" on the bridge floor.) -static const int MAX_VEHICLE_PIXEL_X = 192; ///< Maximum width of a vehicle in pixels in #ZOOM_LVL_BASE. -static const int MAX_VEHICLE_PIXEL_Y = 96; ///< Maximum height of a vehicle in pixels in #ZOOM_LVL_BASE. +static const uint MAX_BUILDING_PIXELS = 200; ///< Maximum height of a building in pixels in #ZOOM_BASE. (Also applies to "bridge buildings" on the bridge floor.) +static const int MAX_VEHICLE_PIXEL_X = 192; ///< Maximum width of a vehicle in pixels in #ZOOM_BASE. +static const int MAX_VEHICLE_PIXEL_Y = 96; ///< Maximum height of a vehicle in pixels in #ZOOM_BASE. static const uint MAX_TILE_HEIGHT = 255; ///< Maximum allowed tile height diff --git a/src/timetable_gui.cpp b/src/timetable_gui.cpp index e65675332e..021aad3c6a 100644 --- a/src/timetable_gui.cpp +++ b/src/timetable_gui.cpp @@ -1071,10 +1071,10 @@ struct TimetableWindow : GeneralVehicleWindow { (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION)) && !order->IsType(OT_CONDITIONAL)); OrderLeaveType current = order != nullptr ? order->GetLeaveType() : OLT_END; DropDownList list; - list.emplace_back(std::make_unique(current == OLT_NORMAL, STR_TIMETABLE_LEAVE_NORMAL, OLT_NORMAL, leave_type_disabled)); - list.emplace_back(std::make_unique(current == OLT_LEAVE_EARLY, STR_TIMETABLE_LEAVE_EARLY, OLT_LEAVE_EARLY, leave_type_disabled)); - list.emplace_back(std::make_unique(current == OLT_LEAVE_EARLY_FULL_ANY, STR_TIMETABLE_LEAVE_EARLY_FULL_ANY, OLT_LEAVE_EARLY_FULL_ANY, leave_type_disabled || !order->IsType(OT_GOTO_STATION))); - list.emplace_back(std::make_unique(current == OLT_LEAVE_EARLY_FULL_ALL, STR_TIMETABLE_LEAVE_EARLY_FULL_ALL, OLT_LEAVE_EARLY_FULL_ALL, leave_type_disabled || !order->IsType(OT_GOTO_STATION))); + list.emplace_back(MakeDropDownListCheckedItem(current == OLT_NORMAL, STR_TIMETABLE_LEAVE_NORMAL, OLT_NORMAL, leave_type_disabled)); + list.emplace_back(MakeDropDownListCheckedItem(current == OLT_LEAVE_EARLY, STR_TIMETABLE_LEAVE_EARLY, OLT_LEAVE_EARLY, leave_type_disabled)); + list.emplace_back(MakeDropDownListCheckedItem(current == OLT_LEAVE_EARLY_FULL_ANY, STR_TIMETABLE_LEAVE_EARLY_FULL_ANY, OLT_LEAVE_EARLY_FULL_ANY, leave_type_disabled || !order->IsType(OT_GOTO_STATION))); + list.emplace_back(MakeDropDownListCheckedItem(current == OLT_LEAVE_EARLY_FULL_ALL, STR_TIMETABLE_LEAVE_EARLY_FULL_ALL, OLT_LEAVE_EARLY_FULL_ALL, leave_type_disabled || !order->IsType(OT_GOTO_STATION))); ShowDropDownList(this, std::move(list), -1, widget, 0, DDMF_NONE, DDSF_SHARED); break; } @@ -1084,15 +1084,15 @@ struct TimetableWindow : GeneralVehicleWindow { if (real >= this->vehicle->GetNumOrders()) real = 0; const Order *order = this->vehicle->GetOrder(real); DropDownList list; - list.emplace_back(new DropDownListStringItem(STR_TIMETABLE_ASSIGN_SCHEDULE_NONE, -1, false)); + list.push_back(MakeDropDownListStringItem(STR_TIMETABLE_ASSIGN_SCHEDULE_NONE, -1, false)); for (uint i = 0; i < v->orders->GetScheduledDispatchScheduleCount(); i++) { const DispatchSchedule &ds = this->vehicle->orders->GetDispatchScheduleByIndex(i); if (ds.ScheduleName().empty()) { SetDParam(0, i + 1); - list.emplace_back(new DropDownListStringItem(STR_TIMETABLE_ASSIGN_SCHEDULE_ID, i, false)); + list.push_back(MakeDropDownListStringItem(STR_TIMETABLE_ASSIGN_SCHEDULE_ID, i, false)); } else { - list.emplace_back(new DropDownListStringItem(ds.ScheduleName(), i, false)); + list.push_back(MakeDropDownListStringItem(ds.ScheduleName(), i, false)); } } ShowDropDownList(this, std::move(list), order->GetDispatchScheduleIndex(), WID_VT_ASSIGN_SCHEDULE); diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index 65be956021..0f18fafcb0 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -13,6 +13,9 @@ #include "window_func.h" #include "viewport_func.h" #include "command_func.h" +#include "dropdown_type.h" +#include "dropdown_func.h" +#include "dropdown_common_type.h" #include "vehicle_gui.h" #include "rail_gui.h" #include "road.h" @@ -139,9 +142,9 @@ static void PopupMainToolbarMenu(Window *w, WidgetID widget, const std::initiali int i = 0; for (StringID string : strings) { if (string == STR_NULL) { - list.push_back(std::make_unique(-1, false)); + list.push_back(MakeDropDownListDividerItem()); } else { - list.push_back(std::make_unique(string, i, false)); + list.push_back(MakeDropDownListStringItem(string, i)); i++; } } @@ -168,18 +171,18 @@ static void PopupMainCompanyToolbMenu(Window *w, WidgetID widget, CompanyMask gr if (!_networking) break; /* Add the client list button for the companies menu */ - list.push_back(std::make_unique(STR_NETWORK_COMPANY_LIST_CLIENT_LIST, CTMN_CLIENT_LIST, false)); + list.push_back(MakeDropDownListStringItem(STR_NETWORK_COMPANY_LIST_CLIENT_LIST, CTMN_CLIENT_LIST)); if (_local_company != COMPANY_SPECTATOR) { - list.push_back(std::make_unique(STR_NETWORK_COMPANY_LIST_SPECTATE, CTMN_SPECTATE, false)); + list.push_back(MakeDropDownListStringItem(STR_NETWORK_COMPANY_LIST_SPECTATE, CTMN_SPECTATE)); } break; case WID_TN_STORY: - list.push_back(std::make_unique(STR_STORY_BOOK_SPECTATOR, CTMN_SPECTATOR, false)); + list.push_back(MakeDropDownListStringItem(STR_STORY_BOOK_SPECTATOR, CTMN_SPECTATOR)); break; case WID_TN_GOAL: - list.push_back(std::make_unique(STR_GOALS_SPECTATOR, CTMN_SPECTATOR, false)); + list.push_back(MakeDropDownListStringItem(STR_GOALS_SPECTATOR, CTMN_SPECTATOR)); break; } @@ -265,35 +268,35 @@ enum OptionMenuEntries { static CallBackFunction ToolbarOptionsClick(Window *w) { DropDownList list; - list.push_back(std::make_unique(STR_SETTINGS_MENU_GAME_OPTIONS, OME_GAMEOPTIONS, false)); - list.push_back(std::make_unique(STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE, OME_SETTINGS, false)); + list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_GAME_OPTIONS, OME_GAMEOPTIONS)); + list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE, OME_SETTINGS)); /* Changes to the per-AI settings don't get send from the server to the clients. Clients get * the settings once they join but never update it. As such don't show the window at all * to network clients. */ if (!_networking || _network_server) { - list.push_back(std::make_unique(STR_SETTINGS_MENU_AI_SETTINGS, OME_AI_SETTINGS, false)); - list.push_back(std::make_unique(STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS, OME_GAMESCRIPT_SETTINGS, false)); + list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_AI_SETTINGS, OME_AI_SETTINGS)); + list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS, OME_GAMESCRIPT_SETTINGS)); } - list.push_back(std::make_unique(STR_SETTINGS_MENU_NEWGRF_SETTINGS, OME_NEWGRFSETTINGS, false)); + list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_NEWGRF_SETTINGS, OME_NEWGRFSETTINGS, false)); if (CheatWindowMayBeShown()) { - list.push_back(std::make_unique(STR_SETTINGS_MENU_SANDBOX_OPTIONS, OME_SANDBOX, false)); + list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_SANDBOX_OPTIONS, OME_SANDBOX, false)); } - list.push_back(std::make_unique(STR_SETTINGS_MENU_ZONING, OME_ZONING, 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(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(MakeDropDownListStringItem(STR_SETTINGS_MENU_ZONING, OME_ZONING, false)); + list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS, OME_TRANSPARENCIES, false)); + list.push_back(MakeDropDownListDividerItem()); + list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_TOWN_NAMES), STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED, OME_SHOW_TOWNNAMES, false)); + list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_STATION_NAMES), STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED, OME_SHOW_STATIONNAMES, false)); + list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_WAYPOINT_NAMES), STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED, OME_SHOW_WAYPOINTNAMES, false)); + list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_SIGNS), STR_SETTINGS_MENU_SIGNS_DISPLAYED, OME_SHOW_SIGNS, false)); + list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_COMPETITOR_SIGNS), STR_SETTINGS_MENU_SHOW_COMPETITOR_SIGNS, OME_SHOW_COMPETITOR_SIGNS, false)); if (_settings_client.gui.allow_hiding_waypoint_labels) { - list.push_back(std::make_unique(HasBit(_extra_display_opt, XDO_SHOW_HIDDEN_SIGNS), STR_SETTINGS_MENU_SHOW_HIDDEN_SIGNS, OME_SHOW_HIDDEN_SIGNS, false)); + list.push_back(MakeDropDownListCheckedItem(HasBit(_extra_display_opt, XDO_SHOW_HIDDEN_SIGNS), STR_SETTINGS_MENU_SHOW_HIDDEN_SIGNS, OME_SHOW_HIDDEN_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)); - list.push_back(std::make_unique(HasBit(_extra_display_opt, XDO_SHOW_MONEY_TEXT_EFFECTS), STR_SETTINGS_MENU_MONEY_TEXT_EFFECTS, OME_SHOW_MONEYTEXT, false)); + list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_FULL_ANIMATION), STR_SETTINGS_MENU_FULL_ANIMATION, OME_FULL_ANIMATION, false)); + list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_FULL_DETAIL), STR_SETTINGS_MENU_FULL_DETAIL, OME_FULL_DETAILS, false)); + list.push_back(MakeDropDownListCheckedItem(IsTransparencySet(TO_HOUSES), STR_SETTINGS_MENU_TRANSPARENT_BUILDINGS, OME_TRANSPARENTBUILDINGS, false)); + list.push_back(MakeDropDownListCheckedItem(IsTransparencySet(TO_SIGNS), STR_SETTINGS_MENU_TRANSPARENT_SIGNS, OME_SHOW_STATIONSIGNS, false)); + list.push_back(MakeDropDownListCheckedItem(HasBit(_extra_display_opt, XDO_SHOW_MONEY_TEXT_EFFECTS), STR_SETTINGS_MENU_MONEY_TEXT_EFFECTS, OME_SHOW_MONEYTEXT, false)); ShowDropDownList(w, std::move(list), 0, WID_TN_SETTINGS, 140, DDMF_INSTANT_CLOSE); if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP); @@ -429,11 +432,11 @@ enum MapMenuEntries { static CallBackFunction ToolbarMapClick(Window *w) { DropDownList list; - list.push_back(std::make_unique(STR_MAP_MENU_MAP_OF_WORLD, MME_SHOW_SMALLMAP, false)); - list.push_back(std::make_unique(STR_MAP_MENU_EXTRA_VIEWPORT, MME_SHOW_EXTRAVIEWPORTS, false)); - list.push_back(std::make_unique(STR_MAP_MENU_LINGRAPH_LEGEND, MME_SHOW_LINKGRAPH, false)); - list.push_back(std::make_unique(STR_MAP_MENU_SIGN_LIST, MME_SHOW_SIGNLISTS, false)); - list.push_back(std::make_unique(STR_MAP_MENU_PLAN_LIST, MME_SHOW_PLANS, false)); + list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_MAP_OF_WORLD, MME_SHOW_SMALLMAP, false)); + list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_EXTRA_VIEWPORT, MME_SHOW_EXTRAVIEWPORTS, false)); + list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_LINGRAPH_LEGEND, MME_SHOW_LINKGRAPH, false)); + list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_SIGN_LIST, MME_SHOW_SIGNLISTS, false)); + list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_PLAN_LIST, MME_SHOW_PLANS, false)); PopupMainToolbarMenu(w, WID_TN_SMALL_MAP, std::move(list), 0); return CBF_NONE; } @@ -441,12 +444,12 @@ static CallBackFunction ToolbarMapClick(Window *w) static CallBackFunction ToolbarScenMapTownDir(Window *w) { DropDownList list; - list.push_back(std::make_unique(STR_MAP_MENU_MAP_OF_WORLD, MME_SHOW_SMALLMAP, false)); - list.push_back(std::make_unique(STR_MAP_MENU_EXTRA_VIEWPORT, MME_SHOW_EXTRAVIEWPORTS, false)); - list.push_back(std::make_unique(STR_MAP_MENU_SIGN_LIST, MME_SHOW_SIGNLISTS, false)); - list.push_back(std::make_unique(STR_MAP_MENU_PLAN_LIST, MME_SHOW_PLANS, false)); - list.push_back(std::make_unique(STR_TOWN_MENU_TOWN_DIRECTORY, MME_SHOW_TOWNDIRECTORY, false)); - list.push_back(std::make_unique(STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, MME_SHOW_INDUSTRYDIRECTORY, false)); + list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_MAP_OF_WORLD, MME_SHOW_SMALLMAP, false)); + list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_EXTRA_VIEWPORT, MME_SHOW_EXTRAVIEWPORTS, false)); + list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_SIGN_LIST, MME_SHOW_SIGNLISTS, false)); + list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_PLAN_LIST, MME_SHOW_PLANS, false)); + list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_TOWN_DIRECTORY, MME_SHOW_TOWNDIRECTORY, false)); + list.push_back(MakeDropDownListStringItem(STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, MME_SHOW_INDUSTRYDIRECTORY, false)); PopupMainToolbarMenu(w, WID_TE_SMALL_MAP, std::move(list), 0); return CBF_NONE; } @@ -655,13 +658,13 @@ static void AddDropDownLeagueTableOptions(DropDownList &list) { if (LeagueTable::GetNumItems() > 0) { for (LeagueTable *lt : LeagueTable::Iterate()) { - list.push_back(std::make_unique(lt->title, lt->index, false)); + list.push_back(MakeDropDownListStringItem(lt->title, lt->index)); } } else { - list.push_back(std::make_unique(STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE, LTMN_PERFORMANCE_LEAGUE, false)); - list.push_back(std::make_unique(STR_GRAPH_MENU_DETAILED_PERFORMANCE_RATING, LTMN_PERFORMANCE_RATING, false)); + list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE, LTMN_PERFORMANCE_LEAGUE)); + list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_DETAILED_PERFORMANCE_RATING, LTMN_PERFORMANCE_RATING)); if (!_networking) { - list.push_back(std::make_unique(STR_GRAPH_MENU_HIGHSCORE, LTMN_HIGHSCORE, false)); + list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_HIGHSCORE, LTMN_HIGHSCORE)); } } } @@ -670,12 +673,12 @@ static CallBackFunction ToolbarGraphsClick(Window *w) { DropDownList list; - list.push_back(std::make_unique(STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH, GRMN_OPERATING_PROFIT_GRAPH, false)); - list.push_back(std::make_unique(STR_GRAPH_MENU_INCOME_GRAPH, GRMN_INCOME_GRAPH, false)); - list.push_back(std::make_unique(STR_GRAPH_MENU_DELIVERED_CARGO_GRAPH, GRMN_DELIVERED_CARGO_GRAPH, false)); - list.push_back(std::make_unique(STR_GRAPH_MENU_PERFORMANCE_HISTORY_GRAPH, GRMN_PERFORMANCE_HISTORY_GRAPH, false)); - list.push_back(std::make_unique(STR_GRAPH_MENU_COMPANY_VALUE_GRAPH, GRMN_COMPANY_VALUE_GRAPH, false)); - list.push_back(std::make_unique(STR_GRAPH_MENU_CARGO_PAYMENT_RATES, GRMN_CARGO_PAYMENT_RATES, false)); + list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH, GRMN_OPERATING_PROFIT_GRAPH)); + list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_INCOME_GRAPH, GRMN_INCOME_GRAPH)); + list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_DELIVERED_CARGO_GRAPH, GRMN_DELIVERED_CARGO_GRAPH)); + list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_PERFORMANCE_HISTORY_GRAPH, GRMN_PERFORMANCE_HISTORY_GRAPH)); + list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_COMPANY_VALUE_GRAPH, GRMN_COMPANY_VALUE_GRAPH)); + list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_CARGO_PAYMENT_RATES, GRMN_CARGO_PAYMENT_RATES)); if (_toolbar_mode != TB_NORMAL) AddDropDownLeagueTableOptions(list); @@ -940,7 +943,7 @@ static CallBackFunction MenuClickBuildTram(int index) static CallBackFunction ToolbarBuildWaterClick(Window *w) { DropDownList list; - list.push_back(std::make_unique(SPR_IMG_BUILD_CANAL, PAL_NONE, STR_WATERWAYS_MENU_WATERWAYS_CONSTRUCTION, 0, false)); + list.push_back(MakeDropDownListIconItem(SPR_IMG_BUILD_CANAL, PAL_NONE, STR_WATERWAYS_MENU_WATERWAYS_CONSTRUCTION, 0, false)); ShowDropDownList(w, std::move(list), 0, WID_TN_WATER, 140, DDMF_INSTANT_CLOSE); if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP); return CBF_NONE; @@ -962,7 +965,7 @@ static CallBackFunction MenuClickBuildWater(int) static CallBackFunction ToolbarBuildAirClick(Window *w) { DropDownList list; - list.push_back(std::make_unique(SPR_IMG_AIRPORT, PAL_NONE, STR_AIRCRAFT_MENU_AIRPORT_CONSTRUCTION, 0, false)); + list.push_back(MakeDropDownListIconItem(SPR_IMG_AIRPORT, PAL_NONE, STR_AIRCRAFT_MENU_AIRPORT_CONSTRUCTION, 0, false)); ShowDropDownList(w, std::move(list), 0, WID_TN_AIR, 140, DDMF_INSTANT_CLOSE); if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP); return CBF_NONE; @@ -984,9 +987,9 @@ static CallBackFunction MenuClickBuildAir(int) static CallBackFunction ToolbarForestClick(Window *w) { DropDownList list; - list.push_back(std::make_unique(SPR_IMG_LANDSCAPING, PAL_NONE, STR_LANDSCAPING_MENU_LANDSCAPING, 0, false)); - list.push_back(std::make_unique(SPR_IMG_PLANTTREES, PAL_NONE, STR_LANDSCAPING_MENU_PLANT_TREES, 1, false)); - list.push_back(std::make_unique(SPR_IMG_SIGN, PAL_NONE, STR_LANDSCAPING_MENU_PLACE_SIGN, 2, false)); + list.push_back(MakeDropDownListIconItem(SPR_IMG_LANDSCAPING, PAL_NONE, STR_LANDSCAPING_MENU_LANDSCAPING, 0, false)); + list.push_back(MakeDropDownListIconItem(SPR_IMG_PLANTTREES, PAL_NONE, STR_LANDSCAPING_MENU_PLANT_TREES, 1, false)); + list.push_back(MakeDropDownListIconItem(SPR_IMG_SIGN, PAL_NONE, STR_LANDSCAPING_MENU_PLACE_SIGN, 2, false)); ShowDropDownList(w, std::move(list), 0, WID_TN_LANDSCAPE, 100, DDMF_INSTANT_CLOSE); if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP); return CBF_NONE; @@ -1182,21 +1185,21 @@ static CallBackFunction ToolbarHelpClick(Window *w) WidgetID widget = (_game_mode == GM_EDITOR) ? (WidgetID)WID_TE_HELP : (WidgetID)WID_TN_HELP; DropDownList list; - list.emplace_back(new DropDownListStringItem(STR_ABOUT_MENU_LAND_BLOCK_INFO, HME_LANDINFO, false)); - list.emplace_back(new DropDownListStringItem(STR_ABOUT_MENU_SHOW_PICKER_TOOL, HME_PICKER, _local_company == COMPANY_SPECTATOR)); - list.emplace_back(new DropDownListItem(-1, false)); - list.emplace_back(new DropDownListStringItem(STR_ABOUT_MENU_HELP, HME_HELP, false)); - list.emplace_back(new DropDownListStringItem(STR_ABOUT_MENU_TOGGLE_CONSOLE, HME_CONSOLE, false)); - list.emplace_back(new DropDownListStringItem(STR_ABOUT_MENU_AI_DEBUG, HME_SCRIPT_DEBUG, false)); - list.emplace_back(new DropDownListStringItem(STR_ABOUT_MENU_SCREENSHOT, HME_SCREENSHOT, false)); - list.emplace_back(new DropDownListStringItem(STR_ABOUT_MENU_SHOW_FRAMERATE, HME_FRAMERATE, false)); - list.emplace_back(new DropDownListStringItem(STR_ABOUT_MENU_SHOW_TOGGLE_MODIFIER_KEYS, HME_MODIFIER_KEYS, false)); - list.emplace_back(new DropDownListStringItem(STR_ABOUT_MENU_ABOUT_OPENTTD, HME_ABOUT, false)); + list.push_back(MakeDropDownListStringItem(STR_ABOUT_MENU_LAND_BLOCK_INFO, HME_LANDINFO, false)); + list.push_back(MakeDropDownListStringItem(STR_ABOUT_MENU_SHOW_PICKER_TOOL, HME_PICKER, _local_company == COMPANY_SPECTATOR)); + list.push_back(MakeDropDownListDividerItem()); + list.push_back(MakeDropDownListStringItem(STR_ABOUT_MENU_HELP, HME_HELP, false)); + list.push_back(MakeDropDownListStringItem(STR_ABOUT_MENU_TOGGLE_CONSOLE, HME_CONSOLE, false)); + list.push_back(MakeDropDownListStringItem(STR_ABOUT_MENU_AI_DEBUG, HME_SCRIPT_DEBUG, false)); + list.push_back(MakeDropDownListStringItem(STR_ABOUT_MENU_SCREENSHOT, HME_SCREENSHOT, false)); + list.push_back(MakeDropDownListStringItem(STR_ABOUT_MENU_SHOW_FRAMERATE, HME_FRAMERATE, false)); + list.push_back(MakeDropDownListStringItem(STR_ABOUT_MENU_SHOW_TOGGLE_MODIFIER_KEYS, HME_MODIFIER_KEYS, false)); + list.push_back(MakeDropDownListStringItem(STR_ABOUT_MENU_ABOUT_OPENTTD, HME_ABOUT, false)); if (_settings_client.gui.newgrf_developer_tools) { - list.emplace_back(new DropDownListStringItem(STR_ABOUT_MENU_SPRITE_ALIGNER, HME_SPRITE_ALIGNER, false)); - list.emplace_back(new DropDownListStringItem(STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES, HME_BOUNDING_BOXES, false)); - list.emplace_back(new DropDownListStringItem(STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS, HME_DIRTY_BLOCKS, false)); - list.emplace_back(new DropDownListStringItem(STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES, HME_WIDGET_OUTLINES, false)); + list.push_back(MakeDropDownListStringItem(STR_ABOUT_MENU_SPRITE_ALIGNER, HME_SPRITE_ALIGNER, false)); + list.push_back(MakeDropDownListStringItem(STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES, HME_BOUNDING_BOXES, false)); + list.push_back(MakeDropDownListStringItem(STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS, HME_DIRTY_BLOCKS, false)); + list.push_back(MakeDropDownListStringItem(STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES, HME_WIDGET_OUTLINES, false)); } PopupMainToolbarMenu(w, widget, std::move(list), 0); @@ -2798,7 +2801,7 @@ MainToolbarScaleAdjuster::MainToolbarScaleAdjuster() /* Bump scale to next integer multiple */ _gui_scale = Clamp(100 * ((_gui_scale / 100) + 1), MIN_INTERFACE_SCALE, MAX_INTERFACE_SCALE); - int8_t new_zoom = ScaleGUITrad(1) <= 1 ? ZOOM_LVL_OUT_4X : ScaleGUITrad(1) >= 4 ? ZOOM_LVL_MIN : ZOOM_LVL_OUT_2X; + int8_t new_zoom = ScaleGUITrad(1) <= 1 ? ZOOM_LVL_NORMAL : ScaleGUITrad(1) >= 4 ? ZOOM_LVL_MIN : ZOOM_LVL_IN_2X; _gui_zoom = static_cast(Clamp(new_zoom, _settings_client.gui.zoom_min, _settings_client.gui.zoom_max)); SetupWidgetDimensions(); } diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 84f5b8ca44..079b3099f3 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -542,7 +542,7 @@ void Town::UpdateVirtCoord() SetDParam(0, this->index); SetDParam(1, this->LabelParam2()); - this->cache.sign.UpdatePosition(HasBit(_display_opt, DO_SHOW_TOWN_NAMES) ? ZOOM_LVL_OUT_128X : ZOOM_LVL_END, pt.x, pt.y - 24 * ZOOM_LVL_BASE, STR_VIEWPORT_TOWN_LABEL, STR_VIEWPORT_TOWN_TINY_WHITE); + this->cache.sign.UpdatePosition(HasBit(_display_opt, DO_SHOW_TOWN_NAMES) ? ZOOM_LVL_OUT_32X : ZOOM_LVL_END, pt.x, pt.y - 24 * ZOOM_BASE, STR_VIEWPORT_TOWN_LABEL, STR_VIEWPORT_TOWN_TINY_WHITE); if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeTown(this->index)); diff --git a/src/town_gui.cpp b/src/town_gui.cpp index 48808718fd..9f8974dca9 100644 --- a/src/town_gui.cpp +++ b/src/town_gui.cpp @@ -472,11 +472,11 @@ public: } case TSOF_OVERRIDE_BUILD_INCLINED_ROADS: { DropDownList dlist; - dlist.emplace_back(new DropDownListStringItem(STR_COLOUR_DEFAULT, 0, false)); - dlist.emplace_back(new DropDownListStringItem(STR_CONFIG_SETTING_TOWN_MAX_ROAD_SLOPE_ZERO, 1, false)); + dlist.push_back(MakeDropDownListStringItem(STR_COLOUR_DEFAULT, 0, false)); + dlist.push_back(MakeDropDownListStringItem(STR_CONFIG_SETTING_TOWN_MAX_ROAD_SLOPE_ZERO, 1, false)); for (int i = 1; i <= 8; i++) { SetDParam(0, i); - dlist.emplace_back(new DropDownListStringItem(STR_CONFIG_SETTING_TOWN_MAX_ROAD_SLOPE_VALUE, i + 1, false)); + dlist.push_back(MakeDropDownListStringItem(STR_CONFIG_SETTING_TOWN_MAX_ROAD_SLOPE_VALUE, i + 1, false)); } ShowDropDownList(this, std::move(dlist), HasBit(this->town->override_flags, idx) ? this->town->max_road_slope + 1 : 0, WID_TA_SETTING); break; diff --git a/src/tracerestrict_gui.cpp b/src/tracerestrict_gui.cpp index 7e6a24b5f8..fc5aa9b120 100644 --- a/src/tracerestrict_gui.cpp +++ b/src/tracerestrict_gui.cpp @@ -658,13 +658,13 @@ static DropDownList GetGroupDropDownList(Owner owner, GroupID group_id, int &sel selected = -1; if (group_id == DEFAULT_GROUP) selected = DEFAULT_GROUP; - dlist.emplace_back(new DropDownListStringItem(STR_GROUP_DEFAULT_TRAINS, DEFAULT_GROUP, false)); + dlist.push_back(MakeDropDownListStringItem(STR_GROUP_DEFAULT_TRAINS, DEFAULT_GROUP, false)); for (size_t i = 0; i < list.size(); ++i) { const Group *g = list[i]; if (group_id == g->index) selected = group_id; SetDParam(0, g->index | GROUP_NAME_HIERARCHY); - dlist.emplace_back(new DropDownListStringItem(STR_GROUP_NAME, g->index, false)); + dlist.push_back(MakeDropDownListStringItem(STR_GROUP_NAME, g->index, false)); } return dlist; @@ -717,11 +717,11 @@ DropDownList GetSlotDropDownList(Owner owner, TraceRestrictSlotID slot_id, int & if (slot_id == s->index) selected = slot_id; if (s->vehicle_type == vehtype) { SetDParam(0, s->index); - dlist.emplace_back(new DropDownListStringItem(STR_TRACE_RESTRICT_SLOT_NAME, s->index, false)); + dlist.push_back(MakeDropDownListStringItem(STR_TRACE_RESTRICT_SLOT_NAME, s->index, false)); } else { SetDParam(0, STR_REPLACE_VEHICLE_TRAIN + s->vehicle_type); SetDParam(1, s->index); - dlist.emplace_back(new DropDownListStringItem(STR_TRACE_RESTRICT_SLOT_NAME_PREFIXED, s->index, false)); + dlist.push_back(MakeDropDownListStringItem(STR_TRACE_RESTRICT_SLOT_NAME_PREFIXED, s->index, false)); } } @@ -761,7 +761,7 @@ DropDownList GetCounterDropDownList(Owner owner, TraceRestrictCounterID ctr_id, const TraceRestrictCounter *s = list[i]; if (ctr_id == s->index) selected = ctr_id; SetDParam(0, s->index); - dlist.emplace_back(new DropDownListStringItem(STR_TRACE_RESTRICT_COUNTER_NAME, s->index, false)); + dlist.push_back(MakeDropDownListStringItem(STR_TRACE_RESTRICT_COUNTER_NAME, s->index, false)); } return dlist; @@ -1982,7 +1982,7 @@ public: DropDownList dlist; for (const TraceRestrictDropDownListItem &item : GetTypeDropDownListItems(type)) { if (!ShouldHideTypeDropDownListItem(item.flags)) { - dlist.emplace_back(new DropDownListStringItem(item.str, item.type, false)); + dlist.push_back(MakeDropDownListStringItem(item.str, item.type, false)); } } ShowDropDownList(this, std::move(dlist), type, widget, 0); @@ -3440,7 +3440,7 @@ private: list.emplace_back(MakeCompanyDropDownListItem(c->index)); if (c->index == value) missing_ok = true; } - list.emplace_back(new DropDownListStringItem(STR_TRACE_RESTRICT_UNDEFINED_COMPANY, INVALID_COMPANY, false)); + list.push_back(MakeDropDownListStringItem(STR_TRACE_RESTRICT_UNDEFINED_COMPANY, INVALID_COMPANY, false)); if (INVALID_COMPANY == value) missing_ok = true; assert(missing_ok == true); diff --git a/src/vehicle.cpp b/src/vehicle.cpp index a385451092..c647f3d874 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -82,13 +82,13 @@ static const uint GEN_HASHX_BUCKET_BITS = 7; static const uint GEN_HASHY_BUCKET_BITS = 6; /* Compute hash for vehicle coord */ -#define GEN_HASHX(x) GB((x), GEN_HASHX_BUCKET_BITS + ZOOM_LVL_SHIFT, GEN_HASHX_BITS) -#define GEN_HASHY(y) (GB((y), GEN_HASHY_BUCKET_BITS + ZOOM_LVL_SHIFT, GEN_HASHY_BITS) << GEN_HASHX_BITS) +#define GEN_HASHX(x) GB((x), GEN_HASHX_BUCKET_BITS + ZOOM_BASE_SHIFT, GEN_HASHX_BITS) +#define GEN_HASHY(y) (GB((y), GEN_HASHY_BUCKET_BITS + ZOOM_BASE_SHIFT, GEN_HASHY_BITS) << GEN_HASHX_BITS) #define GEN_HASH(x, y) (GEN_HASHY(y) + GEN_HASHX(x)) /* Maximum size until hash repeats */ -//static const int GEN_HASHX_SIZE = 1 << (GEN_HASHX_BUCKET_BITS + GEN_HASHX_BITS + ZOOM_LVL_SHIFT); -//static const int GEN_HASHY_SIZE = 1 << (GEN_HASHY_BUCKET_BITS + GEN_HASHY_BITS + ZOOM_LVL_SHIFT); +//static const int GEN_HASHX_SIZE = 1 << (GEN_HASHX_BUCKET_BITS + GEN_HASHX_BITS + ZOOM_BASE_SHIFT); +//static const int GEN_HASHY_SIZE = 1 << (GEN_HASHY_BUCKET_BITS + GEN_HASHY_BITS + ZOOM_BASE_SHIFT); /* Increments to reach next bucket in hash table */ //static const int GEN_HASHX_INC = 1; @@ -1955,8 +1955,8 @@ struct ViewportHashBound { static const int VHB_BASE_MARGIN = 70; static ViewportHashBound GetViewportHashBound(int l, int r, int t, int b, int x_margin, int y_margin) { - int xl = (l - ((VHB_BASE_MARGIN + x_margin) * ZOOM_LVL_BASE)) >> (7 + ZOOM_LVL_SHIFT); - int xu = (r + (x_margin * ZOOM_LVL_BASE)) >> (7 + ZOOM_LVL_SHIFT); + int xl = (l - ((VHB_BASE_MARGIN + x_margin) * ZOOM_BASE)) >> (7 + ZOOM_BASE_SHIFT); + int xu = (r + (x_margin * ZOOM_BASE)) >> (7 + ZOOM_BASE_SHIFT); /* compare after shifting instead of before, so that lower bits don't affect comparison result */ if (xu - xl < (1 << 6)) { xl &= 0x3F; @@ -1967,8 +1967,8 @@ static ViewportHashBound GetViewportHashBound(int l, int r, int t, int b, int x_ xu = 0x3F; } - int yl = (t - ((VHB_BASE_MARGIN + y_margin) * ZOOM_LVL_BASE)) >> (6 + ZOOM_LVL_SHIFT); - int yu = (b + (y_margin * ZOOM_LVL_BASE)) >> (6 + ZOOM_LVL_SHIFT); + int yl = (t - ((VHB_BASE_MARGIN + y_margin) * ZOOM_BASE)) >> (6 + ZOOM_BASE_SHIFT); + int yu = (b + (y_margin * ZOOM_BASE)) >> (6 + ZOOM_BASE_SHIFT); /* compare after shifting instead of before, so that lower bits don't affect comparison result */ if (yu - yl < (1 << 6)) { yl = (yl & 0x3F) << 6; @@ -1994,10 +1994,10 @@ void ViewportAddVehiclesIntl(DrawPixelInfo *dpi) const ViewportHashBound vhb = GetViewportHashBound(l, r, t, b, update_vehicles ? MAX_VEHICLE_PIXEL_X - VHB_BASE_MARGIN : 0, update_vehicles ? MAX_VEHICLE_PIXEL_Y - VHB_BASE_MARGIN : 0); - const int ul = l - (MAX_VEHICLE_PIXEL_X * ZOOM_LVL_BASE); - const int ur = r + (MAX_VEHICLE_PIXEL_X * ZOOM_LVL_BASE); - const int ut = t - (MAX_VEHICLE_PIXEL_Y * ZOOM_LVL_BASE); - const int ub = b + (MAX_VEHICLE_PIXEL_Y * ZOOM_LVL_BASE); + const int ul = l - (MAX_VEHICLE_PIXEL_X * ZOOM_BASE); + const int ur = r + (MAX_VEHICLE_PIXEL_X * ZOOM_BASE); + const int ut = t - (MAX_VEHICLE_PIXEL_Y * ZOOM_BASE); + const int ub = b + (MAX_VEHICLE_PIXEL_Y * ZOOM_BASE); for (int y = vhb.yl;; y = (y + (1 << 6)) & (0x3F << 6)) { for (int x = vhb.xl;; x = (x + 1) & 0x3F) { @@ -2827,8 +2827,8 @@ void Vehicle::UpdateViewport(bool dirty) Point pt = RemapCoords(this->x_pos + this->x_offs, this->y_pos + this->y_offs, this->z_pos); new_coord.left += pt.x; new_coord.top += pt.y; - new_coord.right += pt.x + 2 * ZOOM_LVL_BASE; - new_coord.bottom += pt.y + 2 * ZOOM_LVL_BASE; + new_coord.right += pt.x + 2 * ZOOM_BASE; + new_coord.bottom += pt.y + 2 * ZOOM_BASE; UpdateVehicleViewportHash(this, new_coord.left, new_coord.top); @@ -2857,8 +2857,8 @@ void Vehicle::UpdateViewportDeferred() Point pt = RemapCoords(this->x_pos + this->x_offs, this->y_pos + this->y_offs, this->z_pos); new_coord.left += pt.x; new_coord.top += pt.y; - new_coord.right += pt.x + 2 * ZOOM_LVL_BASE; - new_coord.bottom += pt.y + 2 * ZOOM_LVL_BASE; + new_coord.right += pt.x + 2 * ZOOM_BASE; + new_coord.bottom += pt.y + 2 * ZOOM_BASE; UpdateVehicleViewportHashDeferred(this, new_coord.left, new_coord.top); diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 1bb6de0d7f..585efd580c 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -26,7 +26,9 @@ #include "vehicle_func.h" #include "autoreplace_gui.h" #include "string_func.h" +#include "dropdown_type.h" #include "dropdown_func.h" +#include "dropdown_common_type.h" #include "timetable.h" #include "articulated_vehicles.h" #include "spritecache.h" @@ -402,17 +404,17 @@ DropDownList BaseVehicleListWindow::BuildCargoDropDownList(bool full) const DropDownList list; /* Add item for disabling filtering. */ - list.push_back(std::make_unique(this->GetCargoFilterLabel(CargoFilterCriteria::CF_ANY), CargoFilterCriteria::CF_ANY, false)); + list.push_back(MakeDropDownListStringItem(this->GetCargoFilterLabel(CargoFilterCriteria::CF_ANY), CargoFilterCriteria::CF_ANY)); /* Add item for freight (i.e. vehicles with cargo capacity and with no passenger capacity). */ - list.push_back(std::make_unique(this->GetCargoFilterLabel(CargoFilterCriteria::CF_FREIGHT), CargoFilterCriteria::CF_FREIGHT, false)); + list.push_back(MakeDropDownListStringItem(this->GetCargoFilterLabel(CargoFilterCriteria::CF_FREIGHT), CargoFilterCriteria::CF_FREIGHT)); /* Add item for vehicles not carrying anything, e.g. train engines. */ - list.push_back(std::make_unique(this->GetCargoFilterLabel(CargoFilterCriteria::CF_NONE), CargoFilterCriteria::CF_NONE, false)); + list.push_back(MakeDropDownListStringItem(this->GetCargoFilterLabel(CargoFilterCriteria::CF_NONE), CargoFilterCriteria::CF_NONE)); /* Add cargos */ Dimension d = GetLargestCargoIconSize(); for (const CargoSpec *cs : _sorted_cargo_specs) { 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()))); + list.push_back(MakeDropDownListIconItem(d, cs->GetCargoIcon(), PAL_NONE, cs->name, cs->Index(), false, !HasBit(this->used_cargoes, cs->Index()))); } return list; @@ -442,37 +444,37 @@ DropDownList BaseVehicleListWindow::BuildActionDropdownList(bool show_autoreplac /* Autoreplace actions. */ if (show_autoreplace) { - list.push_back(std::make_unique(STR_VEHICLE_LIST_REPLACE_VEHICLES, ADI_REPLACE, disable)); + list.push_back(MakeDropDownListStringItem(STR_VEHICLE_LIST_REPLACE_VEHICLES, ADI_REPLACE, disable)); if (show_template_replace) { - list.push_back(std::make_unique(STR_TMPL_TEMPLATE_REPLACEMENT, ADI_TEMPLATE_REPLACE, disable)); + list.push_back(MakeDropDownListStringItem(STR_TMPL_TEMPLATE_REPLACEMENT, ADI_TEMPLATE_REPLACE, disable)); } - list.push_back(std::make_unique(-1, false)); + list.push_back(MakeDropDownListDividerItem()); } /* Group actions. */ if (show_group) { - list.push_back(std::make_unique(STR_GROUP_ADD_SHARED_VEHICLE, ADI_ADD_SHARED, disable)); - list.push_back(std::make_unique(STR_GROUP_REMOVE_ALL_VEHICLES, ADI_REMOVE_ALL, disable)); - list.push_back(std::make_unique(-1, false)); + list.push_back(MakeDropDownListStringItem(STR_GROUP_ADD_SHARED_VEHICLE, ADI_ADD_SHARED, disable)); + list.push_back(MakeDropDownListStringItem(STR_GROUP_REMOVE_ALL_VEHICLES, ADI_REMOVE_ALL, disable)); + list.push_back(MakeDropDownListDividerItem()); } - list.push_back(std::make_unique(STR_TRACE_RESTRICT_SLOT_MANAGE, ADI_TRACERESTRICT_SLOT_MGMT, false)); + list.push_back(MakeDropDownListStringItem(STR_TRACE_RESTRICT_SLOT_MANAGE, ADI_TRACERESTRICT_SLOT_MGMT, false)); if (_settings_client.gui.show_adv_tracerestrict_features) { - list.push_back(std::make_unique(STR_TRACE_RESTRICT_COUNTER_MANAGE, ADI_TRACERESTRICT_COUNTER_MGMT, false)); + list.push_back(MakeDropDownListStringItem(STR_TRACE_RESTRICT_COUNTER_MANAGE, ADI_TRACERESTRICT_COUNTER_MGMT, false)); } if (change_order_str != 0) { - list.push_back(std::make_unique(change_order_str, ADI_CHANGE_ORDER, disable)); + list.push_back(MakeDropDownListStringItem(change_order_str, ADI_CHANGE_ORDER, disable)); } if (show_create_group) { - list.push_back(std::make_unique(STR_VEHICLE_LIST_CREATE_GROUP, ADI_CREATE_GROUP, disable)); + list.push_back(MakeDropDownListStringItem(STR_VEHICLE_LIST_CREATE_GROUP, ADI_CREATE_GROUP, disable)); } - list.push_back(std::make_unique(-1, false)); + list.push_back(MakeDropDownListDividerItem()); /* Depot actions. */ - list.push_back(std::make_unique(STR_VEHICLE_LIST_SEND_FOR_SERVICING, ADI_SERVICE, mass_action_disable)); - list.push_back(std::make_unique(this->vehicle_depot_name[this->vli.vtype], ADI_DEPOT, mass_action_disable)); - if (_settings_client.gui.show_depot_sell_gui) list.push_back(std::make_unique(this->vehicle_depot_sell_name[this->vli.vtype], ADI_DEPOT_SELL, mass_action_disable)); - list.push_back(std::make_unique(STR_VEHICLE_LIST_CANCEL_DEPOT_SERVICE, ADI_CANCEL_DEPOT, mass_action_disable)); + list.push_back(MakeDropDownListStringItem(STR_VEHICLE_LIST_SEND_FOR_SERVICING, ADI_SERVICE, mass_action_disable)); + list.push_back(MakeDropDownListStringItem(this->vehicle_depot_name[this->vli.vtype], ADI_DEPOT, mass_action_disable)); + if (_settings_client.gui.show_depot_sell_gui) list.push_back(MakeDropDownListStringItem(this->vehicle_depot_sell_name[this->vli.vtype], ADI_DEPOT_SELL, mass_action_disable)); + list.push_back(MakeDropDownListStringItem(STR_VEHICLE_LIST_CANCEL_DEPOT_SERVICE, ADI_CANCEL_DEPOT, mass_action_disable)); return list; } @@ -1358,12 +1360,12 @@ struct RefitWindow : public Window { DropDownList dlist; int selected = 0; - dlist.emplace_back(new DropDownListStringItem(STR_REFIT_WHOLE_SHIP, 0, false)); + dlist.push_back(MakeDropDownListStringItem(STR_REFIT_WHOLE_SHIP, 0, false)); int offset = 1; for (const Vehicle *u = v; u != nullptr; u = u->Next()) { if (u->index == this->selected_vehicle && this->num_vehicles == 1) selected = offset; - dlist.emplace_back(new DropDownListStringItem(this->GetShipPartName(u), offset, false)); + dlist.push_back(MakeDropDownListStringItem(this->GetShipPartName(u), offset, false)); offset++; } @@ -3472,17 +3474,17 @@ struct VehicleDetailsWindow : Window { DropDownList list; if (v->type == VEH_TRAIN) { bool change_allowed = IsVehicleControlAllowed(v, _local_company); - list.emplace_back(new DropDownListStringItem(STR_VEHICLE_DETAILS_REMOVE_SPEED_RESTRICTION, VDWDDA_CLEAR_SPEED_RESTRICTION, !change_allowed || Train::From(v)->speed_restriction == 0)); - list.emplace_back(new DropDownListStringItem(STR_VEHICLE_DETAILS_SET_SPEED_RESTRICTION, VDWDDA_SET_SPEED_RESTRICTION, !change_allowed)); + list.push_back(MakeDropDownListStringItem(STR_VEHICLE_DETAILS_REMOVE_SPEED_RESTRICTION, VDWDDA_CLEAR_SPEED_RESTRICTION, !change_allowed || Train::From(v)->speed_restriction == 0)); + list.push_back(MakeDropDownListStringItem(STR_VEHICLE_DETAILS_SET_SPEED_RESTRICTION, VDWDDA_SET_SPEED_RESTRICTION, !change_allowed)); } if (HasBit(v->vehicle_flags, VF_HAVE_SLOT)) { - if (!list.empty()) list.push_back(std::make_unique(-1, false)); + if (!list.empty()) list.push_back(MakeDropDownListDividerItem()); list.push_back(std::make_unique>(STR_VEHICLE_DETAILS_REMOVE_FROM_SLOT, -1)); std::vector slots = this->GetVehicleSlots(v); for (TraceRestrictSlotID slot_id : slots) { SetDParam(0, slot_id); - list.emplace_back(new DropDownListCheckedItem(false, STR_TRACE_RESTRICT_SLOT_NAME, VDWDDA_REMOVE_FROM_SLOT | (slot_id << 8), TraceRestrictSlot::Get(slot_id)->owner != _local_company)); + list.push_back(MakeDropDownListCheckedItem(false, STR_TRACE_RESTRICT_SLOT_NAME, VDWDDA_REMOVE_FROM_SLOT | (slot_id << 8), TraceRestrictSlot::Get(slot_id)->owner != _local_company)); } } ShowDropDownList(this, std::move(list), -1, WID_VD_EXTRA_ACTIONS, 140); @@ -4220,10 +4222,10 @@ public: } else if (_ctrl_pressed && _settings_client.gui.show_depot_sell_gui && v->current_order.IsType(OT_GOTO_DEPOT)) { OrderDepotActionFlags flags = v->current_order.GetDepotActionType() & (ODATFB_HALT | ODATFB_SELL); DropDownList list; - list.emplace_back(new DropDownListStringItem(STR_VEHICLE_LIST_SEND_FOR_SERVICING, DEPOT_SERVICE | DEPOT_DONT_CANCEL, !flags)); - list.emplace_back(new DropDownListStringItem(BaseVehicleListWindow::vehicle_depot_name[v->type], DEPOT_DONT_CANCEL, flags == ODATFB_HALT)); - list.emplace_back(new DropDownListStringItem(BaseVehicleListWindow::vehicle_depot_sell_name[v->type], DEPOT_SELL | DEPOT_DONT_CANCEL, flags == (ODATFB_HALT | ODATFB_SELL))); - list.emplace_back(new DropDownListStringItem(STR_VEHICLE_LIST_CANCEL_DEPOT_SERVICE, DEPOT_CANCEL, false)); + list.push_back(MakeDropDownListStringItem(STR_VEHICLE_LIST_SEND_FOR_SERVICING, DEPOT_SERVICE | DEPOT_DONT_CANCEL, !flags)); + list.push_back(MakeDropDownListStringItem(BaseVehicleListWindow::vehicle_depot_name[v->type], DEPOT_DONT_CANCEL, flags == ODATFB_HALT)); + list.push_back(MakeDropDownListStringItem(BaseVehicleListWindow::vehicle_depot_sell_name[v->type], DEPOT_SELL | DEPOT_DONT_CANCEL, flags == (ODATFB_HALT | ODATFB_SELL))); + list.push_back(MakeDropDownListStringItem(STR_VEHICLE_LIST_CANCEL_DEPOT_SERVICE, DEPOT_CANCEL, false)); ShowDropDownList(this, std::move(list), -1, widget); } else { this->HandleButtonClick(WID_VV_GOTO_DEPOT); diff --git a/src/video/opengl.cpp b/src/video/opengl.cpp index d5e9bd2421..e1724d7f33 100644 --- a/src/video/opengl.cpp +++ b/src/video/opengl.cpp @@ -1273,20 +1273,19 @@ void OpenGLBackend::ReleaseAnimBuffer(const Rect &update_rect) Sprite *dest_sprite = (Sprite *)allocator(sizeof(*dest_sprite) + sizeof(OpenGLSprite)); OpenGLSprite *gl_sprite = (OpenGLSprite *)dest_sprite->data; - new (gl_sprite) OpenGLSprite(sprite[ZOOM_LVL_NORMAL].width, sprite[ZOOM_LVL_NORMAL].height, sprite[ZOOM_LVL_NORMAL].type == SpriteType::Font ? 1 : ZOOM_LVL_SPR_COUNT, sprite[ZOOM_LVL_NORMAL].colours); + new (gl_sprite) OpenGLSprite(sprite[ZOOM_LVL_MIN].width, sprite[ZOOM_LVL_MIN].height, sprite[ZOOM_LVL_MIN].type == SpriteType::Font ? 1 : ZOOM_LVL_SPR_COUNT, sprite[ZOOM_LVL_MIN].colours); /* Upload texture data. */ - for (int i = 0; i < (sprite[ZOOM_LVL_NORMAL].type == SpriteType::Font ? 1 : ZOOM_LVL_SPR_COUNT); i++) { + for (int i = 0; i < (sprite[ZOOM_LVL_MIN].type == SpriteType::Font ? 1 : ZOOM_LVL_SPR_COUNT); i++) { gl_sprite->Update(sprite[i].width, sprite[i].height, i, sprite[i].data); } - 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; + dest_sprite->height = sprite[ZOOM_LVL_MIN].height; + dest_sprite->width = sprite[ZOOM_LVL_MIN].width; + dest_sprite->x_offs = sprite[ZOOM_LVL_MIN].x_offs; + dest_sprite->y_offs = sprite[ZOOM_LVL_MIN].y_offs; dest_sprite->next = nullptr; dest_sprite->missing_zoom_levels = 0; - return dest_sprite; } diff --git a/src/viewport.cpp b/src/viewport.cpp index e222345a1e..60043d7ca4 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -149,10 +149,10 @@ bool _viewport_sign_kdtree_valid = false; static int _viewport_sign_maxwidth = 0; -//static const int MAX_TILE_EXTENT_LEFT = ZOOM_LVL_BASE * TILE_PIXELS; ///< Maximum left extent of tile relative to north corner. -//static const int MAX_TILE_EXTENT_RIGHT = ZOOM_LVL_BASE * TILE_PIXELS; ///< Maximum right extent of tile relative to north corner. -static const int MAX_TILE_EXTENT_TOP = ZOOM_LVL_BASE * MAX_BUILDING_PIXELS; ///< Maximum top extent of tile relative to north corner (not considering bridges). -static const int MAX_TILE_EXTENT_BOTTOM = ZOOM_LVL_BASE * (TILE_PIXELS + 2 * TILE_HEIGHT); ///< Maximum bottom extent of tile relative to north corner (worst case: #SLOPE_STEEP_N). +//static const int MAX_TILE_EXTENT_LEFT = ZOOM_BASE * TILE_PIXELS; ///< Maximum left extent of tile relative to north corner. +//static const int MAX_TILE_EXTENT_RIGHT = ZOOM_BASE * TILE_PIXELS; ///< Maximum right extent of tile relative to north corner. +static const int MAX_TILE_EXTENT_TOP = ZOOM_BASE * MAX_BUILDING_PIXELS; ///< Maximum top extent of tile relative to north corner (not considering bridges). +static const int MAX_TILE_EXTENT_BOTTOM = ZOOM_BASE * (TILE_PIXELS + 2 * TILE_HEIGHT); ///< Maximum bottom extent of tile relative to north corner (worst case: #SLOPE_STEEP_N). struct StringSpriteToDraw { StringID string; @@ -330,7 +330,7 @@ struct ViewportDrawerDynamic { dpi_for_text.top = UnScaleByZoom(this->dpi.top, this->dpi.zoom); dpi_for_text.width = UnScaleByZoom(this->dpi.width, this->dpi.zoom); dpi_for_text.height = UnScaleByZoom(this->dpi.height, this->dpi.zoom); - dpi_for_text.zoom = ZOOM_LVL_NORMAL; + dpi_for_text.zoom = ZOOM_LVL_MIN; return dpi_for_text; } }; @@ -484,10 +484,10 @@ static void FillViewportCoverageRect() _viewport_vehicle_map_redraw_rects.push_back(r); } else { _viewport_vehicle_normal_redraw_rects.push_back({ - r.left - (MAX_VEHICLE_PIXEL_X * ZOOM_LVL_BASE), - r.top - (MAX_VEHICLE_PIXEL_Y * ZOOM_LVL_BASE), - r.right + (MAX_VEHICLE_PIXEL_X * ZOOM_LVL_BASE), - r.bottom + (MAX_VEHICLE_PIXEL_Y * ZOOM_LVL_BASE), + r.left - (MAX_VEHICLE_PIXEL_X * ZOOM_BASE), + r.top - (MAX_VEHICLE_PIXEL_Y * ZOOM_BASE), + r.right + (MAX_VEHICLE_PIXEL_X * ZOOM_BASE), + r.bottom + (MAX_VEHICLE_PIXEL_Y * ZOOM_BASE), }); } } @@ -566,7 +566,7 @@ static void ScrollPlanPixelCache(Viewport *vp, int offset_x, int offset_y) plan_dpi.height = height; plan_dpi.width = width; plan_dpi.pitch = vp->width; - plan_dpi.zoom = ZOOM_LVL_NORMAL; + plan_dpi.zoom = ZOOM_LVL_MIN; plan_dpi.left = UnScaleByZoomLower(vp->virtual_left, vp->zoom) + x; plan_dpi.top = UnScaleByZoomLower(vp->virtual_top, vp->zoom) + y; @@ -592,7 +592,7 @@ static void ScrollOrInvalidateOverlayPixelCache(Viewport *vp, int offset_x, int overlay_dpi.height = height; overlay_dpi.width = width; overlay_dpi.pitch = vp->width; - overlay_dpi.zoom = ZOOM_LVL_NORMAL; + overlay_dpi.zoom = ZOOM_LVL_MIN; overlay_dpi.left = UnScaleByZoomLower(vp->virtual_left, vp->zoom) + x; overlay_dpi.top = UnScaleByZoomLower(vp->virtual_top, vp->zoom) + y; @@ -1136,9 +1136,9 @@ void DrawGroundSpriteAt(SpriteID image, PaletteID pal, int32_t x, int32_t y, int if (_vd.foundation[_vd.foundation_part] != -1) { Point pt = RemapCoords(x, y, z); - AddChildSpriteToFoundation(image, pal, sub, _vd.foundation_part, pt.x + extra_offs_x * ZOOM_LVL_BASE, pt.y + extra_offs_y * ZOOM_LVL_BASE); + AddChildSpriteToFoundation(image, pal, sub, _vd.foundation_part, pt.x + extra_offs_x * ZOOM_BASE, pt.y + extra_offs_y * ZOOM_BASE); } else { - AddTileSpriteToDraw(image, pal, _cur_ti.x + x, _cur_ti.y + y, _cur_ti.z + z, sub, extra_offs_x * ZOOM_LVL_BASE, extra_offs_y * ZOOM_LVL_BASE); + AddTileSpriteToDraw(image, pal, _cur_ti.x + x, _cur_ti.y + y, _cur_ti.z + z, sub, extra_offs_x * ZOOM_BASE, extra_offs_y * ZOOM_BASE); } } @@ -1180,8 +1180,8 @@ void OffsetGroundSprite(int x, int y) /* _vd.last_child == nullptr if foundation sprite was clipped by the viewport bounds */ if (_vd.last_child != nullptr) _vd.foundation[_vd.foundation_part] = (uint)_vdd->parent_sprites_to_draw.size() - 1; - _vd.foundation_offset[_vd.foundation_part].x = x * ZOOM_LVL_BASE; - _vd.foundation_offset[_vd.foundation_part].y = y * ZOOM_LVL_BASE; + _vd.foundation_offset[_vd.foundation_part].x = x * ZOOM_BASE; + _vd.foundation_offset[_vd.foundation_part].y = y * ZOOM_BASE; _vd.last_foundation_child[_vd.foundation_part] = _vd.last_child; } @@ -1454,8 +1454,8 @@ void AddChildSpriteScreen(SpriteID image, PaletteID pal, int x, int y, bool tran cs.image = image; cs.pal = pal; cs.sub = sub; - cs.x = scale ? x * ZOOM_LVL_BASE : x; - cs.y = scale ? y * ZOOM_LVL_BASE : y; + cs.x = scale ? x * ZOOM_BASE : x; + cs.y = scale ? y * ZOOM_BASE : y; cs.position_mode = position_mode; cs.next = -1; @@ -1503,7 +1503,7 @@ void DrawSelectionSprite(SpriteID image, PaletteID pal, const TileInfo *ti, int AddTileSpriteToDraw(image, pal, ti->x, ti->y, ti->z + z_offset, sub, extra_offs_x, extra_offs_y); } else { /* draw on top of foundation */ - AddChildSpriteToFoundation(image, pal, sub, foundation_part, extra_offs_x, extra_offs_y - z_offset * ZOOM_LVL_BASE); + AddChildSpriteToFoundation(image, pal, sub, foundation_part, extra_offs_x, extra_offs_y - z_offset * ZOOM_BASE); } } @@ -1805,7 +1805,7 @@ static void DrawTileSelection(const TileInfo *ti) static int GetViewportY(Point tile) { /* Each increment in X or Y direction moves down by half a tile, i.e. TILE_PIXELS / 2. */ - return (tile.y * (int)(TILE_PIXELS / 2) + tile.x * (int)(TILE_PIXELS / 2) - TilePixelHeightOutsideMap(tile.x, tile.y)) << ZOOM_LVL_SHIFT; + return (tile.y * (int)(TILE_PIXELS / 2) + tile.x * (int)(TILE_PIXELS / 2) - TilePixelHeightOutsideMap(tile.x, tile.y)) << ZOOM_BASE_SHIFT; } /** @@ -1835,7 +1835,7 @@ static void ViewportAddLandscape() int left_column = DivTowardsNegativeInf(upper_left.y - upper_left.x, (int)TILE_SIZE) - 1; int right_column = DivTowardsPositiveInf(upper_right.y - upper_right.x, (int)TILE_SIZE) + 1; - int potential_bridge_height = ZOOM_LVL_BASE * TILE_HEIGHT * _settings_game.construction.max_bridge_height; + int potential_bridge_height = ZOOM_BASE * TILE_HEIGHT * _settings_game.construction.max_bridge_height; /* Rows overlap with neighbouring rows by a half tile. * The first row that could possibly be visible is the row above upper_left (if it is at height 0). @@ -1895,7 +1895,7 @@ static void ViewportAddLandscape() if (IsBridgeAbove(_cur_ti.tile)) { /* Is the bridge visible? */ TileIndex bridge_tile = GetNorthernBridgeEnd(_cur_ti.tile); - int bridge_height = ZOOM_LVL_BASE * (GetBridgePixelHeight(bridge_tile) - TilePixelHeight(_cur_ti.tile)); + int bridge_height = ZOOM_BASE * (GetBridgePixelHeight(bridge_tile) - TilePixelHeight(_cur_ti.tile)); if (min_visible_height < bridge_height + MAX_TILE_EXTENT_TOP) tile_visible = true; } @@ -2060,7 +2060,7 @@ static void ViewportAddKdtreeSigns(ViewportDrawerDynamic *vdd, DrawPixelInfo *dp /* Layering order (bottom to top): Town names, signs, stations */ for (const auto *t : towns) { - ViewportAddString(vdd, dpi, ZOOM_LVL_OUT_16X, &t->cache.sign, + ViewportAddString(vdd, dpi, ZOOM_LVL_OUT_4X, &t->cache.sign, STR_VIEWPORT_TOWN_LABEL, STR_VIEWPORT_TOWN_LABEL_TINY, STR_VIEWPORT_TOWN_TINY_BLACK, t->index, t->LabelParam2()); } @@ -2069,7 +2069,7 @@ static void ViewportAddKdtreeSigns(ViewportDrawerDynamic *vdd, DrawPixelInfo *dp if (vdd->IsInvisibilitySet(TO_SIGNS)) return; for (const auto *si : signs) { - ViewportAddString(vdd, dpi, ZOOM_LVL_OUT_16X, &si->sign, + ViewportAddString(vdd, dpi, ZOOM_LVL_OUT_4X, &si->sign, STR_WHITE_SIGN, (vdd->IsTransparencySet(TO_SIGNS) || si->owner == OWNER_DEITY) ? STR_VIEWPORT_SIGN_SMALL_WHITE : STR_VIEWPORT_SIGN_SMALL_BLACK, STR_NULL, si->index, 0, (si->owner == OWNER_NONE) ? COLOUR_GREY : (si->owner == OWNER_DEITY ? INVALID_COLOUR : _company_colours[si->owner])); @@ -2078,12 +2078,12 @@ static void ViewportAddKdtreeSigns(ViewportDrawerDynamic *vdd, DrawPixelInfo *dp for (const auto *st : stations) { if (Station::IsExpected(st)) { /* Station */ - ViewportAddString(vdd, dpi, ZOOM_LVL_OUT_16X, &st->sign, + ViewportAddString(vdd, dpi, ZOOM_LVL_OUT_4X, &st->sign, STR_VIEWPORT_STATION, STR_VIEWPORT_STATION_TINY, STR_NULL, st->index, st->facilities, (st->owner == OWNER_NONE || !st->IsInUse()) ? COLOUR_GREY : _company_colours[st->owner]); } else { /* Waypoint */ - ViewportAddString(vdd, dpi, ZOOM_LVL_OUT_16X, &st->sign, + ViewportAddString(vdd, dpi, ZOOM_LVL_OUT_4X, &st->sign, STR_VIEWPORT_WAYPOINT, STR_VIEWPORT_WAYPOINT_TINY, STR_NULL, st->index, st->facilities, (st->owner == OWNER_NONE || !st->IsInUse()) ? COLOUR_GREY : _company_colours[st->owner]); } @@ -2133,7 +2133,7 @@ void ViewportSign::MarkDirty(ZoomLevel maxzoom) const Rect zoomlevels[ZOOM_LVL_END]; for (ZoomLevel zoom = ZOOM_LVL_BEGIN; zoom != ZOOM_LVL_END; zoom++) { - const ZoomLevel small_from = (maxzoom == ZOOM_LVL_OUT_8X) ? ZOOM_LVL_OUT_8X : ZOOM_LVL_OUT_16X; + const ZoomLevel small_from = (maxzoom == ZOOM_LVL_OUT_2X) ? ZOOM_LVL_OUT_2X : ZOOM_LVL_OUT_4X; const int width = (zoom >= small_from) ? this->width_small : this->width_normal ; zoomlevels[zoom].left = this->center - ScaleByZoom(width / 2 + 1, zoom); zoomlevels[zoom].top = this->top - ScaleByZoom(1, zoom); @@ -2649,8 +2649,8 @@ void ViewportRouteOverlay::DrawVehicleRoutePath(const Viewport *vp, ViewportDraw if (from_x < dpi_for_text.left - 1 && to_x < dpi_for_text.left - 1) continue; if (from_x > dpi_for_text.left + dpi_for_text.width + 1 && to_x > dpi_for_text.left + dpi_for_text.width + 1) continue; - from_pt.y -= GetSlopePixelZ(from_tile_x, from_tile_y) * ZOOM_LVL_BASE; - to_pt.y -= GetSlopePixelZ(to_tile_x, to_tile_y) * ZOOM_LVL_BASE; + from_pt.y -= GetSlopePixelZ(from_tile_x, from_tile_y) * ZOOM_BASE; + to_pt.y -= GetSlopePixelZ(to_tile_x, to_tile_y) * ZOOM_BASE; const int from_y = UnScaleByZoom(from_pt.y, vp->zoom); const int to_y = UnScaleByZoom(to_pt.y, vp->zoom); @@ -2695,7 +2695,7 @@ static inline void DrawRouteStep(const Viewport * const vp, const TileIndex tile const int x = x_centre - (total_width / 2); if (x >= _cur_dpi->width || (x + total_width) <= 0) return; const uint step_count = list.size() > max_rank_order_type_count ? 1 : (uint)list.size(); - pt.y -= GetSlopePixelZ(x_pos, y_pos) * ZOOM_LVL_BASE; + pt.y -= GetSlopePixelZ(x_pos, y_pos) * ZOOM_BASE; const int char_height = GetCharacterHeight(FS_SMALL) + 1; const int rsth = _vp_route_step_height_top + (int) step_count * char_height + _vp_route_step_height_bottom; const int y = UnScaleByZoomLower(pt.y - _vdd->dpi.top, _vdd->dpi.zoom) - rsth; @@ -2882,11 +2882,11 @@ static void ViewportDrawPlans(const Viewport *vp, Blitter *blitter, DrawPixelInf ScaleByZoom(plan_dpi->left - 2, vp->zoom), ScaleByZoom(plan_dpi->top - 2, vp->zoom), ScaleByZoom(plan_dpi->left + plan_dpi->width + 2, vp->zoom), - ScaleByZoom(plan_dpi->top + plan_dpi->height + 2, vp->zoom) + (int)(ZOOM_LVL_BASE * TILE_HEIGHT * _settings_game.construction.map_height_limit) + ScaleByZoom(plan_dpi->top + plan_dpi->height + 2, vp->zoom) + (int)(ZOOM_BASE * TILE_HEIGHT * _settings_game.construction.map_height_limit) }; - const int min_coord_delta = bounds.left / (int)(2 * ZOOM_LVL_BASE * TILE_SIZE); - const int max_coord_delta = (bounds.right / (int)(2 * ZOOM_LVL_BASE * TILE_SIZE)) + 1; + const int min_coord_delta = bounds.left / (int)(2 * ZOOM_BASE * TILE_SIZE); + const int max_coord_delta = (bounds.right / (int)(2 * ZOOM_BASE * TILE_SIZE)) + 1; for (Plan *p : Plan::Iterate()) { if (!p->IsVisible()) continue; @@ -3430,7 +3430,7 @@ static inline void ViewportMapStoreBridgeAboveTile(const Viewport * const vp, co static inline TileIndex ViewportMapGetMostSignificantTileType(const Viewport * const vp, const TileIndex from_tile, TileType * const tile_type) { - if (vp->zoom <= ZOOM_LVL_OUT_128X) { + if (vp->zoom <= ZOOM_LVL_OUT_32X) { const TileType ttype = GetTileType(from_tile); /* Store bridges and tunnels. */ if (ttype != MP_TUNNELBRIDGE) { @@ -3450,7 +3450,7 @@ static inline TileIndex ViewportMapGetMostSignificantTileType(const Viewport * c return from_tile; } - const uint8_t length = (vp->zoom - ZOOM_LVL_OUT_128X) * 2; + const uint8_t length = (vp->zoom - ZOOM_LVL_OUT_32X) * 2; TileArea tile_area = TileArea(from_tile, length, length); tile_area.ClampToMap(); @@ -3747,10 +3747,10 @@ void ViewportMapDraw(Viewport * const vp) const uint line_padding = 2 * (sy & 1); uint colour_index_base = (sx + line_padding) & 3; - const int incr_a = (1 << (vp->zoom - 2)) / ZOOM_LVL_BASE; - const int incr_b = (1 << (vp->zoom - 1)) / ZOOM_LVL_BASE; - const int a = (_vdd->dpi.left >> 2) / ZOOM_LVL_BASE; - int b = (_vdd->dpi.top >> 1) / ZOOM_LVL_BASE; + const int incr_a = (1 << (vp->zoom - 2)) / ZOOM_BASE; + const int incr_b = (1 << (vp->zoom - 1)) / ZOOM_BASE; + const int a = (_vdd->dpi.left >> 2) / ZOOM_BASE; + int b = (_vdd->dpi.top >> 1) / ZOOM_BASE; const int w = UnScaleByZoom(_vdd->dpi.width, vp->zoom); const int h = UnScaleByZoom(_vdd->dpi.height, vp->zoom); int j = 0; @@ -3980,7 +3980,7 @@ void ViewportDoDraw(Viewport *vp, int left, int top, int right, int bottom, uint overlay_dpi.height = vp->height; overlay_dpi.width = vp->width; overlay_dpi.pitch = vp->width; - overlay_dpi.zoom = ZOOM_LVL_NORMAL; + overlay_dpi.zoom = ZOOM_LVL_MIN; overlay_dpi.left = UnScaleByZoomLower(vp->virtual_left, vp->zoom); overlay_dpi.top = UnScaleByZoomLower(vp->virtual_top, vp->zoom); @@ -4009,7 +4009,7 @@ void ViewportDoDraw(Viewport *vp, int left, int top, int right, int bottom, uint ViewportMapDrawVehicles(&_vdd->dpi, vp); if (_scrolling_viewport && _settings_client.gui.show_scrolling_viewport_on_map) ViewportMapDrawScrollingViewportBox(vp); if (unlikely(_thd.place_mode == (HT_SPECIAL | HT_MAP) && (_thd.drawstyle & HT_DRAG_MASK) == HT_RECT && _thd.select_proc == DDSP_MEASURE)) ViewportMapDrawSelection(vp); - if (vp->zoom < ZOOM_LVL_OUT_256X) ViewportAddKdtreeSigns(_vdd.get(), &_vdd->dpi, true); + if (vp->zoom < ZOOM_LVL_OUT_64X) ViewportAddKdtreeSigns(_vdd.get(), &_vdd->dpi, true); if (AreAnyPlansVisible()) { if (vp->last_plan_update_number != _plan_update_counter) { @@ -4022,7 +4022,7 @@ void ViewportDoDraw(Viewport *vp, int left, int top, int right, int bottom, uint plan_dpi.height = vp->height; plan_dpi.width = vp->width; plan_dpi.pitch = vp->width; - plan_dpi.zoom = ZOOM_LVL_NORMAL; + plan_dpi.zoom = ZOOM_LVL_MIN; plan_dpi.left = UnScaleByZoomLower(vp->virtual_left, vp->zoom); plan_dpi.top = UnScaleByZoomLower(vp->virtual_top, vp->zoom); @@ -4162,7 +4162,7 @@ static void ViewportDoDrawPhase2(Viewport *vp, ViewportDrawerDynamic *vdd) /* translate to window coordinates */ DrawPixelInfo dp = vdd->dpi; ZoomLevel zoom = vdd->dpi.zoom; - dp.zoom = ZOOM_LVL_NORMAL; + dp.zoom = ZOOM_LVL_MIN; dp.width = UnScaleByZoom(dp.width, zoom); dp.height = UnScaleByZoom(dp.height, zoom); dp.left = vdd->offset_x + vp->left; @@ -4183,7 +4183,7 @@ static void ViewportDoDrawPhase3(Viewport *vp) { DrawPixelInfo dp = _vdd->dpi; ZoomLevel zoom = _vdd->dpi.zoom; - dp.zoom = ZOOM_LVL_NORMAL; + dp.zoom = ZOOM_LVL_MIN; dp.width = UnScaleByZoom(dp.width, zoom); dp.height = UnScaleByZoom(dp.height, zoom); _cur_dpi = &dp; @@ -4234,7 +4234,7 @@ static void ViewportDoDrawPhase3(Viewport *vp) */ void ViewportDrawChk(Viewport *vp, int left, int top, int right, int bottom, uint8_t display_flags) { - if ((vp->zoom < ZOOM_LVL_DRAW_MAP) && ((int64_t)ScaleByZoom(bottom - top, vp->zoom) * (int64_t)ScaleByZoom(right - left, vp->zoom) > (int64_t)(1000000 * ZOOM_LVL_BASE * ZOOM_LVL_BASE))) { + if ((vp->zoom < ZOOM_LVL_DRAW_MAP) && ((int64_t)ScaleByZoom(bottom - top, vp->zoom) * (int64_t)ScaleByZoom(right - left, vp->zoom) > (int64_t)(1000000 * ZOOM_BASE * ZOOM_BASE))) { if ((bottom - top) > (right - left)) { int t = (top + bottom) >> 1; ViewportDrawChk(vp, left, top, right, t, display_flags); @@ -4338,7 +4338,7 @@ static inline void ClampViewportToMap(const Viewport *vp, int *scroll_x, int *sc static void ClampSmoothScroll(uint32_t delta_ms, int64_t delta_hi, int64_t delta_lo, int &delta_hi_clamped, int &delta_lo_clamped) { /** A tile is 64 pixels in width at 1x zoom; viewport coordinates are in 4x zoom. */ - constexpr int PIXELS_PER_TILE = TILE_PIXELS * 2 * ZOOM_LVL_BASE; + constexpr int PIXELS_PER_TILE = TILE_PIXELS * 2 * ZOOM_BASE; assert(delta_hi != 0); @@ -4562,10 +4562,10 @@ void MarkViewportDirty(Viewport * const vp, int left, int top, int right, int bo /** * Mark all viewports that display an area as dirty (in need of repaint). - * @param left Left edge of area to repaint. (viewport coordinates, that is wrt. #ZOOM_LVL_NORMAL) - * @param top Top edge of area to repaint. (viewport coordinates, that is wrt. #ZOOM_LVL_NORMAL) - * @param right Right edge of area to repaint. (viewport coordinates, that is wrt. #ZOOM_LVL_NORMAL) - * @param bottom Bottom edge of area to repaint. (viewport coordinates, that is wrt. #ZOOM_LVL_NORMAL) + * @param left Left edge of area to repaint. (viewport coordinates, that is wrt. #ZOOM_LVL_MIN) + * @param top Top edge of area to repaint. (viewport coordinates, that is wrt. #ZOOM_LVL_MIN) + * @param right Right edge of area to repaint. (viewport coordinates, that is wrt. #ZOOM_LVL_MIN) + * @param bottom Bottom edge of area to repaint. (viewport coordinates, that is wrt. #ZOOM_LVL_MIN) * @param flags To tell if an update is relevant or not (for example, animations in map mode are not) * @ingroup dirty */ @@ -4692,10 +4692,10 @@ void MarkTileDirtyByTile(TileIndex tile, ViewportMarkDirtyFlags flags, int bridg { Point pt = RemapCoords(TileX(tile) * TILE_SIZE, TileY(tile) * TILE_SIZE, tile_height_override * TILE_HEIGHT); MarkAllViewportsDirty( - pt.x - 31 * ZOOM_LVL_BASE, - pt.y - 122 * ZOOM_LVL_BASE - ZOOM_LVL_BASE * TILE_HEIGHT * bridge_level_offset, - pt.x - 31 * ZOOM_LVL_BASE + 67 * ZOOM_LVL_BASE, - pt.y - 122 * ZOOM_LVL_BASE + 154 * ZOOM_LVL_BASE, + pt.x - 31 * ZOOM_BASE, + pt.y - 122 * ZOOM_BASE - ZOOM_BASE * TILE_HEIGHT * bridge_level_offset, + pt.x - 31 * ZOOM_BASE + 67 * ZOOM_BASE, + pt.y - 122 * ZOOM_BASE + 154 * ZOOM_BASE, flags ); } @@ -4706,7 +4706,7 @@ void MarkTileGroundDirtyByTile(TileIndex tile, ViewportMarkDirtyFlags flags) int y = TileY(tile) * TILE_SIZE; Point top = RemapCoords(x, y, GetTileMaxPixelZ(tile)); Point bot = RemapCoords(x + TILE_SIZE, y + TILE_SIZE, GetTilePixelZ(tile)); - MarkAllViewportsDirty(top.x - TILE_PIXELS * ZOOM_LVL_BASE, top.y - TILE_HEIGHT * ZOOM_LVL_BASE, top.x + TILE_PIXELS * ZOOM_LVL_BASE, bot.y, flags); + MarkAllViewportsDirty(top.x - TILE_PIXELS * ZOOM_BASE, top.y - TILE_HEIGHT * ZOOM_BASE, top.x + TILE_PIXELS * ZOOM_BASE, bot.y, flags); } void MarkViewportLineDirty(Viewport * const vp, const Point from_pt, const Point to_pt, const int block_radius, ViewportMarkDirtyFlags flags) @@ -4944,16 +4944,16 @@ static void SetSelectionTilesDirty() /* the 'x' coordinate of 'top' and 'bot' is the same (and always in the same distance from tile middle), * tile height/slope affects only the 'y' on-screen coordinate! */ - int l = top.x - TILE_PIXELS * ZOOM_LVL_BASE; // 'x' coordinate of left side of the dirty rectangle - int t = top.y; // 'y' coordinate of top side of the dirty rectangle - int r = top.x + TILE_PIXELS * ZOOM_LVL_BASE; // 'x' coordinate of right side of the dirty rectangle - int b = bot.y; // 'y' coordinate of bottom side of the dirty rectangle + int l = top.x - TILE_PIXELS * ZOOM_BASE; // 'x' coordinate of left side of the dirty rectangle + int t = top.y; // 'y' coordinate of top side of the dirty rectangle + int r = top.x + TILE_PIXELS * ZOOM_BASE; // 'x' coordinate of right side of the dirty rectangle + int b = bot.y; // 'y' coordinate of bottom side of the dirty rectangle - static const int OVERLAY_WIDTH = conservative_mode ? 2 << ZOOM_LVL_END : 4 * ZOOM_LVL_BASE; // part of selection sprites is drawn outside the selected area (in particular: terraforming) + static const int OVERLAY_WIDTH = conservative_mode ? 2 << ZOOM_LVL_END : 4 * ZOOM_BASE; // part of selection sprites is drawn outside the selected area (in particular: terraforming) /* For halftile foundations on SLOPE_STEEP_S the sprite extents some more towards the top */ ViewportMarkDirtyFlags mode = (_thd.place_mode & HT_MAP) ? VMDF_NOT_LANDSCAPE : VMDF_NOT_MAP_MODE; - MarkAllViewportsDirty(l - OVERLAY_WIDTH, t - OVERLAY_WIDTH - TILE_HEIGHT * ZOOM_LVL_BASE, r + OVERLAY_WIDTH, b + OVERLAY_WIDTH, mode); + MarkAllViewportsDirty(l - OVERLAY_WIDTH, t - OVERLAY_WIDTH - TILE_HEIGHT * ZOOM_BASE, r + OVERLAY_WIDTH, b + OVERLAY_WIDTH, mode); /* haven't we reached the topmost tile yet? */ if (top_x != x_start) { @@ -5011,7 +5011,7 @@ void SetSelectionPalette(PaletteID pal) */ static bool CheckClickOnViewportSign(const Viewport *vp, int x, int y, const ViewportSign *sign) { - bool small = (vp->zoom >= ZOOM_LVL_OUT_16X); + bool small = (vp->zoom >= ZOOM_LVL_OUT_4X); int sign_half_width = ScaleByZoom((small ? sign->width_small : sign->width_normal) / 2, vp->zoom); int sign_height = ScaleByZoom(WidgetDimensions::scaled.fullbevel.top + (small ? GetCharacterHeight(FS_SMALL) : GetCharacterHeight(FS_NORMAL)) + WidgetDimensions::scaled.fullbevel.bottom, vp->zoom); diff --git a/src/viewport_type.h b/src/viewport_type.h index e652b75ad7..38ac26dd18 100644 --- a/src/viewport_type.h +++ b/src/viewport_type.h @@ -92,7 +92,7 @@ private: uint GetDirtyBlockShift() const { if (this->zoom >= ZOOM_LVL_DRAW_MAP) return 3; - if (this->zoom >= ZOOM_LVL_OUT_8X) return 4; + if (this->zoom >= ZOOM_LVL_OUT_2X) return 4; return 7 - this->zoom; } }; diff --git a/src/waypoint_cmd.cpp b/src/waypoint_cmd.cpp index 7d38744b54..29b677cd75 100644 --- a/src/waypoint_cmd.cpp +++ b/src/waypoint_cmd.cpp @@ -45,7 +45,7 @@ void Waypoint::UpdateVirtCoord() if (_viewport_sign_kdtree_valid && this->sign.kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(this->index)); SetDParam(0, this->index); - this->sign.UpdatePosition(ShouldShowBaseStationViewportLabel(this) ? ZOOM_LVL_DRAW_SPR : ZOOM_LVL_END, pt.x, pt.y - 32 * ZOOM_LVL_BASE, STR_VIEWPORT_WAYPOINT, STR_VIEWPORT_WAYPOINT_TINY); + this->sign.UpdatePosition(ShouldShowBaseStationViewportLabel(this) ? ZOOM_LVL_DRAW_SPR : ZOOM_LVL_END, pt.x, pt.y - 32 * ZOOM_BASE, STR_VIEWPORT_WAYPOINT, STR_VIEWPORT_WAYPOINT_TINY); if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeWaypoint(this->index)); diff --git a/src/widget.cpp b/src/widget.cpp index e6c359d46e..decbaf9bed 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -32,7 +32,7 @@ WidgetDimensions WidgetDimensions::scaled = {}; /** * Scale a RectPadding to GUI zoom level. - * @param r RectPadding at ZOOM_LVL_BASE (traditional "normal" interface size). + * @param r RectPadding at ZOOM_BASE (traditional "normal" interface size). * @return RectPadding at #ZOOM_LVL_GUI (current interface size). */ static inline RectPadding ScaleGUITrad(const RectPadding &r) @@ -42,7 +42,7 @@ static inline RectPadding ScaleGUITrad(const RectPadding &r) /** * Scale a Dimension to GUI zoom level. - * @param d Dimension at ZOOM_LVL_BASE (traditional "normal" interface size). + * @param d Dimension at ZOOM_BASE (traditional "normal" interface size). * @return Dimension at #ZOOM_LVL_GUI (current interface size). */ static inline Dimension ScaleGUITrad(const Dimension &dim) @@ -57,7 +57,7 @@ static inline Dimension ScaleGUITrad(const Dimension &dim) Dimension GetScaledSpriteSize(SpriteID sprid) { Point offset; - Dimension d = GetSpriteSize(sprid, &offset, ZOOM_LVL_OUT_4X); + Dimension d = GetSpriteSize(sprid, &offset, ZOOM_LVL_NORMAL); d.width -= offset.x; d.height -= offset.y; return ScaleGUITrad(d); @@ -3292,7 +3292,7 @@ std::unique_ptr MakeCompanyButtonRows(WidgetID widget_first, Widget std::unique_ptr hor = nullptr; // Storage for buttons in one row. int hor_length = 0; - Dimension sprite_size = GetSpriteSize(SPR_COMPANY_ICON, nullptr, ZOOM_LVL_OUT_4X); + Dimension sprite_size = GetSpriteSize(SPR_COMPANY_ICON, nullptr, ZOOM_LVL_NORMAL); sprite_size.width += WidgetDimensions::unscaled.matrix.Horizontal(); sprite_size.height += WidgetDimensions::unscaled.matrix.Vertical(); diff --git a/src/window.cpp b/src/window.cpp index c848f4946d..974f49550b 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -899,7 +899,7 @@ void DrawOverlappedWindow(Window *w, int left, int top, int right, int bottom, D dp->top = top - w->top; dp->pitch = _screen.pitch; dp->dst_ptr = BlitterFactory::GetCurrentBlitter()->MoveTo(_screen.dst_ptr, left, top); - dp->zoom = ZOOM_LVL_NORMAL; + dp->zoom = ZOOM_LVL_MIN; w->OnPaint(); if (unlikely(flags & DOWF_SHOW_DEBUG)) { if (w->viewport != nullptr) ViewportDoDrawProcessAllPending(); diff --git a/src/zoning_gui.cpp b/src/zoning_gui.cpp index 2da0576a4d..c6c0bb6926 100644 --- a/src/zoning_gui.cpp +++ b/src/zoning_gui.cpp @@ -94,7 +94,7 @@ struct ZoningWindow : public Window { for (const ZoningModeInfo &info : _zone_modes) { if (info.debug && !IsDebugEnabled()) continue; SetDParamStr(0, info.param); - list.push_back(std::make_unique(info.str, info.mode, false)); + list.push_back(MakeDropDownListStringItem(info.str, info.mode, false)); } ShowDropDownList(this, std::move(list), current, widget); } diff --git a/src/zoom_func.h b/src/zoom_func.h index a574b3bc17..49ae6b05da 100644 --- a/src/zoom_func.h +++ b/src/zoom_func.h @@ -13,7 +13,7 @@ #include "zoom_type.h" /** - * Scale by zoom level, usually shift left (when zoom > ZOOM_LVL_NORMAL) + * Scale by zoom level, usually shift left (when zoom > ZOOM_LVL_MIN) * When shifting right, value is rounded up * @param value value to shift * @param zoom zoom level to shift to @@ -25,7 +25,7 @@ inline int ScaleByZoom(int value, ZoomLevel zoom) } /** - * Scale by zoom level, usually shift right (when zoom > ZOOM_LVL_NORMAL) + * Scale by zoom level, usually shift right (when zoom > ZOOM_LVL_MIN) * When shifting right, value is rounded up * @param value value to shift * @param zoom zoom level to shift to @@ -48,7 +48,7 @@ inline int AdjustByZoom(int value, int zoom) } /** - * Scale by zoom level, usually shift left (when zoom > ZOOM_LVL_NORMAL) + * Scale by zoom level, usually shift left (when zoom > ZOOM_LVL_MIN) * @param value value to shift * @param zoom zoom level to shift to * @return shifted value @@ -59,7 +59,7 @@ inline int ScaleByZoomLower(int value, ZoomLevel zoom) } /** - * Scale by zoom level, usually shift right (when zoom > ZOOM_LVL_NORMAL) + * Scale by zoom level, usually shift right (when zoom > ZOOM_LVL_MIN) * @param value value to shift * @param zoom zoom level to shift to * @return shifted value @@ -71,7 +71,7 @@ inline int UnScaleByZoomLower(int value, ZoomLevel zoom) /** * Short-hand to apply GUI zoom level. - * @param value Pixel amount at #ZOOM_LVL_BEGIN (full zoom in). + * @param value Pixel amount at #ZOOM_LVL_MIN (full zoom in). * @return Pixel amount at #ZOOM_LVL_GUI (current interface size). */ inline int UnScaleGUI(int value) @@ -86,7 +86,7 @@ inline int UnScaleGUI(int value) */ inline ZoomLevel ScaleZoomGUI(ZoomLevel value) { - return std::clamp(ZoomLevel(value + (ZOOM_LVL_GUI - ZOOM_LVL_OUT_4X)), ZOOM_LVL_MIN, ZOOM_LVL_MAX); + return std::clamp(ZoomLevel(value + (ZOOM_LVL_GUI - ZOOM_LVL_NORMAL)), ZOOM_LVL_MIN, ZOOM_LVL_MAX); } /** @@ -96,22 +96,22 @@ inline ZoomLevel ScaleZoomGUI(ZoomLevel value) */ inline ZoomLevel UnScaleZoomGUI(ZoomLevel value) { - return std::clamp(ZoomLevel(value - (ZOOM_LVL_GUI - ZOOM_LVL_OUT_4X)), ZOOM_LVL_MIN, ZOOM_LVL_MAX); + return std::clamp(ZoomLevel(value - (ZOOM_LVL_GUI - ZOOM_LVL_NORMAL)), ZOOM_LVL_MIN, ZOOM_LVL_MAX); } /** * Scale traditional pixel dimensions to GUI zoom level, for drawing sprites. - * @param value Pixel amount at #ZOOM_LVL_BASE (traditional "normal" interface size). + * @param value Pixel amount at #ZOOM_BASE (traditional "normal" interface size). * @return Pixel amount at #ZOOM_LVL_GUI (current interface size). */ inline int ScaleSpriteTrad(int value) { - return UnScaleGUI(value * ZOOM_LVL_BASE); + return UnScaleGUI(value * ZOOM_BASE); } /** * Scale traditional pixel dimensions to GUI zoom level. - * @param value Pixel amount at #ZOOM_LVL_BASE (traditional "normal" interface size). + * @param value Pixel amount at #ZOOM_BASE (traditional "normal" interface size). * @return Pixel amount at #ZOOM_LVL_GUI (current interface size). */ inline int ScaleGUITrad(int value) diff --git a/src/zoom_type.h b/src/zoom_type.h index dd9c5fb593..8938472480 100644 --- a/src/zoom_type.h +++ b/src/zoom_type.h @@ -12,14 +12,13 @@ #include "core/enum_type.hpp" -static uint const ZOOM_LVL_SHIFT = 2; -static int const ZOOM_LVL_BASE = 1 << ZOOM_LVL_SHIFT; - /** All zoom levels we know. */ enum ZoomLevel : uint8_t { /* Our possible zoom-levels */ ZOOM_LVL_BEGIN = 0, ///< Begin for iteration. - ZOOM_LVL_NORMAL = 0, ///< The normal zoom level. + ZOOM_LVL_IN_4X = 0, ///< Zoomed 4 times in. + ZOOM_LVL_IN_2X, ///< Zoomed 2 times in. + ZOOM_LVL_NORMAL, ///< The normal zoom level. ZOOM_LVL_OUT_2X, ///< Zoomed 2 times out. ZOOM_LVL_OUT_4X, ///< Zoomed 4 times out. ZOOM_LVL_OUT_8X, ///< Zoomed 8 times out. @@ -27,28 +26,28 @@ enum ZoomLevel : uint8_t { ZOOM_LVL_OUT_32X, ///< Zoomed 32 times out. ZOOM_LVL_OUT_64X, ///< Zoomed 64 times out. ZOOM_LVL_OUT_128X, ///< Zoomed 128 times out. - ZOOM_LVL_OUT_256X, ///< Zoomed 256 times out. - ZOOM_LVL_OUT_512X, ///< Zoomed 512 times out. ZOOM_LVL_END, ///< End for iteration. /* Here we define in which zoom viewports are */ - ZOOM_LVL_VIEWPORT = ZOOM_LVL_OUT_4X, ///< Default zoom level for viewports. - ZOOM_LVL_NEWS = ZOOM_LVL_OUT_4X, ///< Default zoom level for the news messages. - ZOOM_LVL_INDUSTRY = ZOOM_LVL_OUT_8X, ///< Default zoom level for the industry view. - ZOOM_LVL_TOWN = ZOOM_LVL_OUT_4X, ///< Default zoom level for the town view. - ZOOM_LVL_AIRCRAFT = ZOOM_LVL_OUT_4X, ///< Default zoom level for the aircraft view. - ZOOM_LVL_SHIP = ZOOM_LVL_OUT_4X, ///< Default zoom level for the ship view. - ZOOM_LVL_TRAIN = ZOOM_LVL_OUT_4X, ///< Default zoom level for the train view. - ZOOM_LVL_ROADVEH = ZOOM_LVL_OUT_4X, ///< Default zoom level for the road vehicle view. - ZOOM_LVL_WORLD_SCREENSHOT = ZOOM_LVL_OUT_4X, ///< Default zoom level for the world screen shot. + ZOOM_LVL_VIEWPORT = ZOOM_LVL_NORMAL, ///< Default zoom level for viewports. + ZOOM_LVL_NEWS = ZOOM_LVL_NORMAL, ///< Default zoom level for the news messages. + ZOOM_LVL_INDUSTRY = ZOOM_LVL_OUT_2X, ///< Default zoom level for the industry view. + ZOOM_LVL_TOWN = ZOOM_LVL_NORMAL, ///< Default zoom level for the town view. + ZOOM_LVL_AIRCRAFT = ZOOM_LVL_NORMAL, ///< Default zoom level for the aircraft view. + ZOOM_LVL_SHIP = ZOOM_LVL_NORMAL, ///< Default zoom level for the ship view. + ZOOM_LVL_TRAIN = ZOOM_LVL_NORMAL, ///< Default zoom level for the train view. + ZOOM_LVL_ROADVEH = ZOOM_LVL_NORMAL, ///< Default zoom level for the road vehicle view. + ZOOM_LVL_WORLD_SCREENSHOT = ZOOM_LVL_NORMAL, ///< Default zoom level for the world screen shot. - ZOOM_LVL_DETAIL = ZOOM_LVL_OUT_8X, ///< All zoomlevels below or equal to this, will result in details on the screen, like road-work, ... + ZOOM_LVL_DETAIL = ZOOM_LVL_OUT_2X, ///< All zoom levels below or equal to this will result in details on the screen, like road-work, ... + ZOOM_LVL_TEXT_EFFECT = ZOOM_LVL_OUT_2X, ///< All zoom levels above this will not show text effects. - ZOOM_LVL_MIN = ZOOM_LVL_NORMAL, ///< Minimum zoom level. - ZOOM_LVL_MAX = ZOOM_LVL_OUT_512X, ///< Maximum zoom level. - ZOOM_LVL_DRAW_MAP = ZOOM_LVL_OUT_64X, ///< All zoomlevels above or equal to this are rendered with map style + ZOOM_LVL_DRAW_MAP = ZOOM_LVL_OUT_16X, ///< All zoomlevels above or equal to this are rendered with map style ZOOM_LVL_DRAW_SPR = ZOOM_LVL_DRAW_MAP - 1, ///< All zoomlevels below or equal to this are rendered with sprites + ZOOM_LVL_MIN = ZOOM_LVL_IN_4X, ///< Minimum zoom level. + ZOOM_LVL_MAX = ZOOM_LVL_OUT_128X, ///< Maximum zoom level. + ZOOM_LVL_SPR_END = ZOOM_LVL_DRAW_MAP, ///< End for iteration of zoom levels to draw with sprites. ZOOM_LVL_SPR_COUNT = ZOOM_LVL_SPR_END - ZOOM_LVL_BEGIN, ///< Number of zoom levels to draw with sprites. }; @@ -60,6 +59,9 @@ inline uint8_t ZoomMask(ZoomLevel level) return 1 << level; } +static uint const ZOOM_BASE_SHIFT = static_cast(ZOOM_LVL_NORMAL); +static int const ZOOM_BASE = 1 << ZOOM_BASE_SHIFT; + extern int _gui_scale; extern int _gui_scale_cfg;