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
This commit is contained in:
Jonathan G Rennison
2021-11-01 21:18:24 +00:00
53 changed files with 1017 additions and 780 deletions

View File

@@ -1338,8 +1338,7 @@ struct BuildVehicleWindow : BuildVehicleWindowBase {
} }
/* Collect available cargo types for filtering. */ /* Collect available cargo types for filtering. */
const CargoSpec *cs; for (const CargoSpec *cs : _sorted_standard_cargo_specs) {
FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) {
this->cargo_filter[filter_items] = cs->Index(); this->cargo_filter[filter_items] = cs->Index();
this->cargo_filter_texts[filter_items] = cs->name; this->cargo_filter_texts[filter_items] = cs->name;
filter_items++; filter_items++;
@@ -2110,8 +2109,7 @@ struct BuildVehicleWindowTrainAdvanced final : BuildVehicleWindowBase {
filter_items++; filter_items++;
/* Collect available cargo types for filtering. */ /* Collect available cargo types for filtering. */
const CargoSpec *cs; for (const CargoSpec *cs : _sorted_standard_cargo_specs) {
FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) {
state.cargo_filter[filter_items] = cs->Index(); state.cargo_filter[filter_items] = cs->Index();
state.cargo_filter_texts[filter_items] = cs->name; state.cargo_filter_texts[filter_items] = cs->name;
filter_items++; filter_items++;

View File

@@ -150,7 +150,7 @@ SpriteID CargoSpec::GetCargoIcon() const
} }
std::vector<const CargoSpec *> _sorted_cargo_specs; ///< Cargo specifications sorted alphabetically by name. 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. span<const CargoSpec *> _sorted_standard_cargo_specs; ///< Standard cargo specifications sorted alphabetically by name.
/** Sort cargo specifications by their name. */ /** Sort cargo specifications by their name. */
static bool CargoSpecNameSorter(const CargoSpec * const &a, const CargoSpec * const &b) 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. */ /* Sort cargo specifications by cargo class and name. */
std::sort(_sorted_cargo_specs.begin(), _sorted_cargo_specs.end(), &CargoSpecClassSorter); 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; _standard_cargo_mask = 0;
uint8 nb_standard_cargo = 0;
_sorted_standard_cargo_specs_size = 0;
for (const auto &cargo : _sorted_cargo_specs) { for (const auto &cargo : _sorted_cargo_specs) {
if (cargo->classes & CC_SPECIAL) break; if (cargo->classes & CC_SPECIAL) break;
_sorted_standard_cargo_specs_size++; nb_standard_cargo++;
SetBit(_standard_cargo_mask, cargo->Index()); 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 };
} }

View File

@@ -15,6 +15,8 @@
#include "gfx_type.h" #include "gfx_type.h"
#include "strings_type.h" #include "strings_type.h"
#include "landscape_type.h" #include "landscape_type.h"
#include "core/bitmath_func.hpp"
#include "core/span_type.hpp"
#include <vector> #include <vector>
/** Globally unique label of a cargo type. */ /** Globally unique label of a cargo type. */
@@ -190,7 +192,7 @@ CargoID GetDefaultCargoID(LandscapeID l, CargoType ct);
void InitializeSortedCargoSpecs(); void InitializeSortedCargoSpecs();
extern std::vector<const CargoSpec *> _sorted_cargo_specs; 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 ConvertCargoQuantityToDisplayQuantity(CargoID cargo, uint quantity);
uint ConvertDisplayQuantityToCargoQuantity(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; 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) using SetCargoBitIterator = SetBitIterator<CargoID, CargoTypes>;
/**
* 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++)
#endif /* CARGOTYPE_H */ #endif /* CARGOTYPE_H */

View File

