diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index b44b310119..6bbe5efd82 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -1338,8 +1338,7 @@ struct BuildVehicleWindow : BuildVehicleWindowBase { } /* Collect available cargo types for filtering. */ - const CargoSpec *cs; - FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) { + for (const CargoSpec *cs : _sorted_standard_cargo_specs) { this->cargo_filter[filter_items] = cs->Index(); this->cargo_filter_texts[filter_items] = cs->name; filter_items++; @@ -2110,8 +2109,7 @@ struct BuildVehicleWindowTrainAdvanced final : BuildVehicleWindowBase { filter_items++; /* Collect available cargo types for filtering. */ - const CargoSpec *cs; - FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) { + for (const CargoSpec *cs : _sorted_standard_cargo_specs) { state.cargo_filter[filter_items] = cs->Index(); state.cargo_filter_texts[filter_items] = cs->name; filter_items++; diff --git a/src/cargotype.cpp b/src/cargotype.cpp index a6ea680d80..e35c94d2fe 100644 --- a/src/cargotype.cpp +++ b/src/cargotype.cpp @@ -149,8 +149,8 @@ SpriteID CargoSpec::GetCargoIcon() const return sprite; } -std::vector _sorted_cargo_specs; ///< Cargo specifications sorted alphabetically by name. -uint8 _sorted_standard_cargo_specs_size; ///< Number of standard cargo specifications stored in the _sorted_cargo_specs array. +std::vector _sorted_cargo_specs; ///< Cargo specifications sorted alphabetically by name. +span _sorted_standard_cargo_specs; ///< Standard cargo specifications sorted alphabetically by name. /** Sort cargo specifications by their name. */ static bool CargoSpecNameSorter(const CargoSpec * const &a, const CargoSpec * const &b) @@ -196,13 +196,16 @@ void InitializeSortedCargoSpecs() /* Sort cargo specifications by cargo class and name. */ std::sort(_sorted_cargo_specs.begin(), _sorted_cargo_specs.end(), &CargoSpecClassSorter); + /* Count the number of standard cargos and fill the mask. */ _standard_cargo_mask = 0; - - _sorted_standard_cargo_specs_size = 0; + uint8 nb_standard_cargo = 0; for (const auto &cargo : _sorted_cargo_specs) { if (cargo->classes & CC_SPECIAL) break; - _sorted_standard_cargo_specs_size++; + nb_standard_cargo++; SetBit(_standard_cargo_mask, cargo->Index()); } + + /* _sorted_standard_cargo_specs is a subset of _sorted_cargo_specs. */ + _sorted_standard_cargo_specs = { _sorted_cargo_specs.data(), nb_standard_cargo }; } diff --git a/src/cargotype.h b/src/cargotype.h index 34f5e53a21..7efafe91fc 100644 --- a/src/cargotype.h +++ b/src/cargotype.h @@ -15,6 +15,8 @@ #include "gfx_type.h" #include "strings_type.h" #include "landscape_type.h" +#include "core/bitmath_func.hpp" +#include "core/span_type.hpp" #include /** Globally unique label of a cargo type. */ @@ -190,7 +192,7 @@ CargoID GetDefaultCargoID(LandscapeID l, CargoType ct); void InitializeSortedCargoSpecs(); extern std::vector _sorted_cargo_specs; -extern uint8 _sorted_standard_cargo_specs_size; +extern span _sorted_standard_cargo_specs; uint ConvertCargoQuantityToDisplayQuantity(CargoID cargo, uint quantity); uint ConvertDisplayQuantityToCargoQuantity(CargoID cargo, uint quantity); @@ -206,13 +208,6 @@ static inline bool IsCargoInClass(CargoID c, CargoClass cc) return (CargoSpec::Get(c)->classes & cc) != 0; } -#define FOR_EACH_SET_CARGO_ID(var, cargo_bits) FOR_EACH_SET_BIT_EX(CargoID, var, CargoTypes, cargo_bits) - -/** - * Loop header for iterating over 'real' cargoes, sorted by name. Phony cargoes like regearing cargoes are skipped. - * @param var Reference getting the cargospec. - * @see CargoSpec - */ -#define FOR_ALL_SORTED_STANDARD_CARGOSPECS(var) for (uint8 index = 0; index < _sorted_standard_cargo_specs_size && (var = _sorted_cargo_specs[index], true); index++) +using SetCargoBitIterator = SetBitIterator; #endif /* CARGOTYPE_H */ diff --git a/src/core/bitmath_func.hpp b/src/core/bitmath_func.hpp index cc259af594..532bb7382e 100644 --- a/src/core/bitmath_func.hpp +++ b/src/core/bitmath_func.hpp @@ -356,45 +356,55 @@ static inline T ROR(const T x, const uint8 n) return (T)(x >> n | x << (sizeof(x) * 8 - n)); } -/** - * Do an operation for each set bit in a value. - * - * This macros is used to do an operation for each set - * bit in a variable. The second parameter is a - * variable that is used as the bit position counter. - * The fourth parameter is an expression of the bits - * we need to iterate over. This expression will be - * evaluated once. - * - * @param Tbitpos_type Type of the position counter variable. - * @param bitpos_var The position counter variable. - * @param Tbitset_type Type of the bitset value. - * @param bitset_value The bitset value which we check for bits. - * - * @see FOR_EACH_SET_BIT - */ -#define FOR_EACH_SET_BIT_EX(Tbitpos_type, bitpos_var, Tbitset_type, bitset_value) \ - for ( \ - Tbitset_type ___FESBE_bits = (bitpos_var = (Tbitpos_type)0, bitset_value); \ - ___FESBE_bits != (Tbitset_type)0; \ - ___FESBE_bits = (Tbitset_type)(___FESBE_bits >> 1), bitpos_var++ \ - ) \ - if ((___FESBE_bits & 1) != 0) + /** + * Iterable ensemble of each set bit in a value. + * @tparam Tbitpos Type of the position variable. + * @tparam Tbitset Type of the bitset value. +*/ +template +struct SetBitIterator { + struct Iterator { + typedef Tbitpos value_type; + typedef value_type *pointer; + typedef value_type &reference; + typedef size_t difference_type; + typedef std::forward_iterator_tag iterator_category; -/** - * Do an operation for each set set bit in a value. - * - * This macros is used to do an operation for each set - * bit in a variable. The first parameter is a variable - * that is used as the bit position counter. - * The second parameter is an expression of the bits - * we need to iterate over. This expression will be - * evaluated once. - * - * @param bitpos_var The position counter variable. - * @param bitset_value The value which we check for set bits. - */ -#define FOR_EACH_SET_BIT(bitpos_var, bitset_value) FOR_EACH_SET_BIT_EX(uint, bitpos_var, uint, bitset_value) + explicit Iterator(Tbitset bitset) : bitset(bitset), bitpos(static_cast(0)) + { + this->Validate(); + } + + bool operator==(const Iterator &other) const + { + return this->bitset == other.bitset && (this->bitset == 0 || this->bitpos == other.bitpos); + } + bool operator!=(const Iterator &other) const { return !(*this == other); } + Tbitpos operator*() const { return this->bitpos; } + Iterator & operator++() { this->Next(); this->Validate(); return *this; } + + private: + Tbitset bitset; + Tbitpos bitpos; + void Validate() + { + while (this->bitset != 0 && (this->bitset & 1) == 0) this->Next(); + } + void Next() + { + this->bitset = static_cast(this->bitset >> 1); + this->bitpos++; + } + }; + + SetBitIterator(Tbitset bitset) : bitset(bitset) {} + Iterator begin() { return Iterator(this->bitset); } + Iterator end() { return Iterator(static_cast(0)); } + bool empty() { return this->begin() == this->end(); } + +private: + Tbitset bitset; +}; #if defined(__APPLE__) /* Make endian swapping use Apple's macros to increase speed diff --git a/src/departures_gui.cpp b/src/departures_gui.cpp index f4f1733e81..17487a1049 100644 --- a/src/departures_gui.cpp +++ b/src/departures_gui.cpp @@ -194,8 +194,7 @@ protected: if (width > this->group_width) this->group_width = width; } - uint owner; - FOR_EACH_SET_BIT(owner, companies) { + for (uint owner : SetBitIterator(companies)) { SetDParam(0, owner); int width = (GetStringBoundingBox(STR_DEPARTURES_TOC)).width + 4; if (width > this->toc_width) this->toc_width = width; diff --git a/src/economy.cpp b/src/economy.cpp index 99a62d4d76..89e52081d9 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -1595,9 +1595,8 @@ static void HandleStationRefit(Vehicle *v, CargoArray &consist_capleft, Station bool check_order = (v->First()->current_order.GetLoadType() == OLFB_CARGO_TYPE_LOAD); if (is_auto_refit) { /* Get a refittable cargo type with waiting cargo for next_station or INVALID_STATION. */ - CargoID cid; new_cid = v_start->cargo_type; - FOR_EACH_SET_CARGO_ID(cid, refit_mask) { + for (CargoID cid : SetCargoBitIterator(refit_mask)) { if (check_order && v->First()->current_order.GetCargoLoadType(cid) == OLFB_NO_LOAD) continue; if (st->goods[cid].cargo.HasCargoFor(next_station.Get(cid))) { /* Try to find out if auto-refitting would succeed. In case the refit is allowed, diff --git a/src/elrail.cpp b/src/elrail.cpp index 9f9c6c6161..9121c60615 100644 --- a/src/elrail.cpp +++ b/src/elrail.cpp @@ -572,8 +572,7 @@ static void DrawRailCatenaryRailway(const TileInfo *ti) }; /* Drawing of pylons is finished, now draw the wires */ - Track t; - FOR_EACH_SET_TRACK(t, wireconfig[TS_HOME]) { + for (Track t : SetTrackBitIterator(wireconfig[TS_HOME])) { SpriteID wire_base = get_wire_sprite(t, (t == halftile_track)); byte PCPconfig = HasBit(PCPstatus, PCPpositions[t][0]) + (HasBit(PCPstatus, PCPpositions[t][1]) << 1); diff --git a/src/fileio.cpp b/src/fileio.cpp index 7c2aaadf69..d4a150a53f 100644 --- a/src/fileio.cpp +++ b/src/fileio.cpp @@ -1033,6 +1033,10 @@ void DeterminePaths(const char *exe, bool only_local_path) _hotkeys_file = config_dir + "hotkeys.cfg"; extern std::string _windows_file; _windows_file = config_dir + "windows.cfg"; + extern std::string _private_file; + _private_file = config_dir + "private.cfg"; + extern std::string _secrets_file; + _secrets_file = config_dir + "secrets.cfg"; #ifdef USE_XDG if (config_dir == config_home) { diff --git a/src/goal_gui.cpp b/src/goal_gui.cpp index 9fdca309bc..2210e590d5 100644 --- a/src/goal_gui.cpp +++ b/src/goal_gui.cpp @@ -336,9 +336,8 @@ struct GoalQuestionWindow : public Window { this->question = stredup(question); /* Figure out which buttons we have to enable. */ - uint bit; int n = 0; - FOR_EACH_SET_BIT(bit, button_mask) { + for (uint bit : SetBitIterator(button_mask)) { if (bit >= GOAL_QUESTION_BUTTON_COUNT) break; this->button[n++] = bit; if (n == 3) break; diff --git a/src/graph_gui.cpp b/src/graph_gui.cpp index 4e945be1d7..f5acdaead6 100644 --- a/src/graph_gui.cpp +++ b/src/graph_gui.cpp @@ -895,7 +895,7 @@ struct PaymentRatesGraphWindow : BaseGraphWindow { this->CreateNestedTree(); this->vscroll = this->GetScrollbar(WID_CPR_MATRIX_SCROLLBAR); - this->vscroll->SetCount(_sorted_standard_cargo_specs_size); + this->vscroll->SetCount(static_cast(_sorted_standard_cargo_specs.size())); this->SetWidgetLoweredState(WID_CPR_DAYS, _cargo_payment_x_mode == 0); this->SetWidgetLoweredState(WID_CPR_SPEED, _cargo_payment_x_mode == 1); @@ -936,8 +936,7 @@ struct PaymentRatesGraphWindow : BaseGraphWindow { this->excluded_data = 0; int i = 0; - const CargoSpec *cs; - FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) { + for (const CargoSpec *cs : _sorted_standard_cargo_specs) { if (HasBit(_legend_excluded_cargo, cs->Index())) SetBit(this->excluded_data, i); i++; } @@ -950,8 +949,7 @@ struct PaymentRatesGraphWindow : BaseGraphWindow { return; } - const CargoSpec *cs; - FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) { + for (const CargoSpec *cs : _sorted_standard_cargo_specs) { SetDParam(0, cs->name); Dimension d = GetStringBoundingBox(STR_GRAPH_CARGO_PAYMENT_CARGO); d.width += this->legend_width + 4; // colour field @@ -983,8 +981,7 @@ struct PaymentRatesGraphWindow : BaseGraphWindow { int pos = this->vscroll->GetPosition(); int max = pos + this->vscroll->GetCapacity(); - const CargoSpec *cs; - FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) { + for (const CargoSpec *cs : _sorted_standard_cargo_specs) { if (pos-- > 0) continue; if (--max < 0) break; @@ -1018,8 +1015,7 @@ struct PaymentRatesGraphWindow : BaseGraphWindow { case WID_CPR_DISABLE_CARGOES: { /* Add all cargoes to the excluded lists. */ int i = 0; - const CargoSpec *cs; - FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) { + for (const CargoSpec *cs : _sorted_standard_cargo_specs) { SetBit(_legend_excluded_cargo, cs->Index()); SetBit(this->excluded_data, i); i++; @@ -1032,8 +1028,7 @@ struct PaymentRatesGraphWindow : BaseGraphWindow { uint row = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_CPR_MATRIX); if (row >= this->vscroll->GetCount()) return; - const CargoSpec *cs; - FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) { + for (const CargoSpec *cs : _sorted_standard_cargo_specs) { if (row-- > 0) continue; ToggleBit(_legend_excluded_cargo, cs->Index()); @@ -1083,10 +1078,9 @@ struct PaymentRatesGraphWindow : BaseGraphWindow { this->UpdateExcludedData(); int i = 0; - const CargoSpec *cs; const float factor = 200.0f * 28.57f * 0.4f * ConvertSpeedToUnitDisplaySpeed(1 << 16) / (1.6f * static_cast(1 << 16)); - FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) { + for (const CargoSpec *cs : _sorted_standard_cargo_specs) { this->colours[i] = cs->legend_colour; for (int j = 0; j != 20; j++) { const byte ctt = _cargo_payment_x_mode ? static_cast(factor / static_cast((j + 1) * this->x_values_increment)) : (j + 1) * 4; @@ -1704,8 +1698,7 @@ struct StationCargoGraphWindow final : BaseGraphWindow { this->excluded_data = 0; uint8 i = 0; - const CargoSpec *cs; - FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) { + for (const CargoSpec *cs : _sorted_standard_cargo_specs) { if (!HasBit(this->present_cargoes, cs->Index())) continue; if (HasBit(legend_excluded_cargo, cs->Index())) SetBit(this->excluded_data, i); i++; @@ -1719,8 +1712,7 @@ struct StationCargoGraphWindow final : BaseGraphWindow { return; } - const CargoSpec *cs; - FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) { + for (const CargoSpec *cs : _sorted_standard_cargo_specs) { SetDParam(0, cs->name); Dimension d = GetStringBoundingBox(STR_GRAPH_CARGO_PAYMENT_CARGO); d.width += this->legend_width + 4; // color field @@ -1752,8 +1744,7 @@ struct StationCargoGraphWindow final : BaseGraphWindow { int pos = this->vscroll->GetPosition(); int max = pos + this->vscroll->GetCapacity(); - const CargoSpec *cs; - FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) { + for (const CargoSpec *cs : _sorted_standard_cargo_specs) { if (!HasBit(this->present_cargoes, cs->Index())) continue; if (pos-- > 0) continue; if (--max < 0) break; @@ -1789,8 +1780,7 @@ struct StationCargoGraphWindow final : BaseGraphWindow { /* Add all cargoes to the excluded lists. */ this->legend_excluded_cargo = ~static_cast(0); int i = 0; - const CargoSpec *cs; - FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) { + for (const CargoSpec *cs : _sorted_standard_cargo_specs) { if (!HasBit(this->present_cargoes, cs->Index())) continue; SetBit(this->excluded_data, i); i++; @@ -1803,8 +1793,7 @@ struct StationCargoGraphWindow final : BaseGraphWindow { uint row = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_SCG_MATRIX); if (row >= this->vscroll->GetCount()) return; - const CargoSpec *cs; - FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) { + for (const CargoSpec *cs : _sorted_standard_cargo_specs) { if (!HasBit(this->present_cargoes, cs->Index())) continue; if (row-- > 0) continue; @@ -1850,8 +1839,7 @@ struct StationCargoGraphWindow final : BaseGraphWindow { this->UpdateExcludedData(); uint8 i = 0; - const CargoSpec *cs; - FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) { + for (const CargoSpec *cs : _sorted_standard_cargo_specs) { if (!HasBit(this->present_cargoes, cs->Index())) continue; this->colours[i] = cs->legend_colour; diff --git a/src/industry_gui.cpp b/src/industry_gui.cpp index c1edcc62c6..eb09419bd2 100644 --- a/src/industry_gui.cpp +++ b/src/industry_gui.cpp @@ -1376,8 +1376,7 @@ protected: filter_items++; /* Collect available cargo types for filtering. */ - const CargoSpec *cs; - FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) { + for (const CargoSpec *cs : _sorted_standard_cargo_specs) { this->cargo_filter[filter_items] = cs->Index(); this->cargo_filter_texts[filter_items] = cs->name; filter_items++; @@ -3003,8 +3002,7 @@ struct IndustryCargoesWindow : public Window { case WID_IC_CARGO_DROPDOWN: { DropDownList lst; - const CargoSpec *cs; - FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) { + for (const CargoSpec *cs : _sorted_standard_cargo_specs) { lst.emplace_back(new DropDownListStringItem(cs->name, cs->Index(), false)); } if (!lst.empty()) { diff --git a/src/ini_load.cpp b/src/ini_load.cpp index 9b8a4a31b8..b06cdf8d71 100644 --- a/src/ini_load.cpp +++ b/src/ini_load.cpp @@ -100,6 +100,29 @@ IniItem *IniGroup::GetItem(const std::string &name, bool create) return new IniItem(this, name); } +/** + * Remove the item with the given name. + * @param name Name of the item to remove. + */ +void IniGroup::RemoveItem(const std::string &name) +{ + IniItem **prev = &this->item; + + for (IniItem *item = this->item; item != nullptr; prev = &item->next, item = item->next) { + if (item->name != name) continue; + + *prev = item->next; + if (this->last_item == &this->item) { + this->last_item = &item->next; + } + + item->next = nullptr; + delete item; + + return; + } +} + /** * Clear all items in the group */ diff --git a/src/ini_type.h b/src/ini_type.h index 84cb19bf19..a8b331d128 100644 --- a/src/ini_type.h +++ b/src/ini_type.h @@ -49,6 +49,7 @@ struct IniGroup { ~IniGroup(); IniItem *GetItem(const std::string &name, bool create); + void RemoveItem(const std::string &name); void Clear(); }; diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index 43c14251b9..f3a1d4bb1f 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -2160,6 +2160,7 @@ STR_NETWORK_CLIENT_LIST_NEW_COMPANY :(Nova empresa) STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP :{BLACK}Cria uma nova empresa e se une a ela STR_NETWORK_CLIENT_LIST_PLAYER_ICON_SELF_TOOLTIP :{BLACK}Esse é você STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP :{BLACK}Esse é o hospedeiro do jogo +STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT :{BLACK}{NUM} cliente{P "" s} / {NUM} empresa{P "" s} STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :Expulsar STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Banir diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index d2cc19c680..511be8d613 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -2160,6 +2160,7 @@ STR_NETWORK_CLIENT_LIST_NEW_COMPANY :(Companyia nova STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP :{BLACK}Crea una companyia nova i uniu-vos. STR_NETWORK_CLIENT_LIST_PLAYER_ICON_SELF_TOOLTIP :{BLACK}Aquest ets tu. STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP :{BLACK}Aquest és l'hoste de la partida. +STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT :{BLACK}{NUM} client{P "" s} / {NUM} companyi{P a es} STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :Treu STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Expulsa diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index b1eab162c9..e96bee9c13 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -2159,6 +2159,7 @@ STR_NETWORK_CLIENT_LIST_NEW_COMPANY :(Nieuw bedrijf) STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP :{BLACK}Een nieuw bedrijf maken en meedoen STR_NETWORK_CLIENT_LIST_PLAYER_ICON_SELF_TOOLTIP :{BLACK}Dit ben jij STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP :{BLACK}Dit is de host van het spel +STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT :{BLACK}{NUM} klant{P "" en} / {NUM} bedrij{P f ven} STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :Eruit schoppen STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Bannen diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index ea3d9de073..71590ead7d 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -2182,6 +2182,7 @@ STR_NETWORK_CLIENT_LIST_NEW_COMPANY :(New company) STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP :{BLACK}Create a new company and join it STR_NETWORK_CLIENT_LIST_PLAYER_ICON_SELF_TOOLTIP :{BLACK}This is you STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP :{BLACK}This is the host of the game +STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT :{BLACK}{NUM} client{P "" s} / {NUM} compan{P y ies} STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :Kick STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Ban diff --git a/src/lang/german.txt b/src/lang/german.txt index 1f51999f53..5c466e9689 100644 --- a/src/lang/german.txt +++ b/src/lang/german.txt @@ -2470,6 +2470,7 @@ STR_NETWORK_CLIENT_LIST_NEW_COMPANY :(Neue Firma) STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP :{BLACK}Eine neue Firma gründen und beitreten STR_NETWORK_CLIENT_LIST_PLAYER_ICON_SELF_TOOLTIP :{BLACK}Das sind Sie STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP :{BLACK}Dies ist der Host des Spiels +STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT :{BLACK}{NUM} Client{P "" s} / {NUM} Firm{P a en} STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :Hinauswerfen STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Bannen diff --git a/src/lang/hindi.txt b/src/lang/hindi.txt index 1fabeb2892..0a4246e00f 100644 --- a/src/lang/hindi.txt +++ b/src/lang/hindi.txt @@ -62,6 +62,7 @@ STR_COLOUR_RED :लाल # Units used in OpenTTD +STR_UNITS_POWER_METRIC :{COMMA}{NBSP}hp @@ -98,9 +99,11 @@ STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :पिछले STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW :{BLACK}ध्वनि/संगीत विकल्प # Extra tooltips for the scenario editor toolbar +STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}मानचित्र, नगर निर्देशिका दिखायें ############ range for SE file menu starts STR_SCENEDIT_FILE_MENU_SEPARATOR : +STR_SCENEDIT_FILE_MENU_QUIT :निकास ############ range for SE file menu starts ############ range for settings menu starts @@ -184,6 +187,7 @@ STR_COMPANY_LEAGUE_COMPANY_NAME :{ORANGE}{COMPAN # Performance detail window ############ Those following lines need to be in this order!! STR_PERFORMANCE_DETAIL_VEHICLES :{BLACK}वाहन: +STR_PERFORMANCE_DETAIL_CARGO :{BLACK}माल : ############ End of order list # Music window @@ -211,6 +215,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * ठ STR_NEWS_CUSTOM_ITEM :{BIG_FONT}{BLACK}{STRING} +STR_NEWS_FIRST_CARGO_TRAM_ARRIVAL :{BIG_FONT}{BLACK}नागरिक हर्षित हैं . . .{}पहली माल ट्रैम {STATION} पर पहुँची है! @@ -220,6 +225,7 @@ STR_NEWS_COMPANY_LAUNCH_DESCRIPTION :{BIG_FONT}{BLAC +STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_SMOOTH :{BIG_FONT}{BLACK}{STRING}{INDUSTRY} के उत्पादन में {COMMA}% कमी आयी! # Order review system / warnings @@ -238,6 +244,7 @@ STR_NEWS_NEW_VEHICLE_TYPE :{BIG_FONT}{BLAC ############ start of currency region STR_GAME_OPTIONS_CURRENCY_FIM :फिनलैंड मार्का (FIM) +STR_GAME_OPTIONS_CURRENCY_ISK :आइसलैंडिक क्रोना (ISK) STR_GAME_OPTIONS_CURRENCY_HKD :हाँग काँग डॉलर (एचकेडी) ############ end of currency region @@ -338,6 +345,7 @@ STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS :दुर्घ STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} +STR_CONFIG_SETTING_TOWN_CARGOGENMODE :नगर में माल उत्पादन: {STRING} STR_CONFIG_SETTING_SOFT_LIMIT_VALUE :{COMMA} @@ -353,11 +361,13 @@ STR_CONFIG_SETTING_SPRITE_ZOOM_LVL_IN_2X :२x STR_CONFIG_SETTING_INTERFACE_GENERAL :{ORANGE}सामान्य +STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS_HELPTEXT :नौकाओं द्वारा उपयोग किया जाने वाला पथान्वेषी # Config errors # Video initalization errors +STR_VIDEO_DRIVER_ERROR :{WHITE}वीडियो विन्यास में त्रुटि... # Intro window @@ -366,6 +376,7 @@ STR_INTRO_PLAY_HEIGHTMAP :{BLACK}उभ STR_INTRO_TOOLTIP_SCENARIO_EDITOR :{BLACK}अपनी इच्छानुसार एक क्रीड़ा-विश्व/परिदृश्य बनायें +STR_INTRO_TOOLTIP_TEMPERATE :{BLACK}'समशीतोष्ण' जलवायु वाला क्षेत्र चुनें @@ -394,6 +405,7 @@ STR_NETWORK_SERVER_LIST_MAP_SIZE_SHORT :{BLACK}{COMMA}x +STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}सर्वर की जानकारी अद्यतन करें @@ -508,11 +520,13 @@ STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP :{BLACK}नह # Airport construction window +STR_AIRPORT_INTERCONTINENTAL :अंतरमहाद्वीपीय STR_AIRPORT_CLASS_SMALL :लघु विमानतल # Landscaping toolbar +STR_LANDSCAPING_TOOLBAR :{WHITE}भूदृश्य निर्माण # Object construction window @@ -541,6 +555,7 @@ STR_INDUSTRY_CARGOES_SELECT_INDUSTRY :{BLACK}उद STR_LAI_CLEAR_DESCRIPTION_BARE_LAND :रिक्त भूमि +STR_LAI_ROAD_DESCRIPTION_TREE_LINED_ROAD :वृक्ष आच्छादित सड़क # Houses come directly from their building names @@ -591,6 +606,7 @@ STR_GENERATION_PROGRESS_NUM :{BLACK}{NUM} / +STR_NEWGRF_SETTINGS_PALETTE_DEFAULT :मूल (D) # NewGRF save preset window @@ -640,6 +656,7 @@ STR_TOWN_VIEW_EXPAND_BUTTON :{BLACK}फै # Town local authority window +STR_LOCAL_AUTHORITY_ACTION_SMALL_ADVERTISING_CAMPAIGN :लघु विज्ञापन अभियान # Goal window @@ -653,6 +670,7 @@ STR_GOALS_PROGRESS_COMPLETE :{GREEN}{STRING} ############ End of Goal Question button list # Subsidies window +STR_SUBSIDIES_OFFERED_TITLE :{BLACK}इन सेवाओं के लिये अनुदान प्रस्तावित : # Story book window STR_STORY_BOOK_TITLE :{YELLOW}{STRING} @@ -753,6 +771,7 @@ STR_PURCHASE_INFO_WEIGHT_CWEIGHT :{BLACK}भा STR_BUY_VEHICLE_ROAD_VEHICLE_HIDE_TOGGLE_BUTTON :{BLACK}छिपायें +STR_BUY_VEHICLE_SHIP_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}नौका प्रकार को छिपायें/दिखायें # Depot window @@ -803,6 +822,7 @@ STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE +STR_VEHICLE_VIEW_TRAIN_STATUS_START_STOP_TOOLTIP :{BLACK}वर्तमान ट्रेन व्यवहार - ट्रेन रोकने/चलाने के लिये क्लिक करें # Messages in the start stop button in the vehicle view @@ -823,6 +843,7 @@ STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE # Extra buttons for train details windows +STR_VEHICLE_DETAILS_TRAIN_ENGINE_BUILT_AND_VALUE :{LTBLUE}{ENGINE}{BLACK} निर्माण: {LTBLUE}{NUM}{BLACK} मूल्य: {LTBLUE}{CURRENCY_LONG} @@ -1003,6 +1024,7 @@ STR_ERROR_CAN_T_RENAME_SHIP :{WHITE}जह +STR_ERROR_CAN_T_SELL_TRAIN :{WHITE}रेल वाहन नहीं बेच सकते... @@ -1013,6 +1035,7 @@ STR_ERROR_CAN_T_RENAME_SHIP :{WHITE}जह # Order related errors +STR_ERROR_CAN_T_COPY_SHARE_ORDER :{WHITE}... वाहन सभी स्टेशनों तक नहीं जा सकता # Timetable related errors @@ -1049,10 +1072,12 @@ STR_SV_STNAME_WAYPOINT :{STRING} # Vehicle names STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COAL_CAR :कोयला वाहन STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_FRUIT_TRUCK :फल वाहन +STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_X2001_ELECTRIC :'X2001' (विद्युतीय) STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_TOY_VAN :खिलौनों का डब्बा STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_BUBBLE_VAN :बबल वैन STR_VEHICLE_NAME_ROAD_VEHICLE_PLODDYPHUT_MKIII_BUS :प्लॉडीपीहट एमके३ बस STR_VEHICLE_NAME_ROAD_VEHICLE_FOSTER_ARMORED_TRUCK :फोस्टर कवचयुक्त ट्रक +STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_CANDY_TRUCK :पावरनोट मिष्ठान्न ट्रक STR_VEHICLE_NAME_AIRCRAFT_BAKEWELL_COTSWALD_LB_3 :बेकवेल कॉट्सवॉल्ड एलबी-३ STR_VEHICLE_NAME_AIRCRAFT_BAKEWELL_LUCKETT_LB_9 :बेकवेल लकेट एलबी-९ STR_VEHICLE_NAME_AIRCRAFT_BAKEWELL_LUCKETT_LB80 :बेकवेल लकेट एलबी८० @@ -1090,6 +1115,7 @@ STR_COMPANY_NAME :{COMPANY} STR_COMPANY_NAME_COMPANY_NUM :{COMPANY} {COMPANY_NUM} STR_DEPOT_NAME :{DEPOT} STR_ENGINE_NAME :{ENGINE} +STR_HIDDEN_ENGINE_NAME :{ENGINE} (प्रच्छन्न) STR_GROUP_NAME :{GROUP} STR_INDUSTRY_NAME :{INDUSTRY} STR_PRESIDENT_NAME :{PRESIDENT_NAME} diff --git a/src/lang/italian.txt b/src/lang/italian.txt index 0f0a160454..b75cedbec6 100644 --- a/src/lang/italian.txt +++ b/src/lang/italian.txt @@ -2069,6 +2069,7 @@ STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}Il nome STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Imposta password STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Protegge la partita con una password in modo che non sia accessibile pubblicamente +STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Visibilità STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} client STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Limite client: STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Imposta il numero massimo di client. Non tutti i posti dovranno essere occupati @@ -2138,6 +2139,7 @@ STR_NETWORK_COMPANY_LIST_SPECTATE :Diventa spettat # Network client list +STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Sei sicuro di voler eliminare la compagnia '{COMPANY}'? STR_NETWORK_SERVER :Server STR_NETWORK_CLIENT :Client diff --git a/src/lang/japanese.txt b/src/lang/japanese.txt index a815dddb2d..710fd42fba 100644 --- a/src/lang/japanese.txt +++ b/src/lang/japanese.txt @@ -1204,6 +1204,7 @@ STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS :車両故障: { STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT :点検が不十分な車両が故障する頻度を設定します STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER :助成金の乗数: {STRING} STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT :助成金対象の路線に対して、通常の輸送相場の何倍が支払われるかを設定します +STR_CONFIG_SETTING_SUBSIDY_DURATION :助成期間: {STRING} STR_CONFIG_SETTING_CONSTRUCTION_COSTS :建設費: {STRING} STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :建設・購入費用のレベルを設定します STR_CONFIG_SETTING_RECESSIONS :景気後退: {STRING} diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index e1e88b5fd1..e88181f21f 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -2163,6 +2163,7 @@ STR_NETWORK_CLIENT_LIST_NEW_COMPANY :(Nytt firma) STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP :{BLACK}Opprett et nytt firma og bli med i det STR_NETWORK_CLIENT_LIST_PLAYER_ICON_SELF_TOOLTIP :{BLACK}Dette er deg STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP :{BLACK}Dette er verten for spillet +STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT :{BLACK}{NUM} klient{P "" s} / {NUM} firma{P et er} STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :Spark STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Utesteng diff --git a/src/lang/spanish_MX.txt b/src/lang/spanish_MX.txt index 652a74f7c4..28b2edc568 100644 --- a/src/lang/spanish_MX.txt +++ b/src/lang/spanish_MX.txt @@ -305,10 +305,10 @@ STR_SORT_BY_LENGTH :Longitud STR_SORT_BY_LIFE_TIME :Vida útil restante STR_SORT_BY_TIMETABLE_DELAY :Retraso en itinerario STR_SORT_BY_FACILITY :Tipo de estación -STR_SORT_BY_WAITING_TOTAL :Cargamento total en espera -STR_SORT_BY_WAITING_AVAILABLE :Cargamento disponible en espera +STR_SORT_BY_WAITING_TOTAL :Carga total en espera +STR_SORT_BY_WAITING_AVAILABLE :Carga disponible en espera STR_SORT_BY_RATING_MAX :Valoración más alta de cargamento -STR_SORT_BY_RATING_MIN :Valoración más baja de cargamento +STR_SORT_BY_RATING_MIN :Menor índice de carga STR_SORT_BY_ENGINE_ID :Id. locomotora (orden clásico) STR_SORT_BY_COST :Costo STR_SORT_BY_POWER :Potencia @@ -350,8 +350,8 @@ STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}Mostrar STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}Mostrar lista de vehículos de carretera de la empresa. Ctrl+Clic oculta la lista de grupos STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}Mostrar lista de barcos de la empresa. Ctrl+Clic oculta la lista de grupos STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}Mostrar lista de aeronaves de la empresa. Ctrl+Clic oculta la lista de grupos -STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}Acercar vista -STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}Alejar vista +STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}Acercar +STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}Alejar STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Construir vías férreas STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}Construir carreteras STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}Construir tranvías @@ -418,7 +418,7 @@ STR_FILE_MENU_EXIT :Salir # map menu STR_MAP_MENU_MAP_OF_WORLD :Minimapa completo STR_MAP_MENU_EXTRA_VIEWPORT :Ventana de vista adicional -STR_MAP_MENU_LINGRAPH_LEGEND :Leyenda de flujo de cargamento +STR_MAP_MENU_LINGRAPH_LEGEND :Leyenda de flujo de carga STR_MAP_MENU_SIGN_LIST :Lista de carteles ############ range for town menu starts @@ -433,10 +433,10 @@ STR_SUBSIDIES_MENU_SUBSIDIES :Subsidios ############ range for graph menu starts STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH :Gráfica de utilidades operativas STR_GRAPH_MENU_INCOME_GRAPH :Gráfica de ingresos -STR_GRAPH_MENU_DELIVERED_CARGO_GRAPH :Gráfica de cargamento entregado +STR_GRAPH_MENU_DELIVERED_CARGO_GRAPH :Gráfica de carga entregada STR_GRAPH_MENU_PERFORMANCE_HISTORY_GRAPH :Gráfica de desempeño STR_GRAPH_MENU_COMPANY_VALUE_GRAPH :Gráfica del valor de la empresa -STR_GRAPH_MENU_CARGO_PAYMENT_RATES :Tarifas de pagos por cargamento +STR_GRAPH_MENU_CARGO_PAYMENT_RATES :Tasas de pago por carga ############ range ends here ############ range for company league menu starts @@ -590,25 +590,25 @@ STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COM STR_GRAPH_OPERATING_PROFIT_CAPTION :{WHITE}Gráfica de utilidad operativa STR_GRAPH_INCOME_CAPTION :{WHITE}Gráfica de ingresos -STR_GRAPH_CARGO_DELIVERED_CAPTION :{WHITE}Unidades de cargamento entregadas +STR_GRAPH_CARGO_DELIVERED_CAPTION :{WHITE}Unidades de carga entregadas STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION :{WHITE}Nivel de desempeño (nivel máximo: 1000) STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Valor de la empresa -STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Tarifas de pago por cargamento +STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Tasas de pago por carga STR_GRAPH_CARGO_PAYMENT_RATES_X_LABEL :{TINY_FONT}{BLACK}Días en tránsito -STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}Pago por entregar 10 unidades (o 10,000 litros) de cargamento por distancia de 20 casillas +STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}Pago por entregar 10 unidades (o 10,000 litros) de carga por distancia de 20 casillas STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLACK}Activar todos STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}Desactivar todos -STR_GRAPH_CARGO_TOOLTIP_ENABLE_ALL :{BLACK}Mostrar todos los tipos de carga en la gráfica de tarifas de pago por cargamento -STR_GRAPH_CARGO_TOOLTIP_DISABLE_ALL :{BLACK}Ocultar todos los tipos de carga en la gráfica de tarifas de pago por cargamento -STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO :{BLACK}Mostrar u ocultar gráfica de este tipo de cargamento +STR_GRAPH_CARGO_TOOLTIP_ENABLE_ALL :{BLACK}Mostrar todos los tipos de carga en la gráfica de tasas de pago +STR_GRAPH_CARGO_TOOLTIP_DISABLE_ALL :{BLACK}Ocultar todos los tipos de carga en la gráfica de tasas de pago +STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO :{BLACK}Alternar gráfica de este tipo de carga STR_GRAPH_CARGO_PAYMENT_CARGO :{TINY_FONT}{BLACK}{STRING} STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP :{BLACK}Mostrar detalles de nivel de desempeño # Graph key window STR_GRAPH_KEY_CAPTION :{WHITE}Leyenda de gráfica -STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Mostrar u ocultar la entrada de la empresa en la gráfica +STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Mostrar u ocultar esta empresa en la gráfica # Company league window STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Tabla de evaluación de empresas @@ -637,7 +637,7 @@ STR_PERFORMANCE_DETAIL_MIN_PROFIT :{BLACK}Utilidad STR_PERFORMANCE_DETAIL_MIN_INCOME :{BLACK}Ingreso mín.: STR_PERFORMANCE_DETAIL_MAX_INCOME :{BLACK}Ingreso máx.: STR_PERFORMANCE_DETAIL_DELIVERED :{BLACK}Entregado: -STR_PERFORMANCE_DETAIL_CARGO :{BLACK}Cargamento: +STR_PERFORMANCE_DETAIL_CARGO :{BLACK}Carga: STR_PERFORMANCE_DETAIL_MONEY :{BLACK}Dinero: STR_PERFORMANCE_DETAIL_LOAN :{BLACK}Préstamo: STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}Total: @@ -720,20 +720,20 @@ STR_SMALLMAP_CAPTION :{WHITE}Mapa: {S STR_SMALLMAP_TYPE_CONTOURS :Contornos STR_SMALLMAP_TYPE_VEHICLES :Vehículos STR_SMALLMAP_TYPE_INDUSTRIES :Industrias -STR_SMALLMAP_TYPE_ROUTEMAP :Flujo de cargamento +STR_SMALLMAP_TYPE_ROUTEMAP :Flujo de carga STR_SMALLMAP_TYPE_ROUTES :Rutas STR_SMALLMAP_TYPE_VEGETATION :Vegetación STR_SMALLMAP_TYPE_OWNERS :Propietarios STR_SMALLMAP_TOOLTIP_SHOW_LAND_CONTOURS_ON_MAP :{BLACK}Mostrar elevaciones en el mapa STR_SMALLMAP_TOOLTIP_SHOW_VEHICLES_ON_MAP :{BLACK}Mostrar vehículos en el mapa STR_SMALLMAP_TOOLTIP_SHOW_INDUSTRIES_ON_MAP :{BLACK}Mostrar industrias en el mapa -STR_SMALLMAP_TOOLTIP_SHOW_LINK_STATS_ON_MAP :{BLACK}Mostrar flujo de cargamento en el mapa +STR_SMALLMAP_TOOLTIP_SHOW_LINK_STATS_ON_MAP :{BLACK}Mostrar flujo de carga en el mapa STR_SMALLMAP_TOOLTIP_SHOW_TRANSPORT_ROUTES_ON :{BLACK}Mostrar rutas de transporte en el mapa STR_SMALLMAP_TOOLTIP_SHOW_VEGETATION_ON_MAP :{BLACK}Mostrar vegetación en el mapa STR_SMALLMAP_TOOLTIP_SHOW_LAND_OWNERS_ON_MAP :{BLACK}Mostrar dueños de terreno en el mapa STR_SMALLMAP_TOOLTIP_INDUSTRY_SELECTION :{BLACK}Clic en un tipo de industria para mostrarlo u ocultarlo. Ctrl+Clic oculta todos los tipos excepto el elegido. Ctrl+Clic de nuevo en el mismo tipo muestra todos los tipos de industrias STR_SMALLMAP_TOOLTIP_COMPANY_SELECTION :{BLACK}Clic en una empresa para mostrar u ocultar sus propiedades. Ctrl+Clic oculta todas las empresas excepto la elegida. Ctrl+Clic de nuevo en la misma empresa muestra todas las empresas -STR_SMALLMAP_TOOLTIP_CARGO_SELECTION :{BLACK}Clic en un cargamento para mostrar u ocultar sus propiedades. Ctrl+Clic oculta todos los cargamentos excepto el elegido. Ctrl+Clic de nuevo muestra todos los tipos de cargamento +STR_SMALLMAP_TOOLTIP_CARGO_SELECTION :{BLACK}Clic en una carga para mostrar u ocultar sus propiedades. Ctrl+Clic oculta todas las cargas excepto la elegida. Ctrl+Clic de nuevo muestra todos los tipos de carga STR_SMALLMAP_LEGENDA_ROADS :{TINY_FONT}{BLACK}Carreteras STR_SMALLMAP_LEGENDA_RAILROADS :{TINY_FONT}{BLACK}Ferrocarriles @@ -772,15 +772,15 @@ STR_SMALLMAP_LINKSTATS :{TINY_FONT}{STR STR_SMALLMAP_COMPANY :{TINY_FONT}{COMPANY} STR_SMALLMAP_TOWN :{TINY_FONT}{WHITE}{TOWN} STR_SMALLMAP_DISABLE_ALL :{BLACK}Ocultar todo -STR_SMALLMAP_ENABLE_ALL :{BLACK}Ver todo +STR_SMALLMAP_ENABLE_ALL :{BLACK}Mostrar todo STR_SMALLMAP_SHOW_HEIGHT :{BLACK}Mostrar elevación STR_SMALLMAP_TOOLTIP_DISABLE_ALL_INDUSTRIES :{BLACK}No mostrar industrias en el mapa STR_SMALLMAP_TOOLTIP_ENABLE_ALL_INDUSTRIES :{BLACK}Mostrar todas las industrias en el mapa STR_SMALLMAP_TOOLTIP_SHOW_HEIGHT :{BLACK}Mostrar u ocultar elevaciones en el mapa STR_SMALLMAP_TOOLTIP_DISABLE_ALL_COMPANIES :{BLACK}No mostrar propiedades de empresas en el mapa STR_SMALLMAP_TOOLTIP_ENABLE_ALL_COMPANIES :{BLACK}Mostrar todas las propiedades de empresas en el mapa -STR_SMALLMAP_TOOLTIP_DISABLE_ALL_CARGOS :{BLACK}No mostrar ningún cargamento en el mapa -STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}Muestra todos los cargamentos en el mapa +STR_SMALLMAP_TOOLTIP_DISABLE_ALL_CARGOS :{BLACK}Ocultar todas las cargas del mapa +STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}Mostrar todas las cargas en el mapa # Status bar messages STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Mostrar último mensaje o noticia @@ -1025,7 +1025,7 @@ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normal STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Doble STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Cuádruple -STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Tamaño de letra +STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Tamaño de tipografía STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Elegir qué tamaño de letra usar en la interfaz STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(detectar) @@ -1236,8 +1236,8 @@ STR_CONFIG_SETTING_CATCHMENT :Permitir cambia STR_CONFIG_SETTING_CATCHMENT_HELPTEXT :Las áreas de recolección se adecúan a diferentes tamaños, según los tipos de estaciones y aeropuertos STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES :Las estaciones privadas pueden dar servicio a industrias con estaciones neutrales: {STRING} STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES_HELPTEXT :Al activarse, las industrias con estaciones integradas (ej. plataformas petrolíferas) podrán aceptar carga de estaciones aledañas. Al desactivarse, tales industrias solo recibirán carga en sus propias estaciones y no aceptarán de otras estaciones, ni la estación integrada brindará servicio a nada más que su industria -STR_CONFIG_SETTING_EXTRADYNAMITE :Permitir quitar mayor cantidad de carreteras, puentes y túneles de los pueblos: {STRING} -STR_CONFIG_SETTING_EXTRADYNAMITE_HELPTEXT :Hacer más fácil eliminar infraestructura y edificios que sean propiedad de los pueblos +STR_CONFIG_SETTING_EXTRADYNAMITE :Permitir mayor eliminación de carreteras, puentes y túneles: {STRING} +STR_CONFIG_SETTING_EXTRADYNAMITE_HELPTEXT :Hacer más fácil eliminar infraestructura y edificios que sean propiedad de las localidades STR_CONFIG_SETTING_TRAIN_LENGTH :Longitud máxima de trenes: {STRING} STR_CONFIG_SETTING_TRAIN_LENGTH_HELPTEXT :Longitud máxima permitida para los trenes STR_CONFIG_SETTING_TILE_LENGTH :{COMMA} casilla{P 0 "" s} @@ -1271,8 +1271,8 @@ STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_NORMAL :Como las demás STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_PROSPECTING :Prospección STR_CONFIG_SETTING_INDUSTRY_PLATFORM :Área plana alrededor de industrias: {STRING} STR_CONFIG_SETTING_INDUSTRY_PLATFORM_HELPTEXT :Cantidad de espacio plano alrededor de las industrias. Esto asegura que haya espacio libre alrededor de las industrias para construir vías férreas, etc. -STR_CONFIG_SETTING_MULTIPINDTOWN :Permitir múltiples industrias similares por pueblo: {STRING} -STR_CONFIG_SETTING_MULTIPINDTOWN_HELPTEXT :Generalmente, no se permite más de una industria del mismo tipo por pueblo. Con esta opción se permiten múltiples industrias del mismo tipo en el mismo pueblo +STR_CONFIG_SETTING_MULTIPINDTOWN :Permitir varias industrias similares por localidad: {STRING} +STR_CONFIG_SETTING_MULTIPINDTOWN_HELPTEXT :En general, una localidad admite un solo tipo de industria a la vez, pero con esta opción varias industrias del mismo tipo en una localidad son posibles STR_CONFIG_SETTING_SIGNALSIDE :Mostrar señales: {STRING} STR_CONFIG_SETTING_SIGNALSIDE_HELPTEXT :De qué lado de las vías se instalarán las señales STR_CONFIG_SETTING_SIGNALSIDE_LEFT :A la izquierda @@ -1294,9 +1294,9 @@ STR_CONFIG_SETTING_AUTOSCROLL_MAIN_VIEWPORT_FULLSCREEN :Vista principal STR_CONFIG_SETTING_AUTOSCROLL_MAIN_VIEWPORT :Vista principal STR_CONFIG_SETTING_AUTOSCROLL_EVERY_VIEWPORT :Todas las vistas STR_CONFIG_SETTING_BRIBE :Permitir sobornos al ayuntamiento: {STRING} -STR_CONFIG_SETTING_BRIBE_HELPTEXT :Las empresas pueden intentar sobornar a los ayuntamientos, pero si un inspector lo descubre la empresa no podrá realizar actividades en el pueblo seis meses +STR_CONFIG_SETTING_BRIBE_HELPTEXT :Las empresas intentan sobornar a los ayuntamientos. Si un inspector lo descubre, la empresa no podrá operar en la localidad seis meses STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :Permitir adquirir los derechos de transporte exclusivos: {STRING} -STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Si una empresa adquiere los derechos de transporte exclusivos en un pueblo, las estaciones de la competencia, de pasajeros o carga, no recibirán nada todo un año +STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Si una empresa compra los derechos de transporte exclusivos en una localidad, las estaciones de la competencia no recibirán carga nada todo un año STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS :Permitir la construcción de nuevos edificios: {STRING} STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT :Las empresas aportan dinero a los ayuntamientos para que construyan nuevas casas y edificios STR_CONFIG_SETTING_ALLOW_FUND_ROAD :Permitir el pago de la reconstrucción de las carreteras locales: {STRING} @@ -1304,7 +1304,7 @@ STR_CONFIG_SETTING_ALLOW_FUND_ROAD_HELPTEXT :Las empresas ap STR_CONFIG_SETTING_ALLOW_GIVE_MONEY :Permitir enviar dinero a otras empresas: {STRING} STR_CONFIG_SETTING_ALLOW_GIVE_MONEY_HELPTEXT :Permitir la transferencia de dinero entre empresas en modo multijugador STR_CONFIG_SETTING_FREIGHT_TRAINS :Multiplicador de peso para simular trenes pesados: {STRING} -STR_CONFIG_SETTING_FREIGHT_TRAINS_HELPTEXT :Establece el impacto de llevar cargamento en los trenes. Un valor mayor exige mayor potencia a los trenes para llevar una carga, sobre todo al subir colinas +STR_CONFIG_SETTING_FREIGHT_TRAINS_HELPTEXT :Impacto de llevar carga en los trenes. Un valor mayor exige mayor potencia a los trenes para llevar carga, sobre todo al subir colinas STR_CONFIG_SETTING_PLANE_SPEED :Factor de velocidad de aeronaves: {STRING} STR_CONFIG_SETTING_PLANE_SPEED_HELPTEXT :Establece la velocidad relativa de las aeronaves comparada con la de otros vehículos para reducir las utilidades de transportación aérea STR_CONFIG_SETTING_PLANE_SPEED_VALUE :1/{COMMA} @@ -1353,15 +1353,15 @@ STR_CONFIG_SETTING_HOVER_DELAY :Mostrar informa STR_CONFIG_SETTING_HOVER_DELAY_HELPTEXT :Tiempo de retraso para mostrar información de ayuda al posar el ratón en un elemento de la interfaz. Si el valor es 0 los mensajes se muestran con el botón derecho del ratón. STR_CONFIG_SETTING_HOVER_DELAY_VALUE :Posar el ratón {COMMA} milisegundo{P 0 "" s} STR_CONFIG_SETTING_HOVER_DELAY_DISABLED :Botón derecho -STR_CONFIG_SETTING_POPULATION_IN_LABEL :Mostrar población de pueblos: {STRING} -STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Mostrar en el mapa la población de los pueblos junto a sus nombres +STR_CONFIG_SETTING_POPULATION_IN_LABEL :Mostrar población de localidades: {STRING} +STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Mostrar en el mapa la población de las localidades junto a sus nombres STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Grosor de las líneas en las gráficas: {STRING} STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Grosor de las líneas en las gráficas. Una línea fina es más precisa, una línea más gruesa es más fácil de distinguir STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :Mostrar el nombre del GRF en la ventana de construcción de vehículo: {STRING} STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Indicar por medio de una línea adicional en la ventana de construcción de vehículo su NewGRF. STR_CONFIG_SETTING_LANDSCAPE :Terreno: {STRING} -STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Los terrenos definen mapas con diferentes tipos de carga y requisitos de crecimiento para los pueblos. Es posible modificarlos empleando NewGRF y scripts de juego +STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Los terrenos definen mapas con diferentes tipos de carga y requisitos de crecimiento de las localidades, los cuales pueden cambiarse con NewGRF y scripts de juego STR_CONFIG_SETTING_LAND_GENERATOR :Generador de terreno: {STRING} STR_CONFIG_SETTING_LAND_GENERATOR_HELPTEXT :El generador 'Original' depende de los gráficos base y crea formas de terreno fijas. 'TerraGenesis' es un generador basado en Ruido Perlin que permite un mayor control de configuración STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Original @@ -1375,7 +1375,7 @@ STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Distancia lími STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Nivel de inicio de nieve: {STRING} STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Controlar la altura donde la nieve empieza en mapas de clima Subártico, lo cual afectará la generación de industrias y los requisitos de crecimiento de pueblos. Este valor se puede cambiar en el Editor de mapas o se calculará según la "Extensión de nieve" STR_CONFIG_SETTING_SNOW_COVERAGE :Extensión de nieve: {STRING} -STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Controlar la cantidad aproximada de nieve al generar un mapa de clima Subártico, lo cual afectará la generación de industrias y los requisitos de crecimiento de pueblos. La superficie casi al ras del nivel del mar nunca tiene nieve. +STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Controlar la cantidad aproximada de nieve al generar un mapa de geografía de Subártico, la cual afectará la generación de industrias y los requisitos de crecimiento de las localidades. La superficie casi al ras del nivel del mar nunca tiene nieve STR_CONFIG_SETTING_SNOW_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_DESERT_COVERAGE :Extensión de desierto: {STRING} STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Controlar la cantidad aproximada de desierto al generar un mapa de clima tropical, lo cual afectará la generación de industrias también. @@ -1515,7 +1515,7 @@ STR_CONFIG_SETTING_SOUND_DISASTER_HELPTEXT :Reproducir efec STR_CONFIG_SETTING_SOUND_VEHICLE :Vehículos: {STRING} STR_CONFIG_SETTING_SOUND_VEHICLE_HELPTEXT :Reproducir efectos de sonido de vehículos STR_CONFIG_SETTING_SOUND_AMBIENT :Ambiente: {STRING} -STR_CONFIG_SETTING_SOUND_AMBIENT_HELPTEXT :Reproducir sonidos ambientales de terreno, industrias y pueblos +STR_CONFIG_SETTING_SOUND_AMBIENT_HELPTEXT :Reproducir sonidos ambientales de terreno, industrias y localidades STR_CONFIG_SETTING_DISABLE_UNSUITABLE_BUILDING :Deshabilitar construcción de infraestructura cuando no haya vehículos apropiados disponibles: {STRING} STR_CONFIG_SETTING_DISABLE_UNSUITABLE_BUILDING_HELPTEXT :Al activarse, hay infraestructura disponible solo si hay vehículos adecuados, evitando gastos de tiempo y dinero en infraestructura inservible @@ -1531,7 +1531,7 @@ STR_CONFIG_SETTING_MAX_SHIPS_HELPTEXT :Número máximo STR_CONFIG_SETTING_AI_BUILDS_TRAINS :Desactivar trenes para la computadora: {STRING} STR_CONFIG_SETTING_AI_BUILDS_TRAINS_HELPTEXT :Activar esta opción para deshabilitar la construcción de trenes por jugadores no humanos STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES :Desactivar vehículos de carretera para la computadora: {STRING} -STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES_HELPTEXT :Activar esta opción para deshabilitar la construcción de vehículos de carretera por jugadores no humanos +STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES_HELPTEXT :Activar esta opción deshabilita la construcción de vehículos de carretera por jugadores no humanos STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT :Desactivar aeroplanos para la computadora: {STRING} STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT_HELPTEXT :Activar esta opción deshabilita la construcción de aeronaves por jugadores no humanos STR_CONFIG_SETTING_AI_BUILDS_SHIPS :Desactivar barcos para la computadora: {STRING} @@ -1594,8 +1594,8 @@ STR_CONFIG_SETTING_NEWS_ADVICE :Sugerencias e i STR_CONFIG_SETTING_NEWS_ADVICE_HELPTEXT :Mostrar mensajes sobre vehículos que requieran atención STR_CONFIG_SETTING_NEWS_NEW_VEHICLES :Nuevos vehículos: {STRING} STR_CONFIG_SETTING_NEWS_NEW_VEHICLES_HELPTEXT :Mostrar noticias sobre nuevos tipos de vehículos disponibles -STR_CONFIG_SETTING_NEWS_CHANGES_ACCEPTANCE :Cambios en la recepción de cargamento: {STRING} -STR_CONFIG_SETTING_NEWS_CHANGES_ACCEPTANCE_HELPTEXT :Mostrar mensajes sobre cambios a la recepción de cargamento en estaciones +STR_CONFIG_SETTING_NEWS_CHANGES_ACCEPTANCE :Cambios en la aceptación de carga: {STRING} +STR_CONFIG_SETTING_NEWS_CHANGES_ACCEPTANCE_HELPTEXT :Mostrar mensajes de cambios a la aceptación de carga en estaciones STR_CONFIG_SETTING_NEWS_SUBSIDIES :Subsidios: {STRING} STR_CONFIG_SETTING_NEWS_SUBSIDIES_HELPTEXT :Mostrar noticias sobre eventos relacionados con subsidios STR_CONFIG_SETTING_NEWS_GENERAL_INFORMATION :Información general: {STRING} @@ -1624,10 +1624,10 @@ STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES_HELPTEXT :Estabelcer la e STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Porcentaje de la utilidad total a pagar por transferencias de carga: {STRING} STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :Porcentaje de utilidad cedida a los transportes intermedios en sistemas de transferencia de carga, dando un mayor control sobre la utilidad de cada vehículo STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :Al arrastrar, colocar señales cada: {STRING} -STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Distancia de separación entre señales hasta topar con algún obstáculo (otra señal, un desvío, etc.) al instalarlas mediante arrastre con el ratón +STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Distancia de separación entre señales hasta topar con algún obstáculo (otra señal, un desvío, etc.) al colocarlas con arrastre STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} casilla{P 0 "" s} STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :Al arrastrar, mantener distancia fija entre señales: {STRING} -STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Forma en que se instalan señales con Ctrl+Arrastrar. Al desactivarse, se colocan señales cerca de túneles y puentes para evitar tramos largos de vías sin señales. Al activarse, se colocan señales cada tanto de casillas, con lo que alinear señales en vías paralelas es más fácil +STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Forma en que se colocan las señales con Ctrl+Arrastrar. Al desactivarse, se colocan señales cerca de túneles y puentes para evitar tramos largos sin señales. Al activarse, se colocan señales cada tanto de casillas, con lo que alinear señales en vías paralelas es más fácil STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Señales mecánicas por defecto antes de: {STRING} STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Año a partir del cual se usarán señales eléctricas. Antes de ese año se usarán señales mecánicas, las cuales funcionan igual pero tienen distinto aspecto STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI :Activar interfaz de señales: {STRING} @@ -1650,19 +1650,19 @@ STR_CONFIG_SETTING_TOWN_LAYOUT_BETTER_ROADS :Mejorado STR_CONFIG_SETTING_TOWN_LAYOUT_2X2_GRID :Rejilla de 2×2 STR_CONFIG_SETTING_TOWN_LAYOUT_3X3_GRID :Rejilla de 3×3 STR_CONFIG_SETTING_TOWN_LAYOUT_RANDOM :Aleatorio -STR_CONFIG_SETTING_ALLOW_TOWN_ROADS :Permitir que los pueblos construyan carreteras: {STRING} -STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Los pueblos podrán construir carreteras para expandirse. Al desactivarse, los ayuntamientos no podrán construir carreteras -STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Permitir a los pueblos construir pasos a nivel: {STRING} -STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Los pueblos podrán construir pasos a nivel -STR_CONFIG_SETTING_NOISE_LEVEL :Permitir a los pueblos controlar el nivel de ruido de los aeropuertos: {STRING} -STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Al desactivarse, puede haber solo dos aeropuertos por pueblo. Al activarse, el número de aeropuertos por pueblo depende de su nivel de ruido permitido, que a su vez depende de la población, el tamaño de los aeropuertos y la distancia +STR_CONFIG_SETTING_ALLOW_TOWN_ROADS :Permitir a las localidades construir carreteras: {STRING} +STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Los ayuntamientos construyen carreteras para que las localidades se expandan. Desactivar para impedirlo +STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Permitir a las localidades construir pasos a nivel: {STRING} +STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Activar esta opción permite a las localidades construir pasos a nivel +STR_CONFIG_SETTING_NOISE_LEVEL :Permitir el ruido de aeropuertos controlado por localidades: {STRING} +STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Al desactivarse, puede haber hasta dos aeropuertos por localidad. Al activarse, el número de aeropuertos por localidad depende de su nivel de ruido permitido, el cual depende de la población, el tamaño de cada aeropuerto y la distancia STR_CONFIG_SETTING_TOWN_FOUNDING :Fundar pueblos: {STRING} STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Los jugadores podrán crear nuevos pueblos durante la partida STR_CONFIG_SETTING_TOWN_FOUNDING_FORBIDDEN :Prohibido STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED :Permitido STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED_CUSTOM_LAYOUT :Permitido, diseño urbano personalizado -STR_CONFIG_SETTING_TOWN_CARGOGENMODE :Generación de cargamento en pueblios: {STRING} -STR_CONFIG_SETTING_TOWN_CARGOGENMODE_HELPTEXT :Cantidad de cargamento producido por las casas con relación a la población.{}Crecimiento cuadrado: un pueblo de doble tamaño genera el cuádruple de pasajeros.{}Crecimiento lineal: un pueblo de doble tamaño genera el doble de pasajeros. +STR_CONFIG_SETTING_TOWN_CARGOGENMODE :Generación de carga en pueblos: {STRING} +STR_CONFIG_SETTING_TOWN_CARGOGENMODE_HELPTEXT :Cantidad de carga producida por las casas con relación a la población.{}Crecimiento cuadrado: un pueblo de doble tamaño genera el cuádruple de pasajeros.{}Crecimiento lineal: un pueblo de doble tamaño genera el doble de pasajeros. STR_CONFIG_SETTING_TOWN_CARGOGENMODE_ORIGINAL :Cuadrado STR_CONFIG_SETTING_TOWN_CARGOGENMODE_BITCOUNT :Lineal @@ -1707,12 +1707,12 @@ STR_CONFIG_SETTING_TOWN_GROWTH_SLOW :Lenta STR_CONFIG_SETTING_TOWN_GROWTH_NORMAL :Normal STR_CONFIG_SETTING_TOWN_GROWTH_FAST :Rápida STR_CONFIG_SETTING_TOWN_GROWTH_VERY_FAST :Muy rápida -STR_CONFIG_SETTING_LARGER_TOWNS :Proporción de pueblos que se convertirán en ciudades: {STRING} -STR_CONFIG_SETTING_LARGER_TOWNS_HELPTEXT :Número de pueblos que se convertirán en ciudades. Las ciudades comienzan siendo más grandes y crecen más rápido +STR_CONFIG_SETTING_LARGER_TOWNS :Proporción de localidades que se convertirán en ciudades: {STRING} +STR_CONFIG_SETTING_LARGER_TOWNS_HELPTEXT :Número de localidades que se convertirán en ciudades, las cuales comienzan siendo más grandes y crecen más rápido STR_CONFIG_SETTING_LARGER_TOWNS_VALUE :1 de cada {COMMA} STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :Ninguno STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Multiplicador inicial de tamaño de ciudad: {STRING} -STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Tamaño medio de las ciudades en relación a los pueblos al comienzo de la partida +STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Tamaño medio de las ciudades relativo a las localidades al inicio del juego STR_CONFIG_SETTING_LINKGRAPH_INTERVAL :Actualizar la gráfica de distribución cada {STRING}{NBSP}día{P 0:2 "" s} STR_CONFIG_SETTING_LINKGRAPH_INTERVAL_HELPTEXT :Periodo de tiempo entre cálculos consecutivos de la gráfica de distribución. Esta opción se refiere a los cálculos para cada uno de los componentes de la gráfica, por lo cual establecer un valor no quiere decir que la gráfica completa se actualizará tras ese número de días, solo algún componente lo hará. Cuanto menor sea, mayor tiempo de CPU será necesario para calcular la gráfica distribución. Cuanto mayor sea, más tardará la gráfica en adaptarse a nuevas rutas @@ -1722,21 +1722,21 @@ STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :Manual STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC :Asimétrica STR_CONFIG_SETTING_DISTRIBUTION_SYMMETRIC :Simétrica STR_CONFIG_SETTING_DISTRIBUTION_PAX :Modo de distribución para pasajeros: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :En una distribución 'Simétrica', se envía la misma cantidad de pasajeros entre dos estaciones. En una distribución 'Asimétrica', se pueden enviar cantidades arbitrarias de pasajeros en ambas direcciones. 'Manual' significa que no hay distribución automática para los pasajeros +STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :En una distribución "Simétrica" se envía la misma cantidad de pasajeros entre dos estaciones. En una distribución "Asimétrica" se pueden enviar cantidades arbitrarias de pasajeros en ambas direcciones. "Manual" significa que no hay distribución automática para los pasajeros. STR_CONFIG_SETTING_DISTRIBUTION_MAIL :Modo de distribución para el correo: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :En una distribución 'Simétrica', se envía la misma cantidad de correo entre dos estaciones. En una distribución 'Asimétrica', se pueden enviar cantidades arbitrarias de correo en ambas direcciones. 'Manual' significa que no hay distribución automática para el correo +STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :En una distribución "Simétrica" se envía la misma cantidad de correo entre dos estaciones. En una distribución "Asimétrica" se pueden enviar cantidades arbitrarias de correo en ambas direcciones. "Manual" significa que no hay distribución automática para el correo STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED :Modo de distribución para cargamento de valores: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :El cargamento de valores contiene objetos de valor en el clima Templado, diamantes en el clima Subtropical y oro en el clima Subártico (hay NewGRF para modificar esto). En una distribución 'Simétrica', se envía la misma cantidad de cargamento entre dos estaciones. En una distribución 'Asimétrica', se pueden enviar cantidades arbitrarias de cargamento en ambas direcciones. 'Manual' significa que no hay distribución automática para este cargamento. Se recomienda establecer la distribución en 'Asimétrica' o en 'Manual' al jugar en clima Subártico, pues los bancos no regresarán el oro a sus minas de procedencia. En los climas Templado y Subtropical se puede escoger 'Simétrica', ya que los bancos pueden regresar los objetos de valor a su banco origen. -STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :Modo de distribución para otro cargamento: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :'Asimétrica' significa que se pueden mover cantidades arbitrarias de cargamento en ambas direcciones. 'Manual' significa que no habrá distribución automática para esta clase de cargamento. +STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :El cargamento de valores contiene objetos de valor en el clima Templado, diamantes en el Subtropical y oro en el Subártico. Algún NewGRF puede modificar esto. En una distribución "Simétrica", se envía la misma cantidad de carga entre dos estaciones. En una distribución "Asimétrica", se envían cantidades arbitrarias de carga en ambas direcciones. "Manual" significa que no hay distribución automática para esta carga. Se recomienda la distribución "Asimétrica" o "Manual" al jugar en clima Subártico, ya que los bancos no regresan oro a las minas. En los climas Templado y Subtropical se puede escoger "Simétrica", ya que los bancos pueden regresar algunos objetos de valor a su banco de origen. +STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :Modo de distribución para otra carga: {STRING} +STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :"Asimétrica" significa que se pueden enviar cantidades arbitrarias de carga en ambas direcciones. "Manual" significa que no habrá distribución automática para esta clase de carga. STR_CONFIG_SETTING_LINKGRAPH_ACCURACY :Precisión de la distribución: {STRING} -STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :Si el valor es alto, se requerirá mayor tiempo para calcular la gráfica de distribución (si se lleva demasiado tiempo, se notará desfase en el juego). Si es muy bajo, la distribución será imprecisa, pudiendo hacer que el cargamento no vaya al lugar indicado +STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :Si el valor es alto, se requerirá mayor tiempo para calcular la gráfica de distribución (si se lleva demasiado tiempo, se notará desfase en el juego). Si es muy bajo, la distribución será imprecisa, pudiendo hacer que la carga no vaya al lugar indicado STR_CONFIG_SETTING_DEMAND_DISTANCE :Efecto de la distancia en la demanda: {STRING} -STR_CONFIG_SETTING_DEMAND_DISTANCE_HELPTEXT :Con un valor diferente a 0, la distancia entre la estación de origen de cierta carga y una posible estación de destino afectará la cantidad de cargamento que se envíe entre ambas. Cuanto más lejos estén entre sí, menos cargamento se enviará. Cuanto mayor sea el valor de esta opción, menos cargamento se enviará a estaciones distantes en favor de estaciones cercanas -STR_CONFIG_SETTING_DEMAND_SIZE :Cantidad de cargamento a devolver en modo simétrico: {STRING} -STR_CONFIG_SETTING_DEMAND_SIZE_HELPTEXT :Establecer un valor menor de 100% hará que la distribución simétrica de cargamento sea más asimétrica. Se enviará menos cargamento de regreso forzosamente si una cantidad determinada es enviada a una estación. Si se fija a 0%, la distribución simétrica será como una distribución asimétrica +STR_CONFIG_SETTING_DEMAND_DISTANCE_HELPTEXT :Con un valor mayor de 0, la distancia entre una estación de origen A y una estación de destino B afectará la cantidad de carga que se envíe desde A a B, enviando menos carga cuanto más lejos est. Cuanto mayor sea el valor de esta opción, menos carga se enviará a estaciones distantes en favor de estaciones cercanas. +STR_CONFIG_SETTING_DEMAND_SIZE :Cantidad de carga en retorno en modo simétrico: {STRING} +STR_CONFIG_SETTING_DEMAND_SIZE_HELPTEXT :Con un valor menor de 100% la distribución simétrica de carga será más asimétrica, lo cual obligará a enviar menos carga en retorno en función de la enviada a una estación. Si es 0%, la distribución simétrica igual que la asimétrica. STR_CONFIG_SETTING_SHORT_PATH_SATURATION :Nivel de saturación de rutas cortas antes de cambiar a rutas de mayor capacidad: {STRING} -STR_CONFIG_SETTING_SHORT_PATH_SATURATION_HELPTEXT :Entre dos estaciones usualmente hay más de una ruta posible. Se intentarán saturar las rutas más cortas primero, luego las que les siguen, y así sucesivamente. La saturación está determinada por una estimación de capacidad y uso planificado. Una vez que se hayan saturado todas las rutas, si todavía hay demanda se sobrecargarán los caminos empezando por aquellos de mayor capacidad. El algoritmo no siempre estimará la capacidad de forma precisa. Esta opción permite especificar el porcentaje de saturación que debe tener una ruta en el primer análisis antes de pasar a la siguiente ruta. Ponerlo a menos de 100% permite evitar estaciones sobrecargadas en el caso de que se sobreestimen las capacidades +STR_CONFIG_SETTING_SHORT_PATH_SATURATION_HELPTEXT :Entre dos estaciones a veces hay varias rutas. Se intentará saturar la ruta más corta primero, luego la que le sigue, y así sucesivamente. La saturación está determinada por una estimación de capacidad y uso planeado. Al saturarse todas las rutas, si aún hay demanda se sobrecargarán todas, empezando por las de mayor capacidad. El algoritmo no siempre estimará la capacidad de forma precisa. Esta opción permite especificar el porcentaje de saturación que debe tener una ruta más corta en la primera vuelta antes de pasar a la siguiente. Menos de 100% evita estaciones abarrotadas si las capacidades se sobreestiman. STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY :Unidades de velocidad: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Cada vez que se muestre una velocidad en la interfaz de usuario, se emplearán las unidades elegidas @@ -1793,7 +1793,7 @@ STR_CONFIG_SETTING_ACCIDENTS :{ORANGE}Desastr STR_CONFIG_SETTING_GENWORLD :{ORANGE}Generación de mapa STR_CONFIG_SETTING_ENVIRONMENT :{ORANGE}Ambiente STR_CONFIG_SETTING_ENVIRONMENT_AUTHORITIES :{ORANGE}Autoridades -STR_CONFIG_SETTING_ENVIRONMENT_TOWNS :{ORANGE}Pueblos +STR_CONFIG_SETTING_ENVIRONMENT_TOWNS :{ORANGE}Localidades STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :{ORANGE}Industrias STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :{ORANGE}Distribución de carga STR_CONFIG_SETTING_AI :{ORANGE}Competidores @@ -2160,6 +2160,7 @@ STR_NETWORK_CLIENT_LIST_NEW_COMPANY :(Nueva empresa) STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP :{BLACK}Crear nueva empresa y unirse a ella STR_NETWORK_CLIENT_LIST_PLAYER_ICON_SELF_TOOLTIP :{BLACK}Este eres tú STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP :{BLACK}Este es el host del juego +STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT :{BLACK}{NUM} cliente{P "" s}/{NUM} empresa{P "" s} STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :Expulsar STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Bloquear acceso @@ -2379,7 +2380,7 @@ STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Transpar STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Ocultar objetos totalmente # Linkgraph legend window -STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Leyenda de flujo de cargamento +STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Leyenda de flujo de carga STR_LINKGRAPH_LEGEND_ALL :{BLACK}Todas STR_LINKGRAPH_LEGEND_NONE :{BLACK}Ninguna STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Elegir las empresas a mostrar @@ -2674,18 +2675,18 @@ STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_QUERY :{YELLOW}¿Segur # Industry cargoes window STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Cadena industrial para la industria de {STRING} -STR_INDUSTRY_CARGOES_CARGO_CAPTION :{WHITE}Cadena industrial para el cargamento de {STRING} +STR_INDUSTRY_CARGOES_CARGO_CAPTION :{WHITE}Cadena industrial para carga de {STRING} STR_INDUSTRY_CARGOES_PRODUCERS :{WHITE}Industrias proveedoras STR_INDUSTRY_CARGOES_CUSTOMERS :{WHITE}Industrias receptoras STR_INDUSTRY_CARGOES_HOUSES :{WHITE}Casas STR_INDUSTRY_CARGOES_INDUSTRY_TOOLTIP :{BLACK}Clic en la industria para ver sus industrias proveedoras y receptoras -STR_INDUSTRY_CARGOES_CARGO_TOOLTIP :{BLACK}{STRING}{}Clic en el cargamento para ver sus industrias proveedoras y receptoras -STR_INDUSTRY_DISPLAY_CHAIN :{BLACK}Mostrar cadena -STR_INDUSTRY_DISPLAY_CHAIN_TOOLTIP :{BLACK}Mostrar las industrias que proveen y aceptan el cargamento +STR_INDUSTRY_CARGOES_CARGO_TOOLTIP :{BLACK}{STRING}{}Clic en la carga para ver sus proveedores y clientes +STR_INDUSTRY_DISPLAY_CHAIN :{BLACK}Mostrar cadena industrial +STR_INDUSTRY_DISPLAY_CHAIN_TOOLTIP :{BLACK}Mostrar las industrias que proveen y aceptan la carga STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP :{BLACK}Ver en minimapa STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP_TOOLTIP :{BLACK}Elegir y ver en el minimapa las industrias mostradas en el mapa principal -STR_INDUSTRY_CARGOES_SELECT_CARGO :{BLACK}Elegir cargamento -STR_INDUSTRY_CARGOES_SELECT_CARGO_TOOLTIP :{BLACK}Elegir el tipo de cargamento a mostrar +STR_INDUSTRY_CARGOES_SELECT_CARGO :{BLACK}Elegir carga +STR_INDUSTRY_CARGOES_SELECT_CARGO_TOOLTIP :{BLACK}Elegir el tipo de carga STR_INDUSTRY_CARGOES_SELECT_INDUSTRY :{BLACK}Elegir industria STR_INDUSTRY_CARGOES_SELECT_INDUSTRY_TOOLTIP :{BLACK}Elegir la industria a mostrar @@ -2710,7 +2711,7 @@ STR_LAND_AREA_INFORMATION_AIRPORT_CLASS :{BLACK}Tipo de STR_LAND_AREA_INFORMATION_AIRPORT_NAME :{BLACK}Nombre del aeropuerto: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Nombre de casilla del aeropuerto: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} -STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Cargamento aceptado: {LTBLUE} +STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Carga aceptada: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Tipo de vía: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_ROAD_TYPE :{BLACK}Tipo de carretera: {LTBLUE}{STRING} @@ -2842,7 +2843,7 @@ STR_FRAMERATE_GRAPH_MILLISECONDS :{TINY_FONT}{COM STR_FRAMERATE_GRAPH_SECONDS :{TINY_FONT}{COMMA} s ############ Leave those lines in this order!! STR_FRAMERATE_GAMELOOP :{BLACK}Bucles de juego totales: -STR_FRAMERATE_GL_ECONOMY :{BLACK} Manejo de cargamento: +STR_FRAMERATE_GL_ECONOMY :{BLACK} Manejo de carga: STR_FRAMERATE_GL_TRAINS :{BLACK} Ticks de trenes: STR_FRAMERATE_GL_ROADVEHS :{BLACK} Ticks de vehículos de carretera: STR_FRAMERATE_GL_SHIPS :{BLACK} Ticks de barcos: @@ -2859,7 +2860,7 @@ STR_FRAMERATE_AI :{BLACK} IA {NUM ############ End of leave-in-this-order ############ Leave those lines in this order!! STR_FRAMETIME_CAPTION_GAMELOOP :Bucle de juego -STR_FRAMETIME_CAPTION_GL_ECONOMY :Manejo de cargamento +STR_FRAMETIME_CAPTION_GL_ECONOMY :Manejo de carga STR_FRAMETIME_CAPTION_GL_TRAINS :Ticks de trenes STR_FRAMETIME_CAPTION_GL_ROADVEHS :Ticks de vehículos de carretera STR_FRAMETIME_CAPTION_GL_SHIPS :Ticks de barcos @@ -3147,15 +3148,15 @@ STR_NEWGRF_BROKEN_CAPACITY :{WHITE}Cambió STR_BROKEN_VEHICLE_LENGTH :{WHITE}Tren {VEHICLE} de {COMPANY} tiene una longitud no válida. Quizá es por problemas de los NewGRF, y puede provocar que el juego falle STR_NEWGRF_BUGGY :{WHITE}El NewGRF '{0:STRING}' da información incorrecta -STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}La información de cargamento o reequipamiento para '{1:ENGINE}' difiere de la lista de compra después de la construcción. Esto puede causar que la renovación y el reemplazo automático no haga el reequipamiento correcta +STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}La información de carga o reequipamiento para '{1:ENGINE}' difiere de la lista de compra después de la construcción. Esto puede causar que la renovación y el reemplazo automático no haga el reequipamiento correcto STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' ha causado un bucle sin fin en la llamada de producción STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT :{WHITE}La llamada {1:HEX} devolvió un resultado desconocido o no válido {2:HEX} -STR_NEWGRF_BUGGY_INVALID_CARGO_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' retornó un tipo inválido de cargamento en la llamada de producción en {2:HEX} +STR_NEWGRF_BUGGY_INVALID_CARGO_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' retornó un tipo inválido de carga en la callback de producción en {2:HEX} # 'User removed essential NewGRFs'-placeholders for stuff without specs -STR_NEWGRF_INVALID_CARGO : +STR_NEWGRF_INVALID_CARGO : STR_NEWGRF_INVALID_CARGO_ABBREV :?? -STR_NEWGRF_INVALID_CARGO_QUANTITY :{COMMA} de +STR_NEWGRF_INVALID_CARGO_QUANTITY :{COMMA} de STR_NEWGRF_INVALID_ENGINE : STR_NEWGRF_INVALID_INDUSTRYTYPE : @@ -3194,7 +3195,7 @@ STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (ciudad) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Habitantes: {ORANGE}{COMMA}{BLACK} Casas: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX :{BLACK}{CARGO_LIST} último mes: {ORANGE}{COMMA}{BLACK} máx.: {ORANGE}{COMMA} -STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Cargamento necesario para crecimiento: +STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Carga necesaria para crecimiento: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} requeridos STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} requerido en invierno STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED_GENERAL :{ORANGE}{STRING}{GREEN} entregado @@ -3316,8 +3317,8 @@ STR_STATION_LIST_STATION :{YELLOW}{STATIO STR_STATION_LIST_WAYPOINT :{YELLOW}{WAYPOINT} STR_STATION_LIST_NONE :{YELLOW}- Ninguna - STR_STATION_LIST_SELECT_ALL_FACILITIES :{BLACK}Elegir todos los tipos de estación -STR_STATION_LIST_SELECT_ALL_TYPES :{BLACK}Elegir todos los tipos de cargamento (incluidos los que no estén en espera) -STR_STATION_LIST_NO_WAITING_CARGO :{BLACK}Ningún tipo de cargamento está esperando +STR_STATION_LIST_SELECT_ALL_TYPES :{BLACK}Elegir todos los tipos de carga (también los que no están en espera) +STR_STATION_LIST_NO_WAITING_CARGO :{BLACK}No hay ninguna carga esperando # Station view window STR_STATION_VIEW_CAPTION :{WHITE}{STATION} {STATION_FEATURES} @@ -3326,7 +3327,7 @@ STR_STATION_VIEW_EN_ROUTE_FROM :{YELLOW}({CARGO STR_STATION_VIEW_RESERVED :{YELLOW}({CARGO_SHORT} reservado para cargar) STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Acepta -STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Lista de cargamento aceptado +STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Lista de carga aceptada STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Acepta: {WHITE}{CARGO_LIST} STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Esta estación tiene los derechos exclusivos de transporte en este pueblo. @@ -3499,7 +3500,7 @@ STR_INDUSTRY_DIRECTORY_ITEM_PROD2 :{ORANGE}{INDUST STR_INDUSTRY_DIRECTORY_ITEM_PROD3 :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} STR_INDUSTRY_DIRECTORY_ITEM_PRODMORE :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} y {NUM} más... STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Nombres de industrias. Clic para centrar la vista en la industria. Ctrl+Clic abre una vista aparte -STR_INDUSTRY_DIRECTORY_ACCEPTED_CARGO_FILTER :{BLACK}Cargamento aceptado: {SILVER}{STRING} +STR_INDUSTRY_DIRECTORY_ACCEPTED_CARGO_FILTER :{BLACK}Carga aceptada: {SILVER}{STRING} STR_INDUSTRY_DIRECTORY_PRODUCED_CARGO_FILTER :{BLACK}Cargemento producido: {SILVER}{STRING} STR_INDUSTRY_DIRECTORY_FILTER_ALL_TYPES :Todos los tipos STR_INDUSTRY_DIRECTORY_FILTER_NONE :Ninguno @@ -3852,10 +3853,10 @@ STR_VEHICLE_VIEW_CLONE_AIRCRAFT_INFO :{BLACK}Esto com STR_VEHICLE_VIEW_TRAIN_IGNORE_SIGNAL_TOOLTIP :{BLACK}Forzar al tren a proceder sin esperar a que la señal le ceda vía libre -STR_VEHICLE_VIEW_TRAIN_REFIT_TOOLTIP :{BLACK}Reformar tren para transportar otro tipo de cargamento -STR_VEHICLE_VIEW_ROAD_VEHICLE_REFIT_TOOLTIP :{BLACK}Reformar vehículo de carretera para transportar otro tipo de cargamento -STR_VEHICLE_VIEW_SHIP_REFIT_TOOLTIP :{BLACK}Reformar barco para que transporte otro tipo de cargamento -STR_VEHICLE_VIEW_AIRCRAFT_REFIT_TOOLTIP :{BLACK}Reformar aeronave para llevar otro tipo de cargamento +STR_VEHICLE_VIEW_TRAIN_REFIT_TOOLTIP :{BLACK}Reformar tren para llevar otro tipo de carga +STR_VEHICLE_VIEW_ROAD_VEHICLE_REFIT_TOOLTIP :{BLACK}Reformar vehículo de carretera para llevar otro tipo de carga +STR_VEHICLE_VIEW_SHIP_REFIT_TOOLTIP :{BLACK}Reformar barco para llevar otro tipo de carga +STR_VEHICLE_VIEW_AIRCRAFT_REFIT_TOOLTIP :{BLACK}Reformar aeronave para llevar otro tipo de carga STR_VEHICLE_VIEW_TRAIN_REVERSE_TOOLTIP :{BLACK}Cambiar dirección del tren STR_VEHICLE_VIEW_ROAD_VEHICLE_REVERSE_TOOLTIP :{BLACK}Forzar al vehículo a girar en sentido opuesto @@ -3958,40 +3959,40 @@ STR_VEHICLE_DETAILS_CARGO_EMPTY :{LTBLUE}Vacío STR_VEHICLE_DETAILS_CARGO_FROM :{LTBLUE}{CARGO_LONG} desde {STATION} STR_VEHICLE_DETAILS_CARGO_FROM_MULT :{LTBLUE}{CARGO_LONG} desde {STATION} (×{NUM}) -STR_VEHICLE_DETAIL_TAB_CARGO :{BLACK}Cargamento +STR_VEHICLE_DETAIL_TAB_CARGO :{BLACK}Carga STR_VEHICLE_DETAILS_TRAIN_CARGO_TOOLTIP :{BLACK}Mostrar detalles de mercancía transportada STR_VEHICLE_DETAIL_TAB_INFORMATION :{BLACK}Información STR_VEHICLE_DETAILS_TRAIN_INFORMATION_TOOLTIP :{BLACK}Mostrar detalles de los vehículos STR_VEHICLE_DETAIL_TAB_CAPACITIES :{BLACK}Capacidades STR_VEHICLE_DETAILS_TRAIN_CAPACITIES_TOOLTIP :{BLACK}Mostrar capacidades de cada vehículo del tren -STR_VEHICLE_DETAIL_TAB_TOTAL_CARGO :{BLACK}Cargamento total -STR_VEHICLE_DETAILS_TRAIN_TOTAL_CARGO_TOOLTIP :{BLACK}Mostrar capacidad total del tren dividida por tipo de cargamento +STR_VEHICLE_DETAIL_TAB_TOTAL_CARGO :{BLACK}Carga total +STR_VEHICLE_DETAILS_TRAIN_TOTAL_CARGO_TOOLTIP :{BLACK}Mostrar capacidad total del tren dividida por carga STR_VEHICLE_DETAILS_TRAIN_ARTICULATED_RV_CAPACITY :{BLACK}Capacidad: {LTBLUE} # Vehicle refit STR_REFIT_CAPTION :{WHITE}{VEHICLE} (reformar) -STR_REFIT_TITLE :{GOLD}Elegir el nuevo tipo de cargamento: +STR_REFIT_TITLE :{GOLD}Elegir el nuevo tipo de carga: STR_REFIT_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Nueva capacidad: {GOLD}{CARGO_LONG}{}{BLACK}Costo por reformar: {RED}{CURRENCY_LONG} STR_REFIT_NEW_CAPACITY_INCOME_FROM_REFIT :{BLACK}Nueva capacidad: {GOLD}{CARGO_LONG}{}{BLACK}Ingreso al reformar: {GREEN}{CURRENCY_LONG} STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}Nueva capacidad: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Costo por reformar: {RED}{CURRENCY_LONG} STR_REFIT_NEW_CAPACITY_INCOME_FROM_AIRCRAFT_REFIT :{BLACK}Nueva capacidad: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Ingreso al reformar: {GREEN}{CURRENCY_LONG} STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Elegir los vehículos de ferrocarril a reformar. Arrastrar con el ratón para elegir más de un vehículo. Clic en un espacio vacío para elegir el tren completo. Ctrl+Clic para elegir una unidad del tren y los vagones subsecuentes -STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Elegir el tipo de cargamento para el tren -STR_REFIT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Elegir el tipo de cargamento para el vehículo de carretera -STR_REFIT_SHIP_LIST_TOOLTIP :{BLACK}Elegir el tipo de cargamento para el barco -STR_REFIT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Elegir el tipo de cargamento para la aeronave +STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Elegir el tipo de carga para el tren +STR_REFIT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Elegir el tipo de carga para el vehículo de carretera +STR_REFIT_SHIP_LIST_TOOLTIP :{BLACK}Elegir el tipo de carga para el barco +STR_REFIT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Elegir el tipo de carga para la aeronave STR_REFIT_TRAIN_REFIT_BUTTON :{BLACK}Reformar tren STR_REFIT_ROAD_VEHICLE_REFIT_BUTTON :{BLACK}Reformar vehículo de carretera STR_REFIT_SHIP_REFIT_BUTTON :{BLACK}Reformar barco STR_REFIT_AIRCRAFT_REFIT_BUTTON :{BLACK}Reformar aeronave -STR_REFIT_TRAIN_REFIT_TOOLTIP :{BLACK}Reformar el tren para transportar el cargamento elegido -STR_REFIT_ROAD_VEHICLE_REFIT_TOOLTIP :{BLACK}Reformar el vehículo de carretera para transportar el cargamento elegido -STR_REFIT_SHIP_REFIT_TOOLTIP :{BLACK}Reformar el barco para transportar el cargamento elegido -STR_REFIT_AIRCRAFT_REFIT_TOOLTIP :{BLACK}Reformar la aeronave para transportar el cargamento elegido +STR_REFIT_TRAIN_REFIT_TOOLTIP :{BLACK}Reformar el tren para transportar la carga elegida +STR_REFIT_ROAD_VEHICLE_REFIT_TOOLTIP :{BLACK}Reformar el vehículo de carretera para transportar la carga elegida +STR_REFIT_SHIP_REFIT_TOOLTIP :{BLACK}Reformar el barco para transportar la carga elegida +STR_REFIT_AIRCRAFT_REFIT_TOOLTIP :{BLACK}Reformar la aeronave para transportar la carga elegida # Order view STR_ORDERS_CAPTION :{WHITE}{VEHICLE} (Órdenes) @@ -4028,11 +4029,11 @@ STR_ORDER_DROP_NO_UNLOADING :No descargar STR_ORDER_TOOLTIP_UNLOAD :{BLACK}Cambiar la forma de descarga en la orden resaltada STR_ORDER_REFIT :{BLACK}Reformar -STR_ORDER_REFIT_TOOLTIP :{BLACK}Elegir el tipo de cargamento a reformar en esta orden. Ctrl+Clic para eliminar la orden +STR_ORDER_REFIT_TOOLTIP :{BLACK}Elegir el tipo de carga a reformar en esta orden. Ctrl+Clic para eliminar la orden STR_ORDER_REFIT_AUTO :{BLACK}Reformar en estación -STR_ORDER_REFIT_AUTO_TOOLTIP :{BLACK}Elegir el tipo de cargamento a reformar en esta orden. Ctrl+Clic para eliminar la orden. Reformar solo es posible si el vehículo lo permite -STR_ORDER_DROP_REFIT_AUTO :Cargamento fijo -STR_ORDER_DROP_REFIT_AUTO_ANY :Cargamento disponible +STR_ORDER_REFIT_AUTO_TOOLTIP :{BLACK}Elegir la carga para reequipar en esta orden. Ctrl+Clic para eliminar la orden. Reequipar solo es posible si el vehículo lo permite +STR_ORDER_DROP_REFIT_AUTO :Carga fija +STR_ORDER_DROP_REFIT_AUTO_ANY :Carga disponible STR_ORDER_SERVICE :{BLACK}Mantenimiento STR_ORDER_DROP_GO_ALWAYS_DEPOT :Ir siempre @@ -4136,7 +4137,7 @@ STR_ORDER_NO_UNLOAD_REFIT :(No descargar y STR_ORDER_NO_UNLOAD_FULL_LOAD_REFIT :(No descargar y llenar todo con reforma a {STRING}) STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY_REFIT :(No descargar y llenar cualquiera con reforma a {STRING}) -STR_ORDER_AUTO_REFIT_ANY :cargamento disponible +STR_ORDER_AUTO_REFIT_ANY :carga disponible STR_ORDER_STOP_LOCATION_NEAR_END :[principio] STR_ORDER_STOP_LOCATION_MIDDLE :[centro] diff --git a/src/linkgraph/linkgraph_gui.cpp b/src/linkgraph/linkgraph_gui.cpp index 0507b9f570..1ce9ed796e 100644 --- a/src/linkgraph/linkgraph_gui.cpp +++ b/src/linkgraph/linkgraph_gui.cpp @@ -153,8 +153,7 @@ void LinkGraphOverlay::RebuildCache(bool incremental) auto AddLinks = [&](const Station *from, const Station *to, Point from_pt, Point to_pt, btree::btree_map, LinkCacheItem>::iterator insert_iter) { LinkCacheItem *item = nullptr; - CargoID c; - FOR_EACH_SET_CARGO_ID(c, this->cargo_mask) { + for (CargoID c : SetCargoBitIterator(this->cargo_mask)) { if (!CargoSpec::Get(c)->IsValid()) continue; const GoodsEntry &ge = from->goods[c]; if (!LinkGraph::IsValidID(ge.link_graph) || @@ -188,8 +187,7 @@ void LinkGraphOverlay::RebuildCache(bool incremental) StationID from = sta->index; uint supply = 0; - CargoID c; - FOR_EACH_SET_CARGO_ID(c, this->cargo_mask) { + for (CargoID c : SetCargoBitIterator(this->cargo_mask)) { if (!CargoSpec::Get(c)->IsValid()) continue; if (!LinkGraph::IsValidID(sta->goods[c].link_graph)) continue; const LinkGraph &lg = *LinkGraph::Get(sta->goods[c].link_graph); diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 7a3cb37126..0b2fdda6ba 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -967,8 +967,7 @@ static bool ReadSpriteLayout(ByteReader *buf, uint num_building_sprites, bool us static CargoTypes TranslateRefitMask(uint32 refit_mask) { CargoTypes result = 0; - uint8 bit; - FOR_EACH_SET_BIT(bit, refit_mask) { + for (uint8 bit : SetBitIterator(refit_mask)) { CargoID cargo = GetCargoTranslation(bit, _cur.grffile, true); if (cargo != CT_INVALID) SetBit(result, cargo); } @@ -9679,8 +9678,7 @@ static void CalculateRefitMasks() if (cargo_map_for_first_refittable != nullptr) { /* Use first refittable cargo from cargo translation table */ byte best_local_slot = 0xFF; - CargoID cargo_type; - FOR_EACH_SET_CARGO_ID(cargo_type, ei->refit_mask) { + for (CargoID cargo_type : SetCargoBitIterator(ei->refit_mask)) { byte local_slot = cargo_map_for_first_refittable[cargo_type]; if (local_slot < best_local_slot) { best_local_slot = local_slot; diff --git a/src/newgrf_station.cpp b/src/newgrf_station.cpp index b164a6aa16..d6e05f86be 100644 --- a/src/newgrf_station.cpp +++ b/src/newgrf_station.cpp @@ -814,8 +814,7 @@ bool DrawStationTile(int x, int y, RailType railtype, Axis axis, StationClassID /* Sprite layout which needs preprocessing */ bool separate_ground = HasBit(statspec->flags, SSF_SEPARATE_GROUND); uint32 var10_values = layout->PrepareLayout(total_offset, rti->fallback_railtype, 0, 0, separate_ground); - uint8 var10; - FOR_EACH_SET_BIT(var10, var10_values) { + for (uint8 var10 : SetBitIterator(var10_values)) { uint32 var10_relocation = GetCustomStationRelocation(statspec, nullptr, INVALID_TILE, railtype, var10); layout->ProcessRegisters(var10, var10_relocation, separate_ground); } diff --git a/src/order_base.h b/src/order_base.h index 12367fc209..9de61093f0 100644 --- a/src/order_base.h +++ b/src/order_base.h @@ -316,9 +316,8 @@ public: template CargoTypes FilterLoadUnloadTypeCargoMask(F filter_func, CargoTypes cargo_mask = ALL_CARGOTYPES) { if ((this->GetLoadType() == OLFB_CARGO_TYPE_LOAD) || (this->GetUnloadType() == OUFB_CARGO_TYPE_UNLOAD)) { - CargoID cargo; CargoTypes output_mask = cargo_mask; - FOR_EACH_SET_BIT(cargo, cargo_mask) { + for (CargoID cargo : SetCargoBitIterator(cargo_mask)) { if (!filter_func(this, cargo)) ClrBit(output_mask, cargo); } return output_mask; @@ -569,9 +568,8 @@ public: template CargoTypes FilterCargoMask(F filter_func, CargoTypes cargo_mask = ALL_CARGOTYPES) { - CargoID cargo; CargoTypes output_mask = cargo_mask; - FOR_EACH_SET_BIT(cargo, cargo_mask) { + for (CargoID cargo : SetCargoBitIterator(cargo_mask)) { if (!filter_func(cargo)) ClrBit(output_mask, cargo); } return output_mask; @@ -583,8 +581,7 @@ template T CargoMaskValueFilter(CargoTypes &cargo_mask, T value = filter_func(first_cargo_id); CargoTypes other_cargo_mask = cargo_mask; ClrBit(other_cargo_mask, first_cargo_id); - CargoID cargo; - FOR_EACH_SET_BIT(cargo, other_cargo_mask) { + for (CargoID cargo : SetCargoBitIterator(other_cargo_mask)) { if (value != filter_func(cargo)) ClrBit(cargo_mask, cargo); } return value; diff --git a/src/order_gui.cpp b/src/order_gui.cpp index e74187a25e..56ae2c7e00 100644 --- a/src/order_gui.cpp +++ b/src/order_gui.cpp @@ -102,7 +102,7 @@ private: void InitMaxWidgetWidth() { this->max_cargo_name_width = 0; - for (int i = 0; i < _sorted_standard_cargo_specs_size; i++) { + for (int i = 0; i < (int)_sorted_standard_cargo_specs.size(); i++) { SetDParam(0, _sorted_cargo_specs[i]->name); this->max_cargo_name_width = std::max(this->max_cargo_name_width, GetStringBoundingBox(STR_JUST_STRING).width); } @@ -118,7 +118,7 @@ private: { StringID tooltip = STR_CARGO_TYPE_LOAD_ORDERS_DROP_TOOLTIP + this->variant; const Order *order = this->vehicle->GetOrder(this->order_id); - for (int i = 0; i < _sorted_standard_cargo_specs_size; i++) { + for (int i = 0; i < (int)_sorted_standard_cargo_specs.size(); i++) { const CargoSpec *cs = _sorted_cargo_specs[i]; const CargoID cargo_id = cs->Index(); uint8 order_type = (this->variant == CTOWV_LOAD) ? (uint8) order->GetCargoLoadTypeRaw(cargo_id) : (uint8) order->GetCargoUnloadTypeRaw(cargo_id); @@ -170,7 +170,7 @@ public: this->CreateNestedTree(desc); this->GetWidget(WID_CTO_CAPTION)->SetDataTip(STR_CARGO_TYPE_ORDERS_LOAD_CAPTION + this->variant, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS); this->GetWidget(WID_CTO_HEADER)->SetDataTip(STR_CARGO_TYPE_ORDERS_LOAD_TITLE + this->variant, STR_NULL); - this->GetWidget(WID_CTO_SELECT)->SetDisplayedPlane((_sorted_standard_cargo_specs_size >= 32) ? 0 : SZSP_NONE); + this->GetWidget(WID_CTO_SELECT)->SetDisplayedPlane((_sorted_standard_cargo_specs.size() >= 32) ? 0 : SZSP_NONE); this->InitDropdownSelectedTypes(); this->FinishInitNested(v->index); @@ -262,7 +262,7 @@ public: } else if (widget == WID_CTO_SET_TO_ALL_DROPDOWN) { ModifyOrder(this->vehicle, this->order_id, mof | (action_type << 4) | (CT_INVALID << 20)); - for (int i = 0; i < _sorted_standard_cargo_specs_size; i++) { + for (int i = 0; i < (int)_sorted_standard_cargo_specs.size(); i++) { const CargoSpec *cs = _sorted_cargo_specs[i]; const CargoID cargo_id = cs->Index(); if (action_type != this->GetOrderActionTypeForCargo(cargo_id)) { @@ -337,12 +337,12 @@ static NWidgetBase *MakeCargoTypeOrdersRows(int *biggest_index, bool right) NWidgetVertical *ver = new NWidgetVertical; - const bool dual_column = (_sorted_standard_cargo_specs_size >= 32); + const bool dual_column = (_sorted_standard_cargo_specs.size() >= 32); if (right && !dual_column) return ver; const int increment = dual_column ? 2 : 1; - for (int i = (right ? 1 : 0); i < _sorted_standard_cargo_specs_size; i += increment) { + for (int i = (right ? 1 : 0); i < (int)_sorted_standard_cargo_specs.size(); i += increment) { /* Cargo row */ NWidgetBackground *panel = new NWidgetBackground(WWT_PANEL, COLOUR_GREY, WID_CTO_CARGO_ROW_FIRST + i); ver->Add(panel); @@ -2447,7 +2447,7 @@ public: case WID_O_COND_AUX_CARGO: { uint value = this->vehicle->GetOrder(this->OrderGetSel())->GetConditionValue(); DropDownList list; - for (size_t i = 0; i < _sorted_standard_cargo_specs_size; ++i) { + 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)); } diff --git a/src/pathfinder/follow_track.hpp b/src/pathfinder/follow_track.hpp index add8dbad1c..61698f1c2a 100644 --- a/src/pathfinder/follow_track.hpp +++ b/src/pathfinder/follow_track.hpp @@ -187,8 +187,7 @@ struct CFollowTrackT /* Mask already reserved trackdirs. */ m_new_td_bits &= ~TrackBitsToTrackdirBits(reserved); /* Mask out all trackdirs that conflict with the reservation. */ - Track t; - FOR_EACH_SET_TRACK(t, TrackdirBitsToTrackBits(m_new_td_bits)) { + for (Track t : SetTrackBitIterator(TrackdirBitsToTrackBits(m_new_td_bits))) { if (TracksOverlap(reserved | TrackToTrackBits(t))) m_new_td_bits &= ~TrackToTrackdirBits(t); } if (m_new_td_bits == TRACKDIR_BIT_NONE) { diff --git a/src/pathfinder/npf/npf.cpp b/src/pathfinder/npf/npf.cpp index e3ed131d86..0727c62fab 100644 --- a/src/pathfinder/npf/npf.cpp +++ b/src/pathfinder/npf/npf.cpp @@ -945,8 +945,7 @@ static void NPFFollowTrack(AyStar *aystar, OpenListNode *current) TrackBits reserved = GetReservedTrackbits(dst_tile); trackdirbits &= ~TrackBitsToTrackdirBits(reserved); - Track t; - FOR_EACH_SET_TRACK(t, TrackdirBitsToTrackBits(trackdirbits)) { + for (Track t : SetTrackBitIterator(TrackdirBitsToTrackBits(trackdirbits))) { if (TracksOverlap(reserved | TrackToTrackBits(t))) trackdirbits &= ~TrackToTrackdirBits(t); } } diff --git a/src/settings.cpp b/src/settings.cpp index a01eb761f6..48ce5bcff7 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -23,6 +23,7 @@ #include "stdafx.h" #include +#include #include #include "currency.h" #include "screenshot.h" @@ -98,19 +99,87 @@ ClientSettings _settings_client; GameSettings _settings_game; ///< Game settings of a running game or the scenario editor. GameSettings _settings_newgame; ///< Game settings for new games (updated from the intro screen). TimeSettings _settings_time; ///< The effective settings that are used for time display. -VehicleDefaultSettings _old_vds; ///< Used for loading default vehicles settings from old savegames -std::string _config_file; ///< Configuration file of OpenTTD +VehicleDefaultSettings _old_vds; ///< Used for loading default vehicles settings from old savegames. +std::string _config_file; ///< Configuration file of OpenTTD. std::string _config_file_text; +std::string _private_file; ///< Private configuration file of OpenTTD. +std::string _secrets_file; ///< Secrets configuration file of OpenTTD. typedef std::list ErrorList; static ErrorList _settings_error_list; ///< Errors while loading minimal settings. -typedef void SettingDescProc(IniFile *ini, const SettingTable &desc, const char *grpname, void *object, bool only_startup); -typedef void SettingDescProcList(IniFile *ini, const char *grpname, StringList &list); +/** + * List of all the generic setting tables. + * + * There are a few tables that are special and not processed like the rest: + * - _currency_settings + * - _misc_settings + * - _company_settings + * - _win32_settings + * As such, they are not part of this list. + */ +static const SettingTable _generic_setting_tables[] = { + _settings, + _network_settings, +}; + +/** + * List of all the private setting tables. + */ +static const SettingTable _private_setting_tables[] = { + _network_private_settings, +}; + +/** + * List of all the secrets setting tables. + */ +static const SettingTable _secrets_setting_tables[] = { + _network_secrets_settings, +}; + +typedef void SettingDescProc(IniFile &ini, const SettingTable &desc, const char *grpname, void *object, bool only_startup); +typedef void SettingDescProcList(IniFile &ini, const char *grpname, StringList &list); static bool IsSignedVarMemType(VarType vt); + +/** + * IniFile to store a configuration. + */ +class ConfigIniFile : public IniFile { +private: + inline static const char * const list_group_names[] = { + "bans", + "newgrf", + "servers", + "server_bind_addresses", + nullptr, + }; + +public: + ConfigIniFile(const std::string &filename, std::string *save = nullptr) : IniFile(list_group_names) + { + this->LoadFromDisk(filename, NO_DIRECTORY, save); + } +}; + +/** + * Ini-file versions. + * + * Sometimes we move settings between different ini-files, as we need to know + * when we have to load/remove it from the old versus reading it from the new + * location. These versions assist with situations like that. + */ +enum IniFileVersion : uint32 { + IFV_0, ///< 0 All versions prior to introduction. + IFV_PRIVATE_SECRETS, ///< 1 PR#9298 Moving of settings from openttd.cfg to private.cfg / secrets.cfg. + + IFV_MAX_VERSION, ///< Highest possible ini-file version. +}; + +const uint16 INIFILE_VERSION = (IniFileVersion)(IFV_MAX_VERSION - 1); ///< Current ini-file version of OpenTTD. + /** * Get the setting at the given index into the settings table. * @param index The index to look for. @@ -122,17 +191,6 @@ const SettingDesc *GetSettingDescription(uint index) return _settings.begin()[index].get(); } -/** - * Groups in openttd.cfg that are actually lists. - */ -static const char * const _list_group_names[] = { - "bans", - "newgrf", - "servers", - "server_bind_addresses", - nullptr -}; - /** * Find the index value of a ONEofMANY type in a string separated by | * @param str the current value of the setting for which a value needs found @@ -326,9 +384,8 @@ void OneOfManySettingDesc::FormatValue(char *buf, const char *last, const void * void ManyOfManySettingDesc::FormatValue(char *buf, const char *last, const void *object) const { uint bitmask = (uint)this->Read(object); - uint id = 0; bool first = true; - FOR_EACH_SET_BIT(id, bitmask) { + for (uint id : SetBitIterator(bitmask)) { if (!first) buf = strecpy(buf, "|", last); buf = this->FormatSingleValue(buf, last, id); first = false; @@ -549,10 +606,10 @@ const std::string &StringSettingDesc::Read(const void *object) const * @param object pointer to the object been loaded * @param only_startup load only the startup settings set */ -static void IniLoadSettings(IniFile *ini, const SettingTable &settings_table, const char *grpname, void *object, bool only_startup) +static void IniLoadSettings(IniFile &ini, const SettingTable &settings_table, const char *grpname, void *object, bool only_startup) { IniGroup *group; - IniGroup *group_def = ini->GetGroup(grpname); + IniGroup *group_def = ini.GetGroup(grpname); for (auto &sd : settings_table) { if (!SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to, sd->save.ext_feature_test)) continue; @@ -565,7 +622,7 @@ static void IniLoadSettings(IniFile *ini, const SettingTable &settings_table, co std::string s{ sd->name }; auto sc = s.find('.'); if (sc != std::string::npos) { - group = ini->GetGroup(s.substr(0, sc)); + group = ini.GetGroup(s.substr(0, sc)); s = s.substr(sc + 1); } else { group = group_def; @@ -581,7 +638,7 @@ static void IniLoadSettings(IniFile *ini, const SettingTable &settings_table, co /* For settings.xx.zz.yy load the settings from [zz] yy = ? in case the previous * did not exist (e.g. loading old config files with a [yapf] section */ sc = s.find('.'); - if (sc != std::string::npos) item = ini->GetGroup(s.substr(0, sc))->GetItem(s.substr(sc + 1), false); + if (sc != std::string::npos) item = ini.GetGroup(s.substr(0, sc))->GetItem(s.substr(sc + 1), false); } } @@ -628,7 +685,7 @@ void ListSettingDesc::ParseValue(const IniItem *item, void *object) const * values are reloaded when saving). If settings indeed have changed, we get * these and save them. */ -static void IniSaveSettings(IniFile *ini, const SettingTable &settings_table, const char *grpname, void *object, bool) +static void IniSaveSettings(IniFile &ini, const SettingTable &settings_table, const char *grpname, void *object, bool) { IniGroup *group_def = nullptr, *group; IniItem *item; @@ -645,10 +702,10 @@ static void IniSaveSettings(IniFile *ini, const SettingTable &settings_table, co std::string s{ sd->name }; auto sc = s.find('.'); if (sc != std::string::npos) { - group = ini->GetGroup(s.substr(0, sc)); + group = ini.GetGroup(s.substr(0, sc)); s = s.substr(sc + 1); } else { - if (group_def == nullptr) group_def = ini->GetGroup(grpname); + if (group_def == nullptr) group_def = ini.GetGroup(grpname); group = group_def; } @@ -726,9 +783,9 @@ bool ListSettingDesc::IsSameValue(const IniItem *item, void *object) const * @param grpname character string identifying the section-header of the ini file that will be parsed * @param list new list with entries of the given section */ -static void IniLoadSettingList(IniFile *ini, const char *grpname, StringList &list) +static void IniLoadSettingList(IniFile &ini, const char *grpname, StringList &list) { - IniGroup *group = ini->GetGroup(grpname); + IniGroup *group = ini.GetGroup(grpname); if (group == nullptr) return; @@ -748,9 +805,9 @@ static void IniLoadSettingList(IniFile *ini, const char *grpname, StringList &li * @param list pointer to an string(pointer) array that will be used as the * source to be saved into the relevant ini section */ -static void IniSaveSettingList(IniFile *ini, const char *grpname, StringList &list) +static void IniSaveSettingList(IniFile &ini, const char *grpname, StringList &list) { - IniGroup *group = ini->GetGroup(grpname); + IniGroup *group = ini.GetGroup(grpname); if (group == nullptr) return; group->Clear(); @@ -766,7 +823,7 @@ static void IniSaveSettingList(IniFile *ini, const char *grpname, StringList &li * @param grpname character string identifying the section-header of the ini file that will be parsed * @param desc Destination WindowDesc */ -void IniLoadWindowSettings(IniFile *ini, const char *grpname, void *desc) +void IniLoadWindowSettings(IniFile &ini, const char *grpname, void *desc) { IniLoadSettings(ini, _window_settings, grpname, desc, false); } @@ -777,7 +834,7 @@ void IniLoadWindowSettings(IniFile *ini, const char *grpname, void *desc) * @param grpname character string identifying the section-header of the ini file * @param desc Source WindowDesc */ -void IniSaveWindowSettings(IniFile *ini, const char *grpname, void *desc) +void IniSaveWindowSettings(IniFile &ini, const char *grpname, void *desc) { IniSaveSettings(ini, _window_settings, grpname, desc, false); } @@ -1726,9 +1783,9 @@ static void HandleOldDiffCustom(bool savegame) } } -static void AILoadConfig(IniFile *ini, const char *grpname) +static void AILoadConfig(IniFile &ini, const char *grpname) { - IniGroup *group = ini->GetGroup(grpname); + IniGroup *group = ini.GetGroup(grpname); IniItem *item; /* Clean any configured AI */ @@ -1754,9 +1811,9 @@ static void AILoadConfig(IniFile *ini, const char *grpname) } } -static void GameLoadConfig(IniFile *ini, const char *grpname) +static void GameLoadConfig(IniFile &ini, const char *grpname) { - IniGroup *group = ini->GetGroup(grpname); + IniGroup *group = ini.GetGroup(grpname); IniItem *item; /* Clean any configured GameScript */ @@ -1820,9 +1877,9 @@ static bool DecodeHexText(const char *pos, uint8 *dest, size_t dest_size) * @param grpname Group name containing the configuration of the GRF. * @param is_static GRF is static. */ -static GRFConfig *GRFLoadConfig(IniFile *ini, const char *grpname, bool is_static) +static GRFConfig *GRFLoadConfig(IniFile &ini, const char *grpname, bool is_static) { - IniGroup *group = ini->GetGroup(grpname); + IniGroup *group = ini.GetGroup(grpname); IniItem *item; GRFConfig *first = nullptr; GRFConfig **curr = &first; @@ -1914,9 +1971,23 @@ static GRFConfig *GRFLoadConfig(IniFile *ini, const char *grpname, bool is_stati return first; } -static void AISaveConfig(IniFile *ini, const char *grpname) +static IniFileVersion LoadVersionFromConfig(IniFile &ini) { - IniGroup *group = ini->GetGroup(grpname); + IniGroup *group = ini.GetGroup("version"); + + auto version_number = group->GetItem("ini_version", false); + /* Older ini-file versions don't have this key yet. */ + if (version_number == nullptr || !version_number->value.has_value()) return IFV_0; + + uint32 version = 0; + std::from_chars(version_number->value->data(), version_number->value->data() + version_number->value->size(), version); + + return static_cast(version); +} + +static void AISaveConfig(IniFile &ini, const char *grpname) +{ + IniGroup *group = ini.GetGroup(grpname); if (group == nullptr) return; group->Clear(); @@ -1937,9 +2008,9 @@ static void AISaveConfig(IniFile *ini, const char *grpname) } } -static void GameSaveConfig(IniFile *ini, const char *grpname) +static void GameSaveConfig(IniFile &ini, const char *grpname) { - IniGroup *group = ini->GetGroup(grpname); + IniGroup *group = ini.GetGroup(grpname); if (group == nullptr) return; group->Clear(); @@ -1962,28 +2033,19 @@ static void GameSaveConfig(IniFile *ini, const char *grpname) * Save the version of OpenTTD to the ini file. * @param ini the ini to write to */ -static void SaveVersionInConfig(IniFile *ini) +static void SaveVersionInConfig(IniFile &ini) { - IniGroup *group = ini->GetGroup("version"); - - char version[9]; - seprintf(version, lastof(version), "%08X", _openttd_newgrf_version); - - const char * const versions[][2] = { - { "version_string", _openttd_revision }, - { "version_number", version } - }; - - for (uint i = 0; i < lengthof(versions); i++) { - group->GetItem(versions[i][0], true)->SetValue(versions[i][1]); - } + IniGroup *group = ini.GetGroup("version"); + group->GetItem("version_string", true)->SetValue(_openttd_revision); + group->GetItem("version_number", true)->SetValue(stdstr_fmt("%08X", _openttd_newgrf_version)); + group->GetItem("ini_version", true)->SetValue(std::to_string(INIFILE_VERSION)); } /* Save a GRF configuration to the given group name */ -static void GRFSaveConfig(IniFile *ini, const char *grpname, const GRFConfig *list) +static void GRFSaveConfig(IniFile &ini, const char *grpname, const GRFConfig *list) { - ini->RemoveGroup(grpname); - IniGroup *group = ini->GetGroup(grpname); + ini.RemoveGroup(grpname); + IniGroup *group = ini.GetGroup(grpname); const GRFConfig *c; for (c = list; c != nullptr; c = c->next) { @@ -2000,29 +2062,57 @@ static void GRFSaveConfig(IniFile *ini, const char *grpname, const GRFConfig *li } /* Common handler for saving/loading variables to the configuration file */ -static void HandleSettingDescs(IniFile *ini, SettingDescProc *proc, SettingDescProcList *proc_list, bool only_startup = false) +static void HandleSettingDescs(IniFile &generic_ini, IniFile &private_ini, IniFile &secrets_ini, SettingDescProc *proc, SettingDescProcList *proc_list, bool only_startup = false) { - proc(ini, _misc_settings, "misc", nullptr, only_startup); + proc(generic_ini, _misc_settings, "misc", nullptr, only_startup); #if defined(_WIN32) && !defined(DEDICATED) - proc(ini, _win32_settings, "win32", nullptr, only_startup); + proc(generic_ini, _win32_settings, "win32", nullptr, only_startup); #endif /* _WIN32 */ - proc(ini, _settings, "patches", &_settings_newgame, only_startup); - proc(ini, _currency_settings,"currency", &_custom_currency, only_startup); - proc(ini, _company_settings, "company", &_settings_client.company, only_startup); + /* The name "patches" is a fallback, as every setting should sets its own group. */ + + for (auto &table : _generic_setting_tables) { + proc(generic_ini, table, "patches", &_settings_newgame, only_startup); + } + for (auto &table : _private_setting_tables) { + proc(private_ini, table, "patches", &_settings_newgame, only_startup); + } + for (auto &table : _secrets_setting_tables) { + proc(secrets_ini, table, "patches", &_settings_newgame, only_startup); + } + + proc(generic_ini, _currency_settings, "currency", &_custom_currency, only_startup); + proc(generic_ini, _company_settings, "company", &_settings_client.company, only_startup); if (!only_startup) { - proc_list(ini, "server_bind_addresses", _network_bind_list); - proc_list(ini, "servers", _network_host_list); - proc_list(ini, "bans", _network_ban_list); + proc_list(private_ini, "server_bind_addresses", _network_bind_list); + proc_list(private_ini, "servers", _network_host_list); + proc_list(private_ini, "bans", _network_ban_list); } } -static IniFile *IniLoadConfig() +/** + * Remove all entries from a settings table from an ini-file. + * + * This is only useful if those entries are moved to another file, and you + * want to clean up what is left behind. + * + * @param ini The ini file to remove the entries from. + * @param table The table to look for entries to remove. + */ +static void RemoveEntriesFromIni(IniFile &ini, const SettingTable &table) { - IniFile *ini = new IniFile(_list_group_names); - ini->LoadFromDisk(_config_file, NO_DIRECTORY, &_config_file_text); - return ini; + for (auto &sd : table) { + /* For settings.xx.yy load the settings from [xx] yy = ? */ + std::string s{ sd->name }; + auto sc = s.find('.'); + if (sc == std::string::npos) continue; + + IniGroup *group = ini.GetGroup(s.substr(0, sc)); + s = s.substr(sc + 1); + + group->RemoveItem(s); + } } /** @@ -2031,20 +2121,30 @@ static IniFile *IniLoadConfig() */ void LoadFromConfig(bool startup) { - IniFile *ini = IniLoadConfig(); + ConfigIniFile generic_ini(_config_file, &_config_file_text); + ConfigIniFile private_ini(_private_file); + ConfigIniFile secrets_ini(_secrets_file); + if (!startup) ResetCurrencies(false); // Initialize the array of currencies, without preserving the custom one - /* Load basic settings only during bootstrap, load other settings not during bootstrap */ - HandleSettingDescs(ini, IniLoadSettings, IniLoadSettingList, startup); + IniFileVersion generic_version = LoadVersionFromConfig(generic_ini); + /* Before the split of private/secrets, we have to look in the generic for these settings. */ + if (generic_version < IFV_PRIVATE_SECRETS) { + HandleSettingDescs(generic_ini, generic_ini, generic_ini, IniLoadSettings, IniLoadSettingList, startup); + } else { + HandleSettingDescs(generic_ini, private_ini, secrets_ini, IniLoadSettings, IniLoadSettingList, startup); + } + + /* Load basic settings only during bootstrap, load other settings not during bootstrap */ if (!startup) { - _grfconfig_newgame = GRFLoadConfig(ini, "newgrf", false); - _grfconfig_static = GRFLoadConfig(ini, "newgrf-static", true); - AILoadConfig(ini, "ai_players"); - GameLoadConfig(ini, "game_scripts"); + _grfconfig_newgame = GRFLoadConfig(generic_ini, "newgrf", false); + _grfconfig_static = GRFLoadConfig(generic_ini, "newgrf-static", true); + AILoadConfig(generic_ini, "ai_players"); + GameLoadConfig(generic_ini, "game_scripts"); PrepareOldDiffCustom(); - IniLoadSettings(ini, _gameopt_settings, "gameopt", &_settings_newgame, false); + IniLoadSettings(generic_ini, _gameopt_settings, "gameopt", &_settings_newgame, false); HandleOldDiffCustom(false); ValidateSettings(); @@ -2057,28 +2157,57 @@ void LoadFromConfig(bool startup) ScheduleErrorMessage(_settings_error_list); if (FindWindowById(WC_ERRMSG, 0) == nullptr) ShowFirstError(); } - - delete ini; } /** Save the values to the configuration file */ void SaveToConfig() { - IniFile *ini = IniLoadConfig(); + ConfigIniFile generic_ini(_config_file); + ConfigIniFile private_ini(_private_file); + ConfigIniFile secrets_ini(_secrets_file); - /* Remove some obsolete groups. These have all been loaded into other groups. */ - ini->RemoveGroup("patches"); - ini->RemoveGroup("yapf"); - ini->RemoveGroup("gameopt"); + IniFileVersion generic_version = LoadVersionFromConfig(generic_ini); - HandleSettingDescs(ini, IniSaveSettings, IniSaveSettingList); - GRFSaveConfig(ini, "newgrf", _grfconfig_newgame); - GRFSaveConfig(ini, "newgrf-static", _grfconfig_static); - AISaveConfig(ini, "ai_players"); - GameSaveConfig(ini, "game_scripts"); - SaveVersionInConfig(ini); - ini->SaveToDisk(_config_file); - delete ini; + /* If we newly create the private/secrets file, add a dummy group on top + * just so we can add a comment before it (that is how IniFile works). + * This to explain what the file is about. After doing it once, never touch + * it again, as otherwise we might be reverting user changes. */ + if (!private_ini.GetGroup("private", false)) private_ini.GetGroup("private")->comment = "; This file possibly contains private information which can identify you as person.\n"; + if (!secrets_ini.GetGroup("secrets", false)) secrets_ini.GetGroup("secrets")->comment = "; Do not share this file with others, not even if they claim to be technical support.\n; This file contains saved passwords and other secrets that should remain private to you!\n"; + + if (generic_version == IFV_0) { + /* Remove some obsolete groups. These have all been loaded into other groups. */ + generic_ini.RemoveGroup("patches"); + generic_ini.RemoveGroup("yapf"); + generic_ini.RemoveGroup("gameopt"); + + /* Remove all settings from the generic ini that are now in the private ini. */ + generic_ini.RemoveGroup("server_bind_addresses"); + generic_ini.RemoveGroup("servers"); + generic_ini.RemoveGroup("bans"); + for (auto &table : _private_setting_tables) { + RemoveEntriesFromIni(generic_ini, table); + } + + /* Remove all settings from the generic ini that are now in the secrets ini. */ + for (auto &table : _secrets_setting_tables) { + RemoveEntriesFromIni(generic_ini, table); + } + } + + HandleSettingDescs(generic_ini, private_ini, secrets_ini, IniSaveSettings, IniSaveSettingList); + GRFSaveConfig(generic_ini, "newgrf", _grfconfig_newgame); + GRFSaveConfig(generic_ini, "newgrf-static", _grfconfig_static); + AISaveConfig(generic_ini, "ai_players"); + GameSaveConfig(generic_ini, "game_scripts"); + + SaveVersionInConfig(generic_ini); + SaveVersionInConfig(private_ini); + SaveVersionInConfig(secrets_ini); + + generic_ini.SaveToDisk(_config_file); + private_ini.SaveToDisk(_private_file); + secrets_ini.SaveToDisk(_secrets_file); } /** @@ -2089,8 +2218,8 @@ StringList GetGRFPresetList() { StringList list; - std::unique_ptr ini(IniLoadConfig()); - for (IniGroup *group = ini->group; group != nullptr; group = group->next) { + ConfigIniFile ini(_config_file); + for (IniGroup *group = ini.group; group != nullptr; group = group->next) { if (group->name.compare(0, 7, "preset-") == 0) { list.push_back(group->name.substr(7)); } @@ -2111,9 +2240,8 @@ GRFConfig *LoadGRFPresetFromConfig(const char *config_name) char *section = (char*)alloca(len); seprintf(section, section + len - 1, "preset-%s", config_name); - IniFile *ini = IniLoadConfig(); + ConfigIniFile ini(_config_file); GRFConfig *config = GRFLoadConfig(ini, section, false); - delete ini; return config; } @@ -2130,10 +2258,9 @@ void SaveGRFPresetToConfig(const char *config_name, GRFConfig *config) char *section = (char*)alloca(len); seprintf(section, section + len - 1, "preset-%s", config_name); - IniFile *ini = IniLoadConfig(); + ConfigIniFile ini(_config_file); GRFSaveConfig(ini, section, config); - ini->SaveToDisk(_config_file); - delete ini; + ini.SaveToDisk(_config_file); } /** @@ -2146,10 +2273,9 @@ void DeleteGRFPresetFromConfig(const char *config_name) char *section = (char*)alloca(len); seprintf(section, section + len - 1, "preset-%s", config_name); - IniFile *ini = IniLoadConfig(); - ini->RemoveGroup(section); - ini->SaveToDisk(_config_file); - delete ini; + ConfigIniFile ini(_config_file); + ini.RemoveGroup(section); + ini.SaveToDisk(_config_file); } /** @@ -2227,8 +2353,18 @@ static const SettingDesc *GetCompanySettingFromName(const char *name) */ const SettingDesc *GetSettingFromName(const char *name) { - auto sd = GetSettingFromName(name, _settings); - if (sd != nullptr) return sd; + for (auto &table : _generic_setting_tables) { + auto sd = GetSettingFromName(name, table); + if (sd != nullptr) return sd; + } + for (auto &table : _private_setting_tables) { + auto sd = GetSettingFromName(name, table); + if (sd != nullptr) return sd; + } + for (auto &table : _secrets_setting_tables) { + auto sd = GetSettingFromName(name, table); + if (sd != nullptr) return sd; + } return GetCompanySettingFromName(name); } @@ -2530,6 +2666,18 @@ void IConsoleGetSetting(const char *name, bool force_newgame) } } +static void IConsoleListSettingsTable(const SettingTable &table, const char *prefilter) +{ + for (auto &sd : table) { + if (!SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to, sd->save.ext_feature_test)) continue; + if (prefilter != nullptr && strstr(sd->name, prefilter) == nullptr) continue; + if ((sd->flags & SF_NO_NEWGAME) && _game_mode == GM_MENU) continue; + char value[80]; + sd->FormatValue(value, lastof(value), &GetGameSettings()); + IConsolePrintF(CC_DEFAULT, "%s = %s", sd->name, value); + } +} + /** * List all settings and their value to the console * @@ -2539,13 +2687,14 @@ void IConsoleListSettings(const char *prefilter) { IConsolePrintF(CC_WARNING, "All settings with their current value:"); - for (auto &sd : _settings) { - if (!SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to, sd->save.ext_feature_test)) continue; - if (prefilter != nullptr && strstr(sd->name, prefilter) == nullptr) continue; - if ((sd->flags & SF_NO_NEWGAME) && _game_mode == GM_MENU) continue; - char value[80]; - sd->FormatValue(value, lastof(value), &GetGameSettings()); - IConsolePrintF(CC_DEFAULT, "%s = %s", sd->name, value); + for (auto &table : _generic_setting_tables) { + IConsoleListSettingsTable(table, prefilter); + } + for (auto &table : _private_setting_tables) { + IConsoleListSettingsTable(table, prefilter); + } + for (auto &table : _secrets_setting_tables) { + IConsoleListSettingsTable(table, prefilter); } IConsolePrintF(CC_WARNING, "Use 'setting' command to change a value"); diff --git a/src/settings_func.h b/src/settings_func.h index 9e8ec6599b..ad9accddbb 100644 --- a/src/settings_func.h +++ b/src/settings_func.h @@ -24,8 +24,8 @@ void IConsoleListSettings(const char *prefilter); void LoadFromConfig(bool minimal = false); void SaveToConfig(); -void IniLoadWindowSettings(IniFile *ini, const char *grpname, void *desc); -void IniSaveWindowSettings(IniFile *ini, const char *grpname, void *desc); +void IniLoadWindowSettings(IniFile &ini, const char *grpname, void *desc); +void IniSaveWindowSettings(IniFile &ini, const char *grpname, void *desc); StringList GetGRFPresetList(); struct GRFConfig *LoadGRFPresetFromConfig(const char *config_name); diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index d2ab7c25c7..e752484a82 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -3289,8 +3289,7 @@ draw_default_foundation: /* Sprite layout which needs preprocessing */ bool separate_ground = HasBit(statspec->flags, SSF_SEPARATE_GROUND); uint32 var10_values = layout->PrepareLayout(total_offset, rti->fallback_railtype, 0, 0, separate_ground); - uint8 var10; - FOR_EACH_SET_BIT(var10, var10_values) { + for (uint8 var10 : SetBitIterator(var10_values)) { uint32 var10_relocation = GetCustomStationRelocation(statspec, st, ti->tile, INVALID_RAILTYPE, var10); layout->ProcessRegisters(var10, var10_relocation, separate_ground); } diff --git a/src/station_gui.cpp b/src/station_gui.cpp index 4f79150903..c4a5d3ee34 100644 --- a/src/station_gui.cpp +++ b/src/station_gui.cpp @@ -290,8 +290,7 @@ protected: { int diff = 0; - CargoID j; - FOR_EACH_SET_CARGO_ID(j, cargo_filter) { + for (CargoID j : SetCargoBitIterator(cargo_filter)) { diff += a->goods[j].cargo.TotalCount() - b->goods[j].cargo.TotalCount(); } @@ -303,8 +302,7 @@ protected: { int diff = 0; - CargoID j; - FOR_EACH_SET_CARGO_ID(j, cargo_filter) { + for (CargoID j : SetCargoBitIterator(cargo_filter)) { diff += a->goods[j].cargo.AvailableCount() - b->goods[j].cargo.AvailableCount(); } @@ -317,8 +315,7 @@ protected: byte maxr1 = 0; byte maxr2 = 0; - CargoID j; - FOR_EACH_SET_CARGO_ID(j, cargo_filter) { + for (CargoID j : SetCargoBitIterator(cargo_filter)) { if (a->goods[j].HasRating()) maxr1 = std::max(maxr1, a->goods[j].rating); if (b->goods[j].HasRating()) maxr2 = std::max(maxr2, b->goods[j].rating); } @@ -422,10 +419,12 @@ public: this->FinishInitNested(window_number); this->owner = (Owner)this->window_number; - const CargoSpec *cs; - FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) { - if (!HasBit(this->cargo_filter, cs->Index())) continue; - this->LowerWidget(WID_STL_CARGOSTART + index); + uint8 index = 0; + for (const CargoSpec *cs : _sorted_standard_cargo_specs) { + if (HasBit(this->cargo_filter, cs->Index())) { + this->LowerWidget(WID_STL_CARGOSTART + index); + } + index++; } if (this->cargo_filter == this->cargo_filter_max) this->cargo_filter = _cargo_mask; @@ -471,8 +470,7 @@ public: /* Determine appropriate width for mini station rating graph */ this->rating_width = 0; - const CargoSpec *cs; - FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) { + for (const CargoSpec *cs : _sorted_standard_cargo_specs) { this->rating_width = std::max(this->rating_width, GetStringBoundingBox(cs->abbrev).width); } /* Approximately match original 16 pixel wide rating bars by multiplying string width by 1.6 */ @@ -540,8 +538,8 @@ public: x += rtl ? -text_spacing : text_spacing; /* show cargo waiting and station ratings */ - for (uint j = 0; j < _sorted_standard_cargo_specs_size; j++) { - CargoID cid = _sorted_cargo_specs[j]->Index(); + for (const CargoSpec *cs : _sorted_standard_cargo_specs) { + CargoID cid = cs->Index(); if (st->goods[cid].cargo.TotalCount() > 0) { /* For RTL we work in exactly the opposite direction. So * decrement the space needed first, then draw to the left @@ -634,8 +632,7 @@ public: ToggleBit(this->facilities, widget - WID_STL_TRAIN); this->ToggleWidgetLoweredState(widget); } else { - uint i; - FOR_EACH_SET_BIT(i, this->facilities) { + for (uint i : SetBitIterator(this->facilities)) { this->RaiseWidget(i + WID_STL_TRAIN); } this->facilities = 1 << (widget - WID_STL_TRAIN); @@ -656,7 +653,7 @@ public: break; case WID_STL_CARGOALL: { - for (uint i = 0; i < _sorted_standard_cargo_specs_size; i++) { + for (uint i = 0; i < _sorted_standard_cargo_specs.size(); i++) { this->LowerWidget(WID_STL_CARGOSTART + i); } this->LowerWidget(WID_STL_NOCARGOWAITING); @@ -682,7 +679,7 @@ public: this->include_empty = !this->include_empty; this->ToggleWidgetLoweredState(WID_STL_NOCARGOWAITING); } else { - for (uint i = 0; i < _sorted_standard_cargo_specs_size; i++) { + for (uint i = 0; i < _sorted_standard_cargo_specs.size(); i++) { this->RaiseWidget(WID_STL_CARGOSTART + i); } @@ -704,7 +701,7 @@ public: ToggleBit(this->cargo_filter, cs->Index()); this->ToggleWidgetLoweredState(widget); } else { - for (uint i = 0; i < _sorted_standard_cargo_specs_size; i++) { + for (uint i = 0; i < _sorted_standard_cargo_specs.size(); i++) { this->RaiseWidget(WID_STL_CARGOSTART + i); } this->RaiseWidget(WID_STL_NOCARGOWAITING); @@ -802,7 +799,7 @@ static NWidgetBase *CargoWidgets(int *biggest_index) { NWidgetHorizontal *container = new NWidgetHorizontal(); - for (uint i = 0; i < _sorted_standard_cargo_specs_size; i++) { + for (uint i = 0; i < _sorted_standard_cargo_specs.size(); i++) { NWidgetBackground *panel = new NWidgetBackground(WWT_PANEL, COLOUR_GREY, WID_STL_CARGOSTART + i); panel->SetMinimalSize(14, 0); panel->SetMinimalTextLines(1, 0, FS_NORMAL); @@ -811,7 +808,7 @@ static NWidgetBase *CargoWidgets(int *biggest_index) panel->SetDataTip(0, STR_STATION_LIST_USE_CTRL_TO_SELECT_MORE); container->Add(panel); } - *biggest_index = WID_STL_CARGOSTART + _sorted_standard_cargo_specs_size; + *biggest_index = WID_STL_CARGOSTART + static_cast(_sorted_standard_cargo_specs.size()); return container; } @@ -1530,8 +1527,7 @@ struct StationViewWindow : public Window { if (ofs_y < 0) return false; const Station *st = Station::Get(this->window_number); - const CargoSpec *cs; - FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) { + for (const CargoSpec *cs : _sorted_standard_cargo_specs) { const GoodsEntry *ge = &st->goods[cs->Index()]; if (!ge->HasRating()) continue; ofs_y -= FONT_HEIGHT_NORMAL; @@ -1994,8 +1990,7 @@ struct StationViewWindow : public Window { this->ratings_list_y = y; - const CargoSpec *cs; - FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) { + for (const CargoSpec *cs : _sorted_standard_cargo_specs) { const GoodsEntry *ge = &st->goods[cs->Index()]; if (!ge->HasRating()) continue; @@ -2140,8 +2135,7 @@ struct StationViewWindow : public Window { int row = this->GetRowFromWidget(pt.y, WID_SV_ACCEPT_RATING_LIST, WD_FRAMERECT_TOP, FONT_HEIGHT_NORMAL); if (row < 1) break; const Station *st = Station::Get(this->window_number); - const CargoSpec *cs; - FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) { + for (const CargoSpec *cs : _sorted_standard_cargo_specs) { const GoodsEntry *ge = &st->goods[cs->Index()]; if (!ge->HasRating()) continue; if (row == 1) { diff --git a/src/strings.cpp b/src/strings.cpp index 324b7c94bc..cf84df0003 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -85,16 +85,6 @@ int64 StringParameters::GetInt64(WChar type) return this->data[this->offset++]; } -/** - * Shift all data in the data array by the given amount to make - * room for some extra parameters. - */ -void StringParameters::ShiftParameters(uint amount) -{ - assert(amount <= this->num_param); - MemMoveT(this->data + amount, this->data, this->num_param - amount); -} - /** * Set DParam n to some number that is suitable for string size computations. * @param n Index of the string parameter. @@ -323,15 +313,6 @@ void SetDParamStr(uint n, const std::string &str) SetDParamStr(n, str.c_str()); } -/** - * Shift the string parameters in the global string parameter array by \a amount positions, making room at the beginning. - * @param amount Number of positions to shift. - */ -void InjectDParam(uint amount) -{ - _global_string_params.ShiftParameters(amount); -} - /** * Format a number into a string. * @param buff the buffer to write to diff --git a/src/strings_func.h b/src/strings_func.h index 17a412cb04..460fd375e8 100644 --- a/src/strings_func.h +++ b/src/strings_func.h @@ -122,8 +122,6 @@ public: return (int32)this->GetInt64(type); } - void ShiftParameters(uint amount); - /** Get a pointer to the current element in the data array. */ uint64 *GetDataPointer() const { @@ -180,8 +178,6 @@ uint32 GetStringGRFID(StringID string); uint ConvertKmhishSpeedToDisplaySpeed(uint speed); uint ConvertDisplaySpeedToKmhishSpeed(uint speed); -void InjectDParam(uint amount); - WChar GetDecimalSeparatorChar(); /** diff --git a/src/subsidy.cpp b/src/subsidy.cpp index 12c32a47d6..ddc12cf2f4 100644 --- a/src/subsidy.cpp +++ b/src/subsidy.cpp @@ -47,8 +47,7 @@ void Subsidy::AwardTo(CompanyID company) NewsStringData *company_name = new NewsStringData(GetString(STR_COMPANY_NAME)); /* Add a news item */ - std::pair reftype = SetupSubsidyDecodeParam(this, SubsidyDecodeParamType::NewsAwarded); - InjectDParam(1); + std::pair reftype = SetupSubsidyDecodeParam(this, SubsidyDecodeParamType::NewsAwarded, 1); SetDParamStr(0, company_name->string); AddNewsItem( @@ -67,9 +66,10 @@ void Subsidy::AwardTo(CompanyID company) * Setup the string parameters for printing the subsidy at the screen, and compute the news reference for the subsidy. * @param s %Subsidy being printed. * @param mode Type of subsidy news message to decide on parameter format. + * @param parameter_offset The location/index in the String DParams to start decoding the subsidy's parameters. Defaults to 0. * @return Reference of the subsidy in the news system. */ -std::pair SetupSubsidyDecodeParam(const Subsidy *s, SubsidyDecodeParamType mode) +std::pair SetupSubsidyDecodeParam(const Subsidy *s, SubsidyDecodeParamType mode, uint parameter_offset) { NewsReferenceType reftype1 = NR_NONE; NewsReferenceType reftype2 = NR_NONE; @@ -77,40 +77,40 @@ std::pair SetupSubsidyDecodeParam(const Su /* Choose whether to use the singular or plural form of the cargo name based on how we're printing the subsidy */ const CargoSpec *cs = CargoSpec::Get(s->cargo_type); if (mode == SubsidyDecodeParamType::Gui || mode == SubsidyDecodeParamType::NewsWithdrawn) { - SetDParam(0, cs->name); + SetDParam(parameter_offset, cs->name); } else { - SetDParam(0, cs->name_single); + SetDParam(parameter_offset, cs->name_single); } switch (s->src_type) { case ST_INDUSTRY: reftype1 = NR_INDUSTRY; - SetDParam(1, STR_INDUSTRY_NAME); + SetDParam(parameter_offset + 1, STR_INDUSTRY_NAME); break; case ST_TOWN: reftype1 = NR_TOWN; - SetDParam(1, STR_TOWN_NAME); + SetDParam(parameter_offset + 1, STR_TOWN_NAME); break; default: NOT_REACHED(); } - SetDParam(2, s->src); + SetDParam(parameter_offset + 2, s->src); switch (s->dst_type) { case ST_INDUSTRY: reftype2 = NR_INDUSTRY; - SetDParam(4, STR_INDUSTRY_NAME); + SetDParam(parameter_offset + 4, STR_INDUSTRY_NAME); break; case ST_TOWN: reftype2 = NR_TOWN; - SetDParam(4, STR_TOWN_NAME); + SetDParam(parameter_offset + 4, STR_TOWN_NAME); break; default: NOT_REACHED(); } - SetDParam(5, s->dst); + SetDParam(parameter_offset + 5, s->dst); /* If the subsidy is being offered or awarded, the news item mentions the subsidy duration. */ if (mode == SubsidyDecodeParamType::NewsOffered || mode == SubsidyDecodeParamType::NewsAwarded) { - SetDParam(7, _settings_game.difficulty.subsidy_duration); + SetDParam(parameter_offset + 7, _settings_game.difficulty.subsidy_duration); } return std::pair(reftype1, reftype2); diff --git a/src/subsidy_func.h b/src/subsidy_func.h index 5cd7a31181..89bf0f1fe2 100644 --- a/src/subsidy_func.h +++ b/src/subsidy_func.h @@ -17,10 +17,9 @@ #include "news_type.h" #include "subsidy_base.h" -std::pair SetupSubsidyDecodeParam(const struct Subsidy *s, SubsidyDecodeParamType mode); +std::pair SetupSubsidyDecodeParam(const struct Subsidy *s, SubsidyDecodeParamType mode, uint parameter_offset = 0); void DeleteSubsidyWith(SourceType type, SourceID index); bool CheckSubsidised(CargoID cargo_type, CompanyID company, SourceType src_type, SourceID src, const Station *st); void RebuildSubsidisedSourceAndDestinationCache(); -void DeleteSubsidy(struct Subsidy *s); #endif /* SUBSIDY_FUNC_H */ diff --git a/src/table/newgrf_debug_data.h b/src/table/newgrf_debug_data.h index 510b87ed41..9a8eac760b 100644 --- a/src/table/newgrf_debug_data.h +++ b/src/table/newgrf_debug_data.h @@ -1107,8 +1107,7 @@ class NIHTown : public NIHelper { if (t->have_ratings != 0) { print(" Company ratings:"); - uint8 bit; - FOR_EACH_SET_BIT(bit, t->have_ratings) { + for (uint8 bit : SetBitIterator(t->have_ratings)) { seprintf(buffer, lastof(buffer), " %u: %d", bit, t->ratings[bit]); print(buffer); } diff --git a/src/table/settings/CMakeLists.txt b/src/table/settings/CMakeLists.txt index c4b0ecf091..31d24b5739 100644 --- a/src/table/settings/CMakeLists.txt +++ b/src/table/settings/CMakeLists.txt @@ -6,6 +6,9 @@ set(TABLE_INI_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/currency_settings.ini ${CMAKE_CURRENT_SOURCE_DIR}/gameopt_settings.ini ${CMAKE_CURRENT_SOURCE_DIR}/misc_settings.ini + ${CMAKE_CURRENT_SOURCE_DIR}/network_settings.ini + ${CMAKE_CURRENT_SOURCE_DIR}/network_private_settings.ini + ${CMAKE_CURRENT_SOURCE_DIR}/network_secrets_settings.ini ${CMAKE_CURRENT_SOURCE_DIR}/settings.ini ${CMAKE_CURRENT_SOURCE_DIR}/win32_settings.ini ${CMAKE_CURRENT_SOURCE_DIR}/window_settings.ini diff --git a/src/table/settings/network_private_settings.ini b/src/table/settings/network_private_settings.ini new file mode 100644 index 0000000000..b2385d4cf6 --- /dev/null +++ b/src/table/settings/network_private_settings.ini @@ -0,0 +1,69 @@ +; 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 . +; + +; Network settings as stored in the private configuration file ("private.cfg"). + +[pre-amble] +static const SettingTable _network_private_settings = { +[post-amble] +}; +[templates] +SDTC_SSTR = SDTC_SSTR( $var, $type, $flags, $def, $length, $pre_cb, $post_cb, $from, $to, $extver, $cat, $guiproc, $startup, nullptr), + +[validation] + +[defaults] +flags = SF_NONE +interval = 0 +str = STR_NULL +strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT +strval = STR_NULL +pre_cb = nullptr +post_cb = nullptr +guiproc = nullptr +load = nullptr +from = SL_MIN_VERSION +to = SL_MAX_VERSION +cat = SC_ADVANCED +extra = 0 +startup = false +extver = SlXvFeatureTest() + + +[SDTC_SSTR] +var = network.client_name +type = SLE_STR +length = NETWORK_CLIENT_NAME_LENGTH +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC +def = nullptr +pre_cb = NetworkValidateClientName +post_cb = NetworkUpdateClientName +cat = SC_BASIC + +[SDTC_SSTR] +var = network.server_name +type = SLE_STR +length = NETWORK_NAME_LENGTH +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY +def = nullptr +pre_cb = NetworkValidateServerName +post_cb = [](auto) { UpdateClientConfigValues(); } +cat = SC_BASIC + +[SDTC_SSTR] +var = network.connect_to_ip +type = SLE_STR +length = 0 +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC +def = nullptr + +[SDTC_SSTR] +var = network.last_joined +type = SLE_STR +length = 0 +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC +def = """" +cat = SC_EXPERT diff --git a/src/table/settings/network_secrets_settings.ini b/src/table/settings/network_secrets_settings.ini new file mode 100644 index 0000000000..2a01a79f41 --- /dev/null +++ b/src/table/settings/network_secrets_settings.ini @@ -0,0 +1,86 @@ +; 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 . +; + +; Network settings as stored in the secrets configuration file ("secrets.cfg"). + +[pre-amble] +static bool ReplaceAsteriskWithEmptyPassword(std::string &newval); + +static const SettingTable _network_secrets_settings = { +[post-amble] +}; +[templates] +SDTC_SSTR = SDTC_SSTR( $var, $type, $flags, $def, $length, $pre_cb, $post_cb, $from, $to, $extver, $cat, $guiproc, $startup, nullptr), + +[validation] + +[defaults] +flags = SF_NONE +interval = 0 +str = STR_NULL +strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT +strval = STR_NULL +pre_cb = nullptr +post_cb = nullptr +guiproc = nullptr +load = nullptr +from = SL_MIN_VERSION +to = SL_MAX_VERSION +cat = SC_ADVANCED +extra = 0 +startup = false +extver = SlXvFeatureTest() + + +[SDTC_SSTR] +var = network.server_password +type = SLE_STR +length = NETWORK_PASSWORD_LENGTH +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY +def = nullptr +pre_cb = ReplaceAsteriskWithEmptyPassword +post_cb = [](auto) { NetworkServerUpdateGameInfo(); } +cat = SC_BASIC + +[SDTC_SSTR] +var = network.rcon_password +type = SLE_STR +length = NETWORK_PASSWORD_LENGTH +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY +def = nullptr +pre_cb = ReplaceAsteriskWithEmptyPassword +cat = SC_BASIC + +[SDTC_SSTR] +var = network.admin_password +type = SLE_STR +length = NETWORK_PASSWORD_LENGTH +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY +def = nullptr +cat = SC_BASIC + +[SDTC_SSTR] +var = network.settings_password +type = SLE_STR +length = NETWORK_PASSWORD_LENGTH +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY +def = nullptr +pre_cb = ReplaceAsteriskWithEmptyPassword +cat = SC_EXPERT + +[SDTC_SSTR] +var = network.default_company_pass +type = SLE_STR +length = NETWORK_PASSWORD_LENGTH +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC +def = nullptr + +[SDTC_SSTR] +var = network.network_id +type = SLE_STR +length = NETWORK_SERVER_ID_LENGTH +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY +def = nullptr diff --git a/src/table/settings/network_settings.ini b/src/table/settings/network_settings.ini new file mode 100644 index 0000000000..b96df71b30 --- /dev/null +++ b/src/table/settings/network_settings.ini @@ -0,0 +1,255 @@ +; 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 . +; + +; Network settings as stored in the main configuration file ("openttd.cfg"). + +[pre-amble] +static void UpdateClientConfigValues(); + +static const SettingTable _network_settings = { +[post-amble] +}; +[templates] +SDTC_BOOL = SDTC_BOOL( $var, $flags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $extver, $cat, $guiproc, $startup, nullptr), +SDTC_VAR = SDTC_VAR( $var, $type, $flags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $extver, $cat, $guiproc, $startup, nullptr), + +[validation] +SDTC_VAR = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size"); + +[defaults] +flags = SF_NONE +interval = 0 +str = STR_NULL +strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT +strval = STR_NULL +pre_cb = nullptr +post_cb = nullptr +guiproc = nullptr +load = nullptr +from = SL_MIN_VERSION +to = SL_MAX_VERSION +cat = SC_ADVANCED +extra = 0 +startup = false +extver = SlXvFeatureTest() + + +[SDTC_VAR] +var = network.sync_freq +type = SLE_UINT16 +flags = SF_NOT_IN_SAVE | SF_NOT_IN_CONFIG | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY +def = 100 +min = 0 +max = 100 +cat = SC_EXPERT + +[SDTC_VAR] +var = network.frame_freq +type = SLE_UINT8 +flags = SF_NOT_IN_SAVE | SF_NOT_IN_CONFIG | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY +def = 0 +min = 0 +max = 100 +cat = SC_EXPERT + +[SDTC_VAR] +var = network.commands_per_frame +type = SLE_UINT16 +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY +def = 2 +min = 1 +max = 65535 +cat = SC_EXPERT + +[SDTC_VAR] +var = network.max_commands_in_queue +type = SLE_UINT16 +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY +def = 16 +min = 1 +max = 65535 +cat = SC_EXPERT + +[SDTC_VAR] +var = network.bytes_per_frame +type = SLE_UINT16 +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY +def = 8 +min = 1 +max = 65535 +cat = SC_EXPERT + +[SDTC_VAR] +var = network.bytes_per_frame_burst +type = SLE_UINT16 +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY +def = 256 +min = 1 +max = 65535 +cat = SC_EXPERT + +[SDTC_VAR] +var = network.max_init_time +type = SLE_UINT16 +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY +def = 100 +min = 0 +max = 32000 +cat = SC_EXPERT + +[SDTC_VAR] +var = network.max_join_time +type = SLE_UINT16 +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY +def = 500 +min = 0 +max = 32000 + +[SDTC_VAR] +var = network.max_download_time +type = SLE_UINT16 +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY +def = 1000 +min = 0 +max = 32000 + +[SDTC_VAR] +var = network.max_password_time +type = SLE_UINT16 +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY +def = 2000 +min = 0 +max = 32000 + +[SDTC_VAR] +var = network.max_lag_time +type = SLE_UINT16 +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY +def = 500 +min = 0 +max = 32000 + +[SDTC_BOOL] +var = network.pause_on_join +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY +def = true + +[SDTC_VAR] +var = network.server_port +type = SLE_UINT16 +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY +def = NETWORK_DEFAULT_PORT +min = 0 +max = 65535 +cat = SC_EXPERT + +[SDTC_VAR] +var = network.server_admin_port +type = SLE_UINT16 +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY +def = NETWORK_ADMIN_PORT +min = 0 +max = 65535 +cat = SC_EXPERT + +[SDTC_BOOL] +var = network.server_admin_chat +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY +def = true +cat = SC_EXPERT + +[SDTC_BOOL] +var = network.server_advertise +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY +def = false + +[SDTC_BOOL] +var = network.autoclean_companies +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY +def = false + +[SDTC_VAR] +var = network.autoclean_unprotected +type = SLE_UINT8 +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_0_IS_SPECIAL | SF_NETWORK_ONLY +def = 12 +min = 0 +max = 240 + +[SDTC_VAR] +var = network.autoclean_protected +type = SLE_UINT8 +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_0_IS_SPECIAL | SF_NETWORK_ONLY +def = 36 +min = 0 +max = 240 + +[SDTC_VAR] +var = network.autoclean_novehicles +type = SLE_UINT8 +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_0_IS_SPECIAL | SF_NETWORK_ONLY +def = 0 +min = 0 +max = 240 + +[SDTC_VAR] +var = network.max_companies +type = SLE_UINT8 +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY +def = 15 +min = 1 +max = MAX_COMPANIES +post_cb = [](auto) { UpdateClientConfigValues(); } +cat = SC_BASIC + +[SDTC_VAR] +var = network.max_clients +type = SLE_UINT8 +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY +def = 25 +min = 2 +max = MAX_CLIENTS +post_cb = [](auto) { UpdateClientConfigValues(); } +cat = SC_BASIC + +[SDTC_VAR] +var = network.max_spectators +type = SLE_UINT8 +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY +def = 15 +min = 0 +max = MAX_CLIENTS +post_cb = [](auto) { UpdateClientConfigValues(); } +cat = SC_BASIC + +[SDTC_VAR] +var = network.restart_game_year +type = SLE_INT32 +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_0_IS_SPECIAL | SF_NETWORK_ONLY +def = 0 +min = MIN_YEAR +max = MAX_YEAR +interval = 1 + +[SDTC_VAR] +var = network.min_active_clients +type = SLE_UINT8 +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY +def = 0 +min = 0 +max = MAX_CLIENTS + +[SDTC_BOOL] +var = network.reload_cfg +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY +def = false +cat = SC_EXPERT + +[SDTC_BOOL] +var = network.no_http_content_downloads +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC +def = false +cat = SC_EXPERT diff --git a/src/table/settings/settings.ini b/src/table/settings/settings.ini index c1c3e0f32e..0d144df084 100644 --- a/src/table/settings/settings.ini +++ b/src/table/settings/settings.ini @@ -69,9 +69,6 @@ static bool CheckSharingRoad(int32 &new_value); static bool CheckSharingWater(int32 &new_value); static bool CheckSharingAir(int32 &new_value); -static bool ReplaceAsteriskWithEmptyPassword(std::string &newval); -static void UpdateClientConfigValues(); - /* End - Callback Functions for the various settings */ /* Begin - xref conversion callbacks */ @@ -5754,308 +5751,6 @@ min = 1 max = 65535 cat = SC_EXPERT -[SDTC_VAR] -var = network.sync_freq -type = SLE_UINT16 -flags = SF_NOT_IN_SAVE | SF_NOT_IN_CONFIG | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY -def = 100 -min = 0 -max = 100 -cat = SC_EXPERT - -[SDTC_VAR] -var = network.frame_freq -type = SLE_UINT8 -flags = SF_NOT_IN_SAVE | SF_NOT_IN_CONFIG | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY -def = 0 -min = 0 -max = 100 -cat = SC_EXPERT - -[SDTC_VAR] -var = network.commands_per_frame -type = SLE_UINT16 -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY -def = 2 -min = 1 -max = 65535 -cat = SC_EXPERT - -[SDTC_VAR] -var = network.max_commands_in_queue -type = SLE_UINT16 -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY -def = 16 -min = 1 -max = 65535 -cat = SC_EXPERT - -[SDTC_VAR] -var = network.bytes_per_frame -type = SLE_UINT16 -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY -def = 8 -min = 1 -max = 65535 -cat = SC_EXPERT - -[SDTC_VAR] -var = network.bytes_per_frame_burst -type = SLE_UINT16 -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY -def = 256 -min = 1 -max = 65535 -cat = SC_EXPERT - -[SDTC_VAR] -var = network.max_init_time -type = SLE_UINT16 -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY -def = 100 -min = 0 -max = 32000 -cat = SC_EXPERT - -[SDTC_VAR] -var = network.max_join_time -type = SLE_UINT16 -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY -def = 500 -min = 0 -max = 32000 - -[SDTC_VAR] -var = network.max_download_time -type = SLE_UINT16 -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY -def = 1000 -min = 0 -max = 32000 - -[SDTC_VAR] -var = network.max_password_time -type = SLE_UINT16 -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY -def = 2000 -min = 0 -max = 32000 - -[SDTC_VAR] -var = network.max_lag_time -type = SLE_UINT16 -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY -def = 500 -min = 0 -max = 32000 - -[SDTC_BOOL] -var = network.pause_on_join -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY -def = true - -[SDTC_VAR] -var = network.server_port -type = SLE_UINT16 -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY -def = NETWORK_DEFAULT_PORT -min = 0 -max = 65535 -cat = SC_EXPERT - -[SDTC_VAR] -var = network.server_admin_port -type = SLE_UINT16 -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY -def = NETWORK_ADMIN_PORT -min = 0 -max = 65535 -cat = SC_EXPERT - -[SDTC_BOOL] -var = network.server_admin_chat -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY -def = true -cat = SC_EXPERT - -[SDTC_BOOL] -var = network.server_advertise -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY -def = false - -[SDTC_SSTR] -var = network.client_name -type = SLE_STR -length = NETWORK_CLIENT_NAME_LENGTH -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC -def = nullptr -pre_cb = NetworkValidateClientName -post_cb = NetworkUpdateClientName -cat = SC_BASIC - -[SDTC_SSTR] -var = network.server_password -type = SLE_STR -length = NETWORK_PASSWORD_LENGTH -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY -def = nullptr -pre_cb = ReplaceAsteriskWithEmptyPassword -post_cb = [](auto) { NetworkServerUpdateGameInfo(); } -cat = SC_BASIC - -[SDTC_SSTR] -var = network.rcon_password -type = SLE_STR -length = NETWORK_PASSWORD_LENGTH -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY -def = nullptr -pre_cb = ReplaceAsteriskWithEmptyPassword -cat = SC_BASIC - -[SDTC_SSTR] -var = network.admin_password -type = SLE_STR -length = NETWORK_PASSWORD_LENGTH -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY -def = nullptr -cat = SC_BASIC - -[SDTC_SSTR] -var = network.settings_password -type = SLE_STR -length = NETWORK_PASSWORD_LENGTH -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY -def = nullptr -pre_cb = ReplaceAsteriskWithEmptyPassword -cat = SC_EXPERT - -[SDTC_SSTR] -var = network.default_company_pass -type = SLE_STR -length = NETWORK_PASSWORD_LENGTH -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC -def = nullptr - -[SDTC_SSTR] -var = network.server_name -type = SLE_STR -length = NETWORK_NAME_LENGTH -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY -def = nullptr -pre_cb = NetworkValidateServerName -post_cb = [](auto) { UpdateClientConfigValues(); } -cat = SC_BASIC - -[SDTC_SSTR] -var = network.connect_to_ip -type = SLE_STR -length = 0 -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC -def = nullptr - -[SDTC_SSTR] -var = network.network_id -type = SLE_STR -length = NETWORK_SERVER_ID_LENGTH -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY -def = nullptr - -[SDTC_BOOL] -var = network.autoclean_companies -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY -def = false - -[SDTC_VAR] -var = network.autoclean_unprotected -type = SLE_UINT8 -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_0_IS_SPECIAL | SF_NETWORK_ONLY -def = 12 -min = 0 -max = 240 - -[SDTC_VAR] -var = network.autoclean_protected -type = SLE_UINT8 -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_0_IS_SPECIAL | SF_NETWORK_ONLY -def = 36 -min = 0 -max = 240 - -[SDTC_VAR] -var = network.autoclean_novehicles -type = SLE_UINT8 -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_0_IS_SPECIAL | SF_NETWORK_ONLY -def = 0 -min = 0 -max = 240 - -[SDTC_VAR] -var = network.max_companies -type = SLE_UINT8 -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY -def = 15 -min = 1 -max = MAX_COMPANIES -post_cb = [](auto) { UpdateClientConfigValues(); } -cat = SC_BASIC - -[SDTC_VAR] -var = network.max_clients -type = SLE_UINT8 -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY -def = 25 -min = 2 -max = MAX_CLIENTS -post_cb = [](auto) { UpdateClientConfigValues(); } -cat = SC_BASIC - -[SDTC_VAR] -var = network.max_spectators -type = SLE_UINT8 -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY -def = 15 -min = 0 -max = MAX_CLIENTS -post_cb = [](auto) { UpdateClientConfigValues(); } -cat = SC_BASIC - -[SDTC_VAR] -var = network.restart_game_year -type = SLE_INT32 -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_0_IS_SPECIAL | SF_NETWORK_ONLY -def = 0 -min = MIN_YEAR -max = MAX_YEAR -interval = 1 - -[SDTC_VAR] -var = network.min_active_clients -type = SLE_UINT8 -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY -def = 0 -min = 0 -max = MAX_CLIENTS - -[SDTC_BOOL] -var = network.reload_cfg -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY -def = false -cat = SC_EXPERT - -[SDTC_SSTR] -var = network.last_joined -type = SLE_STR -length = 0 -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC -def = """" -cat = SC_EXPERT - -[SDTC_BOOL] -var = network.no_http_content_downloads -flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC -def = false -cat = SC_EXPERT - [SDT_BOOL] var = vehicle.pay_for_repair def = true diff --git a/src/tgp.cpp b/src/tgp.cpp index d3717fb29b..103497a79b 100644 --- a/src/tgp.cpp +++ b/src/tgp.cpp @@ -161,11 +161,10 @@ static const int amplitude_decimal_bits = 10; /** Height map - allocated array of heights (MapSizeX() + 1) x (MapSizeY() + 1) */ struct HeightMap { - height_t *h; //< array of heights + std::vector h; //< array of heights /* Even though the sizes are always positive, there are many cases where * X and Y need to be signed integers due to subtractions. */ int dim_x; //< height map size_x MapSizeX() + 1 - int total_size; //< height map total size int size_x; //< MapSizeX() int size_y; //< MapSizeY() @@ -182,7 +181,7 @@ struct HeightMap }; /** Global height map instance */ -static HeightMap _height_map = {nullptr, 0, 0, 0, 0}; +static HeightMap _height_map = { {}, 0, 0, 0 }; /** Conversion: int to height_t */ #define I2H(i) ((i) << height_decimal_bits) @@ -197,10 +196,6 @@ static HeightMap _height_map = {nullptr, 0, 0, 0, 0}; /** Conversion: amplitude_t to height_t */ #define A2H(a) ((a) >> (amplitude_decimal_bits - height_decimal_bits)) - -/** Walk through all items of _height_map.h */ -#define FOR_ALL_TILES_IN_HEIGHT(h) for (h = _height_map.h; h < &_height_map.h[_height_map.total_size]; h++) - /** Maximum number of TGP noise frequencies. */ static const int MAX_TGP_FREQUENCIES = 10; @@ -326,18 +321,15 @@ static inline bool IsValidXY(int x, int y) */ static inline bool AllocHeightMap() { - height_t *h; + assert(_height_map.h.empty()); _height_map.size_x = MapSizeX(); _height_map.size_y = MapSizeY(); /* Allocate memory block for height map row pointers */ - _height_map.total_size = (_height_map.size_x + 1) * (_height_map.size_y + 1); + size_t total_size = (_height_map.size_x + 1) * (_height_map.size_y + 1); _height_map.dim_x = _height_map.size_x + 1; - _height_map.h = CallocT(_height_map.total_size); - - /* Iterate through height map and initialise values. */ - FOR_ALL_TILES_IN_HEIGHT(h) *h = 0; + _height_map.h.resize(total_size); return true; } @@ -345,8 +337,7 @@ static inline bool AllocHeightMap() /** Free height map */ static inline void FreeHeightMap() { - free(_height_map.h); - _height_map.h = nullptr; + _height_map.h.clear(); } /** @@ -370,7 +361,7 @@ static inline height_t RandomHeight(amplitude_t rMax) static void HeightMapGenerate() { /* Trying to apply noise to uninitialized height map */ - assert(_height_map.h != nullptr); + assert(!_height_map.h.empty()); int start = std::max(MAX_TGP_FREQUENCIES - (int)std::min(MapLogX(), MapLogY()), 0); bool first = true; @@ -429,15 +420,15 @@ static void HeightMapGenerate() /** Returns min, max and average height from height map */ static void HeightMapGetMinMaxAvg(height_t *min_ptr, height_t *max_ptr, height_t *avg_ptr) { - height_t h_min, h_max, h_avg, *h; + height_t h_min, h_max, h_avg; int64 h_accu = 0; h_min = h_max = _height_map.height(0, 0); /* Get h_min, h_max and accumulate heights into h_accu */ - FOR_ALL_TILES_IN_HEIGHT(h) { - if (*h < h_min) h_min = *h; - if (*h > h_max) h_max = *h; - h_accu += *h; + for (const height_t &h : _height_map.h) { + if (h < h_min) h_min = h; + if (h > h_max) h_max = h; + h_accu += h; } /* Get average height */ @@ -453,13 +444,12 @@ static void HeightMapGetMinMaxAvg(height_t *min_ptr, height_t *max_ptr, height_t static int *HeightMapMakeHistogram(height_t h_min, height_t h_max, int *hist_buf) { int *hist = hist_buf - h_min; - height_t *h; /* Count the heights and fill the histogram */ - FOR_ALL_TILES_IN_HEIGHT(h) { - assert(*h >= h_min); - assert(*h <= h_max); - hist[*h]++; + for (const height_t &h : _height_map.h){ + assert(h >= h_min); + assert(h <= h_max); + hist[h]++; } return hist; } @@ -467,15 +457,13 @@ static int *HeightMapMakeHistogram(height_t h_min, height_t h_max, int *hist_buf /** Applies sine wave redistribution onto height map */ static void HeightMapSineTransform(height_t h_min, height_t h_max) { - height_t *h; - - FOR_ALL_TILES_IN_HEIGHT(h) { + for (height_t &h : _height_map.h) { double fheight; - if (*h < h_min) continue; + if (h < h_min) continue; /* Transform height into 0..1 space */ - fheight = (double)(*h - h_min) / (double)(h_max - h_min); + fheight = (double)(h - h_min) / (double)(h_max - h_min); /* Apply sine transform depending on landscape type */ switch (_settings_game.game_creation.landscape) { case LT_TOYLAND: @@ -535,9 +523,9 @@ static void HeightMapSineTransform(height_t h_min, height_t h_max) break; } /* Transform it back into h_min..h_max space */ - *h = (height_t)(fheight * (h_max - h_min) + h_min); - if (*h < 0) *h = I2H(0); - if (*h >= h_max) *h = h_max - 1; + h = (height_t)(fheight * (h_max - h_min) + h_min); + if (h < 0) h = I2H(0); + if (h >= h_max) h = h_max - 1; } } @@ -690,7 +678,6 @@ static void HeightMapAdjustWaterLevel(amplitude_t water_percent, height_t h_max_ { height_t h_min, h_max, h_avg, h_water_level; int64 water_tiles, desired_water_tiles; - height_t *h; int *hist; HeightMapGetMinMaxAvg(&h_min, &h_max, &h_avg); @@ -715,12 +702,12 @@ static void HeightMapAdjustWaterLevel(amplitude_t water_percent, height_t h_max_ * values from range: h_water_level..h_max are transformed into 0..h_max_new * where h_max_new is depending on terrain type and map size. */ - FOR_ALL_TILES_IN_HEIGHT(h) { + for (height_t &h : _height_map.h) { /* Transform height from range h_water_level..h_max into 0..h_max_new range */ - *h = (height_t)(((int)h_max_new) * (*h - h_water_level) / (h_max - h_water_level)) + I2H(1); + h = (height_t)(((int)h_max_new) * (h - h_water_level) / (h_max - h_water_level)) + I2H(1); /* Make sure all values are in the proper range (0..h_max_new) */ - if (*h < 0) *h = I2H(0); - if (*h >= h_max_new) *h = h_max_new - 1; + if (h < 0) h = I2H(0); + if (h >= h_max_new) h = h_max_new - 1; } free(hist_buf); diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 6ceeda1d90..3f51ccd5ef 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -4112,8 +4112,7 @@ void UpdateAllTownRatings() if (Company::IsValidID(_local_company) && HasBit(t->have_ratings, _local_company) && t->ratings[_local_company] <= 0) { ZoningTownAuthorityRatingChange(); } - uint8 c; - FOR_EACH_SET_BIT(c, t->have_ratings) { + for (uint8 c : SetBitIterator(t->have_ratings)) { t->ratings[c] = RATING_MAXIMUM; } if (t->have_ratings != 0) { diff --git a/src/town_gui.cpp b/src/town_gui.cpp index e07f09ca2b..0995f7aad0 100644 --- a/src/town_gui.cpp +++ b/src/town_gui.cpp @@ -91,8 +91,7 @@ private: static int GetNthSetBit(uint32 bits, int n) { if (n >= 0) { - uint i; - FOR_EACH_SET_BIT(i, bits) { + for (uint i : SetBitIterator(bits)) { n--; if (n < 0) return i; } diff --git a/src/tracerestrict_gui.cpp b/src/tracerestrict_gui.cpp index e8e79bb820..aba9c5b8f2 100644 --- a/src/tracerestrict_gui.cpp +++ b/src/tracerestrict_gui.cpp @@ -563,12 +563,12 @@ static const TraceRestrictDropDownListSet *GetSortedCargoTypeDropDownListSet() cargo_list_str, cargo_list_id, }; - for (size_t i = 0; i < _sorted_standard_cargo_specs_size; ++i) { + for (size_t i = 0; i < _sorted_standard_cargo_specs.size(); ++i) { const CargoSpec *cs = _sorted_cargo_specs[i]; cargo_list_str[i] = cs->name; cargo_list_id[i] = cs->Index(); } - cargo_list_str[_sorted_standard_cargo_specs_size] = INVALID_STRING_ID; + cargo_list_str[_sorted_standard_cargo_specs.size()] = INVALID_STRING_ID; return &cargo_list; } diff --git a/src/track_func.h b/src/track_func.h index 4b94d4edd6..f099dddfec 100644 --- a/src/track_func.h +++ b/src/track_func.h @@ -15,16 +15,7 @@ #include "direction_func.h" #include "slope_func.h" -/** - * Iterate through each set Track in a TrackBits value. - * For more information see FOR_EACH_SET_BIT_EX. - * - * @param var Loop index variable that stores fallowing set track. Must be of type Track. - * @param track_bits The value to iterate through (any expression). - * - * @see FOR_EACH_SET_BIT_EX - */ -#define FOR_EACH_SET_TRACK(var, track_bits) FOR_EACH_SET_BIT_EX(Track, var, TrackBits, track_bits) +using SetTrackBitIterator = SetBitIterator; /** * Checks if a Track is valid. diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index ec1a018576..1a06d0de3d 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -5876,8 +5876,7 @@ static void DeleteLastWagon(Train *v) /* It is important that these two are the first in the loop, as reservation cannot deal with every trackbit combination */ assert(TRACK_BEGIN == TRACK_X && TRACK_Y == TRACK_BEGIN + 1); - Track t; - FOR_EACH_SET_TRACK(t, remaining_trackbits) TryReserveRailTrack(tile, t); + for (Track t : SetTrackBitIterator(remaining_trackbits)) TryReserveRailTrack(tile, t); } /* check if the wagon was on a road/rail-crossing */ diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index e83dfc7a2f..161a50d2ee 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -356,8 +356,7 @@ void BaseVehicleListWindow::SetCargoFilterArray() filter_items++; /* Collect available cargo types for filtering. */ - const CargoSpec *cs; - FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) { + for (const CargoSpec *cs : _sorted_standard_cargo_specs) { this->cargo_filter[filter_items] = cs->Index(); this->cargo_filter_texts[filter_items] = cs->name; filter_items++; diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp index 92ce2ee331..0b807d97f1 100644 --- a/src/water_cmd.cpp +++ b/src/water_cmd.cpp @@ -1288,8 +1288,7 @@ void TileLoop_Water(TileIndex tile) case FLOOD_DRYUP: { Slope slope_here = GetFoundationSlope(tile) & ~SLOPE_HALFTILE_MASK & ~SLOPE_STEEP; - uint dir; - FOR_EACH_SET_BIT(dir, _flood_from_dirs[slope_here]) { + for (uint dir : SetBitIterator(_flood_from_dirs[slope_here])) { TileIndex dest = tile + TileOffsByDir((Direction)dir); if (!IsValidTile(dest)) continue; @@ -1327,8 +1326,7 @@ void ConvertGroundTilesIntoWaterTiles() break; default: - uint dir; - FOR_EACH_SET_BIT(dir, _flood_from_dirs[slope & ~SLOPE_STEEP]) { + for (uint dir : SetBitIterator(_flood_from_dirs[slope & ~SLOPE_STEEP])) { TileIndex dest = TileAddByDir(tile, (Direction)dir); Slope slope_dest = GetTileSlope(dest) & ~SLOPE_STEEP; if (slope_dest == SLOPE_FLAT || IsSlopeWithOneCornerRaised(slope_dest)) { diff --git a/src/window.cpp b/src/window.cpp index 41eac76a1a..37c206b0e0 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -143,13 +143,12 @@ int16 WindowDesc::GetDefaultHeight() const */ void WindowDesc::LoadFromConfig() { - IniFile *ini = new IniFile(); - ini->LoadFromDisk(_windows_file, NO_DIRECTORY); + IniFile ini; + ini.LoadFromDisk(_windows_file, NO_DIRECTORY); for (WindowDesc *wd : *_window_descs) { if (wd->ini_key == nullptr) continue; IniLoadWindowSettings(ini, wd->ini_key, wd); } - delete ini; } /** @@ -169,14 +168,13 @@ void WindowDesc::SaveToConfig() /* Sort the stuff to get a nice ini file on first write */ std::sort(_window_descs->begin(), _window_descs->end(), DescSorter); - IniFile *ini = new IniFile(); - ini->LoadFromDisk(_windows_file, NO_DIRECTORY); + IniFile ini; + ini.LoadFromDisk(_windows_file, NO_DIRECTORY); for (WindowDesc *wd : *_window_descs) { if (wd->ini_key == nullptr) continue; IniSaveWindowSettings(ini, wd->ini_key, wd); } - ini->SaveToDisk(_windows_file); - delete ini; + ini.SaveToDisk(_windows_file); } /**