Merge branch 'master' into jgrpp

# Conflicts:
#	regression/regression/result.txt
#	src/aircraft_cmd.cpp
#	src/airport_gui.cpp
#	src/articulated_vehicles.cpp
#	src/console_cmds.cpp
#	src/date_gui.cpp
#	src/engine.cpp
#	src/genworld_gui.cpp
#	src/gfx_layout_fallback.cpp
#	src/group_gui.cpp
#	src/hotkeys.cpp
#	src/network/core/tcp_connect.cpp
#	src/network/core/tcp_listen.h
#	src/newgrf.cpp
#	src/newgrf.h
#	src/newgrf_engine.cpp
#	src/newgrf_gui.cpp
#	src/newgrf_station.cpp
#	src/openttd.cpp
#	src/order_gui.cpp
#	src/os/macosx/osx_main.cpp
#	src/pathfinder/yapf/yapf_node_rail.hpp
#	src/rail_gui.cpp
#	src/saveload/afterload.cpp
#	src/saveload/cargopacket_sl.cpp
#	src/saveload/linkgraph_sl.cpp
#	src/saveload/station_sl.cpp
#	src/script/api/script_industrytype.cpp
#	src/settings.cpp
#	src/settings_gui.cpp
#	src/settings_table.cpp
#	src/settingsgen/settingsgen.cpp
#	src/station.cpp
#	src/station_cmd.cpp
#	src/strings.cpp
#	src/timer/timer_game_calendar.cpp
#	src/timer/timer_game_calendar.h
#	src/timer/timer_manager.h
#	src/timer/timer_window.cpp
#	src/timetable_cmd.cpp
#	src/toolbar_gui.cpp
#	src/town_cmd.cpp
#	src/town_gui.cpp
#	src/train_gui.cpp
#	src/vehicle_cmd.h
#	src/vehicle_gui.cpp
#	src/viewport.cpp
#	src/widgets/dropdown.cpp
#	src/window_func.h
#	src/window_gui.h
pull/615/head
Jonathan G Rennison 5 months ago
commit 2a31095118

@ -1388,7 +1388,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetReliability(): 75
GetMaxSpeed(): 64
GetPrice(): 8203
GetMaxAge(): 5479
GetMaxAge(): 5490
GetRunningCost(): 820
GetPower(): 300
GetWeight(): 47
@ -1532,7 +1532,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetReliability(): 80
GetMaxSpeed(): 112
GetPrice(): 15234
GetMaxAge(): 7671
GetMaxAge(): 7686
GetRunningCost(): 1968
GetPower(): 1000
GetWeight(): 131
@ -1550,7 +1550,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetReliability(): 84
GetMaxSpeed(): 128
GetPrice(): 22265
GetMaxAge(): 7305
GetMaxAge(): 7320
GetRunningCost(): 2296
GetPower(): 1200
GetWeight(): 162
@ -3476,7 +3476,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetReliability(): 78
GetMaxSpeed(): 56
GetPrice(): 4921
GetMaxAge(): 4383
GetMaxAge(): 4392
GetRunningCost(): 426
GetPower(): 90
GetWeight(): 10
@ -3602,7 +3602,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetReliability(): 77
GetMaxSpeed(): 48
GetPrice(): 4429
GetMaxAge(): 5479
GetMaxAge(): 5490
GetRunningCost(): 421
GetPower(): 120
GetWeight(): 9
@ -3656,7 +3656,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetReliability(): 92
GetMaxSpeed(): 48
GetPrice(): 4716
GetMaxAge(): 5479
GetMaxAge(): 5490
GetRunningCost(): 421
GetPower(): 120
GetWeight(): 9
@ -3764,7 +3764,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetReliability(): 98
GetMaxSpeed(): 48
GetPrice(): 4511
GetMaxAge(): 5479
GetMaxAge(): 5490
GetRunningCost(): 421
GetPower(): 120
GetWeight(): 9
@ -3818,7 +3818,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetReliability(): 97
GetMaxSpeed(): 48
GetPrice(): 4306
GetMaxAge(): 5479
GetMaxAge(): 5490
GetRunningCost(): 421
GetPower(): 120
GetWeight(): 9
@ -3872,7 +3872,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetReliability(): 87
GetMaxSpeed(): 48
GetPrice(): 4388
GetMaxAge(): 5479
GetMaxAge(): 5490
GetRunningCost(): 421
GetPower(): 120
GetWeight(): 9
@ -3926,7 +3926,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetReliability(): 97
GetMaxSpeed(): 48
GetPrice(): 4675
GetMaxAge(): 5479
GetMaxAge(): 5490
GetRunningCost(): 421
GetPower(): 120
GetWeight(): 9
@ -3980,7 +3980,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetReliability(): 98
GetMaxSpeed(): 48
GetPrice(): 4839
GetMaxAge(): 5479
GetMaxAge(): 5490
GetRunningCost(): 421
GetPower(): 120
GetWeight(): 9
@ -4034,7 +4034,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetReliability(): 97
GetMaxSpeed(): 48
GetPrice(): 4962
GetMaxAge(): 5479
GetMaxAge(): 5490
GetRunningCost(): 421
GetPower(): 120
GetWeight(): 9
@ -4088,7 +4088,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetReliability(): 82
GetMaxSpeed(): 48
GetPrice(): 4593
GetMaxAge(): 5479
GetMaxAge(): 5490
GetRunningCost(): 421
GetPower(): 120
GetWeight(): 9
@ -4142,7 +4142,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetReliability(): 76
GetMaxSpeed(): 48
GetPrice(): 5947
GetMaxAge(): 5479
GetMaxAge(): 5490
GetRunningCost(): 421
GetPower(): 120
GetWeight(): 9
@ -5060,7 +5060,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetReliability(): 99
GetMaxSpeed(): 24
GetPrice(): 30468
GetMaxAge(): 10958
GetMaxAge(): 10980
GetRunningCost(): 2296
GetPower(): -1
GetWeight(): -1
@ -5096,7 +5096,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetReliability(): 88
GetMaxSpeed(): 32
GetPrice(): 18281
GetMaxAge(): 10958
GetMaxAge(): 10980
GetRunningCost(): 1476
GetPower(): -1
GetWeight(): -1
@ -5186,7 +5186,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetReliability(): 81
GetMaxSpeed(): 24
GetPrice(): 24375
GetMaxAge(): 10958
GetMaxAge(): 10980
GetRunningCost(): 2460
GetPower(): -1
GetWeight(): -1
@ -5258,7 +5258,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetReliability(): 58
GetMaxSpeed(): 236
GetPrice(): 28710
GetMaxAge(): 7305
GetMaxAge(): 7320
GetRunningCost(): 2390
GetPower(): -1
GetWeight(): -1
@ -5276,7 +5276,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetReliability(): 95
GetMaxSpeed(): 236
GetPrice(): 30761
GetMaxAge(): 8766
GetMaxAge(): 8784
GetRunningCost(): 2812
GetPower(): -1
GetWeight(): -1
@ -5330,7 +5330,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetReliability(): 77
GetMaxSpeed(): 236
GetPrice(): 30761
GetMaxAge(): 10958
GetMaxAge(): 10980
GetRunningCost(): 2756
GetPower(): -1
GetWeight(): -1
@ -9321,8 +9321,8 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetEngineType(): 153
GetUnitNumber(): 1
GetAge(): 1
GetMaxAge(): 5479
GetAgeLeft(): 5478
GetMaxAge(): 5490
GetAgeLeft(): 5489
GetCurrentSpeed(): 7
GetRunningCost(): 421
GetProfitThisYear(): -1
@ -9414,17 +9414,17 @@ ERROR: IsEnd() is invalid as Begin() is never called
17 => 0
16 => 0
MaxAge ListDump:
16 => 10958
14 => 10958
17 => 7305
13 => 5479
12 => 5479
16 => 10980
14 => 10980
17 => 7320
13 => 5490
12 => 5490
AgeLeft ListDump:
16 => 10958
14 => 10957
17 => 7305
13 => 5478
12 => 5478
16 => 10980
14 => 10979
17 => 7320
13 => 5489
12 => 5489
CurrentSpeed ListDump:
12 => 27
17 => 0

