Merge branch 'master' into jgrpp-beta

# Conflicts:
#	src/economy.cpp
#	src/elrail.cpp
#	src/graph_gui.cpp
#	src/linkgraph/linkgraph_gui.cpp
#	src/network/core/game_info.cpp
#	src/newgrf_station.cpp
#	src/saveload/saveload.cpp
#	src/settings.cpp
#	src/station_cmd.cpp
#	src/station_gui.cpp
#	src/strings_func.h
#	src/table/settings/network_settings.ini
#	src/table/settings/settings.ini
pull/332/head
Jonathan G Rennison 3 years ago
commit f54d69a60a

@ -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++;

@ -149,8 +149,8 @@ SpriteID CargoSpec::GetCargoIcon() const
return sprite;
}
std::vector<const CargoSpec *> _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<const CargoSpec *> _sorted_cargo_specs; ///< Cargo specifications sorted alphabetically by name.
span<const CargoSpec *> _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 };
}

@ -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 <vector>
/** Globally unique label of a cargo type. */
@ -190,7 +192,7 @@ CargoID GetDefaultCargoID(LandscapeID l, CargoType ct);
void InitializeSortedCargoSpecs();
extern std::vector<const CargoSpec *> _sorted_cargo_specs;
extern uint8 _sorted_standard_cargo_specs_size;
extern span<const CargoSpec *> _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<CargoID, CargoTypes>;
#endif /* CARGOTYPE_H */

@ -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)
/**
* 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)
/**
* Iterable ensemble of each set bit in a value.
* @tparam Tbitpos Type of the position variable.
* @tparam Tbitset Type of the bitset value.
*/
template <typename Tbitpos = uint, typename Tbitset = uint>
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;
explicit Iterator(Tbitset bitset) : bitset(bitset), bitpos(static_cast<Tbitpos>(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<Tbitset>(this->bitset >> 1);
this->bitpos++;
}
};
SetBitIterator(Tbitset bitset) : bitset(bitset) {}
Iterator begin() { return Iterator(this->bitset); }
Iterator end() { return Iterator(static_cast<Tbitset>(0)); }
bool empty() { return this->begin() == this->end(); }
private:
Tbitset bitset;
};
#if defined(__APPLE__)
/* Make endian swapping use Apple's macros to increase speed

@ -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;

@ -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,

@ -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);

@ -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) {

@ -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;

@ -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<int>(_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<float>(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<byte>(factor / static_cast<float>((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<CargoTypes>(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;

@ -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()) {

@ -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
*/

@ -49,6 +49,7 @@ struct IniGroup {
~IniGroup();
IniItem *GetItem(const std::string &name, bool create);
void RemoveItem(const std::string &name);
void Clear();
};

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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}

@ -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

@ -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}

@ -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

@ -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 :<cargamento no válido>
STR_NEWGRF_INVALID_CARGO :<carga no válida>
STR_NEWGRF_INVALID_CARGO_ABBREV :??
STR_NEWGRF_INVALID_CARGO_QUANTITY :{COMMA} de <cargamento no válido>
STR_NEWGRF_INVALID_CARGO_QUANTITY :{COMMA} de <carga no válida>
STR_NEWGRF_INVALID_ENGINE :<modelo de vehículo no válido>
STR_NEWGRF_INVALID_INDUSTRYTYPE :<industria no válida>
@ -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]

@ -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<std::pair<StationID, StationID>, 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);

@ -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;

@ -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);
}

@ -316,9 +316,8 @@ public:
template <typename F> 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 <typename F> 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 <typename T, typename F> 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;

@ -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<NWidgetCore>(WID_CTO_CAPTION)->SetDataTip(STR_CARGO_TYPE_ORDERS_LOAD_CAPTION + this->variant, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS);
this->GetWidget<NWidgetCore>(WID_CTO_HEADER)->SetDataTip(STR_CARGO_TYPE_ORDERS_LOAD_TITLE + this->variant, STR_NULL);
this->GetWidget<NWidgetStacked>(WID_CTO_SELECT)->SetDisplayedPlane((_sorted_standard_cargo_specs_size >= 32) ? 0 : SZSP_NONE);
this->GetWidget<NWidgetStacked>(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));
}

@ -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) {

@ -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);
}
}

@ -23,6 +23,7 @@
#include "stdafx.h"
#include <array>
#include <charconv>
#include <limits>
#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<ErrorMessageData> 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<IniFileVersion>(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);
IniFileVersion generic_version = LoadVersionFromConfig(generic_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);
}
}
/* Remove some obsolete groups. These have all been loaded into other groups. */
ini->RemoveGroup("patches");
ini->RemoveGroup("yapf");
ini->RemoveGroup("gameopt");
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");
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;
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<IniFile> 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");

@ -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);

@ -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);
}

@ -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<int>(_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) {

@ -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

@ -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();
/**

@ -47,8 +47,7 @@ void Subsidy::AwardTo(CompanyID company)
NewsStringData *company_name = new NewsStringData(GetString(STR_COMPANY_NAME));
/* Add a news item */
std::pair<NewsReferenceType, NewsReferenceType> reftype = SetupSubsidyDecodeParam(this, SubsidyDecodeParamType::NewsAwarded);
InjectDParam(1);
std::pair<NewsReferenceType, NewsReferenceType> 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<NewsReferenceType, NewsReferenceType> SetupSubsidyDecodeParam(const Subsidy *s, SubsidyDecodeParamType mode)
std::pair<NewsReferenceType, NewsReferenceType> SetupSubsidyDecodeParam(const Subsidy *s, SubsidyDecodeParamType mode, uint parameter_offset)
{
NewsReferenceType reftype1 = NR_NONE;
NewsReferenceType reftype2 = NR_NONE;
@ -77,40 +77,40 @@ std::pair<NewsReferenceType, NewsReferenceType> 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<NewsReferenceType, NewsReferenceType>(reftype1, reftype2);

@ -17,10 +17,9 @@
#include "news_type.h"
#include "subsidy_base.h"
std::pair<NewsReferenceType, NewsReferenceType> SetupSubsidyDecodeParam(const struct Subsidy *s, SubsidyDecodeParamType mode);
std::pair<NewsReferenceType, NewsReferenceType> 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 */

@ -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);
}

@ -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

@ -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 <http://www.gnu.org/licenses/>.
;
; 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

@ -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 <http://www.gnu.org/licenses/>.
;
; 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

@ -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 <http://www.gnu.org/licenses/>.
;
; 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

@ -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

@ -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<height_t> 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_t>(_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);

@ -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) {

@ -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;
}

@ -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;
}

@ -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<Track, TrackBits>;
/**
* Checks if a Track is valid.

@ -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 */

@ -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++;

@ -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)) {

@ -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);
}
/**

Loading…
Cancel
Save