@@ -357,44 +357,54 @@ static inline T ROR(const T x, const uint8 n)
} }
/** /**
* Do an operation for each set bit in a value. * Iterable ensemble of each set bit in a value.
* * @tparam Tbitpos Type of the position variable.
* This macros is used to do an operation for each set * @tparam Tbitset Type of the bitset value.
* 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) \ template <typename Tbitpos = uint, typename Tbitset = uint>
for ( \ struct SetBitIterator {
Tbitset_type ___FESBE_bits = (bitpos_var = (Tbitpos_type)0, bitset_value); \ struct Iterator {
___FESBE_bits != (Tbitset_type)0; \ typedef Tbitpos value_type;
___FESBE_bits = (Tbitset_type)(___FESBE_bits >> 1), bitpos_var++ \ typedef value_type *pointer;
) \ typedef value_type &reference;
if ((___FESBE_bits & 1) != 0) typedef size_t difference_type;
typedef std::forward_iterator_tag iterator_category;
/** explicit Iterator(Tbitset bitset) : bitset(bitset), bitpos(static_cast<Tbitpos>(0))
* Do an operation for each set set bit in a value. {
* this->Validate();
* 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. bool operator==(const Iterator &other) const
* The second parameter is an expression of the bits {
* we need to iterate over. This expression will be return this->bitset == other.bitset && (this->bitset == 0 || this->bitpos == other.bitpos);
* evaluated once. }
* bool operator!=(const Iterator &other) const { return !(*this == other); }
* @param bitpos_var The position counter variable. Tbitpos operator*() const { return this->bitpos; }
* @param bitset_value The value which we check for set bits. Iterator & operator++() { this->Next(); this->Validate(); return *this; }
*/
#define FOR_EACH_SET_BIT(bitpos_var, bitset_value) FOR_EACH_SET_BIT_EX(uint, bitpos_var, uint, bitset_value) 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__) #if defined(__APPLE__)
/* Make endian swapping use Apple's macros to increase speed /* Make endian swapping use Apple's macros to increase speed

View File

@@ -194,8 +194,7 @@ protected:
if (width > this->group_width) this->group_width = width; if (width > this->group_width) this->group_width = width;
} }
uint owner; for (uint owner : SetBitIterator(companies)) {
FOR_EACH_SET_BIT(owner, companies) {
SetDParam(0, owner); SetDParam(0, owner);
int width = (GetStringBoundingBox(STR_DEPARTURES_TOC)).width + 4; int width = (GetStringBoundingBox(STR_DEPARTURES_TOC)).width + 4;
if (width > this->toc_width) this->toc_width = width; if (width > this->toc_width) this->toc_width = width;

View File

@@ -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); bool check_order = (v->First()->current_order.GetLoadType() == OLFB_CARGO_TYPE_LOAD);
if (is_auto_refit) { if (is_auto_refit) {
/* Get a refittable cargo type with waiting cargo for next_station or INVALID_STATION. */ /* Get a refittable cargo type with waiting cargo for next_station or INVALID_STATION. */
CargoID cid;
new_cid = v_start->cargo_type; 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 (check_order && v->First()->current_order.GetCargoLoadType(cid) == OLFB_NO_LOAD) continue;
if (st->goods[cid].cargo.HasCargoFor(next_station.Get(cid))) { 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, /* Try to find out if auto-refitting would succeed. In case the refit is allowed,

View File

@@ -572,8 +572,7 @@ static void DrawRailCatenaryRailway(const TileInfo *ti)
}; };
/* Drawing of pylons is finished, now draw the wires */ /* Drawing of pylons is finished, now draw the wires */
Track t; for (Track t : SetTrackBitIterator(wireconfig[TS_HOME])) {
FOR_EACH_SET_TRACK(t, wireconfig[TS_HOME]) {
SpriteID wire_base = get_wire_sprite(t, (t == halftile_track)); SpriteID wire_base = get_wire_sprite(t, (t == halftile_track));
byte PCPconfig = HasBit(PCPstatus, PCPpositions[t][0]) + byte PCPconfig = HasBit(PCPstatus, PCPpositions[t][0]) +
(HasBit(PCPstatus, PCPpositions[t][1]) << 1); (HasBit(PCPstatus, PCPpositions[t][1]) << 1);

View File

@@ -1033,6 +1033,10 @@ void DeterminePaths(const char *exe, bool only_local_path)
_hotkeys_file = config_dir + "hotkeys.cfg"; _hotkeys_file = config_dir + "hotkeys.cfg";
extern std::string _windows_file; extern std::string _windows_file;
_windows_file = config_dir + "windows.cfg"; _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 #ifdef USE_XDG
if (config_dir == config_home) { if (config_dir == config_home) {

View File

@@ -336,9 +336,8 @@ struct GoalQuestionWindow : public Window {
this->question = stredup(question); this->question = stredup(question);
/* Figure out which buttons we have to enable. */ /* Figure out which buttons we have to enable. */
uint bit;
int n = 0; int n = 0;
FOR_EACH_SET_BIT(bit, button_mask) { for (uint bit : SetBitIterator(button_mask)) {
if (bit >= GOAL_QUESTION_BUTTON_COUNT) break; if (bit >= GOAL_QUESTION_BUTTON_COUNT) break;
this->button[n++] = bit; this->button[n++] = bit;
if (n == 3) break; if (n == 3) break;

View File

@@ -895,7 +895,7 @@ struct PaymentRatesGraphWindow : BaseGraphWindow {
this->CreateNestedTree(); this->CreateNestedTree();
this->vscroll = this->GetScrollbar(WID_CPR_MATRIX_SCROLLBAR); 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_DAYS, _cargo_payment_x_mode == 0);
this->SetWidgetLoweredState(WID_CPR_SPEED, _cargo_payment_x_mode == 1); this->SetWidgetLoweredState(WID_CPR_SPEED, _cargo_payment_x_mode == 1);
@@ -936,8 +936,7 @@ struct PaymentRatesGraphWindow : BaseGraphWindow {
this->excluded_data = 0; this->excluded_data = 0;
int i = 0; int i = 0;
const CargoSpec *cs; for (const CargoSpec *cs : _sorted_standard_cargo_specs) {
FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) {
if (HasBit(_legend_excluded_cargo, cs->Index())) SetBit(this->excluded_data, i); if (HasBit(_legend_excluded_cargo, cs->Index())) SetBit(this->excluded_data, i);
i++; i++;
} }
@@ -950,8 +949,7 @@ struct PaymentRatesGraphWindow : BaseGraphWindow {
return; return;
} }
const CargoSpec *cs; for (const CargoSpec *cs : _sorted_standard_cargo_specs) {
FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) {
SetDParam(0, cs->name); SetDParam(0, cs->name);
Dimension d = GetStringBoundingBox(STR_GRAPH_CARGO_PAYMENT_CARGO); Dimension d = GetStringBoundingBox(STR_GRAPH_CARGO_PAYMENT_CARGO);
d.width += this->legend_width + 4; // colour field d.width += this->legend_width + 4; // colour field
@@ -983,8 +981,7 @@ struct PaymentRatesGraphWindow : BaseGraphWindow {
int pos = this->vscroll->GetPosition(); int pos = this->vscroll->GetPosition();
int max = pos + this->vscroll->GetCapacity(); int max = pos + this->vscroll->GetCapacity();
const CargoSpec *cs; for (const CargoSpec *cs : _sorted_standard_cargo_specs) {
FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) {
if (pos-- > 0) continue; if (pos-- > 0) continue;
if (--max < 0) break; if (--max < 0) break;
@@ -1018,8 +1015,7 @@ struct PaymentRatesGraphWindow : BaseGraphWindow {
case WID_CPR_DISABLE_CARGOES: { case WID_CPR_DISABLE_CARGOES: {
/* Add all cargoes to the excluded lists. */ /* Add all cargoes to the excluded lists. */
int i = 0; int i = 0;
const CargoSpec *cs; for (const CargoSpec *cs : _sorted_standard_cargo_specs) {
FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) {
SetBit(_legend_excluded_cargo, cs->Index()); SetBit(_legend_excluded_cargo, cs->Index());
SetBit(this->excluded_data, i); SetBit(this->excluded_data, i);
i++; i++;
@@ -1032,8 +1028,7 @@ struct PaymentRatesGraphWindow : BaseGraphWindow {
uint row = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_CPR_MATRIX); uint row = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_CPR_MATRIX);
if (row >= this->vscroll->GetCount()) return; if (row >= this->vscroll->GetCount()) return;
const CargoSpec *cs; for (const CargoSpec *cs : _sorted_standard_cargo_specs) {
FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) {
if (row-- > 0) continue; if (row-- > 0) continue;
ToggleBit(_legend_excluded_cargo, cs->Index()); ToggleBit(_legend_excluded_cargo, cs->Index());
@@ -1083,10 +1078,9 @@ struct PaymentRatesGraphWindow : BaseGraphWindow {
this->UpdateExcludedData(); this->UpdateExcludedData();
int i = 0; 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)); 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; this->colours[i] = cs->legend_colour;
for (int j = 0; j != 20; j++) { 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; 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; this->excluded_data = 0;
uint8 i = 0; uint8 i = 0;
const CargoSpec *cs; for (const CargoSpec *cs : _sorted_standard_cargo_specs) {
FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) {
if (!HasBit(this->present_cargoes, cs->Index())) continue; if (!HasBit(this->present_cargoes, cs->Index())) continue;
if (HasBit(legend_excluded_cargo, cs->Index())) SetBit(this->excluded_data, i); if (HasBit(legend_excluded_cargo, cs->Index())) SetBit(this->excluded_data, i);
i++; i++;
@@ -1719,8 +1712,7 @@ struct StationCargoGraphWindow final : BaseGraphWindow {
return; return;
} }
const CargoSpec *cs; for (const CargoSpec *cs : _sorted_standard_cargo_specs) {
FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) {
SetDParam(0, cs->name); SetDParam(0, cs->name);
Dimension d = GetStringBoundingBox(STR_GRAPH_CARGO_PAYMENT_CARGO); Dimension d = GetStringBoundingBox(STR_GRAPH_CARGO_PAYMENT_CARGO);
d.width += this->legend_width + 4; // color field d.width += this->legend_width + 4; // color field
@@ -1752,8 +1744,7 @@ struct StationCargoGraphWindow final : BaseGraphWindow {
int pos = this->vscroll->GetPosition(); int pos = this->vscroll->GetPosition();
int max = pos + this->vscroll->GetCapacity(); int max = pos + this->vscroll->GetCapacity();
const CargoSpec *cs; for (const CargoSpec *cs : _sorted_standard_cargo_specs) {
FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) {
if (!HasBit(this->present_cargoes, cs->Index())) continue; if (!HasBit(this->present_cargoes, cs->Index())) continue;
if (pos-- > 0) continue; if (pos-- > 0) continue;
if (--max < 0) break; if (--max < 0) break;
@@ -1789,8 +1780,7 @@ struct StationCargoGraphWindow final : BaseGraphWindow {
/* Add all cargoes to the excluded lists. */ /* Add all cargoes to the excluded lists. */
this->legend_excluded_cargo = ~static_cast<CargoTypes>(0); this->legend_excluded_cargo = ~static_cast<CargoTypes>(0);
int i = 0; int i = 0;
const CargoSpec *cs; for (const CargoSpec *cs : _sorted_standard_cargo_specs) {
FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) {
if (!HasBit(this->present_cargoes, cs->Index())) continue; if (!HasBit(this->present_cargoes, cs->Index())) continue;
SetBit(this->excluded_data, i); SetBit(this->excluded_data, i);
i++; i++;
@@ -1803,8 +1793,7 @@ struct StationCargoGraphWindow final : BaseGraphWindow {
uint row = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_SCG_MATRIX); uint row = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_SCG_MATRIX);
if (row >= this->vscroll->GetCount()) return; if (row >= this->vscroll->GetCount()) return;
const CargoSpec *cs; for (const CargoSpec *cs : _sorted_standard_cargo_specs) {
FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) {
if (!HasBit(this->present_cargoes, cs->Index())) continue; if (!HasBit(this->present_cargoes, cs->Index())) continue;
if (row-- > 0) continue; if (row-- > 0) continue;
@@ -1850,8 +1839,7 @@ struct StationCargoGraphWindow final : BaseGraphWindow {
this->UpdateExcludedData(); this->UpdateExcludedData();
uint8 i = 0; uint8 i = 0;
const CargoSpec *cs; for (const CargoSpec *cs : _sorted_standard_cargo_specs) {
FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) {
if (!HasBit(this->present_cargoes, cs->Index())) continue; if (!HasBit(this->present_cargoes, cs->Index())) continue;
this->colours[i] = cs->legend_colour; this->colours[i] = cs->legend_colour;

View File

@@ -1376,8 +1376,7 @@ protected:
filter_items++; filter_items++;
/* Collect available cargo types for filtering. */ /* Collect available cargo types for filtering. */
const CargoSpec *cs; for (const CargoSpec *cs : _sorted_standard_cargo_specs) {
FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) {
this->cargo_filter[filter_items] = cs->Index(); this->cargo_filter[filter_items] = cs->Index();
this->cargo_filter_texts[filter_items] = cs->name; this->cargo_filter_texts[filter_items] = cs->name;
filter_items++; filter_items++;
@@ -3003,8 +3002,7 @@ struct IndustryCargoesWindow : public Window {
case WID_IC_CARGO_DROPDOWN: { case WID_IC_CARGO_DROPDOWN: {
DropDownList lst; DropDownList lst;
const CargoSpec *cs; for (const CargoSpec *cs : _sorted_standard_cargo_specs) {
FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) {
lst.emplace_back(new DropDownListStringItem(cs->name, cs->Index(), false)); lst.emplace_back(new DropDownListStringItem(cs->name, cs->Index(), false));
} }
if (!lst.empty()) { if (!lst.empty()) {

View File

@@ -100,6 +100,29 @@ IniItem *IniGroup::GetItem(const std::string &name, bool create)
return new IniItem(this, name); 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 * Clear all items in the group
*/ */

View File

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

View File

@@ -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_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_SELF_TOOLTIP :{BLACK}Esse é você
STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP :{BLACK}Esse é o hospedeiro do jogo 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_KICK :Expulsar
STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Banir STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Banir

View File

@@ -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_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_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_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_KICK :Treu
STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Expulsa STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Expulsa

View File

@@ -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_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_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_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_KICK :Eruit schoppen
STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Bannen STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Bannen

View File

@@ -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_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_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_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_KICK :Kick
STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Ban STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Ban

View File

@@ -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_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_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_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_KICK :Hinauswerfen
STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Bannen STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Bannen

View File

@@ -62,6 +62,7 @@ STR_COLOUR_RED :लाल
# Units used in OpenTTD # 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}ध्वनि/संगीत विकल्प STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW :{BLACK}ध्वनि/संगीत विकल्प
# Extra tooltips for the scenario editor toolbar # Extra tooltips for the scenario editor toolbar
STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}मानचित्र, नगर निर्देशिका दिखायें
############ range for SE file menu starts ############ range for SE file menu starts
STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_SEPARATOR :
STR_SCENEDIT_FILE_MENU_QUIT :निकास
############ range for SE file menu starts ############ range for SE file menu starts
############ range for settings menu starts ############ range for settings menu starts
@@ -184,6 +187,7 @@ STR_COMPANY_LEAGUE_COMPANY_NAME :{ORANGE}{COMPAN
# Performance detail window # Performance detail window
############ Those following lines need to be in this order!! ############ Those following lines need to be in this order!!
STR_PERFORMANCE_DETAIL_VEHICLES :{BLACK}वाहन: STR_PERFORMANCE_DETAIL_VEHICLES :{BLACK}वाहन:
STR_PERFORMANCE_DETAIL_CARGO :{BLACK}माल :
############ End of order list ############ End of order list
# Music window # Music window
@@ -211,6 +215,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * ठ
STR_NEWS_CUSTOM_ITEM :{BIG_FONT}{BLACK}{STRING} 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 # Order review system / warnings
@@ -238,6 +244,7 @@ STR_NEWS_NEW_VEHICLE_TYPE :{BIG_FONT}{BLAC
############ start of currency region ############ start of currency region
STR_GAME_OPTIONS_CURRENCY_FIM :फिनलैंड मार्का (FIM) STR_GAME_OPTIONS_CURRENCY_FIM :फिनलैंड मार्का (FIM)
STR_GAME_OPTIONS_CURRENCY_ISK :आइसलैंडिक क्रोना (ISK)
STR_GAME_OPTIONS_CURRENCY_HKD :हाँग काँग डॉलर (एचकेडी) STR_GAME_OPTIONS_CURRENCY_HKD :हाँग काँग डॉलर (एचकेडी)
############ end of currency region ############ end of currency region
@@ -338,6 +345,7 @@ STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS :दुर्घ
STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM}
STR_CONFIG_SETTING_TOWN_CARGOGENMODE :नगर में माल उत्पादन: {STRING}
STR_CONFIG_SETTING_SOFT_LIMIT_VALUE :{COMMA} 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_INTERFACE_GENERAL :{ORANGE}सामान्य
STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS_HELPTEXT :नौकाओं द्वारा उपयोग किया जाने वाला पथान्वेषी
# Config errors # Config errors
# Video initalization errors # Video initalization errors
STR_VIDEO_DRIVER_ERROR :{WHITE}वीडियो विन्यास में त्रुटि...
# Intro window # Intro window
@@ -366,6 +376,7 @@ STR_INTRO_PLAY_HEIGHTMAP :{BLACK}उभ
STR_INTRO_TOOLTIP_SCENARIO_EDITOR :{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 # Airport construction window
STR_AIRPORT_INTERCONTINENTAL :अंतरमहाद्वीपीय
STR_AIRPORT_CLASS_SMALL :लघु विमानतल STR_AIRPORT_CLASS_SMALL :लघु विमानतल
# Landscaping toolbar # Landscaping toolbar
STR_LANDSCAPING_TOOLBAR :{WHITE}भूदृश्य निर्माण
# Object construction window # Object construction window
@@ -541,6 +555,7 @@ STR_INDUSTRY_CARGOES_SELECT_INDUSTRY :{BLACK}उद
STR_LAI_CLEAR_DESCRIPTION_BARE_LAND :रिक्त भूमि STR_LAI_CLEAR_DESCRIPTION_BARE_LAND :रिक्त भूमि
STR_LAI_ROAD_DESCRIPTION_TREE_LINED_ROAD :वृक्ष आच्छादित सड़क
# Houses come directly from their building names # 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 # NewGRF save preset window
@@ -640,6 +656,7 @@ STR_TOWN_VIEW_EXPAND_BUTTON :{BLACK}फै
# Town local authority window # Town local authority window
STR_LOCAL_AUTHORITY_ACTION_SMALL_ADVERTISING_CAMPAIGN :लघु विज्ञापन अभियान
# Goal window # Goal window
@@ -653,6 +670,7 @@ STR_GOALS_PROGRESS_COMPLETE :{GREEN}{STRING}
############ End of Goal Question button list ############ End of Goal Question button list
# Subsidies window # Subsidies window
STR_SUBSIDIES_OFFERED_TITLE :{BLACK}इन सेवाओं के लिये अनुदान प्रस्तावित :
# Story book window # Story book window
STR_STORY_BOOK_TITLE :{YELLOW}{STRING} 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_ROAD_VEHICLE_HIDE_TOGGLE_BUTTON :{BLACK}छिपायें
STR_BUY_VEHICLE_SHIP_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}नौका प्रकार को छिपायें/दिखायें
# Depot window # 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 # 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 # 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 # Order related errors
STR_ERROR_CAN_T_COPY_SHARE_ORDER :{WHITE}... वाहन सभी स्टेशनों तक नहीं जा सकता
# Timetable related errors # Timetable related errors
@@ -1049,10 +1072,12 @@ STR_SV_STNAME_WAYPOINT :{STRING}
# Vehicle names # Vehicle names
STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COAL_CAR :कोयला वाहन STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COAL_CAR :कोयला वाहन
STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_FRUIT_TRUCK :फल वाहन 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_MONORAIL_TOY_VAN :खिलौनों का डब्बा
STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_BUBBLE_VAN :बबल वैन STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_BUBBLE_VAN :बबल वैन
STR_VEHICLE_NAME_ROAD_VEHICLE_PLODDYPHUT_MKIII_BUS :प्लॉडीपीहट एमके३ बस STR_VEHICLE_NAME_ROAD_VEHICLE_PLODDYPHUT_MKIII_BUS :प्लॉडीपीहट एमके३ बस
STR_VEHICLE_NAME_ROAD_VEHICLE_FOSTER_ARMORED_TRUCK :फोस्टर कवचयुक्त ट्रक 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_COTSWALD_LB_3 :बेकवेल कॉट्सवॉल्ड एलबी-३
STR_VEHICLE_NAME_AIRCRAFT_BAKEWELL_LUCKETT_LB_9 :बेकवेल लकेट एलबी-९ STR_VEHICLE_NAME_AIRCRAFT_BAKEWELL_LUCKETT_LB_9 :बेकवेल लकेट एलबी-९
STR_VEHICLE_NAME_AIRCRAFT_BAKEWELL_LUCKETT_LB80 :बेकवेल लकेट एलबी८० STR_VEHICLE_NAME_AIRCRAFT_BAKEWELL_LUCKETT_LB80 :बेकवेल लकेट एलबी८०
@@ -1090,6 +1115,7 @@ STR_COMPANY_NAME :{COMPANY}
STR_COMPANY_NAME_COMPANY_NUM :{COMPANY} {COMPANY_NUM} STR_COMPANY_NAME_COMPANY_NUM :{COMPANY} {COMPANY_NUM}
STR_DEPOT_NAME :{DEPOT} STR_DEPOT_NAME :{DEPOT}
STR_ENGINE_NAME :{ENGINE} STR_ENGINE_NAME :{ENGINE}
STR_HIDDEN_ENGINE_NAME :{ENGINE} (प्रच्छन्न)
STR_GROUP_NAME :{GROUP} STR_GROUP_NAME :{GROUP}
STR_INDUSTRY_NAME :{INDUSTRY} STR_INDUSTRY_NAME :{INDUSTRY}
STR_PRESIDENT_NAME :{PRESIDENT_NAME} STR_PRESIDENT_NAME :{PRESIDENT_NAME}

View File

@@ -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_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_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_CLIENTS_SELECT :{BLACK}{NUM} client
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Limite 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 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 # 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_SERVER :Server
STR_NETWORK_CLIENT :Client STR_NETWORK_CLIENT :Client

View File

@@ -1204,6 +1204,7 @@ STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS :車両故障: {
STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT :点検が不十分な車両が故障する頻度を設定します STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT :点検が不十分な車両が故障する頻度を設定します
STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER :助成金の乗数: {STRING} STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER :助成金の乗数: {STRING}
STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT :助成金対象の路線に対して、通常の輸送相場の何倍が支払われるかを設定します STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT :助成金対象の路線に対して、通常の輸送相場の何倍が支払われるかを設定します
STR_CONFIG_SETTING_SUBSIDY_DURATION :助成期間: {STRING}
STR_CONFIG_SETTING_CONSTRUCTION_COSTS :建設費: {STRING} STR_CONFIG_SETTING_CONSTRUCTION_COSTS :建設費: {STRING}
STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :建設・購入費用のレベルを設定します STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :建設・購入費用のレベルを設定します
STR_CONFIG_SETTING_RECESSIONS :景気後退: {STRING} STR_CONFIG_SETTING_RECESSIONS :景気後退: {STRING}

View File

@@ -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_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_SELF_TOOLTIP :{BLACK}Dette er deg
STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP :{BLACK}Dette er verten for spillet 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_KICK :Spark
STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Utesteng STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Utesteng

View File

@@ -305,10 +305,10 @@ STR_SORT_BY_LENGTH :Longitud
STR_SORT_BY_LIFE_TIME :Vida útil restante STR_SORT_BY_LIFE_TIME :Vida útil restante
STR_SORT_BY_TIMETABLE_DELAY :Retraso en itinerario STR_SORT_BY_TIMETABLE_DELAY :Retraso en itinerario
STR_SORT_BY_FACILITY :Tipo de estación STR_SORT_BY_FACILITY :Tipo de estación
STR_SORT_BY_WAITING_TOTAL :Cargamento total en espera STR_SORT_BY_WAITING_TOTAL :Carga total en espera
STR_SORT_BY_WAITING_AVAILABLE :Cargamento disponible 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_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_ENGINE_ID :Id. locomotora (orden clásico)
STR_SORT_BY_COST :Costo STR_SORT_BY_COST :Costo
STR_SORT_BY_POWER :Potencia 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_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_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_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_IN :{BLACK}Acercar
STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}Alejar vista 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_RAILROAD_TRACK :{BLACK}Construir vías férreas
STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}Construir carreteras STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}Construir carreteras
STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}Construir tranvías STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}Construir tranvías
@@ -418,7 +418,7 @@ STR_FILE_MENU_EXIT :Salir
# map menu # map menu
STR_MAP_MENU_MAP_OF_WORLD :Minimapa completo STR_MAP_MENU_MAP_OF_WORLD :Minimapa completo
STR_MAP_MENU_EXTRA_VIEWPORT :Ventana de vista adicional 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 STR_MAP_MENU_SIGN_LIST :Lista de carteles
############ range for town menu starts ############ range for town menu starts
@@ -433,10 +433,10 @@ STR_SUBSIDIES_MENU_SUBSIDIES :Subsidios
############ range for graph menu starts ############ range for graph menu starts
STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH :Gráfica de utilidades operativas STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH :Gráfica de utilidades operativas
STR_GRAPH_MENU_INCOME_GRAPH :Gráfica de ingresos 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_PERFORMANCE_HISTORY_GRAPH :Gráfica de desempeño
STR_GRAPH_MENU_COMPANY_VALUE_GRAPH :Gráfica del valor de la empresa 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 ends here
############ range for company league menu starts ############ 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_OPERATING_PROFIT_CAPTION :{WHITE}Gráfica de utilidad operativa
STR_GRAPH_INCOME_CAPTION :{WHITE}Gráfica de ingresos 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_PERFORMANCE_RATINGS_CAPTION :{WHITE}Nivel de desempeño (nivel máximo: 1000)
STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Valor de la empresa 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_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_ENABLE_ALL :{TINY_FONT}{BLACK}Activar todos
STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}Desactivar 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_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 tarifas de pago por cargamento 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}Mostrar u ocultar gráfica de este tipo de cargamento 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_CARGO_PAYMENT_CARGO :{TINY_FONT}{BLACK}{STRING}
STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP :{BLACK}Mostrar detalles de nivel de desempeño STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP :{BLACK}Mostrar detalles de nivel de desempeño
# Graph key window # Graph key window
STR_GRAPH_KEY_CAPTION :{WHITE}Leyenda de gráfica 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 # Company league window
STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Tabla de evaluación de empresas 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_MIN_INCOME :{BLACK}Ingreso mín.:
STR_PERFORMANCE_DETAIL_MAX_INCOME :{BLACK}Ingreso máx.: STR_PERFORMANCE_DETAIL_MAX_INCOME :{BLACK}Ingreso máx.:
STR_PERFORMANCE_DETAIL_DELIVERED :{BLACK}Entregado: 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_MONEY :{BLACK}Dinero:
STR_PERFORMANCE_DETAIL_LOAN :{BLACK}Préstamo: STR_PERFORMANCE_DETAIL_LOAN :{BLACK}Préstamo:
STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}Total: STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}Total:
@@ -720,20 +720,20 @@ STR_SMALLMAP_CAPTION :{WHITE}Mapa: {S
STR_SMALLMAP_TYPE_CONTOURS :Contornos STR_SMALLMAP_TYPE_CONTOURS :Contornos
STR_SMALLMAP_TYPE_VEHICLES :Vehículos STR_SMALLMAP_TYPE_VEHICLES :Vehículos
STR_SMALLMAP_TYPE_INDUSTRIES :Industrias 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_ROUTES :Rutas
STR_SMALLMAP_TYPE_VEGETATION :Vegetación STR_SMALLMAP_TYPE_VEGETATION :Vegetación
STR_SMALLMAP_TYPE_OWNERS :Propietarios STR_SMALLMAP_TYPE_OWNERS :Propietarios
STR_SMALLMAP_TOOLTIP_SHOW_LAND_CONTOURS_ON_MAP :{BLACK}Mostrar elevaciones en el mapa 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_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_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_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_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_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_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_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_ROADS :{TINY_FONT}{BLACK}Carreteras
STR_SMALLMAP_LEGENDA_RAILROADS :{TINY_FONT}{BLACK}Ferrocarriles 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_COMPANY :{TINY_FONT}{COMPANY}
STR_SMALLMAP_TOWN :{TINY_FONT}{WHITE}{TOWN} STR_SMALLMAP_TOWN :{TINY_FONT}{WHITE}{TOWN}
STR_SMALLMAP_DISABLE_ALL :{BLACK}Ocultar todo 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_SHOW_HEIGHT :{BLACK}Mostrar elevación
STR_SMALLMAP_TOOLTIP_DISABLE_ALL_INDUSTRIES :{BLACK}No mostrar industrias en el mapa 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_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_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_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_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_DISABLE_ALL_CARGOS :{BLACK}Ocultar todas las cargas del mapa
STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}Muestra todos los cargamentos en el mapa STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}Mostrar todas las cargas en el mapa
# Status bar messages # Status bar messages
STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Mostrar último mensaje o noticia 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_2X_ZOOM :Doble
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Cuádruple 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_TOOLTIP :{BLACK}Elegir qué tamaño de letra usar en la interfaz
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(detectar) 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_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 :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_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 :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 los pueblos 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 :Longitud máxima de trenes: {STRING}
STR_CONFIG_SETTING_TRAIN_LENGTH_HELPTEXT :Longitud máxima permitida para los trenes STR_CONFIG_SETTING_TRAIN_LENGTH_HELPTEXT :Longitud máxima permitida para los trenes
STR_CONFIG_SETTING_TILE_LENGTH :{COMMA} casilla{P 0 "" s} 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_RAW_INDUSTRY_CONSTRUCTION_METHOD_PROSPECTING :Prospección
STR_CONFIG_SETTING_INDUSTRY_PLATFORM :Área plana alrededor de industrias: {STRING} 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_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 :Permitir varias industrias similares por localidad: {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_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 :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_HELPTEXT :De qué lado de las vías se instalarán las señales
STR_CONFIG_SETTING_SIGNALSIDE_LEFT :A la izquierda 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_MAIN_VIEWPORT :Vista principal
STR_CONFIG_SETTING_AUTOSCROLL_EVERY_VIEWPORT :Todas las vistas STR_CONFIG_SETTING_AUTOSCROLL_EVERY_VIEWPORT :Todas las vistas
STR_CONFIG_SETTING_BRIBE :Permitir sobornos al ayuntamiento: {STRING} 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 :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 :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_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} 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 :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_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 :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 :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_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} 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_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_VALUE :Posar el ratón {COMMA} milisegundo{P 0 "" s}
STR_CONFIG_SETTING_HOVER_DELAY_DISABLED :Botón derecho 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 :Mostrar población de localidades: {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_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 :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_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 :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_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 :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 :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_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 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 :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_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 :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_SNOW_COVERAGE_VALUE :{NUM}%
STR_CONFIG_SETTING_DESERT_COVERAGE :Extensión de desierto: {STRING} 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. 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 :Vehículos: {STRING}
STR_CONFIG_SETTING_SOUND_VEHICLE_HELPTEXT :Reproducir efectos de sonido de vehículos 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 :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 :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 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 :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_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 :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 :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_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} 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_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 :Nuevos vehículos: {STRING}
STR_CONFIG_SETTING_NEWS_NEW_VEHICLES_HELPTEXT :Mostrar noticias sobre nuevos tipos de vehículos disponibles 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 :Cambios en la aceptación de carga: {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_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 :Subsidios: {STRING}
STR_CONFIG_SETTING_NEWS_SUBSIDIES_HELPTEXT :Mostrar noticias sobre eventos relacionados con subsidios STR_CONFIG_SETTING_NEWS_SUBSIDIES_HELPTEXT :Mostrar noticias sobre eventos relacionados con subsidios
STR_CONFIG_SETTING_NEWS_GENERAL_INFORMATION :Información general: {STRING} 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 :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_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 :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_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 :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 :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_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} 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_2X2_GRID :Rejilla de 2×2
STR_CONFIG_SETTING_TOWN_LAYOUT_3X3_GRID :Rejilla de 3×3 STR_CONFIG_SETTING_TOWN_LAYOUT_3X3_GRID :Rejilla de 3×3
STR_CONFIG_SETTING_TOWN_LAYOUT_RANDOM :Aleatorio 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 :Permitir a las localidades construir 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_ROADS_HELPTEXT :Los ayuntamientos construyen carreteras para que las localidades se expandan. Desactivar para impedirlo
STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Permitir a los pueblos construir pasos a nivel: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Permitir a las localidades construir pasos a nivel: {STRING}
STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Los pueblos podrán construir pasos a nivel 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 a los pueblos controlar el nivel de ruido de los aeropuertos: {STRING} STR_CONFIG_SETTING_NOISE_LEVEL :Permitir el ruido de aeropuertos controlado por localidades: {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_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 :Fundar pueblos: {STRING}
STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Los jugadores podrán crear nuevos pueblos durante la partida 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_FORBIDDEN :Prohibido
STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED :Permitido STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED :Permitido
STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED_CUSTOM_LAYOUT :Permitido, diseño urbano personalizado 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 :Generación de carga en pueblos: {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_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_ORIGINAL :Cuadrado
STR_CONFIG_SETTING_TOWN_CARGOGENMODE_BITCOUNT :Lineal 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_NORMAL :Normal
STR_CONFIG_SETTING_TOWN_GROWTH_FAST :Rápida STR_CONFIG_SETTING_TOWN_GROWTH_FAST :Rápida
STR_CONFIG_SETTING_TOWN_GROWTH_VERY_FAST :Muy 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 :Proporción de localidades 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_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_VALUE :1 de cada {COMMA}
STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :Ninguno 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 :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 :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 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_ASYMMETRIC :Asimétrica
STR_CONFIG_SETTING_DISTRIBUTION_SYMMETRIC :Simé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 :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 :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 :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_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 otro cargamento: {STRING} 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 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_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 :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 :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_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 cargamento a devolver en modo simétrico: {STRING} STR_CONFIG_SETTING_DEMAND_SIZE :Cantidad de carga en retorno 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_SIZE_HELPTEXT :Con un valor menor de 100% la distribución simétrica de carga se 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 :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 :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 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_GENWORLD :{ORANGE}Generación de mapa
STR_CONFIG_SETTING_ENVIRONMENT :{ORANGE}Ambiente STR_CONFIG_SETTING_ENVIRONMENT :{ORANGE}Ambiente
STR_CONFIG_SETTING_ENVIRONMENT_AUTHORITIES :{ORANGE}Autoridades 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_INDUSTRIES :{ORANGE}Industrias
STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :{ORANGE}Distribución de carga STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :{ORANGE}Distribución de carga
STR_CONFIG_SETTING_AI :{ORANGE}Competidores 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_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_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_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_KICK :Expulsar
STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Bloquear acceso 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 STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Ocultar objetos totalmente
# Linkgraph legend window # 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_ALL :{BLACK}Todas
STR_LINKGRAPH_LEGEND_NONE :{BLACK}Ninguna STR_LINKGRAPH_LEGEND_NONE :{BLACK}Ninguna
STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Elegir las empresas a mostrar 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 # Industry cargoes window
STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Cadena industrial para la industria de {STRING} 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_PRODUCERS :{WHITE}Industrias proveedoras
STR_INDUSTRY_CARGOES_CUSTOMERS :{WHITE}Industrias receptoras STR_INDUSTRY_CARGOES_CUSTOMERS :{WHITE}Industrias receptoras
STR_INDUSTRY_CARGOES_HOUSES :{WHITE}Casas 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_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_CARGOES_CARGO_TOOLTIP :{BLACK}{STRING}{}Clic en la carga para ver sus proveedores y clientes
STR_INDUSTRY_DISPLAY_CHAIN :{BLACK}Mostrar cadena STR_INDUSTRY_DISPLAY_CHAIN :{BLACK}Mostrar cadena industrial
STR_INDUSTRY_DISPLAY_CHAIN_TOOLTIP :{BLACK}Mostrar las industrias que proveen y aceptan el cargamento 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 :{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_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 :{BLACK}Elegir carga
STR_INDUSTRY_CARGOES_SELECT_CARGO_TOOLTIP :{BLACK}Elegir el tipo de cargamento a mostrar 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 :{BLACK}Elegir industria
STR_INDUSTRY_CARGOES_SELECT_INDUSTRY_TOOLTIP :{BLACK}Elegir la industria a mostrar 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_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_AIRPORTTILE_NAME :{BLACK}Nombre de casilla del aeropuerto: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {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_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_RAIL_TYPE :{BLACK}Tipo de vía: {LTBLUE}{STRING}
STR_LANG_AREA_INFORMATION_ROAD_TYPE :{BLACK}Tipo de carretera: {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 STR_FRAMERATE_GRAPH_SECONDS :{TINY_FONT}{COMMA} s
############ Leave those lines in this order!! ############ Leave those lines in this order!!
STR_FRAMERATE_GAMELOOP :{BLACK}Bucles de juego totales: 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_TRAINS :{BLACK} Ticks de trenes:
STR_FRAMERATE_GL_ROADVEHS :{BLACK} Ticks de vehículos de carretera: STR_FRAMERATE_GL_ROADVEHS :{BLACK} Ticks de vehículos de carretera:
STR_FRAMERATE_GL_SHIPS :{BLACK} Ticks de barcos: STR_FRAMERATE_GL_SHIPS :{BLACK} Ticks de barcos:
@@ -2859,7 +2860,7 @@ STR_FRAMERATE_AI :{BLACK} IA {NUM
############ End of leave-in-this-order ############ End of leave-in-this-order
############ Leave those lines in this order!! ############ Leave those lines in this order!!
STR_FRAMETIME_CAPTION_GAMELOOP :Bucle de juego 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_TRAINS :Ticks de trenes
STR_FRAMETIME_CAPTION_GL_ROADVEHS :Ticks de vehículos de carretera STR_FRAMETIME_CAPTION_GL_ROADVEHS :Ticks de vehículos de carretera
STR_FRAMETIME_CAPTION_GL_SHIPS :Ticks de barcos 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_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 :{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_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_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 # '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_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_ENGINE :<modelo de vehículo no válido>
STR_NEWGRF_INVALID_INDUSTRYTYPE :<industria no válida> 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_CITY_CAPTION :{WHITE}{TOWN} (ciudad)
STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Habitantes: {ORANGE}{COMMA}{BLACK} Casas: {ORANGE}{COMMA} 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_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_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_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} requerido en invierno
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED_GENERAL :{ORANGE}{STRING}{GREEN} entregado 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_WAYPOINT :{YELLOW}{WAYPOINT}
STR_STATION_LIST_NONE :{YELLOW}- Ninguna - 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_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_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}Ningún tipo de cargamento está esperando STR_STATION_LIST_NO_WAITING_CARGO :{BLACK}No hay ninguna carga esperando
# Station view window # Station view window
STR_STATION_VIEW_CAPTION :{WHITE}{STATION} {STATION_FEATURES} 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_RESERVED :{YELLOW}({CARGO_SHORT} reservado para cargar)
STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Acepta 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_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. 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_PROD3 :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING}
STR_INDUSTRY_DIRECTORY_ITEM_PRODMORE :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} y {NUM} más... 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_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_PRODUCED_CARGO_FILTER :{BLACK}Cargemento producido: {SILVER}{STRING}
STR_INDUSTRY_DIRECTORY_FILTER_ALL_TYPES :Todos los tipos STR_INDUSTRY_DIRECTORY_FILTER_ALL_TYPES :Todos los tipos
STR_INDUSTRY_DIRECTORY_FILTER_NONE :Ninguno 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_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_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 transportar otro tipo de cargamento 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 que transporte otro tipo de cargamento 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 cargamento 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_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 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 :{LTBLUE}{CARGO_LONG} desde {STATION}
STR_VEHICLE_DETAILS_CARGO_FROM_MULT :{LTBLUE}{CARGO_LONG} desde {STATION} (×{NUM}) 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_DETAILS_TRAIN_CARGO_TOOLTIP :{BLACK}Mostrar detalles de mercancía transportada
STR_VEHICLE_DETAIL_TAB_INFORMATION :{BLACK}Información STR_VEHICLE_DETAIL_TAB_INFORMATION :{BLACK}Información
STR_VEHICLE_DETAILS_TRAIN_INFORMATION_TOOLTIP :{BLACK}Mostrar detalles de los vehículos STR_VEHICLE_DETAILS_TRAIN_INFORMATION_TOOLTIP :{BLACK}Mostrar detalles de los vehículos
STR_VEHICLE_DETAIL_TAB_CAPACITIES :{BLACK}Capacidades STR_VEHICLE_DETAIL_TAB_CAPACITIES :{BLACK}Capacidades
STR_VEHICLE_DETAILS_TRAIN_CAPACITIES_TOOLTIP :{BLACK}Mostrar capacidades de cada vehículo del tren 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_DETAIL_TAB_TOTAL_CARGO :{BLACK}Carga total
STR_VEHICLE_DETAILS_TRAIN_TOTAL_CARGO_TOOLTIP :{BLACK}Mostrar capacidad total del tren dividida por tipo de cargamento 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} STR_VEHICLE_DETAILS_TRAIN_ARTICULATED_RV_CAPACITY :{BLACK}Capacidad: {LTBLUE}
# Vehicle refit # Vehicle refit
STR_REFIT_CAPTION :{WHITE}{VEHICLE} (reformar) 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_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_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_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_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_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_TRAIN_LIST_TOOLTIP :{BLACK}Elegir el tipo de carga para el tren
STR_REFIT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Elegir el tipo de cargamento para el vehículo de carretera 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 cargamento para el barco STR_REFIT_SHIP_LIST_TOOLTIP :{BLACK}Elegir el tipo de carga para el barco
STR_REFIT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Elegir el tipo de cargamento para la aeronave STR_REFIT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Elegir el tipo de carga para la aeronave
STR_REFIT_TRAIN_REFIT_BUTTON :{BLACK}Reformar tren STR_REFIT_TRAIN_REFIT_BUTTON :{BLACK}Reformar tren
STR_REFIT_ROAD_VEHICLE_REFIT_BUTTON :{BLACK}Reformar vehículo de carretera STR_REFIT_ROAD_VEHICLE_REFIT_BUTTON :{BLACK}Reformar vehículo de carretera
STR_REFIT_SHIP_REFIT_BUTTON :{BLACK}Reformar barco STR_REFIT_SHIP_REFIT_BUTTON :{BLACK}Reformar barco
STR_REFIT_AIRCRAFT_REFIT_BUTTON :{BLACK}Reformar aeronave STR_REFIT_AIRCRAFT_REFIT_BUTTON :{BLACK}Reformar aeronave
STR_REFIT_TRAIN_REFIT_TOOLTIP :{BLACK}Reformar el tren 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 el cargamento elegido 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 el cargamento elegido 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 el cargamento elegido STR_REFIT_AIRCRAFT_REFIT_TOOLTIP :{BLACK}Reformar la aeronave para transportar la carga elegida
# Order view # Order view
STR_ORDERS_CAPTION :{WHITE}{VEHICLE} (Órdenes) 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_TOOLTIP_UNLOAD :{BLACK}Cambiar la forma de descarga en la orden resaltada
STR_ORDER_REFIT :{BLACK}Reformar 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 :{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_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 :Cargamento fijo STR_ORDER_DROP_REFIT_AUTO :Carga fija
STR_ORDER_DROP_REFIT_AUTO_ANY :Cargamento disponible STR_ORDER_DROP_REFIT_AUTO_ANY :Carga disponible
STR_ORDER_SERVICE :{BLACK}Mantenimiento STR_ORDER_SERVICE :{BLACK}Mantenimiento
STR_ORDER_DROP_GO_ALWAYS_DEPOT :Ir siempre 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_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_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_NEAR_END :[principio]
STR_ORDER_STOP_LOCATION_MIDDLE :[centro] STR_ORDER_STOP_LOCATION_MIDDLE :[centro]

View File

@@ -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) { 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; LinkCacheItem *item = nullptr;
CargoID c; for (CargoID c : SetCargoBitIterator(this->cargo_mask)) {
FOR_EACH_SET_CARGO_ID(c, this->cargo_mask) {
if (!CargoSpec::Get(c)->IsValid()) continue; if (!CargoSpec::Get(c)->IsValid()) continue;
const GoodsEntry &ge = from->goods[c]; const GoodsEntry &ge = from->goods[c];
if (!LinkGraph::IsValidID(ge.link_graph) || if (!LinkGraph::IsValidID(ge.link_graph) ||
@@ -188,8 +187,7 @@ void LinkGraphOverlay::RebuildCache(bool incremental)
StationID from = sta->index; StationID from = sta->index;
uint supply = 0; uint supply = 0;
CargoID c; for (CargoID c : SetCargoBitIterator(this->cargo_mask)) {
FOR_EACH_SET_CARGO_ID(c, this->cargo_mask) {
if (!CargoSpec::Get(c)->IsValid()) continue; if (!CargoSpec::Get(c)->IsValid()) continue;
if (!LinkGraph::IsValidID(sta->goods[c].link_graph)) continue; if (!LinkGraph::IsValidID(sta->goods[c].link_graph)) continue;
const LinkGraph &lg = *LinkGraph::Get(sta->goods[c].link_graph); const LinkGraph &lg = *LinkGraph::Get(sta->goods[c].link_graph);

View File

@@ -967,8 +967,7 @@ static bool ReadSpriteLayout(ByteReader *buf, uint num_building_sprites, bool us
static CargoTypes TranslateRefitMask(uint32 refit_mask) static CargoTypes TranslateRefitMask(uint32 refit_mask)
{ {
CargoTypes result = 0; CargoTypes result = 0;
uint8 bit; for (uint8 bit : SetBitIterator(refit_mask)) {
FOR_EACH_SET_BIT(bit, refit_mask) {
CargoID cargo = GetCargoTranslation(bit, _cur.grffile, true); CargoID cargo = GetCargoTranslation(bit, _cur.grffile, true);
if (cargo != CT_INVALID) SetBit(result, cargo); if (cargo != CT_INVALID) SetBit(result, cargo);
} }
@@ -9679,8 +9678,7 @@ static void CalculateRefitMasks()
if (cargo_map_for_first_refittable != nullptr) { if (cargo_map_for_first_refittable != nullptr) {
/* Use first refittable cargo from cargo translation table */ /* Use first refittable cargo from cargo translation table */
byte best_local_slot = 0xFF; byte best_local_slot = 0xFF;
CargoID cargo_type; for (CargoID cargo_type : SetCargoBitIterator(ei->refit_mask)) {
FOR_EACH_SET_CARGO_ID(cargo_type, ei->refit_mask) {
byte local_slot = cargo_map_for_first_refittable[cargo_type]; byte local_slot = cargo_map_for_first_refittable[cargo_type];
if (local_slot < best_local_slot) { if (local_slot < best_local_slot) {
best_local_slot = local_slot; best_local_slot = local_slot;

View File

@@ -814,8 +814,7 @@ bool DrawStationTile(int x, int y, RailType railtype, Axis axis, StationClassID
/* Sprite layout which needs preprocessing */ /* Sprite layout which needs preprocessing */
bool separate_ground = HasBit(statspec->flags, SSF_SEPARATE_GROUND); bool separate_ground = HasBit(statspec->flags, SSF_SEPARATE_GROUND);
uint32 var10_values = layout->PrepareLayout(total_offset, rti->fallback_railtype, 0, 0, separate_ground); uint32 var10_values = layout->PrepareLayout(total_offset, rti->fallback_railtype, 0, 0, separate_ground);
uint8 var10; for (uint8 var10 : SetBitIterator(var10_values)) {
FOR_EACH_SET_BIT(var10, var10_values) {
uint32 var10_relocation = GetCustomStationRelocation(statspec, nullptr, INVALID_TILE, railtype, var10); uint32 var10_relocation = GetCustomStationRelocation(statspec, nullptr, INVALID_TILE, railtype, var10);
layout->ProcessRegisters(var10, var10_relocation, separate_ground); layout->ProcessRegisters(var10, var10_relocation, separate_ground);
} }

View File

@@ -316,9 +316,8 @@ public:
template <typename F> CargoTypes FilterLoadUnloadTypeCargoMask(F filter_func, CargoTypes cargo_mask = ALL_CARGOTYPES) 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)) { if ((this->GetLoadType() == OLFB_CARGO_TYPE_LOAD) || (this->GetUnloadType() == OUFB_CARGO_TYPE_UNLOAD)) {
CargoID cargo;
CargoTypes output_mask = cargo_mask; 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); if (!filter_func(this, cargo)) ClrBit(output_mask, cargo);
} }
return output_mask; return output_mask;
@@ -569,9 +568,8 @@ public:
template <typename F> CargoTypes FilterCargoMask(F filter_func, CargoTypes cargo_mask = ALL_CARGOTYPES) template <typename F> CargoTypes FilterCargoMask(F filter_func, CargoTypes cargo_mask = ALL_CARGOTYPES)
{ {
CargoID cargo;
CargoTypes output_mask = cargo_mask; 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); if (!filter_func(cargo)) ClrBit(output_mask, cargo);
} }
return output_mask; return output_mask;
@@ -583,8 +581,7 @@ template <typename T, typename F> T CargoMaskValueFilter(CargoTypes &cargo_mask,
T value = filter_func(first_cargo_id); T value = filter_func(first_cargo_id);
CargoTypes other_cargo_mask = cargo_mask; CargoTypes other_cargo_mask = cargo_mask;
ClrBit(other_cargo_mask, first_cargo_id); ClrBit(other_cargo_mask, first_cargo_id);
CargoID cargo; for (CargoID cargo : SetCargoBitIterator(other_cargo_mask)) {
FOR_EACH_SET_BIT(cargo, other_cargo_mask) {
if (value != filter_func(cargo)) ClrBit(cargo_mask, cargo); if (value != filter_func(cargo)) ClrBit(cargo_mask, cargo);
} }
return value; return value;

View File

@@ -102,7 +102,7 @@ private:
void InitMaxWidgetWidth() void InitMaxWidgetWidth()
{ {
this->max_cargo_name_width = 0; 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); SetDParam(0, _sorted_cargo_specs[i]->name);
this->max_cargo_name_width = std::max(this->max_cargo_name_width, GetStringBoundingBox(STR_JUST_STRING).width); 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; StringID tooltip = STR_CARGO_TYPE_LOAD_ORDERS_DROP_TOOLTIP + this->variant;
const Order *order = this->vehicle->GetOrder(this->order_id); 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 CargoSpec *cs = _sorted_cargo_specs[i];
const CargoID cargo_id = cs->Index(); const CargoID cargo_id = cs->Index();
uint8 order_type = (this->variant == CTOWV_LOAD) ? (uint8) order->GetCargoLoadTypeRaw(cargo_id) : (uint8) order->GetCargoUnloadTypeRaw(cargo_id); 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->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_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<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->InitDropdownSelectedTypes();
this->FinishInitNested(v->index); this->FinishInitNested(v->index);
@@ -262,7 +262,7 @@ public:
} else if (widget == WID_CTO_SET_TO_ALL_DROPDOWN) { } else if (widget == WID_CTO_SET_TO_ALL_DROPDOWN) {
ModifyOrder(this->vehicle, this->order_id, mof | (action_type << 4) | (CT_INVALID << 20)); 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 CargoSpec *cs = _sorted_cargo_specs[i];
const CargoID cargo_id = cs->Index(); const CargoID cargo_id = cs->Index();
if (action_type != this->GetOrderActionTypeForCargo(cargo_id)) { if (action_type != this->GetOrderActionTypeForCargo(cargo_id)) {
@@ -337,12 +337,12 @@ static NWidgetBase *MakeCargoTypeOrdersRows(int *biggest_index, bool right)
NWidgetVertical *ver = new NWidgetVertical; 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; if (right && !dual_column) return ver;
const int increment = dual_column ? 2 : 1; 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 */ /* Cargo row */
NWidgetBackground *panel = new NWidgetBackground(WWT_PANEL, COLOUR_GREY, WID_CTO_CARGO_ROW_FIRST + i); NWidgetBackground *panel = new NWidgetBackground(WWT_PANEL, COLOUR_GREY, WID_CTO_CARGO_ROW_FIRST + i);
ver->Add(panel); ver->Add(panel);
@@ -2447,7 +2447,7 @@ public:
case WID_O_COND_AUX_CARGO: { case WID_O_COND_AUX_CARGO: {
uint value = this->vehicle->GetOrder(this->OrderGetSel())->GetConditionValue(); uint value = this->vehicle->GetOrder(this->OrderGetSel())->GetConditionValue();
DropDownList list; 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]; const CargoSpec *cs = _sorted_cargo_specs[i];
list.emplace_back(new DropDownListStringItem(cs->name, cs->Index(), false)); list.emplace_back(new DropDownListStringItem(cs->name, cs->Index(), false));
} }

View File

@@ -187,8 +187,7 @@ struct CFollowTrackT
/* Mask already reserved trackdirs. */ /* Mask already reserved trackdirs. */
m_new_td_bits &= ~TrackBitsToTrackdirBits(reserved); m_new_td_bits &= ~TrackBitsToTrackdirBits(reserved);
/* Mask out all trackdirs that conflict with the reservation. */ /* Mask out all trackdirs that conflict with the reservation. */
Track t; for (Track t : SetTrackBitIterator(TrackdirBitsToTrackBits(m_new_td_bits))) {
FOR_EACH_SET_TRACK(t, TrackdirBitsToTrackBits(m_new_td_bits)) {
if (TracksOverlap(reserved | TrackToTrackBits(t))) m_new_td_bits &= ~TrackToTrackdirBits(t); if (TracksOverlap(reserved | TrackToTrackBits(t))) m_new_td_bits &= ~TrackToTrackdirBits(t);
} }
if (m_new_td_bits == TRACKDIR_BIT_NONE) { if (m_new_td_bits == TRACKDIR_BIT_NONE) {

View File

@@ -945,8 +945,7 @@ static void NPFFollowTrack(AyStar *aystar, OpenListNode *current)
TrackBits reserved = GetReservedTrackbits(dst_tile); TrackBits reserved = GetReservedTrackbits(dst_tile);
trackdirbits &= ~TrackBitsToTrackdirBits(reserved); trackdirbits &= ~TrackBitsToTrackdirBits(reserved);
Track t; for (Track t : SetTrackBitIterator(TrackdirBitsToTrackBits(trackdirbits))) {
FOR_EACH_SET_TRACK(t, TrackdirBitsToTrackBits(trackdirbits)) {
if (TracksOverlap(reserved | TrackToTrackBits(t))) trackdirbits &= ~TrackToTrackdirBits(t); if (TracksOverlap(reserved | TrackToTrackBits(t))) trackdirbits &= ~TrackToTrackdirBits(t);
} }
} }

View File

@@ -23,6 +23,7 @@
#include "stdafx.h" #include "stdafx.h"
#include <array> #include <array>
#include <charconv>
#include <limits> #include <limits>
#include "currency.h" #include "currency.h"
#include "screenshot.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_game; ///< Game settings of a running game or the scenario editor.
GameSettings _settings_newgame; ///< Game settings for new games (updated from the intro screen). 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. TimeSettings _settings_time; ///< The effective settings that are used for time display.
VehicleDefaultSettings _old_vds; ///< Used for loading default vehicles settings from old savegames VehicleDefaultSettings _old_vds; ///< Used for loading default vehicles settings from old savegames.
std::string _config_file; ///< Configuration file of OpenTTD std::string _config_file; ///< Configuration file of OpenTTD.
std::string _config_file_text; 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; typedef std::list<ErrorMessageData> ErrorList;
static ErrorList _settings_error_list; ///< Errors while loading minimal settings. 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); 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. * Get the setting at the given index into the settings table.
* @param index The index to look for. * @param index The index to look for.
@@ -122,17 +191,6 @@ const SettingDesc *GetSettingDescription(uint index)
return _settings.begin()[index].get(); 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 | * 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 * @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 void ManyOfManySettingDesc::FormatValue(char *buf, const char *last, const void *object) const
{ {
uint bitmask = (uint)this->Read(object); uint bitmask = (uint)this->Read(object);
uint id = 0;
bool first = true; bool first = true;
FOR_EACH_SET_BIT(id, bitmask) { for (uint id : SetBitIterator(bitmask)) {
if (!first) buf = strecpy(buf, "|", last); if (!first) buf = strecpy(buf, "|", last);
buf = this->FormatSingleValue(buf, last, id); buf = this->FormatSingleValue(buf, last, id);
first = false; first = false;
@@ -549,10 +606,10 @@ const std::string &StringSettingDesc::Read(const void *object) const
* @param object pointer to the object been loaded * @param object pointer to the object been loaded
* @param only_startup load only the startup settings set * @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;
IniGroup *group_def = ini->GetGroup(grpname); IniGroup *group_def = ini.GetGroup(grpname);
for (auto &sd : settings_table) { for (auto &sd : settings_table) {
if (!SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to, sd->save.ext_feature_test)) continue; 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 }; std::string s{ sd->name };
auto sc = s.find('.'); auto sc = s.find('.');
if (sc != std::string::npos) { if (sc != std::string::npos) {
group = ini->GetGroup(s.substr(0, sc)); group = ini.GetGroup(s.substr(0, sc));
s = s.substr(sc + 1); s = s.substr(sc + 1);
} else { } else {
group = group_def; 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 /* 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 */ * did not exist (e.g. loading old config files with a [yapf] section */
sc = s.find('.'); 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 * values are reloaded when saving). If settings indeed have changed, we get
* these and save them. * 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; IniGroup *group_def = nullptr, *group;
IniItem *item; IniItem *item;
@@ -645,10 +702,10 @@ static void IniSaveSettings(IniFile *ini, const SettingTable &settings_table, co
std::string s{ sd->name }; std::string s{ sd->name };
auto sc = s.find('.'); auto sc = s.find('.');
if (sc != std::string::npos) { if (sc != std::string::npos) {
group = ini->GetGroup(s.substr(0, sc)); group = ini.GetGroup(s.substr(0, sc));
s = s.substr(sc + 1); s = s.substr(sc + 1);
} else { } else {
if (group_def == nullptr) group_def = ini->GetGroup(grpname); if (group_def == nullptr) group_def = ini.GetGroup(grpname);
group = group_def; 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 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 * @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; 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 * @param list pointer to an string(pointer) array that will be used as the
* source to be saved into the relevant ini section * 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; if (group == nullptr) return;
group->Clear(); 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 grpname character string identifying the section-header of the ini file that will be parsed
* @param desc Destination WindowDesc * @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); 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 grpname character string identifying the section-header of the ini file
* @param desc Source WindowDesc * @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); 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; IniItem *item;
/* Clean any configured AI */ /* 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; IniItem *item;
/* Clean any configured GameScript */ /* 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 grpname Group name containing the configuration of the GRF.
* @param is_static GRF is static. * @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; IniItem *item;
GRFConfig *first = nullptr; GRFConfig *first = nullptr;
GRFConfig **curr = &first; GRFConfig **curr = &first;
@@ -1914,9 +1971,23 @@ static GRFConfig *GRFLoadConfig(IniFile *ini, const char *grpname, bool is_stati
return first; 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; if (group == nullptr) return;
group->Clear(); 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; if (group == nullptr) return;
group->Clear(); group->Clear();
@@ -1962,28 +2033,19 @@ static void GameSaveConfig(IniFile *ini, const char *grpname)
* Save the version of OpenTTD to the ini file. * Save the version of OpenTTD to the ini file.
* @param ini the ini to write to * @param ini the ini to write to
*/ */
static void SaveVersionInConfig(IniFile *ini) static void SaveVersionInConfig(IniFile &ini)
{ {
IniGroup *group = ini->GetGroup("version"); IniGroup *group = ini.GetGroup("version");
group->GetItem("version_string", true)->SetValue(_openttd_revision);
char version[9]; group->GetItem("version_number", true)->SetValue(stdstr_fmt("%08X", _openttd_newgrf_version));
seprintf(version, lastof(version), "%08X", _openttd_newgrf_version); group->GetItem("ini_version", true)->SetValue(std::to_string(INIFILE_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]);
}
} }
/* Save a GRF configuration to the given group name */ /* 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); ini.RemoveGroup(grpname);
IniGroup *group = ini->GetGroup(grpname); IniGroup *group = ini.GetGroup(grpname);
const GRFConfig *c; const GRFConfig *c;
for (c = list; c != nullptr; c = c->next) { 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 */ /* 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) #if defined(_WIN32) && !defined(DEDICATED)
proc(ini, _win32_settings, "win32", nullptr, only_startup); proc(generic_ini, _win32_settings, "win32", nullptr, only_startup);
#endif /* _WIN32 */ #endif /* _WIN32 */
proc(ini, _settings, "patches", &_settings_newgame, only_startup); /* The name "patches" is a fallback, as every setting should sets its own group. */
proc(ini, _currency_settings,"currency", &_custom_currency, only_startup);
proc(ini, _company_settings, "company", &_settings_client.company, only_startup); 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) { if (!only_startup) {
proc_list(ini, "server_bind_addresses", _network_bind_list); proc_list(private_ini, "server_bind_addresses", _network_bind_list);
proc_list(ini, "servers", _network_host_list); proc_list(private_ini, "servers", _network_host_list);
proc_list(ini, "bans", _network_ban_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); for (auto &sd : table) {
ini->LoadFromDisk(_config_file, NO_DIRECTORY, &_config_file_text); /* For settings.xx.yy load the settings from [xx] yy = ? */
return ini; 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) 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 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 */ IniFileVersion generic_version = LoadVersionFromConfig(generic_ini);
HandleSettingDescs(ini, IniLoadSettings, IniLoadSettingList, startup);
/* 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) { if (!startup) {
_grfconfig_newgame = GRFLoadConfig(ini, "newgrf", false); _grfconfig_newgame = GRFLoadConfig(generic_ini, "newgrf", false);
_grfconfig_static = GRFLoadConfig(ini, "newgrf-static", true); _grfconfig_static = GRFLoadConfig(generic_ini, "newgrf-static", true);
AILoadConfig(ini, "ai_players"); AILoadConfig(generic_ini, "ai_players");
GameLoadConfig(ini, "game_scripts"); GameLoadConfig(generic_ini, "game_scripts");
PrepareOldDiffCustom(); PrepareOldDiffCustom();
IniLoadSettings(ini, _gameopt_settings, "gameopt", &_settings_newgame, false); IniLoadSettings(generic_ini, _gameopt_settings, "gameopt", &_settings_newgame, false);
HandleOldDiffCustom(false); HandleOldDiffCustom(false);
ValidateSettings(); ValidateSettings();
@@ -2057,28 +2157,57 @@ void LoadFromConfig(bool startup)
ScheduleErrorMessage(_settings_error_list); ScheduleErrorMessage(_settings_error_list);
if (FindWindowById(WC_ERRMSG, 0) == nullptr) ShowFirstError(); if (FindWindowById(WC_ERRMSG, 0) == nullptr) ShowFirstError();
} }
delete ini;
} }
/** Save the values to the configuration file */ /** Save the values to the configuration file */
void SaveToConfig() 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. */ /* Remove some obsolete groups. These have all been loaded into other groups. */
ini->RemoveGroup("patches"); generic_ini.RemoveGroup("patches");
ini->RemoveGroup("yapf"); generic_ini.RemoveGroup("yapf");
ini->RemoveGroup("gameopt"); generic_ini.RemoveGroup("gameopt");
HandleSettingDescs(ini, IniSaveSettings, IniSaveSettingList); /* Remove all settings from the generic ini that are now in the private ini. */
GRFSaveConfig(ini, "newgrf", _grfconfig_newgame); generic_ini.RemoveGroup("server_bind_addresses");
GRFSaveConfig(ini, "newgrf-static", _grfconfig_static); generic_ini.RemoveGroup("servers");
AISaveConfig(ini, "ai_players"); generic_ini.RemoveGroup("bans");
GameSaveConfig(ini, "game_scripts"); for (auto &table : _private_setting_tables) {
SaveVersionInConfig(ini); RemoveEntriesFromIni(generic_ini, table);
ini->SaveToDisk(_config_file); }
delete ini;
/* Remove all settings from the generic ini that are now in the secrets ini. */
for (auto &table : _secrets_setting_tables) {
RemoveEntriesFromIni(generic_ini, table);
}
}
HandleSettingDescs(generic_ini, private_ini, secrets_ini, IniSaveSettings, IniSaveSettingList);
GRFSaveConfig(generic_ini, "newgrf", _grfconfig_newgame);
GRFSaveConfig(generic_ini, "newgrf-static", _grfconfig_static);
AISaveConfig(generic_ini, "ai_players");
GameSaveConfig(generic_ini, "game_scripts");
SaveVersionInConfig(generic_ini);
SaveVersionInConfig(private_ini);
SaveVersionInConfig(secrets_ini);
generic_ini.SaveToDisk(_config_file);
private_ini.SaveToDisk(_private_file);
secrets_ini.SaveToDisk(_secrets_file);
} }
/** /**
@@ -2089,8 +2218,8 @@ StringList GetGRFPresetList()
{ {
StringList list; StringList list;
std::unique_ptr<IniFile> ini(IniLoadConfig()); ConfigIniFile ini(_config_file);
for (IniGroup *group = ini->group; group != nullptr; group = group->next) { for (IniGroup *group = ini.group; group != nullptr; group = group->next) {
if (group->name.compare(0, 7, "preset-") == 0) { if (group->name.compare(0, 7, "preset-") == 0) {
list.push_back(group->name.substr(7)); list.push_back(group->name.substr(7));
} }
@@ -2111,9 +2240,8 @@ GRFConfig *LoadGRFPresetFromConfig(const char *config_name)
char *section = (char*)alloca(len); char *section = (char*)alloca(len);
seprintf(section, section + len - 1, "preset-%s", config_name); seprintf(section, section + len - 1, "preset-%s", config_name);
IniFile *ini = IniLoadConfig(); ConfigIniFile ini(_config_file);
GRFConfig *config = GRFLoadConfig(ini, section, false); GRFConfig *config = GRFLoadConfig(ini, section, false);
delete ini;
return config; return config;
} }
@@ -2130,10 +2258,9 @@ void SaveGRFPresetToConfig(const char *config_name, GRFConfig *config)
char *section = (char*)alloca(len); char *section = (char*)alloca(len);
seprintf(section, section + len - 1, "preset-%s", config_name); seprintf(section, section + len - 1, "preset-%s", config_name);
IniFile *ini = IniLoadConfig(); ConfigIniFile ini(_config_file);
GRFSaveConfig(ini, section, config); GRFSaveConfig(ini, section, config);
ini->SaveToDisk(_config_file); ini.SaveToDisk(_config_file);
delete ini;
} }
/** /**
@@ -2146,10 +2273,9 @@ void DeleteGRFPresetFromConfig(const char *config_name)
char *section = (char*)alloca(len); char *section = (char*)alloca(len);
seprintf(section, section + len - 1, "preset-%s", config_name); seprintf(section, section + len - 1, "preset-%s", config_name);
IniFile *ini = IniLoadConfig(); ConfigIniFile ini(_config_file);
ini->RemoveGroup(section); ini.RemoveGroup(section);
ini->SaveToDisk(_config_file); ini.SaveToDisk(_config_file);
delete ini;
} }
/** /**
@@ -2227,8 +2353,18 @@ static const SettingDesc *GetCompanySettingFromName(const char *name)
*/ */
const SettingDesc *GetSettingFromName(const char *name) const SettingDesc *GetSettingFromName(const char *name)
{ {
auto sd = GetSettingFromName(name, _settings); for (auto &table : _generic_setting_tables) {
auto sd = GetSettingFromName(name, table);
if (sd != nullptr) return sd; 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); 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 * 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:"); IConsolePrintF(CC_WARNING, "All settings with their current value:");
for (auto &sd : _settings) { for (auto &table : _generic_setting_tables) {
if (!SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to, sd->save.ext_feature_test)) continue; IConsoleListSettingsTable(table, prefilter);
if (prefilter != nullptr && strstr(sd->name, prefilter) == nullptr) continue; }
if ((sd->flags & SF_NO_NEWGAME) && _game_mode == GM_MENU) continue; for (auto &table : _private_setting_tables) {
char value[80]; IConsoleListSettingsTable(table, prefilter);
sd->FormatValue(value, lastof(value), &GetGameSettings()); }
IConsolePrintF(CC_DEFAULT, "%s = %s", sd->name, value); for (auto &table : _secrets_setting_tables) {
IConsoleListSettingsTable(table, prefilter);
} }
IConsolePrintF(CC_WARNING, "Use 'setting' command to change a value"); IConsolePrintF(CC_WARNING, "Use 'setting' command to change a value");

View File

@@ -24,8 +24,8 @@ void IConsoleListSettings(const char *prefilter);
void LoadFromConfig(bool minimal = false); void LoadFromConfig(bool minimal = false);
void SaveToConfig(); void SaveToConfig();
void IniLoadWindowSettings(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); void IniSaveWindowSettings(IniFile &ini, const char *grpname, void *desc);
StringList GetGRFPresetList(); StringList GetGRFPresetList();
struct GRFConfig *LoadGRFPresetFromConfig(const char *config_name); struct GRFConfig *LoadGRFPresetFromConfig(const char *config_name);

View File

@@ -3289,8 +3289,7 @@ draw_default_foundation:
/* Sprite layout which needs preprocessing */ /* Sprite layout which needs preprocessing */
bool separate_ground = HasBit(statspec->flags, SSF_SEPARATE_GROUND); bool separate_ground = HasBit(statspec->flags, SSF_SEPARATE_GROUND);
uint32 var10_values = layout->PrepareLayout(total_offset, rti->fallback_railtype, 0, 0, separate_ground); uint32 var10_values = layout->PrepareLayout(total_offset, rti->fallback_railtype, 0, 0, separate_ground);
uint8 var10; for (uint8 var10 : SetBitIterator(var10_values)) {
FOR_EACH_SET_BIT(var10, var10_values) {
uint32 var10_relocation = GetCustomStationRelocation(statspec, st, ti->tile, INVALID_RAILTYPE, var10); uint32 var10_relocation = GetCustomStationRelocation(statspec, st, ti->tile, INVALID_RAILTYPE, var10);
layout->ProcessRegisters(var10, var10_relocation, separate_ground); layout->ProcessRegisters(var10, var10_relocation, separate_ground);
} }

View File

@@ -290,8 +290,7 @@ protected:
{ {
int diff = 0; int diff = 0;
CargoID j; for (CargoID j : SetCargoBitIterator(cargo_filter)) {
FOR_EACH_SET_CARGO_ID(j, cargo_filter) {
diff += a->goods[j].cargo.TotalCount() - b->goods[j].cargo.TotalCount(); diff += a->goods[j].cargo.TotalCount() - b->goods[j].cargo.TotalCount();
} }
@@ -303,8 +302,7 @@ protected:
{ {
int diff = 0; int diff = 0;
CargoID j; for (CargoID j : SetCargoBitIterator(cargo_filter)) {
FOR_EACH_SET_CARGO_ID(j, cargo_filter) {
diff += a->goods[j].cargo.AvailableCount() - b->goods[j].cargo.AvailableCount(); diff += a->goods[j].cargo.AvailableCount() - b->goods[j].cargo.AvailableCount();
} }
@@ -317,8 +315,7 @@ protected:
byte maxr1 = 0; byte maxr1 = 0;
byte maxr2 = 0; byte maxr2 = 0;
CargoID j; for (CargoID j : SetCargoBitIterator(cargo_filter)) {
FOR_EACH_SET_CARGO_ID(j, cargo_filter) {
if (a->goods[j].HasRating()) maxr1 = std::max(maxr1, a->goods[j].rating); 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); if (b->goods[j].HasRating()) maxr2 = std::max(maxr2, b->goods[j].rating);
} }
@@ -422,11 +419,13 @@ public:
this->FinishInitNested(window_number); this->FinishInitNested(window_number);
this->owner = (Owner)this->window_number; this->owner = (Owner)this->window_number;
const CargoSpec *cs; uint8 index = 0;
FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) { for (const CargoSpec *cs : _sorted_standard_cargo_specs) {
if (!HasBit(this->cargo_filter, cs->Index())) continue; if (HasBit(this->cargo_filter, cs->Index())) {
this->LowerWidget(WID_STL_CARGOSTART + index); this->LowerWidget(WID_STL_CARGOSTART + index);
} }
index++;
}
if (this->cargo_filter == this->cargo_filter_max) this->cargo_filter = _cargo_mask; 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 */ /* Determine appropriate width for mini station rating graph */
this->rating_width = 0; this->rating_width = 0;
const CargoSpec *cs; for (const CargoSpec *cs : _sorted_standard_cargo_specs) {
FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) {
this->rating_width = std::max(this->rating_width, GetStringBoundingBox(cs->abbrev).width); 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 */ /* 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; x += rtl ? -text_spacing : text_spacing;
/* show cargo waiting and station ratings */ /* show cargo waiting and station ratings */
for (uint j = 0; j < _sorted_standard_cargo_specs_size; j++) { for (const CargoSpec *cs : _sorted_standard_cargo_specs) {
CargoID cid = _sorted_cargo_specs[j]->Index(); CargoID cid = cs->Index();
if (st->goods[cid].cargo.TotalCount() > 0) { if (st->goods[cid].cargo.TotalCount() > 0) {
/* For RTL we work in exactly the opposite direction. So /* For RTL we work in exactly the opposite direction. So
* decrement the space needed first, then draw to the left * decrement the space needed first, then draw to the left
@@ -634,8 +632,7 @@ public:
ToggleBit(this->facilities, widget - WID_STL_TRAIN); ToggleBit(this->facilities, widget - WID_STL_TRAIN);
this->ToggleWidgetLoweredState(widget); this->ToggleWidgetLoweredState(widget);
} else { } else {
uint i; for (uint i : SetBitIterator(this->facilities)) {
FOR_EACH_SET_BIT(i, this->facilities) {
this->RaiseWidget(i + WID_STL_TRAIN); this->RaiseWidget(i + WID_STL_TRAIN);
} }
this->facilities = 1 << (widget - WID_STL_TRAIN); this->facilities = 1 << (widget - WID_STL_TRAIN);
@@ -656,7 +653,7 @@ public:
break; break;
case WID_STL_CARGOALL: { 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_CARGOSTART + i);
} }
this->LowerWidget(WID_STL_NOCARGOWAITING); this->LowerWidget(WID_STL_NOCARGOWAITING);
@@ -682,7 +679,7 @@ public:
this->include_empty = !this->include_empty; this->include_empty = !this->include_empty;
this->ToggleWidgetLoweredState(WID_STL_NOCARGOWAITING); this->ToggleWidgetLoweredState(WID_STL_NOCARGOWAITING);
} else { } 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_CARGOSTART + i);
} }
@@ -704,7 +701,7 @@ public:
ToggleBit(this->cargo_filter, cs->Index()); ToggleBit(this->cargo_filter, cs->Index());
this->ToggleWidgetLoweredState(widget); this->ToggleWidgetLoweredState(widget);
} else { } 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_CARGOSTART + i);
} }
this->RaiseWidget(WID_STL_NOCARGOWAITING); this->RaiseWidget(WID_STL_NOCARGOWAITING);
@@ -802,7 +799,7 @@ static NWidgetBase *CargoWidgets(int *biggest_index)
{ {
NWidgetHorizontal *container = new NWidgetHorizontal(); 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); NWidgetBackground *panel = new NWidgetBackground(WWT_PANEL, COLOUR_GREY, WID_STL_CARGOSTART + i);
panel->SetMinimalSize(14, 0); panel->SetMinimalSize(14, 0);
panel->SetMinimalTextLines(1, 0, FS_NORMAL); 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); panel->SetDataTip(0, STR_STATION_LIST_USE_CTRL_TO_SELECT_MORE);
container->Add(panel); 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; return container;
} }
@@ -1530,8 +1527,7 @@ struct StationViewWindow : public Window {
if (ofs_y < 0) return false; if (ofs_y < 0) return false;
const Station *st = Station::Get(this->window_number); const Station *st = Station::Get(this->window_number);
const CargoSpec *cs; for (const CargoSpec *cs : _sorted_standard_cargo_specs) {
FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) {
const GoodsEntry *ge = &st->goods[cs->Index()]; const GoodsEntry *ge = &st->goods[cs->Index()];
if (!ge->HasRating()) continue; if (!ge->HasRating()) continue;
ofs_y -= FONT_HEIGHT_NORMAL; ofs_y -= FONT_HEIGHT_NORMAL;
@@ -1994,8 +1990,7 @@ struct StationViewWindow : public Window {
this->ratings_list_y = y; this->ratings_list_y = y;
const CargoSpec *cs; for (const CargoSpec *cs : _sorted_standard_cargo_specs) {
FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) {
const GoodsEntry *ge = &st->goods[cs->Index()]; const GoodsEntry *ge = &st->goods[cs->Index()];
if (!ge->HasRating()) continue; 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); int row = this->GetRowFromWidget(pt.y, WID_SV_ACCEPT_RATING_LIST, WD_FRAMERECT_TOP, FONT_HEIGHT_NORMAL);
if (row < 1) break; if (row < 1) break;
const Station *st = Station::Get(this->window_number); const Station *st = Station::Get(this->window_number);
const CargoSpec *cs; for (const CargoSpec *cs : _sorted_standard_cargo_specs) {
FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) {
const GoodsEntry *ge = &st->goods[cs->Index()]; const GoodsEntry *ge = &st->goods[cs->Index()];
if (!ge->HasRating()) continue; if (!ge->HasRating()) continue;
if (row == 1) { if (row == 1) {

View File

@@ -85,16 +85,6 @@ int64 StringParameters::GetInt64(WChar type)
return this->data[this->offset++]; 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. * Set DParam n to some number that is suitable for string size computations.
* @param n Index of the string parameter. * @param n Index of the string parameter.
@@ -323,15 +313,6 @@ void SetDParamStr(uint n, const std::string &str)
SetDParamStr(n, str.c_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. * Format a number into a string.
* @param buff the buffer to write to * @param buff the buffer to write to

View File

@@ -122,8 +122,6 @@ public:
return (int32)this->GetInt64(type); return (int32)this->GetInt64(type);
} }
void ShiftParameters(uint amount);
/** Get a pointer to the current element in the data array. */ /** Get a pointer to the current element in the data array. */
uint64 *GetDataPointer() const uint64 *GetDataPointer() const
{ {
@@ -180,8 +178,6 @@ uint32 GetStringGRFID(StringID string);
uint ConvertKmhishSpeedToDisplaySpeed(uint speed); uint ConvertKmhishSpeedToDisplaySpeed(uint speed);
uint ConvertDisplaySpeedToKmhishSpeed(uint speed); uint ConvertDisplaySpeedToKmhishSpeed(uint speed);
void InjectDParam(uint amount);
WChar GetDecimalSeparatorChar(); WChar GetDecimalSeparatorChar();
/** /**

View File

@@ -47,8 +47,7 @@ void Subsidy::AwardTo(CompanyID company)
NewsStringData *company_name = new NewsStringData(GetString(STR_COMPANY_NAME)); NewsStringData *company_name = new NewsStringData(GetString(STR_COMPANY_NAME));
/* Add a news item */ /* Add a news item */
std::pair<NewsReferenceType, NewsReferenceType> reftype = SetupSubsidyDecodeParam(this, SubsidyDecodeParamType::NewsAwarded); std::pair<NewsReferenceType, NewsReferenceType> reftype = SetupSubsidyDecodeParam(this, SubsidyDecodeParamType::NewsAwarded, 1);
InjectDParam(1);
SetDParamStr(0, company_name->string); SetDParamStr(0, company_name->string);
AddNewsItem( 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. * 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 s %Subsidy being printed.
* @param mode Type of subsidy news message to decide on parameter format. * @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. * @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 reftype1 = NR_NONE;
NewsReferenceType reftype2 = 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 */ /* 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); const CargoSpec *cs = CargoSpec::Get(s->cargo_type);
if (mode == SubsidyDecodeParamType::Gui || mode == SubsidyDecodeParamType::NewsWithdrawn) { if (mode == SubsidyDecodeParamType::Gui || mode == SubsidyDecodeParamType::NewsWithdrawn) {
SetDParam(0, cs->name); SetDParam(parameter_offset, cs->name);
} else { } else {
SetDParam(0, cs->name_single); SetDParam(parameter_offset, cs->name_single);
} }
switch (s->src_type) { switch (s->src_type) {
case ST_INDUSTRY: case ST_INDUSTRY:
reftype1 = NR_INDUSTRY; reftype1 = NR_INDUSTRY;
SetDParam(1, STR_INDUSTRY_NAME); SetDParam(parameter_offset + 1, STR_INDUSTRY_NAME);
break; break;
case ST_TOWN: case ST_TOWN:
reftype1 = NR_TOWN; reftype1 = NR_TOWN;
SetDParam(1, STR_TOWN_NAME); SetDParam(parameter_offset + 1, STR_TOWN_NAME);
break; break;
default: NOT_REACHED(); default: NOT_REACHED();
} }
SetDParam(2, s->src); SetDParam(parameter_offset + 2, s->src);
switch (s->dst_type) { switch (s->dst_type) {
case ST_INDUSTRY: case ST_INDUSTRY:
reftype2 = NR_INDUSTRY; reftype2 = NR_INDUSTRY;
SetDParam(4, STR_INDUSTRY_NAME); SetDParam(parameter_offset + 4, STR_INDUSTRY_NAME);
break; break;
case ST_TOWN: case ST_TOWN:
reftype2 = NR_TOWN; reftype2 = NR_TOWN;
SetDParam(4, STR_TOWN_NAME); SetDParam(parameter_offset + 4, STR_TOWN_NAME);
break; break;
default: NOT_REACHED(); 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 the subsidy is being offered or awarded, the news item mentions the subsidy duration. */
if (mode == SubsidyDecodeParamType::NewsOffered || mode == SubsidyDecodeParamType::NewsAwarded) { 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); return std::pair<NewsReferenceType, NewsReferenceType>(reftype1, reftype2);

View File

@@ -17,10 +17,9 @@
#include "news_type.h" #include "news_type.h"
#include "subsidy_base.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); void DeleteSubsidyWith(SourceType type, SourceID index);
bool CheckSubsidised(CargoID cargo_type, CompanyID company, SourceType src_type, SourceID src, const Station *st); bool CheckSubsidised(CargoID cargo_type, CompanyID company, SourceType src_type, SourceID src, const Station *st);
void RebuildSubsidisedSourceAndDestinationCache(); void RebuildSubsidisedSourceAndDestinationCache();
void DeleteSubsidy(struct Subsidy *s);
#endif /* SUBSIDY_FUNC_H */ #endif /* SUBSIDY_FUNC_H */

View File

@@ -1107,8 +1107,7 @@ class NIHTown : public NIHelper {
if (t->have_ratings != 0) { if (t->have_ratings != 0) {
print(" Company ratings:"); print(" Company ratings:");
uint8 bit; for (uint8 bit : SetBitIterator(t->have_ratings)) {
FOR_EACH_SET_BIT(bit, t->have_ratings) {
seprintf(buffer, lastof(buffer), " %u: %d", bit, t->ratings[bit]); seprintf(buffer, lastof(buffer), " %u: %d", bit, t->ratings[bit]);
print(buffer); print(buffer);
} }

View File

@@ -6,6 +6,9 @@ set(TABLE_INI_SOURCE_FILES
${CMAKE_CURRENT_SOURCE_DIR}/currency_settings.ini ${CMAKE_CURRENT_SOURCE_DIR}/currency_settings.ini
${CMAKE_CURRENT_SOURCE_DIR}/gameopt_settings.ini ${CMAKE_CURRENT_SOURCE_DIR}/gameopt_settings.ini
${CMAKE_CURRENT_SOURCE_DIR}/misc_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}/settings.ini
${CMAKE_CURRENT_SOURCE_DIR}/win32_settings.ini ${CMAKE_CURRENT_SOURCE_DIR}/win32_settings.ini
${CMAKE_CURRENT_SOURCE_DIR}/window_settings.ini ${CMAKE_CURRENT_SOURCE_DIR}/window_settings.ini

View File

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

View File

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

View File

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

View File

@@ -69,9 +69,6 @@ static bool CheckSharingRoad(int32 &new_value);
static bool CheckSharingWater(int32 &new_value); static bool CheckSharingWater(int32 &new_value);
static bool CheckSharingAir(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 */ /* End - Callback Functions for the various settings */
/* Begin - xref conversion callbacks */ /* Begin - xref conversion callbacks */
@@ -5754,308 +5751,6 @@ min = 1
max = 65535 max = 65535
cat = SC_EXPERT 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] [SDT_BOOL]
var = vehicle.pay_for_repair var = vehicle.pay_for_repair
def = true def = true

View File

@@ -161,11 +161,10 @@ static const int amplitude_decimal_bits = 10;
/** Height map - allocated array of heights (MapSizeX() + 1) x (MapSizeY() + 1) */ /** Height map - allocated array of heights (MapSizeX() + 1) x (MapSizeY() + 1) */
struct HeightMap 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 /* Even though the sizes are always positive, there are many cases where
* X and Y need to be signed integers due to subtractions. */ * X and Y need to be signed integers due to subtractions. */
int dim_x; //< height map size_x MapSizeX() + 1 int dim_x; //< height map size_x MapSizeX() + 1
int total_size; //< height map total size
int size_x; //< MapSizeX() int size_x; //< MapSizeX()
int size_y; //< MapSizeY() int size_y; //< MapSizeY()
@@ -182,7 +181,7 @@ struct HeightMap
}; };
/** Global height map instance */ /** 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 */ /** Conversion: int to height_t */
#define I2H(i) ((i) << height_decimal_bits) #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 */ /** Conversion: amplitude_t to height_t */
#define A2H(a) ((a) >> (amplitude_decimal_bits - height_decimal_bits)) #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. */ /** Maximum number of TGP noise frequencies. */
static const int MAX_TGP_FREQUENCIES = 10; static const int MAX_TGP_FREQUENCIES = 10;
@@ -326,18 +321,15 @@ static inline bool IsValidXY(int x, int y)
*/ */
static inline bool AllocHeightMap() static inline bool AllocHeightMap()
{ {
height_t *h; assert(_height_map.h.empty());
_height_map.size_x = MapSizeX(); _height_map.size_x = MapSizeX();
_height_map.size_y = MapSizeY(); _height_map.size_y = MapSizeY();
/* Allocate memory block for height map row pointers */ /* 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.dim_x = _height_map.size_x + 1;
_height_map.h = CallocT<height_t>(_height_map.total_size); _height_map.h.resize(total_size);
/* Iterate through height map and initialise values. */
FOR_ALL_TILES_IN_HEIGHT(h) *h = 0;
return true; return true;
} }
@@ -345,8 +337,7 @@ static inline bool AllocHeightMap()
/** Free height map */ /** Free height map */
static inline void FreeHeightMap() static inline void FreeHeightMap()
{ {
free(_height_map.h); _height_map.h.clear();
_height_map.h = nullptr;
} }
/** /**
@@ -370,7 +361,7 @@ static inline height_t RandomHeight(amplitude_t rMax)
static void HeightMapGenerate() static void HeightMapGenerate()
{ {
/* Trying to apply noise to uninitialized height map */ /* 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); int start = std::max(MAX_TGP_FREQUENCIES - (int)std::min(MapLogX(), MapLogY()), 0);
bool first = true; bool first = true;
@@ -429,15 +420,15 @@ static void HeightMapGenerate()
/** Returns min, max and average height from height map */ /** Returns min, max and average height from height map */
static void HeightMapGetMinMaxAvg(height_t *min_ptr, height_t *max_ptr, height_t *avg_ptr) 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; int64 h_accu = 0;
h_min = h_max = _height_map.height(0, 0); h_min = h_max = _height_map.height(0, 0);
/* Get h_min, h_max and accumulate heights into h_accu */ /* Get h_min, h_max and accumulate heights into h_accu */
FOR_ALL_TILES_IN_HEIGHT(h) { for (const height_t &h : _height_map.h) {
if (*h < h_min) h_min = *h; if (h < h_min) h_min = h;
if (*h > h_max) h_max = *h; if (h > h_max) h_max = h;
h_accu += *h; h_accu += h;
} }
/* Get average height */ /* 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) static int *HeightMapMakeHistogram(height_t h_min, height_t h_max, int *hist_buf)
{ {
int *hist = hist_buf - h_min; int *hist = hist_buf - h_min;
height_t *h;
/* Count the heights and fill the histogram */ /* Count the heights and fill the histogram */
FOR_ALL_TILES_IN_HEIGHT(h) { for (const height_t &h : _height_map.h){
assert(*h >= h_min); assert(h >= h_min);
assert(*h <= h_max); assert(h <= h_max);
hist[*h]++; hist[h]++;
} }
return hist; 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 */ /** Applies sine wave redistribution onto height map */
static void HeightMapSineTransform(height_t h_min, height_t h_max) static void HeightMapSineTransform(height_t h_min, height_t h_max)
{ {
height_t *h; for (height_t &h : _height_map.h) {
FOR_ALL_TILES_IN_HEIGHT(h) {
double fheight; double fheight;
if (*h < h_min) continue; if (h < h_min) continue;
/* Transform height into 0..1 space */ /* 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 */ /* Apply sine transform depending on landscape type */
switch (_settings_game.game_creation.landscape) { switch (_settings_game.game_creation.landscape) {
case LT_TOYLAND: case LT_TOYLAND:
@@ -535,9 +523,9 @@ static void HeightMapSineTransform(height_t h_min, height_t h_max)
break; break;
} }
/* Transform it back into h_min..h_max space */ /* Transform it back into h_min..h_max space */
*h = (height_t)(fheight * (h_max - h_min) + h_min); h = (height_t)(fheight * (h_max - h_min) + h_min);
if (*h < 0) *h = I2H(0); if (h < 0) h = I2H(0);
if (*h >= h_max) *h = h_max - 1; 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; height_t h_min, h_max, h_avg, h_water_level;
int64 water_tiles, desired_water_tiles; int64 water_tiles, desired_water_tiles;
height_t *h;
int *hist; int *hist;
HeightMapGetMinMaxAvg(&h_min, &h_max, &h_avg); 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 * 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. * 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 */ /* 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) */ /* Make sure all values are in the proper range (0..h_max_new) */
if (*h < 0) *h = I2H(0); if (h < 0) h = I2H(0);
if (*h >= h_max_new) *h = h_max_new - 1; if (h >= h_max_new) h = h_max_new - 1;
} }
free(hist_buf); free(hist_buf);

View File

@@ -4112,8 +4112,7 @@ void UpdateAllTownRatings()
if (Company::IsValidID(_local_company) && HasBit(t->have_ratings, _local_company) && t->ratings[_local_company] <= 0) { if (Company::IsValidID(_local_company) && HasBit(t->have_ratings, _local_company) && t->ratings[_local_company] <= 0) {
ZoningTownAuthorityRatingChange(); ZoningTownAuthorityRatingChange();
} }
uint8 c; for (uint8 c : SetBitIterator(t->have_ratings)) {
FOR_EACH_SET_BIT(c, t->have_ratings) {
t->ratings[c] = RATING_MAXIMUM; t->ratings[c] = RATING_MAXIMUM;
} }
if (t->have_ratings != 0) { if (t->have_ratings != 0) {

View File

@@ -91,8 +91,7 @@ private:
static int GetNthSetBit(uint32 bits, int n) static int GetNthSetBit(uint32 bits, int n)
{ {
if (n >= 0) { if (n >= 0) {
uint i; for (uint i : SetBitIterator(bits)) {
FOR_EACH_SET_BIT(i, bits) {
n--; n--;
if (n < 0) return i; if (n < 0) return i;
} }

View File

@@ -563,12 +563,12 @@ static const TraceRestrictDropDownListSet *GetSortedCargoTypeDropDownListSet()
cargo_list_str, cargo_list_id, 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]; const CargoSpec *cs = _sorted_cargo_specs[i];
cargo_list_str[i] = cs->name; cargo_list_str[i] = cs->name;
cargo_list_id[i] = cs->Index(); 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; return &cargo_list;
} }

View File

@@ -15,16 +15,7 @@
#include "direction_func.h" #include "direction_func.h"
#include "slope_func.h" #include "slope_func.h"
/** using SetTrackBitIterator = SetBitIterator<Track, TrackBits>;
* 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)
/** /**
* Checks if a Track is valid. * Checks if a Track is valid.

View File

@@ -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 */ /* 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); assert(TRACK_BEGIN == TRACK_X && TRACK_Y == TRACK_BEGIN + 1);
Track t; for (Track t : SetTrackBitIterator(remaining_trackbits)) TryReserveRailTrack(tile, t);
FOR_EACH_SET_TRACK(t, remaining_trackbits) TryReserveRailTrack(tile, t);
} }
/* check if the wagon was on a road/rail-crossing */ /* check if the wagon was on a road/rail-crossing */

View File

@@ -356,8 +356,7 @@ void BaseVehicleListWindow::SetCargoFilterArray()
filter_items++; filter_items++;
/* Collect available cargo types for filtering. */ /* Collect available cargo types for filtering. */
const CargoSpec *cs; for (const CargoSpec *cs : _sorted_standard_cargo_specs) {
FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) {
this->cargo_filter[filter_items] = cs->Index(); this->cargo_filter[filter_items] = cs->Index();
this->cargo_filter_texts[filter_items] = cs->name; this->cargo_filter_texts[filter_items] = cs->name;
filter_items++; filter_items++;

View File

@@ -1288,8 +1288,7 @@ void TileLoop_Water(TileIndex tile)
case FLOOD_DRYUP: { case FLOOD_DRYUP: {
Slope slope_here = GetFoundationSlope(tile) & ~SLOPE_HALFTILE_MASK & ~SLOPE_STEEP; Slope slope_here = GetFoundationSlope(tile) & ~SLOPE_HALFTILE_MASK & ~SLOPE_STEEP;
uint dir; for (uint dir : SetBitIterator(_flood_from_dirs[slope_here])) {
FOR_EACH_SET_BIT(dir, _flood_from_dirs[slope_here]) {
TileIndex dest = tile + TileOffsByDir((Direction)dir); TileIndex dest = tile + TileOffsByDir((Direction)dir);
if (!IsValidTile(dest)) continue; if (!IsValidTile(dest)) continue;
@@ -1327,8 +1326,7 @@ void ConvertGroundTilesIntoWaterTiles()
break; break;
default: default:
uint dir; for (uint dir : SetBitIterator(_flood_from_dirs[slope & ~SLOPE_STEEP])) {
FOR_EACH_SET_BIT(dir, _flood_from_dirs[slope & ~SLOPE_STEEP]) {
TileIndex dest = TileAddByDir(tile, (Direction)dir); TileIndex dest = TileAddByDir(tile, (Direction)dir);
Slope slope_dest = GetTileSlope(dest) & ~SLOPE_STEEP; Slope slope_dest = GetTileSlope(dest) & ~SLOPE_STEEP;
if (slope_dest == SLOPE_FLAT || IsSlopeWithOneCornerRaised(slope_dest)) { if (slope_dest == SLOPE_FLAT || IsSlopeWithOneCornerRaised(slope_dest)) {

View File

@@ -143,13 +143,12 @@ int16 WindowDesc::GetDefaultHeight() const
*/ */
void WindowDesc::LoadFromConfig() void WindowDesc::LoadFromConfig()
{ {
IniFile *ini = new IniFile(); IniFile ini;
ini->LoadFromDisk(_windows_file, NO_DIRECTORY); ini.LoadFromDisk(_windows_file, NO_DIRECTORY);
for (WindowDesc *wd : *_window_descs) { for (WindowDesc *wd : *_window_descs) {
if (wd->ini_key == nullptr) continue; if (wd->ini_key == nullptr) continue;
IniLoadWindowSettings(ini, wd->ini_key, wd); 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 */ /* Sort the stuff to get a nice ini file on first write */
std::sort(_window_descs->begin(), _window_descs->end(), DescSorter); std::sort(_window_descs->begin(), _window_descs->end(), DescSorter);
IniFile *ini = new IniFile(); IniFile ini;
ini->LoadFromDisk(_windows_file, NO_DIRECTORY); ini.LoadFromDisk(_windows_file, NO_DIRECTORY);
for (WindowDesc *wd : *_window_descs) { for (WindowDesc *wd : *_window_descs) {
if (wd->ini_key == nullptr) continue; if (wd->ini_key == nullptr) continue;
IniSaveWindowSettings(ini, wd->ini_key, wd); IniSaveWindowSettings(ini, wd->ini_key, wd);
} }
ini->SaveToDisk(_windows_file); ini.SaveToDisk(_windows_file);
delete ini;
} }
/** /**