@ -5922,7 +5922,7 @@ namespace Catch {
}
void testCaseEnded(TestCaseStats const& testCaseStats) override {
auto node = std::make_shared<TestCaseNode>(testCaseStats);
assert(m_sectionStack.size() == 0);
assert(m_sectionStack.empty());
node->children.push_back(m_rootSection);
m_testCases.push_back(node);
m_rootSection.reset();

@ -762,7 +762,7 @@ static SQInteger closure_getinfos(HSQUIRRELVM v) {
res->NewSlot(SQString::Create(_ss(v),"name",-1),nc->_name);
res->NewSlot(SQString::Create(_ss(v),"paramscheck",-1),nc->_nparamscheck);
SQObjectPtr typecheck;
if(nc->_typecheck.size() > 0) {
if(!nc->_typecheck.empty()) {
typecheck =
SQArray::Create(_ss(v), nc->_typecheck.size());
for(SQUnsignedInteger n = 0; n<nc->_typecheck.size(); n++) {

@ -563,7 +563,7 @@ void SQFuncState::PopChildState()
SQFuncState::~SQFuncState()
{
while(_childstates.size() > 0)
while(!_childstates.empty())
{
PopChildState();
}

@ -98,7 +98,7 @@ struct AIConfigWindow : public Window {
this->OnInvalidateData(0);
}
void Close() override
void Close([[maybe_unused]] int data = 0) override
{
CloseWindowByClass(WC_SCRIPT_LIST);
CloseWindowByClass(WC_SCRIPT_SETTINGS);
@ -279,7 +279,7 @@ struct AIConfigWindow : public Window {
this->SetWidgetDisabledState(WID_AIC_DECREASE_INTERVAL, GetGameSettings().difficulty.competitors_interval == MIN_COMPETITORS_INTERVAL);
this->SetWidgetDisabledState(WID_AIC_INCREASE_INTERVAL, GetGameSettings().difficulty.competitors_interval == MAX_COMPETITORS_INTERVAL);
this->SetWidgetDisabledState(WID_AIC_CHANGE, this->selected_slot == INVALID_COMPANY);
this->SetWidgetDisabledState(WID_AIC_CONFIGURE, this->selected_slot == INVALID_COMPANY || AIConfig::GetConfig(this->selected_slot)->GetConfigList()->size() == 0);
this->SetWidgetDisabledState(WID_AIC_CONFIGURE, this->selected_slot == INVALID_COMPANY || AIConfig::GetConfig(this->selected_slot)->GetConfigList()->empty());
this->SetWidgetDisabledState(WID_AIC_MOVE_UP, this->selected_slot == INVALID_COMPANY || !IsEditable((CompanyID)(this->selected_slot - 1)));
this->SetWidgetDisabledState(WID_AIC_MOVE_DOWN, this->selected_slot == INVALID_COMPANY || !IsEditable((CompanyID)(this->selected_slot + 1)));

@ -95,7 +95,7 @@ AIInfo *AIScannerInfo::SelectRandomAI() const
AIInfo *AIScannerInfo::FindInfo(const std::string &name, int version, bool force_exact_match)
{
if (this->info_list.size() == 0) return nullptr;
if (this->info_list.empty()) return nullptr;
if (name.empty()) return nullptr;
if (version == -1) {

@ -1474,9 +1474,9 @@ static void MaybeCrashAirplane(Aircraft *v)
if (GB(Random(), 0, 22) > prob) return;
/* Crash the airplane. Remove all goods stored at the station. */
for (CargoID i = 0; i < NUM_CARGO; i++) {
st->goods[i].rating = 1;
if (st->goods[i].data != nullptr) st->goods[i].data->cargo.Truncate();
for (GoodsEntry &ge : st->goods) {
ge.rating = 1;
if (ge.data != nullptr) ge.data->cargo.Truncate();
}
CrashAirplane(v);

@ -78,7 +78,7 @@ struct BuildAirToolbarWindow : Window {
this->last_user_action = INVALID_WID_AT;
}
void Close() override
void Close([[maybe_unused]] int data = 0) override
{
if (this->IsWidgetLowered(WID_AT_AIRPORT)) SetViewportCatchmentStation(nullptr, true);
if (_settings_client.gui.link_terraform_toolbar) CloseWindowById(WC_SCEN_LAND_GEN, 0, false);
@ -233,7 +233,7 @@ class BuildAirportWindow : public PickerWindowBase {
DropDownList list;
for (uint i = 0; AirportClass::IsClassIDValid((AirportClassID)i); i++) {
list.emplace_back(new DropDownListStringItem(AirportClass::Get((AirportClassID)i)->name, i, false));
list.push_back(std::make_unique<DropDownListStringItem>(AirportClass::Get((AirportClassID)i)->name, i, false));
}
return list;
@ -277,7 +277,7 @@ public:
if (selectFirstAirport) this->SelectFirstAvailableAirport(true);
}
void Close() override
void Close([[maybe_unused]] int data = 0) override
{
CloseWindowById(WC_SELECT_STATION, 0);
this->PickerWindowBase::Close();

@ -393,7 +393,7 @@ void CheckConsistencyOfArticulatedVehicle(const Vehicle *v)
CargoTypes real_refit_union = 0;
CargoTypes real_refit_intersection = ALL_CARGOTYPES;
CargoArray real_default_capacity{};
CargoTypes real_default_cargoes = 0;
do {
CargoTypes refit_mask = GetAvailableVehicleCargoTypes(v->engine_type, true);
@ -401,17 +401,15 @@ void CheckConsistencyOfArticulatedVehicle(const Vehicle *v)
if (refit_mask != 0) real_refit_intersection &= refit_mask;
assert(v->cargo_type < NUM_CARGO || (v->type == VEH_TRAIN && Train::From(v)->IsVirtual()));
if (v->cargo_type < NUM_CARGO) {
real_default_capacity[v->cargo_type] += v->cargo_cap;
}
if (v->cargo_cap > 0) SetBit(real_default_cargoes, v->cargo_type);
v = v->HasArticulatedPart() ? v->GetNextArticulatedPart() : nullptr;
} while (v != nullptr);
/* Check whether the vehicle carries more cargoes than expected */
bool carries_more = false;
for (CargoID cid = 0; cid < NUM_CARGO; cid++) {
if (real_default_capacity[cid] != 0 && purchase_default_capacity[cid] == 0) {
for (CargoID cid : SetCargoBitIterator(real_default_cargoes)) {
if (purchase_default_capacity[cid] == 0) {
carries_more = true;
break;
}

@ -173,11 +173,15 @@ class ReplaceVehicleWindow : public Window {
if (!CheckAutoreplaceValidity(this->sel_engine[0], eid, _local_company)) continue;
}
EngineDisplayFlags flags = (side == 0) ? EngineDisplayFlags::None : e->display_flags;
if (side == 1 && eid == this->sel_engine[0]) flags |= EngineDisplayFlags::Shaded;
list.emplace_back(eid, e->info.variant_id, flags, 0);
list.emplace_back(eid, e->info.variant_id, (side == 0) ? EngineDisplayFlags::None : e->display_flags, 0);
if (side == 1 && e->info.variant_id != INVALID_ENGINE) variants.push_back(e->info.variant_id);
if (side == 1) {
EngineID parent = e->info.variant_id;
while (parent != INVALID_ENGINE) {
variants.push_back(parent);
parent = Engine::Get(parent)->info.variant_id;
}
}
if (eid == this->sel_engine[side]) selected_engine = eid; // The selected engine is still in the list
}
@ -216,7 +220,7 @@ class ReplaceVehicleWindow : public Window {
/* We need to rebuild the left engines list */
this->GenerateReplaceVehList(true);
this->vscroll[0]->SetCount(this->engines[0].size());
if (this->reset_sel_engine && this->sel_engine[0] == INVALID_ENGINE && this->engines[0].size() != 0) {
if (this->reset_sel_engine && this->sel_engine[0] == INVALID_ENGINE && !this->engines[0].empty()) {
this->sel_engine[0] = this->engines[0][0].engine_id;
}
}
@ -564,8 +568,8 @@ public:
case WID_RV_TRAIN_ENGINEWAGON_DROPDOWN: {
DropDownList list;
list.emplace_back(new DropDownListStringItem(STR_REPLACE_ENGINES, 1, false));
list.emplace_back(new DropDownListStringItem(STR_REPLACE_WAGONS, 0, false));
list.push_back(std::make_unique<DropDownListStringItem>(STR_REPLACE_ENGINES, 1, false));
list.push_back(std::make_unique<DropDownListStringItem>(STR_REPLACE_WAGONS, 0, false));
ShowDropDownList(this, std::move(list), this->replace_engines ? 1 : 0, WID_RV_TRAIN_ENGINEWAGON_DROPDOWN);
break;
}

@ -95,7 +95,7 @@ struct BaseSet {
return Tnum_files - this->valid_files;
}
bool FillSetDetails(IniFile *ini, const std::string &path, const std::string &full_filename, bool allow_empty_filename = true);
bool FillSetDetails(const IniFile &ini, const std::string &path, const std::string &full_filename, bool allow_empty_filename = true);
/**
* Get the description for the given ISO code.
@ -244,7 +244,7 @@ struct GraphicsSet : BaseSet<GraphicsSet, MAX_GFT, true> {
PaletteType palette; ///< Palette of this graphics set
BlitterType blitter; ///< Blitter of this graphics set
bool FillSetDetails(struct IniFile *ini, const std::string &path, const std::string &full_filename);
bool FillSetDetails(const IniFile &ini, const std::string &path, const std::string &full_filename);
static MD5File::ChecksumResult CheckMD5(const MD5File *file, Subdirectory subdir);
};
@ -301,7 +301,7 @@ struct MusicSet : BaseSet<MusicSet, NUM_SONGS_AVAILABLE, false> {
/** Number of valid songs in set. */
byte num_available;
bool FillSetDetails(struct IniFile *ini, const std::string &path, const std::string &full_filename);
bool FillSetDetails(const IniFile &ini, const std::string &path, const std::string &full_filename);
};
/** All data/functions related with replacing the base music */

@ -38,10 +38,15 @@ extern void CheckExternalFiles();
* @return true if loading was successful.
*/
template <class T, size_t Tnum_files, bool Tsearch_in_tars>
bool BaseSet<T, Tnum_files, Tsearch_in_tars>::FillSetDetails(IniFile *ini, const std::string &path, const std::string &full_filename, bool allow_empty_filename)
bool BaseSet<T, Tnum_files, Tsearch_in_tars>::FillSetDetails(const IniFile &ini, const std::string &path, const std::string &full_filename, bool allow_empty_filename)
{
IniGroup *metadata = ini->GetGroup("metadata");
IniItem *item;
const IniGroup *metadata = ini.GetGroup("metadata");
if (metadata == nullptr) {
DEBUG(grf, 0, "Base " SET_TYPE "set detail loading: metadata missing.");
DEBUG(grf, 0, " Is %s readable for the user running OpenTTD?", full_filename.c_str());
return false;
}
const IniItem *item;
fetch_metadata("name");
this->name = *item->value;
@ -50,10 +55,10 @@ bool BaseSet<T, Tnum_files, Tsearch_in_tars>::FillSetDetails(IniFile *ini, const
this->description[std::string{}] = *item->value;
/* Add the translations of the descriptions too. */
for (item = metadata->item; item != nullptr; item = item->next) {
if (item->name.compare(0, 12, "description.") != 0) continue;
for (const IniItem &titem : metadata->items) {
if (titem.name.compare(0, 12, "description.") != 0) continue;
this->description[item->name.substr(12)] = item->value.value_or("");
this->description[titem.name.substr(12)] = titem.value.value_or("");
}
fetch_metadata("shortname");
@ -68,13 +73,13 @@ bool BaseSet<T, Tnum_files, Tsearch_in_tars>::FillSetDetails(IniFile *ini, const
this->fallback = (item != nullptr && item->value && *item->value != "0" && *item->value != "false");
/* For each of the file types we want to find the file, MD5 checksums and warning messages. */
IniGroup *files = ini->GetGroup("files");
IniGroup *md5s = ini->GetGroup("md5s");
IniGroup *origin = ini->GetGroup("origin");
const IniGroup *files = ini.GetGroup("files");
const IniGroup *md5s = ini.GetGroup("md5s");
const IniGroup *origin = ini.GetGroup("origin");
for (uint i = 0; i < Tnum_files; i++) {
MD5File *file = &this->files[i];
/* Find the filename first. */
item = files->GetItem(BaseSet<T, Tnum_files, Tsearch_in_tars>::file_names[i]);
item = files != nullptr ? files->GetItem(BaseSet<T, Tnum_files, Tsearch_in_tars>::file_names[i]) : nullptr;
if (item == nullptr || (!item->value.has_value() && !allow_empty_filename)) {
DEBUG(grf, 0, "No " SET_TYPE " file for: %s (in %s)", BaseSet<T, Tnum_files, Tsearch_in_tars>::file_names[i], full_filename.c_str());
return false;
@ -92,7 +97,7 @@ bool BaseSet<T, Tnum_files, Tsearch_in_tars>::FillSetDetails(IniFile *ini, const
file->filename = path + filename;
/* Then find the MD5 checksum */
item = md5s->GetItem(filename);
item = md5s != nullptr ? md5s->GetItem(filename) : nullptr;
if (item == nullptr || !item->value.has_value()) {
DEBUG(grf, 0, "No MD5 checksum specified for: %s (in %s)", filename.c_str(), full_filename.c_str());
return false;
@ -118,8 +123,8 @@ bool BaseSet<T, Tnum_files, Tsearch_in_tars>::FillSetDetails(IniFile *ini, const
}
/* Then find the warning message when the file's missing */
item = origin->GetItem(filename);
if (item == nullptr) item = origin->GetItem("default");
item = origin != nullptr ? origin->GetItem(filename) : nullptr;
if (item == nullptr) item = origin != nullptr ? origin->GetItem("default") : nullptr;
if (item == nullptr || !item->value.has_value()) {
DEBUG(grf, 1, "No origin warning message specified for: %s", filename.c_str());
file->missing_warning.clear();
@ -158,9 +163,9 @@ bool BaseMedia<Tbase_set>::AddFile(const std::string &filename, size_t basepath_
DEBUG(grf, 1, "Checking %s for base " SET_TYPE " set", filename.c_str());
Tbase_set *set = new Tbase_set();
IniFile *ini = new IniFile();
IniFile ini{};
std::string path{ filename, basepath_length };
ini->LoadFromDisk(path, BASESET_DIR);
ini.LoadFromDisk(path, BASESET_DIR);
auto psep = path.rfind(PATHSEPCHAR);
if (psep != std::string::npos) {
@ -217,7 +222,6 @@ bool BaseMedia<Tbase_set>::AddFile(const std::string &filename, size_t basepath_
delete set;
}
delete ini;
return ret;
}

@ -121,7 +121,7 @@ public:
#else
const char *default_blitter = "8bpp-optimized";
#endif
if (GetBlitters().size() == 0) return nullptr;
if (GetBlitters().empty()) return nullptr;
const char *bname = name.empty() ? default_blitter : name.c_str();
for (auto &it : GetBlitters()) {

@ -91,7 +91,7 @@ public:
this->InitNested(1);
}
void Close() override
void Close([[maybe_unused]] int data = 0) override
{
_exit_game = true;
this->Window::Close();
@ -149,7 +149,7 @@ public:
{
}
void Close() override
void Close([[maybe_unused]] int data = 0) override
{
/* If we are not set to exit the game, it means the bootstrap failed. */
if (!_exit_game) {
@ -207,7 +207,7 @@ public:
}
/** Stop listening to the content client events. */
void Close() override
void Close([[maybe_unused]] int data = 0) override
{
_network_content_client.RemoveCallback(this);
this->Window::Close();

@ -183,7 +183,7 @@ public:
this->vscroll->SetCount(this->bridges.size());
}
void Close() override
void Close(int data = 0) override
{
this->last_sorting = this->bridges.GetListing();
this->Window::Close();

@ -780,11 +780,12 @@ static uint GetCargoWeight(const CargoArray &cap, VehicleType vtype)
static int DrawCargoCapacityInfo(int left, int right, int y, TestedEngineDetails &te, bool refittable)
{
for (CargoID c = 0; c < NUM_CARGO; c++) {
if (te.all_capacities[c] == 0) continue;
for (const CargoSpec *cs : _sorted_cargo_specs) {
CargoID cid = cs->Index();
if (te.all_capacities[cid] == 0) continue;
SetDParam(0, c);
SetDParam(1, te.all_capacities[c]);
SetDParam(0, cid);
SetDParam(1, te.all_capacities[cid]);
SetDParam(2, refittable ? STR_PURCHASE_INFO_REFITTABLE : STR_EMPTY);
DrawString(left, right, y, STR_PURCHASE_INFO_CAPACITY);
y += FONT_HEIGHT_NORMAL;
@ -1694,7 +1695,14 @@ struct BuildVehicleWindow : BuildVehicleWindowBase {
list.emplace_back(eid, e->info.variant_id, e->display_flags, 0);
if (rvi->railveh_type != RAILVEH_WAGON) num_engines++;
if (e->info.variant_id != eid && e->info.variant_id != INVALID_ENGINE) variants.push_back(e->info.variant_id);
/* Add all parent variants of this engine to the variant list */
EngineID parent = e->info.variant_id;
while (parent != INVALID_ENGINE) {
variants.push_back(parent);
parent = Engine::Get(parent)->info.variant_id;
}
if (eid == this->sel_engine) sel_id = eid;
}
@ -1835,8 +1843,13 @@ struct BuildVehicleWindow : BuildVehicleWindowBase {
/* ensure primary engine of variant group is in list after filtering */
std::vector<EngineID> variants;
for (const auto &item : this->eng_list) {
if (item.engine_id != item.variant_id && item.variant_id != INVALID_ENGINE) variants.push_back(item.variant_id);
EngineID parent = item.variant_id;
while (parent != INVALID_ENGINE) {
variants.push_back(parent);
parent = Engine::Get(parent)->info.variant_id;
}
}
for (const auto &variant : variants) {
if (std::find(this->eng_list.begin(), this->eng_list.end(), variant) == this->eng_list.end()) {
const Engine *e = Engine::Get(variant);
@ -1933,13 +1946,14 @@ struct BuildVehicleWindow : BuildVehicleWindowBase {
if (cargo == CF_ANY || cargo == CF_ENGINES || cargo == CF_NONE) cargo = CT_INVALID;
DoCommandP(this->window_number, sel_eng | (cargo << 24), 0, cmd, callback);
/* Update last used variant and refresh if necessary. */
/* Update last used variant in hierarchy and refresh if necessary. */
bool refresh = false;
int recursion = 10; /* In case of infinite loop */
for (Engine *e = Engine::Get(sel_eng); recursion > 0; e = Engine::Get(e->info.variant_id), --recursion) {
EngineID parent = sel_eng;
while (parent != INVALID_ENGINE) {
Engine *e = Engine::Get(parent);
refresh |= (e->display_last_variant != sel_eng);
e->display_last_variant = sel_eng;
if (e->info.variant_id == INVALID_ENGINE) break;
parent = e->info.variant_id;
}
if (refresh) {
InvalidateWindowData(WC_REPLACE_VEHICLE, this->vehicle_type, 0); // Update the autoreplace window
@ -2629,7 +2643,14 @@ struct BuildVehicleWindowTrainAdvanced final : BuildVehicleWindowBase {
if (!FilterByText(state, engine)) continue;
list.emplace_back(eid, engine->info.variant_id, engine->display_flags, 0);
if (engine->info.variant_id != eid && engine->info.variant_id != INVALID_ENGINE) variants.push_back(engine->info.variant_id);
/* Add all parent variants of this engine to the variant list */
EngineID parent = engine->info.variant_id;
while (parent != INVALID_ENGINE) {
variants.push_back(parent);
parent = Engine::Get(parent)->info.variant_id;
}
if (eid == state.sel_engine) sel_id = eid;
}
@ -2695,13 +2716,14 @@ struct BuildVehicleWindowTrainAdvanced final : BuildVehicleWindowBase {
if (cargo == CF_ANY || cargo == CF_ENGINES) cargo = CF_NONE;
DoCommandP(this->window_number, selected | (cargo << 24), 0, cmd, callback);
/* Update last used variant and refresh if necessary. */
/* Update last used variant in hierarchy and refresh if necessary. */
bool refresh = false;
int recursion = 10; /* In case of infinite loop */
for (Engine *e = Engine::Get(selected); recursion > 0; e = Engine::Get(e->info.variant_id), --recursion) {
EngineID parent = selected;
while (parent != INVALID_ENGINE) {
Engine *e = Engine::Get(parent);
refresh |= (e->display_last_variant != selected);
e->display_last_variant = selected;
if (e->info.variant_id == INVALID_ENGINE) break;
parent = e->info.variant_id;
}
if (refresh) {
InvalidateWindowData(WC_REPLACE_VEHICLE, this->vehicle_type, 0); // Update the autoreplace window

@ -217,4 +217,9 @@ static inline bool IsCargoInClass(CargoID c, CargoClass cc)
using SetCargoBitIterator = SetBitIterator<CargoID, CargoTypes>;
/** Comparator to sort CargoID by according to desired order. */
struct CargoIDComparator {
bool operator() (const CargoID &lhs, const CargoID &rhs) const { return _sorted_cargo_types[lhs] < _sorted_cargo_types[rhs]; }
};
#endif /* CARGOTYPE_H */

@ -719,10 +719,10 @@ private:
if (default_livery != nullptr) {
/* Add COLOUR_END to put the colour out of range, but also allow us to show what the default is */
default_col = (primary ? default_livery->colour1 : default_livery->colour2) + COLOUR_END;
list.emplace_back(new DropDownListColourItem(default_col, false));
list.push_back(std::make_unique<DropDownListColourItem>(default_col, false));
}
for (uint i = 0; i < lengthof(_colour_dropdown); i++) {
list.emplace_back(new DropDownListColourItem(i, HasBit(used_colours, i)));
list.push_back(std::make_unique<DropDownListColourItem>(i, HasBit(used_colours, i)));
}
byte sel = (default_livery == nullptr || HasBit(livery->in_use, primary ? 0 : 1)) ? (primary ? livery->colour1 : livery->colour2) : default_col;
@ -1032,7 +1032,7 @@ public:
this->groups.ForceRebuild();
this->BuildGroupList((CompanyID)this->window_number);
if (this->groups.size() > 0) {
if (!this->groups.empty()) {
this->sel = this->groups[0]->index;
}
}
@ -1119,7 +1119,7 @@ public:
if (!Group::IsValidID(this->sel)) {
this->sel = INVALID_GROUP;
if (this->groups.size() > 0) this->sel = this->groups[0]->index;
if (!this->groups.empty()) this->sel = this->groups[0]->index;
}
this->SetDirty();
@ -2895,7 +2895,7 @@ struct BuyCompanyWindow : Window {
this->company_value = hostile_takeover ? CalculateHostileTakeoverValue(c) : c->bankrupt_value;
}
void Close() override
void Close(int data = 0) override
{
const Company *c = Company::GetIfValid((CompanyID)this->window_number);
if (!this->hostile_takeover && c != nullptr && HasBit(c->bankrupt_asked, this->owner) && _current_company == this->owner) {

@ -133,7 +133,7 @@ struct IConsoleWindow : Window
this->line_offset = GetStringBoundingBox("] ").width + WidgetDimensions::scaled.frametext.left;
}
void Close() override
void Close([[maybe_unused]] int data = 0) override
{
_iconsole_mode = ICONSOLE_CLOSED;
VideoDriver::GetInstance()->EditBoxLostFocus();

@ -55,7 +55,7 @@ class Kdtree {
/** Create one new node in the tree, return its index in the pool */
size_t AddNode(const T &element)
{
if (this->free_list.size() == 0) {
if (this->free_list.empty()) {
this->nodes.emplace_back(element);
return this->nodes.size() - 1;
} else {

@ -20,7 +20,7 @@
{
PoolVector *pools = PoolBase::GetPools();
pools->erase(std::find(pools->begin(), pools->end(), this));
if (pools->size() == 0) delete pools;
if (pools->empty()) delete pools;
}
/**

@ -85,7 +85,7 @@ public:
constexpr pointer data() const noexcept { return first; }
constexpr size_t size() const noexcept { return static_cast<size_t>( last - first ); }
constexpr std::ptrdiff_t ssize() const noexcept { return static_cast<std::ptrdiff_t>( last - first ); }
constexpr bool empty() const noexcept { return size() == 0; }
constexpr bool empty() const noexcept { return this->size() == 0; }
constexpr iterator begin() const noexcept { return iterator(first); }
constexpr iterator end() const noexcept { return iterator(last); }

@ -81,14 +81,14 @@ struct SetDateWindow : Window {
case WID_SD_DAY:
for (uint i = 0; i < 31; i++) {
list.emplace_back(new DropDownListStringItem(STR_DAY_NUMBER_1ST + i, i + 1, false));
list.push_back(std::make_unique<DropDownListStringItem>(STR_DAY_NUMBER_1ST + i, i + 1, false));
}
selected = this->date.day;
break;
case WID_SD_MONTH:
for (uint i = 0; i < 12; i++) {
list.emplace_back(new DropDownListStringItem(STR_MONTH_JAN + i, i, false));
list.push_back(std::make_unique<DropDownListStringItem>(STR_MONTH_JAN + i, i, false));
}
selected = this->date.month;
break;
@ -96,7 +96,7 @@ struct SetDateWindow : Window {
case WID_SD_YEAR:
for (Year i = this->min_year; i <= this->max_year; i++) {
SetDParam(0, i);
list.emplace_back(new DropDownListStringItem(STR_JUST_INT, i, false));
list.push_back(std::make_unique<DropDownListStringItem>(STR_JUST_INT, i, false));
}
selected = this->date.year;
break;

@ -296,7 +296,7 @@ struct DepotWindow : Window {
OrderBackup::Reset();
}
void Close() override
void Close([[maybe_unused]] int data = 0) override
{
CloseWindowById(WC_BUILD_VEHICLE, this->window_number);
CloseWindowById(GetWindowClassForVehicleType(this->type), VehicleListIdentifier(VL_DEPOT_LIST, this->type, this->owner, this->GetDepotIndex()).Pack(), false);
@ -812,7 +812,7 @@ struct DepotWindow : Window {
case WID_D_SELL_ALL:
/* Only open the confirmation window if there are anything to sell */
if (this->vehicle_list.size() != 0 || this->wagon_list.size() != 0) {
if (!this->vehicle_list.empty() || !this->wagon_list.empty()) {
SetDParam(0, this->type);
SetDParam(1, this->GetDepotIndex());
ShowQuery(
@ -877,7 +877,8 @@ struct DepotWindow : Window {
/* Build tooltipstring */
std::string details;
for (CargoID cargo_type = 0; cargo_type < NUM_CARGO; cargo_type++) {
for (const CargoSpec *cs : _sorted_cargo_specs) {
CargoID cargo_type = cs->Index();
if (capacity[cargo_type] == 0) continue;
SetDParam(0, cargo_type); // {CARGO} #1

@ -106,7 +106,7 @@ struct BuildDocksToolbarWindow : Window {
if (_settings_client.gui.link_terraform_toolbar) ShowTerraformToolbar(this);
}
void Close() override
void Close([[maybe_unused]] int data = 0) override
{
if (_game_mode == GM_NORMAL && this->IsWidgetLowered(WID_DT_STATION)) SetViewportCatchmentStation(nullptr, true);
if (_settings_client.gui.link_terraform_toolbar) CloseWindowById(WC_SCEN_LAND_GEN, 0, false);
@ -425,7 +425,7 @@ public:
this->LowerWidget(_settings_client.gui.station_show_coverage + BDSW_LT_OFF);
}
void Close() override
void Close([[maybe_unused]] int data = 0) override
{
CloseWindowById(WC_SELECT_STATION, 0);
this->PickerWindowBase::Close();

@ -110,7 +110,7 @@ void DriverFactoryBase::SelectDriver(const std::string &name, Driver::Type type)
*/
bool DriverFactoryBase::SelectDriverImpl(const std::string &name, Driver::Type type)
{
if (GetDrivers().size() == 0) return false;
if (GetDrivers().empty()) return false;
if (name.empty()) {
/* Probe for this driver, but do not fall back to dedicated/null! */

@ -486,7 +486,8 @@ uint Engine::GetDisplayMaxTractiveEffort() const
*/
Date Engine::GetLifeLengthInDays() const
{
return DateAtStartOfYear(this->info.lifelength + _settings_game.vehicle.extend_vehicle_life);
/* Assume leap years; this gives the player a bit more than the given amount of years, but never less. */
return static_cast<int32_t>(this->info.lifelength + _settings_game.vehicle.extend_vehicle_life) * DAYS_IN_LEAP_YEAR;
}
/**
@ -539,7 +540,7 @@ bool Engine::IsVariantHidden(CompanyID c) const
* the last display variant rather than the actual parent variant. */
const Engine *re = this;
const Engine *ve = re->GetDisplayVariant();
while (!(ve->IsHidden(c)) && re->info.variant_id != INVALID_ENGINE && re->info.variant_id != re->index) {
while (!(ve->IsHidden(c)) && re->info.variant_id != INVALID_ENGINE) {
re = Engine::Get(re->info.variant_id);
ve = re->GetDisplayVariant();
}
@ -668,7 +669,7 @@ void CalcEngineReliability(Engine *e, bool new_month)
{
/* Get source engine for reliability age. This is normally our engine unless variant reliability syncing is requested. */
Engine *re = e;
while (re->info.variant_id != INVALID_ENGINE && re->info.variant_id != re->index && (re->info.extra_flags & ExtraEngineFlags::SyncReliability) != ExtraEngineFlags::None) {
while (re->info.variant_id != INVALID_ENGINE && (re->info.extra_flags & ExtraEngineFlags::SyncReliability) != ExtraEngineFlags::None) {
re = Engine::Get(re->info.variant_id);
}
@ -725,7 +726,7 @@ void SetYearEngineAgingStops()
/* Base year ending date on half the model life */
YearMonthDay ymd;
ConvertDateToYMD(ei->base_intro + DateAtStartOfYear(ei->lifelength) / 2, &ymd);
ConvertDateToYMD(ei->base_intro + (static_cast<int32_t>(ei->lifelength) * DAYS_IN_LEAP_YEAR) / 2, &ymd);
_year_engine_aging_stops = std::max(_year_engine_aging_stops, ymd.year);
}
@ -768,7 +769,7 @@ void StartupOneEngine(Engine *e, Date aging_date, uint32 seed, Date no_introduce
/* Get parent variant index for syncing reliability via random seed. */
const Engine *re = e;
while (re->info.variant_id != INVALID_ENGINE && re->info.variant_id != re->index && (re->info.extra_flags & ExtraEngineFlags::SyncReliability) != ExtraEngineFlags::None) {
while (re->info.variant_id != INVALID_ENGINE && (re->info.extra_flags & ExtraEngineFlags::SyncReliability) != ExtraEngineFlags::None) {
re = Engine::Get(re->info.variant_id);
}

@ -308,7 +308,7 @@ public:
this->Close();
}
void Close() override
void Close([[maybe_unused]] int data = 0) override
{
SetRedErrorSquare(INVALID_TILE);
if (_window_system_initialized) ShowFirstError();

@ -14,6 +14,7 @@
#include "fios.h"
#include "string_func.h"
#include "tar_type.h"
#include "3rdparty/cpp-btree/btree_set.h"
#ifdef _WIN32
#include <windows.h>
# define access _taccess
@ -84,6 +85,8 @@ static bool IsValidSearchPath(Searchpath sp)
static void FillValidSearchPaths(bool only_local_path)
{
_valid_searchpaths.clear();
btree::btree_set<std::string_view> seen{};
for (Searchpath sp = SP_FIRST_DIR; sp < NUM_SEARCHPATHS; sp++) {
if (only_local_path) {
switch (sp) {
@ -97,7 +100,11 @@ static void FillValidSearchPaths(bool only_local_path)
}
}
if (IsValidSearchPath(sp)) _valid_searchpaths.emplace_back(sp);
if (IsValidSearchPath(sp)) {
if (seen.count(_searchpaths[sp]) != 0) continue;
seen.insert(_searchpaths[sp]);
_valid_searchpaths.emplace_back(sp);
}
}
}

@ -409,7 +409,7 @@ public:
}
}
void Close() override
void Close([[maybe_unused]] int data = 0) override
{
/* pause is only used in single-player, non-editor mode, non menu mode */
if (!_networking && _game_mode != GM_EDITOR && _game_mode != GM_MENU) {

@ -111,7 +111,7 @@ struct GSConfigWindow : public Window {
this->RebuildVisibleSettings();
}
void Close() override
void Close([[maybe_unused]] int data = 0) override
{
HideDropDownMenu(this);
CloseWindowByClass(WC_SCRIPT_LIST);
@ -318,7 +318,7 @@ struct GSConfigWindow : public Window {
DropDownList list;
for (int i = config_item.min_value; i <= config_item.max_value; i++) {
list.emplace_back(new DropDownListStringItem(config_item.labels.find(i)->second, i, false));
list.push_back(std::make_unique<DropDownListStringItem>(config_item.labels.find(i)->second, i, false));
}
ShowDropDownListAt(this, std::move(list), old_val, WID_GSC_SETTING_DROPDOWN, wi_rect, COLOUR_ORANGE);

@ -34,7 +34,7 @@ void GameScannerInfo::RegisterAPI(class Squirrel *engine)
GameInfo *GameScannerInfo::FindInfo(const std::string &name, int version, bool force_exact_match)
{
if (this->info_list.size() == 0) return nullptr;
if (this->info_list.empty()) return nullptr;
if (name.empty()) return nullptr;
if (version == -1) {

@ -328,8 +328,8 @@ static const NWidgetPart _nested_heightmap_load_widgets[] = {
NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_START_DATE_UP), SetDataTip(SPR_ARROW_UP, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD), SetFill(0, 1),
EndContainer(),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWNNAME_DROPDOWN), SetDataTip(STR_JUST_STRING, STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP), SetFill(1, 0),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWN_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_INDUSTRY_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWN_PULLDOWN), SetDataTip(STR_JUST_STRING1, STR_NULL), SetFill(1, 0),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_INDUSTRY_PULLDOWN), SetDataTip(STR_JUST_STRING1, STR_NULL), SetFill(1, 0),
EndContainer(),
EndContainer(),
EndContainer(),
@ -404,7 +404,7 @@ static DropDownList BuildMapsizeDropDown(int other_dimension)
for (uint i = MIN_MAP_SIZE_BITS; i <= MAX_MAP_SIZE_BITS; i++) {
SetDParam(0, 1LL << i);
list.emplace_back(new DropDownListStringItem((i + other_dimension > MAX_MAP_TILES_BITS) ? STR_RED_INT : STR_JUST_INT, i, false));
list.push_back(std::make_unique<DropDownListStringItem>((i + other_dimension > MAX_MAP_TILES_BITS) ? STR_RED_INT : STR_JUST_INT, i, false));
}
return list;
@ -417,20 +417,20 @@ static DropDownList BuildTownNameDropDown()
/* Add and sort newgrf townnames generators */
const auto &grf_names = GetGRFTownNameList();
for (uint i = 0; i < grf_names.size(); i++) {
list.emplace_back(new DropDownListStringItem(grf_names[i], BUILTIN_TOWNNAME_GENERATOR_COUNT + i, false));
list.push_back(std::make_unique<DropDownListStringItem>(grf_names[i], BUILTIN_TOWNNAME_GENERATOR_COUNT + i, false));
}
std::sort(list.begin(), list.end(), DropDownListStringItem::NatSortFunc);
size_t newgrf_size = list.size();
/* Insert newgrf_names at the top of the list */
if (newgrf_size > 0) {
list.emplace_back(new DropDownListItem(-1, false)); // separator line
list.push_back(std::make_unique<DropDownListItem>(-1, false)); // separator line
newgrf_size++;
}
/* Add and sort original townnames generators */
for (uint i = 0; i < BUILTIN_TOWNNAME_GENERATOR_COUNT; i++) {
list.emplace_back(new DropDownListStringItem(STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH + i, i, false));
list.push_back(std::make_unique<DropDownListStringItem>(STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH + i, i, false));
}
std::sort(list.begin() + newgrf_size, list.end(), DropDownListStringItem::NatSortFunc);

@ -696,7 +696,7 @@ int DrawString(int left, int right, int top, std::string_view str, TextColour co
}
Layouter layout(str, INT32_MAX, colour, fontsize);
if (layout.size() == 0) return 0;
if (layout.empty()) return 0;
return DrawLayoutLine(*layout.front(), top, left, right, align, underline, true);
}

@ -39,22 +39,20 @@ class FallbackParagraphLayout : public ParagraphLayouter {
public:
/** Visual run contains data about the bit of text with the same font. */
class FallbackVisualRun : public ParagraphLayouter::VisualRun {
std::vector<GlyphID> glyphs; ///< The glyphs we're drawing.
std::vector<float> positions; ///< The positions of the glyphs.
std::vector<int> glyph_to_char; ///< The char index of the glyphs.
Font *font; ///< The font used to layout these.
GlyphID *glyphs; ///< The glyphs we're drawing.
float *positions; ///< The positions of the glyphs.
int *glyph_to_char; ///< The char index of the glyphs.
int glyph_count; ///< The number of glyphs.
public:
FallbackVisualRun(Font *font, const WChar *chars, int glyph_count, int char_offset, int x);
FallbackVisualRun(FallbackVisualRun &&other) noexcept;
~FallbackVisualRun() override;
const Font *GetFont() const override;
int GetGlyphCount() const override;
const GlyphID *GetGlyphs() const override;
const float *GetPositions() const override;
int GetLeading() const override;
const int *GetGlyphToCharMap() const override;
FallbackVisualRun(Font *font, const char32_t *chars, int glyph_count, int char_offset, int x);
const Font *GetFont() const override { return this->font; }
int GetGlyphCount() const override { return static_cast<int>(this->glyphs.size()); }
const GlyphID *GetGlyphs() const override { return this->glyphs.data(); }
const float *GetPositions() const override { return this->positions.data(); }
int GetLeading() const override { return this->GetFont()->fc->GetHeight(); }
const int *GetGlyphToCharMap() const override { return this->glyph_to_char.data(); }
};
/** A single line worth of VisualRuns. */
@ -111,20 +109,20 @@ public:
* @param char_offset This run's offset from the start of the layout input string.
* @param x The initial x position for this run.
*/
FallbackParagraphLayout::FallbackVisualRun::FallbackVisualRun(Font *font, const WChar *chars, int char_count, int char_offset, int x) :
font(font), glyph_count(char_count)
FallbackParagraphLayout::FallbackVisualRun::FallbackVisualRun(Font *font, const char32_t *chars, int char_count, int char_offset, int x) :
font(font)
{
const bool isbuiltin = font->fc->IsBuiltInFont();
this->glyphs = MallocT<GlyphID>(this->glyph_count);
this->glyph_to_char = MallocT<int>(this->glyph_count);
this->glyphs.reserve(char_count);
this->glyph_to_char.reserve(char_count);
/* Positions contains the location of the begin of each of the glyphs, and the end of the last one. */
this->positions = MallocT<float>(this->glyph_count * 2 + 2);
this->positions.resize(char_count * 2 + 2);
this->positions[0] = x;
for (int i = 0; i < this->glyph_count; i++) {
this->glyphs[i] = font->fc->MapCharToGlyph(chars[i]);
for (int i = 0; i < char_count; i++) {
const GlyphID &glyph_id = this->glyphs.emplace_back(font->fc->MapCharToGlyph(chars[i]));
if (isbuiltin) {
this->positions[2 * i + 1] = font->fc->GetAscender(); // Apply sprite font's ascender.
} else if (chars[i] >= SCC_SPRITE_START && chars[i] <= SCC_SPRITE_END) {
@ -132,85 +130,11 @@ FallbackParagraphLayout::FallbackVisualRun::FallbackVisualRun(Font *font, const
} else {
this->positions[2 * i + 1] = 0; // No ascender adjustment.
}
this->positions[2 * i + 2] = this->positions[2 * i] + font->fc->GetGlyphWidth(this->glyphs[i]);
this->glyph_to_char[i] = char_offset + i;
this->positions[2 * i + 2] = this->positions[2 * i] + font->fc->GetGlyphWidth(glyph_id);
this->glyph_to_char.push_back(char_offset + i);
}
}
/** Move constructor for visual runs.*/
FallbackParagraphLayout::FallbackVisualRun::FallbackVisualRun(FallbackVisualRun &&other) noexcept : font(other.font), glyph_count(other.glyph_count)
{
this->positions = other.positions;
this->glyph_to_char = other.glyph_to_char;
this->glyphs = other.glyphs;
other.positions = nullptr;
other.glyph_to_char = nullptr;
other.glyphs = nullptr;
}
/** Free all data. */
FallbackParagraphLayout::FallbackVisualRun::~FallbackVisualRun()
{
free(this->positions);
free(this->glyph_to_char);
free(this->glyphs);
}
/**
* Get the font associated with this run.
* @return The font.
*/
const Font *FallbackParagraphLayout::FallbackVisualRun::GetFont() const
{
return this->font;
}
/**
* Get the number of glyphs in this run.
* @return The number of glyphs.
*/
int FallbackParagraphLayout::FallbackVisualRun::GetGlyphCount() const
{
return this->glyph_count;
}
/**
* Get the glyphs of this run.
* @return The glyphs.
*/
const GlyphID *FallbackParagraphLayout::FallbackVisualRun::GetGlyphs() const
{
return this->glyphs;
}
/**
* Get the positions of this run.
* @return The positions.
*/
const float *FallbackParagraphLayout::FallbackVisualRun::GetPositions() const
{
return this->positions;
}
/**
* Get the glyph-to-character map for this visual run.
* @return The glyph-to-character map.
*/
const int *FallbackParagraphLayout::FallbackVisualRun::GetGlyphToCharMap() const
{
return this->glyph_to_char;
}
/**
* Get the height of this font.
* @return The height of the font.
*/
int FallbackParagraphLayout::FallbackVisualRun::GetLeading() const
{
return this->GetFont()->fc->GetHeight();
}
/**
* Get the height of the line.
* @return The maximum height of the line.
@ -231,7 +155,7 @@ int FallbackParagraphLayout::FallbackLine::GetLeading() const
*/
int FallbackParagraphLayout::FallbackLine::GetWidth() const
{
if (this->size() == 0) return 0;
if (this->empty()) return 0;
/*
* The last X position of a run contains is the end of that run.
@ -369,7 +293,7 @@ std::unique_ptr<const ParagraphLayouter::Line> FallbackParagraphLayout::NextLine
this->buffer++;
}
if (l->size() == 0 || last_char - begin > 0) {
if (l->empty() || last_char - begin > 0) {
int w = l->GetWidth();
l->emplace_back(iter->second, begin, last_char - begin, begin - this->buffer_begin, w);
}

@ -132,7 +132,7 @@ ICUParagraphLayout::ICUVisualRun::ICUVisualRun(const ICURun &run, int x) :
glyphs(run.glyphs), glyph_to_char(run.glyph_to_char), total_advance(run.total_advance), font(run.font)
{
/* If there are no positions, the ICURun was not Shaped; that should never happen. */
assert(run.positions.size() != 0);
assert(!run.positions.empty());
this->positions.reserve(run.positions.size());
/* "positions" is an array of x/y. So we need to alternate. */
@ -380,7 +380,7 @@ std::vector<ICURun> ItemizeStyle(std::vector<ICURun> &runs_current, FontMap &fon
runs = ItemizeScript(buff, length, runs);
runs = ItemizeStyle(runs, font_mapping);
if (runs.size() == 0) return nullptr;
if (runs.empty()) return nullptr;
for (auto &run : runs) {
run.Shape(buff, length);

@ -546,12 +546,13 @@ void GfxLoadSprites()
DEBUG(sprite, 2, "Completed loading sprite set %d", _settings_game.game_creation.landscape);
}
bool GraphicsSet::FillSetDetails(IniFile *ini, const std::string &path, const std::string &full_filename)
bool GraphicsSet::FillSetDetails(const IniFile &ini, const std::string &path, const std::string &full_filename)
{
bool ret = this->BaseSet<GraphicsSet, MAX_GFT, true>::FillSetDetails(ini, path, full_filename, false);
if (ret) {
IniGroup *metadata = ini->GetGroup("metadata");
IniItem *item;
const IniGroup *metadata = ini.GetGroup("metadata");
assert(metadata != nullptr); /* ret can't be true if metadata isn't present. */
const IniItem *item;
fetch_metadata("palette");
this->palette = ((*item->value)[0] == 'D' || (*item->value)[0] == 'd') ? PAL_DOS : PAL_WINDOWS;

@ -447,7 +447,7 @@ public:
this->SortVehicleList();
}
void Close() override
void Close(int data = 0) override
{
*this->sorting = this->vehgroups.GetListing();
this->Window::Close();
@ -591,7 +591,7 @@ public:
/* Disable all lists management button when the list is empty */
this->SetWidgetDisabledState(WID_GL_MANAGE_VEHICLES_DROPDOWN, !this->ShouldShowActionDropdownList() || _local_company != this->vli.company);
this->SetWidgetsDisabledState(this->vehicles.size() == 0 || _local_company != this->vli.company || (IsTopLevelGroupID(this->vli.index) && _settings_client.gui.disable_top_veh_list_mass_actions),
this->SetWidgetsDisabledState(this->vehicles.empty() || _local_company != this->vli.company || (IsTopLevelGroupID(this->vli.index) && _settings_client.gui.disable_top_veh_list_mass_actions),
WID_GL_STOP_ALL,
WID_GL_START_ALL);

@ -122,7 +122,7 @@ struct EndGameWindow : EndGameHighScoreBaseWindow {
MarkWholeScreenDirty();
}
void Close() override
void Close([[maybe_unused]] int data = 0) override
{
if (!_networking) DoCommandP(0, PM_PAUSED_NORMAL, 0, CMD_PAUSE); // unpause
if (_game_mode != GM_MENU) ShowHighscoreTable(this->window_number, this->rank);
@ -170,7 +170,7 @@ struct HighScoreWindow : EndGameHighScoreBaseWindow {
this->rank = ranking;
}
void Close() override
void Close([[maybe_unused]] int data = 0) override
{
if (_game_mode != GM_MENU) ShowVitalWindows();

@ -279,11 +279,12 @@ HotkeyList::~HotkeyList()
* Load HotkeyList from IniFile.
* @param ini IniFile to load from.
*/
void HotkeyList::Load(IniFile *ini)
void HotkeyList::Load(const IniFile &ini)
{
IniGroup *group = ini->GetGroup(this->ini_group);
const IniGroup *group = ini.GetGroup(this->ini_group);
if (group == nullptr) return;
for (Hotkey *hotkey = this->items; hotkey->name != nullptr; ++hotkey) {
IniItem *item = group->GetItem(hotkey->name);
const IniItem *item = group->GetItem(hotkey->name);
if (item != nullptr) {
hotkey->keycodes.clear();
if (item->value.has_value()) ParseHotkeys(hotkey, item->value->c_str());
@ -295,11 +296,11 @@ void HotkeyList::Load(IniFile *ini)
* Save HotkeyList to IniFile.
* @param ini IniFile to save to.
*/
void HotkeyList::Save(IniFile *ini) const
void HotkeyList::Save(IniFile &ini) const
{
IniGroup *group = ini->GetGroup(this->ini_group);
IniGroup &group = ini.GetOrCreateGroup(this->ini_group);
for (const Hotkey *hotkey = this->items; hotkey->name != nullptr; ++hotkey) {
IniItem &item = group->GetOrCreateItem(hotkey->name);
IniItem &item = group.GetOrCreateItem(hotkey->name);
item.SetValue(SaveKeycodes(hotkey));
}
}
@ -325,8 +326,8 @@ int HotkeyList::CheckMatch(uint16 keycode, bool global_only) const
static void SaveLoadHotkeys(bool save)
{
IniFile *ini = new IniFile();
ini->LoadFromDisk(_hotkeys_file, NO_DIRECTORY);
IniFile ini{};
ini.LoadFromDisk(_hotkeys_file, NO_DIRECTORY);
for (HotkeyList *list : *_hotkey_lists) {
if (save) {
@ -336,8 +337,7 @@ static void SaveLoadHotkeys(bool save)
}
}
if (save) ini->SaveToDisk(_hotkeys_file);
delete ini;
if (save) ini.SaveToDisk(_hotkeys_file);
}

@ -43,8 +43,8 @@ struct HotkeyList {
HotkeyList(const char *ini_group, Hotkey *items, GlobalHotkeyHandlerFunc global_hotkey_handler = nullptr);
~HotkeyList();
void Load(IniFile *ini);
void Save(IniFile *ini) const;
void Load(const IniFile &ini);
void Save(IniFile &ini) const;
int CheckMatch(uint16 keycode, bool global_only = false) const;

@ -2797,7 +2797,7 @@ static void CanCargoServiceIndustry(CargoID cargo, Industry *ind, bool *c_accept
*/
int WhoCanServiceIndustry(Industry *ind)
{
if (ind->stations_near.size() == 0) return 0; // No stations found at all => nobody services
if (ind->stations_near.empty()) return 0; // No stations found at all => nobody services
int result = 0;
for (const Vehicle *v : Vehicle::Iterate()) {

@ -1639,7 +1639,7 @@ public:
this->industry_editbox.cancel_button = QueryString::ACTION_CLEAR;
}
void Close() override
void Close(int data = 0) override
{
this->last_sorting = this->industries.GetListing();
this->Window::Close();
@ -1677,7 +1677,7 @@ public:
case WID_ID_INDUSTRY_LIST: {
int n = 0;
Rect ir = r.Shrink(WidgetDimensions::scaled.framerect);
if (this->industries.size() == 0) {
if (this->industries.empty()) {
DrawString(ir, STR_INDUSTRY_DIRECTORY_NONE);
break;
}
@ -1932,11 +1932,6 @@ enum CargoesFieldType {
static const uint MAX_CARGOES = 16; ///< Maximum number of cargoes carried in a #CFT_CARGO field in #CargoesField.
static bool CargoIDSorter(const CargoID &a, const CargoID &b)
{
return _sorted_cargo_types[a] < _sorted_cargo_types[b];
}
/** Data about a single field in the #IndustryCargoesWindow panel. */
struct CargoesField {
static int vert_inter_industry_space;
@ -2066,7 +2061,8 @@ struct CargoesField {
}
}
this->u.cargo.num_cargoes = (count < 0) ? static_cast<uint8_t>(insert - std::begin(this->u.cargo.vertical_cargoes)) : count;
std::sort(std::begin(this->u.cargo.vertical_cargoes), insert, &CargoIDSorter);
CargoIDComparator comparator;
std::sort(std::begin(this->u.cargo.vertical_cargoes), insert, comparator);
std::fill(insert, std::end(this->u.cargo.vertical_cargoes), CT_INVALID);
this->u.cargo.top_end = top_end;
this->u.cargo.bottom_end = bottom_end;
@ -2582,8 +2578,7 @@ struct IndustryCargoesWindow : public Window {
/* Compute max size of the cargo texts. */
this->cargo_textsize.width = 0;
this->cargo_textsize.height = 0;
for (uint i = 0; i < NUM_CARGO; i++) {
const CargoSpec *csp = CargoSpec::Get(i);
for (const CargoSpec *csp : CargoSpec::Iterate()) {
if (!csp->IsValid()) continue;
this->cargo_textsize = maxdim(this->cargo_textsize, GetStringBoundingBox(csp->name));
}
@ -3107,7 +3102,7 @@ struct IndustryCargoesWindow : public Window {
case WID_IC_CARGO_DROPDOWN: {
DropDownList lst;
for (const CargoSpec *cs : _sorted_standard_cargo_specs) {
lst.emplace_back(new DropDownListStringItem(cs->name, cs->Index(), false));
lst.push_back(std::make_unique<DropDownListStringItem>(cs->name, cs->Index(), false));
}
if (!lst.empty()) {
int selected = (this->ind_cargo >= NUM_INDUSTRYTYPES) ? (int)(this->ind_cargo - NUM_INDUSTRYTYPES) : -1;
@ -3121,7 +3116,7 @@ struct IndustryCargoesWindow : public Window {
for (IndustryType ind : _sorted_industry_types) {
const IndustrySpec *indsp = GetIndustrySpec(ind);
if (!indsp->enabled) continue;
lst.emplace_back(new DropDownListStringItem(indsp->name, ind, false));
lst.push_back(std::make_unique<DropDownListStringItem>(indsp->name, ind, false));
}
if (!lst.empty()) {
int selected = (this->ind_cargo < NUM_INDUSTRYTYPES) ? (int)this->ind_cargo : -1;

@ -32,9 +32,9 @@
/**
* Create a new ini file with given group names.
* @param list_group_names A \c nullptr terminated list with group names that should be loaded as lists instead of variables. @see IGT_LIST
* @param list_group_names A list with group names that should be loaded as lists instead of variables. @see IGT_LIST
*/
IniFile::IniFile(const char * const *list_group_names) : IniLoadFile(list_group_names)
IniFile::IniFile(const IniGroupNameList &list_group_names) : IniLoadFile(list_group_names)
{
}
@ -56,20 +56,20 @@ bool IniFile::SaveToDisk(const std::string &filename)
std::ofstream os(OTTD2FS(file_new).c_str());
if (os.fail()) return false;
for (const IniGroup *group = this->group; group != nullptr; group = group->next) {
os << group->comment << "[" << group->name << "]\n";
for (const IniItem *item = group->item; item != nullptr; item = item->next) {
os << item->comment;
for (const IniGroup &group : this->groups) {
os << group.comment << "[" << group.name << "]\n";
for (const IniItem &item : group.items) {
os << item.comment;
/* protect item->name with quotes if needed */
if (item->name.find(' ') != std::string::npos ||
item->name[0] == '[') {
os << "\"" << item->name << "\"";
if (item.name.find(' ') != std::string::npos ||
item.name[0] == '[') {
os << "\"" << item.name << "\"";
} else {
os << item->name;
os << item.name;
}
os << " = " << item->value.value_or("") << "\n";
os << " = " << item.value.value_or("") << "\n";
}
}
os << this->comment;

@ -20,18 +20,9 @@
* @param parent the group we belong to
* @param name the name of the item
*/
IniItem::IniItem(IniGroup *parent, const std::string &name) : next(nullptr)
IniItem::IniItem(const std::string &name)
{
this->name = StrMakeValid(name);
*parent->last_item = this;
parent->last_item = &this->next;
}
/** Free everything we loaded. */
IniItem::~IniItem()
{
delete this->next;
}
/**
@ -48,37 +39,9 @@ void IniItem::SetValue(const std::string_view value)
* @param parent the file we belong to
* @param name the name of the group
*/
IniGroup::IniGroup(IniLoadFile *parent, const std::string &name) : next(nullptr), type(IGT_VARIABLES), item(nullptr)
IniGroup::IniGroup(const std::string &name, IniGroupType type) : type(type)
{
this->name = StrMakeValid(name);
this->last_item = &this->item;
*parent->last_group = this;
parent->last_group = &this->next;
if (parent->list_group_names != nullptr) {
for (uint i = 0; parent->list_group_names[i] != nullptr; i++) {
if (this->name == parent->list_group_names[i]) {
this->type = IGT_LIST;
return;
}
}
}
if (parent->seq_group_names != nullptr) {
for (uint i = 0; parent->seq_group_names[i] != nullptr; i++) {
if (this->name == parent->seq_group_names[i]) {
this->type = IGT_SEQUENCE;
return;
}
}
}
}
/** Free everything we loaded. */
IniGroup::~IniGroup()
{
delete this->item;
delete this->next;
}
/**
@ -86,10 +49,10 @@ IniGroup::~IniGroup()
* @param name name of the item to find.
* @return the requested item or nullptr if not found.
*/
IniItem *IniGroup::GetItem(const std::string &name) const
const IniItem *IniGroup::GetItem(const std::string &name) const
{
for (IniItem *item = this->item; item != nullptr; item = item->next) {
if (item->name == name) return item;
for (const IniItem &item : this->items) {
if (item.name == name) return &item;
}
return nullptr;
@ -102,12 +65,22 @@ IniItem *IniGroup::GetItem(const std::string &name) const
*/
IniItem &IniGroup::GetOrCreateItem(const std::string &name)
{
for (IniItem *item = this->item; item != nullptr; item = item->next) {
if (item->name == name) return *item;
for (IniItem &item : this->items) {
if (item.name == name) return item;
}
/* Item doesn't exist, make a new one. */
return *(new IniItem(this, name));
return this->CreateItem(name);
}
/**
* Create an item with the given name. This does not reuse an existing item of the same name.
* @param name name of the item to create.
* @return the created item.
*/
IniItem &IniGroup::CreateItem(const std::string &name)
{
return this->items.emplace_back(name);
}
/**
@ -116,22 +89,7 @@ IniItem &IniGroup::GetOrCreateItem(const std::string &name)
*/
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;
/* "last_item" is a pointer to the "real-last-item"->next. */
if (this->last_item == &item->next) {
this->last_item = prev;
}
item->next = nullptr;
delete item;
return;
}
this->items.remove_if([&name](const IniItem &item) { return item.name == name; });
}
/**
@ -139,81 +97,85 @@ void IniGroup::RemoveItem(const std::string &name)
*/
void IniGroup::Clear()
{
delete this->item;
this->item = nullptr;
this->last_item = &this->item;
this->items.clear();
}
/**
* Construct a new in-memory Ini file representation.
* @param list_group_names A \c nullptr terminated list with group names that should be loaded as lists instead of variables. @see IGT_LIST
* @param seq_group_names A \c nullptr terminated list with group names that should be loaded as lists of names. @see IGT_SEQUENCE
* @param list_group_names A list with group names that should be loaded as lists instead of variables. @see IGT_LIST
* @param seq_group_names A list with group names that should be loaded as lists of names. @see IGT_SEQUENCE
*/
IniLoadFile::IniLoadFile(const char * const *list_group_names, const char * const *seq_group_names) :
group(nullptr),
IniLoadFile::IniLoadFile(const IniGroupNameList &list_group_names, const IniGroupNameList &seq_group_names) :
list_group_names(list_group_names),
seq_group_names(seq_group_names)
{
this->last_group = &this->group;
}
/** Free everything we loaded. */
IniLoadFile::~IniLoadFile()
/**
* Get the group with the given name.
* @param name name of the group to find.
* @return The requested group or \c nullptr if not found.
*/
const IniGroup *IniLoadFile::GetGroup(const std::string &name) const
{
delete this->group;
for (const IniGroup &group : this->groups) {
if (group.name == name) return &group;
}
return nullptr;
}
/**
* Get the group with the given name. If it doesn't exist
* and \a create_new is \c true create a new group.
* Get the group with the given name.
* @param name name of the group to find.
* @param create_new Allow creation of group if it does not exist.
* @return The requested group if it exists or was created, else \c nullptr.
* @return The requested group or \c nullptr if not found.
*/
IniGroup *IniLoadFile::GetGroup(const std::string &name, bool create_new)
IniGroup *IniLoadFile::GetGroup(const std::string &name)
{
/* does it exist already? */
for (IniGroup *group = this->group; group != nullptr; group = group->next) {
if (group->name == name) return group;
for (IniGroup &group : this->groups) {
if (group.name == name) return &group;
}
if (!create_new) return nullptr;
/* otherwise make a new one */
IniGroup *group = new IniGroup(this, name);
group->comment = "\n";
return group;
return nullptr;
}
/**
* Remove the group with the given name.
* @param name name of the group to remove.
* Get the group with the given name, and if it doesn't exist create a new group.
* @param name name of the group to find.
* @return the requested group.
*/
void IniLoadFile::RemoveGroup(const char *name)
IniGroup &IniLoadFile::GetOrCreateGroup(const std::string &name)
{
size_t len = strlen(name);
IniGroup *prev = nullptr;
IniGroup *group;
/* does it exist already? */
for (group = this->group; group != nullptr; prev = group, group = group->next) {
if (group->name.compare(0, len, name) == 0) {
break;
}
for (IniGroup &group : this->groups) {
if (group.name == name) return group;
}
if (group == nullptr) return;
/* Group doesn't exist, make a new one. */
return this->CreateGroup(name);
}
if (prev != nullptr) {
prev->next = prev->next->next;
if (this->last_group == &group->next) this->last_group = &prev->next;
} else {
this->group = this->group->next;
if (this->last_group == &group->next) this->last_group = &this->group;
}
/**
* Create an group with the given name. This does not reuse an existing group of the same name.
* @param name name of the group to create.
* @return the created group.
*/
IniGroup &IniLoadFile::CreateGroup(const std::string &name)
{
IniGroupType type = IGT_VARIABLES;
if (std::find(this->list_group_names.begin(), this->list_group_names.end(), name) != this->list_group_names.end()) type = IGT_LIST;
if (std::find(this->seq_group_names.begin(), this->seq_group_names.end(), name) != this->seq_group_names.end()) type = IGT_SEQUENCE;
return this->groups.emplace_back(name, type);
}
group->next = nullptr;
delete group;
/**
* Remove the group with the given name.
* @param name name of the group to remove.
*/
void IniLoadFile::RemoveGroup(const std::string &name)
{
size_t len = name.length();
this->groups.remove_if([&name, &len](const IniGroup &group) { return group.name.compare(0, len, name) == 0; });
}
/**
@ -224,7 +186,7 @@ void IniLoadFile::RemoveGroup(const char *name)
*/
void IniLoadFile::LoadFromDisk(const std::string &filename, Subdirectory subdir, std::string *save)
{
assert(this->last_group == &this->group);
assert(this->groups.empty());
char buffer[1024];
IniGroup *group = nullptr;
@ -281,7 +243,7 @@ void IniLoadFile::LoadFromDisk(const std::string &filename, Subdirectory subdir,
e--;
}
s++; // skip [
group = new IniGroup(this, std::string(s, e - s));
group = &this->CreateGroup(std::string(s, e - s));
if (comment_size != 0) {
group->comment.assign(comment, comment_size);
comment_size = 0;
@ -289,9 +251,9 @@ void IniLoadFile::LoadFromDisk(const std::string &filename, Subdirectory subdir,
} else if (group != nullptr) {
if (group->type == IGT_SEQUENCE) {
/* A sequence group, use the line as item name without further interpretation. */
IniItem *item = new IniItem(group, std::string(buffer, e - buffer));
IniItem &item = group->CreateItem(std::string(buffer, e - buffer));
if (comment_size) {
item->comment.assign(comment, comment_size);
item.comment.assign(comment, comment_size);
comment_size = 0;
}
continue;
@ -307,9 +269,9 @@ void IniLoadFile::LoadFromDisk(const std::string &filename, Subdirectory subdir,
}
/* it's an item in an existing group */
IniItem *item = new IniItem(group, std::string(s, t - s));
IniItem &item = group->CreateItem(std::string(s, t - s));
if (comment_size != 0) {
item->comment.assign(comment, comment_size);
item.comment.assign(comment, comment_size);
comment_size = 0;
}
@ -326,9 +288,9 @@ void IniLoadFile::LoadFromDisk(const std::string &filename, Subdirectory subdir,
/* If the value was not quoted and empty, it must be nullptr */
if (!quoted && e == t) {
item->value.reset();
item.value.reset();
} else {
item->value = StrMakeValid(std::string(t));
item.value = StrMakeValid(std::string(t));
}
} else {
/* it's an orphan item */

@ -11,6 +11,7 @@
#define INI_TYPE_H
#include "fileio_type.h"
#include <list>
#include <string>
#include <optional>
@ -23,48 +24,48 @@ enum IniGroupType {
/** A single "line" in an ini file. */
struct IniItem {
IniItem *next; ///< The next item in this group
std::string name; ///< The name of this item
std::optional<std::string> value; ///< The value of this item
std::string comment; ///< The comment associated with this item
IniItem(struct IniGroup *parent, const std::string &name);
~IniItem();
IniItem(const std::string &name);
void SetValue(const std::string_view value);
};
/** A group within an ini file. */
struct IniGroup {
IniGroup *next; ///< the next group within this file
std::list<IniItem> items; ///< all items in the group
IniGroupType type; ///< type of group
IniItem *item; ///< the first item in the group
IniItem **last_item; ///< the last item in the group
std::string name; ///< name of group
std::string comment; ///< comment for group
IniGroup(struct IniLoadFile *parent, const std::string &name);
~IniGroup();
IniGroup(const std::string &name, IniGroupType type);
IniItem *GetItem(const std::string &name) const;
const IniItem *GetItem(const std::string &name) const;
IniItem &GetOrCreateItem(const std::string &name);
IniItem &CreateItem(const std::string &name);
void RemoveItem(const std::string &name);
void Clear();
};
/** Ini file that only supports loading. */
struct IniLoadFile {
IniGroup *group; ///< the first group in the ini
IniGroup **last_group; ///< the last group in the ini
using IniGroupNameList = std::initializer_list<std::string_view>;
std::list<IniGroup> groups; ///< all groups in the ini
std::string comment; ///< last comment in file
const char * const *list_group_names; ///< nullptr terminated list with group names that are lists
const char * const *seq_group_names; ///< nullptr terminated list with group names that are sequences.
const IniGroupNameList list_group_names; ///< list of group names that are lists
const IniGroupNameList seq_group_names; ///< list of group names that are sequences.
IniLoadFile(const char * const *list_group_names = nullptr, const char * const *seq_group_names = nullptr);
virtual ~IniLoadFile();
IniLoadFile(const IniGroupNameList &list_group_names = {}, const IniGroupNameList &seq_group_names = {});
virtual ~IniLoadFile() { }
IniGroup *GetGroup(const std::string &name, bool create_new = true);
void RemoveGroup(const char *name);
const IniGroup *GetGroup(const std::string &name) const;
IniGroup *GetGroup(const std::string &name);
IniGroup &GetOrCreateGroup(const std::string &name);
IniGroup &CreateGroup(const std::string &name);
void RemoveGroup(const std::string &name);
void LoadFromDisk(const std::string &filename, Subdirectory subdir, std::string *save = nullptr);
@ -88,7 +89,7 @@ struct IniLoadFile {
/** Ini file that supports both loading and saving. */
struct IniFile : IniLoadFile {
IniFile(const char * const *list_group_names = nullptr);
IniFile(const IniGroupNameList &list_group_names = {});
bool SaveToDisk(const std::string &filename);

@ -4422,7 +4422,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... te n
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... te naby aan 'n ander dorp
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... te veel dorpe
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... daar is nie meer spasie oor op die kaart nie
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE} Die dorp sal nie paaie bou nie. Jy kan dit verander deur die bou van paaie via Stellings-> Omgewings-> Dorpe te aktiveer
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Pad werke in verloop
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Kan nie die dorp verwyder nie...{}'n Stasie of depot verwys na die dorp of die blok wat deur die dorp besit word kan nie verwyder word nie.
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... daar is geen plek vir 'n standbeeld in die middel van die dorp

@ -4137,7 +4137,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... قر
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... قريبة جدا من مدينة أخرى
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... المدن كثيرة جدا
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... لا يوجد فراغ في الخريطة
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}لن تبني البلدية طرق جديدة. بإمكانك تمكين بناء الطرق الجديدة عن طريق الاعدادات --> البيئة--> المدن
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}اعمال الطرق قيد التنفيذ
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}لا يمكن ازالة هذه المدينة{}محطة او ورشة مرتبطة بالمدينة او هناك مربع مملوك للمدينة لا يمكن لزالته
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... لا يوجد مكان مناسب للمجسم بداخل هذة المدينة/البلدة

@ -4171,7 +4171,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... mapa
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... beste herritik hurbilegi
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... herri gehiegi
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... ez dago leku gehiagorik mapan
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Herriak ez du errepiderik eraikiko. Herriek errepideak eraiki ahal izateko Ezarpen Aurreratuak->Ekonomia->Herriak
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Errepide lanak egiten
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Geltoki edo gordailu bat herriari lotua dago edo ezin izan da herriaren jabegoa den lauki bat ezabatu
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... ez dago leku egokirik estatua batentzat hiri honen erdian

@ -4778,7 +4778,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... за
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... занадта блізка да іншага горада
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... занадта шмат гарадоў
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... няма месца на мапе
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Гарады ня будуць будаваць дарогі самі. Вы можаце ўключыць будаўніцтва дарог у раздзеле «Наладкі -> Навак.{NBSP}асяроддзе -> Гарады».
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Ідуць дарожныя работы...
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Немагчыма зьнішчыць горад:{}да яго адносіцца станцыя або дэпо, альбо немагчыма ачысьціць адну з занятых ім клетак.
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... у цэнтры горада няма месца для статуі

@ -4867,7 +4867,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... muit
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... muito perto de outra cidade
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... cidades demais
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... não há mais espaço no mapa
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}A cidade não irá construir estradas. Você pode ativar a construção através de Configurações->Ambiente->Cidades
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Recapeamento rodoviário em progresso
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Impossível remover cidade...{}Uma estação ou depósito referente à essa cidade não pode ser removido
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... não há local para uma estátua no centro dessa cidade

@ -4251,7 +4251,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... пр
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... прекалено близо до друг град
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... прекалено много градове
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... няма повече място на картата
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Градът няма да изгражда пътища. Можете да активирате строенето на пътища чрез Настройки за напреднали->Икономика->Градове.
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Пътни ремонти в процес
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Градът не може да бъде премахнат...{}Станция или депо има връзка с града, или плочка, собственост на града, не може да бъде отстранена
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... няма подходящо място за статуя в центъра на града

@ -4867,7 +4867,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... mass
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... massa prop d'una altra població
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... massa poblacions
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}...no queda espai al mapa.
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}La població no construirà carrers. Pots activar la construcció de carrers via Configuració->Interacció amb l'entorn->Poblacions
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Obres en progrés
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}No es pot eliminar aquesta població...{}Hi ha una estació, un dipòsit o una cel·la pertanyent a la població que no pot ser eliminada
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... no hi ha un lloc adequat per situar l'estàtua al centre d'aquesta població

@ -4609,7 +4609,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... preb
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... preblizu drugome gradu
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... previše gradova
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... nema više mjesta na karti
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Grad neće graditi ceste. Možete uključiti gradnju cesta putem Postavki->Okolina->Gradovi
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Cestovni radovi u tijeku
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Nije moguće izbrisati ovaj grad...{}Postaja ili spremište se pozivaju na grad ili polja u vlasništvu grada nije moguće ukloniti
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... nema odgovarajućeg mjesta za kip u središtu ovog grada

@ -4878,7 +4878,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... moc
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... moc blízko k jinému městu
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... příliš mnoho měst
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... na mapě už není místo
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Město nebude stavět silnice. Můžete to změnit přes Pokročilé nastavení->Ekonomika->Města
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Silnice je v rekonstrukci
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Nelze vybourat město...{}Buď k němu patří stanice nebo depo, anebo se nedá odklidit políčko městem vlastněné
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... v tomto městě není žádné místo vhodné pro umístění sochy

@ -4866,7 +4866,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... for
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... for tæt på en anden by
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... for mange byer
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... der er ikke mere plads på kortet
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Byen vil ikke kunne bygge veje. Du kan tillade byer at bygge veje via Avancerede indstillinger->Økonomi->Byer.
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Vejarbejde i gang
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Kan ikke slette denne by...{}En station eller et depot refererer til byen, eller en brik der er ejet a byen kan ikke fjernes
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... Der er ingen egnede steder at placere en statue

@ -4866,7 +4866,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... te d
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... te dicht bij een andere plaats
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... te veel plaatsen
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... er is geen ruimte meer op de kaart
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}De stad bouwt geen wegen. Het bouwen van wegen kan aangezet worden via Instellingen->Omgeving->Steden
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Wegwerkzaamheden in uitvoering
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Kan deze stad niet verwijderen...{}Een station of depot verwijst naar deze plaats of een door de stad beheerde tegel kan niet worden verwijderd
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... er is geen geschikte plaats voor een standbeeld in het centrum van dit dorp

@ -924,10 +924,8 @@ STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE :{BLACK}New {STR
STR_NEWS_SHOW_VEHICLE_GROUP_TOOLTIP :{BLACK}Open the group window focused on the vehicle's group
STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO :{WHITE}{STATION} no longer accepts {STRING}
STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO_OR_CARGO :{WHITE}{STATION} no longer accepts {STRING} or {STRING}
STR_NEWS_STATION_NOW_ACCEPTS_CARGO :{WHITE}{STATION} now accepts {STRING}
STR_NEWS_STATION_NOW_ACCEPTS_CARGO_AND_CARGO :{WHITE}{STATION} now accepts {STRING} and {STRING}
STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO_LIST :{WHITE}{STATION} no longer accepts: {CARGO_LIST}
STR_NEWS_STATION_NOW_ACCEPTS_CARGO_LIST :{WHITE}{STATION} now accepts: {CARGO_LIST}
STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}Offer of subsidy expired:{}{}{STRING} from {STRING2} to {STRING2} will now not attract a subsidy
STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Subsidy withdrawn:{}{}{STRING} service from {STRING2} to {STRING2} is no longer subsidised
@ -4866,7 +4864,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... too
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... too close to another town
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... too many towns
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... there is no more space on the map
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}The town will not build roads. You can enable building of roads via Settings->Environment->Towns
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Road works in progress
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Can't delete this town...{}A station or depot is referring to the town or a town owned tile can't be removed
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... there is no suitable place for a statue in the centre of this town

@ -4866,7 +4866,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... too
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... too close to another town
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... too many towns
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... there is no more space on the map
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}The town will not build roads. You can enable building of roads via Advanced Settings->Environment->Towns
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Road works in progress
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Can't delete this town...{}A station or depot is referring to the town or a town owned tile can't be removed
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... there is no suitable place for a statue in the centre of this town

@ -4866,7 +4866,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... too
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... too close to another town
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... too many towns
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... there is no more space on the map
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}The town will not build roads. You can enable building of roads via Settings->Environment->Towns
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Road work in progress
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Can't delete this town...{}A station or depot is referring to the town or a town owned tile can't be removed
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... there is no suitable place for a statue in the center of this town

@ -4768,7 +4768,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... tro
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... tro proksime al alia urbo
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... tro da urboj
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... spaco mankas sur la mapo
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}La urbo ne konstruos stratojn. Vi povas ebligi stratkonstruadon per Avancitaj Agordoj->Ekonomio->Urboj
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Aktivas vojprilaborado
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Ne eblas forviŝi ĉi tiun urbon...{}Stacidomo aŭ garaĝo havas referencon al la urbo, aŭ ne eblas forviŝi kahelon posedatan de la urbo
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... ne jen estas konvenan lokon por statuo en la centro de ĉi tiu urbo

@ -4820,7 +4820,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... liig
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... liiga lähedal teisele asulale
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... liiga palju asulaid
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... pole enam ruumi kaardil
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Asula ei ehita teid. Teedeehituse lubamiseks Põhjalik seadistus->Majandus->Asulad
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Teede ehitamine
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Seda asulat ei saa kõrvaldada...{}Jaam või depoo viitab asulale, või asulale kuuluvat ruutu ei saa kõrvaldada
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... asula keskuses ei leidu kujule sobivat kohta

@ -3826,7 +3826,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... ov t
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... ov tætt við eina aðra bygd
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... ov nógvar bygdir
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... tað er einki pláss eftir á kortinum
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Bygdin byggir ikki vegir. Tú kanst tendra vega byggjing í Víðkaðir Innstillingar->Búðskapur->Bygdir
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Veg arbeiði í gongd
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Kann ikki strika hesa bygdina...{}Ein støð ella goymsla vísur til bygdina, ella ein puntur ið er ogn hjá bygdini kann ikki beinast burtur
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... einki hóskandi stað til eina standmynd í miðjuni av hesi bygdini

@ -4866,7 +4866,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... liia
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... liian lähellä toista kuntaa
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... liian monta kuntaa
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... kartalla ei ole enää tilaa
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Kunta ei rakenna teitä. Voit sallia teiden rakentamisen valikosta Asetukset->Ympäristö->Kunnat
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Tietyöt ovat käynnissä.
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Kuntaa ei voida poistaa...{}Asema tai varikko viittaa kuntaan tai kunnan omistamaa ruutua ei voida poistaa
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... tämän kunnan keskustassa ei ole sopivaa paikkaa patsaalle

@ -4867,7 +4867,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... trop
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... trop près d'une autre ville
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... trop de villes
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... il n'y a plus d'emplacement sur la carte
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}La ville ne construira pas de routes. Vous pouvez activer la construction des routes sous Paramètres->Environnement->Villes
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Route en travaux
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Impossible de supprimer cette ville...{}Une station ou un dépôt fait référence à cette ville ou une propriété municipale ne peut pas être supprimée.
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... aucun emplacement convenable disponible pour une statue dans ce centre-ville

@ -4565,7 +4565,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... ro f
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... ro fhaisg air baile eile
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... tha cus bhailtean ann
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... chan eil rum air fhàgail air a' mhapa
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Cha tog am baile rathad sam bith. S urrainn dhut togail rathaidean a chur an comas le Roghainnean->Àrainneachd->Bailtean
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Rathad ga ath-thogail
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Cha ghabh am baile seo sguabadh às...{}Tha stèisean no port no garaids no trèan-lann no cala no hangar a' toirt iomradh air a' bhaile no tha leac ann a tha leis a' bhaile is nach gabh toirt air falbh
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... chan eil ionad freagarrach airson ìomhaigh ann am meadhan a' bhaile seo

@ -4812,7 +4812,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... dema
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... demasiado preto doutra cidade
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... hai demasiadas cidades
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... non queda máis espazo no mapa
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}O pobo non construirá estradas. Podes activar a función de construción de estradas en Opcións Avanzadas->Economía->Pobos
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Obras na estrada en curso
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Non se pode borrar esta vila...{}Unha estación ou depósito está relacionado coa vila ou un cadro propiedade da vila non pode ser eliminado
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... non hai ningún sitio adecuado para unha estatua no centro desta vila

@ -4843,7 +4843,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... zu d
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... zu dicht an einer anderen Stadt
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... zu viele Städte
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... es ist kein Platz mehr auf dem Spielfeld
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Städte bauen im Moment keine Straßen. Städtischer Straßenbau kann mittels Einstellungen->Umgebung->Städte eingestellt werden
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Straßenarbeiten sind im Gange
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Stadt kann nicht gelöscht werden ...{}Eine Station oder ein Depot bezieht sich auf diese Stadt oder ein Feld im städtischen Besitz kann nicht entfernt werden.
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... es gibt keinen geeigneten Standort für die Statue im Zentrum dieser Stadt

@ -4865,7 +4865,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... πο
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... πολύ κοντά σε άλλη πόλη
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... πάρα πολλές πόλεις
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... δεν υπάρχει άλλος χώρος στον χάρτη
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Η πόλη δεν θα οικοδομεί δρόμους. Μπορείτε να ενεργοποιήσετε την κατασκευή οδών μέσω τις Προχωρημένες Επιλογές->Οικονομία->Πόλεις
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Έργα οδοποιίας σε εξέλιξη
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Δεν γίνεται να διαγραφεί η πόλη...{}Ένας σταθμός ή ένα αμαξοστάσιο που αναφέρεται στην πόλη ή ένα τετραγωνίδιο της πόλης δεν μπορεί να αφαιρεθεί
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... δεν υπάρχει κατάλληλο μέρος για άγαλμα στο κέντρο αυτής της πόλης

@ -4468,7 +4468,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... קר
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... קרוב מידי לעיר אחרת
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... יותר מידי ערים
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... אין יותר מקום על המפה
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}העיר לא תבנה כבישים. באפשרותך לאפשר בניית כבישים בעזרת תפריט הגדרות מתקמדות->כלכלה->ערים
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}עבודות כביש בפעולה
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}לא ניתן למחוק עיר זו...{}תחנה או מוסך מקושר לעיר או שמשבצת בבעלות העיר לא ניתנת להסרה
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... אין אף מיקום מתאים לפסל במרכז עיירה זו

@ -254,6 +254,9 @@ STR_COLOUR_WHITE :Fehér
STR_COLOUR_RANDOM :Véletlenszerű
###length 17
STR_COLOUR_SECONDARY_ORANGE :Narancssárga
STR_COLOUR_SECONDARY_GREY :Szürke
STR_COLOUR_SECONDARY_SAME_AS_PRIMARY :Ugyanaz mint az elsődleges
# Units used in OpenTTD
@ -569,6 +572,7 @@ STR_NEWS_MENU_DELETE_ALL_MESSAGES :Az összes üze
# About menu
###length 11
STR_ABOUT_MENU_LAND_BLOCK_INFO :Terület-információ
STR_ABOUT_MENU_HELP :Súgó és útmutatók
STR_ABOUT_MENU_SEPARATOR :
STR_ABOUT_MENU_TOGGLE_CONSOLE :Átváltás konzolra
STR_ABOUT_MENU_AI_DEBUG :MI / Játékszkript nyomkövetés
@ -1109,6 +1113,13 @@ STR_GAME_OPTIONS_GUI_SCALE_3X :3x
STR_GAME_OPTIONS_GUI_SCALE_4X :4x
STR_GAME_OPTIONS_GUI_SCALE_5X :5x
STR_GAME_OPTIONS_PARTICIPATE_SURVEY_FRAME :{BLACK}Automata felmérés
STR_GAME_OPTIONS_PARTICIPATE_SURVEY :{BLACK}Részvétel automata felmérésben
STR_GAME_OPTIONS_PARTICIPATE_SURVEY_TOOLTIP :{BLACK}Ha engedélyezve van, az OpenTTD továbbít egy felmérést a játékból kilépéskor
STR_GAME_OPTIONS_PARTICIPATE_SURVEY_LINK :{BLACK}Felmérésről és titoktartásról
STR_GAME_OPTIONS_PARTICIPATE_SURVEY_LINK_TOOLTIP :{BLACK}Ezzel megnyithatsz egy oldalt a böngészőben ahol további információt érhetsz el az automata felmérésről.
STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW :{BLACK}Felmérés eredményének előnézete
STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW_TOOLTIP :{BLACK}Mutasd a jelenleg futó játékhoz tartozó felmérés eredményeit.
STR_GAME_OPTIONS_GRAPHICS :{BLACK}Grafika
@ -1293,6 +1304,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_LEFT :Balra
STR_CONFIG_SETTING_HORIZONTAL_POS_CENTER :Középen
STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Jobbra
STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}másodperc{P 0 "" ek}
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maximális kezdeti hitelkeret: {STRING}
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maximálisan kölcsönözhető összeg (az inflációtól eltekintve)
@ -1464,6 +1476,8 @@ STR_CONFIG_SETTING_PLANE_CRASHES_NONE :nincs*
STR_CONFIG_SETTING_PLANE_CRASHES_REDUCED :csökkentett
STR_CONFIG_SETTING_PLANE_CRASHES_NORMAL :normál
STR_CONFIG_SETTING_CROSSING_WITH_COMPETITOR :Más vállalat tulajdonában lévő utak és sínek egyszintű kereszteződésének engedélyezése: {STRING}
STR_CONFIG_SETTING_CROSSING_WITH_COMPETITOR_HELPTEXT :Engedélyezd más vállalat tulajdonában lévő utak és sínek egyszintű kereszteződésének építését
STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Áthaladó megállóhelyek engedélyezése települési tulajdonú utakon: {STRING}
STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Áthaladó megállóhelyek építésének engedélyezése települési tulajdonú utakon
@ -1477,6 +1491,8 @@ STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :Bekapcsolva az
STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR :A vállalat kezdő színsémája: {STRING}
STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_HELPTEXT :A vállalat színsémája a játék kezdetén
STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY :Kezdő vállalat másodlagos színe: {STRING}
STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY_HELPTEXT :Válassz egy másodlagos színt a vállalatnak, ha NewGRF-et használsz ami ezt lehetővé teszi.
STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :Repülőterek nem avulnak el: {STRING}
STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :Bekapcsolva minden repülőtértípus örökké elérhető marad bevezetése után
@ -1679,6 +1695,9 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Kikapcsolva
STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Ablakok bezárása jobb gombbal: {STRING}
STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :A jobb gombbal való kattintás az ablak területén bezárja az ablakot. Ez a beállítás kikapcsolja a segédletek jobb gombbal való megjelenítését!
###length 3
STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_NO :Nem
STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES :Igen
STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES_EXCEPT_STICKY :Igen, a zároltakat kivéve
STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Játékmentés dátumformátuma: {STRING}
STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :A játékmentésekben használt dátum formátuma
@ -2007,6 +2026,8 @@ STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Átlagos város
STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL :Kapcsolatgrafikon frissítése minden {STRING}{NBSP}másodpercben{P 0:2 "" s}
STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL_HELPTEXT :A kapcsolatgrafikon következő újrakalkulálása között eltelt idő. Minden újrakalkulálás során egy komponens tervei kerülnek kiszámításra. Ez azt jelenti, hogy az X érték beállítása nem jelenti azt, hogy az egész grafikon X másodpercenként frissül. Csak néhány komponens lesz frissítve. Minél rövidebbre van állítva, annál több CPU időre van szükség a kiszámításhoz. Ha hosszabbra van állítva, akkor hosszabb időbe telik, amíg az áruelosztás elkezdődik az új útvonalakon.
STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME :A kapcsolatgrafikon újrakalkulálására szánt idő, {STRING}
STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME_HELPTEXT :A kapcsolatgrafikon újrakalkulálására szánt idő. Egy újrakalkulálás megkezdésekor létrejön egy új szál ami ennyi másodpercig futhat. Minél rövidebbre állítod ezt a paramétert annál valószínűbb hogy a számítás nem készül el mire kellene. Ha ez megtörténik akkor a játék megáll amíg el nem készül a számítással ("laggol"). Minél hosszabbra állítod ezt az időt annál hosszabb idő telik el az útvonalak változása és az eloszlás frissítése között.
STR_CONFIG_SETTING_DISTRIBUTION_PAX :Utasok szétosztása: {STRING}
STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :A "Szimmetrikus" azt jelenti, hogy megközelítóleg ugyanannyi utas megy majd A-ból B-be, mint B-ből A-ba. Az "Aszimmetrikus" beállítás esetén a különbözö irányokba tetszőleges mennyiségű utas mehet. "Kézi" esetben az utasok nem lesznek automatikusan szétosztva.
@ -2139,6 +2160,7 @@ STR_CONFIG_ERROR_SPRITECACHE_TOO_BIG :{WHITE}{BYTES}
# Video initalization errors
STR_VIDEO_DRIVER_ERROR :{WHITE}Hiba a videobeállításokban...
STR_VIDEO_DRIVER_ERROR_NO_HARDWARE_ACCELERATION :{WHITE}... nem található kompatibilis GPU. Hardveres gyorsítás kikapcsolva.
STR_VIDEO_DRIVER_ERROR_HARDWARE_ACCELERATION_CRASH :{WHITE}... A videókártya illesztőprogram hibát okozott. Hardveres gyorsítás kikapcsolva
# Intro window
STR_INTRO_CAPTION :{WHITE}OpenTTD {REV}
@ -2152,6 +2174,7 @@ STR_INTRO_MULTIPLAYER :{BLACK}Hálóza
STR_INTRO_GAME_OPTIONS :{BLACK}Alapbeállítások
STR_INTRO_HIGHSCORE :{BLACK}Rekord tábla
STR_INTRO_HELP :{BLACK}Súgó és útmutatók
STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Beállítások
STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF beállítások
STR_INTRO_ONLINE_CONTENT :{BLACK}Letölthető tartalmak
@ -2173,6 +2196,7 @@ STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Játékv
STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}A játék alapvető beállításainak (pl. nyelv, grafikus alapcsomag, stb.) megjelenítése
STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Rekord tábla megjelenítése
STR_INTRO_TOOLTIP_HELP :{BLACK}Férj hozzá a dokumentációhoz és az online tartalmakhoz
STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}A beállítások megjelenítése
STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}NewGRF beállítások megjelenítése
STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Új és frissített tartalmak megtekintése és letöltése
@ -2195,6 +2219,14 @@ STR_ABANDON_GAME_QUERY :{YELLOW}Biztosa
STR_ABANDON_SCENARIO_QUERY :{YELLOW}Biztosan abba akarod hagyni a pálya szerkesztését?
# Help window
STR_HELP_WINDOW_CAPTION :{BLACK}Súgó és útmutatók
STR_HELP_WINDOW_WEBSITES :{BLACK}Weboldalak
STR_HELP_WINDOW_DOCUMENTS :{BLACK}Dokumentumok
STR_HELP_WINDOW_CHANGELOG :{BLACK}Változtatások listája
STR_HELP_WINDOW_KNOWN_BUGS :{BLACK}Ismert hibák
STR_HELP_WINDOW_MANUAL_WIKI :{BLACK}Útmutató / Wiki
STR_HELP_WINDOW_BUGTRACKER :{BLACK}Hiba jelentése
STR_HELP_WINDOW_COMMUNITY :{BLACK}Közösség
# Cheat window
STR_CHEATS :{WHITE}Csalások
@ -2471,6 +2503,12 @@ STR_NETWORK_ASK_RELAY_NO :{BLACK}Nem
STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Igen, most az egyszer
STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Igen, ne kérdezd újra
STR_NETWORK_ASK_SURVEY_CAPTION :Részvétel automata felmérésben?
STR_NETWORK_ASK_SURVEY_TEXT :Szeretnél részt venni az automata felmérésben?{}Az OpenTTD a játékból kilépéskor egy felmérést fog továbbítani.{}Ezt a beállítást bármikor megváltoztathatod a "Játék beállítások" menüpontban.
STR_NETWORK_ASK_SURVEY_PREVIEW :Felmérés eredményének előnézete
STR_NETWORK_ASK_SURVEY_LINK :Felmérésről és titoktartásról
STR_NETWORK_ASK_SURVEY_NO :Nem
STR_NETWORK_ASK_SURVEY_YES :Igen
STR_NETWORK_SPECTATORS :Megfigyelők
@ -2677,6 +2715,7 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Építhe
STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Hidak átlátszóságának bekapcsolása. Ctrl+kattintással zárolható
STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Tereptárgyak (adótornyok, világítótornyok stb.) átlátszóságának bekapcsolása. Ctrl+kattintással zárolható
STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Felsővezetékek átlátszóságának bekapcsolása. Ctrl+kattintással zárolható
STR_TRANSPARENT_TEXT_TOOLTIP :BLACK}Töltő és ár/bevétel feliratok átlátszóságának bekapcsolása. Ctrl+kattintással zárolható
STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Az objektum ne átlátszó legyen, hanem láthatatlan
# Linkgraph legend window
@ -3407,6 +3446,7 @@ STR_NEWGRF_INSPECT_PARENT_TOOLTIP :{BLACK}Objektum
STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT :{STRING} {HEX}-ban
STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_OBJECT :Objektum
STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_RAIL_TYPE :Pályatípus
STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_ROAD_TYPE :Út típus
STR_NEWGRF_INSPECT_QUERY_CAPTION :{WHITE}NewGRF változó 60+x paraméter (hexadecimális)
@ -3813,6 +3853,8 @@ STR_COMPANY_VIEW_INFRASTRUCTURE_BUTTON :{BLACK}Részlet
STR_COMPANY_VIEW_INFRASTRUCTURE_TOOLTIP :{BLACK}Részletes információk megtekintése az infrastruktúráról
STR_COMPANY_VIEW_GIVE_MONEY_BUTTON :{BLACK}Adományozz pénzt
STR_COMPANY_VIEW_GIVE_MONEY_TOOLTIP :{BLACK}Utalj pénzt ennek a vállalatnak
STR_COMPANY_VIEW_HOSTILE_TAKEOVER_BUTTON :{BLACK}Erőszakos átvétel
STR_COMPANY_VIEW_HOSTILE_TAKEOVER_TOOLTIP :{BLACK}Vedd át erőszakkal a vállalat vezetését
STR_COMPANY_VIEW_NEW_FACE_BUTTON :{BLACK}Új arc
STR_COMPANY_VIEW_NEW_FACE_TOOLTIP :{BLACK}Új arc választása az elnöknek
@ -3828,6 +3870,7 @@ STR_COMPANY_VIEW_PRESIDENT_S_NAME_QUERY_CAPTION :Elnök neve
STR_COMPANY_VIEW_GIVE_MONEY_QUERY_CAPTION :Mennyi pénzt szeretnél adományozni?
STR_BUY_COMPANY_MESSAGE :{WHITE}Vállalatunk vagyontárgyait eladásra kínáljuk: járművek, terület és hálózat tulajdonok, bankszámla{}{}Megveszed {COMPANY} vállalatot {CURRENCY_LONG}-ért?
STR_BUY_COMPANY_HOSTILE_TAKEOVER :{WHITE}A {COMPANY} erőszakos átvételével megvásárolod minden vagyonát, visszafizeted minden adósságát és kifizeted 2 évi nyereségét.{}{}Mindezek becsült értéke {CURRENCY_LONG}.{}{}Biztosan folytatni akarod ezt az átvételt?
# Company infrastructure window
STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}{COMPANY} infrastruktúrája
@ -3899,6 +3942,7 @@ STR_VEHICLE_LIST_MANAGE_LIST :{BLACK}Lista ke
STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}A listán szereplő járműveknek utasítás küldése
STR_VEHICLE_LIST_REPLACE_VEHICLES :Járművek lecserélése
STR_VEHICLE_LIST_SEND_FOR_SERVICING :Javításra küld
STR_VEHICLE_LIST_CREATE_GROUP :Csoport létrehozása
STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Idei nyereség: {CURRENCY_LONG} (Tavalyi: {CURRENCY_LONG})
STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}]
STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRING}
@ -4716,6 +4760,10 @@ STR_AI_SETTINGS_SETTING :{STRING}: {ORAN
# Textfile window
STR_TEXTFILE_JUMPLIST :{WHITE}Tartalomjegyzék
STR_TEXTFILE_JUMPLIST_TOOLTIP :{BLACK}Ugrás egy fejezetre a jelenlegi fileban ezzel a listával
STR_TEXTFILE_NAVBACK_TOOLTIP :{BLACK}Lépj vissza a navigáció történetben
STR_TEXTFILE_NAVFORWARD_TOOLTIP :{BLACK}Lépj előre a navigáció történetben
STR_TEXTFILE_WRAP_TEXT :{WHITE}Szöveg törése
STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Szöveg törése az ablakban, hogy minden kiférjen és ne kelljen görgetni
STR_TEXTFILE_VIEW_README :{BLACK}Readme megtekintése
@ -4725,6 +4773,8 @@ STR_TEXTFILE_VIEW_LICENCE :{BLACK}Licenc
STR_TEXTFILE_README_CAPTION :{WHITE}{STRING} {STRING} readme-je
STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}A(z) {STRING} {STRING} változásainak listája
STR_TEXTFILE_LICENCE_CAPTION :{WHITE}A(z) {STRING} {STRING} licence
STR_TEXTFILE_SURVEY_RESULT_CAPTION :{WHITE}Felmérés eredményének előnézete
STR_TEXTFILE_GAME_MANUAL_CAPTION :{WHITE}OpenTTD dokumentum '{STRING}'
# Vehicle loading indicators
@ -4859,7 +4909,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... túl
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... túl közel van egy másik településhez
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... túl sok a település
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... nincs több hely a térképen
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}A település nem fog utakat építeni. Az útépítést a Haladó beállítások->Környezet->Települések menüben engedélyezheted
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Útkarbantartás folyamatban
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Nem törölheted ezt a várost...{}Egy állomás vagy járműtelep hivatkozik a városra, vagy egy városi tulajdonú mező nem eltávolítható
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... nincs megfelelő hely egy szobornak a város központjában

@ -4059,7 +4059,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... of n
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... of nálægt öðrum bæ
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... of margir bæir
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... það er ekkert laust svæði á kortinu
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Bærinn getur ekki lagt vegi. Því er hægt að breyta í Ítarlegar stillingar->Efnahagur->Bæir.
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Vegaframkvæmdir standa yfir
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Ekki hægt að eyða bæ...{}Stöð eða skýli vísar í þennan bæ eða ekki hægt að fjarlægja reit í eigu bæjarins.
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... það er enginn ákjósanlegur staður fyrir styttu í miðju þessa bæjar

@ -191,6 +191,9 @@ STR_COLOUR_WHITE :Putih
STR_COLOUR_RANDOM :Acak
###length 17
STR_COLOUR_SECONDARY_PALE_GREEN :Hijau Pucat
STR_COLOUR_SECONDARY_SECONDARY_PINK :Merah Muda
STR_COLOUR_SECONDARY_BROWN :Cokelat
# Units used in OpenTTD
@ -506,6 +509,7 @@ STR_NEWS_MENU_DELETE_ALL_MESSAGES :Hapus semua pes
# About menu
###length 11
STR_ABOUT_MENU_LAND_BLOCK_INFO :Informasi area daratan
STR_ABOUT_MENU_HELP :Bantuan & panduan
STR_ABOUT_MENU_SEPARATOR :
STR_ABOUT_MENU_TOGGLE_CONSOLE :Hidup/matikan Layar Konsol
STR_ABOUT_MENU_AI_DEBUG :Debug skrip AI/Permainan
@ -2091,6 +2095,7 @@ STR_INTRO_MULTIPLAYER :{BLACK}Multi Pe
STR_INTRO_GAME_OPTIONS :{BLACK}Pengaturan Permainan
STR_INTRO_HIGHSCORE :{BLACK}Tabel Nilai Tertinggi
STR_INTRO_HELP :{BLACK}Bantuan & Panduan
STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Pengaturan
STR_INTRO_NEWGRF_SETTINGS :{BLACK}Pengaturan NewGRF
STR_INTRO_ONLINE_CONTENT :{BLACK}Cari Konten Daring
@ -2134,6 +2139,9 @@ STR_ABANDON_GAME_QUERY :{YELLOW}Apakah
STR_ABANDON_SCENARIO_QUERY :{YELLOW}Apakah anda yakin untuk mengabaikan skenario ini ?
# Help window
STR_HELP_WINDOW_WEBSITES :{BLACK}Situs web
STR_HELP_WINDOW_DOCUMENTS :{BLACK}Dokumen
STR_HELP_WINDOW_COMMUNITY :{BLACK}Komunitas
# Cheat window
STR_CHEATS :{WHITE}Kode Curang
@ -3769,6 +3777,7 @@ STR_COMPANY_VIEW_PRESIDENT_S_NAME_QUERY_CAPTION :Nama Manajer
STR_COMPANY_VIEW_GIVE_MONEY_QUERY_CAPTION :Masukkan jumlah uang yang ingin anda berikan
STR_BUY_COMPANY_MESSAGE :{WHITE}Kami mencari perusahaan transporasi untuk mengambil alih perusahaan kami.{}{}Anda ingin membeli {COMPANY} senilai {CURRENCY_LONG}?
STR_BUY_COMPANY_HOSTILE_TAKEOVER :{WHITE}Dengan mengambil alih {COMPANY} secara agresif, kamu akan membeli seluruh aset, membayarkan seluruh hutang, dan membayar profit selama dua tahun.{}{}Estimasi jumlahnya adalah {CURRENCY_LONG}.{}{}Apa kamu ingin melanjutkan pengambilalihan ini?
# Company infrastructure window
STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infrastruktur milik {COMPANY}
@ -4601,8 +4610,8 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Salah sa
STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Jendela "Debug" skrip AI hanya tersedia untuk server
# AI configuration window
STR_AI_CONFIG_CAPTION_AI :{WHITE}Konfigurasi AI
STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Konfigurasi Game Script
STR_AI_CONFIG_CAPTION_AI :{WHITE}Pengaturan AI
STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Pengaturan Game Script
STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Skrip Permainan yang akan di jalankan di permainan berikutnya
STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}AI yg akan dijalankan pada permainan berikutnya
STR_AI_CONFIG_HUMAN_PLAYER :Pemain Manusia
@ -4659,6 +4668,7 @@ STR_AI_SETTINGS_SETTING :{STRING}: {ORAN
# Textfile window
STR_TEXTFILE_JUMPLIST_ITEM :{WHITE}{STRING}
STR_TEXTFILE_WRAP_TEXT :{WHITE}Mengebatkan teks
STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Mengebatkan teks dari jendela sehingga akan muat tanpa menggulir
STR_TEXTFILE_VIEW_README :{BLACK}Lihat readme
@ -4803,7 +4813,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... terl
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... terlalu dekat dengan kota lain
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... terlalu banyak kota
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... tidak ada lagi ruang tersisa dalam peta
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Kota tidak akan membangun jalan. Anda dapat mengaktifkan pembangunan jalan pada menu Pengaturan Lanjutan->Ekonomi->Kota
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Jalan sedang dikerjakan
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Tidak dapat menghancurkan kota ini...{}Suatu stasiun atau depo tergantung pada kota ini atau kotak milik kota tidak dapat dihapus
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... tidak ada tempat yang cocok untuk patung di tengah kota ini

@ -4670,7 +4670,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... rogh
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... roghearr do bhaile eile
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... an iomarca bailte
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... níl a thuilleadh spáis ar an léarscáil
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Ní thógfaidh an baile seo bóithre. Is féidir leat tógáil bóithre a chumasú in Ardsocruithe->Geilleagar->Bailte.
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Tá oibreacha bóthair ar bun
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Ní féidir an baile seo a scriosadh...{}Ní féidir stáisiún nó iosta atá ag tagairt don bhaile nó do thíle atá faoi úinéireacht an bhaile a bhaint
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... níl aon suíomh oiriúnach do dhealbh i lár an bhaile seo

@ -4907,7 +4907,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... trop
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... troppo vicino ad un'altra città
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... troppe città
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... non c'è altro spazio sulla mappa
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Alla città non è permesso costruire strade. È possibile abilitare la costruzione di strade in Impostazioni -> Ambiente -> Città
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Lavori stradali in corso
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Impossibile eliminare la città...{}Una stazione o un deposito fa ancora riferimento alla città o una casella di proprietà della città non può essere rimossa
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... non ci sono spazi adeguati per una statua nel centro di questa città

@ -4791,7 +4791,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}マッ
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}他の街に近すぎます
STR_ERROR_TOO_MANY_TOWNS :{WHITE}街数の制限を超えています
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}マップに空きスペースがありません
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}この街は自動では道路を敷設しません。「設定→環境→街」から道路の敷設を許可できます
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}道路補修工事中です
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}街を削除できません{}この街名を参照する停留施設・車庫か、街が所有するタイルが除去できません
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}街の中心部に像を建てるのに適した場所がありません

@ -4867,7 +4867,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... 지
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... 다른 도시와 너무 가깝습니다
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... 도시가 너무 많습니다
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... 지도에 더 이상 공간이 없습니다
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}도시가 도로를 짓지 않을 것입니다. [설정→환경→도시]에서 도로를 지을 수 있도록 설정을 변경하실 수 있습니다.
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}도로 작업이 진행 중입니다
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}이 도시를 삭제할 수 없습니다...{}도시나 도시 소유의 땅에 역, 정류장, 항구, 공항 또는 차량기지, 차고지, 정박소 등이 존재하면 도시를 삭제할 수 없습니다.
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... 이 도시의 중심에 동상을 세우기 적합한 장소가 없습니다

@ -4558,7 +4558,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... nimi
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... nimis prope aliud oppidum
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... nimis oppida adsunt
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... plus spatium tabulae deest
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Oppidum non vias struet. Potes hanc optionem mutare in Electionibus->Circumiecta->Oppida
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Constructio viaria agitur
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Non licet oppidum delere...{}Statio receptaculumve est oppido sive non licet tegulam oppidi removere
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... non est locus effigiei idoneus in medio oppidi

@ -4769,7 +4769,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... pār
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... pārāk tuvu citai pilsētai
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... pārāk daudz pilsētu
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... uz kartes nav vairāk vietas
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Pilsēta ceļus nebūvēs. Jūs varat ieslēgt ceļu būvi caur Papildu iestatījumi->Ekonomika->Pilsētas
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Notiek ceļa remonts
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Šo pilsētu nevar dzēst...{}Kāda stacija vai depo attiecas uz pilsētu. Vai pilsētai pieder nenoņemams lauciņš
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... šās pilsētas centrā statujai nav piemērotas vietas

@ -4964,7 +4964,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... per
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... per arti kito miesto
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... per daug miestų
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... daugiau nera vietos zemelapyje
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Miestas nestatys kelių. Jūs galite įjungti kelių statybą per „Išplėstinės nuostatos>Aplinka>Miestai“.
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Vyksta kelio darbai
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Negalima panaikinti šio miesto...{}Mieste yra stotelė arba depas, arba miestui priklausantis vienas iš laukelių negali būti pašalintas
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... nėra tinkamos vietos statulai šio miesto centre

@ -4762,7 +4762,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... ze n
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... ze no un enger anerer Stad
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... ze vill Stied
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... et ass keng Plaz méi op der Kaart
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Stied bauen keng Stroossen. Du kanns de Bau iwwert Astellungen->Economie->Stied aschalten
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Stroossenarbeschten amgaangen
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Kann des Stad net läschen...{}Eng Statioun oder Schapp huet den Numm vun dëser Stad oder en Stéck dat der Stad gehéiert kann net ewechgeholl ginn
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... et gëtt keng gëeegent Plaz fir eng Statu am Stadzentrum

@ -3965,7 +3965,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... terl
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... terlalu hampir ke bandar lain
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... bandar terlalu banyak
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... ruang tidak mencukupi di dalam peta
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Bandar ini tidak akan membina jalan. Anda boleh membenarkan pembinaan jalan melalui Tetapan Lanjutan->Ekonomi->Bandar
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Kerja-kerja jalanraya sedang berjalan
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Tidak boleh padam bandar ini...{}Tidak boleh dipadamkan kerana terdapat sebuah stesen atau depoh yang dipunyai bandar atau petak bandar
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... tiada lokasi sesuai untuk arca di tengah bandar

@ -4692,7 +4692,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}...{NBSP
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}...{NBSP}for nær en annen by
STR_ERROR_TOO_MANY_TOWNS :{WHITE}...{NBSP}for mange byer
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... det er ikke mer plass på kartet
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Byen kommer ikke til å bygge veier. Du kan aktivere bygging av veier via Innstillinger->Miljø->Byer
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Veiarbeid i gang
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Kan ikke fjerne denne byen...{}En stasjon eller garasje/stall/hangar/dokk henviser til byen eller en by-eid rute som ikke kan fjernes
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... det er ingen passende steder for en statue i sentrum av denne byen

@ -4194,7 +4194,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... for
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... for nær ein annan by
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... for mange byar
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... det er ikkje meir plass på kartet
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Byen byggjer ikkje vegar. Du kan tillete veg-bygging i Avanserte innstillingar -> Økonomi -> Byar
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Vegarbeid pågår
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Kan ikkje fjerne denne byen...{}Ein stasjon eller garasje/stall/hangar/dokk refererar til byen eller ei by-egd rute som ikkje kan fjernast
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... det er ingen passande plass til statue i sentrum av denne byen

@ -5252,7 +5252,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... zbyt
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... zbyt blisko innego miasta
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... zbyt wiele miast
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... nie ma więcej miejsca na mapie
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Miasto nie będzie budować dróg. Możesz zezwolić na budowę dróg poprzez Ustawienia->Środowisko->Miasta
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Trwają roboty drogowe
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Nie można usunąć tego miasta...{}Stacja lub zajezdnia przynależy do tego miasta lub obszar miasta nie może być usunięty
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... w centrum tego miasta nie ma odpowiedniego miejsca na pomnik

@ -4867,7 +4867,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... muit
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... muito perto de outra localidade
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... demasiadas localidades
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... não existe mais espaço no mapa
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}A localidade não construirá estradas. Pode-se permitir a construção de estradas por Opções Avançadas->Economia->Localidades
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Trabalhos na estrada em curso
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Não é possível eliminar esta localidade...{}Uma estação ou depósito refere-se à localidade ou não é possível remover terreno pertencente à mesma
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... não há um sítio adequado para uma estátua no centro desta localidade

@ -3399,6 +3399,7 @@ STR_NEWGRF_INSPECT_PARENT_TOOLTIP :{BLACK}Analizea
STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT :{STRING} la {HEX}
STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_OBJECT :Obiect
STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_RAIL_TYPE :Tip şină
STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_ROAD_TYPE :Tip de drum
STR_NEWGRF_INSPECT_QUERY_CAPTION :{WHITE}Parametru variabilă 60+x NewGRF (hexadecimal)
@ -4717,6 +4718,8 @@ STR_AI_SETTINGS_SETTING :{STRING}: {ORAN
STR_TEXTFILE_JUMPLIST :{WHITE}Cuprins
STR_TEXTFILE_JUMPLIST_TOOLTIP :{BLACK}Săriți rapid la o secțiune din fișierul afișat prin această listă
STR_TEXTFILE_JUMPLIST_ITEM :{WHITE}{STRING}
STR_TEXTFILE_NAVBACK_TOOLTIP :{BLACK}Reveniți în istoricul navigației
STR_TEXTFILE_NAVFORWARD_TOOLTIP :{BLACK}Reveniți înainte în istoricul navigației
STR_TEXTFILE_WRAP_TEXT :{WHITE}Încadrează textul
STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Încadrează textul ferestrei ca să fie vizibil integral, fără derulare
STR_TEXTFILE_VIEW_README :{BLACK}Vezi fișierul readme
@ -4862,7 +4865,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... prea
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... prea aproape de alt oraş
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... prea multe oraşe
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... nu mai este loc pe hartă
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Orașul nu va construi drumuri. Poți activa construirea drumurilor din Setări avansate -> Economie -> Orașe
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Lucrari la drum in curs de desfasurare
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Acest oraș nu poate fi șters...{}O stație sau un depou face referire la acest oraș, sau o parcelă deținută de oraș nu poate fi eliminată
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... nu există niciun loc potrivit pentru o statuie în centrul acestui oraș

@ -5053,7 +5053,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... сл
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... слишком близко к другому городу
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... слишком много городов
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... нет места на карте
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Города не будут строить дороги сами. Вы можете включить строительство дорог в разделе «Настройки -> Окр.{NBSP}среда -> Города».
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Идут дорожные работы...
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Невозможно уничтожить город:{}к нему относится станция или депо, либо невозможно очистить одну из занимаемых им клеток.
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... в центре города нет места для статуи

@ -4963,7 +4963,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... prev
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... drugo naselje je previše blizu
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... ima previše naselja
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... više ne postoji slobodnog prostora na terenu
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Naselje neće graditi kolovoze. Možete uključiti gradnju kolovoza preko Napredna Podešavanja->Okruženje->Naselja
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Putni radovi u toku
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Nije moguće obrisati naselje...{}Stanica ili depo na zemljištvu naselja se ne može ukloniti
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... ne postoji odgovarajuće mesto za spomenik u centru ovog naselja

@ -175,7 +175,7 @@ STR_COLOUR_DEFAULT :默认
STR_COLOUR_DARK_BLUE :深蓝色
STR_COLOUR_PALE_GREEN :浅绿色
STR_COLOUR_PINK :粉红色
STR_COLOUR_YELLOW :黄
STR_COLOUR_YELLOW :黄 
STR_COLOUR_RED :红 色
STR_COLOUR_LIGHT_BLUE :淡蓝色
STR_COLOUR_GREEN :绿 色
@ -193,13 +193,13 @@ STR_COLOUR_RANDOM :随机
###length 17
STR_COLOUR_SECONDARY_DARK_BLUE :深蓝色
STR_COLOUR_SECONDARY_PALE_GREEN :浅绿色
STR_COLOUR_SECONDARY_SECONDARY_PINK :粉色
STR_COLOUR_SECONDARY_YELLOW :黄
STR_COLOUR_SECONDARY_RED :红
STR_COLOUR_SECONDARY_SECONDARY_PINK :粉
STR_COLOUR_SECONDARY_YELLOW :黄 
STR_COLOUR_SECONDARY_RED :红 
STR_COLOUR_SECONDARY_LIGHT_BLUE :淡蓝色
STR_COLOUR_SECONDARY_GREEN :绿 色
STR_COLOUR_SECONDARY_DARK_GREEN :深绿色
STR_COLOUR_SECONDARY_BLUE :蓝
STR_COLOUR_SECONDARY_BLUE :蓝 
STR_COLOUR_SECONDARY_CREAM :奶油色
STR_COLOUR_SECONDARY_MAUVE :深紫色
STR_COLOUR_SECONDARY_PURPLE :紫 色
@ -954,7 +954,7 @@ STR_GAME_OPTIONS_CAPTION :{WHITE}游戏
STR_GAME_OPTIONS_TAB_GENERAL :通用
STR_GAME_OPTIONS_TAB_GENERAL_TT :{BLACK}选择通用设定
STR_GAME_OPTIONS_TAB_GRAPHICS :图形包
STR_GAME_OPTIONS_TAB_GRAPHICS :图
STR_GAME_OPTIONS_TAB_GRAPHICS_TT :{BLACK}选择图形组设定
STR_GAME_OPTIONS_TAB_SOUND :音效
STR_GAME_OPTIONS_TAB_SOUND_TT :{BLACK}选择音乐和音效的设定
@ -2216,7 +2216,7 @@ STR_LIVERY_DIESEL :内燃机车
STR_LIVERY_ELECTRIC :电力机车
STR_LIVERY_MONORAIL :单轨机车
STR_LIVERY_MAGLEV :磁悬浮机车
STR_LIVERY_DMU :DMU 机车
STR_LIVERY_DMU :内燃动车组
STR_LIVERY_EMU :电力动车组
STR_LIVERY_PASSENGER_WAGON_STEAM :客运机车(蒸汽)
STR_LIVERY_PASSENGER_WAGON_DIESEL :客运机车(内燃机)
@ -4866,7 +4866,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}太靠
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}太靠近另一个城镇了
STR_ERROR_TOO_MANY_TOWNS :{WHITE}城镇太多了
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}地图上没有多余的地方了
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}城镇不会修建道路{}您可以在“设置->环境->城镇”选项下开启建设道路的功能
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}正在进行道路工程
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}无法删除城镇...{}城镇范围内还有车站、车库或无法移除的区块
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... 城市中心没有合适的地方放置公司塑像

@ -4880,7 +4880,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... prí
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... príliš blízko iného mesta
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... príliš veľa miest
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... nie je miesto na mape
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Mesto nebude stavať cesty. Môžete povoliť budovanie ciest cez Pokročilé nasvavenia->Ekonomika->Mestá.
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Prebiehajú cestné práce
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Toto mesto nie je možné odstrániť...{}Stanica alebo depo sa odvoláva na mesto, alebo parcela vo vlastníctve mesta nemôže byť odstránená
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... v centre mesta sa nenachádza žiadne vhodné miesto pre sochu

@ -4447,7 +4447,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... preb
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... preblizu drugemu mestu
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... preveliko število mest
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... ni več prostora na zemljevidu
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Mesta ne bodo gradila cest. Lahko omogočiš gradnjo cest v Napredne nastavitve->Ekonomija->Mesta
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Cestna dela napredujejo
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Ni mogoče zbrisati mesta...{}Postaja ali garaža se nanaša na to mesto ali pa področje v lastnini mesta ne more biti odstranjeno
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... ni primernega mesta za kip v centru tega mesta

@ -4759,7 +4759,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... dema
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... demasiado cerca de otro municipio
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... demasiados municipios
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... no hay más espacio en el mapa
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}El municipio no construirá carreteras. Puedes activar la función de construcción de carreteras en Configuración->Ambiente->Municipios
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Obras de carretera en progreso
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}No se puede borrar este municipio...{}Quedan estaciones o depósitos relacionados con él, o una propiedad suya no puede ser retirada
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... no existe un lugar apropiado para una estatua en el centro de este municipio

@ -4760,7 +4760,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... dema
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... demasiado cerca de otra localidad
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... demasiadas localidades
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... ya no hay espacio en el mapa
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}La localidad no construirá carreteras. Se puede activar esta función en Configuración->Entorno->Localidades
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Obras de carretera en progreso
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}No se puede eliminar esta localidad...{}Aún tiene una estación o depósito, o una de sus casillas no se puede quitar
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... no hay lugar apto para una estatua en el centro de esta localidad

@ -4845,7 +4845,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... för
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... för nära en annan stad
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... för många städer
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... det finns ingen plats kvar på kartan
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Staden kommer inte bygga vägar. Du kan tillåta att staden bygger vägar via Inställningar->Miljö->Städer
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Vägarbete pågår
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Kan inte ta bort den här staden...{}En station eller depå refererar till staden eller så kan inte en stadsägd ruta tas bort.
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... det finns ingen lämplig plats för en staty i stadens centrum

@ -4278,7 +4278,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... ப
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... மற்றொரு நகரத்திற்கு மிகவும் அருகாமையில் உள்ளது
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... மிகவும் அதிகமான நகரங்கள்
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... படத்தில் வேறு வெற்றுஇடம் இல்லை
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}நகராட்சி சாலைகளை அமைக்காது. இந்த அமைப்பினை மாற்ற செல்க சிறப்பு அமைப்புகள் -> பொருளாதாரம் -> நகரங்கள்
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}சாலைப் பணிகள் நடந்துக் கொண்டிருக்கின்றன
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}இந்த நகரத்தினை நீக்க இயலாது ...{} ஒரு நிலையமோ அல்லது பணிமனையோ நகரத்தின் பெயரில் உள்ளது மற்றும் நகரத்திற்குச் சொந்தமான கட்டங்களை நீக்க முடியாது.
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... நகரத்தின் நடுவில் சிலையினை அமைக்க தகுந்த இடமில்லை

@ -4411,7 +4411,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... ต
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... ใกล้กับเมืองอื่นมากเกินไป
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... มีเมืองมากเกินไป
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... มีพื้นที่บนแผนที่ไม่มากพอ
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}เมืองจะไม่สามารถสร้างถนนได้ในอนาคต. คุณสามารถเปิดใช้งานสร้างถนนของเมือง ใน Advanced Settings->Economy->Towns
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}กำลังอยู่ระหว่างการปรับปรุงถนน
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}ไม่สามารถทำลายเมืองได้{}สถานีหรือโรงเก็บนี้เป็นทรัพย์สินของเมืองไม่สามารถทำลายหรือเคลื่อนย้ายได้
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... ที่นี่ไม่มีสถานที่เหมาะสมในการสร้างอนุเสาวรีย์ในใจกลางเมือง

@ -191,6 +191,23 @@ STR_COLOUR_WHITE :白
STR_COLOUR_RANDOM :隨機
###length 17
STR_COLOUR_SECONDARY_DARK_BLUE :暗藍
STR_COLOUR_SECONDARY_PALE_GREEN :淡綠
STR_COLOUR_SECONDARY_SECONDARY_PINK :粉紅
STR_COLOUR_SECONDARY_YELLOW :黃
STR_COLOUR_SECONDARY_RED :紅
STR_COLOUR_SECONDARY_LIGHT_BLUE :淺藍
STR_COLOUR_SECONDARY_GREEN :綠
STR_COLOUR_SECONDARY_DARK_GREEN :暗綠
STR_COLOUR_SECONDARY_BLUE :藍
STR_COLOUR_SECONDARY_CREAM :奶黃
STR_COLOUR_SECONDARY_MAUVE :淡紫
STR_COLOUR_SECONDARY_PURPLE :紫
STR_COLOUR_SECONDARY_ORANGE :橙
STR_COLOUR_SECONDARY_BROWN :棕
STR_COLOUR_SECONDARY_GREY :灰
STR_COLOUR_SECONDARY_WHITE :白
STR_COLOUR_SECONDARY_SAME_AS_PRIMARY :與主色調相同
# Units used in OpenTTD
@ -198,6 +215,7 @@ STR_UNITS_VELOCITY_IMPERIAL :{DECIMAL}{NBSP}
STR_UNITS_VELOCITY_METRIC :{DECIMAL}{NBSP}公里/小時
STR_UNITS_VELOCITY_SI :{DECIMAL}{NBSP}米/秒
STR_UNITS_VELOCITY_GAMEUNITS :{DECIMAL}{NBSP}格/日
STR_UNITS_VELOCITY_KNOTS :{DECIMAL}{NBSP}節
STR_UNITS_POWER_IMPERIAL :{DECIMAL}{NBSP}匹
STR_UNITS_POWER_METRIC :{DECIMAL}{NBSP}匹
@ -505,6 +523,7 @@ STR_NEWS_MENU_DELETE_ALL_MESSAGES :刪除所有訊
# About menu
###length 11
STR_ABOUT_MENU_LAND_BLOCK_INFO :土地資訊
STR_ABOUT_MENU_HELP :幫助和手冊
STR_ABOUT_MENU_SEPARATOR :
STR_ABOUT_MENU_TOGGLE_CONSOLE :切換主控台
STR_ABOUT_MENU_AI_DEBUG :AI/遊戲腳本除錯
@ -933,12 +952,26 @@ STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}將主
# Game options window
STR_GAME_OPTIONS_CAPTION :{WHITE}遊戲選項
STR_GAME_OPTIONS_TAB_GENERAL :基本
STR_GAME_OPTIONS_TAB_GENERAL_TT :{BLACK}選擇基本設定
STR_GAME_OPTIONS_TAB_GRAPHICS :圖形集
STR_GAME_OPTIONS_TAB_GRAPHICS_TT :{BLACK}選擇圖形設定
STR_GAME_OPTIONS_TAB_SOUND :音效
STR_GAME_OPTIONS_VOLUME :音量
STR_GAME_OPTIONS_SFX_VOLUME :音效
STR_GAME_OPTIONS_MUSIC_VOLUME :音樂
STR_GAME_OPTIONS_VOLUME_0 :0%
STR_GAME_OPTIONS_VOLUME_25 :25%
STR_GAME_OPTIONS_VOLUME_50 :50%
STR_GAME_OPTIONS_VOLUME_75 :75%
STR_GAME_OPTIONS_VOLUME_100 :100%
STR_GAME_OPTIONS_CURRENCY_UNITS_FRAME :{BLACK}幣值單位
STR_GAME_OPTIONS_CURRENCY_UNITS_DROPDOWN_TOOLTIP :{BLACK}選擇幣值單位
STR_GAME_OPTIONS_CURRENCY_CODE :{STRING} ({STRING})
###length 42
STR_GAME_OPTIONS_CURRENCY_GBP :英鎊
@ -990,6 +1023,10 @@ STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}選擇
# Autosave dropdown
###length 5
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_OFF :關閉
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_10_MINUTES :每10分鐘
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_30_MINUTES :每30分鐘
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_60_MINUTES :每60分鐘
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_120_MINUTES :每120分鐘
STR_GAME_OPTIONS_LANGUAGE :{BLACK}語言
STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :{BLACK}選擇要用的介面語言
@ -1026,6 +1063,9 @@ STR_GAME_OPTIONS_GUI_SCALE_3X :3倍
STR_GAME_OPTIONS_GUI_SCALE_4X :4倍
STR_GAME_OPTIONS_GUI_SCALE_5X :5倍
STR_GAME_OPTIONS_PARTICIPATE_SURVEY_FRAME :{BLACK}自動問卷
STR_GAME_OPTIONS_PARTICIPATE_SURVEY :{BLACK}參與自動問卷
STR_GAME_OPTIONS_PARTICIPATE_SURVEY_LINK :{BLACK}關於問卷和隱私
STR_GAME_OPTIONS_GRAPHICS :{BLACK}圖形
@ -1156,6 +1196,7 @@ STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}展開
STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}折疊所有選項
STR_CONFIG_SETTING_RESET_ALL :{BLACK}重設所有數值
STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT :(沒有適用的解釋)
STR_CONFIG_SETTING_VALUE :{PUSH_COLOUR}{ORANGE}{STRING}{POP_COLOUR}
STR_CONFIG_SETTING_DEFAULT_VALUE :{LTBLUE}預設值:{ORANGE}{STRING}
STR_CONFIG_SETTING_TYPE :{LTBLUE}設定種類:{ORANGE}{STRING}
STR_CONFIG_SETTING_TYPE_CLIENT :用戶端設定 (存檔時不保存;影響所有遊戲)
@ -1209,6 +1250,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_LEFT :靠左
STR_CONFIG_SETTING_HORIZONTAL_POS_CENTER :置中
STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :靠右
STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}秒
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :最大貸款額:{STRING}
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :公司最多可借多少錢(此設定的值排除了通貨膨脹因素)。
@ -1380,6 +1422,7 @@ STR_CONFIG_SETTING_PLANE_CRASHES_NONE :無
STR_CONFIG_SETTING_PLANE_CRASHES_REDUCED :減少
STR_CONFIG_SETTING_PLANE_CRASHES_NORMAL :正常
STR_CONFIG_SETTING_CROSSING_WITH_COMPETITOR :可在競爭對手所有的道路或鐵路上建造平交道:{STRING}
STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :可在市鎮所屬道路上建設路邊車站:{STRING}
STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :容許在市鎮擁有的道路上建造直通型車站。
@ -1393,6 +1436,7 @@ STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :如啟用此選
STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR :初始公司顏色:{STRING}
STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_HELPTEXT :選擇公司的初始顏色。
STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY :初始公司副色調:{STRING}
STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :機場永不過期:{STRING}
STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :如啟用此選項,所有機場一經面世,就永遠可以選擇建設。
@ -1595,6 +1639,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :無
STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :右鍵關閉視窗:{STRING}
STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :在視窗內以右鍵點擊可關閉視窗。可用右鍵關閉工具提示。
###length 3
STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_NO :否
STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES :是
STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :使用 {STRING} 時間格式作為存檔檔名
STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :在存檔的檔名中使用的日期格式。
@ -1921,6 +1967,7 @@ STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :無
STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :初始城市規模倍率:{STRING}
STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :設定遊戲開始時城市的大小 (相對於一般市鎮而言)。
STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL :每{STRING}更新貨物分配圖
STR_CONFIG_SETTING_DISTRIBUTION_PAX :乘客分配方式:{STRING}
STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :設使有交通路線連接甲、乙兩站。「對稱」指甲站往乙站的乘客數量與乙站往甲站的乘客數量大致相同。「不對稱」指任何一站往另一站的乘客數量皆由系統隨意決定。「手動」指系統不會自動分配乘客的目的地。
@ -1947,12 +1994,14 @@ STR_CONFIG_SETTING_SHORT_PATH_SATURATION :如果最短路
STR_CONFIG_SETTING_SHORT_PATH_SATURATION_HELPTEXT :貨物分配功能在派送貨物時,會優先使用最短路徑,至其飽和後改用第二短的路徑,如此類推。當所有路徑皆飽和但仍未滿足需求,系統會由容量較大的路徑開始繼續加載貨物。{}由於路徑飽和度難以準確估算,此設定容許您定義一值,使短路徑達至該飽和度後,系統便開始加載容量較大的路徑。{}如果此設定的值少於100%,即使系統高估路徑容量,也不會使過多的貨物滯留車站。
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY :速度單位:{STRING}
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_NAUTICAL :速度單位(航海):{STRING}
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :在界面上以所選擇的單位表示速度。
###length 5
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :英制(英里/小時)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :米制(公里/小時)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :國際單位(米/秒)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS :遊戲單位 (格/日)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_KNOTS :節
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :車輛功率單位:{STRING}
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :在界面上以所選擇的單位表示車輛的功率。
@ -2064,6 +2113,7 @@ STR_INTRO_MULTIPLAYER :{BLACK}多人
STR_INTRO_GAME_OPTIONS :{BLACK}遊戲選項
STR_INTRO_HIGHSCORE :{BLACK}積分排行榜
STR_INTRO_HELP :{BLACK}幫助和手冊
STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}設定
STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF 設定
STR_INTRO_ONLINE_CONTENT :{BLACK}檢查線上內容
@ -2107,6 +2157,16 @@ STR_ABANDON_GAME_QUERY :{YELLOW}你要
STR_ABANDON_SCENARIO_QUERY :{YELLOW}你確定要離開這個場景嗎?
# Help window
STR_HELP_WINDOW_CAPTION :{WHITE}幫助和手冊
STR_HELP_WINDOW_WEBSITES :{BLACK}網站
STR_HELP_WINDOW_DOCUMENTS :{BLACK}文檔
STR_HELP_WINDOW_README :{BLACK}Readme
STR_HELP_WINDOW_CHANGELOG :{BLACK}修訂紀錄
STR_HELP_WINDOW_LICENSE :{BLACK}許可協議
STR_HELP_WINDOW_MAIN_WEBSITE :{BLACK}OpenTTD
STR_HELP_WINDOW_MANUAL_WIKI :{BLACK}手冊/維基
STR_HELP_WINDOW_BUGTRACKER :{BLACK}回報漏洞
STR_HELP_WINDOW_COMMUNITY :{BLACK}社區
# Cheat window
STR_CHEATS :{WHITE}作弊
@ -2383,6 +2443,10 @@ STR_NETWORK_ASK_RELAY_NO :{BLACK}否
STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}是,僅此一次
STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}是,且不再詢問
STR_NETWORK_ASK_SURVEY_CAPTION :是否參與自動問卷?
STR_NETWORK_ASK_SURVEY_LINK :關於問卷和隱私
STR_NETWORK_ASK_SURVEY_NO :否
STR_NETWORK_ASK_SURVEY_YES :是
STR_NETWORK_SPECTATORS :旁觀者
@ -2673,7 +2737,9 @@ STR_STATION_BUILD_STATION_CLASS_TOOLTIP :{BLACK}選擇
STR_STATION_BUILD_STATION_TYPE_TOOLTIP :{BLACK}選擇要興建的車站種類
STR_STATION_CLASS_DFLT :預設車站
STR_STATION_CLASS_DFLT_STATION :預設車站
STR_STATION_CLASS_WAYP :號誌站
STR_STATION_CLASS_WAYP_WAYPOINT :預設號誌站
# Signal window
STR_BUILD_SIGNAL_CAPTION :{WHITE}號誌選擇
@ -3316,6 +3382,7 @@ STR_NEWGRF_INSPECT_PARENT_TOOLTIP :{BLACK}檢查
STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT :{STRING} 於 {HEX}
STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_OBJECT :物件
STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_RAIL_TYPE :鐵路種類
STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_ROAD_TYPE :道路類型
STR_NEWGRF_INSPECT_QUERY_CAPTION :{WHITE}NewGRF variable 60+x 參數16 進位)
@ -3722,6 +3789,7 @@ STR_COMPANY_VIEW_INFRASTRUCTURE_BUTTON :{BLACK}詳情
STR_COMPANY_VIEW_INFRASTRUCTURE_TOOLTIP :{BLACK}顯示基礎建設數目的詳細資料
STR_COMPANY_VIEW_GIVE_MONEY_BUTTON :{BLACK}給予資金
STR_COMPANY_VIEW_GIVE_MONEY_TOOLTIP :{BLACK}將資金給予此公司
STR_COMPANY_VIEW_HOSTILE_TAKEOVER_BUTTON :{BLACK}敵意收購
STR_COMPANY_VIEW_NEW_FACE_BUTTON :{BLACK}新臉孔
STR_COMPANY_VIEW_NEW_FACE_TOOLTIP :{BLACK}選擇總經理的新臉孔
@ -3808,6 +3876,7 @@ STR_VEHICLE_LIST_MANAGE_LIST :{BLACK}管理
STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}向清單所有車輛發出指示
STR_VEHICLE_LIST_REPLACE_VEHICLES :替換車輛
STR_VEHICLE_LIST_SEND_FOR_SERVICING :送去維護
STR_VEHICLE_LIST_CREATE_GROUP :建立群組
STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}今年盈利:{CURRENCY_LONG} (去年盈利:{CURRENCY_LONG})
STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :送到機廠
@ -4528,6 +4597,8 @@ STR_TIMETABLE_EXPECTED :{BLACK}實際
STR_TIMETABLE_SCHEDULED :{BLACK}表定時間
STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}切換顯示 (根據實際情況的) 預期時間 或 表定時間
STR_TIMETABLE_ARRIVAL :到: {COLOUR}{DATE_TINY}
STR_TIMETABLE_DEPARTURE :發: {COLOUR}{DATE_TINY}
# Date window (for timetable)
@ -4571,6 +4642,7 @@ STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}下局
STR_AI_CONFIG_HUMAN_PLAYER :人類玩家
STR_AI_CONFIG_RANDOM_AI :隨機 AI
STR_AI_CONFIG_NONE :(無)
STR_AI_CONFIG_NAME_VERSION :{STRING} {YELLOW}v{NUM}
STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}競爭對手數目上限:{ORANGE}{COMMA}
STR_AI_CONFIG_MOVE_UP :{BLACK}向上移
@ -4621,6 +4693,8 @@ STR_AI_SETTINGS_SETTING :{STRING}{ORA
# Textfile window
STR_TEXTFILE_JUMPLIST :{WHITE}目錄
STR_TEXTFILE_JUMPLIST_ITEM :{WHITE}{STRING}
STR_TEXTFILE_WRAP_TEXT :{WHITE}強迫文字換行
STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}強迫寬於視窗的文字自動換行
STR_TEXTFILE_VIEW_README :{BLACK}檢視Readme
@ -4630,6 +4704,7 @@ STR_TEXTFILE_VIEW_LICENCE :{BLACK}授權
STR_TEXTFILE_README_CAPTION :{WHITE}{STRING}{STRING}的 Readme
STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING}{STRING}的修訂紀錄
STR_TEXTFILE_LICENCE_CAPTION :{WHITE}{STRING}{STRING}的授權條款
STR_TEXTFILE_GAME_MANUAL_CAPTION :{WHITE}OpenTTD 文檔 '{STRING}'
# Vehicle loading indicators
@ -4764,7 +4839,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... 太
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... 太接近另一個市鎮
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... 已有太多市鎮
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... 地圖沒有足夠空間
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}市鎮不會自動興建道路。你可以在 [設定] -> [環境] -> [市鎮] 啟用市鎮自行興建道路的功能。
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}道路施工中
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}無法刪除此市鎮...{}市鎮範圍內還有車站或機廠或無法移除的區塊
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... 市中心沒有適合的空間建造雕像
@ -5086,6 +5160,7 @@ STR_ERROR_NO_BUOY :{WHITE}沒有
STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}無法為車輛加入時刻表...
STR_ERROR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}車輛只能在車站停靠等候
STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}此車輛不會停靠此站
STR_ERROR_TIMETABLE_INCOMPLETE :{WHITE}... 時刻表並不完整
# Sign related errors
STR_ERROR_TOO_MANY_SIGNS :{WHITE}... 已有太多標誌
@ -5565,17 +5640,21 @@ STR_VEHICLE_NAME :{VEHICLE}
STR_WAYPOINT_NAME :{WAYPOINT}
STR_JUST_CARGO :{CARGO_LONG}
STR_JUST_RIGHT_ARROW :{RIGHT_ARROW}
STR_JUST_CHECKMARK :{CHECKMARK}
STR_JUST_COMMA :{COMMA}
STR_JUST_CURRENCY_SHORT :{CURRENCY_SHORT}
STR_JUST_CURRENCY_LONG :{CURRENCY_LONG}
STR_JUST_CARGO_LIST :{CARGO_LIST}
STR_JUST_DECIMAL :{DECIMAL}
STR_JUST_INT :{NUM}
STR_JUST_DATE_TINY :{DATE_TINY}
STR_JUST_DATE_SHORT :{DATE_SHORT}
STR_JUST_DATE_LONG :{DATE_LONG}
STR_JUST_DATE_ISO :{DATE_ISO}
STR_JUST_STRING :{STRING}
STR_JUST_STRING1 :{STRING}
STR_JUST_STRING2 :{STRING}
STR_JUST_STRING_STRING :{STRING}{STRING}
STR_JUST_RAW_STRING :{STRING}
STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRING}

@ -4866,7 +4866,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... hari
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... başka bir şehire çok yakın
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... çok fazla şehir var
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... haritada boş yer yok
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Kasaba yol yapmayacak. Yol yapımını Gelişmiş Ayarlar->Ekonomi->Şehirler'den etkinleştirebilirsiniz
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Yol çalışmaları
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Bu kasaba silinemiyor...{}Bir istasyon veya garaj kasabaya atıfta bulunuyor ya da bir kasaba karesi kaldırılamıyor
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... bu şehrin merkezinde heykel için uygun bir yer yok

@ -4924,7 +4924,6 @@ STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... на
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... надто близько до іншого міста
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... забагато міст
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... на карті немає вільного місця
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Місто не будуватиме дороги. Ви можете дозволити будівництво доріг через налаштування->Довкілля->Міста
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Дорога ремонтується
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Не можна видалити це місто...{}Станція або депо, що відносяться до міста або знаходяться на землі у власності міста, не можуть бути видалені
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... немає придатного місця для статуї в центрі цього міста

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save